From 03aeb0bea968aee8cf08151df40205490f9c4a01 Mon Sep 17 00:00:00 2001 From: Julio Date: Fri, 28 Sep 2018 07:56:02 +0200 Subject: [PATCH] Add new page to subscribe new users to a session-course directly page: add_users_to_session_course.php See BT#14882 --- main/inc/lib/sessionmanager.lib.php | 188 ++-- main/session/add_users_to_session_course.php | 913 +++++++++++++++++++ main/session/resume_session.php | 4 +- 3 files changed, 1020 insertions(+), 85 deletions(-) create mode 100644 main/session/add_users_to_session_course.php diff --git a/main/inc/lib/sessionmanager.lib.php b/main/inc/lib/sessionmanager.lib.php index 8e5058f1d5..b6c59c1337 100755 --- a/main/inc/lib/sessionmanager.lib.php +++ b/main/inc/lib/sessionmanager.lib.php @@ -1865,6 +1865,7 @@ class SessionManager * @param array $userList * @param int $session_visibility * @param bool $empty_users + * @param bool $registerUsersToAllCourses * * @return bool */ @@ -1872,7 +1873,8 @@ class SessionManager $sessionId, $userList, $session_visibility = SESSION_VISIBLE_READ_ONLY, - $empty_users = true + $empty_users = true, + $registerUsersToAllCourses = true ) { if ($sessionId != strval(intval($sessionId))) { return false; @@ -1981,96 +1983,98 @@ class SessionManager } } - foreach ($course_list as $courseId) { - // for each course in the session - $nbr_users = 0; - $courseId = (int) $courseId; - - $sql = "SELECT DISTINCT user_id - FROM $tbl_session_rel_course_rel_user - WHERE - session_id = $sessionId AND - c_id = $courseId AND - status = 0 - "; - $result = Database::query($sql); - $existingUsers = []; - while ($row = Database::fetch_array($result)) { - $existingUsers[] = $row['user_id']; - } - - // Delete existing users - if ($empty_users) { - foreach ($existingUsers as $existing_user) { - if (!in_array($existing_user, $userList)) { - $sql = "DELETE FROM $tbl_session_rel_course_rel_user - WHERE - session_id = $sessionId AND - c_id = $courseId AND - user_id = $existing_user AND - status = 0 "; - $result = Database::query($sql); - - Event::addEvent( - LOG_SESSION_DELETE_USER_COURSE, - LOG_USER_ID, - $existing_user, - api_get_utc_datetime(), - api_get_user_id(), - $courseId, - $sessionId - ); + if ($registerUsersToAllCourses) { + foreach ($course_list as $courseId) { + // for each course in the session + $nbr_users = 0; + $courseId = (int)$courseId; - if (Database::affected_rows($result)) { - $nbr_users--; - } - } + $sql = "SELECT DISTINCT user_id + FROM $tbl_session_rel_course_rel_user + WHERE + session_id = $sessionId AND + c_id = $courseId AND + status = 0 + "; + $result = Database::query($sql); + $existingUsers = []; + while ($row = Database::fetch_array($result)) { + $existingUsers[] = $row['user_id']; } - } - // Replace with this new function - // insert new users into session_rel_course_rel_user and ignore if they already exist - foreach ($userList as $enreg_user) { - if (!in_array($enreg_user, $existingUsers)) { - $status = self::get_user_status_in_course_session( - $enreg_user, - $courseId, - $sessionId - ); + // Delete existing users + if ($empty_users) { + foreach ($existingUsers as $existing_user) { + if (!in_array($existing_user, $userList)) { + $sql = "DELETE FROM $tbl_session_rel_course_rel_user + WHERE + session_id = $sessionId AND + c_id = $courseId AND + user_id = $existing_user AND + status = 0 "; + $result = Database::query($sql); + + Event::addEvent( + LOG_SESSION_DELETE_USER_COURSE, + LOG_USER_ID, + $existing_user, + api_get_utc_datetime(), + api_get_user_id(), + $courseId, + $sessionId + ); - // Avoid duplicate entries. - if ($status === false || ($status !== false && $status != 0)) { - $enreg_user = (int) $enreg_user; - $sql = "INSERT IGNORE INTO $tbl_session_rel_course_rel_user (session_id, c_id, user_id, visibility, status) - VALUES($sessionId, $courseId, $enreg_user, $session_visibility, 0)"; - $result = Database::query($sql); - if (Database::affected_rows($result)) { - $nbr_users++; + if (Database::affected_rows($result)) { + $nbr_users--; + } } + } + } - Event::addEvent( - LOG_SESSION_ADD_USER_COURSE, - LOG_USER_ID, + // Replace with this new function + // insert new users into session_rel_course_rel_user and ignore if they already exist + foreach ($userList as $enreg_user) { + if (!in_array($enreg_user, $existingUsers)) { + $status = self::get_user_status_in_course_session( $enreg_user, - api_get_utc_datetime(), - api_get_user_id(), $courseId, $sessionId ); + + // Avoid duplicate entries. + if ($status === false || ($status !== false && $status != 0)) { + $enreg_user = (int)$enreg_user; + $sql = "INSERT IGNORE INTO $tbl_session_rel_course_rel_user (session_id, c_id, user_id, visibility, status) + VALUES($sessionId, $courseId, $enreg_user, $session_visibility, 0)"; + $result = Database::query($sql); + if (Database::affected_rows($result)) { + $nbr_users++; + } + + Event::addEvent( + LOG_SESSION_ADD_USER_COURSE, + LOG_USER_ID, + $enreg_user, + api_get_utc_datetime(), + api_get_user_id(), + $courseId, + $sessionId + ); + } } } - } - // Count users in this session-course relation - $sql = "SELECT COUNT(user_id) as nbUsers - FROM $tbl_session_rel_course_rel_user - WHERE session_id = $sessionId AND c_id = $courseId AND status<>2"; - $rs = Database::query($sql); - list($nbr_users) = Database::fetch_array($rs); - // update the session-course relation to add the users total - $sql = "UPDATE $tbl_session_rel_course SET nbr_users = $nbr_users - WHERE session_id = $sessionId AND c_id = $courseId"; - Database::query($sql); + // Count users in this session-course relation + $sql = "SELECT COUNT(user_id) as nbUsers + FROM $tbl_session_rel_course_rel_user + WHERE session_id = $sessionId AND c_id = $courseId AND status<>2"; + $rs = Database::query($sql); + list($nbr_users) = Database::fetch_array($rs); + // update the session-course relation to add the users total + $sql = "UPDATE $tbl_session_rel_course SET nbr_users = $nbr_users + WHERE session_id = $sessionId AND c_id = $courseId"; + Database::query($sql); + } } // Delete users from the session @@ -2124,9 +2128,16 @@ class SessionManager WHERE id = $sessionId "; Database::query($sql); } else { - $sql = "UPDATE $tbl_session SET nbr_users = nbr_users + $nbr_users - WHERE id = $sessionId"; - Database::query($sql); + if ($registerUsersToAllCourses) { + $sql = "UPDATE $tbl_session SET nbr_users = nbr_users + $nbr_users + WHERE id = $sessionId"; + Database::query($sql); + } else { + $sql = "UPDATE $tbl_session + SET nbr_users = (SELECT count(user_id) FROM $tbl_session_rel_user WHERE session_id = $sessionId) + WHERE id = $sessionId"; + Database::query($sql); + } } } @@ -7143,11 +7154,12 @@ SQL; /** * Get the count of user courses in session. * - * @param int $sessionId The session id + * @param int $sessionId + * @param int $courseId * * @return array */ - public static function getTotalUserCoursesInSession($sessionId) + public static function getTotalUserCoursesInSession($sessionId, $courseId = 0) { $tableUser = Database::get_main_table(TABLE_MAIN_USER); $table = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER); @@ -7156,6 +7168,12 @@ SQL; return []; } + $courseCondition = ''; + if (!empty($courseId)) { + $courseId = (int) $courseId; + $courseCondition = " c_id = $courseId AND "; + } + $sql = "SELECT COUNT(u.id) as count, u.id, @@ -7164,7 +7182,9 @@ SQL; FROM $table scu INNER JOIN $tableUser u ON scu.user_id = u.id - WHERE scu.session_id = ".intval($sessionId)." + WHERE + $courseCondition + scu.session_id = ".intval($sessionId)." GROUP BY u.id"; $result = Database::query($sql); diff --git a/main/session/add_users_to_session_course.php b/main/session/add_users_to_session_course.php new file mode 100644 index 0000000000..107b48b1fe --- /dev/null +++ b/main/session/add_users_to_session_course.php @@ -0,0 +1,913 @@ +registerFunction('search_users'); + +// setting the section (for the tabs) +$this_section = SECTION_PLATFORM_ADMIN; + +$id_session = (int) $_GET['id_session']; +$courseId = isset($_GET['course_id']) ? (int) $_GET['course_id'] : 0; + +if (empty($id_session) || empty($courseId)) { + api_not_allowed(true); +} + +$addProcess = isset($_GET['add']) ? Security::remove_XSS($_GET['add']) : null; + +SessionManager::protectSession($id_session); + +$courseInfo = api_get_course_info_by_id($courseId); + +// setting breadcrumbs +$interbreadcrumb[] = ['url' => 'session_list.php', 'name' => get_lang('SessionList')]; +$interbreadcrumb[] = [ + 'url' => "resume_session.php?id_session=".$id_session, + 'name' => get_lang('SessionOverview'), +]; + +// Database Table Definitions +$tbl_session = Database::get_main_table(TABLE_MAIN_SESSION); +$tbl_course = Database::get_main_table(TABLE_MAIN_COURSE); +$tbl_user = Database::get_main_table(TABLE_MAIN_USER); +$tbl_session_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_USER); +$tableRelSessionCourseUser = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER); + +// setting the name of the tool +$tool_name = get_lang('SubscribeUsersToSession'); +$add_type = 'unique'; +if (isset($_REQUEST['add_type']) && $_REQUEST['add_type'] != '') { + $add_type = Security::remove_XSS($_REQUEST['add_type']); +} + +$page = isset($_GET['page']) ? Security::remove_XSS($_GET['page']) : null; + +// Checking for extra field with filter on + +$extra_field_list = UserManager::get_extra_fields(); + +$new_field_list = []; +if (is_array($extra_field_list)) { + foreach ($extra_field_list as $extra_field) { + //if is enabled to filter and is a "'; + while ($user = Database:: fetch_array($rs)) { + $person_name = + $user['lastname'].' '.$user['firstname'].' ('.$user['username'].') '.$user['official_code']; + if ($showOfficialCode) { + $officialCode = !empty($user['official_code']) ? $user['official_code'].' - ' : '? - '; + $person_name = $officialCode.$user['lastname'].' '.$user['firstname'].' ('.$user['username'].')'; + } + $return .= ''; + } + $return .= ''; + $xajax_response->addAssign('ajax_list_users_multiple', 'innerHTML', api_utf8_encode($return)); + } + } + + return $xajax_response; +} + +$xajax->processRequests(); +$htmlHeadXtra[] = $xajax->getJavascript('../inc/lib/xajax/'); +$htmlHeadXtra[] = ' +'; + +$form_sent = 0; +$errorMsg = $firstLetterUser = $firstLetterSession = ''; +$UserList = $SessionList = []; +$sessions = []; +if (isset($_POST['form_sent']) && $_POST['form_sent']) { + $form_sent = $_POST['form_sent']; + $firstLetterUser = isset($_POST['firstLetterUser']) ? $_POST['firstLetterUser'] : ''; + $firstLetterSession = isset($_POST['firstLetterSession']) ? $_POST['firstLetterSession'] : ''; + $UserList = isset($_POST['sessionUsersList']) ? $_POST['sessionUsersList'] : []; + + if (!is_array($UserList)) { + $UserList = []; + } + + if ($form_sent == 1) { + // Added a parameter to send emails when registering a user + SessionManager::subscribeUsersToSession( + $id_session, + $UserList, + null, + false, + false + ); + + SessionManager::subscribe_users_to_session_course( + $UserList, + $id_session, + $courseInfo['code'] + ); + + Display::addFlash(Display::return_message(get_lang('Updated'))); + header('Location: resume_session.php?id_session='.$id_session); + exit; + } +} + +$session_info = SessionManager::fetch($id_session); +Display::display_header($tool_name); + +$nosessionUsersList = $sessionUsersList = []; +$where_filter = null; +$ajax_search = $add_type == 'unique' ? true : false; + +//$order_clause = api_sort_by_first_name() ? ' ORDER BY firstname, lastname, username' : ' ORDER BY lastname, firstname, username'; +// On this screen, it doesn't make sense to order users by firstname. Always use lastname first +// api_get_person_name() calls have been removed because ordering users in a simple list must always +// be done by lastname, even if we like to show user names with the firstname first. +// By simple logic, lastnames are the smallest common denominator +$order_clause = ' ORDER BY lastname, firstname, username'; + +$showOfficialCode = false; +$orderListByOfficialCode = api_get_setting('order_user_list_by_official_code'); +if ($orderListByOfficialCode === 'true') { + $showOfficialCode = true; + $order_clause = ' ORDER BY official_code, lastname, firstname, username'; +} + +if ($ajax_search) { + $sql = " + SELECT u.id, u.lastname, u.firstname, u.username, su.session_id, u.official_code + FROM $tbl_session_rel_user su + INNER JOIN $tableRelSessionCourseUser sc + ON (sc.session_id = su.session_id AND su.user_id = sc.user_id) + INNER JOIN $tbl_user u + ON su.user_id = u.id + WHERE + su.session_id = ".intval($id_session)." AND + su.relation_type <> ".SESSION_RELATION_TYPE_RRHH." AND + sc.c_id = $courseId AND + u.status<>".DRH." AND + u.status <> 6 + $order_clause + "; + + if (api_is_multiple_url_enabled()) { + $tbl_user_rel_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER); + $access_url_id = api_get_current_access_url_id(); + if ($access_url_id != -1) { + $sql = " + SELECT u.id, u.lastname, u.firstname, u.username, su.session_id, u.official_code + FROM $tbl_user u + INNER JOIN $tbl_session_rel_user su + ON su.user_id = u.id + AND su.relation_type <> ".SESSION_RELATION_TYPE_RRHH." + AND su.session_id = ".intval($id_session)." + INNER JOIN $tbl_user_rel_access_url url_user + ON (url_user.user_id = u.id) + INNER JOIN $tableRelSessionCourseUser sc + ON (sc.session_id = su.session_id AND su.user_id = sc.user_id) + WHERE access_url_id = $access_url_id + sc.c_id = $courseId AND + AND u.status <> ".DRH." + AND u.status <> 6 + $order_clause + "; + } + } + $result = Database::query($sql); + $users = Database::store_result($result); + foreach ($users as $user) { + $sessionUsersList[$user['id']] = $user; + } + + $sessionUserInfo = SessionManager::getTotalUserCoursesInSession($id_session, $courseId); + // Filter the user list in all courses in the session + foreach ($sessionUserInfo as $sessionUser) { + // filter students in session + if ($sessionUser['status_in_session'] != 0) { + continue; + } + + if (!array_key_exists($sessionUser['id'], $sessionUsersList)) { + continue; + } + } + + unset($users); //clean to free memory +} else { + // Filter by Extra Fields + $extra_field_result = []; + $use_extra_fields = false; + if (is_array($extra_field_list)) { + if (is_array($new_field_list) && count($new_field_list) > 0) { + $result_list = []; + foreach ($new_field_list as $new_field) { + $varname = 'field_'.$new_field['variable']; + $fieldtype = $new_field['type']; + if (UserManager::is_extra_field_available($new_field['variable'])) { + if (isset($_POST[$varname]) && $_POST[$varname] != '0') { + $use_extra_fields = true; + if ($fieldtype == ExtraField::FIELD_TYPE_TAG) { + $extra_field_result[] = UserManager::get_extra_user_data_by_tags( + intval($_POST['field_id']), + $_POST[$varname] + ); + } else { + $extra_field_result[] = UserManager::get_extra_user_data_by_value( + $new_field['variable'], + $_POST[$varname] + ); + } + } + } + } + } + } + + if ($use_extra_fields) { + $final_result = []; + if (count($extra_field_result) > 1) { + for ($i = 0; $i < count($extra_field_result) - 1; $i++) { + if (is_array($extra_field_result[$i + 1])) { + $final_result = array_intersect( + $extra_field_result[$i], + $extra_field_result[$i + 1] + ); + } + } + } else { + $final_result = $extra_field_result[0]; + } + + if (api_is_multiple_url_enabled()) { + if (is_array($final_result) && count($final_result) > 0) { + $where_filter = " AND u.id IN ('".implode("','", $final_result)."') "; + } else { + //no results + $where_filter = " AND u.id = -1"; + } + } else { + if (is_array($final_result) && count($final_result) > 0) { + $where_filter = " WHERE u.id IN ('".implode("','", $final_result)."') "; + } else { + //no results + $where_filter = " WHERE u.id = -1"; + } + } + } + if (api_is_session_admin() && api_get_setting('prevent_session_admins_to_manage_all_users') === 'true') { + $order_clause = " AND u.creator_id = ".api_get_user_id().$order_clause; + } + if ($use_extra_fields) { + $sql = " + SELECT u.id, lastname, firstname, username, su.session_id, official_code + FROM $tbl_user u + LEFT JOIN $tbl_session_rel_user su + ON su.user_id = u.id + AND su.session_id = $id_session + AND su.relation_type <> ".SESSION_RELATION_TYPE_RRHH." + INNER JOIN $tableRelSessionCourseUser sc + ON (sc.session_id = su.session_id AND su.user_id = sc.user_id) + $where_filter + AND u.status <> ".DRH." + AND u.status <> 6 + AND sc.c_id = $courseId + $order_clause + "; + } else { + $sql = " + SELECT u.id, lastname, firstname, username, su.session_id, official_code + FROM $tbl_user u + LEFT JOIN $tbl_session_rel_user su + ON su.user_id = u.id + AND su.session_id = $id_session + AND su.relation_type <> ".SESSION_RELATION_TYPE_RRHH." + WHERE + u.status <> ".DRH." AND + u.status <> 6 + $order_clause + "; + } + if (api_is_multiple_url_enabled()) { + $tbl_user_rel_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER); + $access_url_id = api_get_current_access_url_id(); + if ($access_url_id != -1) { + $sql = " + SELECT u.id, lastname, firstname, username, su.session_id, official_code + FROM $tbl_user u + LEFT JOIN $tbl_session_rel_user su + ON su.user_id = u.id + AND su.session_id = $id_session + AND su.relation_type <> ".SESSION_RELATION_TYPE_RRHH." + INNER JOIN $tbl_user_rel_access_url url_user + ON (url_user.user_id = u.id) + + WHERE + access_url_id = $access_url_id + $where_filter + AND u.status <> ".DRH." + AND u.status<>6 + $order_clause + "; + } + } + + $result = Database::query($sql); + $users = Database::store_result($result, 'ASSOC'); + foreach ($users as $uid => $user) { + if ($user['session_id'] != $id_session) { + $nosessionUsersList[$user['id']] = [ + 'fn' => $user['firstname'], + 'ln' => $user['lastname'], + 'un' => $user['username'], + 'official_code' => $user['official_code'], + ]; + unset($users[$uid]); + } + } + unset($users); //clean to free memory + + // filling the correct users in list + $sql = " + SELECT u.id, lastname, firstname, username, su.session_id, official_code + FROM $tbl_user u + LEFT JOIN $tbl_session_rel_user su + ON su.user_id = u.id + AND su.session_id = $id_session + AND su.relation_type <> ".SESSION_RELATION_TYPE_RRHH." + INNER JOIN $tableRelSessionCourseUser sc + ON (sc.session_id = su.session_id AND su.user_id = sc.user_id) + WHERE + sc.c_id = $courseId AND + u.status <> ".DRH." AND u.status <> 6 + $order_clause + "; + + if (api_is_multiple_url_enabled()) { + $tbl_user_rel_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER); + $access_url_id = api_get_current_access_url_id(); + if ($access_url_id != -1) { + $sql = " + SELECT u.id, lastname, firstname, username, su.session_id, official_code + FROM $tbl_user u + LEFT JOIN $tbl_session_rel_user su + ON su.user_id = u.id + AND su.session_id = $id_session + AND su.relation_type <> ".SESSION_RELATION_TYPE_RRHH." + INNER JOIN $tbl_user_rel_access_url url_user + ON (url_user.user_id = u.id) + INNER JOIN $tableRelSessionCourseUser sc + ON (sc.session_id = su.session_id AND su.user_id = sc.user_id) + WHERE + sc.c_id = $courseId AND + access_url_id = $access_url_id + AND u.status <> ".DRH." + AND u.status <> 6 + $order_clause + "; + } + } + + $result = Database::query($sql); + $users = Database::store_result($result, 'ASSOC'); + foreach ($users as $uid => $user) { + if ($user['session_id'] == $id_session) { + $sessionUsersList[$user['id']] = $user; + if (array_key_exists($user['id'], $nosessionUsersList)) { + unset($nosessionUsersList[$user['id']]); + } + } + unset($users[$uid]); + } + unset($users); //clean to free memory +} + +if ($add_type == 'multiple') { + $link_add_type_unique = + ''. + Display::return_icon('single.gif').get_lang('SessionAddTypeUnique').''; + $link_add_type_multiple = Display::url(Display::return_icon('multiple.gif').get_lang('SessionAddTypeMultiple'), ''); +} else { + $link_add_type_unique = Display::url(Display::return_icon('single.gif').get_lang('SessionAddTypeUnique'), ''); + $link_add_type_multiple = + '' + .Display::return_icon('multiple.gif').get_lang('SessionAddTypeMultiple').''; +} + +?> +
+ +
+
> + '.$tool_name.' ('.$session_info['name'].') - '.$courseInfo['title'].' '; ?> + 0) { + echo '

