Odoo18-Base/addons/hr_contract/models/resource_calendar_leaves.py
2025-03-10 11:12:23 +07:00

40 lines
1.6 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from collections import defaultdict
from datetime import datetime
from pytz import timezone, utc
from odoo import models
class ResourceCalendarLeaves(models.Model):
_inherit = 'resource.calendar.leaves'
def _compute_calendar_id(self):
def date2datetime(date, tz):
dt = datetime.fromordinal(date.toordinal())
return tz.localize(dt).astimezone(utc).replace(tzinfo=None)
Resource = self.env['resource.resource']
CalendarLeaves = self.env['resource.calendar.leaves']
leaves_by_resource = defaultdict(lambda: CalendarLeaves, {Resource: CalendarLeaves})
for leave in self:
leaves_by_resource[leave.resource_id] += leave
# pass leaves without resource_id to super
remaining = leaves_by_resource.pop(Resource)
for resource, leaves in leaves_by_resource.items():
contract = resource.employee_id.contract_id
if not contract:
remaining += leaves
continue
tz = timezone(contract.resource_calendar_id.tz or 'UTC')
start_dt = date2datetime(contract.date_start, tz)
end_dt = date2datetime(contract.date_end, tz) if contract.date_end else datetime.max
# only modify leaves that fall under the active contract
leaves.filtered(
lambda leave: start_dt <= leave.date_from < end_dt
).calendar_id = contract.resource_calendar_id
super(ResourceCalendarLeaves, remaining)._compute_calendar_id()