$sql = 'SELECT * FROM calendar_alarm JOIN calendar_item USING (dav_id) JOIN caldav_data USING (dav_id) WHERE rrule IS NOT NULL AND next_trigger IS NULL'; if ($args->debug) { printf("%s\n", $sql); } $qry = new AwlQuery($sql); if ($qry->Exec() && $qry->rows()) { while ($alarm = $qry->Fetch()) { if ($args->debug) { printf("refresh: Processing alarm for '%s' based on '%s','%s', '%s'\n", $alarm->dav_name, $alarm->dtstart, $alarm->rrule, $alarm->trigger); } $ic = new vComponent($alarm->caldav_data); $expanded = expand_event_instances($ic, $earliest, $expand_range_end); $expanded->MaskComponents(array('VEVENT' => 1, 'VTODO' => 1, 'VJOURNAL' => 1)); $instances = $expanded->GetComponents(); $trigger = new vProperty($alarm->trigger); $related = $trigger->GetParameterValue('RELATED'); $first = new RepeatRuleDateTime($alarm->dtstart); $first->modify($trigger->Value()); $next = null; $last = null; foreach ($instances as $k => $component) { $when = new RepeatRuleDateTime($component->GetPValue('DTSTART')); // a UTC value if ($args->debug) { printf("refresh: Looking at event instance on '%s'\n", $when->UTC()); } if ($related == 'END') { $when->modify($component->GetPValue('DURATION')); } $when->modify($trigger->Value()); if ($when > $expand_range_start && $when < $expand_range_end && (!isset($next) || $when < $next)) {