Browse Source

[IMP] b_shift: Future alert date and Next Countdown date

This improves the calculation of the future alert date in other to take
holidays and temporary exemption into account.

This also adds the date of the next countdown that also take holidays
and temporary exemption into account.
pull/105/head
Rémy Taymans 6 years ago
committed by Elouan
parent
commit
efec421508
  1. 101
      beesdoo_shift/models/cooperative_status.py
  2. 3
      beesdoo_shift/views/cooperative_status.xml

101
beesdoo_shift/models/cooperative_status.py

@ -79,6 +79,7 @@ class CooperativeStatus(models.Model):
irregular_absence_date = fields.Date() irregular_absence_date = fields.Date()
irregular_absence_counter = fields.Integer() #TODO unsubscribe when reach -2 irregular_absence_counter = fields.Integer() #TODO unsubscribe when reach -2
future_alert_date = fields.Date(compute='_compute_future_alert_date') future_alert_date = fields.Date(compute='_compute_future_alert_date')
next_countdown_date = fields.Date(compute='_compute_next_countdown_date')
temporary_exempt_reason_id = fields.Many2one('cooperative.exempt.reason', 'Exempt Reason') temporary_exempt_reason_id = fields.Many2one('cooperative.exempt.reason', 'Exempt Reason')
temporary_exempt_start_date = fields.Date() temporary_exempt_start_date = fields.Date()
@ -113,17 +114,101 @@ class CooperativeStatus(models.Model):
rec.status = 'ok' rec.status = 'ok'
rec.can_shop = True rec.can_shop = True
@api.depends('today', 'irregular_start_date', 'sr')
@api.depends('today', 'irregular_start_date', 'sr', 'holiday_start_time',
'holiday_end_time', 'temporary_exempt_start_date',
'temporary_exempt_end_date')
def _compute_future_alert_date(self): def _compute_future_alert_date(self):
"""Compute date before which the worker is up to date""" """Compute date before which the worker is up to date"""
for rec in self: for rec in self:
future_alert_date = False
if not rec.alert_start_time and rec.irregular_start_date:
today_date = fields.Date.from_string(rec.today)
delta = (today_date - fields.Date.from_string(rec.irregular_start_date)).days
future_alert_date = today_date + timedelta(days=(rec.sr + 1) * PERIOD - delta % PERIOD)
future_alert_date = future_alert_date.strftime('%Y-%m-%d')
rec.future_alert_date = future_alert_date
# Only for irregular worker
if rec.working_mode != 'irregular' and not rec.irregular_start_date:
rec.future_alert_date = False
# Alert start time already set
elif rec.alert_start_time:
rec.future_alert_date = False
# Holidays are not set properly
elif bool(rec.holiday_start_time) != bool(rec.holiday_end_time):
rec.future_alert_date = False
# Exemption have not a start and end time
elif (bool(rec.temporary_exempt_start_date)
!= bool(rec.temporary_exempt_end_date)):
rec.future_alert_date = False
else:
date = rec.today
counter = rec.sr
# Simulate the countdown
while counter >= 0:
date = add_days_delta(date, 1)
date = self._next_countdown_date(rec.irregular_start_date,
date)
# Check holidays
if (rec.holiday_start_time and rec.holiday_end_time
and date >= rec.holiday_start_time
and date <= rec.holiday_end_time):
continue
# Check temporary exemption
elif (rec.temporary_exempt_start_date
and rec.temporary_exempt_end_date
and date >= rec.temporary_exempt_start_date
and date <= rec.temporary_exempt_end_date):
continue
else:
counter -= 1
rec.future_alert_date = date
@api.depends('today', 'irregular_start_date', 'holiday_start_time',
'holiday_end_time', 'temporary_exempt_start_date',
'temporary_exempt_end_date')
def _compute_next_countdown_date(self):
"""
Compute the following countdown date. This date is the date when
the worker will see his counter changed du to the cron. This
date is like the birthday date of the worker that occurred each
PERIOD.
"""
for rec in self:
# Only for irregular worker
if rec.working_mode != 'irregular' and not rec.irregular_start_date:
rec.next_countdown_date = False
# Holidays are not set properly
elif bool(rec.holiday_start_time) != bool(rec.holiday_end_time):
rec.next_countdown_date = False
# Exemption have not a start and end time
elif (bool(rec.temporary_exempt_start_date)
!= bool(rec.temporary_exempt_end_date)):
rec.next_countdown_date = False
else:
date = rec.today
next_countdown_date = False
while not next_countdown_date:
date = add_days_delta(date, 1)
date = self._next_countdown_date(rec.irregular_start_date, date)
# Check holidays
if (rec.holiday_start_time and rec.holiday_end_time
and date >= rec.holiday_start_time
and date <= rec.holiday_end_time):
continue
# Check temporary exemption
elif (rec.temporary_exempt_start_date
and rec.temporary_exempt_end_date
and date >= rec.temporary_exempt_start_date
and date <= rec.temporary_exempt_end_date):
continue
else:
next_countdown_date = date
rec.next_countdown_date = next_countdown_date
def _next_countdown_date(self, irregular_start_date, today=False):
"""
Return the next countdown date given irregular_start_date and
today dates.
This does not take holiday and other status into account.
"""
today = today or fields.Date.today()
today_dt = fields.Date.from_string(today)
irregular_start_dt = fields.Date.from_string(irregular_start_date)
delta = (today_dt - irregular_start_dt).days
return add_days_delta(today, delta % PERIOD)
def _set_regular_status(self, grace_delay, alert_delay): def _set_regular_status(self, grace_delay, alert_delay):
self.ensure_one() self.ensure_one()

3
beesdoo_shift/views/cooperative_status.xml

@ -85,7 +85,8 @@
<field name="can_shop" /> <field name="can_shop" />
</group> </group>
<group string="Timing information"> <group string="Timing information">
<field name="future_alert_date" readonly="1" />
<field name="next_countdown_date" readonly="1" attrs="{'invisible':[('working_mode', '!=', 'irregular')]}" />
<field name="future_alert_date" readonly="1" attrs="{'invisible':[('working_mode', '!=', 'irregular')]}" />
<field name="time_extension" /> <field name="time_extension" />
<field name="holiday_start_time" /> <field name="holiday_start_time" />
<field name="holiday_end_time" /> <field name="holiday_end_time" />

Loading…
Cancel
Save