mirror of
https://github.com/bringout/oca-ocb-hr.git
synced 2026-04-25 04:32:06 +02:00
50 lines
2 KiB
Python
50 lines
2 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import api, models, fields
|
|
|
|
|
|
class HrVersion(models.Model):
|
|
_name = 'hr.version'
|
|
_inherit = 'hr.version'
|
|
|
|
@api.model
|
|
def _domain_current_countries(self):
|
|
return ['|',
|
|
('country_id', '=', False),
|
|
('country_id', 'in', self.env.companies.country_id.ids),
|
|
]
|
|
|
|
ruleset_id = fields.Many2one(
|
|
"hr.attendance.overtime.ruleset",
|
|
domain=_domain_current_countries,
|
|
groups="hr.group_hr_manager",
|
|
tracking=True,
|
|
default=lambda self: self.env.ref('hr_attendance.hr_attendance_default_ruleset', raise_if_not_found=False),
|
|
)
|
|
|
|
@api.model
|
|
def _get_versions_by_employee_and_date(self, employee_dates):
|
|
# for `employee_dates` a dict[employee] -> dates
|
|
# Generate a 2 level dict[employee][date] -> version
|
|
employees = self.env['hr.employee'].union(*employee_dates.keys())
|
|
all_dates = [date for dates in employee_dates.values() for date in dates]
|
|
if not all_dates:
|
|
return {}
|
|
date_to = max(all_dates)
|
|
all_versions = self.env['hr.version'].search([
|
|
('employee_id', 'in', employees.ids),
|
|
('date_version', '<=', date_to),
|
|
# note: no check on date_from because we don't store the version date end
|
|
])
|
|
versions_by_employee = all_versions.grouped('employee_id')
|
|
version_by_employee_and_date = {employee: {} for employee in employees}
|
|
|
|
for employee, dates in employee_dates.items():
|
|
if not (versions := versions_by_employee.get(employee)):
|
|
continue
|
|
version_index = 0
|
|
for date in sorted(dates):
|
|
if version_index + 1 < len(versions) and date >= versions[version_index + 1].date_version:
|
|
version_index += 1
|
|
version_by_employee_and_date[employee][date] = versions[version_index]
|
|
return version_by_employee_and_date
|