namespace core_calendar;
+use calendar_event;
use DateInterval;
use DateTime;
use moodle_exception;
/**
* Create events for specified rrule.
*
- * @param \calendar_event $passedevent Properties of event to create.
+ * @param calendar_event $passedevent Properties of event to create.
* @throws moodle_exception
*/
public function create_events($passedevent) {
// Generate timestamps that obey the rrule.
$eventtimes = $this->generate_recurring_event_times($eventrec);
- // Adjust the parent event's timestart, if necessary.
+ // Update the parent event. Make sure that its repeat ID is the same as its ID.
+ $calevent = new calendar_event($eventrec);
+ $updatedata = new stdClass();
+ $updatedata->repeatid = $event->id;
+ // Also, adjust the parent event's timestart, if necessary.
if (count($eventtimes) > 0 && !in_array($eventrec->timestart, $eventtimes)) {
- $calevent = new \calendar_event($eventrec);
- $updatedata = (object)['timestart' => $eventtimes[0], 'repeatid' => $eventrec->id];
- $calevent->update($updatedata, false);
- $eventrec->timestart = $calevent->timestart;
+ $updatedata->timestart = reset($eventtimes);
}
+ $calevent->update($updatedata, false);
+ $eventrec->timestart = $calevent->timestart;
// Create the recurring calendar events.
$this->create_recurring_events($eventrec, $eventtimes);
$cloneevent->repeatid = $event->id;
$cloneevent->timestart = $time;
unset($cloneevent->id);
- \calendar_event::create($cloneevent, false);
+ // UUID should only be set on the first instance of the recurring events.
+ unset($cloneevent->uuid);
+ calendar_event::create($cloneevent, false);
}
// If COUNT rule is defined and the number of the generated event times is less than the the COUNT rule,
upgrade_main_savepoint(true, 2017050300.01);
}
+ if ($oldversion < 2017050500.01) {
+ // Get the list of parent event IDs.
+ $sql = "SELECT DISTINCT repeatid
+ FROM {event}
+ WHERE repeatid <> 0";
+ $parentids = array_keys($DB->get_records_sql($sql));
+ // Check if there are repeating events we need to process.
+ if (!empty($parentids)) {
+ // The repeat IDs of parent events should match their own ID.
+ // So we need to update parent events that have non-matching IDs and repeat IDs.
+ list($insql, $params) = $DB->get_in_or_equal($parentids);
+ $updatesql = "UPDATE {event}
+ SET repeatid = id
+ WHERE id <> repeatid
+ AND id $insql";
+ $DB->execute($updatesql, $params);
+ }
+
+ // Main savepoint reached.
+ upgrade_main_savepoint(true, 2017050500.01);
+ }
+
return true;
}