From 5831a0301029db1362e5af5574cb5d71c0cf8656 Mon Sep 17 00:00:00 2001 From: Antonio Carlos Mariani Date: Tue, 3 May 2016 11:02:29 -0300 Subject: [PATCH] Adjusts student reports --- classes/structure.php | 4 +-- lang/en/attendance.php | 9 ++++- renderables.php | 52 +++------------------------ renderer.php | 27 +++++++++----- renderhelpers.php | 82 ++++++++++++++++++++++-------------------- 5 files changed, 76 insertions(+), 98 deletions(-) diff --git a/classes/structure.php b/classes/structure.php index 6f4ff8a..d0c30e0 100644 --- a/classes/structure.php +++ b/classes/structure.php @@ -930,7 +930,7 @@ class mod_attendance_structure { WHERE $where AND (ats.groupid = 0 or gm.id is NOT NULL) ORDER BY ats.sessdate ASC"; } else { - $sql = "SELECT $id, ats.id, ats.groupid, ats.sessdate, ats.duration, ats.description, + $sql = "SELECT $id, ats.id, ats.groupid, ats.sessdate, ats.duration, ats.description, ats.statusset, al.statusid, al.remarks, ats.studentscanmark FROM {attendance_sessions} ats RIGHT JOIN {attendance_log} al @@ -961,7 +961,7 @@ class mod_attendance_structure { $where = "ats.attendanceid = :aid AND ats.sessdate >= :csdate AND ats.groupid $gsql"; } - $sql = "SELECT $id, ats.id, ats.groupid, ats.sessdate, ats.duration, ats.description, + $sql = "SELECT $id, ats.id, ats.groupid, ats.sessdate, ats.duration, ats.description, ats.statusset, al.statusid, al.remarks, ats.studentscanmark FROM {attendance_sessions} ats LEFT JOIN {attendance_log} al diff --git a/lang/en/attendance.php b/lang/en/attendance.php index 0f1ba62..4f59845 100644 --- a/lang/en/attendance.php +++ b/lang/en/attendance.php @@ -133,6 +133,8 @@ $string['indetail'] = 'In detail...'; $string['invalidsessionenddate'] = 'This date can not be earlier than the session date'; $string['invalidaction'] = 'You must select an action'; $string['jumpto'] = 'Jump to'; +$string['maxpossiblepoints'] = 'Maximum possible points'; +$string['maxpossiblepercentage'] = 'Maximum possible percentage'; $string['mergeuser'] = 'Merge user'; $string['modulename'] = 'Attendance'; $string['modulename_help'] = 'The attendance activity module enables a teacher to take attendance during class and students to view their own attendance record. @@ -165,6 +167,8 @@ $string['olddate'] = 'Old date'; $string['onlyselectedusers'] = 'Export specific users'; $string['participant'] = 'Participant'; $string['percentage'] = 'Percentage'; +$string['percentagesessionscompleted'] = 'Percentage over taked sessions'; +$string['percentageallsessions'] = 'Percentage over all sessions'; $string['pluginname'] = 'Attendance'; $string['pluginadministration'] = 'Attendance administration'; $string['remark'] = 'Remark for: {$a}'; @@ -221,7 +225,8 @@ $string['sessiondays'] = 'Session Days'; $string['sessiondeleted'] = 'Session successfully deleted'; $string['sessionexist'] = 'Session not added (already exists)!'; $string['sessions'] = 'Sessions'; -$string['sessionscompleted'] = 'Sessions completed'; +$string['sessionscompleted'] = 'Taked sessions'; +$string['sessionstotal'] = 'Total number of sessions'; $string['sessionsids'] = 'IDs of sessions: '; $string['sessiongenerated'] = 'One session was successfully generated'; $string['sessionsgenerated'] = '{$a} sessions were successfully generated'; @@ -302,6 +307,8 @@ $string['submitattendance'] = 'Submit attendance'; $string['attendancenotset'] = 'You must set your attendance'; $string['export'] = 'Export'; $string['points'] = 'Points'; +$string['pointssessionscompleted'] = 'Points over taked sessions'; +$string['pointsallsessions'] = 'Points over all sessions'; $string['unknowngroup'] = 'Unknown group'; $string['notmember'] = 'not member'; diff --git a/renderables.php b/renderables.php index e4a9a82..cc1c54b 100644 --- a/renderables.php +++ b/renderables.php @@ -340,13 +340,7 @@ class attendance_user_data implements renderable { public $statuses; - public $gradable; - - public $grade; - - public $maxgrade; - - public $decimalpoints; + public $summary; public $filtercontrols; @@ -360,26 +354,14 @@ class attendance_user_data implements renderable { private $urlparams; public function __construct(mod_attendance_structure $att, $userid) { - global $CFG; - $this->user = $att->get_user($userid); $this->pageparams = $att->pageparams; - if (!$this->decimalpoints = grade_get_setting($att->course->id, 'decimalpoints')) { - $this->decimalpoints = $CFG->grade_decimalpoints; - } - if ($this->pageparams->mode == mod_attendance_view_page_params::MODE_THIS_COURSE) { $this->statuses = $att->get_statuses(true, true); - $this->stat = $att->get_user_stat($userid); - - $this->gradable = $att->grade > 0; - if ($this->gradable) { - $this->grade = $att->get_user_grade($userid); - $this->maxgrade = $att->get_user_max_grade($userid); - } + $this->summary = new mod_attendance_summary($att->id, array($userid), $att->pageparams->startdate, $att->pageparams->enddate); $this->filtercontrols = new attendance_filter_controls($att); @@ -389,10 +371,7 @@ class attendance_user_data implements renderable { } else { $this->coursesatts = attendance_get_user_courses_attendances($userid); $this->statuses = array(); - $this->stat = array(); - $this->gradable = array(); - $this->grade = array(); - $this->maxgrade = array(); + $this->summary = array(); foreach ($this->coursesatts as $atid => $ca) { // Check to make sure the user can view this cm. if (!get_fast_modinfo($ca->courseid)->instances['attendance'][$ca->attid]->uservisible) { @@ -400,29 +379,8 @@ class attendance_user_data implements renderable { continue; } $statuses = attendance_get_statuses($ca->attid); - $usertakensessionscount = attendance_get_user_taken_sessions_count($ca->attid, $ca->coursestartdate, $userid, $att->cm); - $userstatusesstat = attendance_get_user_statuses_stat($ca->attid, $ca->coursestartdate, $userid, $att->cm); - - $this->statuses[$ca->attid] = $statuses; - - $this->stat[$ca->attid]['completed'] = $usertakensessionscount; - $this->stat[$ca->attid]['statuses'] = $userstatusesstat; - - $this->gradable[$ca->attid] = $ca->attgrade > 0; - - if ($this->gradable[$ca->attid]) { - $this->grade[$ca->attid] = attendance_get_user_grade($userstatusesstat, $statuses); - // For getting sessions count implemented simplest method - taken sessions. - // It can have error if users don't have attendance info for some sessions. - // In the future we can implement another methods: - // * all sessions between user start enrolment date and now; - // * all sessions between user start and end enrolment date. - $this->maxgrade[$ca->attid] = attendance_get_user_max_grade($usertakensessionscount, $statuses); - } else { - // For more comfortable and universal work with arrays. - $this->grade[$ca->attid] = null; - $this->maxgrade[$ca->attid] = null; - } + + $this->summary[$ca->attid] = new mod_attendance_summary($ca->attid, array($userid)); } } $this->urlpath = $att->url_view()->out_omit_querystring(); diff --git a/renderer.php b/renderer.php index 01ca45f..9610fc7 100644 --- a/renderer.php +++ b/renderer.php @@ -735,8 +735,7 @@ class mod_attendance_renderer extends plugin_renderer_base { if ($userdata->pageparams->mode == mod_attendance_view_page_params::MODE_THIS_COURSE) { $o .= html_writer::empty_tag('hr'); - $o .= construct_user_data_stat($userdata->stat, $userdata->statuses, - $userdata->gradable, $userdata->grade, $userdata->maxgrade, $userdata->decimalpoints); + $o .= construct_user_data_stat($userdata->summary->get_all_sessions_summary_for($userdata->user->id), $userdata->pageparams->view); $o .= $this->render_attendance_filter_controls($userdata->filtercontrols); @@ -752,9 +751,12 @@ class mod_attendance_renderer extends plugin_renderer_base { } $o .= html_writer::tag('h4', $ca->attname); - $o .= construct_user_data_stat($userdata->stat[$ca->attid], $userdata->statuses[$ca->attid], - $userdata->gradable[$ca->attid], $userdata->grade[$ca->attid], - $userdata->maxgrade[$ca->attid], $userdata->decimalpoints); + if (isset($userdata->summary[$ca->attid])) { + $usersummary = $userdata->summary[$ca->attid]->get_all_sessions_summary_for($userdata->user->id); + } else { + $usersummary = null; + } + $o .= construct_user_data_stat($usersummary, ATT_VIEW_ALL); } } @@ -771,10 +773,13 @@ class mod_attendance_renderer extends plugin_renderer_base { get_string('time'), get_string('description', 'attendance'), get_string('status', 'attendance'), + get_string('points', 'attendance'), get_string('remarks', 'attendance') ); - $table->align = array('', '', '', 'left', 'left', 'center', 'left', 'center'); - $table->size = array('1px', '1px', '1px', '1px', '*', '1px', '1px', '*'); + $table->align = array('', '', '', 'left', 'left', 'center', 'center', 'center'); + $table->size = array('1px', '1px', '1px', '1px', '*', '*', '1px', '*'); + + $statussetmaxpoints = attendance_get_statusset_maxpoints($userdata->statuses); $i = 0; foreach ($userdata->sessionslog as $sess) { @@ -793,7 +798,10 @@ class mod_attendance_renderer extends plugin_renderer_base { $row->cells[] = $this->construct_time($sess->sessdate, $sess->duration); $row->cells[] = $sess->description; if (isset($sess->statusid)) { - $row->cells[] = $userdata->statuses[$sess->statusid]->description; + $status = $userdata->statuses[$sess->statusid]; + $row->cells[] = $status->description; + $row->cells[] = attendance_format_float($status->grade) . ' / ' . + attendance_format_float($statussetmaxpoints[$status->setnumber]); $row->cells[] = $sess->remarks; } else if ($sess->sessdate < $userdata->user->enrolmentstart) { $cell = new html_table_cell(get_string('enrolmentstart', 'attendance', @@ -815,6 +823,7 @@ class mod_attendance_renderer extends plugin_renderer_base { $row->cells[] = $cell; } else { // Student cannot mark their own attendace. $row->cells[] = '?'; + $row->cells[] = '? / ' . attendance_format_float($statussetmaxpoints[$sess->statusset]); $row->cells[] = ''; } } @@ -1008,7 +1017,7 @@ class mod_attendance_renderer extends plugin_renderer_base { $table->head = array('#', get_string('acronym', 'attendance'), get_string('description'), - get_string('grade'), + get_string('points', 'attendance'), get_string('action')); $table->align = array('center', 'center', 'center', 'center', 'center', 'center'); diff --git a/renderhelpers.php b/renderhelpers.php index e89dbbb..7ae611f 100644 --- a/renderhelpers.php +++ b/renderhelpers.php @@ -228,39 +228,62 @@ function construct_session_full_date_time($datetime, $duration) { return $sessinfo; } -function construct_user_data_stat($stat, $statuses, $gradable, $grade, $maxgrade, $decimalpoints) { +function construct_user_data_stat($usersummary, $view) { global $OUTPUT; + if (empty($usersummary)) { + return 'no data'; + } + $stattable = new html_table(); $stattable->attributes['class'] = 'attlist'; $row = new html_table_row(); - $row->cells[] = get_string('sessionscompleted', 'attendance').':'; - $row->cells[] = $stat['completed']; + $row->attributes['class'] = 'normal'; + $row->cells[] = get_string('sessionscompleted', 'attendance') . ':'; + $row->cells[] = $usersummary->numtakensessions; + $stattable->data[] = $row; + + $row = new html_table_row(); + $row->attributes['class'] = 'normal'; + $row->cells[] = get_string('pointssessionscompleted', 'attendance') . ':'; + $row->cells[] = attendance_format_float($usersummary->takensessionspoints) . ' / ' . attendance_format_float($usersummary->takensessionsmaxpoints); $stattable->data[] = $row; - foreach ($statuses as $st) { + $row = new html_table_row(); + $row->attributes['class'] = 'normal'; + $row->cells[] = get_string('percentagesessionscompleted', 'attendance') . ':'; + $row->cells[] = attendance_format_float($usersummary->takensessionspercentage * 100, false) . '%'; + $stattable->data[] = $row; + + if ($view == ATT_VIEW_ALL) { $row = new html_table_row(); - $row->cells[] = $st->description . ':'; - $row->cells[] = array_key_exists($st->id, $stat['statuses']) ? $stat['statuses'][$st->id]->stcnt : 0; + $row->attributes['class'] = 'highlight'; + $row->cells[] = get_string('sessionstotal', 'attendance') . ':'; + $row->cells[] = attendance_format_float($usersummary->numallsessions); + $stattable->data[] = $row; + $row = new html_table_row(); + $row->attributes['class'] = 'highlight'; + $row->cells[] = get_string('pointsallsessions', 'attendance') . ':'; + $row->cells[] = attendance_format_float($usersummary->takensessionspoints) . ' / ' . attendance_format_float($usersummary->allsessionsmaxpoints); $stattable->data[] = $row; - } - if ($gradable) { $row = new html_table_row(); - $row->cells[] = get_string('attendancegrade', 'attendance') . - $OUTPUT->help_icon('gradebookexplanation', 'attendance') . ':'; - $row->cells[] = format_float($grade) . ' / ' . format_float($maxgrade); + $row->attributes['class'] = 'highlight'; + $row->cells[] = get_string('percentageallsessions', 'attendance') . ':'; + $row->cells[] = attendance_format_float($usersummary->allsessionspercentage * 100, false) . '%'; $stattable->data[] = $row; $row = new html_table_row(); - $row->cells[] = get_string('attendancepercent', 'attendance') . ':'; - if ($maxgrade == 0) { - $percent = 0; - } else { - $percent = $grade / $maxgrade * 100; - } - $row->cells[] = format_float(sprintf("%0.{$decimalpoints}f", $percent)); + $row->attributes['class'] = 'normal'; + $row->cells[] = get_string('maxpossiblepoints', 'attendance') . ':'; + $row->cells[] = attendance_format_float($usersummary->maxpossiblepoints) . ' / ' . attendance_format_float($usersummary->allsessionsmaxpoints); + $stattable->data[] = $row; + + $row = new html_table_row(); + $row->attributes['class'] = 'normal'; + $row->cells[] = get_string('maxpossiblepercentage', 'attendance') . ':'; + $row->cells[] = attendance_format_float($usersummary->maxpossiblepercentage * 100, false) . '%'; $stattable->data[] = $row; } @@ -268,25 +291,6 @@ function construct_user_data_stat($stat, $statuses, $gradable, $grade, $maxgrade } function construct_full_user_stat_html_table($attendance, $course, $user, $coursemodule) { - global $CFG; - $gradeable = $attendance->grade > 0; - $statuses = attendance_get_statuses($attendance->id); - $userstatusesstat = attendance_get_user_statuses_stat($attendance->id, $course->startdate, $user->id, $coursemodule); - $stat['completed'] = attendance_get_user_taken_sessions_count($attendance->id, $course->startdate, $user->id, $coursemodule); - $stat['statuses'] = $userstatusesstat; - if ($gradeable) { - $grade = attendance_get_user_grade($userstatusesstat, $statuses); - $maxgrade = attendance_get_user_max_grade(attendance_get_user_taken_sessions_count($attendance->id, $course->startdate, - $user->id, $coursemodule), $statuses); - if (!$decimalpoints = grade_get_setting($course->id, 'decimalpoints')) { - $decimalpoints = $CFG->grade_decimalpoints; - } - } else { - $grade = 0; - $maxgrade = 0; - $decimalpoints = 0; - } - - return construct_user_data_stat($stat, $statuses, - $gradeable, $grade, $maxgrade, $decimalpoints); + $summary = new mod_attendance_summary($attendance->id, $user->id); + return construct_user_data_stat($summary->get_all_sessions_summary_for($user->id), ATT_VIEW_ALL); }