Add option to rule to move date of occurence to working day

This commit is contained in:
Frederik Jaeckel 2024-06-03 23:37:26 +02:00
parent e4963beee9
commit 9685670672
2 changed files with 93 additions and 4 deletions

View file

@ -217,11 +217,42 @@ class ScheduledBooking(DeactivableMixin, ModelSQL, ModelView):
used instead of the stored values, Defaults to {},
allowed: frequ, weekday, start_date,
end_date (preferred over 'count'),
monthday, interval, setpos
monthday, interval, setpos, move_event
Returns:
list: date values, result of rrlue
"""
def get_moved_date(xdate, m_mode):
""" re-arrange xdate to a working day
Args:
xdate (date): date to move to a working day
move_mode (str): move mode:
nop - no operation
after/before - move date to after/before input date
Returns:
date: re-arranged date
"""
Config = Pool().get('cashbook.configuration')
config = Config.get_singleton()
assert m_mode in ['nop', 'after', 'before'], 'invalid move_mode'
if (not config) or (m_mode == 'nop'):
return xdate
holidays = config.holiday_dates([xdate.year, xdate.year + 1])
day_cnt = (
1 if m_mode == 'after'
else -1 if m_mode == 'before' else 0)
if day_cnt != 0:
while (xdate in holidays) or (xdate.weekday() in [5, 6]):
# re-arrange
xdate = xdate + timedelta(days=day_cnt)
return xdate
pfrequ = {
'year': YEARLY, 'month': MONTHLY, 'week': WEEKLY, 'day': DAILY}
pweekday = {
@ -235,6 +266,10 @@ class ScheduledBooking(DeactivableMixin, ModelSQL, ModelView):
end_date = params.get('end_date', self.end_date)
frequ = pfrequ[params.get('frequ', self.frequ)]
move_event = params.get('move_event', self.move_event)
if move_event not in ['nop', 'before', 'after']:
move_event = 'nop'
setpos = params.get('setpos', self.setpos)
if setpos is not None:
setpos = 1 if setpos < 1 else 4 if setpos > 4 else setpos
@ -262,7 +297,12 @@ class ScheduledBooking(DeactivableMixin, ModelSQL, ModelView):
for x in dtrule:
if (query_date and (x.date() >= query_date)) or \
(query_date is None):
result.append(x.date())
x_date = get_moved_date(x.date(), move_event)
# if date was re-arranged backwards and we are before
# query_date - skip it
if x_date >= query_date:
result.append(x_date)
if len(result) >= count:
break
return result
@ -328,7 +368,7 @@ class ScheduledBooking(DeactivableMixin, ModelSQL, ModelView):
@fields.depends(
'start_date', 'end_date', 'frequ', 'weekday', 'monthday',
'interval', 'setpos')
'interval', 'setpos', 'move_event')
def on_change_with_nextdates(self, name=None):
""" Calculates the next 5 appointments based on the configured rule,
returns a formatted date list