Odoo18-Base/addons/hr_work_entry_holidays/models/hr_contract.py
2025-01-06 10:57:38 +07:00

66 lines
2.8 KiB
Python

# -*- coding:utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import pytz
from odoo import models
from odoo.osv.expression import OR
class HrContract(models.Model):
_inherit = 'hr.contract'
_description = 'Employee Contract'
# override to add work_entry_type from leave
def _get_leave_work_entry_type(self, leave):
if leave.holiday_id:
return leave.holiday_id.holiday_status_id.work_entry_type_id
else:
return leave.work_entry_type_id
def _get_more_vals_leave_interval(self, interval, leaves):
result = super()._get_more_vals_leave_interval(interval, leaves)
for leave in leaves:
if interval[0] >= leave[0] and interval[1] <= leave[1]:
result.append(('leave_id', leave[2].holiday_id.id))
return result
def _get_interval_leave_work_entry_type(self, interval, leaves, bypassing_codes):
# returns the work entry time related to the leave that
# includes the whole interval.
# Overriden in hr_work_entry_contract_holiday to select the
# global time off first (eg: Public Holiday > Home Working)
self.ensure_one()
if 'work_entry_type_id' in interval[2] and interval[2].work_entry_type_id.code in bypassing_codes:
return interval[2].work_entry_type_id
interval_start = interval[0].astimezone(pytz.utc).replace(tzinfo=None)
interval_stop = interval[1].astimezone(pytz.utc).replace(tzinfo=None)
including_rcleaves = [l[2] for l in leaves if l[2] and interval_start >= l[2].date_from and interval_stop <= l[2].date_to]
including_global_rcleaves = [l for l in including_rcleaves if not l.holiday_id]
including_holiday_rcleaves = [l for l in including_rcleaves if l.holiday_id]
rc_leave = False
# Example: In CP200: Long term sick > Public Holidays (which is global)
if bypassing_codes:
bypassing_rc_leave = [l for l in including_holiday_rcleaves if l.holiday_id.holiday_status_id.work_entry_type_id.code in bypassing_codes]
else:
bypassing_rc_leave = []
if bypassing_rc_leave:
rc_leave = bypassing_rc_leave[0]
elif including_global_rcleaves:
rc_leave = including_global_rcleaves[0]
elif including_holiday_rcleaves:
rc_leave = including_holiday_rcleaves[0]
if rc_leave:
return self._get_leave_work_entry_type_dates(rc_leave, interval_start, interval_stop, self.employee_id)
return self.env.ref('hr_work_entry_contract.work_entry_type_leave')
def _get_sub_leave_domain(self):
domain = super()._get_sub_leave_domain()
return OR([
domain,
[('holiday_id.employee_id', 'in', self.employee_id.ids)] # see https://github.com/odoo/enterprise/pull/15091
])