forked from Mapan/odoo17e
60 lines
2.3 KiB
Python
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
|