':'').'';
} else {
return api_format_date($last_login_date, DATE_FORMAT_SHORT);
}
}
}
return false;
}
/**
* Get count courses per student
* @param int Student id
* @param bool Include sessions (optional)
* @return int count courses
*/
public static function count_course_per_student($user_id, $include_sessions = true) {
$user_id = intval($user_id);
$tbl_course_rel_user = Database :: get_main_table(TABLE_MAIN_COURSE_USER);
$tbl_session_course_rel_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
$sql = 'SELECT DISTINCT course_code
FROM ' . $tbl_course_rel_user . '
WHERE user_id = ' . $user_id.' AND relation_type<>'.COURSE_RELATION_TYPE_RRHH;
$rs = Database::query($sql);
$nb_courses = Database::num_rows($rs);
if ($include_sessions) {
$sql = 'SELECT DISTINCT course_code
FROM ' . $tbl_session_course_rel_user . '
WHERE id_user = ' . $user_id;
$rs = Database::query($sql);
$nb_courses += Database::num_rows($rs);
}
return $nb_courses;
}
/**
* This function gets the score average from all tests in a course by student
* @param int|array Student(s) id
* @param string Course code
* @param int Exercise id (optional), filtered by exercise
* @param int Session id (optional), if param $session_id is null it'll return results including sessions, 0 = session is not filtered
* @return string value (number %) Which represents a round integer about the score average.
*/
public static function get_avg_student_exercise_score($student_id, $course_code, $exercise_id = 0, $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['db_name'])) {
// table definition
$tbl_course_quiz = Database::get_course_table(TABLE_QUIZ_TEST,$a_course['db_name']);
$tbl_stats_exercise = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
// Compose a filter based on optional exercise given
$condition_quiz = "";
if(!empty($exercise_id)) {
$exercise_id = intval($exercise_id);
$condition_quiz =" AND id = $exercise_id ";
}
// Compose a filter based on optional session id given
$condition_session = "";
if (isset($session_id)) {
$session_id = intval($session_id);
$condition_session = " AND session_id = $session_id ";
}
$count_quiz = Database::fetch_row(Database::query("SELECT count(id) FROM $tbl_course_quiz WHERE active <> -1 $condition_quiz $condition_session"));
$quiz_avg_total_score = 0;
if (!empty($count_quiz[0]) && !empty($student_id)) {
$condition_user = "";
if (is_array($student_id)) {
$condition_user = " AND exe_user_id IN (".implode(',',$student_id).") ";
} else {
$condition_user = " AND exe_user_id = '$student_id' ";
}
$sql = "SELECT SUM(exe_result/exe_weighting*100) as avg_score
FROM $tbl_stats_exercise
WHERE exe_exo_id IN (SELECT id FROM $tbl_course_quiz WHERE active <> -1 $condition_quiz $condition_session)
$condition_user
AND orig_lp_id = 0
AND exe_cours_id = '$course_code'
AND orig_lp_item_id = 0
ORDER BY exe_date DESC";
$res = Database::query($sql);
$row = Database::fetch_array($res);
$quiz_avg_score = 0;
if (!empty($row['avg_score'])) {
$quiz_avg_score = round($row['avg_score'],2);
}
$count_attempt = Database::fetch_row(Database::query("SELECT count(*) FROM $tbl_stats_exercise WHERE exe_exo_id IN (SELECT id FROM $tbl_course_quiz WHERE active <> -1 $condition_quiz $condition_session) $condition_user AND orig_lp_id = 0 AND exe_cours_id = '$course_code' AND orig_lp_item_id = 0 ORDER BY exe_date DESC"));
if(!empty($count_attempt[0])) {
$quiz_avg_score = $quiz_avg_score / $count_attempt[0];
}
$quiz_avg_total_score = $quiz_avg_score;
return round($quiz_avg_total_score/$count_quiz[0],2);
}
}
return null;
}
/**
* Get count student's exercise attempts
* @param int Student id
* @param string Course code
* @param int Exercise id
* @param int Learning path id (optional), for showing attempts inside a learning path $lp_id and $lp_item_id params are required.
* @param int Learning path item id (optional), for showing attempts inside a learning path $lp_id and $lp_item_id params are required.
* @return int count of attempts
*/
public function count_student_exercise_attempts($student_id, $course_code, $exercise_id, $lp_id = 0, $lp_item_id = 0) {
$course_code = Database::escape_string($course_code);
$course_info = CourseManager :: get_course_information($course_code);
$student_id = intval($student_id);
$exercise_id = intval($exercise_id);
$count_attempts = 0;
if (!empty($lp_id)) $lp_id = intval($lp_id);
if (!empty($lp_item_id)) $lp_id = intval($lp_item_id);
if (!empty($course_info['db_name'])) {
$tbl_stats_exercices = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES, $course_info['db_name']);
$sql = "SELECT COUNT(ex.exe_id) as essais
FROM $tbl_stats_exercices AS ex
WHERE ex.exe_cours_id = '$course_code'
AND ex.exe_exo_id = $exercise_id
AND orig_lp_id = $lp_id
AND orig_lp_item_id = $lp_item_id
AND exe_user_id= $student_id ";
$rs = Database::query($sql);
$row = Database::fetch_row($rs);
$count_attempts = $row[0];
}
return $count_attempts;
}
/**
* Returns the average student progress in the learning paths of the given
* 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 parameter $session_id is null(default) it'll return results including sessions, 0 = session is not filtered
* @return double Average progress of the user in this course
*/
public static function get_avg_student_progress($student_id, $course_code, $lp_ids = array(), $session_id = null) {
// get the informations of the course
$a_course = CourseManager :: get_course_information($course_code);
if (!empty($a_course['db_name'])) {
// table definition
$tbl_course_lp_view = Database :: get_course_table(TABLE_LP_VIEW, $a_course['db_name']);
$tbl_course_lp = Database :: get_course_table(TABLE_LP_MAIN, $a_course['db_name']);
// Compose a filter based on optional learning paths list given
$condition_lp = "";
if(count($lp_ids) > 0) {
$condition_lp =" WHERE id IN(".implode(',',$lp_ids).") ";
}
// Compose a filter based on optional session id
$condition_session = "";
if (isset($session_id)) {
$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 ";
}
}
$res_count_lp = Database::query("SELECT id FROM $tbl_course_lp lp $condition_lp $condition_session");
// count the number of learning paths
$count_lp = Database::num_rows($res_count_lp);
$lp_id = array();
while ($row_lp = Database::fetch_array($res_count_lp)) {
$lp_id[] = $row_lp[0];
}
$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)) {
$$r = 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 $condition_user ".
"lp_view.lp_id IN (".implode(',',$lp_id).") ".
"GROUP BY lp_id, user_id";
$res_maxes = Database::query($sql_maxes);
$sum = $number_items = 0;
while ($row_maxes = Database::fetch_array($res_maxes)) {
$sum += $row_maxes[1];
$number_items++;
}
if ($number_items == 0) {
return 0; //not necessary to return something else if there is no view
}
// average progress = total sum divided by the number of views
// summed up.
$avg_progress = round($sum / $number_items, 1);
return $avg_progress;
}
}
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.
* This function does not take the results of a Test out of a LP
*
* @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 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) {
// get global tables names
$course_table = Database :: get_main_table(TABLE_MAIN_COURSE);
$course_user_table = Database :: get_main_table(TABLE_MAIN_COURSE_USER);
$table_session_course_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
$tbl_stats_exercices = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
$tbl_stats_attempts= Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
$course = CourseManager :: get_course_information($course_code);
if (!empty($course['db_name'])) {
// get course tables names
$tbl_quiz_questions= Database :: get_course_table(TABLE_QUIZ_QUESTION,$course['db_name']);
$lp_table = Database :: get_course_table(TABLE_LP_MAIN,$course['db_name']);
$lp_item_table = Database :: get_course_table(TABLE_LP_ITEM,$course['db_name']);
$lp_view_table = Database :: get_course_table(TABLE_LP_VIEW,$course['db_name']);
$lp_item_view_table = Database :: get_course_table(TABLE_LP_ITEM_VIEW,$course['db_name']);
// Compose a filter based on optional learning paths list given
$condition_lp = "";
if(count($lp_ids) > 0) {
$condition_lp =" WHERE id IN(".implode(',',$lp_ids).") ";
}
// Compose a filter based on optional session id
$condition_session = "";
if (isset($session_id)) {
$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 ";
}
}
// 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");
$count_row_lp = Database::num_rows($res_row_lp);
$lp_list = array();
while ($row_lp = Database::fetch_array($res_row_lp)) {
$lp_list[] = $row_lp[0];
}
// Init local variables that will be used through the calculation
$lp_scorm_score_total = 0;
$lp_scorm_result_score_total = 0;
$lp_scorm_loop=0;
$lp_count = 0;
$progress = 0;
// 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' ";
}
if ($count_row_lp>0 && !empty($student_id)) {
// Get all views through learning paths filter
$sql = "SELECT MAX(view_count) as vc, id, progress, lp_id, user_id ".
"FROM $lp_view_table ".
"WHERE lp_id IN (".implode(',',$lp_list).") ".
"$condition_user1 GROUP BY lp_id,user_id";
$rs_last_lp_view_id = Database::query($sql);
$count_views = 0;
$score_of_scorm_calculate = 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)) {
$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'];
// 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.score as score,lp_i.max_score, 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_i.item_type='sco' ".
" OR lp_i.item_type='".TOOL_QUIZ."') ".
" WHERE lp_view_id='$lp_view_id'";
$res_max_score = Database::query($sql_max_score);
$count_total_loop = 0;
$num_rows_max_score = Database::num_rows($res_max_score);
// Go through each scorable element of this view
$count_items = 0;
while ($row_max_score = Database::fetch_array($res_max_score)) {
$max_score = $row_max_score['max_score'];
$score = $row_max_score['score'];
if ($row_max_score['item_type'] == 'sco') {
// 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) {
$max_score = 100;
}
$lp_scorm_result_score_total += ($score/$max_score);
$current_value = $score/$max_score;
} else {
// Case of a TOOL_QUIZ element
$item_id = $row_max_score['iid'];
$item_path = $row_max_score['path'];
// 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_id = '$lp_id' ". //lp_id is already defined by the item_id
" AND orig_lp_item_id = '$item_id' ".
" AND exe_cours_id = '$course_code' ".
" ORDER BY exe_date DESC limit 1";
$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);
// 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' ) AS t";
$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'];
}
$lp_scorm_result_score_total = ($score/$max_score);
$current_value = $score/$max_score;
} else {
//$lp_scorm_result_score_total += 0;
}
}
$count_items++;
}
$score_of_scorm_calculate += $count_items?round((($lp_scorm_result_score_total/$count_items)*100),2):0;
$count_views++;
}
}
if ( $count_views > 0 ) {
$score_of_scorm_calculate = round(($score_of_scorm_calculate/$count_views),2);
}
return $score_of_scorm_calculate;
}
}
return null;
}
/**
* 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['db_name'])) {
$lp_table = Database :: get_course_table(TABLE_LP_MAIN, $course['db_name']);
$t_lpv = Database :: get_course_table(TABLE_LP_VIEW, $course['db_name']);
$t_lpiv = Database :: get_course_table(TABLE_LP_ITEM_VIEW, $course['db_name']);
// Compose a filter based on optional learning paths list given
$condition_lp = "";
if(count($lp_ids) > 0) {
$condition_lp =" WHERE id IN(".implode(',',$lp_ids).") ";
}
// Compose a filter based on optional session id
$condition_session = "";
if (isset($session_id)) {
$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 ";
}
}
// 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");
$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
AND view.lp_id = '.$lp_id.'
AND view.user_id = '.$student_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) {
$course = CourseManager :: get_course_information($course_code);
$student_id = intval($student_id);
$lp_id = intval($lp_id);
$last_time = 0;
if (!empty($course['db_name'])) {
$lp_table = Database :: get_course_table(TABLE_LP_MAIN, $course['db_name']);
$t_lpv = Database :: get_course_table(TABLE_LP_VIEW, $course['db_name']);
$t_lpiv = Database :: get_course_table(TABLE_LP_ITEM_VIEW, $course['db_name']);
// 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 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
AND view.lp_id = '.$lp_id.'
AND view.user_id = '.$student_id;
$rs = Database::query($sql);
if (Database :: num_rows($rs) > 0) {
$last_time = Database :: result($rs, 0, 0);
}
}
}
return $last_time;
}
/**
* 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']==true) {
$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;
}
}
$result = Database::query($sql);
while ($a_courses = Database::fetch_array($result)) {
$course_code = $a_courses["course_code"];
$id_session = $a_courses["id_session"];
$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'";
$rs = Database::query($sql);
while ($row = Database::fetch_array($rs)) {
$a_students[$row['id_user']] = $row['id_user'];
}
}
//////////////////////////////////////////////////////////////
// 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']==true) {
$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;
}
}
$result = Database::query($sql);
while ($row = Database::fetch_array($result)) {
$a_students[$row['id_user']] = $row['id_user'];
}
return $a_students;
}
/**
* 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) {
$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 = Database :: get_main_table(TABLE_MAIN_SESSION);
$a_students = array ();
//////////////////////////////////////////////////////////////
// At first, courses where $coach_id is coach of the course //
//////////////////////////////////////////////////////////////
$sql = 'SELECT course_code FROM ' . $tbl_session_course_user . ' WHERE id_session="' . $id_session . '" AND id_user=' . $coach_id.' AND status=2';
$result = Database::query($sql);
while ($a_courses = Database::fetch_array($result)) {
$course_code = $a_courses["course_code"];
$sql = "SELECT distinct srcru.id_user
FROM $tbl_session_course_user AS srcru
WHERE course_code='$course_code' and id_session = '" . $id_session . "'";
$rs = Database::query($sql);
while ($row = Database::fetch_array($rs)) {
$a_students[$row['id_user']] = $row['id_user'];
}
}
//////////////////////////////////////////////////////////////
// Then, courses where $coach_id is coach of the session //
//////////////////////////////////////////////////////////////
$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;
}
/**
* 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 . ' AS session_course_user
INNER JOIN ' . $tbl_session_course . ' AS session_course
ON session_course.course_code = session_course_user.course_code
AND id_coach=' . $coach_id . '
WHERE id_user=' . $student_id;*/
$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 //
//////////////////////////////////////////////////////////////
$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;
}
/**
* 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']==true) {
$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'];
}
//////////////////////////////////////////////////////////////
// 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']==true) {
$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']==true)
$sql .= ' AND access_url_id = '.$access_url_id;
} else {
if ($_configuration['multiple_access_urls']==true)
$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'];
}
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']==true) {
$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;
}
// 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']==true) {
$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;
}
/**
* 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;
$rs = Database::query($sql);
$a_courses = array ();
while ($row = Database::fetch_array($rs)) {
$a_courses[$row['course_code']] = $row;
}
return $a_courses;
}
/**
* 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) {
require_once (api_get_path(LIBRARY_PATH) . 'course.lib.php');
// 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['db_name'])) {
// table definition
$tbl_item_property = Database :: get_course_table(TABLE_ITEM_PROPERTY, $a_course['db_name']);
$tbl_student_publication = Database :: get_course_table(TABLE_STUDENT_PUBLICATION, $a_course['db_name']);
$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 ";
}
$sql = "SELECT count(ip.tool) FROM $tbl_item_property ip INNER JOIN $tbl_student_publication pub ON ip.ref = pub.id WHERE ip.tool='work' $condition_user $condition_session ";
$rs = Database::query($sql);
$row = Database::fetch_row($rs);
return $row[0];
}
return null;
}
/**
* 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
*/
function count_student_messages($student_id, $course_code, $session_id = null) {
require_once (api_get_path(LIBRARY_PATH) . 'course.lib.php');
// protect datas
$student_id = intval($student_id);
$course_code = addslashes($course_code);
// get the informations of the course
$a_course = CourseManager :: get_course_information($course_code);
if(!empty($a_course['db_name']))
{
// table definition
$tbl_forum_post = Database :: get_course_table(TABLE_FORUM_POST, $a_course['db_name']);
$tbl_forum = Database :: get_course_table(TABLE_FORUM, $a_course['db_name']);
$condition_user = "";
if (is_array($student_id)) {
$condition_user = " WHERE post.poster_id IN (".implode(',',$student_id).") ";
} else {
$condition_user = " WHERE post.poster_id = '$student_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 $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['db_name'])) {
$tbl_posts = Database :: get_course_table(TABLE_FORUM_POST, $a_course['db_name']);
$tbl_forums = Database :: get_course_table(TABLE_FORUM, $a_course['db_name']);
$condition_session = '';
if (isset($session_id)) {
$session_id = intval($session_id);
$condition_session = ' WHERE f.session_id = '. $session_id;
}
$sql = "SELECT count(*) FROM $tbl_posts p INNER JOIN $tbl_forums f ON f.forum_id = p.forum_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 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) {
//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['db_name'])) {
$tbl_threads = Database :: get_course_table(TABLE_FORUM_THREAD, $a_course['db_name']);
$tbl_forums = Database :: get_course_table(TABLE_FORUM, $a_course['db_name']);
$condition_session = '';
if (isset($session_id)) {
$session_id = intval($session_id);
$condition_session = ' WHERE f.session_id = '. $session_id;
}
$sql = "SELECT count(*) FROM $tbl_threads t INNER JOIN $tbl_forums f ON f.forum_id = t.forum_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 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) {
//protect data
$course_code = addslashes($course_code);
// get the informations of the course
$a_course = CourseManager :: get_course_information($course_code);
$count = 0;
if (!empty($a_course['db_name'])) {
$condition_session = '';
if (isset($session_id)) {
$session_id = intval($session_id);
$condition_session = ' WHERE session_id = '. $session_id;
}
$tbl_forums = Database :: get_course_table(TABLE_FORUM, $a_course['db_name']);
$sql = "SELECT count(*) FROM $tbl_forums $condition_session";
$result = Database::query($sql);
$row = Database::fetch_row($result);
$count = $row[0];
return $count;
} else {
return null;
}
}
/**
* 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) {
//protect data
$last_days = intval($last_days);
$course_code = Database::escape_string($course_code);
$session_id = intval($session_id);
// get the informations of the course
$a_course = CourseManager :: get_course_information($course_code);
$count = 0;
if (!empty($a_course['db_name'])) {
$tbl_stats_access = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_ACCESS, $a_course['db_name']);
$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);
$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 = '';
// 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 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.' ';
$rs = Database::query($sql);
return 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);
}
/**
* 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 = api_sql_query($sql);
$inactive_users = array();
while($user = Database::fetch_array($rs))
{
$inactive_users[] = $user['user_id'];
}
return $inactive_users;
}
/**
* 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);
$nb_login = Database::num_rows($rs);
return $nb_login;
}
/**
* 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) {
$hr_dept_id = intval($hr_dept_id);
$a_students = array ();
$tbl_organism = Database :: get_main_table(TABLE_MAIN_ORGANISM);
$tbl_user = Database :: get_main_table(TABLE_MAIN_USER);
$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'];
}
return $a_students;
}
/**
* allow get 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 .'2rightarrow.gif)
| ".get_lang('LoginsTitleMonthColumn')." | ".get_lang('LoginsTitleCountColumn')." |
| ".$MonthsLong[date('n', $results[$j][0])-1].' '.date('Y', $results[$j][0])." | "; echo "".$results[$j][1]." | "; echo"
| ".get_lang('Total')." | "; echo "".$total." | "; echo"
| ".get_lang('ExercicesTitleExerciceColumn')." | ".get_lang('Date')." | ".get_lang('ExercicesTitleScoreColumn')." |
| ".$results[$i][0]." | \n"; echo "".$display_date." | \n"; echo "".$results[$i][1]." / ".$results[$i][2]." | \n"; echo "
| / |
| ".get_lang('WorkTitle')." | ".get_lang('WorkAuthors')." | ".get_lang('Date')." |
| " ."".$results[$j][1]."" ." | "; echo "".$results[$j][2]." | "; echo "".$beautifulDate." | "; echo"
| ".get_lang('LinksTitleLinkColumn')." |
| ".$results[$j][0]." | "; echo"
| ".get_lang('DocumentsTitleDocumentColumn')." |
| ".$results[$j]." | "; echo"