From d5d7369af112ea6e6e0446155eef64be4633dabf Mon Sep 17 00:00:00 2001 From: "Antonio C. Mariani" Date: Tue, 29 Nov 2016 19:31:39 -0200 Subject: [PATCH] Fixes #225 Add columns to show users taken sessions by acronym --- classes/summary.php | 70 ++++++++++++++++++++++++++++++++++ renderer.php | 92 +++++++++++++++++++++++++++++++++------------ styles.css | 10 +---- 3 files changed, 139 insertions(+), 33 deletions(-) diff --git a/classes/summary.php b/classes/summary.php index 2dc6460..15c38d8 100644 --- a/classes/summary.php +++ b/classes/summary.php @@ -41,6 +41,9 @@ class mod_attendance_summary { /** @var array pointsbygroup (groupid, numsessions, maxpoints) */ private $maxpointsbygroupsessions; + /** @var array userstakensessionsbyacronym */ + private $userstakensessionsbyacronym; + /** * Initializes the class * @@ -53,6 +56,7 @@ class mod_attendance_summary { $this->attendanceid = $attendanceid; $this->compute_users_points($userids, $startdate, $enddate); + $this->compute_users_taken_sessions_by_acronym($userids, $startdate, $enddate); } /** @@ -119,6 +123,11 @@ class mod_attendance_summary { } $usersummary->takensessionspercentage = attendance_calc_fraction($usersummary->takensessionspoints, $usersummary->takensessionsmaxpoints); + if (isset($this->userstakensessionsbyacronym[$userid])) { + $usersummary->userstakensessionsbyacronym = $this->userstakensessionsbyacronym[$userid]; + } else { + $usersummary->userstakensessionsbyacronym = array(); + } return $usersummary; } @@ -224,6 +233,67 @@ class mod_attendance_summary { $this->userspoints = $DB->get_records_sql($sql, $params); } + /** + * Computes the summary of taken sessions by acronym + * + * @param array userids user instances identifier + * @param int $startdate Attendance sessions startdate + * @param int $enddate Attendance sessions enddate + * @return null + */ + private function compute_users_taken_sessions_by_acronym($userids=array(), $startdate = '', $enddate = '') { + global $DB; + + list($this->course, $cm) = get_course_and_cm_from_instance($this->attendanceid, 'attendance'); + $this->groupmode = $cm->effectivegroupmode; + + $params = array( + 'attid' => $this->attendanceid, + 'cstartdate' => $this->course->startdate, + ); + + $where = ''; + if (!empty($userids)) { + list($insql, $inparams) = $DB->get_in_or_equal($userids, SQL_PARAMS_NAMED); + $where .= ' AND atl.studentid ' . $insql; + $params = array_merge($params, $inparams); + } + if (!empty($startdate)) { + $where .= ' AND ats.sessdate >= :startdate'; + $params['startdate'] = $startdate; + } + if (!empty($enddate)) { + $where .= ' AND ats.sessdate < :enddate '; + $params['enddate'] = $enddate; + } + + if ($this->with_groups()) { + $joingroup = 'LEFT JOIN {groups_members} gm ON (gm.userid = atl.studentid AND gm.groupid = ats.groupid)'; + $where .= ' AND (ats.groupid = 0 or gm.id is NOT NULL)'; + } else { + $joingroup = ''; + $where .= ' AND ats.groupid = 0'; + } + + $sql = "SELECT atl.studentid AS userid, sts.setnumber, sts.acronym, COUNT(*) AS numtakensessions + FROM {attendance_sessions} ats + JOIN {attendance_log} atl ON (atl.sessionid = ats.id) + JOIN {attendance_statuses} sts + ON (sts.attendanceid = ats.attendanceid AND + sts.id = atl.statusid AND + sts.deleted = 0 AND sts.visible = 1) + {$joingroup} + WHERE ats.attendanceid = :attid + AND ats.sessdate >= :cstartdate + AND ats.lasttakenby != 0 + {$where} + GROUP BY atl.studentid, sts.setnumber, sts.acronym"; + $this->userstakensessionsbyacronym = array(); + foreach ($DB->get_recordset_sql($sql, $params) AS $rec) { + $this->userstakensessionsbyacronym[$rec->userid][$rec->setnumber][$rec->acronym] = $rec->numtakensessions; + } + } + /** * Computes and store the maximum points possible for each group session * diff --git a/renderer.php b/renderer.php index 6f46e5a..467424b 100644 --- a/renderer.php +++ b/renderer.php @@ -856,14 +856,18 @@ class mod_attendance_renderer extends plugin_renderer_base { $table->attributes['class'] .= ' summaryreport'; } + $colclass = null; + // User picture. $table->head[] = ''; $table->align[] = 'left'; $table->size[] = '1px'; + $table->colclasses[] = $colclass; $table->head[] = $this->construct_fullname_head($reportdata); $table->align[] = 'left'; $table->size[] = ''; + $table->colclasses[] = $colclass; $sessionstats = array(); foreach ($reportdata->sessions as $sess) { @@ -892,40 +896,65 @@ class mod_attendance_renderer extends plugin_renderer_base { $table->head[] = $sesstext; $table->align[] = 'center'; $table->size[] = '1px'; + $table->colclasses[] = $colclass; + } + + $setnumber = -1; + foreach ($reportdata->statuses AS $sts) { + if ($sts->setnumber != $setnumber) { + $colclass = empty($colclass) ? 'columncontrast' : null; + $setnumber = $sts->setnumber; + } + + $table->head[] = $sts->acronym; + $table->align[] = 'center'; + $table->size[] = '1px'; + $table->colclasses[] = $colclass; } $table->head[] = get_string('takensessions', 'attendance'); $table->align[] = 'center'; $table->size[] = '1px'; + $colclass = empty($colclass) ? 'columncontrast' : null; + $table->colclasses[] = $colclass; $table->head[] = get_string('points', 'attendance'); $table->align[] = 'center'; $table->size[] = '1px'; + $table->colclasses[] = $colclass; $table->head[] = get_string('percentage', 'attendance'); $table->align[] = 'center'; $table->size[] = '1px'; + $table->colclasses[] = $colclass; if ($reportdata->pageparams->view == ATT_VIEW_SUMMARY) { $table->head[] = get_string('sessionstotal', 'attendance'); $table->align[] = 'center'; $table->size[] = '1px'; + $colclass = empty($colclass) ? 'columncontrast' : null; + $table->colclasses[] = $colclass; $table->head[] = get_string('pointsallsessions', 'attendance'); $table->align[] = 'center'; $table->size[] = '1px'; + $table->colclasses[] = $colclass; $table->head[] = get_string('percentageallsessions', 'attendance'); $table->align[] = 'center'; $table->size[] = '1px'; + $table->colclasses[] = $colclass; $table->head[] = get_string('maxpossiblepoints', 'attendance'); $table->align[] = 'center'; $table->size[] = '1px'; + $colclass = empty($colclass) ? 'columncontrast' : null; + $table->colclasses[] = $colclass; $table->head[] = get_string('maxpossiblepercentage', 'attendance'); $table->align[] = 'center'; $table->size[] = '1px'; + $table->colclasses[] = $colclass; } if ($bulkmessagecapability) { // Display the table header for bulk messaging. @@ -948,6 +977,12 @@ class mod_attendance_renderer extends plugin_renderer_base { } else { $usersummary = $reportdata->summary->get_taken_sessions_summary_for($user->id); } + + foreach ($reportdata->statuses AS $sts) { + $row->cells[] = isset($usersummary->userstakensessionsbyacronym[$sts->setnumber][$sts->acronym]) ? + $usersummary->userstakensessionsbyacronym[$sts->setnumber][$sts->acronym] : 0; + } + $row->cells[] = $usersummary->numtakensessions; $row->cells[] = format_float($usersummary->takensessionspoints, 1, true, true) . ' / ' . format_float($usersummary->takensessionsmaxpoints, 1, true, true); @@ -972,37 +1007,46 @@ class mod_attendance_renderer extends plugin_renderer_base { $table->data[] = $row; } - // Calculate the sum of statuses for each user. - $statrow = new html_table_row(); - $statrow->cells[] = ''; - $statrow->cells[] = get_string('summary'); - foreach ($reportdata->sessions as $sess) { - $sessionstats = array(); - foreach ($reportdata->statuses as $status) { - if ($status->setnumber == $sess->statusset) { - $status->count = 0; - $sessionstats[$status->id] = $status; + if ($reportdata->pageparams->view != ATT_VIEW_SUMMARY) { + // Calculate the sum of statuses for each user. + $statrow = new html_table_row(); + $statrow->cells[] = ''; + $statrow->cells[] = get_string('summary'); + foreach ($reportdata->sessions as $sess) { + $sessionstats = array(); + foreach ($reportdata->statuses as $status) { + if ($status->setnumber == $sess->statusset) { + $status->count = 0; + $sessionstats[$status->id] = $status; + } } - } - foreach ($reportdata->users as $user) { - if (!empty($reportdata->sessionslog[$user->id][$sess->id])) { - $statusid = $reportdata->sessionslog[$user->id][$sess->id]->statusid; - if (isset($sessionstats[$statusid]->count)) { - $sessionstats[$statusid]->count++; + foreach ($reportdata->users as $user) { + if (!empty($reportdata->sessionslog[$user->id][$sess->id])) { + $statusid = $reportdata->sessionslog[$user->id][$sess->id]->statusid; + if (isset($sessionstats[$statusid]->count)) { + $sessionstats[$statusid]->count++; + } } } - } - $statsoutput = '
'; - foreach ($sessionstats as $status) { - $statsoutput .= "$status->description: {$status->count}
"; + $statsoutput = ''; + foreach ($sessionstats as $status) { + $statsoutput .= "$status->description: {$status->count}
"; + } + $cell = new html_table_cell($statsoutput); + $cell->style = 'white-space:nowrap;'; + $statrow->cells[] = $cell; + } + foreach ($reportdata->statuses AS $sts) { + $statrow->cells[] = ''; } - $cell = new html_table_cell($statsoutput); - $cell->style = 'white-space:nowrap;'; - $statrow->cells[] = $cell; + $statrow->cells[] = ''; + $statrow->cells[] = ''; + $statrow->cells[] = ''; + $statrow->cells[] = ''; + $table->data[] = $statrow; } - $table->data[] = $statrow; if ($bulkmessagecapability) { // Require that the user can bulk message users. // Display check boxes that will allow the user to send a message to the students that have been checked. diff --git a/styles.css b/styles.css index 621f9c1..6966546 100644 --- a/styles.css +++ b/styles.css @@ -163,14 +163,6 @@ color: red; } -.path-mod-attendance .summaryreport .c5 { - background-color: #EAEAEA; -} - -.path-mod-attendance .summaryreport .c6 { - background-color: #EAEAEA; -} - -.path-mod-attendance .summaryreport .c7 { +.path-mod-attendance .columncontrast { background-color: #EAEAEA; }