'.get_lang('FilterUsers').'

'; + foreach ($new_field_list as $new_field) { + echo $new_field['name']; + $varname = 'field_'.$new_field['variable']; + $fieldtype = $new_field['type']; + echo ' '; + $extraHidden = + $fieldtype == ExtraField::FIELD_TYPE_TAG ? '' : ''; + echo $extraHidden; + echo '  '; + } + echo ''; + echo '

'; + } + } + } + ?> + + + + +
+
+
+ + + +
+ +
+ +
+ +
+
+ +
+ + : + +
+
+ +
+ +
+ +
+ +
+ +
+
+ +
+ + ' + .get_lang('FinishSessionCreation').''; + } else { + echo ''; + } + ?> +
+
+ +
+ + +
+
+
+ +getNbrCourses() === 0) { api_get_path(WEB_CODE_PATH).'admin/skill_rel_course.php?session_id='.$sessionId.'&course_id='.$course->getId() ); } - $courseItem .= $orderButtons; + + $courseItem .= ''. + Display::return_icon('new_user.png', get_lang('AddUsers'), ['style' => 'width:22px'], ICON_SIZE_MEDIUM).''; $courseItem .= ''. Display::return_icon('user.png', get_lang('Users'), '', ICON_SIZE_SMALL).''; $courseItem .= ''.