1
0
forked from Mapan/odoo17e
odoo17e-kedaikipas58/addons/planning_holidays/models/planning_slot.py
2024-12-10 09:04:09 +07:00

77 lines
2.9 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models, _
class Slot(models.Model):
_inherit = 'planning.slot'
leave_warning = fields.Char(compute='_compute_leave_warning', compute_sudo=True)
is_absent = fields.Boolean(
'Employees on Time Off', compute='_compute_leave_warning', search='_search_is_absent',
compute_sudo=True, readonly=True)
@api.depends_context('lang')
@api.depends('start_datetime', 'end_datetime', 'employee_id')
def _compute_leave_warning(self):
assigned_slots = self.filtered(lambda s: s.employee_id and s.start_datetime)
(self - assigned_slots).leave_warning = False
(self - assigned_slots).is_absent = False
if not assigned_slots:
return
min_date = min(assigned_slots.mapped('start_datetime'))
date_from = min_date if min_date > fields.Datetime.today() else fields.Datetime.today()
leaves = self.env['hr.leave']._get_leave_interval(
date_from=date_from,
date_to=max(assigned_slots.mapped('end_datetime')),
employee_ids=assigned_slots.mapped('employee_id')
)
for slot in assigned_slots:
warning = False
slot_leaves = leaves.get(slot.employee_id.id)
if slot_leaves:
warning = self.env['hr.leave']._get_leave_warning(
leaves=slot_leaves,
employee=slot.employee_id,
date_from=slot.start_datetime,
date_to=slot.end_datetime
)
slot.leave_warning = warning
slot.is_absent = bool(warning)
@api.model
def _search_is_absent(self, operator, value):
if operator not in ['=', '!='] or not isinstance(value, bool):
raise NotImplementedError(_('Operation not supported'))
today = fields.Datetime.today()
slots = self.search([
('employee_id', '!=', False),
('end_datetime', '>', today), # only fetch the slots containing today in their period or shifts in the future
])
if not slots:
return []
min_date = min(slots.mapped('start_datetime'))
date_from = max(min_date, today)
mapped_leaves = self.env['hr.leave']._get_leave_interval(
date_from=date_from,
date_to=max(slots.mapped('end_datetime')),
employee_ids=slots.mapped('employee_id'),
)
slot_ids = []
for slot in slots.filtered(lambda s: s.employee_id.id in mapped_leaves):
leaves = mapped_leaves[slot.employee_id.id]
period = self.env['hr.leave']._group_leaves(leaves, slot.employee_id, slot.start_datetime, slot.end_datetime)
if period:
slot_ids.append(slot.id)
if operator == '!=':
value = not value
return [('id', 'in' if value else 'not in', slot_ids)]