diff --git a/main/admin/user_edit.php b/main/admin/user_edit.php index a9a6b9f4ae..3c565e2374 100755 --- a/main/admin/user_edit.php +++ b/main/admin/user_edit.php @@ -514,6 +514,15 @@ if ($form->validate()) { } } + // It updates course relation type as EX-LEARNER if project name (extra field from user_edition_extra_field_to_check) is changed + if (false !== api_get_configuration_value('user_edition_extra_field_to_check')) { + $extraToCheck = api_get_configuration_value('user_edition_extra_field_to_check'); + if (isset($user['extra_'.$extraToCheck])) { + $extraValueToCheck = $user['extra_'.$extraToCheck]; + UserManager::updateCourseRelationTypeExLearner($user_id, $extraValueToCheck); + } + } + $extraFieldValue = new ExtraFieldValue('user'); $extraFieldValue->saveFieldValues($user); $userInfo = api_get_user_info($user_id); diff --git a/main/inc/lib/api.lib.php b/main/inc/lib/api.lib.php index bb18c42fa4..2a55c44826 100644 --- a/main/inc/lib/api.lib.php +++ b/main/inc/lib/api.lib.php @@ -47,6 +47,7 @@ define('COURSE_TUTOR', 16); // student is tutor of a course (NOT in session) define('STUDENT_BOSS', 17); // student is boss define('INVITEE', 20); define('HRM_REQUEST', 21); //HRM has request for vinculation with user +define('COURSE_EXLEARNER', 22); // Table of status $_status_list[COURSEMANAGER] = 'teacher'; // 1 diff --git a/main/inc/lib/course.lib.php b/main/inc/lib/course.lib.php index 3fb3d7c660..e1a771cb2e 100755 --- a/main/inc/lib/course.lib.php +++ b/main/inc/lib/course.lib.php @@ -4055,6 +4055,11 @@ class CourseManager } } + $exlearnerCondition = ""; + if (false !== api_get_configuration_value('user_edition_extra_field_to_check')) { + $exlearnerCondition = " AND course_rel_user.relation_type NOT IN(".COURSE_EXLEARNER.")"; + } + $sql = "SELECT DISTINCT course.id, course_rel_user.status status, @@ -4071,6 +4076,7 @@ class CourseManager $userCategoryCondition $without_special_courses $languageCondition + $exlearnerCondition "; // If multiple URL access mode is enabled, only fetch courses // corresponding to the current URL. diff --git a/main/inc/lib/usermanager.lib.php b/main/inc/lib/usermanager.lib.php index eeaefc58e6..10608fb097 100755 --- a/main/inc/lib/usermanager.lib.php +++ b/main/inc/lib/usermanager.lib.php @@ -3992,6 +3992,11 @@ class UserManager } } + $exlearnerCondition = ""; + if (false !== api_get_configuration_value('user_edition_extra_field_to_check')) { + $exlearnerCondition = " AND scu.status NOT IN(".COURSE_EXLEARNER.")"; + } + /* This query is very similar to the query below, but it will check the session_rel_course_user table if there are courses registered to our user or not */ @@ -4012,6 +4017,7 @@ class UserManager scu.user_id = $user_id AND scu.session_id = $session_id $where_access_url + $exlearnerCondition ORDER BY sc.position ASC"; $myCourseList = []; @@ -4055,6 +4061,7 @@ class UserManager s.id_coach = $user_id ) $where_access_url + $exlearnerCondition ORDER BY sc.position ASC"; $result = Database::query($sql); @@ -6062,6 +6069,146 @@ class UserManager return true; } + /** + * It updates course relation type as EX-LEARNER if project name (extra field from user_edition_extra_field_to_check) is changed. + * + * @param $userId + * @param $extraValue + * + * @throws \Doctrine\DBAL\Exception + */ + public static function updateCourseRelationTypeExLearner($userId, $extraValue) + { + if (false !== api_get_configuration_value('user_edition_extra_field_to_check')) { + $extraToCheck = api_get_configuration_value('user_edition_extra_field_to_check'); + + // Get the old user extra value to check + $userExtra = UserManager::get_extra_user_data_by_field($userId, $extraToCheck); + if (isset($userExtra[$extraToCheck]) && $userExtra[$extraToCheck] != $extraValue) { + // it searchs the courses with the user old extravalue + $extraFieldValues = new ExtraFieldValue('course'); + $extraItems = $extraFieldValues->get_item_id_from_field_variable_and_field_value($extraToCheck, $userExtra[$extraToCheck], false, false, true); + $coursesTocheck = []; + if (!empty($extraItems)) { + foreach ($extraItems as $items) { + $coursesTocheck[] = $items['item_id']; + } + } + + // To check in main course + if (!empty($coursesTocheck)) { + $tblCourseUser = Database::get_main_table(TABLE_MAIN_COURSE_USER); + foreach ($coursesTocheck as $courseId) { + $sql = "SELECT id FROM $tblCourseUser + WHERE user_id = $userId AND c_id = $courseId"; + $rs = Database::query($sql); + if (Database::num_rows($rs) > 0) { + $id = Database::result($rs, 0, 0); + $sql = "UPDATE $tblCourseUser SET relation_type = ".COURSE_EXLEARNER." + WHERE id = $id"; + Database::query($sql); + } + } + } + + // To check in sessions + if (!empty($coursesTocheck)) { + $tblSessionCourseUser = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER); + $tblSessionUser = Database::get_main_table(TABLE_MAIN_SESSION_USER); + $sessionsToCheck = []; + foreach ($coursesTocheck as $courseId) { + $sql = "SELECT id, session_id FROM $tblSessionCourseUser + WHERE user_id = $userId AND c_id = $courseId"; + $rs = Database::query($sql); + if (Database::num_rows($rs) > 0) { + $row = Database::fetch_array($rs); + $id = $row['id']; + $sessionId = $row['session_id']; + $sql = "UPDATE $tblSessionCourseUser SET status = ".COURSE_EXLEARNER." + WHERE id = $id"; + Database::query($sql); + $sessionsToCheck[] = $sessionId; + } + } + // It checks if user is ex-learner in all courses in the session to update the session relation type + if (!empty($sessionsToCheck)) { + $sessionsToCheck = array_unique($sessionsToCheck); + foreach ($sessionsToCheck as $sessionId) { + $checkAll = Database::query("SELECT count(id) FROM $tblSessionCourseUser WHERE user_id = $userId AND session_id = $sessionId"); + $countAll = Database::result($checkAll, 0, 0); + $checkExLearner = Database::query("SELECT count(id) FROM $tblSessionCourseUser WHERE status = ".COURSE_EXLEARNER." AND user_id = $userId AND session_id = $sessionId"); + $countExLearner = Database::result($checkExLearner, 0, 0); + if ($countAll > 0 && $countAll == $countExLearner) { + $sql = "UPDATE $tblSessionUser SET relation_type = ".COURSE_EXLEARNER." + WHERE user_id = $userId AND session_id = $sessionId"; + Database::query($sql); + } + } + } + } + // To check users inside a class + $tblUserGroupRelUser = Database::get_main_table(TABLE_USERGROUP_REL_USER); + $tblUserGroupRelCourse = Database::get_main_table(TABLE_USERGROUP_REL_COURSE); + $tblUserGroupRelSession = Database::get_main_table(TABLE_USERGROUP_REL_SESSION); + + $rsUser = Database::query("SELECT usergroup_id FROM $tblUserGroupRelUser WHERE user_id = $userId"); + if (Database::num_rows($rsUser) > 0) { + while ($rowUser = Database::fetch_array($rsUser)) { + $usergroupId = $rowUser['usergroup_id']; + + // Count courses with exlearners + $sqlC1 = "SELECT count(id) FROM $tblUserGroupRelCourse WHERE usergroup_id = $usergroupId"; + $rsCourses = Database::query($sqlC1); + $countGroupCourses = Database::result($rsCourses, 0, 0); + + $sqlC2 = "SELECT count(cu.id) + FROM $tblCourseUser cu + INNER JOIN $tblUserGroupRelCourse gc + ON gc.course_id = cu.c_id + WHERE + cu.user_id = $userId AND + usergroup_id = $usergroupId AND + relation_type = ".COURSE_EXLEARNER; + $rsExCourses = Database::query($sqlC2); + $countExCourses = Database::result($rsExCourses, 0, 0); + $checkedExCourses = $countGroupCourses > 0 && ($countExCourses == $countGroupCourses); + + // Count sessions with exlearners + $sqlS1 = "SELECT count(id) FROM $tblUserGroupRelSession WHERE usergroup_id = $usergroupId"; + $rsSessions = Database::query($sqlS1); + $countGroupSessions = Database::result($rsSessions, 0, 0); + + $sqlS2 = "SELECT count(su.id) + FROM $tblSessionUser su + INNER JOIN $tblUserGroupRelSession gs + ON gs.session_id = su.session_id + WHERE + su.user_id = $userId AND + usergroup_id = $usergroupId AND + relation_type = ".COURSE_EXLEARNER; + $rsExSessions = Database::query($sqlS2); + $countExSessions = Database::result($rsExSessions, 0, 0); + $checkedExSessions = $countGroupSessions > 0 && ($countExSessions == $countGroupSessions); + + // it checks if usergroup user should be set to EXLEARNER + $checkedExClassLearner = false; + if ($countGroupCourses > 0 && $countGroupSessions == 0) { + $checkedExClassLearner = $checkedExCourses; + } elseif ($countGroupCourses == 0 && $countGroupSessions > 0) { + $checkedExClassLearner = $checkedExSessions; + } elseif ($countGroupCourses > 0 && $countGroupSessions > 0) { + $checkedExClassLearner = ($checkedExCourses && $checkedExSessions); + } + + if ($checkedExClassLearner) { + Database::query("UPDATE $tblUserGroupRelUser SET relation_type = ".COURSE_EXLEARNER." WHERE user_id = $userId AND usergroup_id = $usergroupId"); + } + } + } + } + } + } + /** * Subscribe boss to students, if $bossList is empty then the boss list will be empty too. * diff --git a/main/install/configuration.dist.php b/main/install/configuration.dist.php index 77fd1edf77..b5a598f7e1 100755 --- a/main/install/configuration.dist.php +++ b/main/install/configuration.dist.php @@ -2147,6 +2147,9 @@ INSERT INTO `extra_field` (`extra_field_type`, `field_type`, `variable`, `displa // Hides the icon of percentage in "Average of tests in Learning Paths" indication on a student tracking // $_configuration['student_follow_page_hide_lp_tests_average'] = false; +// User extra fields to be check on user edition to generate a specific process if it was modified +//$_configuration['user_edition_extra_field_to_check'] = 'ExtrafieldLabel'; + // KEEP THIS AT THE END // -------- Custom DB changes // Add user activation by confirmation email diff --git a/main/tracking/courseLog.php b/main/tracking/courseLog.php index 85c08bc7e6..91133f178a 100755 --- a/main/tracking/courseLog.php +++ b/main/tracking/courseLog.php @@ -404,6 +404,22 @@ if ($nbStudents > 0) { $select->addOptGroup($groupIdList, get_lang('Group')); $formClass->addButtonSearch(get_lang('Search')); + // Filter by ex learners + if (false !== api_get_configuration_value('user_edition_extra_field_to_check')) { + $formExLearners = new FormValidator( + 'form_exlearners', + 'get', + api_get_self().'?'.api_get_cidreq().'&'.$additionalParams + ); + $group = []; + $group[] = $formExLearners->createElement('radio', 'opt_exlearner', 'id="opt_exlearner1"', get_lang('Yes'), 1); + $group[] = $formExLearners->createElement('radio', 'opt_exlearner', 'id="opt_exlearner0"', get_lang('No'), 0); + $formExLearners->addGroup($group, 'exlearner', get_lang('ToHideExlearners')); + $formExLearners->addHidden('cidReq', $courseCode); + $formExLearners->addHidden('id_session', $sessionId); + $formExLearners->addButtonSearch(get_lang('Search')); + } + // Groups /*$formGroup = new FormValidator( 'groups', @@ -499,6 +515,25 @@ if ($nbStudents > 0) { $conditions = ['where' => $whereCondition, 'inject_joins' => $joins]; } } + if (false !== api_get_configuration_value('user_edition_extra_field_to_check')) { + if ($formExLearners->validate()) { + $formValue = $formExLearners->getSubmitValue('exlearner'); + if (isset($formValue['opt_exlearner']) && 1 == $formValue['opt_exlearner']) { + $sessionId = api_get_session_id(); + if (!empty($sessionId)) { + $tableSessionCourseUser = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER); + $joins = " INNER JOIN $tableSessionCourseUser scu ON scu.user_id = user.id "; + $whereCondition = " AND scu.status != ".COURSE_EXLEARNER." AND scu.c_id = '".api_get_course_int_id()."' AND scu.session_id = $sessionId"; + $conditions = ['where' => $whereCondition, 'inject_joins' => $joins]; + } else { + $tableCourseUser = Database::get_main_table(TABLE_MAIN_COURSE_USER); + $joins = " INNER JOIN $tableCourseUser cu ON cu.user_id = user.id "; + $whereCondition = " AND cu.relation_type != ".COURSE_EXLEARNER." AND cu.c_id = '".api_get_course_int_id()."'"; + $conditions = ['where' => $whereCondition, 'inject_joins' => $joins]; + } + } + } + } if ($formActiveUsers->validate()) { $formValue = $formActiveUsers->getSubmitValue('active'); @@ -611,6 +646,9 @@ if ($nbStudents > 0) { $mainForm->addHtml(''); $html .= $mainForm->returnForm(); diff --git a/tests/scripts/set_course_user_as_exlearner.php b/tests/scripts/set_course_user_as_exlearner.php new file mode 100644 index 0000000000..2a019da194 --- /dev/null +++ b/tests/scripts/set_course_user_as_exlearner.php @@ -0,0 +1,90 @@ + 0) { + while ($row = Database::fetch_array($rs, 'ASSOC')) { + $userId = $row['id']; + $userExtra = UserManager::get_extra_user_data_by_field($userId, $extraToCheck); + if (isset($userExtra[$extraToCheck])) { + echo "
Checking user_id : $userId the extrafield $extraToCheck with value {$userExtra[$extraToCheck]}:
" . PHP_EOL; + // It gets the courses with the same extra value + $extraFieldValues = new ExtraFieldValue('course'); + $extraItems = $extraFieldValues->get_item_id_from_field_variable_and_field_value($extraToCheck, $userExtra[$extraToCheck], false, false, true); + $coursesTocheck = []; + if (!empty($extraItems)) { + foreach ($extraItems as $items) { + $coursesTocheck[] = $items['item_id']; + } + } + // To check in main course + if (!empty($coursesTocheck)) { + $tblCourseUser = Database::get_main_table(TABLE_MAIN_COURSE_USER); + $sql1 = "SELECT id FROM $tblCourseUser + WHERE user_id = $userId AND c_id NOT IN(".implode(',', $coursesTocheck).")"; + $rs1 = Database::query($sql1); + if (Database::num_rows($rs1) > 0) { + while ($row1 = Database::fetch_array($rs1, 'ASSOC')) { + $id = $row1['id']; + $upd1 = "UPDATE $tblCourseUser SET relation_type = ".COURSE_EXLEARNER." + WHERE id = $id"; + Database::query($upd1); + } + } + } + // To check in sessions + if (!empty($coursesTocheck)) { + $tblSessionCourseUser = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER); + $tblSessionUser = Database::get_main_table(TABLE_MAIN_SESSION_USER); + $sessionsToCheck = []; + $sql2 = "SELECT id, session_id FROM $tblSessionCourseUser + WHERE user_id = $userId AND c_id NOT IN(".implode(',', $coursesTocheck).")"; + $rs2 = Database::query($sql2); + if (Database::num_rows($rs2) > 0) { + while ($row2 = Database::fetch_array($rs2, 'ASSOC')) { + $id = $row2['id']; + $sessionId = $row2['session_id']; + $upd2 = "UPDATE $tblSessionCourseUser SET status = ".COURSE_EXLEARNER." + WHERE id = $id"; + Database::query($upd2); + $sessionsToCheck[] = $sessionId; + } + } + // It checks if user is ex-learner in all courses in the session to update the session relation type + if (!empty($sessionsToCheck)) { + $sessionsToCheck = array_unique($sessionsToCheck); + foreach ($sessionsToCheck as $sessionId) { + $checkAll = Database::query("SELECT count(id) FROM $tblSessionCourseUser WHERE user_id = $userId AND session_id = $sessionId"); + $countAll = Database::result($checkAll, 0, 0); + $checkExLearner = Database::query("SELECT count(id) FROM $tblSessionCourseUser WHERE status = ".COURSE_EXLEARNER." AND user_id = $userId AND session_id = $sessionId"); + $countExLearner = Database::result($checkExLearner, 0, 0); + if ($countAll > 0 && $countAll == $countExLearner) { + $upd3 = "UPDATE $tblSessionUser SET relation_type = ".COURSE_EXLEARNER." + WHERE user_id = $userId AND session_id = $sessionId"; + Database::query($upd3); + } + } + } + // @todo To check users inside a class + } + } + } +}