From 50652f265ca69f79f2ebd48435a2ba507118f1c8 Mon Sep 17 00:00:00 2001 From: "Mattis Megevand (mmeg)" Date: Wed, 20 Dec 2023 11:15:29 +0100 Subject: [PATCH] [FIX] hr_holidays, resource: use employee time-zone for leave compute Steps to reproduce: - Create Allocation for 20 days for Mitchell Admin and validate (12/01 to 12/31). - Set Working Schedule "Standard 40 hours/week" to UTC timezone. - Set Mitchell Admin's timezone to Europe/Zurich. - Create a time off with type Extra Time Off with dates 12/29 - 12/29 and try to save. - Receive Validation Error: There is no valid allocation to cover that request. Issues: You cannot request that leave due to a timezone mismatch, even though you should be able to. Solution: To solve the zone mismatch we use the employee timezone to compute the attendance intervals. opw-3619178 closes odoo/odoo#146938 Signed-off-by: Bertrand Dossogne (bedo) --- addons/hr/models/hr_employee.py | 5 +++-- addons/hr_contract/models/hr_employee.py | 5 +++-- addons/resource/models/resource_calendar.py | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/addons/hr/models/hr_employee.py b/addons/hr/models/hr_employee.py index 333cd1b703d..465ed1615a5 100644 --- a/addons/hr/models/hr_employee.py +++ b/addons/hr/models/hr_employee.py @@ -2,7 +2,7 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. import base64 -from pytz import UTC +from pytz import timezone, UTC from datetime import datetime, time from random import choice from string import digits @@ -516,7 +516,8 @@ class HrEmployeePrivate(models.Model): def _get_calendar_attendances(self, date_from, date_to): self.ensure_one() - return self.resource_calendar_id.get_work_duration_data(date_from, date_to) + employee_timezone = timezone(self.tz) if self.tz else None + return self.resource_calendar_id.with_context(employee_timezone=employee_timezone).get_work_duration_data(date_from, date_to) # --------------------------------------------------------- # Business Methods diff --git a/addons/hr_contract/models/hr_employee.py b/addons/hr_contract/models/hr_employee.py index 1c4d12c2234..7f92bdb8001 100644 --- a/addons/hr_contract/models/hr_employee.py +++ b/addons/hr_contract/models/hr_employee.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from pytz import UTC +from pytz import timezone, UTC from datetime import date, datetime, time from odoo import api, fields, models @@ -145,7 +145,8 @@ class Employee(models.Model): valid_contracts = self.sudo()._get_contracts(date_from, date_to, states=['open', 'close']) if not valid_contracts: return super()._get_calendar_attendances(date_from, date_to) - return valid_contracts.resource_calendar_id.get_work_duration_data(date_from, date_to) + employee_timezone = timezone(self.tz) if self.tz else None + return valid_contracts.resource_calendar_id.with_context(employee_timezone=employee_timezone).get_work_duration_data(date_from, date_to) def write(self, vals): res = super().write(vals) diff --git a/addons/resource/models/resource_calendar.py b/addons/resource/models/resource_calendar.py index d7c154b4cd1..dc5f2bb0ec4 100644 --- a/addons/resource/models/resource_calendar.py +++ b/addons/resource/models/resource_calendar.py @@ -428,7 +428,7 @@ class ResourceCalendar(models.Model): else: resources_list = list(resources) + [self.env['resource.resource']] - attendance_intervals = self._attendance_intervals_batch(start_dt, end_dt, resources, tz=tz) + attendance_intervals = self._attendance_intervals_batch(start_dt, end_dt, resources, tz=tz or self.env.context.get("employee_timezone")) if compute_leaves: leave_intervals = self._leave_intervals_batch(start_dt, end_dt, resources, domain, tz=tz) return {