oca-ocb-hr/odoo-bringout-oca-ocb-hr_holidays_attendance/hr_holidays_attendance/models/hr_employee.py
Ernad Husremovic e1d89e11e3 19.0 vanilla
2026-03-09 09:31:00 +01:00

82 lines
3.1 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from collections import defaultdict
from odoo import models
class HrEmployee(models.Model):
_inherit = "hr.employee"
def _get_deductible_employee_overtime(self):
# return dict {employee: number of hours}
diff_by_employee = defaultdict(lambda: 0)
for employee, hours in self.env['hr.attendance.overtime.line'].sudo()._read_group(
domain=[
('compensable_as_leave', '=', True),
('employee_id', 'in', self.ids),
('status', '=', 'approved'),
],
groupby=['employee_id'],
aggregates=['manual_duration:sum'],
):
diff_by_employee[employee] += hours
for employee, hours in self.env['hr.leave']._read_group(
domain=[
('holiday_status_id.overtime_deductible', '=', True),
('holiday_status_id.requires_allocation', '=', False),
('employee_id', 'in', self.ids),
('state', 'not in', ['refuse', 'cancel']),
],
groupby=['employee_id'],
aggregates=['number_of_hours:sum'],
):
diff_by_employee[employee] -= hours
for employee, hours in self.env['hr.leave.allocation']._read_group(
domain=[
('holiday_status_id.overtime_deductible', '=', True),
('employee_id', 'in', self.ids),
('state', 'in', ['confirm', 'validate', 'validate1']),
],
groupby=['employee_id'],
aggregates=['number_of_hours_display:sum'],
):
diff_by_employee[employee] -= hours
return diff_by_employee
def get_overtime_data_by_employee(self):
"""
Provide a summary of an employee's overtime.
A compensable overtime is an overtime that can be cumulated to be used
as time off.
Extra hours and overtime is used interchangably.
"""
# Make so that at least all employees are present in return value
overtime_data = {}
for employee_id in self.ids:
overtime_data[employee_id] = {
"compensable_overtime": 0,
"not_compensable_overtime": 0,
"unspent_compensable_overtime": 0,
}
unspent_overtime = self._get_deductible_employee_overtime()
for employee in unspent_overtime:
overtime_data[employee.id]['unspent_compensable_overtime'] += max(
0, unspent_overtime[employee]
)
all_overtimes = self.env['hr.attendance.overtime.line']._read_group(
domain=[
('employee_id', 'in', self.ids),
],
groupby=["employee_id", "compensable_as_leave"],
aggregates=["duration:sum"],
)
for employee, is_compensable, amount in all_overtimes:
overtime_type = (
'compensable_overtime'
if is_compensable
else 'not_compensable_overtime'
)
overtime_data[employee.id][overtime_type] += amount
return overtime_data