diff --git a/hr_shift/models/hr_employee.py b/hr_shift/models/hr_employee.py index 5adba80..db23f1c 100644 --- a/hr_shift/models/hr_employee.py +++ b/hr_shift/models/hr_employee.py @@ -26,20 +26,17 @@ def _shift_of_date(self, min_time, max_time): [ ("employee_id", "=", self.id), ("state", "=", "assigned"), - ("start_time", ">=", min_time), - ("end_time", "<=", max_time), + ("start_time", "<=", max_time), + ("end_time", ">=", min_time), ] ) ) def _compute_current_shift_id(self): """Current shift for a given employee if any""" - today = fields.Date.today() now = fields.Datetime.now() - min_time = fields.datetime.combine(today, now.min.time()) - max_time = fields.datetime.combine(today, now.max.time()) for employee in self: - employee.current_shift_id = employee._shift_of_date(min_time, max_time) + employee.current_shift_id = employee._shift_of_date(now, now) def _get_employee_working_now(self): # Get shift info if available diff --git a/hr_shift/tests/test_hr_shift.py b/hr_shift/tests/test_hr_shift.py index ae4fa2a..a596082 100644 --- a/hr_shift/tests/test_hr_shift.py +++ b/hr_shift/tests/test_hr_shift.py @@ -3,6 +3,7 @@ from datetime import datetime import pytz +from freezegun import freeze_time from odoo import fields from odoo.tests import Form @@ -155,3 +156,54 @@ def test_hr_shift_planning_full(self): shift_b_line_1 = shift_b.line_ids.filtered(lambda x: x.day_number == "1") self.assertEqual(shift_b_line_1.state, "assigned") self.assertEqual(shift_b_line_1.template_id, self.template_afternoon) + + @freeze_time("2025-01-13 08:00:00") + def test_hr_shift_current_shift_id_two_shifts_same_day_morning(self): + self.planning.generate_shifts() + shift = self.planning.shift_ids.filtered( + lambda x: x.employee_id == self.employee_a + ) + line_morning = shift.line_ids.filtered(lambda x: x.day_number == "0") + line_morning.template_id = self.template_morning + self.env["hr.shift.planning.line"].create( + { + "shift_id": shift.id, + "day_number": "0", + "template_id": self.template_afternoon.id, + } + ) + self.assertEqual(self.employee_a.current_shift_id, line_morning) + + @freeze_time("2025-01-13 14:00:00") + def test_hr_shift_current_shift_id_two_shifts_same_day_afternoon(self): + self.planning.generate_shifts() + shift = self.planning.shift_ids.filtered( + lambda x: x.employee_id == self.employee_a + ) + line_morning = shift.line_ids.filtered(lambda x: x.day_number == "0") + line_morning.template_id = self.template_morning + line_afternoon = self.env["hr.shift.planning.line"].create( + { + "shift_id": shift.id, + "day_number": "0", + "template_id": self.template_afternoon.id, + } + ) + self.assertEqual(self.employee_a.current_shift_id, line_afternoon) + + @freeze_time("2025-01-13 20:30:00") + def test_hr_shift_current_shift_id_two_shifts_same_day_after_both(self): + self.planning.generate_shifts() + shift = self.planning.shift_ids.filtered( + lambda x: x.employee_id == self.employee_a + ) + line_morning = shift.line_ids.filtered(lambda x: x.day_number == "0") + line_morning.template_id = self.template_morning + self.env["hr.shift.planning.line"].create( + { + "shift_id": shift.id, + "day_number": "0", + "template_id": self.template_afternoon.id, + } + ) + self.assertFalse(self.employee_a.current_shift_id)