From d23d41ca50e997fe035bbdf38a62d4ca18400edd Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 16 Jun 2014 13:25:00 +0000 Subject: [PATCH] * Calendar/iCal/CalDAV: normalize enddates not on a recurrence-date, to recurrence-date before (not next) --- calendar/inc/class.calendar_ical.inc.php | 7 +----- calendar/inc/class.calendar_rrule.inc.php | 27 +++++++++++++++++++++++ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/calendar/inc/class.calendar_ical.inc.php b/calendar/inc/class.calendar_ical.inc.php index 9eb7ef22e9..a5609ffca7 100644 --- a/calendar/inc/class.calendar_ical.inc.php +++ b/calendar/inc/class.calendar_ical.inc.php @@ -2972,12 +2972,7 @@ class calendar_ical extends calendar_boupdate { // reset recure_enddate to 00:00:00 on the last day $rriter = calendar_rrule::event2rrule($event, false); - $rriter->rewind(); - while ($rriter->current < $rriter->enddate) - { - $rriter->next_no_exception(); - } - $last = clone $rriter->current; + $last = $rriter->normalize_enddate(); $last->setTime(0, 0, 0); //error_log(__METHOD__."() rrule=$recurence --> ".array2string($rriter)." --> enddate=".array2string($last).'='.egw_time::to($last, '')); $event['recur_enddate'] = egw_time::to($last, 'server'); diff --git a/calendar/inc/class.calendar_rrule.inc.php b/calendar/inc/class.calendar_rrule.inc.php index 5493b26ecd..937192ad58 100644 --- a/calendar/inc/class.calendar_rrule.inc.php +++ b/calendar/inc/class.calendar_rrule.inc.php @@ -491,6 +491,33 @@ class calendar_rrule implements Iterator return $ret; } + /** + * Fix enddates which are not on a recurrence, eg. for a on Monday recurring weekly event a Tuesday + * + * @return DateTime + */ + public function normalize_enddate() + { + $this->rewind(); + while ($this->current < $this->enddate) + { + $previous = clone $this->current; + $this->next_no_exception(); + } + // if enddate is now before next acurrence, but not on same day, we use previous recurrence + // this can happen if client gives an enddate which is NOT a recurrence date + // eg. for a on Monday recurring weekly event a Tuesday as enddate + if ($this->enddate < $this->current && $this->current->format('Ymd') != $this->enddate->format('Ymd')) + { + $last = $previous; + } + else + { + $last = clone $this->current; + } + return $last; + } + /** * Rewind the Iterator to the first element (called at beginning of foreach loop) */