public static function update_subscriptions()

in classes/feature/calsync/form/subscriptions.php [104:307]


    public static function update_subscriptions($fromform, $primarycalid, $cancreatesiteevents,
            $cancreatecourseevents, $sitecalenderid = null) {
        global $DB, $USER;

        // Determine outlook calendar setting check.
        $usersetting = $DB->get_record('local_o365_calsettings', ['user_id' => $USER->id]);
        if (!empty($fromform->settingcal) && empty($usersetting)) {
            // Not currently subscribed.
            $newsetting = [
                    'user_id' => $USER->id,
                    'o365calid' => $sitecalenderid,
                    'timecreated' => time()
            ];
            $newsetting['id'] = $DB->insert_record('local_o365_calsettings', (object)$newsetting);
        } else if (empty($fromform->settingcal) && !empty($usersetting)) {
            $DB->delete_records('local_o365_calsettings', array('user_id' => $USER->id));
        }

        // Determine and organize existing subscriptions.
        $currentcaldata = [
            'site' => [
                'subscribed' => false,
                'recid' => null,
                'syncbehav' => null,
                'o365calid' => null,
            ],
            'user' => [
                'subscribed' => false,
                'recid' => null,
                'syncbehav' => null,
                'o365calid' => null,
            ],
            'course' => [],
        ];

        $existingcoursesubs = [];
        $existingsubsrs = $DB->get_recordset('local_o365_calsub', ['user_id' => $USER->id]);
        foreach ($existingsubsrs as $existingsubrec) {
            if ($existingsubrec->caltype === 'site') {
                $currentcaldata['site']['subscribed'] = true;
                $currentcaldata['site']['recid'] = $existingsubrec->id;
                $currentcaldata['site']['syncbehav'] = $existingsubrec->syncbehav;
                $currentcaldata['site']['o365calid'] = $existingsubrec->o365calid;
            } else if ($existingsubrec->caltype === 'user') {
                $currentcaldata['user']['subscribed'] = true;
                $currentcaldata['user']['recid'] = $existingsubrec->id;
                $currentcaldata['user']['syncbehav'] = $existingsubrec->syncbehav;
                $currentcaldata['user']['o365calid'] = $existingsubrec->o365calid;
            } else if ($existingsubrec->caltype === 'course') {
                $existingcoursesubs[$existingsubrec->caltypeid] = $existingsubrec;
            }
        }
        $existingsubsrs->close();

        // Handle changes to site and user calendar subscriptions.
        foreach (['site', 'user'] as $caltype) {
            $formkey = $caltype.'cal';
            $calchecked = false;
            if (!empty($fromform->settingcal)) {
                if (!empty($fromform->$formkey) && is_array($fromform->$formkey) && !empty($fromform->{$formkey}['checked'])) {
                    $calchecked = true;
                }
            }
            $syncwith = ($calchecked === true && !empty($fromform->{$formkey}['syncwith'])) ?
                $fromform->{$formkey}['syncwith'] : '';
            $syncbehav = ($calchecked === true && !empty($fromform->{$formkey}['syncbehav'])) ?
                $fromform->{$formkey}['syncbehav'] : 'out';
            if ($caltype === 'site' && empty($cancreatesiteevents)) {
                $syncbehav = 'out';
            }
            if ($calchecked !== true && $currentcaldata[$caltype]['subscribed'] === true) {
                $DB->delete_records('local_o365_calsub', ['user_id' => $USER->id, 'caltype' => $caltype]);
                $eventdata = [
                    'objectid' => $currentcaldata[$caltype]['recid'],
                    'userid' => $USER->id,
                    'other' => ['caltype' => $caltype]
                ];
                $event = \local_o365\event\calendar_unsubscribed::create($eventdata);
                $event->trigger();
            } else if ($calchecked === true) {
                $changed = false;
                if ($currentcaldata[$caltype]['subscribed'] !== $calchecked) {
                    $changed = true;
                }
                if ($currentcaldata[$caltype]['syncbehav'] !== $syncbehav) {
                    $changed = true;
                }
                if ($currentcaldata[$caltype]['o365calid'] !== $syncwith) {
                    $changed = true;
                }

                if ($changed === true) {
                    if ($currentcaldata[$caltype]['subscribed'] === false) {
                        // Not currently subscribed.
                        $newsub = [
                            'user_id' => $USER->id,
                            'caltype' => $caltype,
                            'caltypeid' => ($caltype === 'site') ? 0 : $USER->id,
                            'o365calid' => $syncwith,
                            'syncbehav' => $syncbehav,
                            'isprimary' => ($syncwith == $primarycalid) ? '1' : '0',
                            'timecreated' => time()
                        ];
                        $newsub['id'] = $DB->insert_record('local_o365_calsub', (object)$newsub);
                        $eventdata = [
                            'objectid' => $newsub['id'],
                            'userid' => $USER->id,
                            'other' => ['caltype' => $caltype]
                        ];
                    } else {
                        // Already subscribed, update behavior.
                        $updatedinfo = [
                            'id' => $currentcaldata[$caltype]['recid'],
                            'o365calid' => $syncwith,
                            'syncbehav' => $syncbehav,
                            'isprimary' => ($syncwith == $primarycalid) ? '1' : '0',
                        ];
                        $DB->update_record('local_o365_calsub', $updatedinfo);
                        $eventdata = [
                            'objectid' => $currentcaldata[$caltype]['recid'],
                            'userid' => $USER->id,
                            'other' => ['caltype' => $caltype]
                        ];
                    }
                    $event = \local_o365\event\calendar_subscribed::create($eventdata);
                    $event->trigger();
                }
            }
        }

        // The following calculates what courses need to be added or removed from the subscription table.
        $newcoursesubs = [];
        if (!empty($fromform->coursecal) && is_array($fromform->coursecal)) {
            foreach ($fromform->coursecal as $courseid => $coursecaldata) {
                if (!empty($coursecaldata['checked'])) {
                    $newcoursesubs[$courseid] = $coursecaldata;
                }
            }
        }
        $todelete = (empty($fromform->settingcal)) ? $existingcoursesubs : array_diff_key($existingcoursesubs, $newcoursesubs);
        $toadd = (empty($fromform->settingcal)) ? array() : array_diff_key($newcoursesubs, $existingcoursesubs);
        foreach ($todelete as $courseid => $unused) {
            $DB->delete_records('local_o365_calsub', ['user_id' => $USER->id, 'caltype' => 'course', 'caltypeid' => $courseid]);
            $eventdata = [
                'objectid' => $USER->id,
                'userid' => $USER->id,
                'other' => ['caltype' => 'course', 'caltypeid' => $courseid]
            ];
            $event = \local_o365\event\calendar_unsubscribed::create($eventdata);
            $event->trigger();
        }
        foreach ($newcoursesubs as $courseid => $coursecaldata) {
            $syncwith = (!empty($coursecaldata['syncwith'])) ? $coursecaldata['syncwith'] : '';
            $syncbehav = (!empty($coursecaldata['syncbehav'])) ? $coursecaldata['syncbehav'] : 'out';
            if (empty($cancreatecourseevents[$courseid])) {
                $syncbehav = 'out';
            }
            if (isset($toadd[$courseid])) {
                // Not currently subscribed.
                $newsub = [
                    'user_id' => $USER->id,
                    'caltype' => 'course',
                    'caltypeid' => $courseid,
                    'o365calid' => $syncwith,
                    'syncbehav' => $syncbehav,
                    'timecreated' => time(),
                    'isprimary' => ($syncwith == $primarycalid) ? '1' : '0',
                ];
                $DB->insert_record('local_o365_calsub', (object)$newsub);
                $eventdata = [
                    'objectid' => $USER->id,
                    'userid' => $USER->id,
                    'other' => ['caltype' => 'course', 'caltypeid' => $courseid]
                ];
                $event = \local_o365\event\calendar_subscribed::create($eventdata);
                $event->trigger();
            } else if (isset($existingcoursesubs[$courseid])) {
                $changed = false;
                if ($existingcoursesubs[$courseid]->syncbehav !== $syncbehav) {
                    $changed = true;
                }
                if ($existingcoursesubs[$courseid]->o365calid !== $syncwith) {
                    $changed = true;
                }
                if ($changed === true) {
                    // Already subscribed, update behavior.
                    $updatedrec = [
                        'id' => $existingcoursesubs[$courseid]->id,
                        'o365calid' => $syncwith,
                        'syncbehav' => $syncbehav,
                        'isprimary' => ($syncwith == $primarycalid) ? '1' : '0',
                    ];
                    $DB->update_record('local_o365_calsub', (object)$updatedrec);
                    $eventdata = [
                        'objectid' => $USER->id,
                        'userid' => $USER->id,
                        'other' => ['caltype' => 'course', 'caltypeid' => $courseid]
                    ];
                    $event = \local_o365\event\calendar_subscribed::create($eventdata);
                    $event->trigger();
                }
            }
        }
    }