diff --git a/main/tracking/exams.php b/main/tracking/exams.php index 4a78f2911e..c3e510e6f4 100755 --- a/main/tracking/exams.php +++ b/main/tracking/exams.php @@ -14,7 +14,6 @@ require_once api_get_path(LIBRARY_PATH).'pear/Spreadsheet_Excel_Writer/Writer.ph $toolTable = Database::get_course_table(TABLE_TOOL_LIST); $quizTable = Database::get_course_table(TABLE_QUIZ_TEST); -$exerciseStatsTable = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES); $this_section = SECTION_TRACKING; $is_allowedToTrack = $is_courseAdmin || $is_platformAdmin || $is_courseCoach || $is_sessionAdmin; @@ -47,6 +46,12 @@ if ($global) { $sessionId = api_get_session_id(); +if (empty($sessionId)) { + $sessionCondition = ' AND session_id = 0'; +} else { + $sessionCondition = api_get_session_condition($sessionId, true, true); +} + $form = new FormValidator('search_simple', 'POST', '', '', null, false); $form->addElement('text', 'score', get_lang('Percentage')); if ($global) { @@ -54,11 +59,12 @@ if ($global) { } else { // Get exam lists $courseId = api_get_course_int_id(); + $sql = "SELECT quiz.title, id FROM $quizTable AS quiz WHERE c_id = $courseId AND - active='1' AND - session_id = $sessionId + active='1' + $sessionCondition ORDER BY quiz.title ASC"; $result = Database::query($sql); @@ -169,8 +175,8 @@ $s_css_class = null; if (!empty($courseList) && is_array($courseList)) { foreach ($courseList as $courseInfo) { - $global_row = $row_not_global = array(); $sessionList = SessionManager::get_session_by_course($courseInfo['code']); + $newSessionList = array(); if (!empty($sessionList)) { foreach ($sessionList as $session) { @@ -183,10 +189,20 @@ if (!empty($courseList) && is_array($courseList)) { if ($global) { $sql = "SELECT count(id) as count FROM $quizTable AS quiz - WHERE active='1' AND c_id = $courseId"; + WHERE active='1' AND c_id = $courseId AND session_id = 0"; $result = Database::query($sql); $countExercises = Database::store_result($result); $exerciseCount = $countExercises[0]['count']; + + $sql = "SELECT count(id) as count + FROM $quizTable AS quiz + WHERE active='1' AND c_id = $courseId AND session_id <> 0"; + $result = Database::query($sql); + $countExercises = Database::store_result($result); + $exerciseSessionCount = $countExercises[0]['count']; + + $exerciseCount = $exerciseCount + $exerciseCount *count($newSessionList) + $exerciseSessionCount; + // Add course and session list. if ($exerciseCount == 0) { $exerciseCount = 2; @@ -210,256 +226,118 @@ if (!empty($courseList) && is_array($courseList)) { WHERE c_id = $courseId AND active='1' ORDER BY session_id, quiz.title ASC"; } else { + //$sessionCondition = api_get_session_condition($sessionId, true, false); if (!empty($exerciseId)) { $sql = "SELECT quiz.title, id, session_id FROM $quizTable AS quiz WHERE c_id = $courseId AND - active='1' AND - id = $exerciseId AND - session_id = $sessionId + active = '1' AND + id = $exerciseId + $sessionCondition + ORDER BY session_id, quiz.title ASC"; } else { + $sql = "SELECT quiz.title, id, session_id FROM $quizTable AS quiz WHERE c_id = $courseId AND - active='1' AND - session_id = $sessionId + active='1' + $sessionCondition ORDER BY session_id, quiz.title ASC"; } } $resultExercises = Database::query($sql); - $i = 0; if (Database::num_rows($resultExercises) > 0) { - while ($exercise = Database::fetch_array($resultExercises)) { - $sessionId = $exercise['session_id']; - - if (empty($sessionId)) { - $students = CourseManager::get_student_list_from_course_code( - $courseInfo['code'], - false - ); - } else { - $students = CourseManager::get_student_list_from_course_code( - $courseInfo['code'], - true, - $sessionId - ); - } - - $totalStudents = count($students); - - $global_row[]= $courseInfo['title']; - - if (!$global) { - $html .= ""; - } - - if (!$global) { - $html .= ''; - } else { - $html .= ''; - } - - $html .= $exercise['title']; - - if ($global && !empty($sessionId)) { - $sessionName = isset($newSessionList[$sessionId]) ? $newSessionList[$sessionId] : null; - $html .= Display::return_icon('star.png', get_lang('Session')).' ('.$sessionName.')'; - } - - $html .= ''; - - $global_row[] = $exercise['title']; - $row_not_global['exercise'] = $exercise['title']; - - $taken = 0; - $total_with_parameter = 0; - $fail = 0; - $not_taken = 0; - - $total_with_parameter_score = 0; - $total_with_parameter_porcentage = 0; - - $student_result = array(); - foreach ($students as $student) { - $studentId = isset($student['user_id']) ? $student['user_id'] : $student['id_user']; - $sql = "SELECT COUNT(ex.exe_id) as count - FROM $exerciseStatsTable AS ex - WHERE - ex.exe_cours_id = '".$courseInfo['code']."' AND - ex.exe_exo_id = ".$exercise['id']." AND - exe_user_id='".$studentId."' AND - session_id = $sessionId - "; - $result = Database::query($sql); - $attempts = Database::fetch_array($result); - - $sql = "SELECT exe_id, exe_result, exe_weighting - FROM $exerciseStatsTable - WHERE - exe_user_id = ".$studentId." AND - exe_cours_id = '".$courseInfo['code']."' AND - exe_exo_id = ".$exercise['id']." AND - session_id = $sessionId - ORDER BY exe_result DESC - LIMIT 1"; - $result = Database::query($sql); - $score = 0; - $weighting = 0; - while ($scoreInfo = Database::fetch_array($result)) { - $score = $score + $scoreInfo['exe_result']; - $weighting = $weighting + $scoreInfo['exe_weighting']; - } + $export_array_global = array(); - $percentageScore = 0; - if ($weighting != 0) { - $percentageScore = round(($score*100)/$weighting); - } - - $weighting = 0; - - if ($i % 2 == 0) { - $s_css_class = "row_odd"; - } else { - $s_css_class = "row_even"; - } - $i++; - - if ($attempts['count'] > 0 ) { - $taken++; - } - - if ($percentageScore >= $filter_score) { - $total_with_parameter_score++; - } - - $tempArray = array(); - - if (!$global) { - $userInfo = api_get_user_info($studentId); - - // User - $userRow = ''; - $userRow .= $userInfo['complete_name']; - $userRow .= ''; - - // Best result - - if (!empty($attempts['count'])) { - $userRow .= ''; - $userRow .= $percentageScore; - $tempArray[] = $percentageScore; - $userRow .= ''; - - if ($percentageScore >= $filter_score) { - $userRow .= ''; - $userRow .= get_lang('PassExam').''; - $tempArray[] = get_lang('PassExam'); - } else { - $userRow .= ''; - $userRow .= get_lang('ExamFail').''; - $tempArray[] = get_lang('ExamFail'); - } - - $userRow .= ''; - $userRow .= $attempts['count']; - $tempArray[] = $attempts['count']; - $userRow .= ''; - } else { - $score = '-'; - $userRow .= ''; - $userRow .= '-'; - $tempArray[] = '-'; - $userRow .= ''; - - $userRow .= ''; - $userRow .= get_lang('NoAttempt'); - $tempArray[] = get_lang('NoAttempt'); - $userRow .= ''; - $userRow .= ''; - $userRow .= 0; - $tempArray[] = 0; - $userRow .= ''; + while ($exercise = Database::fetch_array($resultExercises)) { + $exerciseSessionId = $exercise['session_id']; + + if (empty($exerciseSessionId)) { + + if ($global) { + // If the exercise was created in the base course. + // Load all sessions. + foreach ($newSessionList as $currentSessionId => $sessionName) { + $result = processStudentList( + $filter_score, + $global, + $exercise, + $courseInfo, + $currentSessionId, + $newSessionList + ); + + $html .= $result['html']; + $export_array_global = array_merge($export_array_global, $result['export_array_global']); } - $userRow .= ''; - $student_result[$studentId] = array( - 'html' => $userRow, - 'score' => $score, - 'array' => $tempArray, - 'user' => $userInfo['complete_name'] + // Load base course. + $result = processStudentList( + $filter_score, + $global, + $exercise, + $courseInfo, + 0, + $newSessionList ); - } - } - - if (!$global) { - if (!empty($student_result)) { - $student_result_empty = $student_result_content = array(); - foreach ($student_result as $row) { - if ($row['score'] == '-') { - $student_result_empty[] = $row; - } else { - $student_result_content[] = $row; - } - } + $html .= $result['html']; + $export_array_global = array_merge($export_array_global, $result['export_array_global']); + } else { - // Sort only users with content - usort($student_result_content, 'sort_user'); - $student_result = array_merge($student_result_content, $student_result_empty); + if (empty($sessionId)) { + // Load base course. + $result = processStudentList( + $filter_score, + $global, + $exercise, + $courseInfo, + 0, + $newSessionList + ); + + $html .= $result['html']; + $export_array_global = array_merge( + $export_array_global, + $result['export_array_global'] + ); + } else { - foreach ($student_result as $row) { - $html .= $row['html']; - $row_not_global['results'][]= $row['array']; - $row_not_global['users'][] = $row['user']; + $result = processStudentList( + $filter_score, + $global, + $exercise, + $courseInfo, + $sessionId, + $newSessionList + ); + + $html .= $result['html']; + $export_array_global = array_merge( + $export_array_global, + $result['export_array_global'] + ); } - $export_array[] = $row_not_global; - $row_not_global = array(); - } - } - - if ($global) { - // Exam taken - $html .= ''; - $html .= $taken; - $global_row[]= $taken; - $html .= ''; - - // Exam NOT taken - $html .= ''; - $html .= $not_taken = $totalStudents - $taken; - $global_row[]= $not_taken; - $html .= ''; - - // Exam pass - if (!empty($total_with_parameter_score)) { - $html .= ''; - } else { - $html .= ''; } - $html .= $total_with_parameter_score; - $global_row[]= $total_with_parameter_score; - $html .= ''; - - // Exam fail - $html .= ''; - - $html .= $fail = $taken - $total_with_parameter_score; - $global_row[]= $fail; - $html .= ''; - - $html .= ''; - $html .= $totalStudents; - $global_row[]= $totalStudents; + } else { + // If the exercise only exists in this session. + + $result = processStudentList( + $filter_score, + $global, + $exercise, + $courseInfo, + $exerciseSessionId, + $newSessionList + ); - $html .= ''; - $html .= ''; - $export_array_global[] = $global_row; - $global_row = array(); + $html .= $result['html']; + $export_array_global = array_merge($export_array_global, $result['export_array_global']); } } } else { @@ -587,4 +465,232 @@ function export_complete_report_xls($filename, $array) $workbook->close(); exit; } + +function processStudentList($filter_score, $global, $exercise, $courseInfo, $sessionId, $newSessionList) +{ + $exerciseStatsTable = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES); + + if (empty($sessionId)) { + $students = CourseManager::get_student_list_from_course_code( + $courseInfo['code'], + false + ); + } else { + $students = CourseManager::get_student_list_from_course_code( + $courseInfo['code'], + true, + $sessionId + ); + } + + $html = null; + + $totalStudents = count($students); + + if (!$global) { + $html .= ""; + } + + if (!$global) { + $html .= ''; + } else { + $html .= ''; + } + + $html .= $exercise['title']; + + if ($global && !empty($sessionId)) { + $sessionName = isset($newSessionList[$sessionId]) ? $newSessionList[$sessionId] : null; + $html .= Display::return_icon('star.png', get_lang('Session')).' ('.$sessionName.')'; + } + + $html .= ''; + + $globalRow = array( + $courseInfo['title'], + $exercise['title'] + ); + + $total_with_parameter_score = 0; + $taken = 0; + $export_array_global = array(); + $studentResult = array(); + + foreach ($students as $student) { + $studentId = isset($student['user_id']) ? $student['user_id'] : $student['id_user']; + $sql = "SELECT COUNT(ex.exe_id) as count + FROM $exerciseStatsTable AS ex + WHERE + ex.exe_cours_id = '".$courseInfo['code']."' AND + ex.exe_exo_id = ".$exercise['id']." AND + exe_user_id='".$studentId."' AND + session_id = $sessionId + "; + $result = Database::query($sql); + $attempts = Database::fetch_array($result); + + $sql = "SELECT exe_id, exe_result, exe_weighting + FROM $exerciseStatsTable + WHERE + exe_user_id = ".$studentId." AND + exe_cours_id = '".$courseInfo['code']."' AND + exe_exo_id = ".$exercise['id']." AND + session_id = $sessionId + ORDER BY exe_result DESC + LIMIT 1"; + $result = Database::query($sql); + $score = 0; + $weighting = 0; + while ($scoreInfo = Database::fetch_array($result)) { + $score = $score + $scoreInfo['exe_result']; + $weighting = $weighting + $scoreInfo['exe_weighting']; + } + + $percentageScore = 0; + + if ($weighting != 0) { + $percentageScore = round(($score*100)/$weighting); + } + + if ($attempts['count'] > 0 ) { + $taken++; + } + + if ($percentageScore >= $filter_score) { + $total_with_parameter_score++; + } + + $tempArray = array(); + + if (!$global) { + $userInfo = api_get_user_info($studentId); + + // User + $userRow = ''; + $userRow .= $userInfo['complete_name']; + $userRow .= ''; + + // Best result + + if (!empty($attempts['count'])) { + $userRow .= ''; + $userRow .= $percentageScore; + $tempArray[] = $percentageScore; + $userRow .= ''; + + if ($percentageScore >= $filter_score) { + $userRow .= ''; + $userRow .= get_lang('PassExam').''; + $tempArray[] = get_lang('PassExam'); + } else { + $userRow .= ''; + $userRow .= get_lang('ExamFail').''; + $tempArray[] = get_lang('ExamFail'); + } + + $userRow .= ''; + $userRow .= $attempts['count']; + $tempArray[] = $attempts['count']; + $userRow .= ''; + } else { + $score = '-'; + $userRow .= ''; + $userRow .= '-'; + $tempArray[] = '-'; + $userRow .= ''; + + $userRow .= ''; + $userRow .= get_lang('NoAttempt'); + $tempArray[] = get_lang('NoAttempt'); + $userRow .= ''; + $userRow .= ''; + $userRow .= 0; + $tempArray[] = 0; + $userRow .= ''; + } + $userRow .= ''; + + $studentResult[$studentId] = array( + 'html' => $userRow, + 'score' => $score, + 'array' => $tempArray, + 'user' => $userInfo['complete_name'] + ); + } + } + + $row_not_global['exercise'] = $exercise['title']; + + if (!$global) { + if (!empty($studentResult)) { + $studentResultEmpty = $studentResultContent = array(); + foreach ($studentResult as $row) { + if ($row['score'] == '-') { + $studentResultEmpty[] = $row; + } else { + $studentResultContent[] = $row; + } + } + + // Sort only users with content + usort($studentResultContent, 'sort_user'); + $studentResult = array_merge($studentResultContent, $studentResultEmpty); + + foreach ($studentResult as $row) { + $html .= $row['html']; + $row_not_global['results'][] = $row['array']; + $row_not_global['users'][] = $row['user']; + } + $export_array[] = $row_not_global; + } + } + + + if ($global) { + // Exam taken + $html .= ''; + $html .= $taken; + $globalRow[]= $taken; + $html .= ''; + + // Exam NOT taken + $html .= ''; + $html .= $not_taken = $totalStudents - $taken; + $globalRow[]= $not_taken; + $html .= ''; + + // Exam pass + if (!empty($total_with_parameter_score)) { + $html .= ''; + } else { + $html .= ''; + } + + $html .= $total_with_parameter_score; + $globalRow[]= $total_with_parameter_score; + $html .= ''; + + // Exam fail + $html .= ''; + + $html .= $fail = $taken - $total_with_parameter_score; + $globalRow[]= $fail; + $html .= ''; + + $html .= ''; + $html .= $totalStudents; + $globalRow[]= $totalStudents; + + $html .= ''; + + $html .= ''; + $export_array_global[] = $globalRow; + } + + return array( + 'html' => $html, + 'export_array_global' => $export_array_global, + 'total_students' => $totalStudents + ); +} Display :: display_footer();