72 lines
3.4 KiB
Python
72 lines
3.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import api, fields, models
|
|
from collections import defaultdict
|
|
|
|
|
|
class Employee(models.Model):
|
|
_inherit = 'hr.employee'
|
|
|
|
@api.model_create_multi
|
|
def create(self, vals_list):
|
|
employees = super().create(vals_list)
|
|
if self.env.context.get('salary_simulation'):
|
|
return employees
|
|
|
|
# We need to create timesheet entries for the global time off that are already created
|
|
# and are planned for after this employee creation date
|
|
self.with_context(allowed_company_ids=employees.company_id.ids) \
|
|
._create_future_public_holidays_timesheets(employees)
|
|
return employees
|
|
|
|
def write(self, vals):
|
|
result = super(Employee, self).write(vals)
|
|
self_company = self.with_context(allowed_company_ids=self.company_id.ids)
|
|
if 'active' in vals:
|
|
if vals.get('active'):
|
|
# Create future holiday timesheets
|
|
inactive_emp = self_company.filtered(lambda e: not e.active)
|
|
inactive_emp._create_future_public_holidays_timesheets(self)
|
|
else:
|
|
# Delete future holiday timesheets
|
|
self_company._delete_future_public_holidays_timesheets()
|
|
elif 'resource_calendar_id' in vals:
|
|
# Update future holiday timesheets
|
|
self_company._delete_future_public_holidays_timesheets()
|
|
self_company._create_future_public_holidays_timesheets(self)
|
|
return result
|
|
|
|
def _delete_future_public_holidays_timesheets(self):
|
|
future_timesheets = self.env['account.analytic.line'].sudo().search([('global_leave_id', '!=', False), ('date', '>=', fields.date.today()), ('employee_id', 'in', self.ids)])
|
|
future_timesheets.write({'global_leave_id': False})
|
|
future_timesheets.unlink()
|
|
|
|
def _create_future_public_holidays_timesheets(self, employees):
|
|
lines_vals = []
|
|
today = fields.Datetime.today()
|
|
global_leaves_wo_calendar = defaultdict(lambda: self.env["resource.calendar.leaves"])
|
|
global_leaves_wo_calendar.update(dict(self.env['resource.calendar.leaves']._read_group(
|
|
[('calendar_id', '=', False), ('date_from', '>=', today)],
|
|
groupby=['company_id'],
|
|
aggregates=['id:recordset'],
|
|
)))
|
|
for employee in employees:
|
|
if not employee.active:
|
|
continue
|
|
# First we look for the global time off that are already planned after today
|
|
global_leaves = employee.resource_calendar_id.global_leave_ids.filtered(lambda l: l.date_from >= today) + global_leaves_wo_calendar[employee.company_id]
|
|
work_hours_data = global_leaves._work_time_per_day()
|
|
for global_time_off in global_leaves:
|
|
for index, (day_date, work_hours_count) in enumerate(work_hours_data[employee.resource_calendar_id.id][global_time_off.id]):
|
|
lines_vals.append(
|
|
global_time_off._timesheet_prepare_line_values(
|
|
index,
|
|
employee,
|
|
work_hours_data[global_time_off.id],
|
|
day_date,
|
|
work_hours_count
|
|
)
|
|
)
|
|
return self.env['account.analytic.line'].sudo().create(lines_vals)
|