. /** * Background task to refresh the list of associaded teachers with studyplans * @package tool_sptoolboxmgr * @copyright 2023 P.M. Kuipers * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ namespace tool_sptoolboxmgr\task; use \local_treestudyplan\associationservice; use \tool_sptoolboxmgr\profilehelper; use \mtrace; use \mtrace_exception; use \ValueError; defined('MOODLE_INTERNAL') || die(); require_once($CFG->dirroot.'/user/profile/lib.php'); /** * Background task to process changes in */ class profilescannertask extends \core\task\scheduled_task { /** * Return the task's name as shown in admin screens. * * @return string */ public function get_name() { return get_string('profilescannertask', 'tool_sptoolboxmgr'); } /** * Execute the task. */ public function execute() { global $DB; // We need to test for changes in the profile fields... // First check the userids eligable for enrolment $enrollable = profilehelper::enrollable_user_ids(); // Next, check each of these fields for changes mtrace("Checking ".count($enrollable)." enrollable uids for changes ...."); foreach ($enrollable as $uid) { $user = $DB->get_record("user",["id"=>$uid]); try { $changes = profilehelper::check_changes($uid); mtrace("Checking user {$user->username}... ".(($changes->changed)?"Has changes":"No changes")); /** * @var studyplan */ $toolbox = null; if ($changes->trackchanged) { if ($changes->toolbox) { mtrace(" User changed track - removing coaches from old toolbox '{$changes->toolbox->name()}' "); // Remove coach from old toolbox. $coaches = associationservice::associated_coaches($changes->toolbox->id()); foreach ($coaches as $coach) { $coach = (object)$coach; // Convert from array to object. associationservice::disconnect_coach($changes->toolbox->id(),$coach->id); } } try { // Create new toolbox based on new track and add coach. $template = profilehelper::get_track_plan($changes->track); mtrace(" Created new toolbox"); $toolbox = $template->duplicate( "{$user->firstname} {$user->lastname} - {$template->name()}", "{$user->username}-{$template->shortname()}", $template->context()->id, null, null ); mtrace(" Creating new toolbox - Created {$toolbox->id()} - {$toolbox->name()}"); // Add user to toolbox. associationservice::connect_user($toolbox->id(),$uid); mtrace(" Creating new toolbox - Added user '{$user->username}' to toolbox"); // Add new coach to toolbox. $coach = $DB->get_record("user", ["id"=> $changes->coach]); mtrace(" Creating new toolbox - adding coach '{$coach->username}' to toolbox"); associationservice::connect_coach($toolbox->id(), $changes->coach); } catch (ValueError $x) { mtrace("Cannot find track template '{$changes->track}' for user '{$user->username}'"); mtrace_exception($x); } } elseif ($changes->coachchanged || $changes->enrolchanged) { if ($changes->toolbox) { // If there is an associated toolbox. Otherwise, it should have been created above. $toolbox = $changes->toolbox; if ($changes->coachchanged) { // Remove coach from old toolbox. $coaches = associationservice::associated_coaches($changes->toolbox->id()); foreach ($coaches as $coach) { $coach = (object)$coach; // Convert from array to object. mtrace(" Coach changed - removing coach {$coach->username} from toolbox"); associationservice::disconnect_coach($changes->toolbox->id(),$coach->id); } } // Add new coach to toolbox. $coach = $DB->get_record("user", ["id"=> $changes->coach]); mtrace(" Coach or enrol changed - (re)adding coach {$coach->username} to toolbox"); $result = (object)associationservice::connect_coach($toolbox->id(), $changes->coach); if (! $result->success) { $ci = new \local_treestudyplan\contextinfo($toolbox->context()); mtrace(" Error: {$result->msg} - Toolbox '".$toolbox->name()."' context: ". $ci->pathstr()); } } } mtrace("Registering new status"); profilehelper::register_changes($uid,$toolbox); } catch (\ValueError $x) { // This is thrown if any of the fields are invalid. mtrace("Error retrieving fields for user {$user->username}"); mtrace_exception($x); } } // Next process the previously enrollable uids $prevenrollable = profilehelper::previously_enrollable_user_ids(); // Next, check each of these fields for changes mtrace("Processing ".count($prevenrollable)." previously enrollable uids for the change in enrollability"); foreach ($enrollable as $uid) { try { $changes = profilehelper::check_changes($uid); mtrace("Checking user {$user->username}... ".(($changes->changed)?"Has changes":"No changes")); // There should be changes in the enrol now, since all of these uids are no longer eligable for an active toolbox. // Do not remove the old toolbox, but do remove the coach access - if if ($changes->enrolchanged) { // Remove coach from old toolbox. $coaches = associationservice::associated_coaches($changes->toolbox->id()); foreach ($coaches as $coach) { $coach = (object)$coach; // Convert from array to object. mtrace(" User enrol changed - removing coach {$coach->username} from toolbox"); associationservice::disconnect_coach($changes->toolbox->id(),$coach->id); } } mtrace("Registering new status"); profilehelper::register_changes($uid,$changes->toolbox); } catch (\ValueError $x) { // This is thrown if any of the fields are invalid. mtrace("Error retrieving fields for user {$user->username}"); mtrace_exception($x); } } } }