public function create_outlook_event_from_moodle_event()

in 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;
    }