if ($this->hasRecurCount()) {
$recurrences = 0;
+ /**
+ * Correct the number of recurrences by the number of events
+ * that lay between the start of the start week and the
+ * recurrence start.
+ */
+ $next = clone $start_week;
+ while ($next->compareDateTime($this->start) < 0) {
+ if ($this->recurOnDay((int)pow(2, $next->dayOfWeek()))) {
+ $recurrences--;
+ }
+ ++$next->mday;
+ }
if ($repeats > 0) {
$weekdays = $this->recurData;
$total_recurrences_per_week = 0;
}
$next = clone $start_week;
- $next->mday += $recur;
+ $next->mday += $recur - 1;
while ($next->compareDateTime($after) < 0 &&
$next->compareDateTime($after_week_end) < 0) {
++$next->mday;
if ($this->hasRecurCount()
- && $next->compareDateTime($this->start) >= 0
+ && $next->compareDateTime($after) < 0
&& $this->recurOnDay((int)pow(2, $next->dayOfWeek()))) {
$recurrences++;
}
public function testWeeklyCountWithMultipleIncidencesPerWeekIfTheFirstIncidenceInThisWeekHasAlreadyPassed()
{
- $r = new Horde_Date_Recurrence('2007-02-27 10:00:00');
+ $r = new Horde_Date_Recurrence('2007-03-03 10:00:00');
$r->setRecurType(Horde_Date_Recurrence::RECUR_WEEKLY);
$r->setRecurOnDay(Horde_Date::MASK_MONDAY | Horde_Date::MASK_SATURDAY);
$r->setRecurInterval(1);
$this->_getRecurrences($r));
}
+ public function testWeeklyCountWithMultipleIncidencesPerWeekIfNextIncidenceIsNextDay()
+ {
+ $r = new Horde_Date_Recurrence('2009-11-11 06:00:00');
+ $r->setRecurType(Horde_Date_Recurrence::RECUR_WEEKLY);
+ $r->setRecurOnDay(Horde_Date::MASK_WEDNESDAY | Horde_Date::MASK_THURSDAY);
+ $r->setRecurInterval(1);
+ $r->setRecurCount(6);
+ $this->assertEquals('W1 WE TH #6', $r->toRRule10($this->ical));
+ $this->assertEquals('FREQ=WEEKLY;INTERVAL=1;BYDAY=WE,TH;COUNT=6', $r->toRRule20($this->ical));
+ $this->assertEquals(array('2009-11-11 06:00:00',
+ '2009-11-12 06:00:00',
+ '2009-11-18 06:00:00',
+ '2009-11-19 06:00:00',
+ '2009-11-25 06:00:00',
+ '2009-11-26 06:00:00'),
+ $this->_getRecurrences($r));
+ }
+
+ public function testWeeklyCountWithMultipleIncidencesPerWeekIfNextIncidenceIsBeginningOfWeek()
+ {
+ $r = new Horde_Date_Recurrence('2009-11-09 06:00:00');
+ $r->setRecurType(Horde_Date_Recurrence::RECUR_WEEKLY);
+ $r->setRecurOnDay(
+ Horde_Date::MASK_MONDAY |
+ Horde_Date::MASK_TUESDAY |
+ Horde_Date::MASK_WEDNESDAY |
+ Horde_Date::MASK_THURSDAY |
+ Horde_Date::MASK_FRIDAY
+ );
+ $r->setRecurInterval(1);
+ $r->setRecurCount(6);
+ $this->assertEquals('W1 MO TU WE TH FR #6', $r->toRRule10($this->ical));
+ $this->assertEquals('FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR;COUNT=6', $r->toRRule20($this->ical));
+ $this->assertEquals(array('2009-11-09 06:00:00',
+ '2009-11-10 06:00:00',
+ '2009-11-11 06:00:00',
+ '2009-11-12 06:00:00',
+ '2009-11-13 06:00:00',
+ '2009-11-16 06:00:00'),
+ $this->_getRecurrences($r));
+ }
+
public function testWeeklyCountWithMultipleIncidencesPerWeekAndCountIsOne()
{
$r = new Horde_Date_Recurrence('2007-03-01 10:00:00');