From 6ba48be96a22028dc0ce3081df5c7fdca98e0313 Mon Sep 17 00:00:00 2001 From: "kdeb@odoo.com" Date: Tue, 6 Feb 2024 11:32:31 +0100 Subject: [PATCH] [FIX] hr_holidays: respect unit in future accrual calculations Issue: - When checking future accruals in the Time Off dashboard, the Balance view doesn't update correctly. For example, with an accrual plan of 1h per month starting on 30/11/23, the balance in December should show 2h but incorrectly shows only 1.12h. -This happens because the '_get_future_leaves_on' method always returns values in days, ignoring the 'type_request_unit' of the allocation. Steps to Reproduce: - In the time-off app set an accrual plan: 1h per month, accrued on the first day of the month. - add a new allocation to Mitchell Admin with that plan - Notice that In the dashboard the balance is 1h - Change the date to next month, new amount is 1.12h, in stead of 2 Solution: - Added a check to correctly calculate future accruals in hours when type_request_unit is 'hour', ensuring accurate hour-based balances. opw-3685077 closes odoo/odoo#152870 Signed-off-by: Bertrand Dossogne (bedo) --- .../hr_holidays/models/hr_leave_allocation.py | 2 + .../tests/test_accrual_allocations.py | 37 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/addons/hr_holidays/models/hr_leave_allocation.py b/addons/hr_holidays/models/hr_leave_allocation.py index 6217b5b1288..dfcae21bd0b 100644 --- a/addons/hr_holidays/models/hr_leave_allocation.py +++ b/addons/hr_holidays/models/hr_leave_allocation.py @@ -562,6 +562,8 @@ class HolidaysAllocation(models.Model): fake_allocation = self.env['hr.leave.allocation'].new(origin=self) fake_allocation.sudo()._process_accrual_plans(accrual_date, log=False) + if self.type_request_unit in ['hour']: + return float_round(fake_allocation.number_of_hours_display - self.number_of_hours_display, precision_digits=2) return round((fake_allocation.number_of_days - self.number_of_days), 2) #################################################### diff --git a/addons/hr_holidays/tests/test_accrual_allocations.py b/addons/hr_holidays/tests/test_accrual_allocations.py index 283b45b0836..959ce0e7143 100644 --- a/addons/hr_holidays/tests/test_accrual_allocations.py +++ b/addons/hr_holidays/tests/test_accrual_allocations.py @@ -1446,3 +1446,40 @@ class TestAccrualAllocations(TestHrHolidaysCommon): # The amount being already computed, the amount should stay the same after the cron # running on the same day. self.assertAlmostEqual(accrual_allocation.number_of_days, 34.0, places=0) + + def test_future_accural_time(self): + leave_type = self.env['hr.leave.type'].create({ + 'name': 'Test Leave Type', + 'time_type': 'leave', + 'requires_allocation': 'yes', + 'allocation_validation_type': 'no', + 'request_unit': 'hour', + }) + with freeze_time("2023-12-31"): + accrual_plan = self.env['hr.leave.accrual.plan'].create({ + 'name': 'Accrual Plan For Test', + 'is_based_on_worked_time': False, + 'accrued_gain_time': 'end', + 'carryover_date': 'year_start', + 'level_ids': [(0, 0, { + 'start_count': 1, + 'start_type': 'day', + 'added_value': 1, + 'added_value_type': 'hour', + 'frequency': 'monthly', + 'cap_accrued_time': True, + 'maximum_leave': 100, + })], + }) + allocation = self.env['hr.leave.allocation'].create({ + 'name': 'Accrual allocation for employee', + 'accrual_plan_id': accrual_plan.id, + 'employee_id': self.employee_emp.id, + 'holiday_status_id': leave_type.id, + 'number_of_days': 0.125, + 'allocation_type': 'accrual', + 'holiday_type': 'employee', + }) + allocation.action_validate() + allocation_data = leave_type.get_allocation_data(self.employee_emp, datetime.date(2024, 2, 1)) + self.assertEqual(allocation_data[self.employee_emp][0][1]['virtual_remaining_leaves'], 2)