Browse Source

Fixing attendance calculation and attendance presentation with group management -refs BT#9425

Nicolas Ducoulombier 9 years ago
parent
commit
fb77008204
2 changed files with 127 additions and 54 deletions
  1. 10 10
      main/attendance/attendance_controller.php
  2. 117 44
      main/inc/lib/attendance.lib.php

+ 10 - 10
main/attendance/attendance_controller.php

@@ -280,7 +280,7 @@ class AttendanceController
 
         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 @@ class AttendanceController
                 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 @@ class AttendanceController
                 $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 @@ class AttendanceController
         );
 
         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;
         }
 

+ 117 - 44
main/inc/lib/attendance.lib.php

@@ -717,8 +717,9 @@ class Attendance
 				$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 @@ class Attendance
 				$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 @@ class Attendance
 
 		$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 @@ class Attendance
 		$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 @@ class Attendance
 	 * @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 @@ class Attendance
 	 * @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 @@ class Attendance
 	) {
 		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 @@ class Attendance
 						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 @@ class Attendance
 
 		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 @@ class Attendance
 	 * @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);