diff --git a/main/inc/lib/events.lib.php b/main/inc/lib/events.lib.php index 259e7a4310..08ecf68553 100644 --- a/main/inc/lib/events.lib.php +++ b/main/inc/lib/events.lib.php @@ -1775,10 +1775,11 @@ class Event /** * Get the last best result from all attempts in exercises per user (out of learning paths). * - * @param int $user_id - * @param int $exercise_id - * @param int $courseId - * @param int $session_id + * @param int $user_id + * @param int $exercise_id + * @param int $courseId + * @param int $session_id + * @param bool $skipLpResults * * @return array */ @@ -1786,7 +1787,8 @@ class Event $user_id, $exercise_id, $courseId, - $session_id = 0 + $session_id = 0, + $skipLpResults = true ) { $table = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCISES); $courseId = (int) $courseId; @@ -1800,17 +1802,23 @@ class Event c_id = $courseId AND exe_exo_id = $exercise_id AND session_id = $session_id AND - exe_user_id = $user_id AND - orig_lp_id = 0 AND - orig_lp_item_id = 0 - ORDER BY exe_id"; + exe_user_id = $user_id + "; + + if ($skipLpResults) { + $sql .= ' AND + orig_lp_id = 0 AND + orig_lp_item_id = 0 '; + } + + $sql .= ' ORDER BY exe_id '; $res = Database::query($sql); $list = []; while ($row = Database::fetch_array($res, 'ASSOC')) { $list[$row['exe_id']] = $row; } - //Getting the best results of every student + // Getting the best results of every student. $best_score_return = []; $best_score_return['exe_result'] = 0; diff --git a/main/inc/lib/tracking.lib.php b/main/inc/lib/tracking.lib.php index 6ab7261f62..962c5a2b50 100755 --- a/main/inc/lib/tracking.lib.php +++ b/main/inc/lib/tracking.lib.php @@ -7566,7 +7566,7 @@ class TrackingCourseLog } if ($result_extra_field['field_type'] == ExtraField::FIELD_TYPE_TRIPLE_SELECT) { - list($level1, $level2, $level3) = explode(';', $row['value']); + [$level1, $level2, $level3] = explode(';', $row['value']); $row['value'] = $result_extra_field['options'][$level1]['display_text'].' / '; $row['value'] .= $result_extra_field['options'][$level2]['display_text'].' / '; @@ -7786,6 +7786,21 @@ class TrackingCourseLog $sortByFirstName = api_sort_by_first_name(); Session::write('user_id_list', []); $userIdList = []; + + $addExerciseOption = api_get_configuration_value('add_exercise_best_attempt_in_report'); + $exerciseResultsToCheck = []; + if (!empty($addExerciseOption) && isset($addExerciseOption['courses']) && + isset($addExerciseOption['courses'][$courseCode]) + ) { + foreach ($addExerciseOption['courses'][$courseCode] as $exerciseId) { + $exercise = new Exercise(); + $exercise->read($exerciseId); + if ($exercise->iId) { + $exerciseResultsToCheck[] = $exercise; + } + } + } + while ($user = Database::fetch_array($res, 'ASSOC')) { $userIdList[] = $user['user_id']; $user['official_code'] = $user['col0']; @@ -7857,6 +7872,27 @@ class TrackingCourseLog $user['student_score_best'] = $averageBestScore; } + $exerciseResults = []; + if (!empty($exerciseResultsToCheck)) { + foreach ($exerciseResultsToCheck as $exercise) { + $bestExerciseResult = Event::get_best_attempt_exercise_results_per_user( + $user['user_id'], + $exercise->iId, + $courseId, + $session_id, + true + ); + + $best = null; + if ($bestExerciseResult) { + $best = $bestExerciseResult['exe_result'] / $bestExerciseResult['exe_weighting']; + $best = round($best, 2) * 100; + $best .= '%'; + } + $exerciseResults['exercise_'.$exercise->iId] = $best; + } + } + $user['count_assignments'] = Tracking::count_student_assignments( $user['user_id'], $course_code, @@ -7921,6 +7957,12 @@ class TrackingCourseLog $user_row['exercise_average_best_attempt'] = $user['exercise_average_best_attempt']; $user_row['student_score'] = $user['student_score']; $user_row['student_score_best'] = $user['student_score_best']; + if (!empty($exerciseResults)) { + foreach ($exerciseResults as $exerciseId => $bestResult) { + $user_row[$exerciseId] = $bestResult; + } + } + $user_row['count_assignments'] = $user['count_assignments']; $user_row['count_messages'] = $user['count_messages']; diff --git a/main/install/configuration.dist.php b/main/install/configuration.dist.php index 97f56822b6..2765edb00b 100755 --- a/main/install/configuration.dist.php +++ b/main/install/configuration.dist.php @@ -1773,6 +1773,13 @@ $_configuration['auth_password_links'] = [ // All courses with category MY_CATEGORY will be used as course templates BT#18083 // $_configuration['course_category_code_to_use_as_model'] = 'MY_CATEGORY'; +// Shows the best exercise score attempt for a student in the reports. +/*$_configuration['add_exercise_best_attempt_in_report'] = [ + 'courses' => [ + 'ABC' => [88, 89], // Where ABC is the course code and 88 is the exercise id + ] +];*/ + // KEEP THIS AT THE END // -------- Custom DB changes // Add user activation by confirmation email diff --git a/main/tracking/courseLog.php b/main/tracking/courseLog.php index aed4f68743..81466f964b 100755 --- a/main/tracking/courseLog.php +++ b/main/tracking/courseLog.php @@ -493,7 +493,7 @@ if ($nbStudents > 0) { $scoresDistribution[$reducedAverage]++; } $scoreStudent = substr($userTracking[5], 0, -1) + substr($userTracking[7], 0, -1); - list($hours, $minutes, $seconds) = preg_split('/:/', $userTracking[4]); + [$hours, $minutes, $seconds] = preg_split('/:/', $userTracking[4]); $minutes = round((3600 * $hours + 60 * $minutes + $seconds) / 60); $certificate = false; @@ -548,9 +548,6 @@ if ($nbStudents > 0) { $mainForm->addHtml($formClass->returnForm()); $mainForm->addHtml($formExtraField->returnForm()); $mainForm->addHtml(''); - - //$html .= $formClass->returnForm(); - //$html .= $formExtraField->returnForm(); $html .= $mainForm->returnForm(); $getLangXDays = get_lang('XDays'); @@ -671,6 +668,7 @@ if ($nbStudents > 0) { false ); $headers['exercise_average'] = get_lang('ExerciseAverage'); + $table->set_header( $headerCounter++, get_lang('Score').' '. @@ -687,6 +685,27 @@ if ($nbStudents > 0) { ); $headers['score_best'] = $bestScoreLabel; + $addExerciseOption = api_get_configuration_value('add_exercise_best_attempt_in_report'); + $exerciseResultHeaders = []; + if (!empty($addExerciseOption) && isset($addExerciseOption['courses']) && + isset($addExerciseOption['courses'][$courseCode]) + ) { + foreach ($addExerciseOption['courses'][$courseCode] as $exerciseId) { + $exercise = new Exercise(); + $exercise->read($exerciseId); + if ($exercise->iId) { + $title = get_lang('Exercise').': '.$exercise->get_formated_title(); + $table->set_header( + $headerCounter++, + $title, + false + ); + $exerciseResultHeaders[] = $title; + $headers['exercise_'.$exercise->iId] = $title; + } + } + } + $table->set_header($headerCounter++, get_lang('Student_publication'), false); $headers['student_publication'] = get_lang('Student_publication'); $table->set_header($headerCounter++, get_lang('Messages'), false); @@ -986,6 +1005,11 @@ if ($export_csv) { $csv_headers[] = get_lang('ExerciseAverage'); $csv_headers[] = get_lang('Score'); $csv_headers[] = $bestScoreLabel; + if (!empty($exerciseResultHeaders)) { + foreach ($exerciseResultHeaders as $exerciseLabel) { + $csv_headers[] = $exerciseLabel; + } + } $csv_headers[] = get_lang('Student_publication'); $csv_headers[] = get_lang('Messages'); if (empty($sessionId)) {