You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							173 lines
						
					
					
						
							8.0 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							173 lines
						
					
					
						
							8.0 KiB
						
					
					
				| <?php | |
| // This file is part of Moodle - http://moodle.org/ | |
| // | |
| // Moodle is free software: you can redistribute it and/or modify | |
| // it under the terms of the GNU General Public License as published by | |
| // the Free Software Foundation, either version 3 of the License, or | |
| // (at your option) any later version. | |
| // | |
| // Moodle is distributed in the hope that it will be useful, | |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | |
| // GNU General Public License for more details. | |
| // | |
| // You should have received a copy of the GNU General Public License | |
| // along with Moodle.  If not, see <http://www.gnu.org/licenses/>. | |
|  | |
| /** | |
|  * Attendance task - Send warnings. | |
|  * | |
|  * @package    mod_attendance | |
|  * @copyright  2017 onwards Dan Marsden http://danmarsden.com | |
|  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later | |
|  */ | |
| 
 | |
| namespace mod_attendance\task; | |
| defined('MOODLE_INTERNAL') || die(); | |
| 
 | |
| require_once($CFG->dirroot . '/mod/attendance/lib.php'); | |
| require_once($CFG->dirroot . '/mod/attendance/locallib.php'); | |
| /** | |
|  * Task class | |
|  * | |
|  * @package    mod_attendance | |
|  * @copyright  2017 onwards Dan Marsden http://danmarsden.com | |
|  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later | |
|  */ | |
| class notify extends \core\task\scheduled_task { | |
|     /** | |
|      * Returns localised general event name. | |
|      * | |
|      * @return string | |
|      */ | |
|     public function get_name() { | |
|         // Shown in admin screens. | |
|         return get_string('notifytask', 'mod_attendance'); | |
|     } | |
| 
 | |
|     /** | |
|      * Execute the task. | |
|      */ | |
|     public function execute() { | |
|         global $DB; | |
|         if (empty(get_config('attendance', 'enablewarnings'))) { | |
|             return; // Warnings not enabled. | |
|         } | |
|         $now = time(); // Store current time to use in queries so they all match nicely. | |
|  | |
|         $orderby = 'ORDER BY cm.id, atl.studentid, n.warningpercent ASC'; | |
| 
 | |
|         // Get records for attendance sessions that have been updated since last time this task ran. | |
|         // Note: this returns all users for these sessions - even if the users attendance wasn't changed | |
|         // since last time we ran, before sending a notification we check to see if the users have | |
|         // updated attendance logs since last time they were notified. | |
|         $records = attendance_get_users_to_notify(array(), $orderby, true); | |
|         $sentnotifications = array(); | |
|         $thirdpartynotifications = array(); | |
|         $numsentusers = 0; | |
|         $numsentthird = 0; | |
|         foreach ($records as $record) { | |
|             if (empty($sentnotifications[$record->userid])) { | |
|                 $sentnotifications[$record->userid] = array(); | |
|             } | |
| 
 | |
|             if (!empty($record->emailuser)) { | |
|                 // Only send one warning to this user from each attendance in this run. | |
|                 // Flag any higher percent notifications as sent. | |
|                 if (empty($sentnotifications[$record->userid]) || !in_array($record->aid, $sentnotifications[$record->userid])) { | |
| 
 | |
|                     // If has previously been sent a warning, check to see if this user has | |
|                     // attendance updated since the last time the notification was sent. | |
|                     if (!empty($record->timesent)) { | |
|                         $sql = "SELECT * | |
|                               FROM {attendance_log} l | |
|                               JOIN {attendance_sessions} s ON s.id = l.sessionid | |
|                              WHERE s.attendanceid = ? AND studentid = ? AND timetaken > ?"; | |
|                         if (!$DB->record_exists_sql($sql, array($record->aid, $record->userid, $record->timesent))) { | |
|                             continue; // Skip this record and move to the next user. | |
|                         } | |
|                     } | |
| 
 | |
|                     // Convert variables in emailcontent. | |
|                     $record = attendance_template_variables($record); | |
|                     $user = $DB->get_record('user', array('id' => $record->userid)); | |
|                     $from = \core_user::get_noreply_user(); | |
|                     $oldforcelang = force_current_language($user->lang); | |
| 
 | |
|                     $emailcontent = format_text($record->emailcontent, $record->emailcontentformat); | |
|                     $emailsubject = format_text($record->emailsubject, FORMAT_HTML); | |
|                     email_to_user($user, $from, $emailsubject, $emailcontent, $emailcontent); | |
| 
 | |
|                     force_current_language($oldforcelang); | |
|                     $sentnotifications[$record->userid][] = $record->aid; | |
|                     $numsentusers++; | |
|                 } | |
|             } | |
|             // Only send one warning to this user from each attendance in this run. - flag any higher percent notifications as sent. | |
|             $thirdpartyusers = array(); | |
|             if (!empty($record->thirdpartyemails)) { | |
|                 $sendto = explode(',', $record->thirdpartyemails); | |
|                 $record->percent = round($record->percent * 100)."%"; | |
|                 $context = \context_module::instance($record->cmid); | |
|                 foreach ($sendto as $senduser) { | |
|                     if (empty($senduser)) { | |
|                         // Probably an extra comma in the thirdpartyusers field. | |
|                         continue; | |
|                     } | |
|                     // Create array of the warnings this user will recieve in case we need to clean up. | |
|                     $thirdpartyusers[$senduser][] = $record->notifyid; | |
| 
 | |
|                     // Check user is allowed to receive warningemails. | |
|                     if (has_capability('mod/attendance:warningemails', $context, $senduser)) { | |
|                         if (empty($thirdpartynotifications[$senduser])) { | |
|                             $thirdpartynotifications[$senduser] = array(); | |
|                         } | |
|                         if (!isset($thirdpartynotifications[$senduser][$record->aid . '_' . $record->userid])) { | |
|                             $thirdpartynotifications[$senduser][$record->aid . '_' . $record->userid] | |
|                                 = get_string('thirdpartyemailtext', 'attendance', $record); | |
|                         } | |
|                     } else { | |
|                         mtrace("user".$senduser. "does not have capablity in cm".$record->cmid); | |
|                     } | |
|                 } | |
|             } | |
|             $notify = new \stdClass(); | |
|             $notify->userid = $record->userid; | |
|             $notify->notifyid = $record->notifyid; | |
|             $notify->timesent = $now; | |
|             $DB->insert_record('attendance_warning_done', $notify); | |
|         } | |
|         if (!empty($numsentusers)) { | |
|             mtrace($numsentusers ." user emails sent"); | |
|         } | |
|         if (!empty($thirdpartynotifications)) { | |
|             foreach ($thirdpartynotifications as $sendid => $notifications) { | |
|                 $user = $DB->get_record('user', array('id' => $sendid)); | |
|                 if (empty($user) || !empty($user->deleted)) { | |
|                     // Clean this user up and remove from the notification list. | |
|                     $warnings = $DB->get_records_list('attendance_warning', 'id', $thirdpartyusers[$sendid]); | |
|                     if (!empty($warnings)) { | |
|                         attendance_remove_user_from_thirdpartyemails($warnings, $sendid); | |
|                     } | |
|                     // Don't send and skip to next notification. | |
|                     continue; | |
|                 } | |
| 
 | |
|                 $from = \core_user::get_noreply_user(); | |
|                 $oldforcelang = force_current_language($user->lang); | |
| 
 | |
|                 $emailcontent = implode("\n", $notifications); | |
|                 $emailcontent .= "\n\n".get_string('thirdpartyemailtextfooter', 'attendance'); | |
|                 $emailcontent = format_text($emailcontent); | |
|                 $emailsubject = get_string('thirdpartyemailsubject', 'attendance'); | |
| 
 | |
|                 email_to_user($user, $from, $emailsubject, $emailcontent, $emailcontent); | |
|                 force_current_language($oldforcelang); | |
|                 $numsentthird++; | |
|             } | |
|             if (!empty($numsentthird)) { | |
|                 mtrace($numsentthird ." thirdparty emails sent"); | |
|             } | |
|         } | |
|     } | |
| } |