in local/o365/classes/feature/calsync/main.php [193:374]
public function create_outlook_event_from_moodle_event($moodleventid) {
global $DB, $SITE;
// Assemble basic event data.
$event = $DB->get_record('event', ['id' => $moodleventid]);
$subject = $event->name;
$body = $event->description;
$timestart = $event->timestart;
$timeend = $timestart + $event->timeduration;
// Update event name.
if ($event->eventtype === 'site') {
$subject = $SITE->fullname . ': ' . $subject;
} else if ($event->eventtype === 'user') {
$subject = get_string('personal_calendar', 'local_o365') . ': ' . $subject;
} else if ($event->eventtype === 'course') {
$course = $DB->get_record('course', ['id' => $event->courseid]);
$subject = $course->fullname . ': ' . $subject;
}
$body .= $this->get_event_link_html($event);
// Get attendees.
if (isset($event->courseid) && $event->courseid == SITEID) {
// Site event.
$sql = 'SELECT u.id,
u.id as userid,
u.email,
u.firstname,
u.lastname,
sub.isprimary as subisprimary,
sub.o365calid as subo365calid
FROM {user} u
JOIN {local_o365_calsub} sub ON sub.user_id = u.id
WHERE sub.caltype = ? AND (sub.syncbehav = ? OR sub.syncbehav = ?)';
$params = ['site', 'out', 'both'];
$attendees = $DB->get_records_sql($sql, $params);
} else if (isset($event->courseid) && $event->courseid != SITEID && $event->courseid > 0) {
// Course event - Get subscribed students.
if (!empty($event->groupid)) {
$sql = 'SELECT u.id,
u.id as userid,
u.email,
u.firstname,
u.lastname,
sub.isprimary as subisprimary,
sub.o365calid as subo365calid
FROM {user} u
JOIN {user_enrolments} ue ON ue.userid = u.id
JOIN {enrol} e ON e.id = ue.enrolid
JOIN {local_o365_calsub} sub ON sub.user_id = u.id
AND sub.caltype = ?
AND sub.caltypeid = e.courseid
AND (sub.syncbehav = ? OR sub.syncbehav = ?)
JOIN {groups_members} grpmbr ON grpmbr.userid = u.id
WHERE e.courseid = ? AND grpmbr.groupid = ?';
$params = ['course', 'out', 'both', $event->courseid, $event->groupid];
$attendees = $DB->get_records_sql($sql, $params);
} else {
$sql = 'SELECT u.id,
u.id as userid,
u.email,
u.firstname,
u.lastname,
sub.isprimary as subisprimary,
sub.o365calid as subo365calid
FROM {user} u
JOIN {user_enrolments} ue ON ue.userid = u.id
JOIN {enrol} e ON e.id = ue.enrolid
JOIN {local_o365_calsub} sub ON sub.user_id = u.id
AND sub.caltype = ?
AND sub.caltypeid = e.courseid
AND (sub.syncbehav = ? OR sub.syncbehav = ?)
WHERE e.courseid = ?';
$params = ['course', 'out', 'both', $event->courseid];
$attendees = $DB->get_records_sql($sql, $params);
// Retrieve the Outlook group objectid.
$groupobject = $DB->get_record('local_o365_objects',
['moodleid' => $event->courseid, 'type' => 'group', 'subtype' => 'course']);
$outlookgroupemail = $this->construct_outlook_group_email($event->courseid);
// Add the Outlook group user as an attendee and organizer to the event.
if (!empty($groupobject) && !empty($groupobject->o365name) && !empty($outlookgroupemail)) {
// Assemble o365 group data.
$firstname = '';
$lastname = '';
[$firstname, $lastname] = $this->group_first_last_name($groupobject->o365name);
// Add o365 group as organizer for the event.
$outlookeventorganizer = [
'organizer' => [
'emailAddress' => [
'name' => $groupobject->o365name,
'address' => $outlookgroupemail,
]
],
'responseRequested' => false,
'isOrganizer' => true,
];
$apiclient = $this->construct_calendar_api($event->userid);
$response = $apiclient->create_group_event($subject, $body, $timestart, $timeend, [], $outlookeventorganizer,
$groupobject->objectid);
if (!empty($response)) {
$idmaprec = [
'eventid' => $event->id,
'outlookeventid' => $response['Id'],
'userid' => $event->userid,
'origin' => 'moodle',
];
$DB->insert_record('local_o365_calidmap', (object)$idmaprec);
}
}
}
} else {
// Personal user event. Only sync if user is subscribed to their events.
$select = 'caltype = ? AND user_id = ? AND (syncbehav = ? OR syncbehav = ?)';
$params = ['user', $event->userid, 'out', 'both'];
$calsub = $DB->get_record_select('local_o365_calsub', $select, $params);
if (!empty($calsub)) {
// Send event to o365 and store ID.
$apiclient = $this->construct_calendar_api($event->userid);
$calid = (!empty($calsub->o365calid) && empty($calsub->isprimary)) ? $calsub->o365calid : null;
$o365upn = utils::get_o365_upn($event->userid);
$response = $apiclient->create_event($subject, $body, $timestart, $timeend, [], [], $calid, $o365upn);
$idmaprec = [
'eventid' => $event->id,
'outlookeventid' => $response['Id'],
'userid' => $event->userid,
'origin' => 'moodle',
];
$DB->insert_record('local_o365_calidmap', (object)$idmaprec);
}
return true;
}
// Move users who've subscribed to non-primary calendars.
$nonprimarycalsubs = [];
$eventcreatorsub = null;
foreach ($attendees as $userid => $attendee) {
if ($userid == $event->userid) {
$eventcreatorsub = $attendee;
}
if (isset($attendee->subisprimary) && $attendee->subisprimary == '0') {
$nonprimarycalsubs[] = $attendee;
unset($attendees[$userid]);
}
}
// Sync primary-calendar users as attendees on a single event.
if (!empty($attendees)) {
$apiclient = $this->construct_calendar_api($event->userid);
$calid = (!empty($eventcreatorsub) && !empty($eventcreatorsub->subo365calid)) ? $eventcreatorsub->subo365calid : null;
if (isset($eventcreatorsub->subisprimary) && $eventcreatorsub->subisprimary == 1) {
$calid = null;
}
$o365upn = utils::get_o365_upn($event->userid);
$response = $apiclient->create_event($subject, $body, $timestart, $timeend, $attendees, [], $calid, $o365upn);
$idmaprec = [
'eventid' => $event->id,
'outlookeventid' => $response['Id'],
'userid' => $event->userid,
'origin' => 'moodle',
];
$DB->insert_record('local_o365_calidmap', (object)$idmaprec);
}
// Sync non-primary attendees individually.
foreach ($nonprimarycalsubs as $attendee) {
$apiclient = $this->construct_calendar_api($attendee->id);
$calid = (!empty($attendee->subo365calid)) ? $attendee->subo365calid : null;
$o365upn = utils::get_o365_upn($attendee->userid);
$response = $apiclient->create_event($subject, $body, $timestart, $timeend, [], [], $calid, $o365upn);
$idmaprec = [
'eventid' => $event->id,
'outlookeventid' => $response['Id'],
'userid' => $attendee->userid,
'origin' => 'moodle',
];
$DB->insert_record('local_o365_calidmap', (object)$idmaprec);
}
return true;
}