Files

53 lines
2.1 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from collections import defaultdict
import pytz
from odoo import api, fields, models
from odoo.fields import Domain
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', 'version_id')
def _compute_planning_slot_count(self):
self.planning_slot_count = 0
planning_slips = self.filtered(lambda p: p.version_id.work_entry_source == 'planning')
if not planning_slips:
return
domains = []
slip_by_employee = defaultdict(lambda: self.env['hr.payslip'])
for slip in planning_slips:
slip_by_employee[slip.employee_id.id] |= slip
domains.append([
('employee_id', '=', slip.employee_id.id),
('start_datetime', '<=', slip.date_to),
('end_datetime', '>=', slip.date_from),
])
domain = Domain('state', '=', 'published') & Domain.OR(domains)
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'] = Domain.AND([
action['domain'],
[
('state', '=', 'published'),
('start_datetime', '<=', self.date_to),
('end_datetime', '>=', self.date_from),
],
])
action['context']['default_scale'] = 'month'
return action