From fb7700820430639c12d8813c3da1b914269dba3f Mon Sep 17 00:00:00 2001 From: Nicolas Ducoulombier Date: Tue, 30 Jun 2015 15:06:34 -0500 Subject: [PATCH] Fixing attendance calculation and attendance presentation with group management -refs BT#9425 --- main/attendance/attendance_controller.php | 20 +-- main/inc/lib/attendance.lib.php | 161 ++++++++++++++++------ 2 files changed, 127 insertions(+), 54 deletions(-) diff --git a/main/attendance/attendance_controller.php b/main/attendance/attendance_controller.php index ee623fdbdda..c9703f08421 100755 --- a/main/attendance/attendance_controller.php +++ b/main/attendance/attendance_controller.php @@ -280,7 +280,7 @@ public function attendance_sheet($action, $attendance_id, $student_id = 0, $edit if ($edit == true) { if (api_is_allowed_to_edit(null, true) || $isDrhOfCourse) { - $data['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id); + $data['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id, 0, $groupId); } } else { if (!empty($student_id)) { @@ -293,12 +293,12 @@ public function attendance_sheet($action, $attendance_id, $student_id = 0, $edit api_is_coach(api_get_session_id(), api_get_course_int_id()) || $isDrhOfCourse ) { - $data['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id); + $data['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id, 0, $groupId); } else { - $data['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id, $user_id); + $data['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id, $user_id, $groupId); } - $data['faults'] = $attendance->get_faults_of_user($user_id, $attendance_id); + $data['faults'] = $attendance->get_faults_of_user($user_id, $attendance_id, $groupId); $data['user_id'] = $user_id; } @@ -332,12 +332,12 @@ public function attendance_sheet($action, $attendance_id, $student_id = 0, $edit $my_calendar_id, $groupId ); - $data['attendant_calendar_all'] = $attendance->get_attendance_calendar($attendance_id); - $data['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id); + $data['attendant_calendar_all'] = $attendance->get_attendance_calendar($attendance_id, 'all', null, $groupId); + $data['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id, 0, $groupId); $data['next_attendance_calendar_id'] = $attendance->get_next_attendance_calendar_id($attendance_id); $data['next_attendance_calendar_datetime'] = $attendance->get_next_attendance_calendar_datetime($attendance_id); } else { - $data['attendant_calendar_all'] = $attendance->get_attendance_calendar($attendance_id); + $data['attendant_calendar_all'] = $attendance->get_attendance_calendar($attendance_id, 'all', null, $groupId); $data['attendant_calendar'] = $attendance->get_attendance_calendar($attendance_id, $filter_type, null, $groupId); } @@ -485,15 +485,15 @@ public function attendance_sheet_export_to_pdf($action, $attendance_id, $student ); if (api_is_allowed_to_edit(null, true) || api_is_drh()) { - $data_array['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id); + $data_array['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id, 0, $groupId); } else { if (!empty($student_id)) { $user_id = intval($student_id); } else { $user_id = api_get_user_id(); } - $data_array['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id, $user_id); - $data_array['faults'] = $attendance->get_faults_of_user($user_id, $attendance_id); + $data_array['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id, $user_id, $groupId); + $data_array['faults'] = $attendance->get_faults_of_user($user_id, $attendance_id, $groupId); $data_array['user_id'] = $user_id; } diff --git a/main/inc/lib/attendance.lib.php b/main/inc/lib/attendance.lib.php index 0e02a65d419..273545c595c 100755 --- a/main/inc/lib/attendance.lib.php +++ b/main/inc/lib/attendance.lib.php @@ -717,8 +717,9 @@ public function attendance_sheet_add($calendar_id, $users_present, $attendance_i $result = Database::query($sql); $insertId = Database::insert_id(); - $sql = "UPDATE $tbl_attendance_sheet SET id = iid WHERE iid = $insertId"; - Database::query($sql); + //The table attendance_sheet do not hace id field + //$sql = "UPDATE $tbl_attendance_sheet SET id = iid WHERE iid = $insertId"; + //Database::query($sql); $affected_rows += Database::affected_rows($result); } else { @@ -749,8 +750,9 @@ public function attendance_sheet_add($calendar_id, $users_present, $attendance_i $result = Database::query($sql); $insertId = Database::insert_id(); - $sql = "UPDATE $tbl_attendance_sheet SET id = iid WHERE iid = $insertId"; - Database::query($sql); + //The table attendance_sheet do not hace id field + //$sql = "UPDATE $tbl_attendance_sheet SET id = iid WHERE iid = $insertId"; + //Database::query($sql); $affected_rows += Database::affected_rows($result); } else { @@ -805,7 +807,7 @@ public function update_users_results($user_ids, $attendance_id) $attendance_id = intval($attendance_id); // fill results about presence of students - $attendance_calendar = $this->get_attendance_calendar($attendance_id); + $attendance_calendar = $this->get_attendance_calendar($attendance_id, 'all', null, null, true); $calendar_ids = array(); // get all dates from calendar by current attendance foreach ($attendance_calendar as $cal) { @@ -948,9 +950,10 @@ public function get_faults_of_user($user_id, $attendance_id, $groupId = null) $attendance_id = intval($attendance_id); $results = array(); $attendance_data = $this->get_attendance_by_id($attendance_id); - $calendar_count = self::get_number_of_attendance_calendar($attendance_id, $groupId); - $total_done_attendance = $attendance_data['attendance_qualify_max']; - $attendance_user_score = $this->get_user_score($user_id, $attendance_id); + $calendar_count = self::get_number_of_attendance_calendar($attendance_id, $groupId, NULL, $user_id); + // $total_done_attendance = $attendance_data['attendance_qualify_max']; + $total_done_attendance = self::get_number_of_attendance_calendar($attendance_id, $groupId, true, $user_id); + $attendance_user_score = $this->get_user_score($user_id, $attendance_id, $groupId); //This is the main change of the BT#1381 //$total_done_attendance = $calendar_count; @@ -1082,12 +1085,12 @@ public function get_faults_average_by_course($user_id, $course_code, $session_id * @param int $user_id for showing data for only one user (optional) * @return array users attendance sheet data */ - public function get_users_attendance_sheet($attendance_id, $user_id = 0) + public function get_users_attendance_sheet($attendance_id, $user_id = 0, $groupId = null) { $tbl_attendance_sheet = Database::get_course_table(TABLE_ATTENDANCE_SHEET); $tbl_attendance_calendar= Database::get_course_table(TABLE_ATTENDANCE_CALENDAR); - $attendance_calendar = $this->get_attendance_calendar($attendance_id); + $attendance_calendar = $this->get_attendance_calendar($attendance_id, 'all', null, $groupId); $calendar_ids = array(); // get all dates from calendar by current attendance foreach ($attendance_calendar as $cal) { @@ -1202,17 +1205,39 @@ public function get_next_attendance_calendar_datetime($attendance_id) * @param int $attendance_id * @return int score */ - public function get_user_score($user_id, $attendance_id) + public function get_user_score($user_id, $attendance_id, $groupId = null) { $tbl_attendance_result = Database::get_course_table(TABLE_ATTENDANCE_RESULT); + $tbl_attendance_sheet = Database::get_course_table(TABLE_ATTENDANCE_SHEET); + $tbl_attendance_cal_rel_group = Database::get_course_table(TABLE_ATTENDANCE_CALENDAR_REL_GROUP); + $tbl_attendance_cal = Database::get_course_table(TABLE_ATTENDANCE_CALENDAR); $user_id = intval($user_id); $attendance_id = intval($attendance_id); $course_id = api_get_course_int_id(); - $sql = "SELECT score FROM $tbl_attendance_result - WHERE - c_id = $course_id AND - user_id='$user_id' AND - attendance_id='$attendance_id'"; + if (empty($groupId)) + { + $sql = "SELECT score FROM $tbl_attendance_result + WHERE + c_id = $course_id AND + user_id='$user_id' AND + attendance_id='$attendance_id'"; + } else { + $sql = "SELECT count(presence) as score FROM $tbl_attendance_sheet + WHERE + c_id = $course_id AND + user_id='$user_id' AND + presence = 1 AND + attendance_calendar_id IN ( + SELECT calendar_id FROM $tbl_attendance_cal_rel_group crg + INNER JOIN $tbl_attendance_cal c + ON (crg.calendar_id = c.id) + WHERE + crg.c_id = $course_id AND + crg.group_id = $groupId AND + c.attendance_id = $attendance_id + ) + "; + } $rs = Database::query($sql); $score = 0; if (Database::num_rows($rs) > 0) { @@ -1264,6 +1289,7 @@ public function get_attendance_calendar( ) { global $dateFormatShort, $timeNoSecFormat; $tbl_attendance_calendar = Database::get_course_table(TABLE_ATTENDANCE_CALENDAR); + $tbl_acrg = Database::get_course_table(TABLE_ATTENDANCE_CALENDAR_REL_GROUP); $attendance_id = intval($attendance_id); $course_id = api_get_course_int_id(); $groupCondition = null; @@ -1277,7 +1303,7 @@ public function get_attendance_calendar( c_id = $course_id AND attendance_id = '$attendance_id' AND id NOT IN ( - SELECT calendar_id FROM $table + SELECT calendar_id FROM $tbl_acrg WHERE c_id = $course_id AND group_id != 0 AND group_id IS NOT NULL ) "; @@ -1285,11 +1311,13 @@ public function get_attendance_calendar( if (!empty($groupId)) { $groupId = intval($groupId); - $table = Database::get_course_table(TABLE_ATTENDANCE_CALENDAR_REL_GROUP); $sql = "SELECT c.* FROM $tbl_attendance_calendar c - INNER JOIN $table g + INNER JOIN $tbl_acrg g ON c.c_id = g.c_id AND c.id = g.calendar_id - WHERE c.c_id = $course_id AND g.group_id = '$groupId' "; + WHERE c.c_id = $course_id AND + g.group_id = '$groupId' AND + c.attendance_id = '$attendance_id' + "; } if (!in_array($type, array('today', 'all', 'all_done', 'all_not_done','calendar_id'))) { @@ -1345,38 +1373,83 @@ public function get_attendance_calendar( * @param int $groupId * @return int number of dates in attendance calendar */ - public static function get_number_of_attendance_calendar($attendance_id, $groupId = 0) + public static function get_number_of_attendance_calendar($attendance_id, $groupId = 0, $done_attendance = NULL, $userId = 0) { $tbl_attendance_calendar = Database::get_course_table(TABLE_ATTENDANCE_CALENDAR); $calendarRelGroup = Database::get_course_table(TABLE_ATTENDANCE_CALENDAR_REL_GROUP); + $tbl_groupRelUser = Database::get_course_table(TABLE_GROUP_USER); $attendance_id = intval($attendance_id); $groupId = intval($groupId); $course_id = api_get_course_int_id(); - if (empty($groupId)) { - $sql = "SELECT count(a.id) - FROM $tbl_attendance_calendar a - WHERE - c_id = $course_id AND - attendance_id = '$attendance_id' AND - id NOT IN ( - SELECT calendar_id FROM $calendarRelGroup - WHERE - c_id = $course_id AND - group_id != 0 AND - group_id IS NOT NULL - ) - "; + $where_attendance = ''; + if ($done_attendance) + { + $where_attendance = ' done_attendance = 1 AND '; + } + if (empty($userId)) + { + if (empty($groupId)) + { + $sql = "SELECT count(a.id) + FROM $tbl_attendance_calendar a + WHERE + c_id = $course_id AND + $where_attendance + attendance_id = '$attendance_id' AND + id NOT IN ( + SELECT calendar_id FROM $calendarRelGroup + WHERE + c_id = $course_id AND + group_id != 0 AND + group_id IS NOT NULL + ) + "; + } else { + $sql = "SELECT count(a.id) + FROM $tbl_attendance_calendar a + INNER JOIN $calendarRelGroup g + ON (a.id = g.calendar_id AND a.c_id = g.c_id) + WHERE + a.c_id = $course_id AND + $where_attendance + attendance_id = '$attendance_id' AND + group_id = $groupId + "; + } } else { - $sql = "SELECT count(a.id) - FROM $tbl_attendance_calendar a - INNER JOIN $calendarRelGroup g - ON (a.id = g.calendar_id AND a.c_id = g.c_id) - WHERE - a.c_id = $course_id AND - attendance_id = '$attendance_id' AND - group_id = $groupId - "; + if (empty($groupId)) { + $sql = "SELECT count(a.id) + FROM $tbl_attendance_calendar a + WHERE + c_id = $course_id AND + $where_attendance + attendance_id = '$attendance_id' AND + id NOT IN ( + SELECT calendar_id FROM $calendarRelGroup + WHERE + c_id = $course_id AND + group_id != 0 AND + group_id IS NOT NULL AND + group_id NOT IN ( + SELECT group_id + FROM $tbl_groupRelUser + WHERE user_id = $userId + ) + ) + "; + } else { + $sql = "SELECT count(a.id) + FROM $tbl_attendance_calendar a + INNER JOIN $calendarRelGroup g + ON (a.id = g.calendar_id AND a.c_id = g.c_id) + WHERE + a.c_id = $course_id AND + $where_attendance + attendance_id = '$attendance_id' AND + group_id = $groupId + "; + } } $rs = Database::query($sql);