111 lines
5.4 KiB
Python
111 lines
5.4 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from datetime import datetime, time
|
|
from dateutil.relativedelta import relativedelta
|
|
|
|
from odoo import fields, models
|
|
|
|
from odoo.addons.hr_contract_salary.utils.hr_version import requires_hr_version_context
|
|
|
|
|
|
class HrVersion(models.Model):
|
|
_inherit = 'hr.version'
|
|
|
|
wage_with_holidays = fields.Monetary(groups="hr_payroll.group_hr_payroll_user")
|
|
wage_on_signature = fields.Monetary(groups="hr_payroll.group_hr_payroll_user")
|
|
final_yearly_costs = fields.Monetary(groups="hr_payroll.group_hr_payroll_user")
|
|
monthly_yearly_costs = fields.Monetary(groups="hr_payroll.group_hr_payroll_user")
|
|
salary_offer_ids = fields.One2many(groups="hr_payroll.group_hr_payroll_manager")
|
|
|
|
@requires_hr_version_context()
|
|
def _generate_salary_simulation_payslip(self):
|
|
self.ensure_one()
|
|
payslip = self.env['hr.payslip'].sudo().create({
|
|
'employee_id': self.employee_id.id,
|
|
'version_id': self.id,
|
|
'struct_id': self.structure_type_id.default_struct_id.id,
|
|
'company_id': self.employee_id.company_id.id,
|
|
'name': 'Payslip Simulation',
|
|
'date_from': self.contract_date_start + relativedelta(months=1, day=1),
|
|
})
|
|
|
|
# For hourly wage contracts generate the worked_days_line_ids manually
|
|
if self.wage_type == 'hourly':
|
|
work_days_data = self.employee_id._get_work_days_data_batch(
|
|
datetime.combine(payslip.date_from, time.min), datetime.combine(payslip.date_to, time.max),
|
|
compute_leaves=False, calendar=self.resource_calendar_id,
|
|
)[self.employee_id.id]
|
|
payslip.worked_days_line_ids = self.env['hr.payslip.worked_days'].sudo().create({
|
|
'payslip_id': payslip.id,
|
|
'work_entry_type_id': self._get_default_work_entry_type_id(),
|
|
'number_of_days': work_days_data.get('days', 0),
|
|
'number_of_hours': work_days_data.get('hours', 0),
|
|
})
|
|
|
|
# Part Time Simulation
|
|
old_wage_on_payroll = payslip.version_id.wage_on_signature
|
|
old_wage = payslip.version_id.wage
|
|
new_payslip_vals = {}
|
|
if self.env.context.get("simulation_working_schedule"):
|
|
working_schedule = self.env.context.get("simulation_working_schedule", '100')
|
|
old_calendar = payslip.version_id.company_id.resource_calendar_id
|
|
new_calendar = self.env['resource.calendar']
|
|
if working_schedule == '100':
|
|
pass
|
|
elif working_schedule == '90':
|
|
new_calendar = old_calendar.copy({'global_leave_ids': False})
|
|
if not new_calendar.two_weeks_calendar:
|
|
new_calendar.switch_calendar_type()
|
|
new_calendar.attendance_ids.filtered(lambda a: a.day_period != 'lunch')[:2].unlink()
|
|
elif working_schedule == '80':
|
|
new_calendar = old_calendar.copy({'global_leave_ids': False})
|
|
if new_calendar.two_weeks_calendar:
|
|
new_calendar.switch_calendar_type()
|
|
new_calendar.attendance_ids.filtered(lambda a: a.day_period != 'lunch')[:2].unlink()
|
|
elif working_schedule == '60':
|
|
new_calendar = old_calendar.copy({'global_leave_ids': False})
|
|
if new_calendar.two_weeks_calendar:
|
|
new_calendar.switch_calendar_type()
|
|
new_calendar.attendance_ids.filtered(lambda a: a.day_period != 'lunch')[:4].unlink()
|
|
elif working_schedule == '50':
|
|
new_calendar = old_calendar.copy({'global_leave_ids': False})
|
|
if new_calendar.two_weeks_calendar:
|
|
new_calendar.switch_calendar_type()
|
|
new_calendar.attendance_ids.filtered(lambda a: a.day_period != 'lunch')[:5].unlink()
|
|
elif working_schedule == '40':
|
|
new_calendar = old_calendar.copy({'global_leave_ids': False})
|
|
if new_calendar.two_weeks_calendar:
|
|
new_calendar.switch_calendar_type()
|
|
new_calendar.attendance_ids.filtered(lambda a: a.day_period != 'lunch')[:6].unlink()
|
|
elif working_schedule == '20':
|
|
new_calendar = old_calendar.copy({'global_leave_ids': False})
|
|
if new_calendar.two_weeks_calendar:
|
|
new_calendar.switch_calendar_type()
|
|
new_calendar.attendance_ids.filtered(lambda a: a.day_period != 'lunch')[:8].unlink()
|
|
new_wage_on_payroll = old_wage_on_payroll * int(working_schedule) / 100.0
|
|
new_wage = old_wage * int(working_schedule) / 100.0
|
|
is_full_time = working_schedule == '100'
|
|
new_payslip_vals.update({
|
|
'resource_calendar_id': new_calendar.id,
|
|
'wage_on_signature': new_wage_on_payroll,
|
|
'wage': new_wage,
|
|
})
|
|
|
|
else:
|
|
is_full_time = True
|
|
|
|
payslip = payslip.with_context(
|
|
salary_simulation=True,
|
|
salary_simulation_full_time=is_full_time,
|
|
salary_simulation_full_time_wage_on_holidays=self.wage_with_holidays,
|
|
salary_simulation_full_time_yearly_cost=self.final_yearly_costs,
|
|
origin_version_id=self.env.context.get('origin_version_id', False),
|
|
lang=None
|
|
)
|
|
|
|
if not is_full_time:
|
|
payslip.version_id.write(new_payslip_vals)
|
|
|
|
payslip.compute_sheet()
|
|
return payslip
|