263 lines
14 KiB
Python
263 lines
14 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import api, fields, models
|
|
|
|
|
|
class HrVersion(models.Model):
|
|
_inherit = 'hr.version'
|
|
|
|
l10n_lu_index_on_contract_signature = fields.Float(
|
|
string='Index on Contract Signature (LU)', readonly=True, compute='_compute_indexed_wage', groups="hr_payroll.group_hr_payroll_user")
|
|
l10n_lu_indexed_wage = fields.Monetary(string='Indexed Wage (LU)', compute='_compute_indexed_wage', groups="hr_payroll.group_hr_payroll_user")
|
|
l10n_lu_current_index = fields.Float(string='Current Index (LU)', compute='_compute_indexed_wage', groups="hr_payroll.group_hr_payroll_user")
|
|
l10n_lu_meal_voucher_amount = fields.Monetary(string='Meal Vouchers (LU)', groups="hr_payroll.group_hr_payroll_user", tracking=True)
|
|
l10n_lu_meal_voucher_employer_cost = fields.Monetary(
|
|
string='Meal Voucher Employer Cost (LU)', compute='_compute_l10n_lu_meal_voucher_employer_cost', groups="hr_payroll.group_hr_payroll_user")
|
|
l10n_lu_meal_voucher_employee_computation = fields.Selection(
|
|
selection=[('removed_from_net', 'Removed From Net'),
|
|
('consider_as_bik', 'Consider as Benefit in Kind')],
|
|
string="Employee Computation (LU)",
|
|
required=True,
|
|
groups="hr_payroll.group_hr_payroll_user",
|
|
default='removed_from_net',
|
|
tracking=True,
|
|
)
|
|
l10n_lu_bik_meal_voucher_exceeding_amount = fields.Monetary(
|
|
string='BIK Meal Voucher Exceeding Amount (LU)', groups="hr_payroll.group_hr_payroll_user",
|
|
compute="_compute_l10n_lu_meal_voucher_employer_cost")
|
|
l10n_lu_bik_vehicle = fields.Monetary(string='BIK Vehicle (LU)', groups="hr_payroll.group_hr_payroll_user", tracking=True)
|
|
l10n_lu_bik_vehicle_vat_included = fields.Boolean(string='BIK Vehicle VAT Included (LU)', default=True, groups="hr_payroll.group_hr_payroll_user", tracking=True)
|
|
l10n_lu_bik_other_benefits = fields.Monetary(string='Others', groups="hr_payroll.group_hr_payroll_user", tracking=True)
|
|
l10n_lu_alw_vehicle = fields.Monetary(string='Allowance Vehicle (LU)', groups="hr_payroll.group_hr_payroll_user", tracking=True)
|
|
l10n_lu_tax_id_number = fields.Char(
|
|
string="Tax Identification Number",
|
|
groups="hr_payroll.group_hr_payroll_user",
|
|
tracking=True)
|
|
l10n_lu_tax_classification = fields.Selection([
|
|
('1', '1'),
|
|
('1a', '1a'),
|
|
('2', '2'),
|
|
('without', 'Without')],
|
|
string="Tax Classification",
|
|
default='1', required=True,
|
|
groups="hr_payroll.group_hr_payroll_user", tracking=True)
|
|
l10n_lu_tax_rate_no_classification = fields.Float(
|
|
string="Tax Rate",
|
|
groups="hr_payroll.group_hr_payroll_user", tracking=True)
|
|
l10n_lu_deduction_fd_daily = fields.Monetary(
|
|
string="FD",
|
|
help="Travel Expenses",
|
|
groups="hr_payroll.group_hr_payroll_user", tracking=True)
|
|
l10n_lu_deduction_fd_monthly = fields.Monetary(
|
|
compute="_compute_l10n_lu_deduction_fd",
|
|
groups="hr_payroll.group_hr_payroll_user")
|
|
l10n_lu_deduction_fd_yearly = fields.Monetary(
|
|
compute="_compute_l10n_lu_deduction_fd",
|
|
groups="hr_payroll.group_hr_payroll_user")
|
|
l10n_lu_deduction_ac_ae_daily = fields.Monetary(
|
|
string="AC/AE",
|
|
help="Spousal Deduction / Extra-professional Deduction",
|
|
groups="hr_payroll.group_hr_payroll_user", tracking=True)
|
|
l10n_lu_deduction_ac_ae_monthly = fields.Monetary(
|
|
compute="_compute_l10n_lu_deduction_ac_ae",
|
|
groups="hr_payroll.group_hr_payroll_user")
|
|
l10n_lu_deduction_ac_ae_yearly = fields.Monetary(
|
|
compute="_compute_l10n_lu_deduction_ac_ae",
|
|
groups="hr_payroll.group_hr_payroll_user")
|
|
l10n_lu_deduction_ce_daily = fields.Monetary(
|
|
string="CE",
|
|
help="Extraordinary Charges",
|
|
groups="hr_payroll.group_hr_payroll_user", tracking=True)
|
|
l10n_lu_deduction_ce_monthly = fields.Monetary(
|
|
compute="_compute_l10n_lu_deduction_ce",
|
|
groups="hr_payroll.group_hr_payroll_user")
|
|
l10n_lu_deduction_ce_yearly = fields.Monetary(
|
|
compute="_compute_l10n_lu_deduction_ce",
|
|
groups="hr_payroll.group_hr_payroll_user")
|
|
l10n_lu_deduction_ds_daily = fields.Monetary(
|
|
string="DS",
|
|
help="Special Expenses",
|
|
groups="hr_payroll.group_hr_payroll_user", tracking=True)
|
|
l10n_lu_deduction_ds_monthly = fields.Monetary(
|
|
compute="_compute_l10n_lu_deduction_ds",
|
|
groups="hr_payroll.group_hr_payroll_user")
|
|
l10n_lu_deduction_ds_yearly = fields.Monetary(
|
|
compute="_compute_l10n_lu_deduction_ds",
|
|
groups="hr_payroll.group_hr_payroll_user")
|
|
l10n_lu_deduction_fo_daily = fields.Monetary(
|
|
string="FO",
|
|
help="Obtaining Fees",
|
|
groups="hr_payroll.group_hr_payroll_user", tracking=True)
|
|
l10n_lu_deduction_fo_monthly = fields.Monetary(
|
|
compute="_compute_l10n_lu_deduction_fo",
|
|
groups="hr_payroll.group_hr_payroll_user")
|
|
l10n_lu_deduction_fo_yearly = fields.Monetary(
|
|
compute="_compute_l10n_lu_deduction_fo",
|
|
groups="hr_payroll.group_hr_payroll_user")
|
|
l10n_lu_deduction_amd_daily = fields.Monetary(
|
|
string="AMD",
|
|
help="Sustainable Mobility Deduction",
|
|
groups="hr_payroll.group_hr_payroll_user", tracking=True)
|
|
l10n_lu_deduction_amd_monthly = fields.Monetary(
|
|
compute="_compute_l10n_lu_deduction_amd",
|
|
groups="hr.group_hr_user")
|
|
l10n_lu_deduction_amd_yearly = fields.Monetary(
|
|
compute="_compute_l10n_lu_deduction_amd",
|
|
groups="hr_payroll.group_hr_payroll_user")
|
|
l10n_lu_package_ffo_daily = fields.Monetary(
|
|
string="FFO",
|
|
help="Obtaining Fees Package",
|
|
groups="hr_payroll.group_hr_payroll_user", tracking=True)
|
|
l10n_lu_package_ffo_monthly = fields.Monetary(
|
|
compute="_compute_l10n_lu_package_ffo",
|
|
groups="hr_payroll.group_hr_payroll_user")
|
|
l10n_lu_package_ffo_yearly = fields.Monetary(
|
|
compute="_compute_l10n_lu_package_ffo",
|
|
groups="hr_payroll.group_hr_payroll_user")
|
|
l10n_lu_package_fds_daily = fields.Monetary(
|
|
string="FDS",
|
|
help="Special Expenses Package",
|
|
groups="hr_payroll.group_hr_payroll_user", tracking=True)
|
|
l10n_lu_package_fds_monthly = fields.Monetary(
|
|
compute="_compute_l10n_lu_package_fds",
|
|
groups="hr_payroll.group_hr_payroll_user")
|
|
l10n_lu_package_fds_yearly = fields.Monetary(
|
|
compute="_compute_l10n_lu_package_fds",
|
|
groups="hr_payroll.group_hr_payroll_user")
|
|
l10n_lu_tax_credit_cis = fields.Boolean(
|
|
string="CIS",
|
|
help="Employee Tax Credit",
|
|
groups="hr_payroll.group_hr_payroll_user", tracking=True)
|
|
l10n_lu_tax_credit_cip = fields.Boolean(
|
|
string="CIP",
|
|
help="Retiree Tax Credit",
|
|
groups="hr_payroll.group_hr_payroll_user", tracking=True)
|
|
l10n_lu_tax_credit_cim = fields.Boolean(
|
|
string="CIM",
|
|
help="Single-parent Tax Credit",
|
|
groups="hr_payroll.group_hr_payroll_user", tracking=True)
|
|
|
|
_check_meal_voucher_amount = models.Constraint(
|
|
'check(l10n_lu_meal_voucher_amount = 0 OR l10n_lu_meal_voucher_amount >= 2.8)',
|
|
'The meal voucher amount can be zero for no meal voucher benefit or more than or equal to 2.8 euros'
|
|
)
|
|
|
|
@api.depends('wage')
|
|
def _compute_indexed_wage(self):
|
|
for version in self:
|
|
version.l10n_lu_index_on_contract_signature = self.env['hr.rule.parameter']._get_parameter_from_code('l10n_lu_index', date=version.date_start, raise_if_not_found=False)
|
|
version.l10n_lu_current_index = self.env['hr.rule.parameter']._get_parameter_from_code('l10n_lu_index', raise_if_not_found=False)
|
|
if version.l10n_lu_index_on_contract_signature and version.l10n_lu_current_index:
|
|
version.l10n_lu_indexed_wage = (
|
|
version.wage if version.wage_type == 'monthly' else version.hourly_wage
|
|
) / version.l10n_lu_index_on_contract_signature * version.l10n_lu_current_index
|
|
else:
|
|
version.l10n_lu_indexed_wage = version.wage
|
|
|
|
@api.depends('l10n_lu_meal_voucher_amount')
|
|
def _compute_l10n_lu_meal_voucher_employer_cost(self):
|
|
meal_voucher_max_value = self.env['hr.rule.parameter']._get_parameter_from_code('l10n_lu_meal_voucher_max_value', raise_if_not_found=False)
|
|
if not meal_voucher_max_value:
|
|
self.l10n_lu_meal_voucher_employer_cost = 0
|
|
self.l10n_lu_bik_meal_voucher_exceeding_amount = 0
|
|
return
|
|
# The employee always pays 2.8€ per meal voucher.
|
|
# The employer contributes for the rest up to a maximum amount.
|
|
for version in self:
|
|
if version.l10n_lu_meal_voucher_amount and version.l10n_lu_meal_voucher_amount > 2.8:
|
|
contract_employer_contribution = version.l10n_lu_meal_voucher_amount - 2.8
|
|
maximum_employer_contribution = meal_voucher_max_value - 2.8
|
|
version.l10n_lu_meal_voucher_employer_cost = min(contract_employer_contribution, maximum_employer_contribution)
|
|
else:
|
|
version.l10n_lu_meal_voucher_employer_cost = 0
|
|
|
|
version.l10n_lu_bik_meal_voucher_exceeding_amount = max(0, version.l10n_lu_meal_voucher_amount - meal_voucher_max_value)
|
|
|
|
@api.depends('l10n_lu_deduction_fd_daily')
|
|
def _compute_l10n_lu_deduction_fd(self):
|
|
days_per_month = self.env['hr.rule.parameter']._get_parameter_from_code('l10n_lu_days_per_month', raise_if_not_found=False) or 25
|
|
for version in self:
|
|
version.l10n_lu_deduction_fd_monthly = version.l10n_lu_deduction_fd_daily * days_per_month
|
|
version.l10n_lu_deduction_fd_yearly = version.l10n_lu_deduction_fd_monthly * 12
|
|
|
|
@api.depends('l10n_lu_deduction_ac_ae_daily')
|
|
def _compute_l10n_lu_deduction_ac_ae(self):
|
|
days_per_month = self.env['hr.rule.parameter']._get_parameter_from_code('l10n_lu_days_per_month', raise_if_not_found=False) or 25
|
|
for version in self:
|
|
version.l10n_lu_deduction_ac_ae_monthly = version.l10n_lu_deduction_ac_ae_daily * days_per_month
|
|
version.l10n_lu_deduction_ac_ae_yearly = version.l10n_lu_deduction_ac_ae_monthly * 12
|
|
|
|
@api.depends('l10n_lu_deduction_ce_daily')
|
|
def _compute_l10n_lu_deduction_ce(self):
|
|
days_per_month = self.env['hr.rule.parameter']._get_parameter_from_code('l10n_lu_days_per_month', raise_if_not_found=False) or 25
|
|
for version in self:
|
|
version.l10n_lu_deduction_ce_monthly = version.l10n_lu_deduction_ce_daily * days_per_month
|
|
version.l10n_lu_deduction_ce_yearly = version.l10n_lu_deduction_ce_monthly * 12
|
|
|
|
@api.depends('l10n_lu_deduction_ds_daily')
|
|
def _compute_l10n_lu_deduction_ds(self):
|
|
days_per_month = self.env['hr.rule.parameter']._get_parameter_from_code('l10n_lu_days_per_month', raise_if_not_found=False) or 25
|
|
for version in self:
|
|
version.l10n_lu_deduction_ds_monthly = version.l10n_lu_deduction_ds_daily * days_per_month
|
|
version.l10n_lu_deduction_ds_yearly = version.l10n_lu_deduction_ds_monthly * 12
|
|
|
|
@api.depends('l10n_lu_deduction_fo_daily')
|
|
def _compute_l10n_lu_deduction_fo(self):
|
|
days_per_month = self.env['hr.rule.parameter']._get_parameter_from_code('l10n_lu_days_per_month', raise_if_not_found=False) or 25
|
|
for version in self:
|
|
version.l10n_lu_deduction_fo_monthly = version.l10n_lu_deduction_fo_daily * days_per_month
|
|
version.l10n_lu_deduction_fo_yearly = version.l10n_lu_deduction_fo_monthly * 12
|
|
|
|
@api.depends('l10n_lu_deduction_amd_daily')
|
|
def _compute_l10n_lu_deduction_amd(self):
|
|
days_per_month = self.env['hr.rule.parameter']._get_parameter_from_code('l10n_lu_days_per_month', raise_if_not_found=False) or 25
|
|
for version in self:
|
|
version.l10n_lu_deduction_amd_monthly = version.l10n_lu_deduction_amd_daily * days_per_month
|
|
version.l10n_lu_deduction_amd_yearly = version.l10n_lu_deduction_amd_monthly * 12
|
|
|
|
@api.depends('l10n_lu_package_ffo_daily')
|
|
def _compute_l10n_lu_package_ffo(self):
|
|
days_per_month = self.env['hr.rule.parameter']._get_parameter_from_code('l10n_lu_days_per_month', raise_if_not_found=False) or 25
|
|
for version in self:
|
|
version.l10n_lu_package_ffo_monthly = version.l10n_lu_package_ffo_daily * days_per_month
|
|
version.l10n_lu_package_ffo_yearly = version.l10n_lu_package_ffo_monthly * 12
|
|
|
|
@api.depends('l10n_lu_package_fds_daily')
|
|
def _compute_l10n_lu_package_fds(self):
|
|
days_per_month = self.env['hr.rule.parameter']._get_parameter_from_code('l10n_lu_days_per_month', raise_if_not_found=False) or 25
|
|
for version in self:
|
|
version.l10n_lu_package_fds_monthly = version.l10n_lu_package_fds_daily * days_per_month
|
|
version.l10n_lu_package_fds_yearly = version.l10n_lu_package_fds_monthly * 12
|
|
|
|
@api.model
|
|
def _get_whitelist_fields_from_template(self):
|
|
whitelisted_fields = super()._get_whitelist_fields_from_template() or []
|
|
if self.env.company.country_id.code == "LU":
|
|
whitelisted_fields += [
|
|
"l10n_lu_alw_vehicle",
|
|
"l10n_lu_bik_other_benefits",
|
|
"l10n_lu_bik_vehicle",
|
|
"l10n_lu_bik_vehicle_vat_included",
|
|
"l10n_lu_current_index",
|
|
"l10n_lu_index_on_contract_signature",
|
|
"l10n_lu_indexed_wage",
|
|
"l10n_lu_meal_voucher_amount",
|
|
"l10n_lu_meal_voucher_employee_computation",
|
|
"l10n_lu_meal_voucher_employer_cost",
|
|
]
|
|
return whitelisted_fields
|
|
|
|
def _get_l10n_lu_indexed_wage(self, date=None):
|
|
self.ensure_one()
|
|
date = date or fields.Date.today()
|
|
|
|
index_at_signature = self.l10n_lu_index_on_contract_signature
|
|
index_at_date = self.env['hr.rule.parameter']._get_parameter_from_code(
|
|
'l10n_lu_index', date=date, raise_if_not_found=False
|
|
)
|
|
wage = self.wage if self.wage_type == 'monthly' else self.hourly_wage
|
|
|
|
if index_at_signature and index_at_date:
|
|
return wage / index_at_signature * index_at_date
|
|
return wage
|