After spending more than a week trying to fix and improve the recurrence
rules, I finally gave up. I'd like to propose an alternative
implementation to the community and see if it would be worthwhile to try it.
The recurrence system I set up on my local copy works well. It is based
on a design proposed by Martin Fowler -
http://martinfowler.com/apsupp/recurring.pdf. His design is quite old,
so I updated it to support internationalization and I expanded it.
The design is extremely flexible and it allows for arbitrarily complex
recurring events. The design is based on temporal expressions. Each
temporal expression could be considered a rule - like "every Monday" or
"the 15th of the month."
Temporal expressions can used alone or they can be combined in any of
three "collection" expressions - Union, Intersection, and Difference. A
date will match a Union collection if any of its expressions match
(logical OR). A date will match an Intersection collection if all of its
expressions match (logical AND). A date will match a Difference
collection if it matches the "included" expression and doesn't match the
"excluded" expression.
Using Bilgin's Happy Hour promotion as an example:
Intersection
DayOfWeekRange(Monday, Friday)
TimeOfDayRange(15:00, 17:00)
Let's say we want to exclude St. Patrick's Day from the Happy Hour
promotion:
Difference
Include
Intersection
DayOfWeekRange(Monday, Friday)
TimeOfDayRange(15:00, 17:00)
Exclude
Intersection
MonthRange(March, March)
DayOfMonthRange(17, 17)
A semi-monthly payday:
Union
DayOfMonthRange(1, 1)
DayOfMonthRange(15, 15)
Labor Day (US):
Intersection
MonthRange(September, September)
DayInMonth(Monday, 1)
A schedule is made up of schedule items. Each schedule item "points to"
a temporal expression. It also has duration information, and an item
type ID (meeting, appointment, etc).
Schedules can be linked to parties/facilities/fixed assets through
relationship entities.
The implementation requires three new entities and an optional fourth. I
could write a conversion routine to convert the existing Recurrence*
entities over to the new ones.
If there is any interest, I could provide a preliminary patch for
evaluation.
Comments are welcome.
-Adrian