diff --git a/beesdoo_shift/models/cooperative_status.py b/beesdoo_shift/models/cooperative_status.py index c58b219..4c73853 100644 --- a/beesdoo_shift/models/cooperative_status.py +++ b/beesdoo_shift/models/cooperative_status.py @@ -79,6 +79,7 @@ class CooperativeStatus(models.Model): irregular_absence_date = fields.Date() irregular_absence_counter = fields.Integer() #TODO unsubscribe when reach -2 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_start_date = fields.Date() @@ -113,17 +114,101 @@ class CooperativeStatus(models.Model): rec.status = 'ok' 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): """Compute date before which the worker is up to date""" 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): self.ensure_one() diff --git a/beesdoo_shift/views/cooperative_status.xml b/beesdoo_shift/views/cooperative_status.xml index 9ba48f3..c8a99e2 100644 --- a/beesdoo_shift/views/cooperative_status.xml +++ b/beesdoo_shift/views/cooperative_status.xml @@ -85,7 +85,8 @@ - + +