From 7a473d9730c18d074cb70708d3f16db5b6ac5d01 Mon Sep 17 00:00:00 2001
From: Gunnar Wrobel
Date: Mon, 9 Nov 2009 09:53:23 +0100
Subject: [PATCH] Correct failing test and correclty count events recurring
weekly with multiple incidences per week.
Patch provided by Soenke Schwardt-Krummrich
See https://issues.kolab.org/issue3846.
---
framework/Date/lib/Horde/Date/Recurrence.php | 42 ++++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/framework/Date/lib/Horde/Date/Recurrence.php b/framework/Date/lib/Horde/Date/Recurrence.php
index e9191c1dc..7231669d9 100644
--- a/framework/Date/lib/Horde/Date/Recurrence.php
+++ b/framework/Date/lib/Horde/Date/Recurrence.php
@@ -405,6 +405,48 @@ class Horde_Date_Recurrence
ceil($recur / 7) / $this->recurInterval >= $this->recurCount) {
return false;
}
+
+ if (!$this->hasRecurEnd() && $this->recurCount > 0) {
+ $start_week_end = clone $start_week;
+ $start_week_end->mday += 7;
+ $recurrences = 0;
+ $total_recurrences_per_week = 0;
+ $next = clone $start_week;
+ while ($next->compareDateTime($start_week_end) < 0
+ && $next->compareDateTime($after) < 0) {
+
+ if ($this->recurOnDay((int)pow(2, $next->dayOfWeek()))) {
+ $total_recurrences_per_week++;
+ if ($next->compareDateTime($this->start) >= 0)
+ $recurrences++;
+ }
+ ++$next->mday;
+ }
+ if ($recurrences >= $this->recurCount)
+ return false;
+ if ($diff >= $this->recurInterval * 7) {
+ // calculate the number of weeks between the start and the
+ // end week
+ $recurrences += ((int)floor(($diff/($this->recurInterval * 7))) - 1) * $total_recurrences_per_week;
+ if ($recurrences >= $this->recurCount)
+ return false;
+ if ($diff % ($this->recurInterval * 7) == 0) {
+ // the last week is in the interval - therefore the
+ // recurrences in the week have to be counted also
+ $next = clone $after_week;
+ while ($next->compareDateTime($after_week_end) < 0
+ && $next->compareDateTime($after) < 0) {
+ if ($this->recurOnDay((int)pow(2, $next->dayOfWeek()))) {
+ $recurrences++;
+ }
+ ++$next->mday;
+ }
+ }
+ }
+ if ($recurrences >= $this->recurCount)
+ return false;
+ }
+
$next = clone $start_week;
$next->mday += $recur;
while ($next->compareDateTime($after) < 0 &&
--
2.11.0