$attempt = trim($fields[3]); } else { $attempt = 1; } if (isset($module_list[$module])) { $require_insert = true; if (isset($students[$sid]['modules'][$module])) { foreach ($students[$sid]['modules'][$module] as $individual_attempt) { if ($individual_attempt == $attempt) { $require_insert = false; } } } if ($require_insert) { if (isset($students[$sid]['dbID'])) { $success = UserUtils::add_student_to_module($students[$sid]['dbID'], $module_list[$module], $attempt, $session, $mysqli); if ($success) { $modulesAdded++; } } else { $missing_users[$sid]['module'][] = $module; } } } else { $unknow_ModuleID[] = $module; } } } } unlink($configObject->get('cfg_tmpdir') . $userObject->get_user_ID() . "_cohort_update.csv"); echo "<table>\n";
/** * Enrole the student on a module. * * @param $idMod moduleID of module * @param $attempt * @param $session session of module * @param int $auto_update if system add * * @return bool return true if successful. */ public function add_student_to_module($idMod, $attempt, $session, $auto_update = 0) { // need to check its a self reg module if (module_utils::get_full_details_by_ID($idMod, $this->db) === false) { return false; } if (UserUtils::is_user_on_module($this, $idMod, $session, $this->db)) { //don't add a user to a module multiple times return true; } $return = UserUtils::add_student_to_module($this->get_user_ID(), $idMod, $attempt, $session, $auto_update); $this->load_student_modules(); return $return; }
} else { echo "<div class=\"r1\" id=\"divmod" . $id . "_" . $loop . "\"><input type=\"checkbox\" onclick=\"toggle('divmod" . $id . "_" . $loop . "')\" name=\"mod" . $id . "_" . $loop . "\" id=\"mod" . $id . "_" . $loop . "\" value=\"" . $idMod . "\" /> <label for=\"mod" . $id . "_" . $loop . "\">{$moduleid}: {$fullname}</label></div>\n"; } $loop++; $old_letter = strtoupper(substr($moduleid, 0, 1)); } echo "</div>\n</div>\n"; } if (isset($_POST['submit'])) { for ($attempt = 1; $attempt <= 3; $attempt++) { // Clear the student of all modules. UserUtils::clear_student_modules_by_userID($_POST['userID'], $_POST['session'], $attempt, $mysqli); // Insert a record for each module. for ($i = 0; $i <= $_POST['mod_count']; $i++) { if (isset($_POST['mod' . $attempt . '_' . $i]) and $_POST['mod' . $attempt . '_' . $i] != '') { UserUtils::add_student_to_module($_POST['userID'], $_POST['mod' . $attempt . '_' . $i], $attempt, $_POST['session'], $mysqli, 0); } } } ?> <!DOCTYPE html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="content-type" content="text/html;charset=<?php echo $configObject->get('cfg_page_charset'); ?> " /> <title>Rogō: <?php echo $_POST['session'] . ' ' . $string['modules'];
function update_module_enrolement($module, $idMod, $sms_api, $mysqli = 'NOTSET', $session = 'NOTSET', $demomode = false) { // run module enrolement for select code if ($mysqli == 'NOTSET') { global $mysqli; } if ($session == 'NOTSET') { $session = date_utils::get_current_academic_year(); } $session_parts = explode('/', $session); $enrolements = 0; $deletions = 0; $enrolement_details = ''; $deletion_details = ''; // UoN code to strip off prefix codes. //------------------------------------ $replaced_module = str_replace('_UNMC', '', $module); $replaced_module = str_replace('_UNNC', '', $replaced_module); //------------------------------------ // Get the currently enrolled students in Rogo for the module. $current_users = array(); $student_data = $mysqli->prepare("SELECT modules_student.id, users.id, username, grade, title, surname, first_names, initials, roles, yearofstudy, auto_update, sid.student_id FROM (modules_student, users) LEFT JOIN sid ON users.id = sid.userID WHERE modules_student.userID = users.id AND calendar_year = ? AND idMod = ?"); $student_data->bind_param('si', $session, $idMod); $student_data->execute(); $student_data->store_result(); $student_data->bind_result($sm_id, $uid, $username, $grade, $title, $surname, $first_names, $initials, $roles, $year, $auto_update, $student_id); while ($student_data->fetch()) { $current_users[$username]['delete'] = $auto_update; // Set users to be deleted if added via SATURN, set otherwise lower down after checking with SMS $current_users[$username]['smID'] = $sm_id; $current_users[$username]['userID'] = $uid; $current_users[$username]['grade'] = $grade; $current_users[$username]['title'] = $title; $current_users[$username]['surname'] = $surname; $current_users[$username]['first_names'] = $first_names; $current_users[$username]['initials'] = $initials; $current_users[$username]['roles'] = $roles; $current_users[$username]['year'] = $year; $current_users[$username]['auto_update'] = $auto_update; $current_users[$username]['student_id'] = $student_id; } $student_data->close(); $c_u = $current_users; // Look up SMS $returned_data = @file_get_contents($sms_api . "&code={$replaced_module}&year=" . $session_parts[0]); $xml = false; if ($returned_data !== false) { $xml = new SimpleXMLElement($returned_data); } if (is_object($xml) and !isset($xml->ErrorMessage) and !isset($xml->Module->ModuleError)) { foreach ($xml->Module->Membership->Student as $sms) { $sms->Title = trim($sms->Title); $sms->Surname = trim($sms->Surname); $sms->Forename = trim($sms->Forename); $sms->CourseCode = trim($sms->CourseCode); $sms->Username = trim($sms->Username); $sms->Email = trim($sms->Email); $sms->Gender = trim($sms->Gender); $sms->YearofStudy = trim($sms->YearofStudy); $sms->StudentID = trim($sms->StudentID); $lookup_username = trim($sms->Username); // Make sure we have a proper username - it can sometimes be blank in SATURN data if ($sms->Email != '') { // Try to extract from email address $un_parts = explode('@', $sms->Email); $lookup_username = $un_parts[0]; } if ($lookup_username != '') { if (isset($current_users[$lookup_username]['delete'])) { $current_users[$lookup_username]['delete'] = 0; // Mark as being legitimate } else { // Student missing from Rogo module $student_data = $mysqli->prepare("SELECT id, yearofstudy, initials, grade, title, surname, first_names, roles, email, COALESCE(sid.student_id,'SID_ERROR') FROM users LEFT JOIN sid ON users.id = sid.userID WHERE username = ? LIMIT 1"); // Do they have a Rogo user record? $student_data->bind_param('s', $lookup_username); $student_data->execute(); $student_data->store_result(); $student_data->bind_result($tmp_userID, $tmp_yearofstudy, $tmp_initials, $tmp_grade, $tmp_title, $tmp_surname, $tmp_first_names, $tmp_roles, $tmp_email, $tmp_student_id); $student_data->fetch(); if ($student_data->num_rows == 0) { // Going to have to create a whole new account for the user $names = explode(' ', $sms->Forename); $initials = ''; foreach ($names as $tmp_name) { $initials .= $tmp_name[0]; } if (!$demomode) { $tmp_userID = UserUtils::create_user($lookup_username, '', $sms->Title, $sms->Forename, $sms->Surname, $sms->Email, $sms->CourseCode, $sms->Gender, $sms->YearofStudy, 'Student', $sms->StudentID, $mysqli); if ($tmp_userID == false) { echo 'ERROR: unable to establish surname for ' . $lookup_username . '<br />'; continue; } } $current_users[$lookup_username]['userID'] = $tmp_userID; $current_users[$lookup_username]['grade'] = $sms->CourseCode; $current_users[$lookup_username]['title'] = $sms->Title; $current_users[$lookup_username]['surname'] = $sms->Surname; $current_users[$lookup_username]['first_names'] = $tmp_first_names; $current_users[$lookup_username]['initials'] = $initials; $current_users[$lookup_username]['roles'] = 'Student'; $current_users[$lookup_username]['email'] = $sms->Email; $current_users[$lookup_username]['year'] = $sms->YearofStudy; $current_users[$lookup_username]['student_id'] = $sms->StudentID; $current_users[$lookup_username]['delete'] = 0; } else { $current_users[$lookup_username]['userID'] = $tmp_userID; $current_users[$lookup_username]['grade'] = $tmp_grade; $current_users[$lookup_username]['title'] = $tmp_title; $current_users[$lookup_username]['surname'] = $tmp_surname; $current_users[$lookup_username]['first_names'] = $tmp_first_names; $current_users[$lookup_username]['initials'] = $tmp_initials; $current_users[$lookup_username]['roles'] = $tmp_roles; $current_users[$lookup_username]['email'] = $tmp_email; $current_users[$lookup_username]['year'] = $tmp_yearofstudy; $current_users[$lookup_username]['student_id'] = $tmp_student_id; $current_users[$lookup_username]['delete'] = 0; } // Add student onto the module $auto_update = 1; //set auto_update to student module association if (!$demomode) { $success = UserUtils::add_student_to_module($tmp_userID, $idMod, 1, $session, $mysqli, $auto_update); } if ($success) { $enrolements++; if ($enrolement_details == '') { $enrolement_details = $lookup_username; } else { $enrolement_details .= ',' . $lookup_username; } } $student_data->close(); } // Check to see if any details of the user account need updating. if (strtoupper(substr($sms->ReasonForLeaving, 0, 3)) == 'W/D') { $new_roles = 'left'; } elseif (stripos($sms->ReasonForLeaving, 'not permitted to progress') !== false) { $new_roles = 'left'; } elseif ($sms->ReasonForLeaving == 'Successfully completed course') { $new_roles = 'graduate'; } else { $new_roles = $current_users[$lookup_username]['roles']; // Keep the roles same as they were. if ($new_roles != 'left' and $new_roles != 'graduate' and strpos($new_roles, 'Student') === false) { $new_roles .= ',Student'; // Add in 'student' role if missing. } } $names = explode(' ', $sms->Forename); $tmp_initials = ''; foreach ($names as $tmp_name) { if (isset($tmp_name[0])) { $tmp_initials .= $tmp_name[0]; } } if ($current_users[$lookup_username]['year'] != $sms->YearofStudy or $tmp_initials != $current_users[$lookup_username]['initials'] or $current_users[$lookup_username]['grade'] != $sms->CourseCode or $current_users[$lookup_username]['title'] != $sms->Title or $current_users[$lookup_username]['surname'] != $sms->Surname or $current_users[$lookup_username]['first_names'] != $sms->Forename or $current_users[$lookup_username]['roles'] != $new_roles or isset($current_users[$lookup_username]['email']) and $current_users[$lookup_username]['email'] != $sms->Email) { $result = $mysqli->prepare("UPDATE users SET yearofstudy = ?, roles = ?, grade = ?, title = ?, surname = ?, first_names = ?, initials = ?, email = ? WHERE username = ?"); $result->bind_param('issssssss', $sms->YearofStudy, $new_roles, $sms->CourseCode, $sms->Title, $sms->Surname, $sms->Forename, $tmp_initials, $sms->Email, $lookup_username); if (!$demomode) { $result->execute(); } $result->close(); } // Check if SID needs updating - rare but could happen if ($current_users[$lookup_username]['student_id'] != $sms->StudentID) { if ($current_users[$lookup_username]['student_id'] == 'SID_ERROR') { $result = $mysqli->prepare("INSERT INTO sid VALUES (?, ?)"); $result->bind_param('si', $sms->StudentID, $current_users[$lookup_username]['userID']); $result->execute(); $result->close(); } else { $result = $mysqli->prepare("UPDATE sid SET student_id = ? WHERE userID = ?"); $result->bind_param('si', $sms->StudentID, $current_users[$lookup_username]['userID']); $result->execute(); $result->close(); } } } else { echo 'ERROR: unable to establish username for ' . $sms->Title . ' ' . $sms->Surname . ', ' . $sms->Forename . ' (' . $sms->StudentID . ')<br />'; } } // Check for any extra students in Rogo but not in SATURN for module foreach ($current_users as $username => $individual_user) { if ($individual_user['delete'] == 1 and $individual_user['auto_update'] == 1) { $result = $mysqli->prepare("DELETE FROM modules_student WHERE id = ?"); // Delete using primary key of 'modules_student' $result->bind_param('i', $individual_user['smID']); if (!$demomode) { $result->execute(); } $result->close(); $deletions++; if ($deletion_details == '') { $deletion_details = $username; } else { $deletion_details .= ',' . $username; } } } } $import_type = ''; if ($enrolements > 0 or $deletions > 0) { if ($sms_api == 'http://saturn-exports.nottingham.ac.uk/touchstone.ashx?campus=malaysia') { $import_type = 'SATURN Malaysia'; } elseif ($sms_api == 'http://saturn-exports.nottingham.ac.uk/touchstone.ashx?campus=china') { $import_type = 'SATURN China'; } else { $import_type = 'SATURN UK'; } $result = $mysqli->prepare("INSERT INTO sms_imports VALUES (NULL, NOW(), ?, ?, ?, ?, ?, ?, ?)"); $result->bind_param('sisisss', $idMod, $enrolements, $enrolement_details, $deletions, $deletion_details, $import_type, $session); $result->execute(); $result->close(); } $this->set_enrolement_no($enrolements, $module); $this->set_deletion_no($deletions, $module); $expdata = array(); if ($demomode) { // Write out to temp $dir = sys_get_temp_dir(); $expdata['status'] = $this->errorinfo; $expdata['students'] = $c_u; $expdata['moduledata'] = $xml; $expdata['studentsa'] = $current_users; file_put_contents($dir . '/' . 'uon-' . $module . '.txt', var_export($expdata, true)); file_put_contents($dir . '/' . 'sum-uon-' . $module . '.txt', "{$enrolements}, {$deletions}\r\n{$import_type}\r\n{$enrolement_details}\r\n{$deletion_details}\r\n"); } }
} $session = date_utils::get_current_academic_year(); $modID = module_utils::get_idMod($module, $mysqli); // Translate module code into ID $mod_details = module_utils::get_full_details_by_ID($modID, $mysqli); if ($mod_details === false) { $msg = sprintf($string['nomodule'], $module); display_error('Module ID error', $msg, false, true); } if ($mod_details['active'] == 1 and $mod_details['selfenroll'] == 1 and isset($_POST['submit'])) { if (!$userObject->has_role('Student')) { // Add role of 'Student' if current user doesn't have it. UserUtils::add_role('Student', $userObject->get_user_ID(), $mysqli); } // Insert new module enrollment UserUtils::add_student_to_module($userObject->get_user_ID(), $modID, 1, $_POST['session'], $mysqli); } ?> <!DOCTYPE html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="content-type" content="text/html;charset=<?php echo $configObject->get('cfg_page_charset'); ?> " /> <title><?php echo $string['moduleselfenrolment'] . ' ' . $configObject->get('cfg_install_type'); ?> </title>