|
@@ -314,12 +314,13 @@ class Tracking {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * This function gets the score average from all tests in a course by student
|
|
|
- * @param int|array Student(s) id
|
|
|
- * @param string Course code
|
|
|
- * @param int Exercise id (optional), filtered by exercise
|
|
|
- * @param int Session id (optional), if param $session_id is null it'll return results including sessions, 0 = session is not filtered
|
|
|
- * @return string value (number %) Which represents a round integer about the score average.
|
|
|
+ * Gets the score average from all tests in a course by student
|
|
|
+ *
|
|
|
+ * @param mixed Student(s) id
|
|
|
+ * @param string Course code
|
|
|
+ * @param int Exercise id (optional), filtered by exercise
|
|
|
+ * @param int Session id (optional), if param $session_id is null it'll return results including sessions, 0 = session is not filtered
|
|
|
+ * @return string value (number %) Which represents a round integer about the score average.
|
|
|
*/
|
|
|
public static function get_avg_student_exercise_score($student_id, $course_code, $exercise_id = 0, $session_id = null) {
|
|
|
|
|
@@ -379,17 +380,21 @@ class Tracking {
|
|
|
AND orig_lp_id = 0
|
|
|
AND exe_cours_id = '$course_code'
|
|
|
AND orig_lp_item_id = 0 $condition_session
|
|
|
- ORDER BY exe_date DESC";
|
|
|
- $res = Database::query($sql);
|
|
|
- $row = Database::fetch_array($res);
|
|
|
- $quiz_avg_score = 0;
|
|
|
- if (!empty($row['avg_score'])) {
|
|
|
- $quiz_avg_score = round($row['avg_score'],2);
|
|
|
- }
|
|
|
- if(!empty($row['num_attempts'])) {
|
|
|
- $quiz_avg_score = round($quiz_avg_score / $row['num_attempts'], 2);
|
|
|
- }
|
|
|
- return $quiz_avg_score;
|
|
|
+ ORDER BY exe_date DESC";
|
|
|
+
|
|
|
+ $res = Database::query($sql);
|
|
|
+ $row = Database::fetch_array($res);
|
|
|
+ $quiz_avg_score = 0;
|
|
|
+ if (!empty($row['avg_score'])) {
|
|
|
+ $quiz_avg_score = round($row['avg_score'],2);
|
|
|
+ }
|
|
|
+ if(!empty($row['num_attempts'])) {
|
|
|
+ $quiz_avg_score = round($quiz_avg_score / $row['num_attempts'], 2);
|
|
|
+ }
|
|
|
+ if (is_array($student_id)) {
|
|
|
+ $quiz_avg_score = round($quiz_avg_score / count($student_id), 2);
|
|
|
+ }
|
|
|
+ return $quiz_avg_score;
|
|
|
}
|
|
|
}
|
|
|
return null;
|
|
@@ -532,7 +537,9 @@ class Tracking {
|
|
|
*/
|
|
|
public static function get_avg_student_score($student_id, $course_code, $lp_ids = array(), $session_id = null, $return_array = false, $get_only_latest_attempt_results = false) {
|
|
|
$debug = false;
|
|
|
- if ($debug) echo '<h1>get_avg_student_score</h1>';
|
|
|
+ if (empty($lp_ids)) { $debug = false; }
|
|
|
+
|
|
|
+ if ($debug) echo '<h1>Tracking::get_avg_student_score</h1>';
|
|
|
// get global tables names
|
|
|
$course_table = Database :: get_main_table(TABLE_MAIN_COURSE);
|
|
|
$course_user_table = Database :: get_main_table(TABLE_MAIN_COURSE_USER);
|
|
@@ -541,7 +548,7 @@ class Tracking {
|
|
|
$tbl_stats_attempts = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
|
|
|
|
|
|
$course = CourseManager :: get_course_information($course_code);
|
|
|
-
|
|
|
+
|
|
|
if (!empty($course['db_name'])) {
|
|
|
|
|
|
// get course tables names
|
|
@@ -586,7 +593,7 @@ class Tracking {
|
|
|
$use_max_score[$row_lp['id']] = $row_lp['use_max_score'];
|
|
|
}
|
|
|
|
|
|
- if ($debug) var_dump($use_max_score);
|
|
|
+ if ($debug) { echo 'Use max score or not list '; var_dump($use_max_score);}
|
|
|
|
|
|
// Init local variables that will be used through the calculation
|
|
|
$progress = 0;
|
|
@@ -595,8 +602,8 @@ class Tracking {
|
|
|
$condition_user1 = "";
|
|
|
|
|
|
if (is_array($student_id)) {
|
|
|
- array_walk($student_id,'intval');
|
|
|
- $condition_user1 =" AND user_id IN (".implode(',',$student_id).") ";
|
|
|
+ array_walk($student_id, 'intval');
|
|
|
+ $condition_user1 =" AND user_id IN (".implode(',', $student_id).") ";
|
|
|
} else {
|
|
|
$condition_user1 =" AND user_id = $student_id ";
|
|
|
}
|
|
@@ -607,7 +614,7 @@ class Tracking {
|
|
|
//@todo problem when a course have more than 1500 users
|
|
|
$sql = "SELECT MAX(view_count) as vc, id, progress, lp_id, user_id FROM $lp_view_table
|
|
|
WHERE lp_id IN (".implode(',',$lp_list).") $condition_user1 AND session_id = $session_id GROUP BY lp_id, user_id";
|
|
|
- if ($debug) var_dump($sql);
|
|
|
+ if ($debug) echo $sql;
|
|
|
$rs_last_lp_view_id = Database::query($sql);
|
|
|
|
|
|
$global_result = 0;
|
|
@@ -624,7 +631,7 @@ class Tracking {
|
|
|
$progress = $row_lp_view['progress'];
|
|
|
$lp_id = $row_lp_view['lp_id'];
|
|
|
$user_id = $row_lp_view['user_id'];
|
|
|
- if ($debug) echo '<h2>'.$lp_id.'</h2>';
|
|
|
+ if ($debug) echo '<h2>LP id '.$lp_id.'</h2>';
|
|
|
|
|
|
if ($get_only_latest_attempt_results) {
|
|
|
//if (1) {
|
|
@@ -670,7 +677,7 @@ class Tracking {
|
|
|
$max_score_item_view = $row_max_score['max_score_item_view']; //Came from the lp_item_view
|
|
|
$score = $row_max_score['score'];
|
|
|
|
|
|
- if ($debug) var_dump($row_max_score['item_type']);
|
|
|
+ if ($debug) echo '<h3>Item Type: ' .$row_max_score['item_type'].'</h3>';
|
|
|
|
|
|
if ($row_max_score['item_type'] == 'sco') {
|
|
|
//var_dump($row_max_score);
|
|
@@ -687,9 +694,9 @@ class Tracking {
|
|
|
}
|
|
|
//Avoid division by zero errors
|
|
|
if (!empty($max_score)) {
|
|
|
- //$lp_partial_total += $score/$max_score;
|
|
|
- }
|
|
|
- if ($debug) echo '<b>'.$lp_partial_total.' '.$score.' '.$max_score.'</b><br />';
|
|
|
+ $lp_partial_total += $score/$max_score;
|
|
|
+ }
|
|
|
+ if ($debug) echo '<b>$lp_partial_total, $score, $max_score '.$lp_partial_total.' '.$score.' '.$max_score.'</b><br />';
|
|
|
} else {
|
|
|
// Case of a TOOL_QUIZ element
|
|
|
$item_id = $row_max_score['iid'];
|
|
@@ -733,12 +740,11 @@ class Tracking {
|
|
|
if (!empty($max_score)) {
|
|
|
$lp_partial_total += $score/$max_score;
|
|
|
}
|
|
|
- if ($debug) echo '<b>'.$lp_partial_total.' '.$score.' '.$max_score.'</b><br />';
|
|
|
+ if ($debug) echo '$lp_partial_total, $score, $max_score <b>'.$lp_partial_total.' '.$score.' '.$max_score.'</b><br />';
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if ($row_max_score['item_type'] == 'quiz') {
|
|
|
-
|
|
|
+ if (in_array($row_max_score['item_type'], array('quiz','sco'))) {
|
|
|
// Normal way
|
|
|
if ($use_max_score[$lp_id]) {
|
|
|
$count_items++;
|
|
@@ -749,26 +755,24 @@ class Tracking {
|
|
|
}
|
|
|
if ($debug) echo '$count_items: '.$count_items;
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
} //end for
|
|
|
+
|
|
|
$score_of_scorm_calculate += $count_items?(($lp_partial_total/$count_items)*100):0;
|
|
|
-
|
|
|
+
|
|
|
+ if ($debug) echo '<h3>$count_items '.$count_items.'</h3>';
|
|
|
if ($debug) echo '<h3>$score_of_scorm_calculate '.$score_of_scorm_calculate.'</h3>';
|
|
|
|
|
|
// var_dump($score_of_scorm_calculate);
|
|
|
$global_result += $score_of_scorm_calculate;
|
|
|
- if ($debug) echo '<h3>$$global_result '.$global_result.'</h3>';
|
|
|
+ if ($debug) echo '<h3>$global_result '.$global_result.'</h3>';
|
|
|
} // end while
|
|
|
}
|
|
|
|
|
|
$lp_with_quiz = 0;
|
|
|
- $total_lp = 0;
|
|
|
if ($debug) var_dump($lp_list);
|
|
|
foreach($lp_list as $lp_id) {
|
|
|
- //check if LP have a score
|
|
|
- // OR item_type = 'sco'
|
|
|
- $sql = "SELECT count(id) as count FROM $lp_item_table WHERE item_type = 'quiz' AND lp_id = ".$lp_id;
|
|
|
+ //Check if LP have a score we asume that all SCO have an score
|
|
|
+ $sql = "SELECT count(id) as count FROM $lp_item_table WHERE (item_type = 'quiz' OR item_type = 'sco') AND lp_id = ".$lp_id;
|
|
|
if ($debug) echo $sql;
|
|
|
$result_have_quiz = Database::query($sql);
|
|
|
|
|
@@ -777,16 +781,20 @@ class Tracking {
|
|
|
if (is_numeric($row['count']) && $row['count'] != 0) {
|
|
|
$lp_with_quiz ++;
|
|
|
}
|
|
|
- }
|
|
|
- $total_lp ++;
|
|
|
+ }
|
|
|
}
|
|
|
- if ($debug) var_dump($lp_with_quiz);
|
|
|
+
|
|
|
+ if ($debug) echo '<h3>$lp_with_quiz '.$lp_with_quiz.' </h3>';
|
|
|
+ if ($debug) echo '<h3>Final return</h3>';
|
|
|
|
|
|
if ($lp_with_quiz != 0 ) {
|
|
|
if (!$return_array) {
|
|
|
- //var_dump($global_result,$lp_with_quiz );
|
|
|
$score_of_scorm_calculate = round(($global_result/$lp_with_quiz),2);
|
|
|
- //var_dump($global_result, $lp_with_quiz);
|
|
|
+ if ($debug) var_dump($score_of_scorm_calculate);
|
|
|
+ if (empty($lp_ids)) {
|
|
|
+ //$score_of_scorm_calculate = round($score_of_scorm_calculate/count($lp_list),2);
|
|
|
+ if ($debug) echo '<h2>All lps fix: '.$score_of_scorm_calculate.'</h2>';
|
|
|
+ }
|
|
|
return $score_of_scorm_calculate;
|
|
|
} else {
|
|
|
if ($debug) var_dump($global_result, $lp_with_quiz);
|
|
@@ -2234,9 +2242,10 @@ class Tracking {
|
|
|
$session_name = api_get_session_name($session_id);
|
|
|
$html .= Display::tag('h2', $course_info['title']);
|
|
|
$html .='<table class="data_table" width="100%">';
|
|
|
- $html .= Display::tag('th', get_lang('Learnpaths'), array('class'=>'head', 'style'=>'color:#000'));
|
|
|
+ $html .= Display::tag('th', get_lang('Learnpaths'), array('class'=>'head', 'style'=>'color:#000'));
|
|
|
$html .= Display::tag('th', get_lang('Time'), array('class'=>'head', 'style'=>'color:#000'));
|
|
|
$html .= Display::tag('th', get_lang('Progress'), array('class'=>'head', 'style'=>'color:#000'));
|
|
|
+ $html .= Display::tag('th', get_lang('Score'), array('class'=>'head', 'style'=>'color:#000'));
|
|
|
$html .= Display::tag('th', get_lang('LastConnexion'), array('class'=>'head', 'style'=>'color:#000'));
|
|
|
$html .= '</tr>';
|
|
|
|
|
@@ -2252,6 +2261,13 @@ class Tracking {
|
|
|
$progress = Tracking::get_avg_student_progress($user_id, $course, array($learnpath['id']), $session_id);
|
|
|
$last_connection_in_lp = Tracking::get_last_connection_time_in_lp($user_id, $course, $learnpath['id'], $session_id);
|
|
|
$time_spent_in_lp = Tracking::get_time_spent_in_lp($user_id, $course, array($learnpath['id']), $session_id);
|
|
|
+ $percentage_score = Tracking::get_avg_student_score($user_id, $course, array($learnpath['id']), $session_id);
|
|
|
+ if (is_numeric($percentage_score)) {
|
|
|
+ $percentage_score = $percentage_score.'%';
|
|
|
+ } else {
|
|
|
+ $percentage_score = '0%';
|
|
|
+ }
|
|
|
+
|
|
|
$time_spent_in_lp = api_time_to_hms($time_spent_in_lp);
|
|
|
|
|
|
$html .= '<tr class="row_even">';
|
|
@@ -2259,8 +2275,10 @@ class Tracking {
|
|
|
$html .= Display::tag('td', $time_spent_in_lp, array('align'=>'center'));
|
|
|
if (is_numeric($progress)) {
|
|
|
$progress = $progress.'%';
|
|
|
- }
|
|
|
+ }
|
|
|
$html .= Display::tag('td', $progress, array('align'=>'center'));
|
|
|
+ $html .= Display::tag('td', $percentage_score);
|
|
|
+
|
|
|
$last_connection = '-';
|
|
|
if (!empty($last_connection_in_lp)) {
|
|
|
$last_connection = api_convert_and_format_date($last_connection_in_lp, DATE_TIME_FORMAT_LONG);
|
|
@@ -2398,7 +2416,7 @@ class Tracking {
|
|
|
require_once api_get_path(LIBRARY_PATH).'pchart/pData.class.php';
|
|
|
require_once api_get_path(LIBRARY_PATH).'pchart/pChart.class.php';
|
|
|
require_once api_get_path(LIBRARY_PATH).'pchart/pCache.class.php';
|
|
|
- //var_dump($names, $my_results, $average);
|
|
|
+
|
|
|
$cache = new pCache();
|
|
|
|
|
|
// Dataset definition
|
|
@@ -3247,7 +3265,8 @@ class TrackingCourseLog {
|
|
|
}
|
|
|
$user['time'] = api_time_to_hms(Tracking::get_time_spent_on_the_course($user['user_id'], $course_code, $session_id));
|
|
|
|
|
|
- $avg_student_score = Tracking::get_avg_student_score($user['user_id'], $course_code, array(), $session_id);
|
|
|
+ $avg_student_score = Tracking::get_avg_student_score($user['user_id'], $course_code, array(), $session_id);
|
|
|
+
|
|
|
$avg_student_progress = Tracking::get_avg_student_progress($user['user_id'], $course_code, array(), $session_id);
|
|
|
if (empty($avg_student_progress)) { $avg_student_progress=0; }
|
|
|
$user['average_progress'] = $avg_student_progress.'%';
|