diff --git a/main/inc/lib/tracking.lib.php b/main/inc/lib/tracking.lib.php index eebde795e2..f64f4e263a 100644 --- a/main/inc/lib/tracking.lib.php +++ b/main/inc/lib/tracking.lib.php @@ -538,8 +538,8 @@ class Tracking { public static function get_avg_student_progress($student_id, $course_code, $lp_ids = array(), $session_id = null, $return_array = false) { // get the informations of the course - $a_course = CourseManager :: get_course_information($course_code); - if (!empty($a_course)) { + $course_info = api_get_course_info($course_code); + if (!empty($course_info)) { // table definition $tbl_course_lp_view = Database :: get_course_table(TABLE_LP_VIEW); $tbl_course_lp = Database :: get_course_table(TABLE_LP_MAIN); @@ -553,2572 +553,2570 @@ class Tracking { } } $session_id = intval($session_id); - $sql = "SELECT id FROM $tbl_course_lp lp WHERE c_id = {$a_course['real_id']} $condition_lp"; + $sql = "SELECT id FROM $tbl_course_lp lp WHERE c_id = {$course_info['real_id']} $condition_lp"; $res_count_lp = Database::query($sql); + // count the number of learning paths $lp_id = array(); - while ($row_lp = Database::fetch_array($res_count_lp,'ASSOC')) { - //$visibility = api_get_item_visibility($a_course, TOOL_LEARNPATH, $row_lp['id'], $session_id); - // if ($visibility == 1) { - $lp_id[] = $row_lp['id']; - //} - } - $count_lp = count($lp_id); - - $avg_progress = 0; - //if there is at least one learning path and one student - if ($count_lp>0 && !empty($student_id)) { - $condition_user = ""; - if (is_array($student_id)) { - array_walk($student_id,'intval'); - $condition_user = " lp_view.user_id IN (".implode(',',$student_id).") AND "; - } else { - $student_id = intval($student_id); - $condition_user = " lp_view.user_id = '$student_id' AND "; - } - // Get last view for each student (in case of multi-attempt) - // Also filter on LPs of this session - $sql_maxes = "SELECT MAX(view_count), progress FROM $tbl_course_lp_view lp_view ". - "WHERE c_id = {$a_course['real_id']} AND - $condition_user session_id = $session_id AND - lp_view.lp_id IN (".implode(',',$lp_id).") ". - "GROUP BY lp_id, user_id"; - $res_maxes = Database::query($sql_maxes); - $sum = 0; - while ($row_maxes = Database::fetch_array($res_maxes)) { - $sum += $row_maxes[1]; - } - // average progress = total sum divided by the number of views - // summed up. - $number_items = count($lp_id); - if ($number_items == 0) { - return 0; //not necessary to return something else if there is no view - } - if (!$return_array) { - $avg_progress = round($sum / $number_items, 1); - return $avg_progress; - } else { - return array($sum, $number_items); - } - } - } - return null; - } - - - /** - * This function gets: - * 1. The score average from all SCORM Test items in all LP in a course-> All the answers / All the max scores. - * 2. The score average from all Tests (quiz) in all LP in a course-> All the answers / All the max scores. - * 3. And finally it will return the average between 1. and 2. - * @todo improve performance, when loading 1500 users with 20 lps the script dies - * This function does not take the results of a Test out of a LP - * - * @param mixed Array of user ids or an user id - * @param string Course code - * @param array List of LP ids - * @param int Session id (optional), if param $session_id is null(default) it'll return results including sessions, 0 = session is not filtered - * @param bool Returns an array of the type [sum_score, num_score] if set to true - * @param bool get only the latest attempts or ALL attempts - * @return string Value (number %) Which represents a round integer explain in got in 3. - */ - 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 (empty($lp_ids)) { - $debug = false; - } - - if ($debug) echo '

Tracking::get_avg_student_score

'; - // get global tables names - $tbl_stats_exercices = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES); - $tbl_stats_attempts = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT); + while ($row_lp = Database::fetch_array($res_count_lp,'ASSOC')) { + $lp_id[] = $row_lp['id']; + } + $count_lp = count($lp_id); + + $avg_progress = 0; + //if there is at least one learning path and one student + if ($count_lp>0 && !empty($student_id)) { + $condition_user = ""; + if (is_array($student_id)) { + array_walk($student_id,'intval'); + $condition_user = " lp_view.user_id IN (".implode(',',$student_id).") AND "; + } else { + $student_id = intval($student_id); + $condition_user = " lp_view.user_id = '$student_id' AND "; + } + // Get last view for each student (in case of multi-attempt) + // Also filter on LPs of this session + $sql_maxes = "SELECT MAX(view_count), progress FROM $tbl_course_lp_view lp_view + WHERE c_id = {$course_info['real_id']} AND + $condition_user session_id = $session_id AND + lp_view.lp_id IN (".implode(',',$lp_id).") + GROUP BY lp_id, user_id"; + $res_maxes = Database::query($sql_maxes); + $sum = 0; + while ($row_maxes = Database::fetch_array($res_maxes)) { + $sum += $row_maxes[1]; + } + // average progress = total sum divided by the number of views + // summed up. + $number_items = count($lp_id); + if ($number_items == 0) { + return 0; //not necessary to return something else if there is no view + } + if (!$return_array) { + $avg_progress = round($sum / $number_items, 1); + return $avg_progress; + } else { + return array($sum, $number_items); + } + } + } + return null; + } - $course = api_get_course_info($course_code); - if (!empty($course)) { + /** + * This function gets: + * 1. The score average from all SCORM Test items in all LP in a course-> All the answers / All the max scores. + * 2. The score average from all Tests (quiz) in all LP in a course-> All the answers / All the max scores. + * 3. And finally it will return the average between 1. and 2. + * @todo improve performance, when loading 1500 users with 20 lps the script dies + * This function does not take the results of a Test out of a LP + * + * @param mixed Array of user ids or an user id + * @param string Course code + * @param array List of LP ids + * @param int Session id (optional), if param $session_id is null(default) it'll return results including sessions, 0 = session is not filtered + * @param bool Returns an array of the type [sum_score, num_score] if set to true + * @param bool get only the latest attempts or ALL attempts + * @return string Value (number %) Which represents a round integer explain in got in 3. + */ + 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 (empty($lp_ids)) { + $debug = false; + } - // get course tables names - $tbl_quiz_questions = Database :: get_course_table(TABLE_QUIZ_QUESTION); - $lp_table = Database :: get_course_table(TABLE_LP_MAIN); - $lp_item_table = Database :: get_course_table(TABLE_LP_ITEM); - $lp_view_table = Database :: get_course_table(TABLE_LP_VIEW); - $lp_item_view_table = Database :: get_course_table(TABLE_LP_ITEM_VIEW); - - $course_id = $course['real_id']; + if ($debug) echo '

Tracking::get_avg_student_score

'; + // get global tables names + $tbl_stats_exercices = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES); + $tbl_stats_attempts = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT); - // Compose a filter based on optional learning paths list given + $course = api_get_course_info($course_code); - $condition_lp = ""; - if (count($lp_ids) > 0) { - $condition_lp =" AND id IN(".implode(',',$lp_ids).") "; - } + if (!empty($course)) { - // Compose a filter based on optional session id - $condition_session = ""; + // get course tables names + $tbl_quiz_questions = Database :: get_course_table(TABLE_QUIZ_QUESTION); + $lp_table = Database :: get_course_table(TABLE_LP_MAIN); + $lp_item_table = Database :: get_course_table(TABLE_LP_ITEM); + $lp_view_table = Database :: get_course_table(TABLE_LP_VIEW); + $lp_item_view_table = Database :: get_course_table(TABLE_LP_ITEM_VIEW); - $session_id = intval($session_id); - - if (count($lp_ids) > 0) { - $condition_session = " AND session_id = $session_id "; - } else { - $condition_session = " WHERE session_id = $session_id "; - } + $course_id = $course['real_id']; - // Check the real number of LPs corresponding to the filter in the - // database (and if no list was given, get them all) + // Compose a filter based on optional learning paths list given - if (empty($session_id)) { - $sql = "SELECT DISTINCT(id), use_max_score FROM $lp_table WHERE c_id = $course_id AND session_id = 0 $condition_lp "; - } else { - $sql = "SELECT DISTINCT(id), use_max_score FROM $lp_table WHERE c_id = $course_id $condition_lp "; - } + $condition_lp = ""; + if (count($lp_ids) > 0) { + $condition_lp =" AND id IN(".implode(',',$lp_ids).") "; + } - $res_row_lp = Database::query($sql); - $count_row_lp = Database::num_rows($res_row_lp); + // Compose a filter based on optional session id + $condition_session = ""; - $lp_list = $use_max_score = array(); - while ($row_lp = Database::fetch_array($res_row_lp)) { - $lp_list[] = $row_lp['id']; - $use_max_score[$row_lp['id']] = $row_lp['use_max_score']; - } + $session_id = intval($session_id); - if ($debug) { - echo 'Use max score or not list '; var_dump($use_max_score); - } + if (count($lp_ids) > 0) { + $condition_session = " AND session_id = $session_id "; + } else { + $condition_session = " WHERE session_id = $session_id "; + } - // Init local variables that will be used through the calculation - $progress = 0; + // Check the real number of LPs corresponding to the filter in the + // database (and if no list was given, get them all) - // prepare filter on users - $condition_user1 = ""; + if (empty($session_id)) { + $sql = "SELECT DISTINCT(id), use_max_score FROM $lp_table WHERE c_id = $course_id AND session_id = 0 $condition_lp "; + } else { + $sql = "SELECT DISTINCT(id), use_max_score FROM $lp_table WHERE c_id = $course_id $condition_lp "; + } - if (is_array($student_id)) { - array_walk($student_id, 'intval'); - $condition_user1 =" AND user_id IN (".implode(',', $student_id).") "; - } else { - $condition_user1 =" AND user_id = $student_id "; - } + $res_row_lp = Database::query($sql); + $count_row_lp = Database::num_rows($res_row_lp); - if ($count_row_lp > 0 && !empty($student_id)) { - - // Getting latest LP result for a student - //@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 c_id = $course_id AND - lp_id IN (".implode(',',$lp_list).") - $condition_user1 AND - session_id = $session_id - GROUP BY lp_id, user_id"; - if ($debug) echo $sql; - $rs_last_lp_view_id = Database::query($sql); - - $global_result = 0; - - if (Database::num_rows($rs_last_lp_view_id) > 0) { - // Cycle through each line of the results (grouped by lp_id, user_id) - while ($row_lp_view = Database::fetch_array($rs_last_lp_view_id)) { - $count_items = 0; - $lp_partial_total = 0; - - $list = array(); - $lp_view_id = $row_lp_view['id']; - $progress = $row_lp_view['progress']; - $lp_id = $row_lp_view['lp_id']; - $user_id = $row_lp_view['user_id']; - if ($debug) echo '

LP id '.$lp_id.'

'; - - if ($get_only_latest_attempt_results) { - //Getting lp_items done by the user - $sql = "SELECT DISTINCT lp_item_id - FROM $lp_item_view_table - WHERE c_id = $course_id AND - lp_view_id = $lp_view_id - ORDER BY lp_item_id"; - $res_lp_item = Database::query($sql); - - while ($row_lp_item = Database::fetch_array($res_lp_item,'ASSOC')) { - $my_lp_item_id = $row_lp_item['lp_item_id']; - - //Getting the most recent attempt - $sql = "SELECT lp_iv.id as lp_item_view_id, - lp_iv.score as score, - lp_i.max_score, - lp_iv.max_score as max_score_item_view, - lp_i.path, - lp_i.item_type, - lp_i.id as iid - FROM $lp_item_view_table as lp_iv - INNER JOIN $lp_item_table as lp_i - ON lp_i.id = lp_iv.lp_item_id AND - lp_iv.c_id = $course_id AND - lp_i.c_id = $course_id AND - (lp_i.item_type='sco' OR lp_i.item_type='".TOOL_QUIZ."') - WHERE lp_item_id = $my_lp_item_id AND - lp_view_id = $lp_view_id - ORDER BY view_count DESC - LIMIT 1"; - $res_lp_item_result = Database::query($sql); - while ($row_max_score = Database::fetch_array($res_lp_item_result,'ASSOC')) { - $list[]= $row_max_score; - } - } - } else { - // For the currently analysed view, get the score and - // max_score of each item if it is a sco or a TOOL_QUIZ - $sql_max_score = "SELECT lp_iv.id as lp_item_view_id, - lp_iv.score as score, - lp_i.max_score, - lp_iv.max_score as max_score_item_view, - lp_i.path, - lp_i.item_type, - lp_i.id as iid - FROM $lp_item_view_table as lp_iv - INNER JOIN $lp_item_table as lp_i - ON lp_i.id = lp_iv.lp_item_id AND - lp_iv.c_id = $course_id AND - lp_i.c_id = $course_id AND - (lp_i.item_type='sco' OR lp_i.item_type='".TOOL_QUIZ."') - WHERE lp_view_id = $lp_view_id "; - if ($debug) echo $sql_max_score.'
'; - - $res_max_score = Database::query($sql_max_score); - - while ($row_max_score = Database::fetch_array($res_max_score,'ASSOC')) { - $list[]= $row_max_score; - } - } - - // Go through each scorable element of this view - - $score_of_scorm_calculate = 0; - - foreach ($list as $row_max_score) { - $max_score = $row_max_score['max_score']; //Came from the original lp_item - $max_score_item_view = $row_max_score['max_score_item_view']; //Came from the lp_item_view - $score = $row_max_score['score']; - - if ($debug) echo '

Item Type: ' .$row_max_score['item_type'].'

'; - - if ($row_max_score['item_type'] == 'sco') { - //var_dump($row_max_score); - // Check if it is sco (easier to get max_score) - //when there's no max score, we assume 100 as the max score, as the SCORM 1.2 says that the value should always be between 0 and 100. - if ($max_score == 0 || is_null($max_score) || $max_score == '') { - //Chamilo style - if ($use_max_score[$lp_id]) { - $max_score = 100; - } else { - //Overwrites max score = 100 to use the one that came in the lp_item_view see BT#1613 - $max_score = $max_score_item_view; - } - } - //Avoid division by zero errors - if (!empty($max_score)) { - $lp_partial_total += $score/$max_score; - } - if ($debug) echo '$lp_partial_total, $score, $max_score '.$lp_partial_total.' '.$score.' '.$max_score.'
'; - } else { - // Case of a TOOL_QUIZ element - $item_id = $row_max_score['iid']; - $item_path = $row_max_score['path']; - $lp_item_view_id = $row_max_score['lp_item_view_id']; - - // Get last attempt to this exercise through - // the current lp for the current user - $sql_last_attempt = "SELECT exe_id FROM $tbl_stats_exercices WHERE - exe_exo_id = '$item_path' AND - exe_user_id = $user_id AND - orig_lp_item_id = $item_id AND - orig_lp_item_view_id = $lp_item_view_id AND - exe_cours_id = '$course_code' AND - session_id = $session_id - ORDER BY exe_date DESC LIMIT 1"; - if ($debug) echo $sql_last_attempt .'
'; - $result_last_attempt = Database::query($sql_last_attempt); - $num = Database :: num_rows($result_last_attempt); - if ($num > 0 ) { - $id_last_attempt = Database :: result($result_last_attempt, 0, 0); - if ($debug) echo $id_last_attempt.'
'; - /* if (in_array($id_last_attempt, $exe_list)) { - continue; - }*/ - //$exe_list[] = $id_last_attempt; - //echo $id_last_attempt .'
'; - - // Within the last attempt number tracking, get the sum of - // the max_scores of all questions that it was - // made of (we need to make this call dynamic because of random questions selection) - $sql = "SELECT SUM(t.ponderation) as maxscore FROM - ( - SELECT DISTINCT question_id, marks, ponderation - FROM $tbl_stats_attempts AS at INNER JOIN $tbl_quiz_questions AS q ON (q.id = at.question_id) - WHERE exe_id ='$id_last_attempt' AND q.c_id = $course_id - ) - AS t"; - if ($debug) echo '$sql: '.$sql.'
'; - $res_max_score_bis = Database::query($sql); - $row_max_score_bis = Database::fetch_array($res_max_score_bis); - - if (!empty($row_max_score_bis['maxscore'])) { - $max_score = $row_max_score_bis['maxscore']; - } - if (!empty($max_score) && floatval($max_score) > 0) { - $lp_partial_total += $score/$max_score; - } - if ($debug) echo '$lp_partial_total, $score, $max_score '.$lp_partial_total.' '.$score.' '.$max_score.'
'; - } - } - - if (in_array($row_max_score['item_type'], array('quiz','sco'))) { - // Normal way - if ($use_max_score[$lp_id]) { - $count_items++; - } else { - if ($max_score != '') { - $count_items++; - } - } - 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 '

$count_items '.$count_items.'

'; - if ($debug) echo '

$score_of_scorm_calculate '.$score_of_scorm_calculate.'

'; - - // var_dump($score_of_scorm_calculate); - $global_result += $score_of_scorm_calculate; - if ($debug) echo '

$global_result '.$global_result.'

'; - } // end while - } + $lp_list = $use_max_score = array(); + while ($row_lp = Database::fetch_array($res_row_lp)) { + $lp_list[] = $row_lp['id']; + $use_max_score[$row_lp['id']] = $row_lp['use_max_score']; + } - $lp_with_quiz = 0; - if ($debug) var_dump($lp_list); - foreach ($lp_list as $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 c_id = $course_id AND (item_type = 'quiz' OR item_type = 'sco') AND lp_id = ".$lp_id; - if ($debug) echo $sql; - $result_have_quiz = Database::query($sql); - - if (Database::num_rows($result_have_quiz) > 0 ) { - $row = Database::fetch_array($result_have_quiz,'ASSOC'); - if (is_numeric($row['count']) && $row['count'] != 0) { - $lp_with_quiz ++; - } - } - } + if ($debug) { + echo 'Use max score or not list '; var_dump($use_max_score); + } - if ($debug) echo '

$lp_with_quiz '.$lp_with_quiz.'

'; - if ($debug) echo '

Final return

'; + // Init local variables that will be used through the calculation + $progress = 0; - if ($lp_with_quiz != 0 ) { - if (!$return_array) { - $score_of_scorm_calculate = round(($global_result/$lp_with_quiz),2); - 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 '

All lps fix: '.$score_of_scorm_calculate.'

'; - } - return $score_of_scorm_calculate; - } else { - if ($debug) var_dump($global_result, $lp_with_quiz); - return array($global_result, $lp_with_quiz); - } - } else { - return '-'; - } - } - } - return null; - } + // prepare filter on users + $condition_user1 = ""; + if (is_array($student_id)) { + array_walk($student_id, 'intval'); + $condition_user1 =" AND user_id IN (".implode(',', $student_id).") "; + } else { + $condition_user1 =" AND user_id = $student_id "; + } - /** - * This function gets time spent in learning path for a student inside a course - * @param int|array Student id(s) - * @param string Course code - * @param array Limit average to listed lp ids - * @param int Session id (optional), if param $session_id is null(default) it'll return results including sessions, 0 = session is not filtered - * @return int Total time - */ - public static function get_time_spent_in_lp($student_id, $course_code, $lp_ids = array(), $session_id = null) { + if ($count_row_lp > 0 && !empty($student_id)) { + + // Getting latest LP result for a student + //@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 c_id = $course_id AND + lp_id IN (".implode(',',$lp_list).") + $condition_user1 AND + session_id = $session_id + GROUP BY lp_id, user_id"; + if ($debug) echo $sql; + $rs_last_lp_view_id = Database::query($sql); + + $global_result = 0; + + if (Database::num_rows($rs_last_lp_view_id) > 0) { + // Cycle through each line of the results (grouped by lp_id, user_id) + while ($row_lp_view = Database::fetch_array($rs_last_lp_view_id)) { + $count_items = 0; + $lp_partial_total = 0; + + $list = array(); + $lp_view_id = $row_lp_view['id']; + $progress = $row_lp_view['progress']; + $lp_id = $row_lp_view['lp_id']; + $user_id = $row_lp_view['user_id']; + if ($debug) echo '

LP id '.$lp_id.'

'; + + if ($get_only_latest_attempt_results) { + //Getting lp_items done by the user + $sql = "SELECT DISTINCT lp_item_id + FROM $lp_item_view_table + WHERE c_id = $course_id AND + lp_view_id = $lp_view_id + ORDER BY lp_item_id"; + $res_lp_item = Database::query($sql); + + while ($row_lp_item = Database::fetch_array($res_lp_item,'ASSOC')) { + $my_lp_item_id = $row_lp_item['lp_item_id']; + + //Getting the most recent attempt + $sql = "SELECT lp_iv.id as lp_item_view_id, + lp_iv.score as score, + lp_i.max_score, + lp_iv.max_score as max_score_item_view, + lp_i.path, + lp_i.item_type, + lp_i.id as iid + FROM $lp_item_view_table as lp_iv + INNER JOIN $lp_item_table as lp_i + ON lp_i.id = lp_iv.lp_item_id AND + lp_iv.c_id = $course_id AND + lp_i.c_id = $course_id AND + (lp_i.item_type='sco' OR lp_i.item_type='".TOOL_QUIZ."') + WHERE lp_item_id = $my_lp_item_id AND + lp_view_id = $lp_view_id + ORDER BY view_count DESC + LIMIT 1"; + $res_lp_item_result = Database::query($sql); + while ($row_max_score = Database::fetch_array($res_lp_item_result,'ASSOC')) { + $list[]= $row_max_score; + } + } + } else { + // For the currently analysed view, get the score and + // max_score of each item if it is a sco or a TOOL_QUIZ + $sql_max_score = "SELECT lp_iv.id as lp_item_view_id, + lp_iv.score as score, + lp_i.max_score, + lp_iv.max_score as max_score_item_view, + lp_i.path, + lp_i.item_type, + lp_i.id as iid + FROM $lp_item_view_table as lp_iv + INNER JOIN $lp_item_table as lp_i + ON lp_i.id = lp_iv.lp_item_id AND + lp_iv.c_id = $course_id AND + lp_i.c_id = $course_id AND + (lp_i.item_type='sco' OR lp_i.item_type='".TOOL_QUIZ."') + WHERE lp_view_id = $lp_view_id "; + if ($debug) echo $sql_max_score.'
'; + + $res_max_score = Database::query($sql_max_score); + + while ($row_max_score = Database::fetch_array($res_max_score,'ASSOC')) { + $list[]= $row_max_score; + } + } + + // Go through each scorable element of this view + + $score_of_scorm_calculate = 0; + + foreach ($list as $row_max_score) { + $max_score = $row_max_score['max_score']; //Came from the original lp_item + $max_score_item_view = $row_max_score['max_score_item_view']; //Came from the lp_item_view + $score = $row_max_score['score']; + + if ($debug) echo '

Item Type: ' .$row_max_score['item_type'].'

'; + + if ($row_max_score['item_type'] == 'sco') { + //var_dump($row_max_score); + // Check if it is sco (easier to get max_score) + //when there's no max score, we assume 100 as the max score, as the SCORM 1.2 says that the value should always be between 0 and 100. + if ($max_score == 0 || is_null($max_score) || $max_score == '') { + //Chamilo style + if ($use_max_score[$lp_id]) { + $max_score = 100; + } else { + //Overwrites max score = 100 to use the one that came in the lp_item_view see BT#1613 + $max_score = $max_score_item_view; + } + } + //Avoid division by zero errors + if (!empty($max_score)) { + $lp_partial_total += $score/$max_score; + } + if ($debug) echo '$lp_partial_total, $score, $max_score '.$lp_partial_total.' '.$score.' '.$max_score.'
'; + } else { + // Case of a TOOL_QUIZ element + $item_id = $row_max_score['iid']; + $item_path = $row_max_score['path']; + $lp_item_view_id = $row_max_score['lp_item_view_id']; + + // Get last attempt to this exercise through + // the current lp for the current user + $sql_last_attempt = "SELECT exe_id FROM $tbl_stats_exercices WHERE + exe_exo_id = '$item_path' AND + exe_user_id = $user_id AND + orig_lp_item_id = $item_id AND + orig_lp_item_view_id = $lp_item_view_id AND + exe_cours_id = '$course_code' AND + session_id = $session_id + ORDER BY exe_date DESC LIMIT 1"; + if ($debug) echo $sql_last_attempt .'
'; + $result_last_attempt = Database::query($sql_last_attempt); + $num = Database :: num_rows($result_last_attempt); + if ($num > 0 ) { + $id_last_attempt = Database :: result($result_last_attempt, 0, 0); + if ($debug) echo $id_last_attempt.'
'; + /* if (in_array($id_last_attempt, $exe_list)) { + continue; + }*/ + //$exe_list[] = $id_last_attempt; + //echo $id_last_attempt .'
'; + + // Within the last attempt number tracking, get the sum of + // the max_scores of all questions that it was + // made of (we need to make this call dynamic because of random questions selection) + $sql = "SELECT SUM(t.ponderation) as maxscore FROM + ( + SELECT DISTINCT question_id, marks, ponderation + FROM $tbl_stats_attempts AS at INNER JOIN $tbl_quiz_questions AS q ON (q.id = at.question_id) + WHERE exe_id ='$id_last_attempt' AND q.c_id = $course_id + ) + AS t"; + if ($debug) echo '$sql: '.$sql.'
'; + $res_max_score_bis = Database::query($sql); + $row_max_score_bis = Database::fetch_array($res_max_score_bis); + + if (!empty($row_max_score_bis['maxscore'])) { + $max_score = $row_max_score_bis['maxscore']; + } + if (!empty($max_score) && floatval($max_score) > 0) { + $lp_partial_total += $score/$max_score; + } + if ($debug) echo '$lp_partial_total, $score, $max_score '.$lp_partial_total.' '.$score.' '.$max_score.'
'; + } + } + + if (in_array($row_max_score['item_type'], array('quiz','sco'))) { + // Normal way + if ($use_max_score[$lp_id]) { + $count_items++; + } else { + if ($max_score != '') { + $count_items++; + } + } + 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 '

$count_items '.$count_items.'

'; + if ($debug) echo '

$score_of_scorm_calculate '.$score_of_scorm_calculate.'

'; + + // var_dump($score_of_scorm_calculate); + $global_result += $score_of_scorm_calculate; + if ($debug) echo '

$global_result '.$global_result.'

'; + } // end while + } - $course = CourseManager :: get_course_information($course_code); - $student_id = intval($student_id); - $total_time = 0; + $lp_with_quiz = 0; + if ($debug) var_dump($lp_list); + foreach ($lp_list as $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 c_id = $course_id AND (item_type = 'quiz' OR item_type = 'sco') AND lp_id = ".$lp_id; + if ($debug) echo $sql; + $result_have_quiz = Database::query($sql); + + if (Database::num_rows($result_have_quiz) > 0 ) { + $row = Database::fetch_array($result_have_quiz,'ASSOC'); + if (is_numeric($row['count']) && $row['count'] != 0) { + $lp_with_quiz ++; + } + } + } - if (!empty($course)) { + if ($debug) echo '

$lp_with_quiz '.$lp_with_quiz.'

'; + if ($debug) echo '

Final return

'; - $lp_table = Database :: get_course_table(TABLE_LP_MAIN); - $t_lpv = Database :: get_course_table(TABLE_LP_VIEW); - $t_lpiv = Database :: get_course_table(TABLE_LP_ITEM_VIEW); - - $course_id = $course['real_id']; + if ($lp_with_quiz != 0 ) { + if (!$return_array) { + $score_of_scorm_calculate = round(($global_result/$lp_with_quiz),2); + 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 '

All lps fix: '.$score_of_scorm_calculate.'

'; + } + return $score_of_scorm_calculate; + } else { + if ($debug) var_dump($global_result, $lp_with_quiz); + return array($global_result, $lp_with_quiz); + } + } else { + return '-'; + } + } + } + return null; + } - // Compose a filter based on optional learning paths list given - $condition_lp = ""; - if(count($lp_ids) > 0) { - $condition_lp =" AND id IN(".implode(',',$lp_ids).") "; - } - // Compose a filter based on optional session id - $condition_session = ""; - $session_id = intval($session_id); + /** + * This function gets time spent in learning path for a student inside a course + * @param int|array Student id(s) + * @param string Course code + * @param array Limit average to listed lp ids + * @param int Session id (optional), if param $session_id is null(default) it'll return results including sessions, 0 = session is not filtered + * @return int Total time + */ + public static function get_time_spent_in_lp($student_id, $course_code, $lp_ids = array(), $session_id = null) { + + $course = CourseManager :: get_course_information($course_code); + $student_id = intval($student_id); + $total_time = 0; + + if (!empty($course)) { + + $lp_table = Database :: get_course_table(TABLE_LP_MAIN); + $t_lpv = Database :: get_course_table(TABLE_LP_VIEW); + $t_lpiv = Database :: get_course_table(TABLE_LP_ITEM_VIEW); + + $course_id = $course['real_id']; + + // Compose a filter based on optional learning paths list given + $condition_lp = ""; + if(count($lp_ids) > 0) { + $condition_lp =" AND id IN(".implode(',',$lp_ids).") "; + } - - if (isset($session_id)) { - $condition_session = " AND session_id = $session_id "; - } + // Compose a filter based on optional session id + $condition_session = ""; + $session_id = intval($session_id); - // Check the real number of LPs corresponding to the filter in the - // database (and if no list was given, get them all) - //$res_row_lp = Database::query("SELECT DISTINCT(id) FROM $lp_table $condition_lp $condition_session"); - $res_row_lp = Database::query("SELECT DISTINCT(id) FROM $lp_table WHERE c_id = $course_id $condition_lp"); - $count_row_lp = Database::num_rows($res_row_lp); - - // calculates time - if ($count_row_lp > 0) { - while ($row_lp = Database::fetch_array($res_row_lp)) { - $lp_id = intval($row_lp['id']); - $sql = 'SELECT SUM(total_time) - FROM '.$t_lpiv.' AS item_view - INNER JOIN '.$t_lpv.' AS view - ON item_view.lp_view_id = view.id - WHERE - item_view.c_id = '.$course_id.' AND - view.c_id = '.$course_id.' AND - view.lp_id = '.$lp_id.' - AND view.user_id = '.$student_id.' AND - session_id = '.$session_id; - - $rs = Database::query($sql); - if (Database :: num_rows($rs) > 0) { - $total_time += Database :: result($rs, 0, 0); - } - } - } - } - return $total_time; - } - /** - * This function gets last connection time to one learning path - * @param int|array Student id(s) - * @param string Course code - * @param int Learning path id - * @return int Total time - */ - public static function get_last_connection_time_in_lp($student_id, $course_code, $lp_id, $session_id = 0) { - $course = CourseManager :: get_course_information($course_code); - $student_id = intval($student_id); - $lp_id = intval($lp_id); - $last_time = 0; - $session_id = intval($session_id); + if (isset($session_id)) { + $condition_session = " AND session_id = $session_id "; + } - if (!empty($course)) { - - $course_id = $course['real_id']; - - $lp_table = Database :: get_course_table(TABLE_LP_MAIN); - $t_lpv = Database :: get_course_table(TABLE_LP_VIEW); - $t_lpiv = Database :: get_course_table(TABLE_LP_ITEM_VIEW); - - // Check the real number of LPs corresponding to the filter in the - // database (and if no list was given, get them all) - $res_row_lp = Database::query("SELECT id FROM $lp_table WHERE c_id = $course_id AND id = $lp_id "); - $count_row_lp = Database::num_rows($res_row_lp); - - // calculates last connection time - if ($count_row_lp > 0) { - $sql = 'SELECT MAX(start_time) - FROM ' . $t_lpiv . ' AS item_view - INNER JOIN ' . $t_lpv . ' AS view + // Check the real number of LPs corresponding to the filter in the + // database (and if no list was given, get them all) + //$res_row_lp = Database::query("SELECT DISTINCT(id) FROM $lp_table $condition_lp $condition_session"); + $res_row_lp = Database::query("SELECT DISTINCT(id) FROM $lp_table WHERE c_id = $course_id $condition_lp"); + $count_row_lp = Database::num_rows($res_row_lp); + + // calculates time + if ($count_row_lp > 0) { + while ($row_lp = Database::fetch_array($res_row_lp)) { + $lp_id = intval($row_lp['id']); + $sql = 'SELECT SUM(total_time) + FROM '.$t_lpiv.' AS item_view + INNER JOIN '.$t_lpv.' AS view ON item_view.lp_view_id = view.id WHERE item_view.c_id = '.$course_id.' AND - view.c_id = '.$course_id.' AND + view.c_id = '.$course_id.' AND view.lp_id = '.$lp_id.' - AND view.user_id = '.$student_id.' - AND view.session_id = '.$session_id; - $rs = Database::query($sql); - if (Database :: num_rows($rs) > 0) { - $last_time = Database :: result($rs, 0, 0); - } - } - } - return $last_time; - } + AND view.user_id = '.$student_id.' AND + session_id = '.$session_id; - /** - * gets the list of students followed by coach - * @param int Coach id - * @return array List of students - */ - public static function get_student_followed_by_coach($coach_id) { - $coach_id = intval($coach_id); - - $tbl_session_course_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER); - $tbl_session_course = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE); - $tbl_session_user = Database :: get_main_table(TABLE_MAIN_SESSION_USER); - $tbl_session = Database :: get_main_table(TABLE_MAIN_SESSION); - - $a_students = array (); - - // At first, courses where $coach_id is coach of the course // - $sql = 'SELECT id_session, course_code FROM ' . $tbl_session_course_user . ' WHERE id_user=' . $coach_id.' AND status=2'; - - global $_configuration; - if ($_configuration['multiple_access_urls']) { - $tbl_session_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION); - $access_url_id = api_get_current_access_url_id(); - if ($access_url_id != -1) { - $sql = 'SELECT scu.id_session, scu.course_code - FROM ' . $tbl_session_course_user . ' scu INNER JOIN '.$tbl_session_rel_access_url.' sru - ON (scu.id_session=sru.session_id) - WHERE scu.id_user=' . $coach_id.' AND scu.status=2 AND sru.access_url_id = '.$access_url_id; - } - } + $rs = Database::query($sql); + if (Database :: num_rows($rs) > 0) { + $total_time += Database :: result($rs, 0, 0); + } + } + } + } + return $total_time; + } - $result = Database::query($sql); + /** + * This function gets last connection time to one learning path + * @param int|array Student id(s) + * @param string Course code + * @param int Learning path id + * @return int Total time + */ + public static function get_last_connection_time_in_lp($student_id, $course_code, $lp_id, $session_id = 0) { + $course = CourseManager :: get_course_information($course_code); + $student_id = intval($student_id); + $lp_id = intval($lp_id); + $last_time = 0; + $session_id = intval($session_id); + + if (!empty($course)) { + + $course_id = $course['real_id']; + + $lp_table = Database :: get_course_table(TABLE_LP_MAIN); + $t_lpv = Database :: get_course_table(TABLE_LP_VIEW); + $t_lpiv = Database :: get_course_table(TABLE_LP_ITEM_VIEW); + + // Check the real number of LPs corresponding to the filter in the + // database (and if no list was given, get them all) + $res_row_lp = Database::query("SELECT id FROM $lp_table WHERE c_id = $course_id AND id = $lp_id "); + $count_row_lp = Database::num_rows($res_row_lp); + + // calculates last connection time + if ($count_row_lp > 0) { + $sql = 'SELECT MAX(start_time) + FROM ' . $t_lpiv . ' AS item_view + INNER JOIN ' . $t_lpv . ' AS view + ON item_view.lp_view_id = view.id + WHERE + item_view.c_id = '.$course_id.' AND + view.c_id = '.$course_id.' AND + view.lp_id = '.$lp_id.' + AND view.user_id = '.$student_id.' + AND view.session_id = '.$session_id; + $rs = Database::query($sql); + if (Database :: num_rows($rs) > 0) { + $last_time = Database :: result($rs, 0, 0); + } + } + } + return $last_time; + } - while ($a_courses = Database::fetch_array($result)) { + /** + * gets the list of students followed by coach + * @param int Coach id + * @return array List of students + */ + public static function get_student_followed_by_coach($coach_id) { + $coach_id = intval($coach_id); + + $tbl_session_course_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER); + $tbl_session_course = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE); + $tbl_session_user = Database :: get_main_table(TABLE_MAIN_SESSION_USER); + $tbl_session = Database :: get_main_table(TABLE_MAIN_SESSION); + + $a_students = array (); + + // At first, courses where $coach_id is coach of the course // + $sql = 'SELECT id_session, course_code FROM ' . $tbl_session_course_user . ' WHERE id_user=' . $coach_id.' AND status=2'; + + global $_configuration; + if ($_configuration['multiple_access_urls']) { + $tbl_session_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION); + $access_url_id = api_get_current_access_url_id(); + if ($access_url_id != -1) { + $sql = 'SELECT scu.id_session, scu.course_code + FROM ' . $tbl_session_course_user . ' scu INNER JOIN '.$tbl_session_rel_access_url.' sru + ON (scu.id_session=sru.session_id) + WHERE scu.id_user=' . $coach_id.' AND scu.status=2 AND sru.access_url_id = '.$access_url_id; + } + } - $course_code = $a_courses["course_code"]; - $id_session = $a_courses["id_session"]; + $result = Database::query($sql); - $sql = "SELECT distinct srcru.id_user - FROM $tbl_session_course_user AS srcru, $tbl_session_user sru - WHERE srcru.id_user = sru.id_user AND sru.relation_type<>".SESSION_RELATION_TYPE_RRHH." AND srcru.id_session = sru.id_session AND srcru.course_code='$course_code' AND srcru.id_session='$id_session'"; + while ($a_courses = Database::fetch_array($result)) { - $rs = Database::query($sql); + $course_code = $a_courses["course_code"]; + $id_session = $a_courses["id_session"]; - while ($row = Database::fetch_array($rs)) { - $a_students[$row['id_user']] = $row['id_user']; - } - } + $sql = "SELECT distinct srcru.id_user + FROM $tbl_session_course_user AS srcru, $tbl_session_user sru + WHERE srcru.id_user = sru.id_user AND sru.relation_type<>".SESSION_RELATION_TYPE_RRHH." AND srcru.id_session = sru.id_session AND srcru.course_code='$course_code' AND srcru.id_session='$id_session'"; - // Then, courses where $coach_id is coach of the session // - - $sql = 'SELECT session_course_user.id_user - FROM ' . $tbl_session_course_user . ' as session_course_user - INNER JOIN '.$tbl_session_user.' sru ON session_course_user.id_user = sru.id_user AND session_course_user.id_session = sru.id_session - INNER JOIN ' . $tbl_session_course . ' as session_course - ON session_course.course_code = session_course_user.course_code - AND session_course_user.id_session = session_course.id_session - INNER JOIN ' . $tbl_session . ' as session - ON session.id = session_course.id_session - AND session.id_coach = ' . $coach_id; - if ($_configuration['multiple_access_urls']) { - $tbl_session_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION); - $access_url_id = api_get_current_access_url_id(); - if ($access_url_id != -1){ - $sql = 'SELECT session_course_user.id_user - FROM ' . $tbl_session_course_user . ' as session_course_user - INNER JOIN '.$tbl_session_user.' sru ON session_course_user.id_user = sru.id_user AND session_course_user.id_session = sru.id_session - INNER JOIN ' . $tbl_session_course . ' as session_course - ON session_course.course_code = session_course_user.course_code - AND session_course_user.id_session = session_course.id_session - INNER JOIN ' . $tbl_session . ' as session - ON session.id = session_course.id_session - AND session.id_coach = ' . $coach_id.' - INNER JOIN '.$tbl_session_rel_access_url.' session_rel_url - ON session.id = session_rel_url.session_id WHERE access_url_id = '.$access_url_id; - } - } + $rs = Database::query($sql); - $result = Database::query($sql); + while ($row = Database::fetch_array($rs)) { + $a_students[$row['id_user']] = $row['id_user']; + } + } - while ($row = Database::fetch_array($result)) { - $a_students[$row['id_user']] = $row['id_user']; - } - return $a_students; - } + // Then, courses where $coach_id is coach of the session // + + $sql = 'SELECT session_course_user.id_user + FROM ' . $tbl_session_course_user . ' as session_course_user + INNER JOIN '.$tbl_session_user.' sru ON session_course_user.id_user = sru.id_user AND session_course_user.id_session = sru.id_session + INNER JOIN ' . $tbl_session_course . ' as session_course + ON session_course.course_code = session_course_user.course_code + AND session_course_user.id_session = session_course.id_session + INNER JOIN ' . $tbl_session . ' as session + ON session.id = session_course.id_session + AND session.id_coach = ' . $coach_id; + if ($_configuration['multiple_access_urls']) { + $tbl_session_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION); + $access_url_id = api_get_current_access_url_id(); + if ($access_url_id != -1){ + $sql = 'SELECT session_course_user.id_user + FROM ' . $tbl_session_course_user . ' as session_course_user + INNER JOIN '.$tbl_session_user.' sru ON session_course_user.id_user = sru.id_user AND session_course_user.id_session = sru.id_session + INNER JOIN ' . $tbl_session_course . ' as session_course + ON session_course.course_code = session_course_user.course_code + AND session_course_user.id_session = session_course.id_session + INNER JOIN ' . $tbl_session . ' as session + ON session.id = session_course.id_session + AND session.id_coach = ' . $coach_id.' + INNER JOIN '.$tbl_session_rel_access_url.' session_rel_url + ON session.id = session_rel_url.session_id WHERE access_url_id = '.$access_url_id; + } + } - /** - * Get student followed by a coach inside a session - * @param int Session id - * @param int Coach id - * @return array students list - */ - public static function get_student_followed_by_coach_in_a_session($id_session, $coach_id) { + $result = Database::query($sql); - $coach_id = intval($coach_id); + while ($row = Database::fetch_array($result)) { + $a_students[$row['id_user']] = $row['id_user']; + } + return $a_students; + } - $tbl_session_course_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER); - $tbl_session_course = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE); - $tbl_session = Database :: get_main_table(TABLE_MAIN_SESSION); + /** + * Get student followed by a coach inside a session + * @param int Session id + * @param int Coach id + * @return array students list + */ + public static function get_student_followed_by_coach_in_a_session($id_session, $coach_id) { - $a_students = array (); + $coach_id = intval($coach_id); - // At first, courses where $coach_id is coach of the course // + $tbl_session_course_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER); + $tbl_session_course = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE); + $tbl_session = Database :: get_main_table(TABLE_MAIN_SESSION); - $sql = 'SELECT course_code FROM ' . $tbl_session_course_user . ' WHERE id_session="' . $id_session . '" AND id_user=' . $coach_id.' AND status=2'; + $a_students = array (); - $result = Database::query($sql); + // At first, courses where $coach_id is coach of the course // - while ($a_courses = Database::fetch_array($result)) { - $course_code = $a_courses["course_code"]; + $sql = 'SELECT course_code FROM ' . $tbl_session_course_user . ' WHERE id_session="' . $id_session . '" AND id_user=' . $coach_id.' AND status=2'; - $sql = "SELECT distinct srcru.id_user - FROM $tbl_session_course_user AS srcru - WHERE course_code='$course_code' and id_session = '" . $id_session . "'"; + $result = Database::query($sql); - $rs = Database::query($sql); + while ($a_courses = Database::fetch_array($result)) { + $course_code = $a_courses["course_code"]; - while ($row = Database::fetch_array($rs)) { - $a_students[$row['id_user']] = $row['id_user']; - } - } + $sql = "SELECT distinct srcru.id_user + FROM $tbl_session_course_user AS srcru + WHERE course_code='$course_code' and id_session = '" . $id_session . "'"; - // Then, courses where $coach_id is coach of the session // + $rs = Database::query($sql); - $dsl_session_coach = 'SELECT id_coach FROM ' . $tbl_session . ' WHERE id="' . $id_session . '" AND id_coach="' . $coach_id . '"'; - $result = Database::query($dsl_session_coach); - //He is the session_coach so we select all the users in the session - if (Database::num_rows($result) > 0) { - $sql = 'SELECT DISTINCT srcru.id_user FROM ' . $tbl_session_course_user . ' AS srcru WHERE id_session="' . $id_session . '"'; - $result = Database::query($sql); - while ($row = Database::fetch_array($result)) { - $a_students[$row['id_user']] = $row['id_user']; - } - } - return $a_students; - } + while ($row = Database::fetch_array($rs)) { + $a_students[$row['id_user']] = $row['id_user']; + } + } - /** - * Check if a coach is allowed to follow a student - * @param int Coach id - * @param int Student id - * @return bool - */ - public static function is_allowed_to_coach_student($coach_id, $student_id) { - $coach_id = intval($coach_id); - $student_id = intval($student_id); - - $tbl_session_course_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER); - $tbl_session_course = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE); - $tbl_session = Database :: get_main_table(TABLE_MAIN_SESSION); - - // At first, courses where $coach_id is coach of the course // - - $sql = 'SELECT 1 FROM ' . $tbl_session_course_user . ' WHERE id_user=' . $coach_id .' AND status=2'; - $result = Database::query($sql); - if (Database::num_rows($result) > 0) { - return true; - } + // Then, courses where $coach_id is coach of the session // - // Then, courses where $coach_id is coach of the session - - $sql = 'SELECT session_course_user.id_user - FROM ' . $tbl_session_course_user . ' as session_course_user - INNER JOIN ' . $tbl_session_course . ' as session_course - ON session_course.course_code = session_course_user.course_code - INNER JOIN ' . $tbl_session . ' as session - ON session.id = session_course.id_session - AND session.id_coach = ' . $coach_id . ' - WHERE id_user = ' . $student_id; - $result = Database::query($sql); - if (Database::num_rows($result) > 0) { - return true; - } - return false; - } + $dsl_session_coach = 'SELECT id_coach FROM ' . $tbl_session . ' WHERE id="' . $id_session . '" AND id_coach="' . $coach_id . '"'; + $result = Database::query($dsl_session_coach); + //He is the session_coach so we select all the users in the session + if (Database::num_rows($result) > 0) { + $sql = 'SELECT DISTINCT srcru.id_user FROM ' . $tbl_session_course_user . ' AS srcru WHERE id_session="' . $id_session . '"'; + $result = Database::query($sql); + while ($row = Database::fetch_array($result)) { + $a_students[$row['id_user']] = $row['id_user']; + } + } + return $a_students; + } - /** - * Get courses followed by coach - * @param int Coach id - * @param int Session id (optional) - * @return array Courses list - */ - public static function get_courses_followed_by_coach($coach_id, $id_session = '') { + /** + * Check if a coach is allowed to follow a student + * @param int Coach id + * @param int Student id + * @return bool + */ + public static function is_allowed_to_coach_student($coach_id, $student_id) { + $coach_id = intval($coach_id); + $student_id = intval($student_id); + + $tbl_session_course_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER); + $tbl_session_course = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE); + $tbl_session = Database :: get_main_table(TABLE_MAIN_SESSION); + + // At first, courses where $coach_id is coach of the course // + + $sql = 'SELECT 1 FROM ' . $tbl_session_course_user . ' WHERE id_user=' . $coach_id .' AND status=2'; + $result = Database::query($sql); + if (Database::num_rows($result) > 0) { + return true; + } - $coach_id = intval($coach_id); - if (!empty ($id_session)) - $id_session = intval($id_session); + // Then, courses where $coach_id is coach of the session + + $sql = 'SELECT session_course_user.id_user + FROM ' . $tbl_session_course_user . ' as session_course_user + INNER JOIN ' . $tbl_session_course . ' as session_course + ON session_course.course_code = session_course_user.course_code + INNER JOIN ' . $tbl_session . ' as session + ON session.id = session_course.id_session + AND session.id_coach = ' . $coach_id . ' + WHERE id_user = ' . $student_id; + $result = Database::query($sql); + if (Database::num_rows($result) > 0) { + return true; + } + return false; + } - $tbl_session_course_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER); - $tbl_session_course = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE); - $tbl_session = Database :: get_main_table(TABLE_MAIN_SESSION); - $tbl_course = Database :: get_main_table(TABLE_MAIN_COURSE); + /** + * Get courses followed by coach + * @param int Coach id + * @param int Session id (optional) + * @return array Courses list + */ + public static function get_courses_followed_by_coach($coach_id, $id_session = '') { + + $coach_id = intval($coach_id); + if (!empty ($id_session)) + $id_session = intval($id_session); + + $tbl_session_course_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER); + $tbl_session_course = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE); + $tbl_session = Database :: get_main_table(TABLE_MAIN_SESSION); + $tbl_course = Database :: get_main_table(TABLE_MAIN_COURSE); + + // At first, courses where $coach_id is coach of the course + + $sql = 'SELECT DISTINCT course_code FROM ' . $tbl_session_course_user . ' WHERE id_user=' . $coach_id.' AND status=2'; + + global $_configuration; + if ($_configuration['multiple_access_urls']) { + $tbl_course_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE); + $access_url_id = api_get_current_access_url_id(); + if ($access_url_id != -1){ + $sql = 'SELECT DISTINCT scu.course_code FROM ' . $tbl_session_course_user . ' scu INNER JOIN '.$tbl_course_rel_access_url.' cru + ON (scu.course_code = cru.course_code) + WHERE scu.id_user=' . $coach_id.' AND scu.status=2 AND cru.access_url_id = '.$access_url_id; + } + } - // At first, courses where $coach_id is coach of the course - - $sql = 'SELECT DISTINCT course_code FROM ' . $tbl_session_course_user . ' WHERE id_user=' . $coach_id.' AND status=2'; - - global $_configuration; - if ($_configuration['multiple_access_urls']) { - $tbl_course_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE); - $access_url_id = api_get_current_access_url_id(); - if ($access_url_id != -1){ - $sql = 'SELECT DISTINCT scu.course_code FROM ' . $tbl_session_course_user . ' scu INNER JOIN '.$tbl_course_rel_access_url.' cru - ON (scu.course_code = cru.course_code) - WHERE scu.id_user=' . $coach_id.' AND scu.status=2 AND cru.access_url_id = '.$access_url_id; - } - } + if (!empty ($id_session)) + $sql .= ' AND id_session=' . $id_session; + $result = Database::query($sql); + while ($row = Database::fetch_array($result)) { + $a_courses[$row['course_code']] = $row['course_code']; + } - if (!empty ($id_session)) - $sql .= ' AND id_session=' . $id_session; - $result = Database::query($sql); - while ($row = Database::fetch_array($result)) { - $a_courses[$row['course_code']] = $row['course_code']; - } - - // Then, courses where $coach_id is coach of the session - - $sql = 'SELECT DISTINCT session_course.course_code - FROM ' . $tbl_session_course . ' as session_course - INNER JOIN ' . $tbl_session . ' as session - ON session.id = session_course.id_session - AND session.id_coach = ' . $coach_id . ' - INNER JOIN ' . $tbl_course . ' as course - ON course.code = session_course.course_code'; - - if ($_configuration['multiple_access_urls']) { - $tbl_course_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE); - $access_url_id = api_get_current_access_url_id(); - if ($access_url_id != -1){ - $sql = 'SELECT DISTINCT session_course.course_code - FROM ' . $tbl_session_course . ' as session_course - INNER JOIN ' . $tbl_session . ' as session - ON session.id = session_course.id_session - AND session.id_coach = ' . $coach_id . ' - INNER JOIN ' . $tbl_course . ' as course - ON course.code = session_course.course_code - INNER JOIN '.$tbl_course_rel_access_url.' course_rel_url - ON (session_course.course_code = course_rel_url.course_code)'; - } - } + // Then, courses where $coach_id is coach of the session + + $sql = 'SELECT DISTINCT session_course.course_code + FROM ' . $tbl_session_course . ' as session_course + INNER JOIN ' . $tbl_session . ' as session + ON session.id = session_course.id_session + AND session.id_coach = ' . $coach_id . ' + INNER JOIN ' . $tbl_course . ' as course + ON course.code = session_course.course_code'; + + if ($_configuration['multiple_access_urls']) { + $tbl_course_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE); + $access_url_id = api_get_current_access_url_id(); + if ($access_url_id != -1){ + $sql = 'SELECT DISTINCT session_course.course_code + FROM ' . $tbl_session_course . ' as session_course + INNER JOIN ' . $tbl_session . ' as session + ON session.id = session_course.id_session + AND session.id_coach = ' . $coach_id . ' + INNER JOIN ' . $tbl_course . ' as course + ON course.code = session_course.course_code + INNER JOIN '.$tbl_course_rel_access_url.' course_rel_url + ON (session_course.course_code = course_rel_url.course_code)'; + } + } - if (!empty ($id_session)) { - $sql .= ' WHERE session_course.id_session=' . $id_session; - if ($_configuration['multiple_access_urls']) - $sql .= ' AND access_url_id = '.$access_url_id; - } else { - if ($_configuration['multiple_access_urls']) - $sql .= ' WHERE access_url_id = '.$access_url_id; - } + if (!empty ($id_session)) { + $sql .= ' WHERE session_course.id_session=' . $id_session; + if ($_configuration['multiple_access_urls']) + $sql .= ' AND access_url_id = '.$access_url_id; + } else { + if ($_configuration['multiple_access_urls']) + $sql .= ' WHERE access_url_id = '.$access_url_id; + } - $result = Database::query($sql); - while ($row = Database::fetch_array($result)) { - $a_courses[$row['course_code']] = $row['course_code']; - } + $result = Database::query($sql); + while ($row = Database::fetch_array($result)) { + $a_courses[$row['course_code']] = $row['course_code']; + } - return $a_courses; - } + return $a_courses; + } - /** - * Get sessions coached by user - * @param int Coach id - * @return array Sessions list - */ - public static function get_sessions_coached_by_user($coach_id) { - // table definition - $tbl_session = Database :: get_main_table(TABLE_MAIN_SESSION); - $tbl_session_course = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE); - $tbl_session_course_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER); - - // protect datas - $coach_id = intval($coach_id); - - // session where we are general coach - $sql = 'SELECT DISTINCT id, name, date_start, date_end - FROM ' . $tbl_session . ' - WHERE id_coach=' . $coach_id; - - global $_configuration; - if ($_configuration['multiple_access_urls']) { - $tbl_session_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION); - $access_url_id = api_get_current_access_url_id(); - if ($access_url_id != -1){ - $sql = 'SELECT DISTINCT id, name, date_start, date_end - FROM ' . $tbl_session . ' session INNER JOIN '.$tbl_session_rel_access_url.' session_rel_url - ON (session.id = session_rel_url.session_id) - WHERE id_coach=' . $coach_id.' AND access_url_id = '.$access_url_id; - } - } + /** + * Get sessions coached by user + * @param int Coach id + * @return array Sessions list + */ + public static function get_sessions_coached_by_user($coach_id) { + // table definition + $tbl_session = Database :: get_main_table(TABLE_MAIN_SESSION); + $tbl_session_course = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE); + $tbl_session_course_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER); + + // protect datas + $coach_id = intval($coach_id); + + // session where we are general coach + $sql = 'SELECT DISTINCT id, name, date_start, date_end + FROM ' . $tbl_session . ' + WHERE id_coach=' . $coach_id; + + global $_configuration; + if ($_configuration['multiple_access_urls']) { + $tbl_session_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION); + $access_url_id = api_get_current_access_url_id(); + if ($access_url_id != -1){ + $sql = 'SELECT DISTINCT id, name, date_start, date_end + FROM ' . $tbl_session . ' session INNER JOIN '.$tbl_session_rel_access_url.' session_rel_url + ON (session.id = session_rel_url.session_id) + WHERE id_coach=' . $coach_id.' AND access_url_id = '.$access_url_id; + } + } - $rs = Database::query($sql); - while ($row = Database::fetch_array($rs)) { - $a_sessions[$row["id"]] = $row; - } + $rs = Database::query($sql); + while ($row = Database::fetch_array($rs)) { + $a_sessions[$row["id"]] = $row; + } - // session where we are coach of a course - $sql = 'SELECT DISTINCT session.id, session.name, session.date_start, session.date_end - FROM ' . $tbl_session . ' as session - INNER JOIN ' . $tbl_session_course_user . ' as session_course_user - ON session.id = session_course_user.id_session - AND session_course_user.id_user=' . $coach_id.' AND session_course_user.status=2'; - - global $_configuration; - if ($_configuration['multiple_access_urls']) { - $tbl_session_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION); - $access_url_id = api_get_current_access_url_id(); - if ($access_url_id != -1){ - $sql = 'SELECT DISTINCT session.id, session.name, session.date_start, session.date_end - FROM ' . $tbl_session . ' as session - INNER JOIN ' . $tbl_session_course_user . ' as session_course_user - ON session.id = session_course_user.id_session AND session_course_user.id_user=' . $coach_id.' AND session_course_user.status=2 - INNER JOIN '.$tbl_session_rel_access_url.' session_rel_url - ON (session.id = session_rel_url.session_id) - WHERE access_url_id = '.$access_url_id; - } - } + // session where we are coach of a course + $sql = 'SELECT DISTINCT session.id, session.name, session.date_start, session.date_end + FROM ' . $tbl_session . ' as session + INNER JOIN ' . $tbl_session_course_user . ' as session_course_user + ON session.id = session_course_user.id_session + AND session_course_user.id_user=' . $coach_id.' AND session_course_user.status=2'; + + global $_configuration; + if ($_configuration['multiple_access_urls']) { + $tbl_session_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION); + $access_url_id = api_get_current_access_url_id(); + if ($access_url_id != -1){ + $sql = 'SELECT DISTINCT session.id, session.name, session.date_start, session.date_end + FROM ' . $tbl_session . ' as session + INNER JOIN ' . $tbl_session_course_user . ' as session_course_user + ON session.id = session_course_user.id_session AND session_course_user.id_user=' . $coach_id.' AND session_course_user.status=2 + INNER JOIN '.$tbl_session_rel_access_url.' session_rel_url + ON (session.id = session_rel_url.session_id) + WHERE access_url_id = '.$access_url_id; + } + } - $rs = Database::query($sql); - while ($row = Database::fetch_array($rs)) { - $a_sessions[$row["id"]] = $row; - } - if (is_array($a_sessions)) { - foreach ($a_sessions as & $session) { - if ($session['date_start'] == '0000-00-00') { - $session['status'] = get_lang('SessionActive'); - } - else { - $date_start = explode('-', $session['date_start']); - $time_start = mktime(0, 0, 0, $date_start[1], $date_start[2], $date_start[0]); - $date_end = explode('-', $session['date_end']); - $time_end = mktime(0, 0, 0, $date_end[1], $date_end[2], $date_end[0]); - if ($time_start < time() && time() < $time_end) { - $session['status'] = get_lang('SessionActive'); - } - else{ - if (time() < $time_start) { - $session['status'] = get_lang('SessionFuture'); - } - else{ - if (time() > $time_end) { - $session['status'] = get_lang('SessionPast'); - } - } - } - } - } - } - return $a_sessions; + $rs = Database::query($sql); + while ($row = Database::fetch_array($rs)) { + $a_sessions[$row["id"]] = $row; + } + if (is_array($a_sessions)) { + foreach ($a_sessions as & $session) { + if ($session['date_start'] == '0000-00-00') { + $session['status'] = get_lang('SessionActive'); + } + else { + $date_start = explode('-', $session['date_start']); + $time_start = mktime(0, 0, 0, $date_start[1], $date_start[2], $date_start[0]); + $date_end = explode('-', $session['date_end']); + $time_end = mktime(0, 0, 0, $date_end[1], $date_end[2], $date_end[0]); + if ($time_start < time() && time() < $time_end) { + $session['status'] = get_lang('SessionActive'); + } + else{ + if (time() < $time_start) { + $session['status'] = get_lang('SessionFuture'); + } + else{ + if (time() > $time_end) { + $session['status'] = get_lang('SessionPast'); + } + } + } + } + } + } + return $a_sessions; - } + } - /** - * Get courses list from a session - * @param int Session id - * @return array Courses list - */ - public static function get_courses_list_from_session($session_id) { - //protect datas - $session_id = intval($session_id); + /** + * Get courses list from a session + * @param int Session id + * @return array Courses list + */ + public static function get_courses_list_from_session($session_id) { + //protect datas + $session_id = intval($session_id); + + // table definition + $tbl_session = Database :: get_main_table(TABLE_MAIN_SESSION); + $tbl_session_course = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE); + + $sql = 'SELECT DISTINCT course_code + FROM ' . $tbl_session_course . ' + WHERE id_session=' . $session_id; - // table definition - $tbl_session = Database :: get_main_table(TABLE_MAIN_SESSION); - $tbl_session_course = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE); + $rs = Database::query($sql); + $a_courses = array (); + while ($row = Database::fetch_array($rs)) { + $a_courses[$row['course_code']] = $row; + } + return $a_courses; + } - $sql = 'SELECT DISTINCT course_code - FROM ' . $tbl_session_course . ' - WHERE id_session=' . $session_id; + /** + * Count the number of documents that an user has uploaded to a course + * @param int|array Student id(s) + * @param string Course code + * @param int Session id (optional), if param $session_id is null(default) return count of assignments including sessions, 0 = session is not filtered + * @return int Number of documents + */ + + public static function count_student_uploaded_documents($student_id, $course_code, $session_id = null){ + // protect datas + $course_code = Database::escape_string($course_code); + // get the informations of the course + $a_course = CourseManager :: get_course_information($course_code); + if (!empty($a_course)) { + // table definition + $tbl_item_property = Database :: get_course_table(TABLE_ITEM_PROPERTY); + $tbl_document = Database :: get_course_table(TABLE_DOCUMENT); + + $course_id = $a_course['real_id']; + + $condition_user = ""; + if (is_array($student_id)) { + $condition_user = " AND ip.insert_user_id IN (".implode(',',$student_id).") "; + } else { + $condition_user = " AND ip.insert_user_id = '$student_id' "; + } - $rs = Database::query($sql); - $a_courses = array (); - while ($row = Database::fetch_array($rs)) { - $a_courses[$row['course_code']] = $row; - } - return $a_courses; - } + $condition_session = ""; + if (isset($session_id)) { + $session_id = intval($session_id); + $condition_session = " AND pub.session_id = $session_id "; + } - /** - * Count the number of documents that an user has uploaded to a course - * @param int|array Student id(s) - * @param string Course code - * @param int Session id (optional), if param $session_id is null(default) return count of assignments including sessions, 0 = session is not filtered - * @return int Number of documents - */ - - public static function count_student_uploaded_documents($student_id, $course_code, $session_id = null){ - // protect datas - $course_code = Database::escape_string($course_code); - // get the informations of the course - $a_course = CourseManager :: get_course_information($course_code); - if (!empty($a_course)) { - // table definition - $tbl_item_property = Database :: get_course_table(TABLE_ITEM_PROPERTY); - $tbl_document = Database :: get_course_table(TABLE_DOCUMENT); - - $course_id = $a_course['real_id']; + $sql = "SELECT count(ip.tool) + FROM $tbl_item_property ip INNER JOIN $tbl_document pub + ON ip.ref = pub.id + WHERE ip.c_id = $course_id AND + pub.c_id = $course_id AND + pub.filetype ='file' AND + ip.tool = 'document' + $condition_user $condition_session "; + $rs = Database::query($sql); + $row = Database::fetch_row($rs); + return $row[0]; + } + return null; + } - $condition_user = ""; - if (is_array($student_id)) { - $condition_user = " AND ip.insert_user_id IN (".implode(',',$student_id).") "; - } else { - $condition_user = " AND ip.insert_user_id = '$student_id' "; - } - $condition_session = ""; - if (isset($session_id)) { - $session_id = intval($session_id); - $condition_session = " AND pub.session_id = $session_id "; - } + /** + * Count assignments per student + * @param int|array Student id(s) + * @param string Course code + * @param int Session id (optional), if param $session_id is null(default) return count of assignments including sessions, 0 = session is not filtered + * @return int Count of assignments + */ + public static function count_student_assignments($student_id, $course_code, $session_id = null) { + // protect datas + $course_code = Database::escape_string($course_code); + // get the informations of the course + $a_course = CourseManager :: get_course_information($course_code); + if (!empty($a_course)) { + // table definition + $tbl_item_property = Database :: get_course_table(TABLE_ITEM_PROPERTY); + $tbl_student_publication = Database :: get_course_table(TABLE_STUDENT_PUBLICATION); + + $course_id = $a_course['real_id']; + + $condition_user = ""; + if (is_array($student_id)) { + $condition_user = " AND ip.insert_user_id IN (".implode(',',$student_id).") "; + } else { + $condition_user = " AND ip.insert_user_id = '$student_id' "; + } - $sql = "SELECT count(ip.tool) - FROM $tbl_item_property ip INNER JOIN $tbl_document pub - ON ip.ref = pub.id - WHERE ip.c_id = $course_id AND - pub.c_id = $course_id AND - pub.filetype ='file' AND - ip.tool = 'document' - $condition_user $condition_session "; - $rs = Database::query($sql); - $row = Database::fetch_row($rs); - return $row[0]; - } - return null; - } + $condition_session = ""; + if (isset($session_id)) { + $session_id = intval($session_id); + $condition_session = " AND pub.session_id = $session_id "; + } + $sql = "SELECT count(ip.tool) + FROM $tbl_item_property ip INNER JOIN $tbl_student_publication pub + ON ip.ref = pub.id + WHERE ip.c_id = $course_id AND + pub.c_id = $course_id AND + ip.tool='work' + $condition_user $condition_session "; + $rs = Database::query($sql); + $row = Database::fetch_row($rs); + return $row[0]; + } + return null; + } - /** - * Count assignments per student - * @param int|array Student id(s) - * @param string Course code - * @param int Session id (optional), if param $session_id is null(default) return count of assignments including sessions, 0 = session is not filtered - * @return int Count of assignments - */ - public static function count_student_assignments($student_id, $course_code, $session_id = null) { - // protect datas - $course_code = Database::escape_string($course_code); - // get the informations of the course - $a_course = CourseManager :: get_course_information($course_code); - if (!empty($a_course)) { - // table definition - $tbl_item_property = Database :: get_course_table(TABLE_ITEM_PROPERTY); - $tbl_student_publication = Database :: get_course_table(TABLE_STUDENT_PUBLICATION); - - $course_id = $a_course['real_id']; - $condition_user = ""; - if (is_array($student_id)) { - $condition_user = " AND ip.insert_user_id IN (".implode(',',$student_id).") "; - } else { - $condition_user = " AND ip.insert_user_id = '$student_id' "; - } + /** + * Count messages per student inside forum tool + * @param int Student id + * @param string Course code + * @param int Session id (optional), if param $session_id is null(default) return count of messages including sessions, 0 = session is not filtered + * @return int Count of messages + */ + public static function count_student_messages($student_id, $course_code, $session_id = null) { - $condition_session = ""; - if (isset($session_id)) { - $session_id = intval($session_id); - $condition_session = " AND pub.session_id = $session_id "; - } + // protect datas + $student_id = intval($student_id); + $course_code = addslashes($course_code); - $sql = "SELECT count(ip.tool) - FROM $tbl_item_property ip INNER JOIN $tbl_student_publication pub - ON ip.ref = pub.id - WHERE ip.c_id = $course_id AND - pub.c_id = $course_id AND - ip.tool='work' - $condition_user $condition_session "; - $rs = Database::query($sql); - $row = Database::fetch_row($rs); - return $row[0]; - } - return null; - } + // get the informations of the course + $a_course = CourseManager :: get_course_information($course_code); + if (!empty($a_course)) { - /** - * Count messages per student inside forum tool - * @param int Student id - * @param string Course code - * @param int Session id (optional), if param $session_id is null(default) return count of messages including sessions, 0 = session is not filtered - * @return int Count of messages - */ - public static function count_student_messages($student_id, $course_code, $session_id = null) { - - // protect datas - $student_id = intval($student_id); - $course_code = addslashes($course_code); + // table definition + $tbl_forum_post = Database :: get_course_table(TABLE_FORUM_POST); + $tbl_forum = Database :: get_course_table(TABLE_FORUM); - // get the informations of the course - $a_course = CourseManager :: get_course_information($course_code); + $course_id = $a_course['real_id']; - if (!empty($a_course)) { - - // table definition - $tbl_forum_post = Database :: get_course_table(TABLE_FORUM_POST); - $tbl_forum = Database :: get_course_table(TABLE_FORUM); - - $course_id = $a_course['real_id']; + $condition_user = ""; + if (is_array($student_id)) { + $condition_user = " AND post.poster_id IN (".implode(',',$student_id).") "; + } else { + $condition_user = " AND post.poster_id = '$student_id' "; + } - $condition_user = ""; - if (is_array($student_id)) { - $condition_user = " AND post.poster_id IN (".implode(',',$student_id).") "; - } else { - $condition_user = " AND post.poster_id = '$student_id' "; - } + $condition_session = ""; + if (isset($session_id)) { + $session_id = intval($session_id); + $condition_session = " AND forum.session_id = $session_id"; + } - $condition_session = ""; - if (isset($session_id)) { - $session_id = intval($session_id); - $condition_session = " AND forum.session_id = $session_id"; - } + $sql = "SELECT 1 FROM $tbl_forum_post post INNER JOIN $tbl_forum forum + ON forum.forum_id = post.forum_id + WHERE post.c_id = $course_id AND + forum.c_id = $course_id + $condition_user $condition_session "; + $rs = Database::query($sql); + return Database::num_rows($rs); + } else { + return null; + } + } - $sql = "SELECT 1 FROM $tbl_forum_post post INNER JOIN $tbl_forum forum - ON forum.forum_id = post.forum_id - WHERE post.c_id = $course_id AND - forum.c_id = $course_id - $condition_user $condition_session "; - $rs = Database::query($sql); - return Database::num_rows($rs); - } else { - return null; - } - } - - /** - * This function counts the number of post by course - * @param string Course code - * @param int Session id (optional), if param $session_id is null(default) it'll return results including sessions, 0 = session is not filtered - * @return int The number of post by course - */ - public static function count_number_of_posts_by_course($course_code, $session_id = null) { - //protect data - $course_code = Database::escape_string($course_code); - // get the informations of the course - $a_course = CourseManager :: get_course_information($course_code); - $count = 0; - if (!empty($a_course)) { - $tbl_posts = Database :: get_course_table(TABLE_FORUM_POST); - $tbl_forums = Database :: get_course_table(TABLE_FORUM); - - $condition_session = ''; - if (isset($session_id)) { - $session_id = intval($session_id); - $condition_session = ' AND f.session_id = '. $session_id; - } - - $course_id = $a_course['real_id']; - - $sql = "SELECT count(*) FROM $tbl_posts p INNER JOIN $tbl_forums f - ON f.forum_id = p.forum_id - WHERE p.c_id = $course_id AND - f.c_id = $course_id - $condition_session - "; - $result = Database::query($sql); - $row = Database::fetch_row($result); - $count = $row[0]; - return $count; - } else { - return null; - } - } + /** + * This function counts the number of post by course + * @param string Course code + * @param int Session id (optional), if param $session_id is null(default) it'll return results including sessions, 0 = session is not filtered + * @return int The number of post by course + */ + public static function count_number_of_posts_by_course($course_code, $session_id = null) { + //protect data + $course_code = Database::escape_string($course_code); + // get the informations of the course + $a_course = CourseManager :: get_course_information($course_code); + $count = 0; + if (!empty($a_course)) { + $tbl_posts = Database :: get_course_table(TABLE_FORUM_POST); + $tbl_forums = Database :: get_course_table(TABLE_FORUM); - /** - * This function counts the number of threads by course - * @param string Course code - * @param int Session id (optional), if param $session_id is null(default) it'll return results including sessions, 0 = session is not filtered - * @return int The number of threads by course - */ - public static function count_number_of_threads_by_course($course_code, $session_id = null) { - $course_info = api_get_course_info($course_code); - if (empty($course_info)) { - return null; - } - $course_id = $course_info['real_id']; - - $count = 0; - - $tbl_threads = Database :: get_course_table(TABLE_FORUM_THREAD); - $tbl_forums = Database :: get_course_table(TABLE_FORUM); - $condition_session = ''; - if (isset($session_id)) { + $condition_session = ''; + if (isset($session_id)) { $session_id = intval($session_id); - $condition_session = ' AND f.session_id = '. $session_id; + $condition_session = ' AND f.session_id = '. $session_id; } - - $sql = "SELECT count(*) FROM $tbl_threads t INNER JOIN $tbl_forums f ON f.forum_id = t.forum_id - WHERE t.c_id = $course_id AND f.c_id = $course_id $condition_session "; - $result = Database::query($sql); - if (Database::num_rows($result)) { - $row = Database::fetch_row($result); - $count = $row[0]; - return $count; - } else { - return null; - } - } - /** - * This function counts the number of forums by course - * @param string Course code - * @param int Session id (optional), if param $session_id is null(default) it'll return results including sessions, 0 = session is not filtered - * @return int The number of forums by course - */ - public static function count_number_of_forums_by_course($course_code, $session_id = null) { - $course_info = api_get_course_info($course_code); - if (empty($course_info)) { - return null; - } - $course_id = $course_info['real_id']; - - $condition_session = ''; - if (isset($session_id)) { - $session_id = intval($session_id); - $condition_session = ' session_id = '. $session_id; - } - - $tbl_forums = Database :: get_course_table(TABLE_FORUM); - $sql = "SELECT count(*) FROM $tbl_forums WHERE c_id = $course_id AND $condition_session"; - $result = Database::query($sql); - if (Database::num_rows($result)) { - $row = Database::fetch_row($result); - $count = $row[0]; - return $count; - } else { - return null; - } - } + $course_id = $a_course['real_id']; - /** - * This function counts the chat last connections by course in x days - * @param string Course code - * @param int Last x days - * @param int Session id (optional) - * @return int Chat last connections by course in x days - */ - public static function chat_connections_during_last_x_days_by_course($course_code,$last_days, $session_id = 0) { - $course_info = api_get_course_info($course_code); - if (empty($course_info)) { - return null; - } - $course_id = $course_info['real_id']; - - //protect data - $last_days = intval($last_days); - $course_code = Database::escape_string($course_code); - $session_id = intval($session_id); - - $count = 0; - - $tbl_stats_access = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_ACCESS); - - $sql = "SELECT count(*) FROM $tbl_stats_access WHERE DATE_SUB(NOW(),INTERVAL $last_days DAY) <= access_date - AND access_cours_code = '$course_code' AND access_tool='".TOOL_CHAT."' AND access_session_id='$session_id' "; - $result = Database::query($sql); - if (Database::num_rows($result)) { - $row = Database::fetch_row($result); - $count = $row[0]; - return $count; - } else { - return null; - } - } + $sql = "SELECT count(*) FROM $tbl_posts p INNER JOIN $tbl_forums f + ON f.forum_id = p.forum_id + WHERE p.c_id = $course_id AND + f.c_id = $course_id + $condition_session + "; + $result = Database::query($sql); + $row = Database::fetch_row($result); + $count = $row[0]; + return $count; + } else { + return null; + } + } - /** - * This function gets the last student's connection in chat - * @param int Student id - * @param string Course code - * @param int Session id (optional) - * @return string datetime formatted without day (e.g: February 23, 2010 10:20:50 ) - */ - public static function chat_last_connection($student_id, $course_code, $session_id = 0) { - - //protect datas - $student_id = intval($student_id); - $course_code= Database::escape_string($course_code); - $session_id = intval($session_id); - $date_time = ''; + /** + * This function counts the number of threads by course + * @param string Course code + * @param int Session id (optional), if param $session_id is null(default) it'll return results including sessions, 0 = session is not filtered + * @return int The number of threads by course + */ + public static function count_number_of_threads_by_course($course_code, $session_id = null) { + $course_info = api_get_course_info($course_code); + if (empty($course_info)) { + return null; + } + $course_id = $course_info['real_id']; - // table definition - $tbl_stats_access = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_LASTACCESS); - $sql = "SELECT access_date FROM $tbl_stats_access - WHERE access_tool='".TOOL_CHAT."' AND access_user_id='$student_id' AND access_cours_code = '$course_code' AND access_session_id = '$session_id' ORDER BY access_date DESC limit 1"; - $rs = Database::query($sql); - if (Database::num_rows($rs) > 0) { - $row = Database::fetch_array($rs); - $date_time = api_convert_and_format_date($row['access_date'], null, date_default_timezone_get()); - } - return $date_time; - } + $count = 0; - /** - * Get count student's visited links - * @param int Student id - * @param string Course code - * @param int Session id (optional) - * @return int count of visited links - */ - public static function count_student_visited_links($student_id, $course_code, $session_id = 0) { + $tbl_threads = Database :: get_course_table(TABLE_FORUM_THREAD); + $tbl_forums = Database :: get_course_table(TABLE_FORUM); + $condition_session = ''; + if (isset($session_id)) { + $session_id = intval($session_id); + $condition_session = ' AND f.session_id = '. $session_id; + } - // protect datas - $student_id = intval($student_id); - $course_code = Database::escape_string($course_code); - $session_id = intval($session_id); + $sql = "SELECT count(*) FROM $tbl_threads t INNER JOIN $tbl_forums f ON f.forum_id = t.forum_id + WHERE t.c_id = $course_id AND f.c_id = $course_id $condition_session "; + $result = Database::query($sql); + if (Database::num_rows($result)) { + $row = Database::fetch_row($result); + $count = $row[0]; + return $count; + } else { + return null; + } + } - // table definition - $tbl_stats_links = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_LINKS); + /** + * This function counts the number of forums by course + * @param string Course code + * @param int Session id (optional), if param $session_id is null(default) it'll return results including sessions, 0 = session is not filtered + * @return int The number of forums by course + */ + public static function count_number_of_forums_by_course($course_code, $session_id = null) { + $course_info = api_get_course_info($course_code); + if (empty($course_info)) { + return null; + } + $course_id = $course_info['real_id']; + + $condition_session = ''; + if (isset($session_id)) { + $session_id = intval($session_id); + $condition_session = ' session_id = '. $session_id; + } + + $tbl_forums = Database :: get_course_table(TABLE_FORUM); + $sql = "SELECT count(*) FROM $tbl_forums WHERE c_id = $course_id AND $condition_session"; + $result = Database::query($sql); + if (Database::num_rows($result)) { + $row = Database::fetch_row($result); + $count = $row[0]; + return $count; + } else { + return null; + } + } - $sql = 'SELECT 1 - FROM '.$tbl_stats_links.' - WHERE links_user_id= '.$student_id.' - AND links_cours_id = "'.$course_code.'" - AND links_session_id = '.$session_id.' '; + /** + * This function counts the chat last connections by course in x days + * @param string Course code + * @param int Last x days + * @param int Session id (optional) + * @return int Chat last connections by course in x days + */ + public static function chat_connections_during_last_x_days_by_course($course_code,$last_days, $session_id = 0) { + $course_info = api_get_course_info($course_code); + if (empty($course_info)) { + return null; + } + $course_id = $course_info['real_id']; - $rs = Database::query($sql); - return Database::num_rows($rs); - } + //protect data + $last_days = intval($last_days); + $course_code = Database::escape_string($course_code); + $session_id = intval($session_id); - /** - * Get count student downloaded documents - * @param int Student id - * @param string Course code - * @param int Session id (optional) - * @return int Count downloaded documents - */ - public static function count_student_downloaded_documents($student_id, $course_code, $session_id = 0) { - // protect datas - $student_id = intval($student_id); - $course_code = Database::escape_string($course_code); - $session_id = intval($session_id); + $count = 0; - // table definition - $tbl_stats_documents = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_DOWNLOADS); + $tbl_stats_access = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_ACCESS); - $sql = 'SELECT 1 - FROM ' . $tbl_stats_documents . ' - WHERE down_user_id = '.$student_id.' - AND down_cours_id = "'.$course_code.'" - AND down_session_id = '.$session_id.' '; - $rs = Database::query($sql); - return Database::num_rows($rs); - } + $sql = "SELECT count(*) FROM $tbl_stats_access WHERE DATE_SUB(NOW(),INTERVAL $last_days DAY) <= access_date + AND access_cours_code = '$course_code' AND access_tool='".TOOL_CHAT."' AND access_session_id='$session_id' "; + $result = Database::query($sql); + if (Database::num_rows($result)) { + $row = Database::fetch_row($result); + $count = $row[0]; + return $count; + } else { + return null; + } + } - /** - * Get course list inside a session from a student - * @param int Student id - * @param int Session id (optional) - * @return array Courses list - */ - public static function get_course_list_in_session_from_student($user_id, $id_session = 0) { - $user_id = intval($user_id); - $id_session = intval($id_session); - $tbl_session_course_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER); - $sql = 'SELECT course_code FROM ' . $tbl_session_course_user . ' WHERE id_user="' . $user_id . '" AND id_session="' . $id_session . '"'; - $result = Database::query($sql); - $a_courses = array (); - while ($row = Database::fetch_array($result)) { - $a_courses[$row['course_code']] = $row['course_code']; - } - return $a_courses; - } + /** + * This function gets the last student's connection in chat + * @param int Student id + * @param string Course code + * @param int Session id (optional) + * @return string datetime formatted without day (e.g: February 23, 2010 10:20:50 ) + */ + public static function chat_last_connection($student_id, $course_code, $session_id = 0) { + + //protect datas + $student_id = intval($student_id); + $course_code= Database::escape_string($course_code); + $session_id = intval($session_id); + $date_time = ''; + + // table definition + $tbl_stats_access = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_LASTACCESS); + $sql = "SELECT access_date FROM $tbl_stats_access + WHERE access_tool='".TOOL_CHAT."' AND access_user_id='$student_id' AND access_cours_code = '$course_code' AND access_session_id = '$session_id' ORDER BY access_date DESC limit 1"; + $rs = Database::query($sql); + if (Database::num_rows($rs) > 0) { + $row = Database::fetch_array($rs); + $date_time = api_convert_and_format_date($row['access_date'], null, date_default_timezone_get()); + } + return $date_time; + } - /** - * Get inactives students in course - * @param string Course code - * @param string Since login course date (optional, default = 'never') - * @param int Session id (optional) - * @return array Inactives users - */ - public static function get_inactives_students_in_course($course_code, $since = 'never', $session_id=0) { - $tbl_track_login = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS); - $tbl_session_course_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER); - $table_course_rel_user = Database :: get_main_table(TABLE_MAIN_COURSE_USER); - $inner = ''; - if($session_id!=0) - { - $inner = ' INNER JOIN '.$tbl_session_course_user.' session_course_user - ON stats_login.course_code = session_course_user.course_code - AND session_course_user.id_session = '.intval($session_id).' - AND session_course_user.id_user = stats_login.user_id '; - } - $sql = 'SELECT user_id, MAX(login_course_date) max_date FROM'.$tbl_track_login.' stats_login'.$inner.' - GROUP BY user_id - HAVING DATE_SUB( NOW(), INTERVAL '.$since.' DAY) > max_date '; - //HAVING DATE_ADD(max_date, INTERVAL '.$since.' DAY) < NOW() '; - - if ($since == 'never') { - $sql = 'SELECT course_user.user_id FROM '.$table_course_rel_user.' course_user - LEFT JOIN '. $tbl_track_login.' stats_login - ON course_user.user_id = stats_login.user_id AND relation_type<>'.COURSE_RELATION_TYPE_RRHH.' '. - $inner.' - WHERE course_user.course_code = \''.Database::escape_string($course_code).'\' - AND stats_login.login_course_date IS NULL - GROUP BY course_user.user_id'; - } - $rs = Database::query($sql); - $inactive_users = array(); - while($user = Database::fetch_array($rs)) - { - $inactive_users[] = $user['user_id']; - } - return $inactive_users; - } + /** + * Get count student's visited links + * @param int Student id + * @param string Course code + * @param int Session id (optional) + * @return int count of visited links + */ + public static function count_student_visited_links($student_id, $course_code, $session_id = 0) { + + // protect datas + $student_id = intval($student_id); + $course_code = Database::escape_string($course_code); + $session_id = intval($session_id); + + // table definition + $tbl_stats_links = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_LINKS); + + $sql = 'SELECT 1 + FROM '.$tbl_stats_links.' + WHERE links_user_id= '.$student_id.' + AND links_cours_id = "'.$course_code.'" + AND links_session_id = '.$session_id.' '; - /** - * Get count login per student - * @param int Student id - * @param string Course code - * @param int Session id (optional) - * @return int count login - */ - public static function count_login_per_student($student_id, $course_code, $session_id = 0) { - $student_id = intval($student_id); - $course_code = Database::escape_string($course_code); - $session_id = intval($session_id); - $tbl_course_rel_user = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_ACCESS); - - $sql = 'SELECT '.$student_id.' - FROM ' . $tbl_course_rel_user . ' - WHERE access_user_id=' . $student_id . ' - AND access_cours_code="' . $course_code . '" AND access_session_id = "'.$session_id.'" '; + $rs = Database::query($sql); + return Database::num_rows($rs); + } - $rs = Database::query($sql); - $nb_login = Database::num_rows($rs); + /** + * Get count student downloaded documents + * @param int Student id + * @param string Course code + * @param int Session id (optional) + * @return int Count downloaded documents + */ + public static function count_student_downloaded_documents($student_id, $course_code, $session_id = 0) { + // protect datas + $student_id = intval($student_id); + $course_code = Database::escape_string($course_code); + $session_id = intval($session_id); + + // table definition + $tbl_stats_documents = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_DOWNLOADS); + + $sql = 'SELECT 1 + FROM ' . $tbl_stats_documents . ' + WHERE down_user_id = '.$student_id.' + AND down_cours_id = "'.$course_code.'" + AND down_session_id = '.$session_id.' '; + $rs = Database::query($sql); + return Database::num_rows($rs); + } - return $nb_login; - } + /** + * Get course list inside a session from a student + * @param int Student id + * @param int Session id (optional) + * @return array Courses list + */ + public static function get_course_list_in_session_from_student($user_id, $id_session = 0) { + $user_id = intval($user_id); + $id_session = intval($id_session); + $tbl_session_course_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER); + $sql = 'SELECT course_code FROM ' . $tbl_session_course_user . ' WHERE id_user="' . $user_id . '" AND id_session="' . $id_session . '"'; + $result = Database::query($sql); + $a_courses = array (); + while ($row = Database::fetch_array($result)) { + $a_courses[$row['course_code']] = $row['course_code']; + } + return $a_courses; + } + /** + * Get inactives students in course + * @param string Course code + * @param string Since login course date (optional, default = 'never') + * @param int Session id (optional) + * @return array Inactives users + */ + public static function get_inactives_students_in_course($course_code, $since = 'never', $session_id=0) { + $tbl_track_login = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS); + $tbl_session_course_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER); + $table_course_rel_user = Database :: get_main_table(TABLE_MAIN_COURSE_USER); + $inner = ''; + if($session_id!=0) + { + $inner = ' INNER JOIN '.$tbl_session_course_user.' session_course_user + ON stats_login.course_code = session_course_user.course_code + AND session_course_user.id_session = '.intval($session_id).' + AND session_course_user.id_user = stats_login.user_id '; + } + $sql = 'SELECT user_id, MAX(login_course_date) max_date FROM'.$tbl_track_login.' stats_login'.$inner.' + GROUP BY user_id + HAVING DATE_SUB( NOW(), INTERVAL '.$since.' DAY) > max_date '; + //HAVING DATE_ADD(max_date, INTERVAL '.$since.' DAY) < NOW() '; + + if ($since == 'never') { + $sql = 'SELECT course_user.user_id FROM '.$table_course_rel_user.' course_user + LEFT JOIN '. $tbl_track_login.' stats_login + ON course_user.user_id = stats_login.user_id AND relation_type<>'.COURSE_RELATION_TYPE_RRHH.' '. + $inner.' + WHERE course_user.course_code = \''.Database::escape_string($course_code).'\' + AND stats_login.login_course_date IS NULL + GROUP BY course_user.user_id'; + } + $rs = Database::query($sql); + $inactive_users = array(); + while($user = Database::fetch_array($rs)) + { + $inactive_users[] = $user['user_id']; + } + return $inactive_users; + } - /** - * Get students followed by a human resources manager - * @param int Drh id - * @return array Student list - */ - public static function get_student_followed_by_drh($hr_dept_id) { + /** + * Get count login per student + * @param int Student id + * @param string Course code + * @param int Session id (optional) + * @return int count login + */ + public static function count_login_per_student($student_id, $course_code, $session_id = 0) { + $student_id = intval($student_id); + $course_code = Database::escape_string($course_code); + $session_id = intval($session_id); + $tbl_course_rel_user = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_ACCESS); + + $sql = 'SELECT '.$student_id.' + FROM ' . $tbl_course_rel_user . ' + WHERE access_user_id=' . $student_id . ' + AND access_cours_code="' . $course_code . '" AND access_session_id = "'.$session_id.'" '; - $hr_dept_id = intval($hr_dept_id); - $a_students = array(); + $rs = Database::query($sql); + $nb_login = Database::num_rows($rs); - $tbl_organism = Database :: get_main_table(TABLE_MAIN_ORGANISM); - $tbl_user = Database :: get_main_table(TABLE_MAIN_USER); + return $nb_login; + } - $sql = 'SELECT DISTINCT user_id FROM '.$tbl_user.' as user - WHERE hr_dept_id='.$hr_dept_id; - $rs = Database::query($sql); - while($user = Database :: fetch_array($rs)) - { - $a_students[$user['user_id']] = $user['user_id']; - } + /** + * Get students followed by a human resources manager + * @param int Drh id + * @return array Student list + */ + public static function get_student_followed_by_drh($hr_dept_id) { - return $a_students; - } + $hr_dept_id = intval($hr_dept_id); + $a_students = array(); - /** - * Gets the average of test and scorm inside a learning path - * @param int User id - * @param string Course id - * @return float average of test - * @author isaac flores paz - * @deprecated get_avg_student_score should be use - */ - public static function get_average_test_scorm_and_lp ($user_id, $course_id) { - - //the score inside the Reporting table - $course_info = api_get_course_info($course_id); - $course_id = $course_info['real_id']; - - $lp_table = Database :: get_course_table(TABLE_LP_MAIN); - $lp_view_table = Database :: get_course_table(TABLE_LP_VIEW); - $lp_item_view_table = Database :: get_course_table(TABLE_LP_ITEM_VIEW); - $lp_item_table = Database :: get_course_table(TABLE_LP_ITEM); - - $sql_type = "SELECT id, lp_type FROM $lp_table WHERE c_id = $course_id"; - $rs_type=Database::query($sql_type); - $average_data=0; - $count_loop=0; - $lp_list = array(); - while ($row_type = Database::fetch_array($rs_type)) { - $lp_list[] = $row_type['id']; - if ($row_type['lp_type']==1) { - //lp chamilo - - $sql = "SELECT id FROM $lp_view_table WHERE c_id = $course_id AND user_id = '".intval($user_id)."' and lp_id='".$row_type['id']."'"; - $rs_last_lp_view_id = Database::query($sql); - $lp_view_id = intval(Database::result($rs_last_lp_view_id,0,'id')); - - $sql_list_view="SELECT li.max_score,lv.user_id,liw.score,(liw.score/li.max_score) as sum_data - FROM $lp_item_table li INNER JOIN $lp_view_table lv - ON li.lp_id=lv.lp_id INNER JOIN $lp_item_view_table liw ON liw.lp_item_id=li.id - WHERE li.c_id = $course_id AND - liw.c_id = $course_id AND - lv.c_id = $course_id AND - lv.user_id= $user_id AND li.item_type = 'quiz' AND liw.lp_view_id= $lp_view_id"; - $sum=0; - $tot=0; - $rs_list_view1=Database::query($sql_list_view); - while ($row_list_view=Database::fetch_array($rs_list_view1)) { - $sum=$sum+$row_list_view['sum_data']; - $tot++; - } - if ($tot==0) { - $tot=1; - } - $average_data1=$sum/$tot; - - $sql_list_view=''; - $rs_last_lp_view_id=''; - - } elseif ($row_type['lp_type']==2) { - //lp scorm - $sql = "SELECT id FROM $lp_view_table WHERE c_id = $course_id AND user_id = '".intval($user_id)."' and lp_id='".$row_type['id']."'"; - $rs_last_lp_view_id = Database::query($sql); - $lp_view_id = intval(Database::result($rs_last_lp_view_id,0,'id')); - - $sql_list_view = "SELECT li.max_score,lv.user_id,liw.score,((liw.score/li.max_score)*100) as sum_data - FROM $lp_item_table li INNER JOIN $lp_view_table lv - ON li.lp_id=lv.lp_id INNER JOIN $lp_item_view_table liw ON liw.lp_item_id=li.id - WHERE li.c_id = $course_id AND - liw.c_id = $course_id AND - lv.c_id = $course_id AND - lv.user_id= $user_id AND (li.item_type = 'sco' OR li.item_type='quiz') AND liw.lp_view_id = $lp_view_id"; - $tot=0; - $sum=0; - - $rs_list_view2=Database::query($sql_list_view); - while ($row_list_view=Database::fetch_array($rs_list_view2)) { - $sum=$sum+$row_list_view['sum_data']; - $tot++; - } - if ($tot==0) { - $tot=1; - } - $average_data2=$sum/$tot; - } - $average_data_sum=$average_data_sum+$average_data1+$average_data2; - $average_data2=0; - $average_data1=0; - $count_loop++; - } + $tbl_organism = Database :: get_main_table(TABLE_MAIN_ORGANISM); + $tbl_user = Database :: get_main_table(TABLE_MAIN_USER); - //We only count the LP that have an exercise to get the average - $lp_with_quiz = 0; - foreach($lp_list as $lp_id) { + $sql = 'SELECT DISTINCT user_id FROM '.$tbl_user.' as user + WHERE hr_dept_id='.$hr_dept_id; + $rs = Database::query($sql); - //check if LP have a score - $sql = "SELECT count(id) as count FROM $lp_item_table - WHERE c_id = $course_id AND item_type = 'quiz' AND lp_id = ".$lp_id." "; - $result_have_quiz = Database::query($sql); + while($user = Database :: fetch_array($rs)) + { + $a_students[$user['user_id']] = $user['user_id']; + } - if (Database::num_rows($result_have_quiz) > 0 ) { - $row = Database::fetch_array($result_have_quiz,'ASSOC'); - if (is_numeric($row['count']) && $row['count'] != 0) { - $lp_with_quiz++; - } - } - } + return $a_students; + } - if ($lp_with_quiz > 0) { - $avg_student_score = round(($average_data_sum / $lp_with_quiz * 100), 2); - } - return $avg_student_score; - } + /** + * Gets the average of test and scorm inside a learning path + * @param int User id + * @param string Course id + * @return float average of test + * @author isaac flores paz + * @deprecated get_avg_student_score should be use + */ + public static function get_average_test_scorm_and_lp ($user_id, $course_id) { + + //the score inside the Reporting table + $course_info = api_get_course_info($course_id); + $course_id = $course_info['real_id']; + + $lp_table = Database :: get_course_table(TABLE_LP_MAIN); + $lp_view_table = Database :: get_course_table(TABLE_LP_VIEW); + $lp_item_view_table = Database :: get_course_table(TABLE_LP_ITEM_VIEW); + $lp_item_table = Database :: get_course_table(TABLE_LP_ITEM); + + $sql_type = "SELECT id, lp_type FROM $lp_table WHERE c_id = $course_id"; + $rs_type=Database::query($sql_type); + $average_data=0; + $count_loop=0; + $lp_list = array(); + while ($row_type = Database::fetch_array($rs_type)) { + $lp_list[] = $row_type['id']; + if ($row_type['lp_type']==1) { + //lp chamilo + + $sql = "SELECT id FROM $lp_view_table WHERE c_id = $course_id AND user_id = '".intval($user_id)."' and lp_id='".$row_type['id']."'"; + $rs_last_lp_view_id = Database::query($sql); + $lp_view_id = intval(Database::result($rs_last_lp_view_id,0,'id')); + + $sql_list_view="SELECT li.max_score,lv.user_id,liw.score,(liw.score/li.max_score) as sum_data + FROM $lp_item_table li INNER JOIN $lp_view_table lv + ON li.lp_id=lv.lp_id INNER JOIN $lp_item_view_table liw ON liw.lp_item_id=li.id + WHERE li.c_id = $course_id AND + liw.c_id = $course_id AND + lv.c_id = $course_id AND + lv.user_id= $user_id AND li.item_type = 'quiz' AND liw.lp_view_id= $lp_view_id"; + $sum=0; + $tot=0; + $rs_list_view1=Database::query($sql_list_view); + while ($row_list_view=Database::fetch_array($rs_list_view1)) { + $sum=$sum+$row_list_view['sum_data']; + $tot++; + } + if ($tot==0) { + $tot=1; + } + $average_data1=$sum/$tot; + + $sql_list_view=''; + $rs_last_lp_view_id=''; + + } elseif ($row_type['lp_type']==2) { + //lp scorm + $sql = "SELECT id FROM $lp_view_table WHERE c_id = $course_id AND user_id = '".intval($user_id)."' and lp_id='".$row_type['id']."'"; + $rs_last_lp_view_id = Database::query($sql); + $lp_view_id = intval(Database::result($rs_last_lp_view_id,0,'id')); + + $sql_list_view = "SELECT li.max_score,lv.user_id,liw.score,((liw.score/li.max_score)*100) as sum_data + FROM $lp_item_table li INNER JOIN $lp_view_table lv + ON li.lp_id=lv.lp_id INNER JOIN $lp_item_view_table liw ON liw.lp_item_id=li.id + WHERE li.c_id = $course_id AND + liw.c_id = $course_id AND + lv.c_id = $course_id AND + lv.user_id= $user_id AND (li.item_type = 'sco' OR li.item_type='quiz') AND liw.lp_view_id = $lp_view_id"; + $tot=0; + $sum=0; + + $rs_list_view2=Database::query($sql_list_view); + while ($row_list_view=Database::fetch_array($rs_list_view2)) { + $sum=$sum+$row_list_view['sum_data']; + $tot++; + } + if ($tot==0) { + $tot=1; + } + $average_data2=$sum/$tot; + } + $average_data_sum=$average_data_sum+$average_data1+$average_data2; + $average_data2=0; + $average_data1=0; + $count_loop++; + } - /** - * get count clicks about tools most used by course - * @param string Course code - * @param int Session id (optional), if param $session_id is null(default) it'll return results including sessions, 0 = session is not filtered - * @return array tools data - */ - public static function get_tools_most_used_by_course($course_code, $session_id = null) { - //protect data - $course_code = Database::escape_string($course_code); - $data = array(); - $TABLETRACK_ACCESS = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_LASTACCESS); - $condition_session = ''; - if (isset($session_id)) { - $session_id = intval($session_id); - $condition_session = ' AND access_session_id = '. $session_id; - } - $sql = "SELECT access_tool, COUNT(DISTINCT access_user_id),count( access_tool ) as count_access_tool - FROM $TABLETRACK_ACCESS - WHERE access_tool IS NOT NULL AND access_tool != '' AND access_cours_code = '$course_code' $condition_session - GROUP BY access_tool - ORDER BY count_access_tool DESC - LIMIT 0, 3"; - $rs = Database::query($sql); - if (Database::num_rows($rs) > 0) { - while ($row = Database::fetch_array($rs)) { - $data[] = $row; - } - } - return $data; - } + //We only count the LP that have an exercise to get the average + $lp_with_quiz = 0; + foreach($lp_list as $lp_id) { - /** - * get documents most downloaded by course - * @param string Course code - * @param int Session id (optional), if param $session_id is null(default) it'll return results including sessions, 0 = session is not filtered - * @param int Limit (optional, default = 0, 0 = without limit) - * @return array documents downloaded - */ - public static function get_documents_most_downloaded_by_course($course_code, $session_id = null, $limit = 0) { - - //protect data - $course_code = Database::escape_string($course_code); - $data = array(); - - $TABLETRACK_DOWNLOADS = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_DOWNLOADS); - $condition_session = ''; - if (isset($session_id)) { - $session_id = intval($session_id); - $condition_session = ' AND down_session_id = '. $session_id; - } - $sql = "SELECT down_doc_path, COUNT(DISTINCT down_user_id), COUNT(down_doc_path) as count_down - FROM $TABLETRACK_DOWNLOADS - WHERE down_cours_id = '$course_code' - $condition_session - GROUP BY down_doc_path - ORDER BY count_down DESC - LIMIT 0, $limit"; - $rs = Database::query($sql); + //check if LP have a score + $sql = "SELECT count(id) as count FROM $lp_item_table + WHERE c_id = $course_id AND item_type = 'quiz' AND lp_id = ".$lp_id." "; + $result_have_quiz = Database::query($sql); - if (Database::num_rows($rs) > 0) { - while ($row = Database::fetch_array($rs)) { - $data[] = $row; - } - } - return $data; - } + if (Database::num_rows($result_have_quiz) > 0 ) { + $row = Database::fetch_array($result_have_quiz,'ASSOC'); + if (is_numeric($row['count']) && $row['count'] != 0) { + $lp_with_quiz++; + } + } + } - /** - * get links most visited by course - * @param string Course code - * @param int Session id (optional), if param $session_id is null(default) it'll return results including sessions, 0 = session is not filtered - * @return array links most visited - */ - public static function get_links_most_visited_by_course($course_code, $session_id = null) { - - //protect data - $course_code = Database::escape_string($course_code); - $course_info = api_get_course_info($course_code); - - $course_id = $course_info['real_id']; - - $data = array(); + if ($lp_with_quiz > 0) { + $avg_student_score = round(($average_data_sum / $lp_with_quiz * 100), 2); + } + return $avg_student_score; + } - $TABLETRACK_LINKS = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_LINKS); - $TABLECOURSE_LINKS = Database::get_course_table(TABLE_LINK); + /** + * get count clicks about tools most used by course + * @param string Course code + * @param int Session id (optional), if param $session_id is null(default) it'll return results including sessions, 0 = session is not filtered + * @return array tools data + */ + public static function get_tools_most_used_by_course($course_code, $session_id = null) { + //protect data + $course_code = Database::escape_string($course_code); + $data = array(); + $TABLETRACK_ACCESS = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_LASTACCESS); + $condition_session = ''; + if (isset($session_id)) { + $session_id = intval($session_id); + $condition_session = ' AND access_session_id = '. $session_id; + } + $sql = "SELECT access_tool, COUNT(DISTINCT access_user_id),count( access_tool ) as count_access_tool + FROM $TABLETRACK_ACCESS + WHERE access_tool IS NOT NULL AND access_tool != '' AND access_cours_code = '$course_code' $condition_session + GROUP BY access_tool + ORDER BY count_access_tool DESC + LIMIT 0, 3"; + $rs = Database::query($sql); + if (Database::num_rows($rs) > 0) { + while ($row = Database::fetch_array($rs)) { + $data[] = $row; + } + } + return $data; + } - $condition_session = ''; - if (isset($session_id)) { - $session_id = intval($session_id); - $condition_session = ' AND cl.session_id = '.$session_id; - } + /** + * get documents most downloaded by course + * @param string Course code + * @param int Session id (optional), if param $session_id is null(default) it'll return results including sessions, 0 = session is not filtered + * @param int Limit (optional, default = 0, 0 = without limit) + * @return array documents downloaded + */ + public static function get_documents_most_downloaded_by_course($course_code, $session_id = null, $limit = 0) { + + //protect data + $course_code = Database::escape_string($course_code); + $data = array(); + + $TABLETRACK_DOWNLOADS = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_DOWNLOADS); + $condition_session = ''; + if (isset($session_id)) { + $session_id = intval($session_id); + $condition_session = ' AND down_session_id = '. $session_id; + } + $sql = "SELECT down_doc_path, COUNT(DISTINCT down_user_id), COUNT(down_doc_path) as count_down + FROM $TABLETRACK_DOWNLOADS + WHERE down_cours_id = '$course_code' + $condition_session + GROUP BY down_doc_path + ORDER BY count_down DESC + LIMIT 0, $limit"; + $rs = Database::query($sql); - $sql = "SELECT cl.title, cl.url,count(DISTINCT sl.links_user_id), count(cl.title) as count_visits - FROM $TABLETRACK_LINKS AS sl, $TABLECOURSE_LINKS AS cl - WHERE cl.c_id = $course_id AND - sl.links_link_id = cl.id - AND sl.links_cours_id = '$course_code' - $condition_session - GROUP BY cl.title, cl.url - ORDER BY count_visits DESC - LIMIT 0, 3"; - $rs = Database::query($sql); - if (Database::num_rows($rs) > 0) { - while ($row = Database::fetch_array($rs)) { - $data[] = $row; - } - } - return $data; - } + if (Database::num_rows($rs) > 0) { + while ($row = Database::fetch_array($rs)) { + $data[] = $row; + } + } + return $data; + } - /** - * Shows the user progress (when clicking in the Progress tab) - * @param int user id - * @return string html code - */ - static function show_user_progress($user_id, $session_id = 0, $extra_params = '', $show_courses = true) { - global $_configuration; - $tbl_course = Database :: get_main_table(TABLE_MAIN_COURSE); - $tbl_session = Database :: get_main_table(TABLE_MAIN_SESSION); - $tbl_course_user = Database :: get_main_table(TABLE_MAIN_COURSE_USER); - $tbl_access_rel_course = Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE); - $tbl_session_course_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER); - $tbl_access_rel_session = Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION); - - $user_id = intval($user_id); + /** + * get links most visited by course + * @param string Course code + * @param int Session id (optional), if param $session_id is null(default) it'll return results including sessions, 0 = session is not filtered + * @return array links most visited + */ + public static function get_links_most_visited_by_course($course_code, $session_id = null) { + + //protect data + $course_code = Database::escape_string($course_code); + $course_info = api_get_course_info($course_code); - // get course list - if ($_configuration['multiple_access_urls']) { - $sql = 'SELECT cu.course_code as code, title - FROM '.$tbl_course_user.' cu INNER JOIN '.$tbl_access_rel_course.' a ON(a.course_code = cu.course_code) INNER JOIN '.$tbl_course.' c ON( cu.course_code = c.code) - WHERE user_id='.$user_id.' AND relation_type<>'.COURSE_RELATION_TYPE_RRHH.' AND access_url_id = '.api_get_current_access_url_id().' ORDER BY title '; - } else { - $sql = 'SELECT course_code as code, title FROM '.$tbl_course_user.' u INNER JOIN '.$tbl_course.' c ON(course_code = c.code) - WHERE u.user_id='.$user_id.' AND relation_type<>'.COURSE_RELATION_TYPE_RRHH.' ORDER BY title '; - } + $course_id = $course_info['real_id']; - $rs = Database::query($sql); - $courses = $course_in_session = $temp_course_in_session = array(); - while($row = Database :: fetch_array($rs, 'ASSOC')) { - $courses[$row['code']] = $row['title']; - } - - // Get the list of sessions where the user is subscribed as student - if ($_configuration['multiple_access_urls']) { - $sql = 'SELECT DISTINCT cu.course_code, id_session as session_id, name FROM '.$tbl_session_course_user.' cu INNER JOIN '.$tbl_access_rel_session.' a ON(a.session_id = cu.id_session) INNER JOIN '.$tbl_session.' s ON(s.id = a.session_id) - WHERE id_user='.$user_id.' AND access_url_id = '.api_get_current_access_url_id().' ORDER BY name '; - } else { - $sql = 'SELECT DISTINCT course_code, id_session as session_id, name FROM '.$tbl_session_course_user.' u INNER JOIN '.$tbl_session.' s ON(s.id = u.id_session) - WHERE id_user='.$user_id.' ORDER BY name '; - } + $data = array(); - $rs = Database::query($sql); - $simple_session_array = array(); - while ($row = Database :: fetch_array($rs)) { - $course_info = CourseManager::get_course_information($row['course_code']); - $temp_course_in_session[$row['session_id']]['course_list'][$course_info['id']] = $course_info; - $temp_course_in_session[$row['session_id']]['name'] = $row['name']; - $simple_session_array[$row['session_id']] = $row['name']; - } - foreach($simple_session_array as $my_session_id => $session_name) { - $course_list = $temp_course_in_session[$my_session_id]['course_list']; - $my_course_data = array(); - foreach ($course_list as $course_data) { - $my_course_data[$course_data['id']] = $course_data['title']; - } - $my_course_data = utf8_sort($my_course_data); - $final_course_data = array(); - - foreach($my_course_data as $course_id => $value) { - $final_course_data[$course_id] = $course_list[$course_id]; - } - $course_in_session[$my_session_id]['course_list'] = $final_course_data; - $course_in_session[$my_session_id]['name'] = $session_name; - } - - $html = ''; + $TABLETRACK_LINKS = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_LINKS); + $TABLECOURSE_LINKS = Database::get_course_table(TABLE_LINK); - // Course list - - if ($show_courses) { - if (!empty($courses)) { - $html .= Display::page_subheader(Display::return_icon('course.png', get_lang('MyCourses'), array(), ICON_SIZE_SMALL).' '.get_lang('MyCourses')); - $html .= ''; - $html .= ' - '.Display::tag('th', get_lang('Course'), array('width'=>'300px')).' - '.Display::tag('th', get_lang('TimeSpentInTheCourse'), array('class'=>'head')).' - '.Display::tag('th', get_lang('Progress'), array('class'=>'head')).' - '.Display::tag('th', get_lang('Score').Display::return_icon('info3.gif', get_lang('ScormAndLPTestTotalAverage'), array('align' => 'absmiddle', 'hspace' => '3px')),array('class'=>'head')).' - '.Display::tag('th', get_lang('LastConnexion'), array('class'=>'head')).' - '.Display::tag('th', get_lang('Details'), array('class'=>'head')).' - '; + $condition_session = ''; + if (isset($session_id)) { + $session_id = intval($session_id); + $condition_session = ' AND cl.session_id = '.$session_id; + } - foreach ($courses as $course_code => $course_title) { - $weighting = 0; + $sql = "SELECT cl.title, cl.url,count(DISTINCT sl.links_user_id), count(cl.title) as count_visits + FROM $TABLETRACK_LINKS AS sl, $TABLECOURSE_LINKS AS cl + WHERE cl.c_id = $course_id AND + sl.links_link_id = cl.id + AND sl.links_cours_id = '$course_code' + $condition_session + GROUP BY cl.title, cl.url + ORDER BY count_visits DESC + LIMIT 0, 3"; + $rs = Database::query($sql); + if (Database::num_rows($rs) > 0) { + while ($row = Database::fetch_array($rs)) { + $data[] = $row; + } + } + return $data; + } - $total_time_login = Tracking :: get_time_spent_on_the_course($user_id, $course_code); - $time = api_time_to_hms($total_time_login); - $progress = Tracking :: get_avg_student_progress($user_id, $course_code); - $percentage_score = Tracking :: get_avg_student_score($user_id, $course_code, array()); - $last_connection = Tracking :: get_last_connection_date_on_the_course($user_id, $course_code); - - if (is_null($progress)) { - $progress = '0%'; - } else { - $progress = $progress.'%'; - } + /** + * Shows the user progress (when clicking in the Progress tab) + * @param int user id + * @return string html code + */ + static function show_user_progress($user_id, $session_id = 0, $extra_params = '', $show_courses = true) { + global $_configuration; + $tbl_course = Database :: get_main_table(TABLE_MAIN_COURSE); + $tbl_session = Database :: get_main_table(TABLE_MAIN_SESSION); + $tbl_course_user = Database :: get_main_table(TABLE_MAIN_COURSE_USER); + $tbl_access_rel_course = Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE); + $tbl_session_course_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER); + $tbl_access_rel_session = Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION); + + $user_id = intval($user_id); + + // get course list + if ($_configuration['multiple_access_urls']) { + $sql = 'SELECT cu.course_code as code, title + FROM '.$tbl_course_user.' cu INNER JOIN '.$tbl_access_rel_course.' a ON(a.course_code = cu.course_code) INNER JOIN '.$tbl_course.' c ON( cu.course_code = c.code) + WHERE user_id='.$user_id.' AND relation_type<>'.COURSE_RELATION_TYPE_RRHH.' AND access_url_id = '.api_get_current_access_url_id().' ORDER BY title '; + } else { + $sql = 'SELECT course_code as code, title FROM '.$tbl_course_user.' u INNER JOIN '.$tbl_course.' c ON(course_code = c.code) + WHERE u.user_id='.$user_id.' AND relation_type<>'.COURSE_RELATION_TYPE_RRHH.' ORDER BY title '; + } - if ($course_code == $_GET['course'] && empty($_GET['session_id'])) { - $html .= ''; - } else { - $html .= ''; - } - $url = api_get_course_url($course_code, $session_id); - $course_url = Display::url($course_title, $url, array('target'=>SESSION_LINK_TARGET)); - $html .= ''; + $rs = Database::query($sql); + $courses = $course_in_session = $temp_course_in_session = array(); + while($row = Database :: fetch_array($rs, 'ASSOC')) { + $courses[$row['code']] = $row['title']; + } - $html .= ''; - $html .= ''; + // Get the list of sessions where the user is subscribed as student + if ($_configuration['multiple_access_urls']) { + $sql = 'SELECT DISTINCT cu.course_code, id_session as session_id, name FROM '.$tbl_session_course_user.' cu INNER JOIN '.$tbl_access_rel_session.' a ON(a.session_id = cu.id_session) INNER JOIN '.$tbl_session.' s ON(s.id = a.session_id) + WHERE id_user='.$user_id.' AND access_url_id = '.api_get_current_access_url_id().' ORDER BY name '; + } else { + $sql = 'SELECT DISTINCT course_code, id_session as session_id, name FROM '.$tbl_session_course_user.' u INNER JOIN '.$tbl_session.' s ON(s.id = u.id_session) + WHERE id_user='.$user_id.' ORDER BY name '; + } - $html .= ''; - $html .= ''; - $html .= ''; - } - $html .= '
'.$course_url.''.$time.''.$progress.''; - if (is_numeric($percentage_score)) { - $html .= $percentage_score.'%'; - } else { - $html .= '0%'; - } - $html .= ''.$last_connection.''; - if ($course_code == $_GET['course'] && empty($_GET['session_id'])) { - $html .= ''; - $html .= Display::return_icon('2rightarrow_na.gif', get_lang('Details')); - } else { - $html .= ''; - $html .= Display::return_icon('2rightarrow.gif', get_lang('Details')); - } - $html .= ''; - $html .= '
'; - } - } + $rs = Database::query($sql); + $simple_session_array = array(); + while ($row = Database :: fetch_array($rs)) { + $course_info = CourseManager::get_course_information($row['course_code']); + $temp_course_in_session[$row['session_id']]['course_list'][$course_info['id']] = $course_info; + $temp_course_in_session[$row['session_id']]['name'] = $row['name']; + $simple_session_array[$row['session_id']] = $row['name']; + } + foreach($simple_session_array as $my_session_id => $session_name) { + $course_list = $temp_course_in_session[$my_session_id]['course_list']; + $my_course_data = array(); + foreach ($course_list as $course_data) { + $my_course_data[$course_data['id']] = $course_data['title']; + } + $my_course_data = utf8_sort($my_course_data); + $final_course_data = array(); - // Session list - if (!empty($course_in_session)) { - $main_session_graph = ''; - - if (!isset($_GET['session_id']) && !isset($_GET['course'])) { - - //Load graphics only when calling to an specific session - $session_graph = array(); - - $all_exercise_graph_name_list = array(); - $my_results = array(); - $all_exercise_graph_list = array(); - - $all_exercise_start_time = array(); - - foreach ($course_in_session as $my_session_id => $session_data) { - - $course_list = $session_data['course_list']; - $session_name = $session_data['name']; - - $user_count = count(SessionManager::get_users_by_session($my_session_id)); - - $exercise_graph_name_list = array(); - //$user_results = array(); - $exercise_graph_list = array(); - - foreach ($course_list as $course_data) { - - $exercise_list = get_all_exercises($course_data, $my_session_id); - - foreach ($exercise_list as $exercise_data) { - $exercise_obj = new Exercise($course_data['id']); - $exercise_obj->read($exercise_data['id']); - //Exercise is not necessary to be visible to show results check the result_disable configuration instead - //$visible_return = $exercise_obj->is_visible(); - - if ($exercise_data['results_disabled'] == 0 || $exercise_data['results_disabled'] == 2) { - //if ($visible_return['value'] == true) { - $best_average = intval(get_best_average_score_by_exercise($exercise_data['id'], $course_data['code'], $my_session_id, $user_count)); - $exercise_graph_list[] = $best_average; - $all_exercise_graph_list[] = $best_average; - - $user_result_data = get_best_attempt_by_user(api_get_user_id(), $exercise_data['id'], $course_data['code'], $my_session_id); - $score = 0; - if (!empty($user_result_data['exe_weighting']) && intval($user_result_data['exe_weighting']) != 0) { - $score = intval($user_result_data['exe_result']/$user_result_data['exe_weighting'] * 100); - } - //$user_results[] = $score; - $time = api_strtotime($exercise_data['start_time']) ? api_strtotime($exercise_data['start_time'], 'UTC') : 0; - $all_exercise_start_time[] = $time; - $my_results[] = $score; - if (count($exercise_list)<=10) { - $title = cut($course_data['title'], 30)." \n ".cut($exercise_data['title'], 30); - $exercise_graph_name_list[]= $title; - $all_exercise_graph_name_list[] = $title; - } else { - // if there are more than 10 results, space becomes difficult to find, so only show the title of the exercise, not the tool - $title = cut($exercise_data['title'], 30); - $exercise_graph_name_list[]= $title; - $all_exercise_graph_name_list[]= $title; - } - } - } - } - } - - //Complete graph - if (!empty($my_results) && !empty($all_exercise_graph_list)) { - asort($all_exercise_start_time); - - //Fix exams order - $final_all_exercise_graph_name_list = array(); - $my_results_final = array(); - $final_all_exercise_graph_list = array(); - - foreach ($all_exercise_start_time as $key => $time) { - $label_time = ''; - if (!empty($time)) { - $label_time = date('d-m-y', $time); - //$label_time = api_format_date($time, DATE_FORMAT_NUMBER); - } - $final_all_exercise_graph_name_list[] = $all_exercise_graph_name_list[$key].' '.$label_time; - $my_results_final[] = $my_results[$key]; - $final_all_exercise_graph_list[] = $all_exercise_graph_list[$key]; - } - //var_dump($final_all_exercise_graph_name_list, $final_all_user_results, $final_all_exercise_graph_list); - $main_session_graph = self::generate_session_exercise_graph($final_all_exercise_graph_name_list, $my_results_final, $final_all_exercise_graph_list); - } - } - - - $html .= Display::page_subheader(Display::return_icon('session.png', get_lang('Sessions'), array(), ICON_SIZE_SMALL).' '.get_lang('Sessions')); - - $html .= ''; - //'.Display::tag('th', get_lang('DoneExercises'), array('class'=>'head')).' - $html .= ' - '.Display::tag('th', get_lang('Session'), array('width'=>'300px')).' - '.Display::tag('th', get_lang('PublishedExercises'), array('width'=>'300px')).' - '.Display::tag('th', get_lang('NewExercises'), array('class'=>'head')).' - '.Display::tag('th', get_lang('AverageExerciseResult'), array('class'=>'head')).' - '.Display::tag('th', get_lang('Details'), array('class'=>'head')).' - '; + foreach($my_course_data as $course_id => $value) { + $final_course_data[$course_id] = $course_list[$course_id]; + } + $course_in_session[$my_session_id]['course_list'] = $final_course_data; + $course_in_session[$my_session_id]['name'] = $session_name; + } - foreach ($course_in_session as $my_session_id => $session_data) { - $course_list = $session_data['course_list']; - $session_name = $session_data['name']; - - if (isset($session_id) && !empty($session_id)) { - if ($session_id != $my_session_id) { - continue; - } - } - - $all_exercises = 0; - $all_unanswered_exercises_by_user = 0; - $all_average = 0; - - $stats_array = array(); - - foreach($course_list as $course_data) { - //All exercises in the course @todo change for a real count - $exercises = get_all_exercises($course_data, $my_session_id); - $count_exercises = 0; - if (is_array($exercises) && !empty($exercises)) { - $count_exercises = count($exercises); - } - - //Count of user results - //$done_exercises = get_count_exercises_attempted_by_course($course_data['code'], $my_session_id); - $done_exercises = null; - - $answered_exercises = 0; - if (!empty($exercises)) { - foreach($exercises as $exercise_item) { - $attempts = count_exercise_attempts_by_user(api_get_user_id(), $exercise_item['id'], $course_data['code'], $my_session_id); - if ($attempts > 1) { - $answered_exercises++; - } - } - } - - //Average - $average = get_average_score_by_course($course_data['code'], $my_session_id); - - $all_exercises += $count_exercises; - - $all_unanswered_exercises_by_user += $count_exercises - $answered_exercises; - //$all_done_exercise += $done_exercises; - $all_average += $average; - //$stats_array[$course_data['code']] = array('exercises'=>$count_exercises, 'unanswered_exercises_by_user'=>$answered_exercises,'done_exercises'=>$done_exercises, 'average'=>$average); - } + $html = ''; - $all_average = $all_average / count($course_list); + // Course list - if (isset($_GET['session_id']) && $my_session_id == $_GET['session_id']) { - $html .= ''; - } else { - $html .= ''; - } - $url = api_get_path(WEB_CODE_PATH)."session/?session_id={$my_session_id}"; - - $html .= Display::tag('td', Display::url($session_name, $url, array('target'=>SESSION_LINK_TARGET))); - $html .= Display::tag('td', $all_exercises); - $html .= Display::tag('td', $all_unanswered_exercises_by_user); - - //$html .= Display::tag('td', $all_done_exercise); - $html .= Display::tag('td', convert_to_percentage($all_average)); - - if (isset($_GET['session_id']) && $my_session_id == $_GET['session_id']) { - $icon = Display::url(Display::return_icon('2rightarrow_na.gif', get_lang('Details')), '?session_id='.$my_session_id); - } else { - $icon = Display::url(Display::return_icon('2rightarrow.gif', get_lang('Details')), '?session_id='.$my_session_id); - } - $html .= Display::tag('td', $icon); - $html .= ''; - } - $html .= '

'; - $html .= Display::div($main_session_graph, array('id'=>'session_graph','class'=>'chart-session', 'style'=>'position:relative; text-align: center;') ); - - //Checking selected session - - if (isset($_GET['session_id'])) { - $session_id_from_get = intval($_GET['session_id']); - - $session_data = $course_in_session[$session_id_from_get]; - $course_list = $session_data['course_list']; - - $html .= Display::tag('h3',$session_data['name'].' - '.get_lang('CourseList')); - - $html .= ''; - //'.Display::tag('th', get_lang('DoneExercises'), array('class'=>'head')).' - $html .= ' - - - '.Display::tag('th', get_lang('PublishedExercises'), array('class'=>'head')).' - '.Display::tag('th', get_lang('NewExercises'), array('class'=>'head')).' - '.Display::tag('th', get_lang('MyAverage'), array('class'=>'head')).' - '.Display::tag('th', get_lang('AverageExerciseResult'), array('class'=>'head')).' + if ($show_courses) { + if (!empty($courses)) { + $html .= Display::page_subheader(Display::return_icon('course.png', get_lang('MyCourses'), array(), ICON_SIZE_SMALL).' '.get_lang('MyCourses')); + $html .= '
'.get_lang('Course').'
'; + $html .= ' + '.Display::tag('th', get_lang('Course'), array('width'=>'300px')).' '.Display::tag('th', get_lang('TimeSpentInTheCourse'), array('class'=>'head')).' - '.Display::tag('th', get_lang('LPProgress') , array('class'=>'head')).' - '.Display::tag('th', get_lang('Score').Display::return_icon('info3.gif', get_lang('ScormAndLPTestTotalAverage'), array ('align' => 'absmiddle', 'hspace' => '3px')), array('class'=>'head')).' - '.Display::tag('th', get_lang('LastConnexion'), array('class'=>'head')).' - '.Display::tag('th', get_lang('Details'), array('class'=>'head')).' + '.Display::tag('th', get_lang('Progress'), array('class'=>'head')).' + '.Display::tag('th', get_lang('Score').Display::return_icon('info3.gif', get_lang('ScormAndLPTestTotalAverage'), array('align' => 'absmiddle', 'hspace' => '3px')),array('class'=>'head')).' + '.Display::tag('th', get_lang('LastConnexion'), array('class'=>'head')).' + '.Display::tag('th', get_lang('Details'), array('class'=>'head')).' '; - foreach ($course_list as $course_data) { - $course_code = $course_data['code']; - $course_title = $course_data['title']; + foreach ($courses as $course_code => $course_title) { + $weighting = 0; - //All exercises in the course @todo change for a real count - $exercises = get_all_exercises($course_data, $session_id_from_get); - $count_exercises = 0; - if (!empty($exercises)) { - $count_exercises = count($exercises); - } - //Count of user results - //$done_exercises = get_best_exercise_results_by_course($course_code, $session_id_from_get); - - //From course exercises NOT from LP exercises!!! - //$done_exercises = get_count_exercises_attempted_by_course($course_code, $session_id_from_get); - $answered_exercises = 0; - foreach($exercises as $exercise_item) { - $attempts = count_exercise_attempts_by_user(api_get_user_id(), $exercise_item['id'], $course_code, $session_id_from_get); - if ($attempts > 1) { - $answered_exercises++; - } - } - - $unanswered_exercises = $count_exercises - $answered_exercises; - - //Average - $average = get_average_score_by_course($course_code, $session_id_from_get); - $my_average = get_average_score_by_course_by_user(api_get_user_id(), $course_code, $session_id_from_get); - - $stats_array[$course_code] = array( 'exercises' => $count_exercises, - 'unanswered_exercises_by_user' => $unanswered_exercises, - 'done_exercises' => $done_exercises, - 'average' => $average, - 'my_average' => $my_average); - - $weighting = 0; - $last_connection = Tracking :: get_last_connection_date_on_the_course($user_id, $course_code, $session_id_from_get); - $progress = Tracking :: get_avg_student_progress($user_id, $course_code,array(), $session_id_from_get); - $total_time_login = Tracking :: get_time_spent_on_the_course($user_id, $course_code, $session_id_from_get); - $time = api_time_to_hms($total_time_login); - $percentage_score = Tracking :: get_avg_student_score($user_id, $course_code, array(), $session_id_from_get); - - if ($course_code == $_GET['course'] && $_GET['session_id'] == $session_id_from_get) { - $html .= ''; - } else { - $html .= ''; - } + $total_time_login = Tracking :: get_time_spent_on_the_course($user_id, $course_code); + $time = api_time_to_hms($total_time_login); + $progress = Tracking :: get_avg_student_progress($user_id, $course_code); + $percentage_score = Tracking :: get_avg_student_score($user_id, $course_code, array()); + $last_connection = Tracking :: get_last_connection_date_on_the_course($user_id, $course_code); - $url = api_get_course_url($course_code, $session_id_from_get); - $course_url = Display::url($course_title, $url, array('target'=>SESSION_LINK_TARGET)); + if (is_null($progress)) { + $progress = '0%'; + } else { + $progress = $progress.'%'; + } - $html .= Display::tag('td', $course_url); - $html .= Display::tag('td', $stats_array[$course_code]['exercises']); - $html .= Display::tag('td', $stats_array[$course_code]['unanswered_exercises_by_user']); - //$html .= Display::tag('td', $stats_array[$course_code]['done_exercises']); - $html .= Display::tag('td', convert_to_percentage($stats_array[$course_code]['my_average'])); - - $html .= Display::tag('td', $stats_array[$course_code]['average'] == 0 ? '-' : '('.convert_to_percentage($stats_array[$course_code]['average']).')'); - $html .= Display::tag('td', $time, array('align'=>'center')); + if ($course_code == $_GET['course'] && empty($_GET['session_id'])) { + $html .= ''; + } else { + $html .= ''; + } + $url = api_get_course_url($course_code, $session_id); + $course_url = Display::url($course_title, $url, array('target'=>SESSION_LINK_TARGET)); + $html .= ''; + + $html .= ''; + $html .= ''; + + $html .= ''; + $html .= ''; + $html .= ''; + } + $html .= '
'.$course_url.''.$time.''.$progress.''; + if (is_numeric($percentage_score)) { + $html .= $percentage_score.'%'; + } else { + $html .= '0%'; + } + $html .= ''.$last_connection.''; + if ($course_code == $_GET['course'] && empty($_GET['session_id'])) { + $html .= ''; + $html .= Display::return_icon('2rightarrow_na.gif', get_lang('Details')); + } else { + $html .= ''; + $html .= Display::return_icon('2rightarrow.gif', get_lang('Details')); + } + $html .= ''; + $html .= '
'; + } + } - if (is_numeric($progress)) { - $progress = $progress.'%'; - } else { - $progress = '0%'; - } - //Progress - $html .= Display::tag('td', $progress, array('align'=>'center')); - if (is_numeric($percentage_score)) { - $percentage_score = $percentage_score.'%'; - } else { - $percentage_score = '0%'; - } - //Score - $html .= Display::tag('td', $percentage_score, array('align'=>'center')); - $html .= Display::tag('td', $last_connection, array('align'=>'center')); - - if ($course_code == $_GET['course'] && $_GET['session_id'] == $session_id_from_get) { - $details = ''; - $details .=Display::return_icon('2rightarrow_na.gif', get_lang('Details')); - } else { - $details = ''; - $details .=Display::return_icon('2rightarrow.gif', get_lang('Details')); - } - $details .= ''; - $html .= Display::tag('td', $details, array('align'=>'center')); - $html .= ''; - } - $html .= ''; + // Session list + if (!empty($course_in_session)) { + $main_session_graph = ''; + + if (!isset($_GET['session_id']) && !isset($_GET['course'])) { + + //Load graphics only when calling to an specific session + $session_graph = array(); + + $all_exercise_graph_name_list = array(); + $my_results = array(); + $all_exercise_graph_list = array(); + + $all_exercise_start_time = array(); + + foreach ($course_in_session as $my_session_id => $session_data) { + + $course_list = $session_data['course_list']; + $session_name = $session_data['name']; + + $user_count = count(SessionManager::get_users_by_session($my_session_id)); + + $exercise_graph_name_list = array(); + //$user_results = array(); + $exercise_graph_list = array(); + + foreach ($course_list as $course_data) { + + $exercise_list = get_all_exercises($course_data, $my_session_id); + + foreach ($exercise_list as $exercise_data) { + $exercise_obj = new Exercise($course_data['id']); + $exercise_obj->read($exercise_data['id']); + //Exercise is not necessary to be visible to show results check the result_disable configuration instead + //$visible_return = $exercise_obj->is_visible(); + + if ($exercise_data['results_disabled'] == 0 || $exercise_data['results_disabled'] == 2) { + //if ($visible_return['value'] == true) { + $best_average = intval(get_best_average_score_by_exercise($exercise_data['id'], $course_data['code'], $my_session_id, $user_count)); + $exercise_graph_list[] = $best_average; + $all_exercise_graph_list[] = $best_average; + + $user_result_data = get_best_attempt_by_user(api_get_user_id(), $exercise_data['id'], $course_data['code'], $my_session_id); + $score = 0; + if (!empty($user_result_data['exe_weighting']) && intval($user_result_data['exe_weighting']) != 0) { + $score = intval($user_result_data['exe_result']/$user_result_data['exe_weighting'] * 100); + } + //$user_results[] = $score; + $time = api_strtotime($exercise_data['start_time']) ? api_strtotime($exercise_data['start_time'], 'UTC') : 0; + $all_exercise_start_time[] = $time; + $my_results[] = $score; + if (count($exercise_list)<=10) { + $title = cut($course_data['title'], 30)." \n ".cut($exercise_data['title'], 30); + $exercise_graph_name_list[]= $title; + $all_exercise_graph_name_list[] = $title; + } else { + // if there are more than 10 results, space becomes difficult to find, so only show the title of the exercise, not the tool + $title = cut($exercise_data['title'], 30); + $exercise_graph_name_list[]= $title; + $all_exercise_graph_name_list[]= $title; + } + } + } + } + } + + //Complete graph + if (!empty($my_results) && !empty($all_exercise_graph_list)) { + asort($all_exercise_start_time); + + //Fix exams order + $final_all_exercise_graph_name_list = array(); + $my_results_final = array(); + $final_all_exercise_graph_list = array(); + + foreach ($all_exercise_start_time as $key => $time) { + $label_time = ''; + if (!empty($time)) { + $label_time = date('d-m-y', $time); + //$label_time = api_format_date($time, DATE_FORMAT_NUMBER); + } + $final_all_exercise_graph_name_list[] = $all_exercise_graph_name_list[$key].' '.$label_time; + $my_results_final[] = $my_results[$key]; + $final_all_exercise_graph_list[] = $all_exercise_graph_list[$key]; + } + //var_dump($final_all_exercise_graph_name_list, $final_all_user_results, $final_all_exercise_graph_list); + $main_session_graph = self::generate_session_exercise_graph($final_all_exercise_graph_name_list, $my_results_final, $final_all_exercise_graph_list); + } + } - if (!empty($session_graph[$session_id_from_get])) { - //$html .= Display::div($session_graph[$session_id_from_get], array('id'=>'session_graph','class'=>'chart-session', 'style'=>'position:relative; text-align: center;') ); - } - } - } - return $html; - } - /** - * Shows the user detail progress (when clicking in the details link) - * @param int user id - * @param string course code - * @param int session id - * @return string html code - */ - static function show_course_detail($user_id, $course_code, $session_id) { - $html = ''; - if (isset($course_code)) { - - $user_id = intval($user_id); - $session_id = intval($session_id); - $course = Database::escape_string($course_code); - $course_info = CourseManager::get_course_information($course); - - //$course_id = $course_info['real_id']; - //$session_name = api_get_session_name($session_id); - - $html .= Display::page_subheader($course_info['title']); - - $html .= ''; - - //Course details - $html .= ' - - - - - - - '; - - if (empty($session_id)) { - $user_list = CourseManager::get_user_list_from_course_code($course, $session_id, null, null, STUDENT); - } else { - $user_list = CourseManager::get_user_list_from_course_code($course, $session_id, null, null, 0); + $html .= Display::page_subheader(Display::return_icon('session.png', get_lang('Sessions'), array(), ICON_SIZE_SMALL).' '.get_lang('Sessions')); + + $html .= '
'.get_lang('Exercices').''.get_lang('Attempts').''.get_lang('BestAttempt').''.get_lang('Ranking').''.get_lang('BestResultInCourse').''.get_lang('Statistics').' '.Display :: return_icon('info3.gif', get_lang('OnlyBestResultsPerStudent'), array('align' => 'absmiddle', 'hspace' => '3px')).'
'; + //'.Display::tag('th', get_lang('DoneExercises'), array('class'=>'head')).' + $html .= ' + '.Display::tag('th', get_lang('Session'), array('width'=>'300px')).' + '.Display::tag('th', get_lang('PublishedExercises'), array('width'=>'300px')).' + '.Display::tag('th', get_lang('NewExercises'), array('class'=>'head')).' + '.Display::tag('th', get_lang('AverageExerciseResult'), array('class'=>'head')).' + '.Display::tag('th', get_lang('Details'), array('class'=>'head')).' + '; + + foreach ($course_in_session as $my_session_id => $session_data) { + $course_list = $session_data['course_list']; + $session_name = $session_data['name']; + + if (isset($session_id) && !empty($session_id)) { + if ($session_id != $my_session_id) { + continue; + } } - - //$exercise_list = get_all_exercises($course_info, $session_id, true); - // Show exercise results of invisible exercises? see BT#4091 - $exercise_list = get_all_exercises($course_info, $session_id, false); - - $to_graph_exercise_result = array(); - - if (!empty($exercise_list)) { - $score = $weighting = $exe_id = 0; - foreach ($exercise_list as $exercices) { - - $exercise_obj = new Exercise($course_info['real_id']); - $exercise_obj->read($exercices['id']); - $visible_return = $exercise_obj->is_visible(); - - //user can see the exercise results even if the exercise was set to invisible? - /*if ($visible_return['value'] == false) { - continue; - }*/ - - $score = $weighting = $attempts = 0; - - //Getting count of attempts by user - $attempts = count_exercise_attempts_by_user(api_get_user_id(), $exercices['id'], $course_info['code'], $session_id); - - $html .= ''; - $url = api_get_path(WEB_CODE_PATH)."exercice/overview.php?cidReq={$course_info['code']}&id_session=$session_id&exerciseId={$exercices['id']}"; - - if ($visible_return['value'] == true) { - $exercices['title'] = Display::url($exercices['title'], $url, array('target'=>SESSION_LINK_TARGET)); + + $all_exercises = 0; + $all_unanswered_exercises_by_user = 0; + $all_average = 0; + + $stats_array = array(); + + foreach($course_list as $course_data) { + //All exercises in the course @todo change for a real count + $exercises = get_all_exercises($course_data, $my_session_id); + $count_exercises = 0; + if (is_array($exercises) && !empty($exercises)) { + $count_exercises = count($exercises); + } + + //Count of user results + //$done_exercises = get_count_exercises_attempted_by_course($course_data['code'], $my_session_id); + $done_exercises = null; + + $answered_exercises = 0; + if (!empty($exercises)) { + foreach($exercises as $exercise_item) { + $attempts = count_exercise_attempts_by_user(api_get_user_id(), $exercise_item['id'], $course_data['code'], $my_session_id); + if ($attempts > 1) { + $answered_exercises++; + } + } + } + + //Average + $average = get_average_score_by_course($course_data['code'], $my_session_id); + + $all_exercises += $count_exercises; + + $all_unanswered_exercises_by_user += $count_exercises - $answered_exercises; + //$all_done_exercise += $done_exercises; + $all_average += $average; + //$stats_array[$course_data['code']] = array('exercises'=>$count_exercises, 'unanswered_exercises_by_user'=>$answered_exercises,'done_exercises'=>$done_exercises, 'average'=>$average); + } + + $all_average = $all_average / count($course_list); + + if (isset($_GET['session_id']) && $my_session_id == $_GET['session_id']) { + $html .= ''; + } else { + $html .= ''; + } + $url = api_get_path(WEB_CODE_PATH)."session/?session_id={$my_session_id}"; + + $html .= Display::tag('td', Display::url($session_name, $url, array('target'=>SESSION_LINK_TARGET))); + $html .= Display::tag('td', $all_exercises); + $html .= Display::tag('td', $all_unanswered_exercises_by_user); + + //$html .= Display::tag('td', $all_done_exercise); + $html .= Display::tag('td', convert_to_percentage($all_average)); + + if (isset($_GET['session_id']) && $my_session_id == $_GET['session_id']) { + $icon = Display::url(Display::return_icon('2rightarrow_na.gif', get_lang('Details')), '?session_id='.$my_session_id); + } else { + $icon = Display::url(Display::return_icon('2rightarrow.gif', get_lang('Details')), '?session_id='.$my_session_id); + } + $html .= Display::tag('td', $icon); + $html .= ''; + } + $html .= '

'; + $html .= Display::div($main_session_graph, array('id'=>'session_graph','class'=>'chart-session', 'style'=>'position:relative; text-align: center;') ); + + //Checking selected session + + if (isset($_GET['session_id'])) { + $session_id_from_get = intval($_GET['session_id']); + + $session_data = $course_in_session[$session_id_from_get]; + $course_list = $session_data['course_list']; + + $html .= Display::tag('h3',$session_data['name'].' - '.get_lang('CourseList')); + + $html .= ''; + //'.Display::tag('th', get_lang('DoneExercises'), array('class'=>'head')).' + $html .= ' + + + '.Display::tag('th', get_lang('PublishedExercises'), array('class'=>'head')).' + '.Display::tag('th', get_lang('NewExercises'), array('class'=>'head')).' + '.Display::tag('th', get_lang('MyAverage'), array('class'=>'head')).' + '.Display::tag('th', get_lang('AverageExerciseResult'), array('class'=>'head')).' + '.Display::tag('th', get_lang('TimeSpentInTheCourse'), array('class'=>'head')).' + '.Display::tag('th', get_lang('LPProgress') , array('class'=>'head')).' + '.Display::tag('th', get_lang('Score').Display::return_icon('info3.gif', get_lang('ScormAndLPTestTotalAverage'), array ('align' => 'absmiddle', 'hspace' => '3px')), array('class'=>'head')).' + '.Display::tag('th', get_lang('LastConnexion'), array('class'=>'head')).' + '.Display::tag('th', get_lang('Details'), array('class'=>'head')).' + '; + + foreach ($course_list as $course_data) { + $course_code = $course_data['code']; + $course_title = $course_data['title']; + + //All exercises in the course @todo change for a real count + $exercises = get_all_exercises($course_data, $session_id_from_get); + $count_exercises = 0; + if (!empty($exercises)) { + $count_exercises = count($exercises); + } + //Count of user results + //$done_exercises = get_best_exercise_results_by_course($course_code, $session_id_from_get); + + //From course exercises NOT from LP exercises!!! + //$done_exercises = get_count_exercises_attempted_by_course($course_code, $session_id_from_get); + $answered_exercises = 0; + foreach($exercises as $exercise_item) { + $attempts = count_exercise_attempts_by_user(api_get_user_id(), $exercise_item['id'], $course_code, $session_id_from_get); + if ($attempts > 1) { + $answered_exercises++; } - - $html .= Display::tag('td', $exercices['title']); - - //Exercise configuration show results or show only score - if ($exercices['results_disabled'] == 0 || $exercices['results_disabled'] == 2) { - //For graphics - $best_exercise_stats = get_best_exercise_results_by_user($exercices['id'], $course_info['code'], $session_id); - $to_graph_exercise_result[$exercices['id']] = array('title'=>$exercices['title'], 'data'=>$best_exercise_stats); - - $latest_attempt_url = ''; - $best_score = $position = $percentage_score_result = '-'; - $graph = $normal_graph = null; - - //Getting best results - $best_score_data = get_best_attempt_in_course($exercices['id'], $course_info['code'], $session_id); - $best_score = show_score($best_score_data['exe_result'], $best_score_data['exe_weighting']); - - if ($attempts > 0) { - $exercise_stat = get_best_attempt_by_user(api_get_user_id(), $exercices['id'], $course_info['code'], $session_id); - if (!empty($exercise_stat)) { - - //Always getting the BEST attempt - $score = $exercise_stat['exe_result']; - $weighting = $exercise_stat['exe_weighting']; - $exe_id = $exercise_stat['exe_id']; - - //$latest_attempt_url .= ' '.Display::return_icon('quiz.gif', get_lang('Quiz')).' '; - $latest_attempt_url .= '../exercice/exercise_show.php?origin=myprogress&id='.$exe_id.'&cidReq='.$course_info['code'].'&id_session='.$session_id; - $percentage_score_result = Display::url(show_score($score, $weighting), $latest_attempt_url); - $my_score = 0; - if (!empty($weighting) && intval($weighting) != 0) { - $my_score = $score/$weighting; - } - $position = get_exercise_result_ranking($my_score, $exe_id, $exercices['id'], $course_info['code'], $session_id, $user_list); - - $graph = self::generate_exercise_result_thumbnail_graph($to_graph_exercise_result[$exercices['id']]); - $normal_graph = self::generate_exercise_result_graph($to_graph_exercise_result[$exercices['id']]); - } - } - - $html .= Display::div($normal_graph, array('id'=>'main_graph_'.$exercices['id'],'class'=>'dialog', 'style'=>'display:none') ); - - if (empty($graph)) { - $graph = '-'; - } else { - $graph = Display::url($graph, '#', array('id'=>$exercices['id'], 'class'=>'opener')); - } - - $html .= Display::tag('td', $attempts, array('align'=>'center')); - $html .= Display::tag('td', $percentage_score_result, array('align'=>'center')); - $html .= Display::tag('td', $position, array('align'=>'center')); - $html .= Display::tag('td', $best_score, array('align'=>'center')); - $html .= Display::tag('td', $graph, array('align'=>'center')); - //$html .= Display::tag('td', $latest_attempt_url, array('align'=>'center', 'width'=>'25')); - - } else { - // Exercise configuration NO results - $html .= Display::tag('td', $attempts, array('align'=>'center')); - $html .= Display::tag('td', '-', array('align'=>'center')); - $html .= Display::tag('td', '-', array('align'=>'center')); - $html .= Display::tag('td', '-', array('align'=>'center')); - $html .= Display::tag('td', '-', array('align'=>'center')); - } - $html .= ''; - } - } else { - $html .= ''; - } - $html .= '
'.get_lang('Course').'
'.get_lang('NoEx').'
'; - - - //LP table results - $html .=''; - $html .= Display::tag('th', get_lang('Learnpaths'), array('class'=>'head', 'style'=>'color:#000')); - $html .= Display::tag('th', get_lang('LatencyTimeSpent'), 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 .= ''; - - $list = new LearnpathList(api_get_user_id(), $course_info['code'], $session_id, 'publicated_on ASC', true); - $lp_list = $list->get_flat_list(); - - if (!empty($lp_list) > 0) { - foreach($lp_list as $lp_id => $learnpath) { - - $progress = Tracking::get_avg_student_progress($user_id, $course, array($lp_id), $session_id); - $last_connection_in_lp = Tracking::get_last_connection_time_in_lp($user_id, $course, $lp_id, $session_id); - $time_spent_in_lp = Tracking::get_time_spent_in_lp($user_id, $course, array($lp_id), $session_id); - $percentage_score = Tracking::get_avg_student_score($user_id, $course, array($lp_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); + $unanswered_exercises = $count_exercises - $answered_exercises; + + //Average + $average = get_average_score_by_course($course_code, $session_id_from_get); + $my_average = get_average_score_by_course_by_user(api_get_user_id(), $course_code, $session_id_from_get); + + $stats_array[$course_code] = array( 'exercises' => $count_exercises, + 'unanswered_exercises_by_user' => $unanswered_exercises, + 'done_exercises' => $done_exercises, + 'average' => $average, + 'my_average' => $my_average); + + $weighting = 0; + $last_connection = Tracking :: get_last_connection_date_on_the_course($user_id, $course_code, $session_id_from_get); + $progress = Tracking :: get_avg_student_progress($user_id, $course_code,array(), $session_id_from_get); + $total_time_login = Tracking :: get_time_spent_on_the_course($user_id, $course_code, $session_id_from_get); + $time = api_time_to_hms($total_time_login); + $percentage_score = Tracking :: get_avg_student_score($user_id, $course_code, array(), $session_id_from_get); + + if ($course_code == $_GET['course'] && $_GET['session_id'] == $session_id_from_get) { + $html .= ''; + } else { + $html .= ''; + } - $html .= ''; - $url = api_get_path(WEB_CODE_PATH)."newscorm/lp_controller.php?cidReq={$course_code}&id_session=$session_id&lp_id=$lp_id&action=view"; - $html .= Display::tag('td', Display::url($learnpath['lp_name'], $url, array('target'=>SESSION_LINK_TARGET))); - $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); + $url = api_get_course_url($course_code, $session_id_from_get); + $course_url = Display::url($course_title, $url, array('target'=>SESSION_LINK_TARGET)); - $last_connection = '-'; - if (!empty($last_connection_in_lp)) { - $last_connection = api_convert_and_format_date($last_connection_in_lp, DATE_TIME_FORMAT_LONG); - } - $html .= Display::tag('td', $last_connection, array('align'=>'center','width'=>'180px')); - $html .= ""; - } - } else { - $html .= ' - - '; - } - $html .='
- '.get_lang('NoLearnpath').' -
'; - } - return $html; - } + $html .= Display::tag('td', $course_url); + $html .= Display::tag('td', $stats_array[$course_code]['exercises']); + $html .= Display::tag('td', $stats_array[$course_code]['unanswered_exercises_by_user']); + //$html .= Display::tag('td', $stats_array[$course_code]['done_exercises']); + $html .= Display::tag('td', convert_to_percentage($stats_array[$course_code]['my_average'])); - /** - * Generates an histogram - * - * @param array list of exercise names - * @param array my results 0 to 100 - * @param array average scores 0-100 - */ - static function generate_session_exercise_graph($names, $my_results, $average) { - 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'; - - $cache = new pCache(); - - // Dataset definition - $data_set = new pData(); - - // Dataset definition - $data_set->AddPoint($average, "Serie1"); - $data_set->AddPoint($my_results, "Serie2"); - $data_set->AddPoint($names, "Serie3"); - $data_set->AddAllSeries(); - $data_set->SetAbsciseLabelSerie('Serie3'); - $data_set->SetSerieName(get_lang('AverageScore'),"Serie1"); - $data_set->SetSerieName(get_lang('MyResults'), "Serie2"); - - //$data_set->SetYAxisName(get_lang("Percentage")); - - $data_set->SetYAxisUnit("%"); - - // Initialise the graph - $main_width = 860; - $main_height = 500; - $y_label_angle = 50; - $data_set->RemoveSerie("Serie3"); - $graph = new pChart($main_width, $main_height); - //See 3.2 BT#2797 - $graph->setFixedScale(0,100); - - $graph->setFontProperties(api_get_path(LIBRARY_PATH).'pchart/fonts/tahoma.ttf',8); - $graph->setGraphArea(65,50,$main_width-20, $main_height-140); - - $graph->drawFilledRoundedRectangle(7,7,$main_width-7,$main_height-7,5,240,240,240); - $graph->drawRoundedRectangle(5,5,$main_width-5,$main_height -5,5,230,230,230); - $graph->drawGraphArea(255,255,255,TRUE); + $html .= Display::tag('td', $stats_array[$course_code]['average'] == 0 ? '-' : '('.convert_to_percentage($stats_array[$course_code]['average']).')'); + $html .= Display::tag('td', $time, array('align'=>'center')); - //SCALE_NORMAL, SCALE_START0, SCALE_ADDALLSTART0, SCALE_ADDALL - $graph->drawScale($data_set->GetData(),$data_set->GetDataDescription(),SCALE_NORMAL ,150,150,150,TRUE,$y_label_angle,1, TRUE); - $graph->drawGrid(4,TRUE,230,230,230,70); + if (is_numeric($progress)) { + $progress = $progress.'%'; + } else { + $progress = '0%'; + } + //Progress + $html .= Display::tag('td', $progress, array('align'=>'center')); + if (is_numeric($percentage_score)) { + $percentage_score = $percentage_score.'%'; + } else { + $percentage_score = '0%'; + } + //Score + $html .= Display::tag('td', $percentage_score, array('align'=>'center')); + $html .= Display::tag('td', $last_connection, array('align'=>'center')); + + if ($course_code == $_GET['course'] && $_GET['session_id'] == $session_id_from_get) { + $details = ''; + $details .=Display::return_icon('2rightarrow_na.gif', get_lang('Details')); + } else { + $details = ''; + $details .=Display::return_icon('2rightarrow.gif', get_lang('Details')); + } + $details .= ''; + $html .= Display::tag('td', $details, array('align'=>'center')); + $html .= ''; + } + $html .= ''; - // Draw the 0 line - $graph->setFontProperties(api_get_path(LIBRARY_PATH).'pchart/fonts/tahoma.ttf',6); - $graph->drawTreshold(0,143,55,72,TRUE,TRUE); + if (!empty($session_graph[$session_id_from_get])) { + //$html .= Display::div($session_graph[$session_id_from_get], array('id'=>'session_graph','class'=>'chart-session', 'style'=>'position:relative; text-align: center;') ); + } + } + } + return $html; + } - // Draw the cubic curve graph - $graph->drawLineGraph($data_set->GetData(),$data_set->GetDataDescription()); - $graph->drawPlotGraph($data_set->GetData(),$data_set->GetDataDescription(),1,1,230,255,255); + /** + * Shows the user detail progress (when clicking in the details link) + * @param int user id + * @param string course code + * @param int session id + * @return string html code + */ + static function show_course_detail($user_id, $course_code, $session_id) { + $html = ''; + if (isset($course_code)) { + + $user_id = intval($user_id); + $session_id = intval($session_id); + $course = Database::escape_string($course_code); + $course_info = CourseManager::get_course_information($course); + + //$course_id = $course_info['real_id']; + //$session_name = api_get_session_name($session_id); + + $html .= Display::page_subheader($course_info['title']); + + $html .= ''; + + //Course details + $html .= ' + + + + + + + '; - // Finish the graph - $graph->setFontProperties(api_get_path(LIBRARY_PATH).'pchart/fonts/tahoma.ttf',10); - $graph->drawLegend($main_width - 150,70,$data_set->GetDataDescription(),255,255,255); - - $graph->setFontProperties(api_get_path(LIBRARY_PATH).'pchart/fonts/tahoma.ttf',11); - $graph->drawTitle(50, 30, get_lang('ExercisesInTimeProgressChart'), 50,50,50,$main_width-110, true); + if (empty($session_id)) { + $user_list = CourseManager::get_user_list_from_course_code($course, $session_id, null, null, STUDENT); + } else { + $user_list = CourseManager::get_user_list_from_course_code($course, $session_id, null, null, 0); + } - // $main_graph = new pChart($main_width,$main_height); + //$exercise_list = get_all_exercises($course_info, $session_id, true); + // Show exercise results of invisible exercises? see BT#4091 + $exercise_list = get_all_exercises($course_info, $session_id, false); - $graph_id = 'generate_session_exercise_graph'.Security::remove_XSS($_GET['course']).'-'.intval($_GET['session_id']).'-'.api_get_user_id(); - if ($cache->IsInCache($graph_id, $data_set->GetData())) { - //if (0) { - //if we already created the img - //echo 'in cache'; - $img_file = $cache->GetHash($graph_id,$data_set->GetData()); - } else { - $cache->WriteToCache($graph_id, $data_set->GetData(), $graph); - ob_start(); - $graph->Stroke(); - ob_end_clean(); - $img_file = $cache->GetHash($graph_id, $data_set->GetData()); - } - $html = ''; - return $html; - } + $to_graph_exercise_result = array(); - /** - * - * Returns a thumbnail of the function generate_exercise_result_graph - * @param array attempts - - */ - static function generate_exercise_result_thumbnail_graph($attempts) { - 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'; - - $exercise_title = $attempts['title']; - $attempts = $attempts['data']; - $my_exercise_result_array = $exercise_result = array(); - if (empty($attempts)) { - return null; - } - - foreach ($attempts as $attempt) { - if (api_get_user_id() == $attempt['exe_user_id']) { - if ($attempt['exe_weighting'] != 0 ) { - $my_exercise_result_array[]= $attempt['exe_result']/$attempt['exe_weighting']; - } - } else { - if ($attempt['exe_weighting'] != 0 ) { - $exercise_result[]= $attempt['exe_result']/$attempt['exe_weighting']; - } - } - } + if (!empty($exercise_list)) { + $score = $weighting = $exe_id = 0; + foreach ($exercise_list as $exercices) { - //Getting best result - rsort($my_exercise_result_array); - $my_exercise_result = 0; - if (isset($my_exercise_result_array[0])) { - $my_exercise_result = $my_exercise_result_array[0] *100; - } + $exercise_obj = new Exercise($course_info['real_id']); + $exercise_obj->read($exercices['id']); + $visible_return = $exercise_obj->is_visible(); - //var_dump($exercise_result, $my_exercise_result); + //user can see the exercise results even if the exercise was set to invisible? + /*if ($visible_return['value'] == false) { + continue; + }*/ - $max = 100; - $pieces = 5 ; - $part = round($max / $pieces); - $x_axis = array(); - $final_array = array(); - $my_final_array = array(); + $score = $weighting = $attempts = 0; - for ($i=1; $i <=$pieces; $i++) { - $sum = 1; - if ($i == 1) { - $sum = 0; - } - $min = ($i-1)*$part + $sum; - $max = ($i)*$part; - $x_axis[]= $min." - ".$max; - $count = 0; - foreach($exercise_result as $result) { - $percentage = $result*100; - //echo $percentage.' - '.$min.' - '.$max."
"; - if ($percentage >= $min && $percentage <= $max) { - //echo ' is > '; - $count++; - } - } - //echo '
'; - $final_array[]= $count; + //Getting count of attempts by user + $attempts = count_exercise_attempts_by_user(api_get_user_id(), $exercices['id'], $course_info['code'], $session_id); - if ($my_exercise_result >= $min && $my_exercise_result <= $max) { - $my_final_array[] = 1; - } else { - $my_final_array[] = 0; - } - } + $html .= ''; + $url = api_get_path(WEB_CODE_PATH)."exercice/overview.php?cidReq={$course_info['code']}&id_session=$session_id&exerciseId={$exercices['id']}"; - //var_dump($my_final_array, $final_array); exit; + if ($visible_return['value'] == true) { + $exercices['title'] = Display::url($exercices['title'], $url, array('target'=>SESSION_LINK_TARGET)); + } - //Fix to remove the data of the user with my data + $html .= Display::tag('td', $exercices['title']); + + //Exercise configuration show results or show only score + if ($exercices['results_disabled'] == 0 || $exercices['results_disabled'] == 2) { + //For graphics + $best_exercise_stats = get_best_exercise_results_by_user($exercices['id'], $course_info['code'], $session_id); + $to_graph_exercise_result[$exercices['id']] = array('title'=>$exercices['title'], 'data'=>$best_exercise_stats); + + $latest_attempt_url = ''; + $best_score = $position = $percentage_score_result = '-'; + $graph = $normal_graph = null; + + //Getting best results + $best_score_data = get_best_attempt_in_course($exercices['id'], $course_info['code'], $session_id); + $best_score = show_score($best_score_data['exe_result'], $best_score_data['exe_weighting']); + + if ($attempts > 0) { + $exercise_stat = get_best_attempt_by_user(api_get_user_id(), $exercices['id'], $course_info['code'], $session_id); + if (!empty($exercise_stat)) { + + //Always getting the BEST attempt + $score = $exercise_stat['exe_result']; + $weighting = $exercise_stat['exe_weighting']; + $exe_id = $exercise_stat['exe_id']; + + //$latest_attempt_url .= ' '.Display::return_icon('quiz.gif', get_lang('Quiz')).' '; + $latest_attempt_url .= '../exercice/exercise_show.php?origin=myprogress&id='.$exe_id.'&cidReq='.$course_info['code'].'&id_session='.$session_id; + $percentage_score_result = Display::url(show_score($score, $weighting), $latest_attempt_url); + $my_score = 0; + if (!empty($weighting) && intval($weighting) != 0) { + $my_score = $score/$weighting; + } + $position = get_exercise_result_ranking($my_score, $exe_id, $exercices['id'], $course_info['code'], $session_id, $user_list); + + $graph = self::generate_exercise_result_thumbnail_graph($to_graph_exercise_result[$exercices['id']]); + $normal_graph = self::generate_exercise_result_graph($to_graph_exercise_result[$exercices['id']]); + } + } - for($i = 0; $i<=count($my_final_array); $i++) { - if (!empty($my_final_array[$i])) { - $my_final_array[$i] = $final_array[$i] + 1; //Add my result - $final_array[$i] = 0; - } - } - //var_dump($my_final_array, $final_array); echo '
'; + $html .= Display::div($normal_graph, array('id'=>'main_graph_'.$exercices['id'],'class'=>'dialog', 'style'=>'display:none') ); - //echo '
'; var_dump($my_exercise_result, $exercise_result,$x_axis);
-			 
-			$cache = new pCache();
+                        if (empty($graph)) {
+                            $graph = '-';
+                        } else {
+                            $graph = Display::url($graph, '#', array('id'=>$exercices['id'], 'class'=>'opener'));
+                        }
 
-			// Dataset definition
-			$data_set = new pData();
-			$data_set->AddPoint($final_array,"Serie1");
-			$data_set->AddPoint($my_final_array,"Serie2");
-			//$data_set->AddPoint($x_axis,"Serie3");
-			$data_set->AddAllSeries();
-			 
-			// Initialise the graph
+                        $html .= Display::tag('td', $attempts,                 array('align'=>'center'));
+                        $html .= Display::tag('td', $percentage_score_result,  array('align'=>'center'));
+                        $html .= Display::tag('td', $position,                 array('align'=>'center'));
+                        $html .= Display::tag('td', $best_score,               array('align'=>'center'));
+                        $html .= Display::tag('td', $graph,                    array('align'=>'center'));
+                        //$html .= Display::tag('td', $latest_attempt_url,       array('align'=>'center', 'width'=>'25'));
+
+                    } else {
+                        // Exercise configuration NO results
+                        $html .= Display::tag('td', $attempts,    array('align'=>'center'));
+                        $html .= Display::tag('td', '-',          array('align'=>'center'));
+                        $html .= Display::tag('td', '-',          array('align'=>'center'));
+                        $html .= Display::tag('td', '-',          array('align'=>'center'));
+                        $html .= Display::tag('td', '-',          array('align'=>'center'));
+                    }
+                    $html .= '
'; + } + } else { + $html .= ''; + } + $html .= '
'.get_lang('Exercices').''.get_lang('Attempts').''.get_lang('BestAttempt').''.get_lang('Ranking').''.get_lang('BestResultInCourse').''.get_lang('Statistics').' '.Display :: return_icon('info3.gif', get_lang('OnlyBestResultsPerStudent'), array('align' => 'absmiddle', 'hspace' => '3px')).'
'.get_lang('NoEx').'
'; + + + //LP table results + $html .=''; + $html .= Display::tag('th', get_lang('Learnpaths'), array('class'=>'head', 'style'=>'color:#000')); + $html .= Display::tag('th', get_lang('LatencyTimeSpent'), 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 .= ''; + + $list = new LearnpathList(api_get_user_id(), $course_info['code'], $session_id, 'publicated_on ASC', true); + $lp_list = $list->get_flat_list(); + + if (!empty($lp_list) > 0) { + foreach($lp_list as $lp_id => $learnpath) { + + $progress = Tracking::get_avg_student_progress($user_id, $course, array($lp_id), $session_id); + $last_connection_in_lp = Tracking::get_last_connection_time_in_lp($user_id, $course, $lp_id, $session_id); + $time_spent_in_lp = Tracking::get_time_spent_in_lp($user_id, $course, array($lp_id), $session_id); + $percentage_score = Tracking::get_avg_student_score($user_id, $course, array($lp_id), $session_id); + if (is_numeric($percentage_score)) { + $percentage_score = $percentage_score.'%'; + } else { + $percentage_score = '0%'; + } - $main_width = 80; - $main_height = 35; + $time_spent_in_lp = api_time_to_hms($time_spent_in_lp); - $thumbnail_graph = new pChart($main_width, $main_height); + $html .= ''; + $url = api_get_path(WEB_CODE_PATH)."newscorm/lp_controller.php?cidReq={$course_code}&id_session=$session_id&lp_id=$lp_id&action=view"; + $html .= Display::tag('td', Display::url($learnpath['lp_name'], $url, array('target'=>SESSION_LINK_TARGET))); + $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); - $thumbnail_graph->setFontProperties(api_get_path(LIBRARY_PATH).'pchart/fonts/tahoma.ttf',8); - //$thumbnail_graph->setGraphArea(50,30,680,200); - $thumbnail_graph->drawFilledRoundedRectangle(2,2,$main_width-2,$main_height-2,2,230,230,230); - $thumbnail_graph->setGraphArea(5,5,$main_width-5,$main_height-5); - $thumbnail_graph->drawGraphArea(255,255,255); + $last_connection = '-'; + if (!empty($last_connection_in_lp)) { + $last_connection = api_convert_and_format_date($last_connection_in_lp, DATE_TIME_FORMAT_LONG); + } + $html .= Display::tag('td', $last_connection, array('align'=>'center','width'=>'180px')); + $html .= ""; + } + } else { + $html .= ' + + '; + } + $html .='
+ '.get_lang('NoLearnpath').' +
'; + } + return $html; + } - //SCALE_NORMAL, SCALE_START0, SCALE_ADDALLSTART0 - $thumbnail_graph->drawScale($data_set->GetData(),$data_set->GetDataDescription(),SCALE_ADDALLSTART0, 150,150,150,FALSE,0,1,TRUE); + /** + * Generates an histogram + * + * @param array list of exercise names + * @param array my results 0 to 100 + * @param array average scores 0-100 + */ + static function generate_session_exercise_graph($names, $my_results, $average) { + 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'; + + $cache = new pCache(); + + // Dataset definition + $data_set = new pData(); + + // Dataset definition + $data_set->AddPoint($average, "Serie1"); + $data_set->AddPoint($my_results, "Serie2"); + $data_set->AddPoint($names, "Serie3"); + $data_set->AddAllSeries(); + $data_set->SetAbsciseLabelSerie('Serie3'); + $data_set->SetSerieName(get_lang('AverageScore'),"Serie1"); + $data_set->SetSerieName(get_lang('MyResults'), "Serie2"); + + //$data_set->SetYAxisName(get_lang("Percentage")); + + $data_set->SetYAxisUnit("%"); + + // Initialise the graph + $main_width = 860; + $main_height = 500; + $y_label_angle = 50; + $data_set->RemoveSerie("Serie3"); + $graph = new pChart($main_width, $main_height); + //See 3.2 BT#2797 + $graph->setFixedScale(0,100); + + $graph->setFontProperties(api_get_path(LIBRARY_PATH).'pchart/fonts/tahoma.ttf',8); + $graph->setGraphArea(65,50,$main_width-20, $main_height-140); + + $graph->drawFilledRoundedRectangle(7,7,$main_width-7,$main_height-7,5,240,240,240); + $graph->drawRoundedRectangle(5,5,$main_width-5,$main_height -5,5,230,230,230); + $graph->drawGraphArea(255,255,255,TRUE); + + //SCALE_NORMAL, SCALE_START0, SCALE_ADDALLSTART0, SCALE_ADDALL + $graph->drawScale($data_set->GetData(),$data_set->GetDataDescription(),SCALE_NORMAL ,150,150,150,TRUE,$y_label_angle,1, TRUE); + $graph->drawGrid(4,TRUE,230,230,230,70); + + // Draw the 0 line + $graph->setFontProperties(api_get_path(LIBRARY_PATH).'pchart/fonts/tahoma.ttf',6); + $graph->drawTreshold(0,143,55,72,TRUE,TRUE); + + // Draw the cubic curve graph + $graph->drawLineGraph($data_set->GetData(),$data_set->GetDataDescription()); + $graph->drawPlotGraph($data_set->GetData(),$data_set->GetDataDescription(),1,1,230,255,255); + + // Finish the graph + $graph->setFontProperties(api_get_path(LIBRARY_PATH).'pchart/fonts/tahoma.ttf',10); + $graph->drawLegend($main_width - 150,70,$data_set->GetDataDescription(),255,255,255); + + $graph->setFontProperties(api_get_path(LIBRARY_PATH).'pchart/fonts/tahoma.ttf',11); + $graph->drawTitle(50, 30, get_lang('ExercisesInTimeProgressChart'), 50,50,50,$main_width-110, true); + + // $main_graph = new pChart($main_width,$main_height); + + $graph_id = 'generate_session_exercise_graph'.Security::remove_XSS($_GET['course']).'-'.intval($_GET['session_id']).'-'.api_get_user_id(); + if ($cache->IsInCache($graph_id, $data_set->GetData())) { + //if (0) { + //if we already created the img + //echo 'in cache'; + $img_file = $cache->GetHash($graph_id,$data_set->GetData()); + } else { + $cache->WriteToCache($graph_id, $data_set->GetData(), $graph); + ob_start(); + $graph->Stroke(); + ob_end_clean(); + $img_file = $cache->GetHash($graph_id, $data_set->GetData()); + } + $html = ''; + return $html; + } - $thumbnail_graph->drawOverlayBarGraph($data_set->GetData(),$data_set->GetDataDescription(), 100); + /** + * + * Returns a thumbnail of the function generate_exercise_result_graph + * @param array attempts + + */ + static function generate_exercise_result_thumbnail_graph($attempts) { + 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'; + + $exercise_title = $attempts['title']; + $attempts = $attempts['data']; + $my_exercise_result_array = $exercise_result = array(); + if (empty($attempts)) { + return null; + } - // Finish the graph - $graph_id = 'thumbnail_exercise_result_graph_'.Security::remove_XSS($_GET['course']).'-'.intval($_GET['session_id']).'-'.api_get_user_id(); + foreach ($attempts as $attempt) { + if (api_get_user_id() == $attempt['exe_user_id']) { + if ($attempt['exe_weighting'] != 0 ) { + $my_exercise_result_array[]= $attempt['exe_result']/$attempt['exe_weighting']; + } + } else { + if ($attempt['exe_weighting'] != 0 ) { + $exercise_result[]= $attempt['exe_result']/$attempt['exe_weighting']; + } + } + } - if ($cache->IsInCache($graph_id, $data_set->GetData())) { - //if (0) { - //if we already created the img - //echo 'in cache'; - $img_file = $cache->GetHash($graph_id,$data_set->GetData()); - } else { - $cache->WriteToCache($graph_id, $data_set->GetData(), $thumbnail_graph); - ob_start(); - $thumbnail_graph->Stroke(); - ob_end_clean(); - $img_file = $cache->GetHash($graph_id, $data_set->GetData()); - } - $html = ''; - return $html; - } + //Getting best result + rsort($my_exercise_result_array); + $my_exercise_result = 0; + if (isset($my_exercise_result_array[0])) { + $my_exercise_result = $my_exercise_result_array[0] *100; + } - /** - * Generates a big graph with the number of best results - * @param array - */ - static function generate_exercise_result_graph($attempts) { - - 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'; - - $exercise_title = strip_tags($attempts['title']); - $attempts = $attempts['data']; - $my_exercise_result_array = $exercise_result = array(); - if (empty($attempts)) { - return null; - } - foreach ($attempts as $attempt) { - if (api_get_user_id() == $attempt['exe_user_id']) { - if ($attempt['exe_weighting'] != 0 ) { - $my_exercise_result_array[]= $attempt['exe_result']/$attempt['exe_weighting']; - } - } else { - if ($attempt['exe_weighting'] != 0 ) { - $exercise_result[]= $attempt['exe_result']/$attempt['exe_weighting']; - } - } - } + //var_dump($exercise_result, $my_exercise_result); - //Getting best result - rsort($my_exercise_result_array); - $my_exercise_result = 0; - if (isset($my_exercise_result_array[0])) { - $my_exercise_result = $my_exercise_result_array[0] *100; - } + $max = 100; + $pieces = 5 ; + $part = round($max / $pieces); + $x_axis = array(); + $final_array = array(); + $my_final_array = array(); - //var_dump($exercise_result, $my_exercise_result); + for ($i=1; $i <=$pieces; $i++) { + $sum = 1; + if ($i == 1) { + $sum = 0; + } + $min = ($i-1)*$part + $sum; + $max = ($i)*$part; + $x_axis[]= $min." - ".$max; + $count = 0; + foreach($exercise_result as $result) { + $percentage = $result*100; + //echo $percentage.' - '.$min.' - '.$max."
"; + if ($percentage >= $min && $percentage <= $max) { + //echo ' is > '; + $count++; + } + } + //echo '
'; + $final_array[]= $count; - $max = 100; - $pieces = 5 ; - $part = round($max / $pieces); - $x_axis = array(); - $final_array = array(); - $my_final_array = array(); + if ($my_exercise_result >= $min && $my_exercise_result <= $max) { + $my_final_array[] = 1; + } else { + $my_final_array[] = 0; + } + } - for ($i=1; $i <=$pieces; $i++) { - $sum = 1; - if ($i == 1) { - $sum = 0; - } - $min = ($i-1)*$part + $sum; - $max = ($i)*$part; - $x_axis[]= $min." - ".$max; - $count = 0; - foreach($exercise_result as $result) { - $percentage = $result*100; - //echo $percentage.' - '.$min.' - '.$max."
"; - if ($percentage >= $min && $percentage <= $max) { - //echo ' is > '; - $count++; - } - } - //echo '
'; - $final_array[]= $count; + //var_dump($my_final_array, $final_array); exit; - if ($my_exercise_result >= $min && $my_exercise_result <= $max) { - $my_final_array[] = 1; - } else { - $my_final_array[] = 0; - } - } + //Fix to remove the data of the user with my data - //var_dump($my_final_array, $final_array); exit; + for($i = 0; $i<=count($my_final_array); $i++) { + if (!empty($my_final_array[$i])) { + $my_final_array[$i] = $final_array[$i] + 1; //Add my result + $final_array[$i] = 0; + } + } + //var_dump($my_final_array, $final_array); echo '
'; - //Fix to remove the data of the user with my data + //echo '
'; var_dump($my_exercise_result, $exercise_result,$x_axis);
 
-			for($i = 0; $i<=count($my_final_array); $i++) {
-				if (!empty($my_final_array[$i])) {
-					$my_final_array[$i] =  $final_array[$i] + 1; //Add my result
-					$final_array[$i] = 0;
-				}
-			}
-			//var_dump($my_final_array, $final_array); echo '
'; + $cache = new pCache(); + + // Dataset definition + $data_set = new pData(); + $data_set->AddPoint($final_array,"Serie1"); + $data_set->AddPoint($my_final_array,"Serie2"); + //$data_set->AddPoint($x_axis,"Serie3"); + $data_set->AddAllSeries(); + + // Initialise the graph + + $main_width = 80; + $main_height = 35; + + $thumbnail_graph = new pChart($main_width, $main_height); + + $thumbnail_graph->setFontProperties(api_get_path(LIBRARY_PATH).'pchart/fonts/tahoma.ttf',8); + //$thumbnail_graph->setGraphArea(50,30,680,200); + $thumbnail_graph->drawFilledRoundedRectangle(2,2,$main_width-2,$main_height-2,2,230,230,230); + $thumbnail_graph->setGraphArea(5,5,$main_width-5,$main_height-5); + $thumbnail_graph->drawGraphArea(255,255,255); + + //SCALE_NORMAL, SCALE_START0, SCALE_ADDALLSTART0 + $thumbnail_graph->drawScale($data_set->GetData(),$data_set->GetDataDescription(),SCALE_ADDALLSTART0, 150,150,150,FALSE,0,1,TRUE); + + $thumbnail_graph->drawOverlayBarGraph($data_set->GetData(),$data_set->GetDataDescription(), 100); + + // Finish the graph + $graph_id = 'thumbnail_exercise_result_graph_'.Security::remove_XSS($_GET['course']).'-'.intval($_GET['session_id']).'-'.api_get_user_id(); + + if ($cache->IsInCache($graph_id, $data_set->GetData())) { + //if (0) { + //if we already created the img + //echo 'in cache'; + $img_file = $cache->GetHash($graph_id,$data_set->GetData()); + } else { + $cache->WriteToCache($graph_id, $data_set->GetData(), $thumbnail_graph); + ob_start(); + $thumbnail_graph->Stroke(); + ob_end_clean(); + $img_file = $cache->GetHash($graph_id, $data_set->GetData()); + } + $html = ''; + return $html; + } + + /** + * Generates a big graph with the number of best results + * @param array + */ + static function generate_exercise_result_graph($attempts) { + + 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'; + + $exercise_title = strip_tags($attempts['title']); + $attempts = $attempts['data']; + $my_exercise_result_array = $exercise_result = array(); + if (empty($attempts)) { + return null; + } + foreach ($attempts as $attempt) { + if (api_get_user_id() == $attempt['exe_user_id']) { + if ($attempt['exe_weighting'] != 0 ) { + $my_exercise_result_array[]= $attempt['exe_result']/$attempt['exe_weighting']; + } + } else { + if ($attempt['exe_weighting'] != 0 ) { + $exercise_result[]= $attempt['exe_result']/$attempt['exe_weighting']; + } + } + } - //echo '
'; var_dump($my_exercise_result, $exercise_result,$x_axis);
+        //Getting best result
+        rsort($my_exercise_result_array);
+        $my_exercise_result = 0;
+        if (isset($my_exercise_result_array[0])) {
+            $my_exercise_result = $my_exercise_result_array[0] *100;
+        }
 
-			$cache = new pCache();
+        //var_dump($exercise_result, $my_exercise_result);
 
-			// Dataset definition
-			$data_set = new pData();
-			$data_set->AddPoint($final_array,"Serie1");
-			$data_set->AddPoint($my_final_array,"Serie2");
-			$data_set->AddPoint($x_axis,"Serie3");
-			$data_set->AddAllSeries();
+        $max = 100;
+        $pieces = 5 ;
+        $part = round($max / $pieces);
+        $x_axis = array();
+        $final_array = array();
+        $my_final_array = array();
 
-			$data_set->SetAbsciseLabelSerie('Serie3');
-			$data_set->SetSerieName(get_lang('Score'),"Serie1");
-			$data_set->SetSerieName(get_lang('MyResults'),"Serie2");
+        for ($i=1; $i <=$pieces; $i++) {
+            $sum = 1;
+            if ($i == 1) {
+                $sum = 0;
+            }
+            $min = ($i-1)*$part + $sum;
+            $max = ($i)*$part;
+            $x_axis[]= $min." - ".$max;
+            $count = 0;
+            foreach($exercise_result as $result) {
+                $percentage = $result*100;
+                //echo $percentage.' - '.$min.' - '.$max."
"; + if ($percentage >= $min && $percentage <= $max) { + //echo ' is > '; + $count++; + } + } + //echo '
'; + $final_array[]= $count; - $data_set->SetXAxisName(get_lang("Score")); + if ($my_exercise_result >= $min && $my_exercise_result <= $max) { + $my_final_array[] = 1; + } else { + $my_final_array[] = 0; + } + } - // Initialise the graph - $main_width = 500; - $main_height = 250; + //var_dump($my_final_array, $final_array); exit; - $main_graph = new pChart($main_width,$main_height); + //Fix to remove the data of the user with my data - $main_graph->setFontProperties(api_get_path(LIBRARY_PATH).'pchart/fonts/tahoma.ttf',8); - $main_graph->setGraphArea(50,30, $main_width -20,$main_height -50); + for($i = 0; $i<=count($my_final_array); $i++) { + if (!empty($my_final_array[$i])) { + $my_final_array[$i] = $final_array[$i] + 1; //Add my result + $final_array[$i] = 0; + } + } + //var_dump($my_final_array, $final_array); echo '
'; - $main_graph->drawFilledRoundedRectangle(10,10, $main_width- 10,$main_height -10,5,240,240,240); - $main_graph->drawRoundedRectangle(7,7,$main_width - 7,$main_height - 7,5,230,230,230); + //echo '
'; var_dump($my_exercise_result, $exercise_result,$x_axis);
 
-			$main_graph->drawGraphArea(255,255,255,TRUE);
+        $cache = new pCache();
 
-			//SCALE_NORMAL, SCALE_START0, SCALE_ADDALLSTART0
-			$main_graph->drawScale($data_set->GetData(),$data_set->GetDataDescription(),SCALE_ADDALLSTART0, 150,150,150,TRUE,0,1,TRUE);
-			 
-			$main_graph->drawGrid(4,TRUE,230,230,230,50);
+        // Dataset definition
+        $data_set = new pData();
+        $data_set->AddPoint($final_array,"Serie1");
+        $data_set->AddPoint($my_final_array,"Serie2");
+        $data_set->AddPoint($x_axis,"Serie3");
+        $data_set->AddAllSeries();
 
-			// Draw the 0 line
-			$main_graph->setFontProperties(api_get_path(LIBRARY_PATH).'pchart/fonts/tahoma.ttf',6);
-			//  $main_graph->drawTreshold(0,143,55,72,TRUE,TRUE);
+        $data_set->SetAbsciseLabelSerie('Serie3');
+        $data_set->SetSerieName(get_lang('Score'),"Serie1");
+        $data_set->SetSerieName(get_lang('MyResults'),"Serie2");
 
-			// Draw the bar graph
-			$data_set->RemoveSerie("Serie3");
+        $data_set->SetXAxisName(get_lang("Score"));
 
-			//$main_graph->drawBarGraph($data_set->GetData(),$data_set->GetDataDescription(),TRUE);
+        // Initialise the graph
+        $main_width  = 500;
+        $main_height = 250;
 
-			//$main_graph->drawStackedBarGraph($data_set->GetData(),$data_set->GetDataDescription(),TRUE);
-			$main_graph->drawOverlayBarGraph($data_set->GetData(),$data_set->GetDataDescription(), 100);
+        $main_graph = new pChart($main_width,$main_height);
 
-			// Finish the graph
-			$main_graph->setFontProperties(api_get_path(LIBRARY_PATH).'pchart/fonts/tahoma.ttf',8);
-			$main_graph->drawLegend($main_width - 120,$main_height -100,$data_set->GetDataDescription(),255,255,255);
-			$main_graph->setFontProperties(api_get_path(LIBRARY_PATH).'pchart/fonts/tahoma.ttf',8);
-			$main_graph->drawTitle(180,22,$exercise_title,50,50,50);
-			$graph_id = 'exercise_result_graph'.Security::remove_XSS($_GET['course']).'-'.intval($_GET['session_id']).'-'.api_get_user_id();
-			if ($cache->IsInCache($graph_id, $data_set->GetData())) {
-				//if (0) {
-				//if we already created the img
-				//echo 'in cache';
-				$img_file = $cache->GetHash($graph_id,$data_set->GetData());
-			} else {
-				$cache->WriteToCache($graph_id, $data_set->GetData(), $main_graph);
-				ob_start();
-				$main_graph->Stroke();
-				ob_end_clean();
-				$img_file = $cache->GetHash($graph_id, $data_set->GetData());
-			}
-			$html = '';
-			return $html;
-		}
+        $main_graph->setFontProperties(api_get_path(LIBRARY_PATH).'pchart/fonts/tahoma.ttf',8);
+        $main_graph->setGraphArea(50,30, $main_width -20,$main_height -50);
+
+        $main_graph->drawFilledRoundedRectangle(10,10, $main_width- 10,$main_height -10,5,240,240,240);
+        $main_graph->drawRoundedRectangle(7,7,$main_width - 7,$main_height  - 7,5,230,230,230);
+
+        $main_graph->drawGraphArea(255,255,255,TRUE);
+
+        //SCALE_NORMAL, SCALE_START0, SCALE_ADDALLSTART0
+        $main_graph->drawScale($data_set->GetData(),$data_set->GetDataDescription(),SCALE_ADDALLSTART0, 150,150,150,TRUE,0,1,TRUE);
+
+        $main_graph->drawGrid(4,TRUE,230,230,230,50);
+
+        // Draw the 0 line
+        $main_graph->setFontProperties(api_get_path(LIBRARY_PATH).'pchart/fonts/tahoma.ttf',6);
+        //  $main_graph->drawTreshold(0,143,55,72,TRUE,TRUE);
+
+        // Draw the bar graph
+        $data_set->RemoveSerie("Serie3");
+
+        //$main_graph->drawBarGraph($data_set->GetData(),$data_set->GetDataDescription(),TRUE);
+
+        //$main_graph->drawStackedBarGraph($data_set->GetData(),$data_set->GetDataDescription(),TRUE);
+        $main_graph->drawOverlayBarGraph($data_set->GetData(),$data_set->GetDataDescription(), 100);
+
+        // Finish the graph
+        $main_graph->setFontProperties(api_get_path(LIBRARY_PATH).'pchart/fonts/tahoma.ttf',8);
+        $main_graph->drawLegend($main_width - 120,$main_height -100,$data_set->GetDataDescription(),255,255,255);
+        $main_graph->setFontProperties(api_get_path(LIBRARY_PATH).'pchart/fonts/tahoma.ttf',8);
+        $main_graph->drawTitle(180,22,$exercise_title,50,50,50);
+        $graph_id = 'exercise_result_graph'.Security::remove_XSS($_GET['course']).'-'.intval($_GET['session_id']).'-'.api_get_user_id();
+        if ($cache->IsInCache($graph_id, $data_set->GetData())) {
+            //if (0) {
+            //if we already created the img
+            //echo 'in cache';
+            $img_file = $cache->GetHash($graph_id,$data_set->GetData());
+        } else {
+            $cache->WriteToCache($graph_id, $data_set->GetData(), $main_graph);
+            ob_start();
+            $main_graph->Stroke();
+            ob_end_clean();
+            $img_file = $cache->GetHash($graph_id, $data_set->GetData());
+        }
+        $html = '';
+        return $html;
+    }
 }
 /**
  * @package chamilo.tracking