Files
Odoo-Modules/fusion_payroll/data/hr_salary_rules.xml
gsinghpal 4fde4c7bd1 changes
2026-04-07 20:49:21 -04:00

573 lines
28 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="0">
<!-- ============================================================ -->
<!-- BASIC PAY (seq 1) -->
<!-- ============================================================ -->
<record id="hr_rule_basic" model="hr.salary.rule">
<field name="name">Basic Pay</field>
<field name="code">BASIC</field>
<field name="sequence">1</field>
<field name="struct_id" ref="hr_payroll_structure_canada"/>
<field name="category_id" ref="hr_payroll.BASIC"/>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="appears_on_payslip">True</field>
<field name="amount_python_compute">
result = payslip.paid_amount
</field>
</record>
<!-- ============================================================ -->
<!-- OVERTIME PAY (seq 3) -->
<!-- ============================================================ -->
<record id="hr_overtime_pay" model="hr.salary.rule">
<field name="name">Overtime Pay</field>
<field name="code">OT_PAY</field>
<field name="sequence">3</field>
<field name="struct_id" ref="hr_payroll_structure_canada"/>
<field name="category_id" ref="hr_payroll.ALW"/>
<field name="condition_select">python</field>
<field name="condition_python">result = (inputs.get('OT_HOURS') and inputs['OT_HOURS'].amount &gt; 0) or (inputs.get('OT') and inputs['OT'].amount &gt; 0)</field>
<field name="amount_select">code</field>
<field name="appears_on_payslip">True</field>
<field name="amount_python_compute">
if inputs.get('OT_HOURS') and inputs['OT_HOURS'].amount &gt; 0:
basic = result_rules.get('BASIC', {}).get('total', 0)
hours_per_period = payslip._rule_parameter('ca_standard_hours_per_period')
ot_multiplier = payslip._rule_parameter('ca_overtime_multiplier')
hourly_rate = basic / hours_per_period if hours_per_period else 0
result = inputs['OT_HOURS'].amount * hourly_rate * ot_multiplier
elif inputs.get('OT') and inputs['OT'].amount &gt; 0:
result = inputs['OT'].amount
else:
result = 0
</field>
</record>
<!-- ============================================================ -->
<!-- STAT HOLIDAY PAY (seq 4) -->
<!-- ============================================================ -->
<record id="hr_stat_holiday_pay" model="hr.salary.rule">
<field name="name">Stat Holiday Pay</field>
<field name="code">STAT_PAY</field>
<field name="sequence">4</field>
<field name="struct_id" ref="hr_payroll_structure_canada"/>
<field name="category_id" ref="hr_payroll.ALW"/>
<field name="condition_select">python</field>
<field name="condition_python">result = inputs.get('STAT_HOURS') and inputs['STAT_HOURS'].amount &gt; 0</field>
<field name="amount_select">code</field>
<field name="appears_on_payslip">True</field>
<field name="amount_python_compute">
stat_hours = inputs['STAT_HOURS'].amount if inputs.get('STAT_HOURS') else 0
basic = result_rules.get('BASIC', {}).get('total', 0)
hours_per_period = payslip._rule_parameter('ca_standard_hours_per_period')
hourly_rate = basic / hours_per_period if hours_per_period else 0
result = stat_hours * hourly_rate
</field>
</record>
<!-- ============================================================ -->
<!-- VACATION PAY (seq 5) -->
<!-- ============================================================ -->
<record id="hr_vacation_pay" model="hr.salary.rule">
<field name="name">Vacation Pay</field>
<field name="code">VAC_PAY</field>
<field name="sequence">5</field>
<field name="struct_id" ref="hr_payroll_structure_canada"/>
<field name="category_id" ref="hr_salary_rule_category_ca_earnings"/>
<field name="condition_select">python</field>
<field name="condition_python">result = inputs.get('VAC_PAY') and inputs['VAC_PAY'].amount &gt; 0</field>
<field name="amount_select">code</field>
<field name="appears_on_payslip">True</field>
<field name="amount_python_compute">
if inputs.get('VAC_PAY') and inputs['VAC_PAY'].amount &gt; 0:
result = round(float(inputs['VAC_PAY'].amount), 2)
else:
result = 0
</field>
</record>
<!-- ============================================================ -->
<!-- BONUS PAY (seq 6) -->
<!-- ============================================================ -->
<record id="hr_bonus_pay" model="hr.salary.rule">
<field name="name">Bonus</field>
<field name="code">BONUS_PAY</field>
<field name="sequence">6</field>
<field name="struct_id" ref="hr_payroll_structure_canada"/>
<field name="category_id" ref="hr_payroll.ALW"/>
<field name="condition_select">python</field>
<field name="condition_python">result = 'BONUS' in inputs</field>
<field name="amount_select">code</field>
<field name="appears_on_payslip">True</field>
<field name="amount_python_compute">
result = inputs['BONUS'].amount if inputs.get('BONUS') else 0
</field>
</record>
<!-- ============================================================ -->
<!-- COMMISSION (seq 7) -->
<!-- ============================================================ -->
<record id="hr_commission_pay" model="hr.salary.rule">
<field name="name">Commission</field>
<field name="code">COMMISSION</field>
<field name="sequence">7</field>
<field name="struct_id" ref="hr_payroll_structure_canada"/>
<field name="category_id" ref="hr_payroll.ALW"/>
<field name="condition_select">python</field>
<field name="condition_python">result = inputs.get('COMMISSION') and inputs['COMMISSION'].amount &gt; 0</field>
<field name="amount_select">code</field>
<field name="appears_on_payslip">True</field>
<field name="amount_python_compute">
result = inputs['COMMISSION'].amount if inputs.get('COMMISSION') else 0
</field>
</record>
<!-- ============================================================ -->
<!-- RETROACTIVE PAY (seq 8) -->
<!-- ============================================================ -->
<record id="hr_retro_pay" model="hr.salary.rule">
<field name="name">Retroactive Pay</field>
<field name="code">RETRO_PAY</field>
<field name="sequence">8</field>
<field name="struct_id" ref="hr_payroll_structure_canada"/>
<field name="category_id" ref="hr_payroll.ALW"/>
<field name="condition_select">python</field>
<field name="condition_python">result = inputs.get('RETRO_PAY') and inputs['RETRO_PAY'].amount &gt; 0</field>
<field name="amount_select">code</field>
<field name="appears_on_payslip">True</field>
<field name="amount_python_compute">
result = inputs['RETRO_PAY'].amount if inputs.get('RETRO_PAY') else 0
</field>
</record>
<!-- ============================================================ -->
<!-- SHIFT PREMIUM (seq 9) -->
<!-- ============================================================ -->
<record id="hr_shift_premium" model="hr.salary.rule">
<field name="name">Shift Premium</field>
<field name="code">SHIFT_PREMIUM</field>
<field name="sequence">9</field>
<field name="struct_id" ref="hr_payroll_structure_canada"/>
<field name="category_id" ref="hr_payroll.ALW"/>
<field name="condition_select">python</field>
<field name="condition_python">result = inputs.get('SHIFT_PREMIUM') and inputs['SHIFT_PREMIUM'].amount &gt; 0</field>
<field name="amount_select">code</field>
<field name="appears_on_payslip">True</field>
<field name="amount_python_compute">
result = inputs['SHIFT_PREMIUM'].amount if inputs.get('SHIFT_PREMIUM') else 0
</field>
</record>
<!-- ============================================================ -->
<!-- GROSS (seq 10) -->
<!-- ============================================================ -->
<record id="hr_rule_gross" model="hr.salary.rule">
<field name="name">Gross</field>
<field name="code">GROSS</field>
<field name="sequence">10</field>
<field name="struct_id" ref="hr_payroll_structure_canada"/>
<field name="category_id" ref="hr_payroll.GROSS"/>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="appears_on_payslip">True</field>
<field name="amount_python_compute">
result = (
result_rules.get('BASIC', {}).get('total', 0)
+ result_rules.get('OT_PAY', {}).get('total', 0)
+ result_rules.get('STAT_PAY', {}).get('total', 0)
+ result_rules.get('VAC_PAY', {}).get('total', 0)
+ result_rules.get('BONUS_PAY', {}).get('total', 0)
+ result_rules.get('COMMISSION', {}).get('total', 0)
+ result_rules.get('RETRO_PAY', {}).get('total', 0)
+ result_rules.get('SHIFT_PREMIUM', {}).get('total', 0)
)
</field>
</record>
<!-- ============================================================ -->
<!-- RRSP DEDUCTION (seq 15) -->
<!-- ============================================================ -->
<record id="hr_rrsp_deduction" model="hr.salary.rule">
<field name="name">RRSP Deduction</field>
<field name="code">RRSP</field>
<field name="sequence">15</field>
<field name="struct_id" ref="hr_payroll_structure_canada"/>
<field name="category_id" ref="hr_payroll.DED"/>
<field name="condition_select">python</field>
<field name="condition_python">result = inputs.get('RRSP') and inputs['RRSP'].amount &gt; 0</field>
<field name="amount_select">code</field>
<field name="appears_on_payslip">True</field>
<field name="amount_python_compute">
result = -(inputs['RRSP'].amount if inputs.get('RRSP') else 0)
</field>
</record>
<!-- ============================================================ -->
<!-- UNION DUES (seq 16) -->
<!-- ============================================================ -->
<record id="hr_union_dues" model="hr.salary.rule">
<field name="name">Union Dues</field>
<field name="code">UNION_DUES</field>
<field name="sequence">16</field>
<field name="struct_id" ref="hr_payroll_structure_canada"/>
<field name="category_id" ref="hr_payroll.DED"/>
<field name="condition_select">python</field>
<field name="condition_python">result = inputs.get('UNION') and inputs['UNION'].amount &gt; 0</field>
<field name="amount_select">code</field>
<field name="appears_on_payslip">True</field>
<field name="amount_python_compute">
result = -(inputs['UNION'].amount if inputs.get('UNION') else 0)
</field>
</record>
<!-- ============================================================ -->
<!-- CPP EMPLOYEE (seq 20) -->
<!-- ============================================================ -->
<record id="hr_cpp_employee" model="hr.salary.rule">
<field name="name">CPP Employee</field>
<field name="code">CPP_EE</field>
<field name="sequence">20</field>
<field name="struct_id" ref="hr_payroll_structure_canada"/>
<field name="category_id" ref="hr_salary_rule_category_ca_cpp"/>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="appears_on_payslip">True</field>
<field name="amount_python_compute">
gross_amount = result_rules.get('GROSS', {}).get('total', 0)
if employee.exempt_cpp:
result = 0
else:
cpp_rate = payslip._rule_parameter('ca_cpp_rate')
cpp_exemption = payslip._rule_parameter('ca_cpp_exemption')
cpp_max = payslip._rule_parameter('ca_cpp_max')
ympe = payslip._rule_parameter('ca_ympe')
period_exemption = cpp_exemption / 26
period_max = cpp_max / 26
period_ympe = ympe / 26
pensionable = min(gross_amount, period_ympe)
pensionable = max(pensionable - period_exemption, 0)
result = -min(pensionable * cpp_rate, period_max)
</field>
</record>
<!-- ============================================================ -->
<!-- CPP EMPLOYER (seq 21) -->
<!-- ============================================================ -->
<record id="hr_cpp_employer" model="hr.salary.rule">
<field name="name">CPP Employer</field>
<field name="code">CPP_ER</field>
<field name="sequence">21</field>
<field name="struct_id" ref="hr_payroll_structure_canada"/>
<field name="category_id" ref="hr_salary_rule_category_ca_employer"/>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="appears_on_payslip">True</field>
<field name="amount_python_compute">
result = -result_rules.get('CPP_EE', {}).get('total', 0)
</field>
</record>
<!-- ============================================================ -->
<!-- CPP2 EMPLOYEE (seq 22) -->
<!-- ============================================================ -->
<record id="hr_cpp2_employee" model="hr.salary.rule">
<field name="name">CPP2 Employee</field>
<field name="code">CPP2_EE</field>
<field name="sequence">22</field>
<field name="struct_id" ref="hr_payroll_structure_canada"/>
<field name="category_id" ref="hr_salary_rule_category_ca_cpp"/>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="appears_on_payslip">True</field>
<field name="amount_python_compute">
gross_amount = result_rules.get('GROSS', {}).get('total', 0)
if employee.exempt_cpp:
result = 0
else:
ympe = payslip._rule_parameter('ca_ympe')
cpp2_rate = payslip._rule_parameter('ca_cpp2_rate')
yampe = payslip._rule_parameter('ca_yampe')
cpp2_max = payslip._rule_parameter('ca_cpp2_max')
period_ympe = ympe / 26
period_ceiling = yampe / 26
period_max = cpp2_max / 26
if gross_amount &gt; period_ympe:
cpp2_pensionable = min(gross_amount, period_ceiling) - period_ympe
result = -min(cpp2_pensionable * cpp2_rate, period_max)
else:
result = 0
</field>
</record>
<!-- ============================================================ -->
<!-- CPP2 EMPLOYER (seq 23) -->
<!-- ============================================================ -->
<record id="hr_cpp2_employer" model="hr.salary.rule">
<field name="name">CPP2 Employer</field>
<field name="code">CPP2_ER</field>
<field name="sequence">23</field>
<field name="struct_id" ref="hr_payroll_structure_canada"/>
<field name="category_id" ref="hr_salary_rule_category_ca_employer"/>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="appears_on_payslip">True</field>
<field name="amount_python_compute">
result = -result_rules.get('CPP2_EE', {}).get('total', 0)
</field>
</record>
<!-- ============================================================ -->
<!-- EI EMPLOYEE (seq 25) -->
<!-- ============================================================ -->
<record id="hr_ei_employee" model="hr.salary.rule">
<field name="name">EI Employee</field>
<field name="code">EI_EE</field>
<field name="sequence">25</field>
<field name="struct_id" ref="hr_payroll_structure_canada"/>
<field name="category_id" ref="hr_salary_rule_category_ca_ei"/>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="appears_on_payslip">True</field>
<field name="amount_python_compute">
gross_amount = result_rules.get('GROSS', {}).get('total', 0)
if employee.exempt_ei:
result = 0
else:
ei_rate = payslip._rule_parameter('ca_ei_rate')
ei_max_insurable = payslip._rule_parameter('ca_ei_max_insurable')
ei_max = payslip._rule_parameter('ca_ei_max')
period_max_insurable = ei_max_insurable / 26
period_max_premium = ei_max / 26
insurable = min(gross_amount, period_max_insurable)
result = -min(insurable * ei_rate, period_max_premium)
</field>
</record>
<!-- ============================================================ -->
<!-- EI EMPLOYER (seq 26) -->
<!-- ============================================================ -->
<record id="hr_ei_employer" model="hr.salary.rule">
<field name="name">EI Employer</field>
<field name="code">EI_ER</field>
<field name="sequence">26</field>
<field name="struct_id" ref="hr_payroll_structure_canada"/>
<field name="category_id" ref="hr_salary_rule_category_ca_employer"/>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="appears_on_payslip">True</field>
<field name="amount_python_compute">
ei_employer_mult = payslip._rule_parameter('ca_ei_employer_mult')
result = -result_rules.get('EI_EE', {}).get('total', 0) * ei_employer_mult
</field>
</record>
<!-- ============================================================ -->
<!-- FEDERAL INCOME TAX (seq 30) -->
<!-- ============================================================ -->
<record id="hr_fed_tax" model="hr.salary.rule">
<field name="name">Federal Income Tax</field>
<field name="code">FED_TAX</field>
<field name="sequence">30</field>
<field name="struct_id" ref="hr_payroll_structure_canada"/>
<field name="category_id" ref="hr_salary_rule_category_ca_fed_tax"/>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="appears_on_payslip">True</field>
<field name="amount_python_compute">
if hasattr(employee, 'exempt_federal_tax') and employee.exempt_federal_tax:
result = 0
else:
gross_amount = result_rules.get('GROSS', {}).get('total', 0)
rrsp = abs(result_rules.get('RRSP', {}).get('total', 0))
union = abs(result_rules.get('UNION_DUES', {}).get('total', 0))
taxable_per_period = gross_amount - rrsp - union
annual_income = taxable_per_period * 26
fed_brackets = [
(payslip._rule_parameter('ca_fed_bracket_1'), payslip._rule_parameter('ca_fed_rate_1')),
(payslip._rule_parameter('ca_fed_bracket_2'), payslip._rule_parameter('ca_fed_rate_2')),
(payslip._rule_parameter('ca_fed_bracket_3'), payslip._rule_parameter('ca_fed_rate_3')),
(payslip._rule_parameter('ca_fed_bracket_4'), payslip._rule_parameter('ca_fed_rate_4')),
(float('inf'), payslip._rule_parameter('ca_fed_rate_5')),
]
bpa_max = payslip._rule_parameter('ca_fed_bpa')
bpa_min = payslip._rule_parameter('ca_fed_bpa_min')
cea = payslip._rule_parameter('ca_fed_cea')
phase_out_start = payslip._rule_parameter('ca_fed_bracket_3')
phase_out_end = payslip._rule_parameter('ca_fed_bracket_4')
td1_override = employee.federal_td1_amount if hasattr(employee, 'federal_td1_amount') and employee.federal_td1_amount &gt; 0 else 0
if td1_override:
fed_bpa = td1_override
elif annual_income &lt;= phase_out_start:
fed_bpa = bpa_max
elif annual_income &gt;= phase_out_end:
fed_bpa = bpa_min
else:
fed_bpa = bpa_max - (bpa_max - bpa_min) * (annual_income - phase_out_start) / (phase_out_end - phase_out_start)
tax = 0
prev_bracket = 0
for bracket, rate in fed_brackets:
taxable_in_bracket = min(annual_income, bracket) - prev_bracket
if taxable_in_bracket &gt; 0:
tax += taxable_in_bracket * rate
prev_bracket = bracket
if annual_income &lt;= bracket:
break
credit = fed_bpa * fed_brackets[0][1]
cea_credit = cea * fed_brackets[0][1]
annual_tax = max(tax - credit - cea_credit, 0)
additional = employee.federal_additional_tax or 0
result = -(annual_tax / 26 + additional)
</field>
</record>
<!-- ============================================================ -->
<!-- PROVINCIAL INCOME TAX (seq 35) -->
<!-- All 12 provinces/territories with surtax support -->
<!-- ============================================================ -->
<record id="hr_prov_tax" model="hr.salary.rule">
<field name="name">Provincial Income Tax</field>
<field name="code">PROV_TAX</field>
<field name="sequence">35</field>
<field name="struct_id" ref="hr_payroll_structure_canada"/>
<field name="category_id" ref="hr_salary_rule_category_ca_prov_tax"/>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="appears_on_payslip">True</field>
<field name="amount_python_compute">
gross_amount = result_rules.get('GROSS', {}).get('total', 0)
rrsp = abs(result_rules.get('RRSP', {}).get('total', 0))
union = abs(result_rules.get('UNION_DUES', {}).get('total', 0))
taxable_per_period = gross_amount - rrsp - union
annual_income = taxable_per_period * 26
province = employee.home_province or 'ON'
if province == 'QC':
result = 0
else:
PROV = {
'ON': {'b': [[53891, 0.0505], [107785, 0.0915], [150000, 0.1116], [220000, 0.1216], [0, 0.1316]], 'bpa': 12989, 'st': [[5818, 0.20], [7446, 0.36]]},
'AB': {'b': [[61200, 0.08], [154259, 0.10], [185111, 0.12], [246813, 0.13], [370220, 0.14], [0, 0.15]], 'bpa': 21885, 'st': []},
'BC': {'b': [[50363, 0.0506], [100728, 0.077], [115648, 0.105], [140430, 0.1229], [190405, 0.147], [265545, 0.168], [0, 0.205]], 'bpa': 12273, 'st': []},
'SK': {'b': [[54532, 0.105], [155805, 0.125], [0, 0.145]], 'bpa': 18635, 'st': []},
'MB': {'b': [[47000, 0.108], [100000, 0.1275], [0, 0.174]], 'bpa': 15780, 'st': []},
'NB': {'b': [[52333, 0.094], [104666, 0.14], [193861, 0.16], [0, 0.195]], 'bpa': 12458, 'st': []},
'NS': {'b': [[30995, 0.0879], [61991, 0.1495], [97417, 0.1667], [157124, 0.175], [0, 0.21]], 'bpa': 11481, 'st': []},
'PE': {'b': [[33928, 0.095], [65820, 0.1347], [106890, 0.166], [142250, 0.1762], [0, 0.19]], 'bpa': 12750, 'st': []},
'NL': {'b': [[44678, 0.087], [89354, 0.145], [159528, 0.158], [223340, 0.178], [285319, 0.198], [570638, 0.208], [1141275, 0.213], [0, 0.218]], 'bpa': 10382, 'st': []},
'NT': {'b': [[53003, 0.059], [106009, 0.086], [172346, 0.122], [0, 0.1405]], 'bpa': 16442, 'st': []},
'YT': {'b': [[58523, 0.064], [117045, 0.09], [181440, 0.109], [500000, 0.128], [0, 0.15]], 'bpa': 16729, 'st': []},
'NU': {'b': [[55801, 0.04], [111602, 0.07], [181439, 0.09], [0, 0.115]], 'bpa': 17091, 'st': []},
}
cfg = PROV.get(province, PROV['ON'])
prov_brackets = []
for br in cfg['b']:
t = br[0] if br[0] != 0 else float('inf')
prov_brackets.append((t, br[1]))
tax = 0
prev_bracket = 0
for bracket, rate in prov_brackets:
taxable_in_bracket = min(annual_income, bracket) - prev_bracket
if taxable_in_bracket &gt; 0:
tax += taxable_in_bracket * rate
prev_bracket = bracket
if annual_income &lt;= bracket:
break
prov_bpa = cfg['bpa']
if employee.provincial_claim_amount and employee.provincial_claim_amount &gt; 0:
prov_bpa = employee.provincial_claim_amount
prov_credit = prov_bpa * prov_brackets[0][1]
basic_provincial_tax = max(tax - prov_credit, 0)
surtax = 0
for s in cfg['st']:
if basic_provincial_tax &gt; s[0]:
surtax += (basic_provincial_tax - s[0]) * s[1]
total_provincial_tax = basic_provincial_tax + surtax
result = -(total_provincial_tax / 26)
</field>
</record>
<!-- ============================================================ -->
<!-- ONTARIO HEALTH PREMIUM (seq 36) -->
<!-- ============================================================ -->
<record id="hr_ohp" model="hr.salary.rule">
<field name="name">Ontario Health Premium</field>
<field name="code">OHP</field>
<field name="sequence">36</field>
<field name="struct_id" ref="hr_payroll_structure_canada"/>
<field name="category_id" ref="hr_salary_rule_category_ca_ohp"/>
<field name="condition_select">python</field>
<field name="condition_python">
province = employee.home_province or 'ON'
result = (province == 'ON')
</field>
<field name="amount_select">code</field>
<field name="appears_on_payslip">True</field>
<field name="amount_python_compute">
gross_amount = result_rules.get('GROSS', {}).get('total', 0)
rrsp = abs(result_rules.get('RRSP', {}).get('total', 0))
union = abs(result_rules.get('UNION_DUES', {}).get('total', 0))
taxable_per_period = gross_amount - rrsp - union
annual_income = taxable_per_period * 26
ohp = 0
if annual_income &lt;= 20000:
ohp = 0
elif annual_income &lt;= 36000:
ohp = min((annual_income - 20000) * 0.06, 300)
elif annual_income &lt;= 48000:
ohp = 300 + min((annual_income - 36000) * 0.06, 150)
elif annual_income &lt;= 72000:
ohp = 450 + min((annual_income - 48000) * 0.0025, 150)
elif annual_income &lt;= 200000:
ohp = 600 + min((annual_income - 72000) * 0.0025, 300)
else:
ohp = 900
result = -(ohp / 26)
</field>
</record>
<!-- ============================================================ -->
<!-- NET PAY (seq 100) -->
<!-- ============================================================ -->
<record id="hr_rule_net" model="hr.salary.rule">
<field name="name">Net Pay</field>
<field name="code">NET</field>
<field name="sequence">100</field>
<field name="struct_id" ref="hr_payroll_structure_canada"/>
<field name="category_id" ref="hr_payroll.NET"/>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="appears_on_payslip">True</field>
<field name="amount_python_compute">
result = (
result_rules.get('GROSS', {}).get('total', 0)
+ result_rules.get('RRSP', {}).get('total', 0)
+ result_rules.get('UNION_DUES', {}).get('total', 0)
+ result_rules.get('CPP_EE', {}).get('total', 0)
+ result_rules.get('CPP2_EE', {}).get('total', 0)
+ result_rules.get('EI_EE', {}).get('total', 0)
+ result_rules.get('FED_TAX', {}).get('total', 0)
+ result_rules.get('PROV_TAX', {}).get('total', 0)
+ result_rules.get('OHP', {}).get('total', 0)
)
</field>
</record>
</data>
</odoo>