You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
7.2 KiB
XML
156 lines
7.2 KiB
XML
<?xml version="1.0" encoding="utf-8" ?>
|
|
<odoo>
|
|
<record id="SICKNESS" model="hr.salary.rule.category">
|
|
<field name="name">Gestion des arrêts maladie</field>
|
|
<field name="code">SICKNESS</field>
|
|
</record>
|
|
<record id ="CALENDAR_SICKNESS_DAYS" model="hr.salary.rule">
|
|
<field name="name">Arrêt maladie (Jours Calendaires)</field>
|
|
<field name="code">CALENDAR_SICKNESS_DAYS</field>
|
|
<field name="active">true</field>
|
|
<field name="appears_on_payslip">false</field>
|
|
<field name="sequence" eval="100" />
|
|
<field name="category_id" ref="gn_payroll.SICKNESS" />
|
|
<field name="condition_select">python</field>
|
|
<field name="condition_python">
|
|
if (inputs.SICKNESS_FIRST_DAY and inputs.SICKNESS_FIRST_DAY.amount > 0) or (inputs.SICKNESS_LAST_DAY and inputs.SICKNESS_LAST_DAY.amount > 0):
|
|
result = True
|
|
</field>
|
|
<field name="amount_select">code</field>
|
|
<field name="amount_python_compute">
|
|
first_day = payroll.date_from.day
|
|
if inputs.SICKNESS_FIRST_DAY and \
|
|
inputs.SICKNESS_FIRST_DAY.amount and \
|
|
inputs.SICKNESS_FIRST_DAY.amount > 0:
|
|
if (inputs.SICKNESS_FIRST_DAY.amount > payroll.date_to.day) or \
|
|
(payroll.date_from.day > inputs.SICKNESS_FIRST_DAY.amount):
|
|
raise UserError("La date de début de l'arrêt maladie ne peut pas être en dehors des dates de la fiche de paye.")
|
|
else:
|
|
first_day = inputs.SICKNESS_FIRST_DAY.amount
|
|
|
|
last_day = payroll.date_to.day
|
|
if inputs.SICKNESS_LAST_DAY and \
|
|
inputs.SICKNESS_LAST_DAY.amount and \
|
|
inputs.SICKNESS_LAST_DAY.amount > 0:
|
|
if (inputs.SICKNESS_LAST_DAY.amount > payroll.date_to.day) or \
|
|
(payroll.date_from.day > inputs.SICKNESS_LAST_DAY.amount):
|
|
raise UserError("La date de fin de l'arrêt maladie ne peut pas être en dehors des dates de la fiche de paye.")
|
|
else:
|
|
last_day = inputs.SICKNESS_LAST_DAY.amount
|
|
|
|
calendar_days = []
|
|
for day in range(first_day, last_day, 1):
|
|
calendar_days.append(first_day)
|
|
result = calendar_days
|
|
</field>
|
|
</record>
|
|
<record id="SICKNESS_FIRST_DAY" model="hr.rule.input">
|
|
<field name="name">Arrêt maladie (Jour du mois de début de l'arrêt maladie)</field>
|
|
<field name="code">SICKNESS_FIRST_DAY_INPUT</field>
|
|
<field name="input_id" ref="gn_payroll.CALENDAR_SICKNESS_DAYS" />
|
|
</record>
|
|
<record id="SICKNESS_LAST_DAY" model="hr.rule.input">
|
|
<field name="name">Arrêt maladie (Jour du mois de fin de l'arrêt maladie)</field>
|
|
<field name="code">SICKNESS_LAST_DAY_INPUT</field>
|
|
<field name="input_id" ref="gn_payroll.CALENDAR_SICKNESS_DAYS" />
|
|
</record>
|
|
<record id="NON_WORKED_SICKNESS_DAYS_INPUT" model="hr.rule.input">
|
|
<field name="name">Arrêt maladie (Jours non-travaillés)</field>
|
|
<field name="code">NON_WORKED_SICKNESS_DAYS_INPUT</field>
|
|
<field name="input_id" ref="gn_payroll.CALENDAR_SICKNESS_DAYS" />
|
|
</record>
|
|
<record id="CALENDAR_SICKNESS_DAYS_INPUT" model="hr.rule.input">
|
|
<field name="name">Arrêt maladie (Jours calendaires)</field>
|
|
<field name="code">CALENDAR_SICKNESS_DAYS_INPUT</field>
|
|
<field name="input_id" ref="gn_payroll.CALENDAR_SICKNESS_DAYS" />
|
|
</record>
|
|
<record id ="NON_WORKED_SICKNESS_DAYS" model="hr.salary.rule">
|
|
<field name="name">Arrêt maladie (Jours non-travaillés)</field>
|
|
<field name="code">NON_WORKED_SICKNESS_DAYS</field>
|
|
<field name="active">true</field>
|
|
<field name="appears_on_payslip">false</field>
|
|
<field name="sequence" eval="101" />
|
|
<field name="category_id" ref="gn_payroll.SICKNESS" />
|
|
<field name="condition_select">python</field>
|
|
<field name="condition_python">
|
|
if rules.CALENDAR_SICKNESS_DAYS:
|
|
result = True
|
|
</field>
|
|
<field name="amount_select">code</field>
|
|
<field name="amount_python_compute">
|
|
non_worked_days = []
|
|
for sick_day in CALENDAR_SICKNESS_DAYS:
|
|
is_day_worked = payslip.date_from.replace(day = sick_day).weekday()
|
|
for planned_day in contract.resource_calendar_id.attendance_ids:
|
|
if is_day_worked == int(x.dayofweek):
|
|
non_worked_days.append(sick_day)
|
|
break
|
|
result = non_worked_days
|
|
</field>
|
|
</record>
|
|
<record id ="WAITING_SICKNESS_DAYS" model="hr.salary.rule">
|
|
<field name="name">Arrêt maladie (Jours de Carence)</field>
|
|
<field name="code">WAITING_SICKNESS_DAYS</field>
|
|
<field name="active">true</field>
|
|
<field name="appears_on_payslip">false</field>
|
|
<field name="sequence" eval="101" />
|
|
<field name="category_id" ref="gn_payroll.SICKNESS" />
|
|
<field name="condition_select">python</field>
|
|
<field name="condition_python">
|
|
if rules.CALENDAR_SICKNESS_DAYS:
|
|
result = True
|
|
</field>
|
|
<field name="amount_select">code</field>
|
|
<field name="amount_python_compute">
|
|
from operator import itemgetter
|
|
if payslip.company_id.cc.idcc == 1518:
|
|
sickness_start_day = payslip.date_from.replace(day=CALENDAR_SICKNESS_DAYS[0])
|
|
# Let's check if contract (or 1st contract if consecutive contracts) is older than 6 months:
|
|
first_contract_day = payslip.contract_id.date_start
|
|
employee_contracts = [contract for contract in payslip.employee_id.contract_ids if \
|
|
(contract.id != payslip.contract_id.id and payslip.date_from >= contract.date_start) else None]
|
|
sorted_employee_contracts = sorted(employee_contracts, key=itemgetter('date_start'), reverse=True)
|
|
|
|
for contract in sorted_employee_contracts:
|
|
if contract.date_end == first_contract_day - 1:
|
|
first_contract_day = contract.date_start
|
|
else:
|
|
break
|
|
|
|
if 90 >= sickness_start_day - first_contract_day:
|
|
result = 3
|
|
else:
|
|
result = 0
|
|
</field>
|
|
</record>
|
|
<record id="WAITING_SICKNESS_DAYS_INPUT" model="hr.rule.input">
|
|
<field name="name">Arrêt maladie (Jours de Carence)</field>
|
|
<field name="code">WAITING_SICKNESS_DAYS_INPUT</field>
|
|
<field name="input_id" ref="gn_payroll.WAITING_SICKNESS_DAYS" />
|
|
</record>
|
|
<record id ="IJSS_SICKNESS" model="hr.salary.rule">
|
|
<field name="name">Arrêt maladie (Montant IJSS Brut)</field>
|
|
<field name="code">IJSS_SICKNESS</field>
|
|
<field name="active">true</field>
|
|
<field name="appears_on_payslip">false</field>
|
|
<field name="sequence" eval="101" />
|
|
<field name="category_id" ref="gn_payroll.SICKNESS" />
|
|
<field name="condition_select">python</field>
|
|
<field name="condition_python">
|
|
if rules.CALENDAR_SICKNESS_DAYS:
|
|
result = True
|
|
</field>
|
|
<field name="amount_select">code</field>
|
|
<field name="amount_python_compute">
|
|
daily_wage = contract.wage * 3 / 91.25
|
|
daily_ijss = daily_wage / 2
|
|
number_of_compensated_days = len(CALENDAR_SICKNESS_DAYS) - WAITING_SICKNESS_DAYS
|
|
result = daily_ijss * number_of_compensated_days
|
|
</field>
|
|
</record>
|
|
<record id="IJSS_SICKNESS_INPUT" model="hr.rule.input">
|
|
<field name="name">Arrêt maladie (Montant IJSS)</field>
|
|
<field name="code">IJSS_SICKNESS_INPUT</field>
|
|
<field name="input_id" ref="gn_payroll.IJSS_SICKNESS" />
|
|
</record>
|
|
</odoo> |