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

60 lines
2.3 KiB
Python

#-*- coding:utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from collections import defaultdict
from datetime import datetime
import pytz
from odoo import api, fields, models
from odoo.osv import expression
class HrPayslip(models.Model):
_inherit = 'hr.payslip'
planning_slot_count = fields.Integer(compute='_compute_planning_slot_count', groups="planning.group_planning_manager")
@api.depends('date_from', 'date_to', 'contract_id')
def _compute_planning_slot_count(self):
self.planning_slot_count = 0
planning_slips = self.filtered(lambda p: p.contract_id.work_entry_source == 'planning')
if not planning_slips:
return
domain = []
slip_by_employee = defaultdict(lambda: self.env['hr.payslip'])
for slip in planning_slips:
slip_by_employee[slip.employee_id.id] |= slip
domain = expression.OR([
domain,
[
('employee_id', '=', slip.employee_id.id),
('start_datetime', '<=', slip.date_to),
('end_datetime', '>=', slip.date_from),
],
])
domain = expression.AND([
[('state', '=', 'published')],
domain,
])
read_group = self.env['planning.slot']._read_group(domain, groupby=['employee_id', 'start_datetime:day'], aggregates=['__count'])
for employee, start_datetime_utc, count in read_group:
slips = slip_by_employee[employee.id]
start_date_employee = start_datetime_utc.astimezone(pytz.timezone(employee.tz)).date()
for slip in slips:
if slip.date_from <= start_date_employee and start_date_employee <= slip.date_to:
slip.planning_slot_count += count
def action_open_planning_slots(self):
self.ensure_one()
action = self.employee_id.action_view_planning()
action['domain'] = expression.AND([
action['domain'],
[
('state', '=', 'published'),
('start_datetime', '<=', self.date_to),
('end_datetime', '>=', self.date_from),
],
])
action['context']['default_scale'] = 'month'
return action