df3a7c075f432b042ee091b4e641b3f45aedf486
[moodle.git] / grade / report / outcomes / index.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * The gradebook outcomes report
19  *
20  * @package   gradereport_outcomes
21  * @copyright 2007 Nicolas Connault
22  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 include_once('../../../config.php');
26 require_once($CFG->libdir . '/gradelib.php');
27 require_once $CFG->dirroot.'/grade/lib.php';
29 $courseid = required_param('id', PARAM_INT);                   // course id
31 $PAGE->set_url('/grade/report/outcomes/index.php', array('id'=>$courseid));
33 if (!$course = $DB->get_record('course', array('id' => $courseid))) {
34     print_error('nocourseid');
35 }
37 require_login($course);
38 $context = context_course::instance($course->id);
40 require_capability('gradereport/outcomes:view', $context);
42 // First make sure we have proper final grades.
43 if (grade_needs_regrade_final_grades($courseid)) {
44     $PAGE->set_heading($course->fullname);
45     $progress = new \core\progress\display(true);
46     echo $OUTPUT->header();
47     echo $OUTPUT->heading(get_string('recalculatinggrades', 'grades'));
48     grade_regrade_final_grades($courseid, null, null, $progress);
49     echo $OUTPUT->continue_button($PAGE->url);
50     echo $OUTPUT->footer();
51     die();
52 }
54 // Grab all outcomes used in course.
55 $report_info = array();
56 $outcomes = grade_outcome::fetch_all_available($courseid);
58 // Will exclude grades of suspended users if required.
59 $defaultgradeshowactiveenrol = !empty($CFG->grade_report_showonlyactiveenrol);
60 $showonlyactiveenrol = get_user_preferences('grade_report_showonlyactiveenrol', $defaultgradeshowactiveenrol);
61 $showonlyactiveenrol = $showonlyactiveenrol || !has_capability('moodle/course:viewsuspendedusers', $context);
62 if ($showonlyactiveenrol) {
63     $suspendedusers = get_suspended_userids($context);
64 }
66 // Get grade_items that use each outcome.
67 foreach ($outcomes as $outcomeid => $outcome) {
68     $report_info[$outcomeid]['items'] = $DB->get_records_select('grade_items', "outcomeid = ? AND courseid = ?", array($outcomeid, $courseid));
69     $report_info[$outcomeid]['outcome'] = $outcome;
71     // Get average grades for each item.
72     if (is_array($report_info[$outcomeid]['items'])) {
73         foreach ($report_info[$outcomeid]['items'] as $itemid => $item) {
74             $params = array();
75             $hidesuspendedsql = '';
76             if ($showonlyactiveenrol && !empty($suspendedusers)) {
77                 list($notinusers, $params) = $DB->get_in_or_equal($suspendedusers, SQL_PARAMS_QM, null, false);
78                 $hidesuspendedsql = ' AND userid ' . $notinusers;
79             }
80             $params = array_merge(array($itemid), $params);
82             $sql = "SELECT itemid, AVG(finalgrade) AS avg, COUNT(finalgrade) AS count
83                       FROM {grade_grades}
84                      WHERE itemid = ?".
85                      $hidesuspendedsql.
86                   " GROUP BY itemid";
87             $info = $DB->get_records_sql($sql, $params);
89             if (!$info) {
90                 unset($report_info[$outcomeid]['items'][$itemid]);
91                 continue;
92             } else {
93                 $info = reset($info);
94                 $avg = round($info->avg, 2);
95                 $count = $info->count;
96             }
98             $report_info[$outcomeid]['items'][$itemid]->avg = $avg;
99             $report_info[$outcomeid]['items'][$itemid]->count = $count;
100         }
101     }
104 $html = '<table class="generaltable boxaligncenter" width="90%" cellspacing="1" cellpadding="5" summary="Outcomes Report">' . "\n";
105 $html .= '<tr><th class="header c0" scope="col">' . get_string('outcomeshortname', 'grades') . '</th>';
106 $html .= '<th class="header c1" scope="col">' . get_string('courseavg', 'grades') . '</th>';
107 $html .= '<th class="header c2" scope="col">' . get_string('sitewide', 'grades') . '</th>';
108 $html .= '<th class="header c3" scope="col">' . get_string('activities', 'grades') . '</th>';
109 $html .= '<th class="header c4" scope="col">' . get_string('average', 'grades') . '</th>';
110 $html .= '<th class="header c5" scope="col">' . get_string('numberofgrades', 'grades') . '</th></tr>' . "\n";
112 $row = 0;
113 foreach ($report_info as $outcomeid => $outcomedata) {
114     $rowspan = count($outcomedata['items']);
115     // If there are no items for this outcome, rowspan will equal 0, which is not good.
116     if ($rowspan == 0) {
117         $rowspan = 1;
118     }
120     $shortname_html = '<tr class="r' . $row . '"><td class="cell c0" rowspan="' . $rowspan . '">' . $outcomedata['outcome']->shortname . "</td>\n";
122     $sitewide = get_string('no');
123     if (empty($outcomedata['outcome']->courseid)) {
124         $sitewide = get_string('yes');
125     }
127     $sitewide_html = '<td class="cell c2" rowspan="' . $rowspan . '">' . $sitewide . "</td>\n";
129     $outcomedata['outcome']->sum = 0;
130     $scale = new grade_scale(array('id' => $outcomedata['outcome']->scaleid), false);
132     $print_tr = false;
133     $items_html = '';
135     if (!empty($outcomedata['items'])) {
136         foreach ($outcomedata['items'] as $itemid => $item) {
137             if ($print_tr) {
138                 $row++;
139                 $items_html .= "<tr class=\"r$row\">\n";
140             }
142             $grade_item = new grade_item($item, false);
144             if ($item->itemtype == 'mod') {
145                 $cm = get_coursemodule_from_instance($item->itemmodule, $item->iteminstance, $item->courseid);
146                 $itemname = '<a href="'.$CFG->wwwroot.'/mod/'.$item->itemmodule.'/view.php?id='.$cm->id.'">'.format_string($cm->name, true, $cm->course).'</a>';
147             } else {
148                 $itemname = $grade_item->get_name();
149             }
151             $outcomedata['outcome']->sum += $item->avg;
152             $gradehtml = $scale->get_nearest_item($item->avg);
154             $items_html .= "<td class=\"cell c3\">$itemname</td>"
155                          . "<td class=\"cell c4\">$gradehtml ($item->avg)</td>"
156                          . "<td class=\"cell c5\">$item->count</td></tr>\n";
157             $print_tr = true;
158         }
159     } else {
160         $items_html .= "<td class=\"cell c3\"> - </td><td class=\"cell c4\"> - </td><td class=\"cell c5\"> 0 </td></tr>\n";
161     }
163     // Calculate outcome average.
164     if (is_array($outcomedata['items'])) {
165         $count = count($outcomedata['items']);
166         if ($count > 0) {
167             $avg = $outcomedata['outcome']->sum / $count;
168         } else {
169             $avg = $outcomedata['outcome']->sum;
170         }
171         $avg_html = $scale->get_nearest_item($avg) . " (" . round($avg, 2) . ")\n";
172     } else {
173         $avg_html = ' - ';
174     }
176     $outcomeavg_html = '<td class="cell c1" rowspan="' . $rowspan . '">' . $avg_html . "</td>\n";
178     $html .= $shortname_html . $outcomeavg_html . $sitewide_html . $items_html;
179     $row++;
182 $html .= '</table>';
184 print_grade_page_head($courseid, 'report', 'outcomes');
186 echo $html;
188 $event = \gradereport_outcomes\event\grade_report_viewed::create(
189     array(
190         'context' => $context,
191         'courseid' => $courseid,
192     )
193 );
194 $event->trigger();
196 echo $OUTPUT->footer();