chore: import enterprise addons 19.0 bulk snapshot

This commit is contained in:
1b-agent committed 2026-09-16 10:13:08 +00:00
commit ca4af030d3
39951 files changed
+15570005

No files matched your search

+4
View File
@@ -0,0 +1,4 @@
# -*- coding:utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import models
+1
View File
@@ -0,0 +1 @@
{'name': 'Netherlands - Payroll', 'countries': ['nl'], 'category': 'Human Resources/Payroll', 'depends': ['hr_work_entry_holidays'], 'auto_install': ['hr_payroll'], 'version': '1.0', 'description': '\nDutch Payroll Rules.\n=========================\n\n * Employee Details\n * Employee Contracts\n * Passport based Contract\n * Allowances/Deductions\n * Allow to configure Basic/Gross/Net Salary\n * Employee Payslip\n * Integrated with Leaves Management\n ', 'data': ['data/hr_salary_rule_category_data.xml', 'data/hr_payroll_structure_type_data.xml', 'views/hr_payroll_report.xml', 'data/hr_payroll_structure_data.xml', 'data/hr_rule_parameters_data.xml', 'data/hr_salary_rule_data.xml', 'views/report_payslip_templates.xml', 'views/hr_contract_template_views.xml', 'views/hr_employee_views.xml'], 'demo': ['data/l10n_nl_hr_payroll_demo.xml'], 'author': 'Odoo S.A.', 'license': 'LGPL-3'}
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="hr_payroll_structure_nl_employee_salary" model="hr.payroll.structure">
<field name="name">Netherlands: Regular Pay</field>
<field name="code">NLMONTHLY</field>
<field name="country_id" ref="base.nl"/>
<field name="type_id" ref="l10n_nl_hr_payroll.structure_type_employee_nl"/>
<field name="report_id" ref="l10n_nl_hr_payroll.action_report_payslip_nl"/>
<field name="rule_ids" eval="[]"/>
</record>
<record id="l10n_nl_hr_payroll.structure_type_employee_nl" model="hr.payroll.structure.type">
<field name="default_struct_id" ref="hr_payroll_structure_nl_employee_salary"/>
</record>
</odoo>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="structure_type_employee_nl" model="hr.payroll.structure.type">
<field name="name">Netherlands: Employee</field>
<field name="default_resource_calendar_id" eval="ref('resource.resource_calendar_std', raise_if_not_found=False)"/>
<field name="country_id" ref="base.nl"/>
</record>
</odoo>
@@ -0,0 +1,76 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="rule_parameter_income_tax_rates_resident" model="hr.rule.parameter">
<field name="name">Netherlands: Residents Income Tax Rates</field>
<field name="code">l10n_nl_income_tax_rates_resident</field>
<field name="country_id" ref="base.nl"/>
</record>
<record id="rule_parameter_income_tax_rates_resident_2023" model="hr.rule.parameter.value">
<field name="parameter_value">[
( 0.00, 35742.00, 9.28),
(35742.01, 73031.00, 36.93),
(73031.01, 99999999.99, 49.5),
]</field>
<field name="rule_parameter_id" ref="rule_parameter_income_tax_rates_resident"/>
<field name="date_from" eval="datetime(2017, 1, 1).date()"/>
</record>
<record id="rule_parameter_income_tax_rates_resident_2026" model="hr.rule.parameter.value">
<field name="parameter_value">[
( 0.00, 38883.00, 35.82),
(38883.01, 78426.00, 37.48),
(78426.01, 99999999.99, 49.5),
]</field>
<field name="rule_parameter_id" ref="rule_parameter_income_tax_rates_resident"/>
<field name="date_from" eval="datetime(2026, 1, 1).date()"/>
</record>
<record id="rule_parameter_income_tax_rates_non_resident" model="hr.rule.parameter">
<field name="name">Netherlands: Non Residents Income Tax Rates</field>
<field name="code">l10n_nl_income_tax_rates_non_resident</field>
<field name="country_id" ref="base.nl"/>
</record>
<record id="rule_parameter_income_tax_rates_non_resident_2023" model="hr.rule.parameter.value">
<field name="parameter_value">[
( 0.00, 35742.00, 9.28),
(35742.01, 73031.00, 36.93),
(73031.01, 99999999.99, 49.5),
]</field>
<field name="rule_parameter_id" ref="rule_parameter_income_tax_rates_non_resident"/>
<field name="date_from" eval="datetime(2017, 1, 1).date()"/>
</record>
<!-- {code: [resident_rate, non_resident_rate, cap]} -->
<record id="rule_parameter_social_security_rates_employee" model="hr.rule.parameter">
<field name="name">Netherlands: Employee Social Security Rates and Thresholds</field>
<field name="code">l10n_nl_social_security_rates_employee</field>
<field name="country_id" ref="base.nl"/>
</record>
<record id="rule_parameter_social_security_rates_employee_2023" model="hr.rule.parameter.value">
<field name="parameter_value">{
'AOW': [17.9, 17.9, 35129.00],
'Anw': [ 0.1, 1.00, 35129.00],
'Wlz': [9.65, 9.65, 35129.00],
}</field>
<field name="rule_parameter_id" ref="rule_parameter_social_security_rates_employee"/>
<field name="date_from" eval="datetime(2017, 1, 1).date()"/>
</record>
<!-- {code: [resident_rate, non_resident_rate, cap]} -->
<record id="rule_parameter_social_security_rates_employer" model="hr.rule.parameter">
<field name="name">Netherlands: Employer Social Security Rates and Thresholds</field>
<field name="code">l10n_nl_social_security_rates_employer</field>
<field name="country_id" ref="base.nl"/>
</record>
<record id="rule_parameter_social_security_rates_employer_2023" model="hr.rule.parameter.value">
<field name="parameter_value">{
'Zvw': [6.75, 6.75, 3886.93],
'WW': [2.64, 2.64, 2013.37],
'WWFund': [0.77, 0.77, 430.64],
'WAO/WIA': [7.11, 7.11, 3892.52],
'Whk': [1.53, 15.3, 699.09],
}</field>
<field name="rule_parameter_id" ref="rule_parameter_social_security_rates_employer"/>
<field name="date_from" eval="datetime(2017, 1, 1).date()"/>
</record>
</odoo>
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="hr_salary_rule_category_social_security_employee" model="hr.salary.rule.category">
<field name="name">Employee Social Security Deductions</field>
<field name="name@nl">Socialezekerheidsbijdragen werknemer</field>
<field name="code">SOCIALSECURITYEMPLOYEE</field>
<field name="parent_id" ref="hr_payroll.DED"/>
<field name="country_id" ref="base.nl"/>
</record>
<record id="hr_salary_rule_category_income_tax" model="hr.salary.rule.category">
<field name="name">Income Tax</field>
<field name="name@nl">Inkomstenbelasting</field>
<field name="code">INCOMETAX</field>
<field name="parent_id" ref="hr_payroll.DED"/>
<field name="country_id" ref="base.nl"/>
</record>
<record id="hr_salary_rule_category_social_security_employer" model="hr.salary.rule.category">
<field name="name">Employer Social Security Deductions</field>
<field name="name@nl">Socialezekerheidsbijdragen werkgever</field>
<field name="code">SOCIALSECURITYEMPLOYER</field>
<field name="country_id" ref="base.nl"/>
</record>
<record id="hr_salary_rule_category_taxable_income" model="hr.salary.rule.category">
<field name="name">Taxable Income</field>
<field name="name@nl">Belastbaar inkomen</field>
<field name="code">TAXABLE</field>
<field name="country_id" ref="base.nl"/>
</record>
</odoo>
@@ -0,0 +1,330 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--
https://www.icalculator.info/netherlands.html
https://www.icalculator.info/netherlands/income-tax-rates/2023.html
-->
<record id="l10n_nl_hr_payroll_structure_nl_employee_salary_basic_salary_rule" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.BASIC"/>
<field name="name">Basic Salary</field>
<field name="sequence">1</field>
<field name="code">BASIC</field>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result = payslip.paid_amount
</field>
<field name="struct_id" ref="hr_payroll_structure_nl_employee_salary"/>
</record>
<record id="l10n_nl_hr_payroll_structure_nl_employee_salary_gross_salary_rule" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.GROSS"/>
<field name="name">Taxable Salary</field>
<field name="sequence">100</field>
<field name="code">GROSS</field>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result = categories['BASIC'] + categories['ALW']
</field>
<field name="struct_id" ref="hr_payroll_structure_nl_employee_salary"/>
</record>
<record id="l10n_nl_old_age_insurance" model="hr.salary.rule">
<field name="category_id" ref="l10n_nl_hr_payroll.hr_salary_rule_category_social_security_employee"/>
<field name="name">Old Age Insurance (AOW)</field>
<field name="name@nl">Ouderdomsverzekering (AOW)</field>
<field name="code">AOW</field>
<field name="sequence">105</field>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
gross = categories['GROSS']
if version.employee_id.is_non_resident and version.l10n_nl_30_percent:
gross *= 0.70
rates = payslip._rule_parameter('l10n_nl_social_security_rates_employee')['AOW']
result_rate = -(rates[1] if version.employee_id.is_non_resident else rates[0])
cap = rates[2] / 12
result = min(gross, cap)
</field>
<field name="struct_id" ref="l10n_nl_hr_payroll.hr_payroll_structure_nl_employee_salary"/>
</record>
<record id="l10n_nl_survivor_dependant_insurance" model="hr.salary.rule">
<field name="category_id" ref="l10n_nl_hr_payroll.hr_salary_rule_category_social_security_employee"/>
<field name="name">Survivor Dependant Insurance (Anw)</field>
<field name="name@nl">Nabestaandenverzekering (Anw)</field>
<field name="code">Anw</field>
<field name="sequence">110</field>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
gross = categories['GROSS']
if version.employee_id.is_non_resident and version.l10n_nl_30_percent:
gross *= 0.70
rates = payslip._rule_parameter('l10n_nl_social_security_rates_employee')['Anw']
result_rate = -(rates[1] if version.employee_id.is_non_resident else rates[0])
cap = rates[2] / 12
result = min(gross, cap)
</field>
<field name="struct_id" ref="l10n_nl_hr_payroll.hr_payroll_structure_nl_employee_salary"/>
</record>
<record id="l10n_nl_long_medical_care_insurance" model="hr.salary.rule">
<field name="category_id" ref="l10n_nl_hr_payroll.hr_salary_rule_category_social_security_employee"/>
<field name="name">Long Medical Care Insurance (Wlz)</field>
<field name="name@nl">Langdurige zorgverzekering (Wlz)</field>
<field name="code">Wlz</field>
<field name="sequence">115</field>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
gross = categories['GROSS']
if version.employee_id.is_non_resident and version.l10n_nl_30_percent:
gross *= 0.70
rates = payslip._rule_parameter('l10n_nl_social_security_rates_employee')['Wlz']
result_rate = -(rates[1] if version.employee_id.is_non_resident else rates[0])
cap = rates[2] / 12
result = min(gross, cap)
</field>
<field name="struct_id" ref="l10n_nl_hr_payroll.hr_payroll_structure_nl_employee_salary"/>
</record>
<record id="l10n_nl_taxable_income" model="hr.salary.rule">
<field name="category_id" ref="l10n_nl_hr_payroll.hr_salary_rule_category_taxable_income"/>
<field name="name">Taxable Income</field>
<field name="name@nl">Belastbaar inkomen</field>
<field name="code">TAXABLE</field>
<field name="sequence">150</field>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
gross = categories['GROSS']
if version.employee_id.is_non_resident and version.l10n_nl_30_percent:
gross *= 0.70
result = gross + categories['DED']
</field>
<field name="struct_id" ref="l10n_nl_hr_payroll.hr_payroll_structure_nl_employee_salary"/>
</record>
<record id="l10n_nl_income_tax" model="hr.salary.rule">
<field name="category_id" ref="l10n_nl_hr_payroll.hr_salary_rule_category_income_tax"/>
<field name="name">Income Tax Due</field>
<field name="name@nl">Verschuldigde inkomstenbelasting</field>
<field name="code">INCOMETAX</field>
<field name="sequence">160</field>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
if version.employee_id.is_non_resident:
rates = payslip._rule_parameter('l10n_nl_income_tax_rates_non_resident')
else:
rates = payslip._rule_parameter('l10n_nl_income_tax_rates_resident')
gross = categories['TAXABLE']
result = 0
for low, high, rate in rates:
low /= 12.0
high /= 12.0
if gross &gt; low:
result -= min(gross - low, high) * rate / 100.0
</field>
<field name="struct_id" ref="l10n_nl_hr_payroll.hr_payroll_structure_nl_employee_salary"/>
</record>
<record id="l10n_nl_health_insurance" model="hr.salary.rule">
<field name="category_id" ref="l10n_nl_hr_payroll.hr_salary_rule_category_social_security_employer"/>
<field name="name">Health Insurance (Zvw)</field>
<field name="name@nl">Zorgverzekering (Zvw)</field>
<field name="code">Zvw</field>
<field name="sequence">165</field>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
gross = categories['GROSS']
if version.employee_id.is_non_resident and version.l10n_nl_30_percent:
gross *= 0.70
rates = payslip._rule_parameter('l10n_nl_social_security_rates_employer')['Zvw']
result_rate = -(rates[1] if version.employee_id.is_non_resident else rates[0])
cap = rates[2] / 12
result = min(gross, - cap * 100 / result_rate)
</field>
<field name="appears_on_payslip" eval="False"/>
<field name="struct_id" ref="l10n_nl_hr_payroll.hr_payroll_structure_nl_employee_salary"/>
</record>
<record id="l10n_nl_unemployment_insurance" model="hr.salary.rule">
<field name="category_id" ref="l10n_nl_hr_payroll.hr_salary_rule_category_social_security_employer"/>
<field name="name">Unemployment Insurance (WW)</field>
<field name="name@nl">Werkloosheidsverzekering (WW)</field>
<field name="code">WW</field>
<field name="sequence">166</field>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
gross = categories['GROSS']
if version.employee_id.is_non_resident and version.l10n_nl_30_percent:
gross *= 0.70
rates = payslip._rule_parameter('l10n_nl_social_security_rates_employer')['WW']
result_rate = -(rates[1] if version.employee_id.is_non_resident else rates[0])
cap = rates[2] / 12
result = min(gross, - cap * 100 / result_rate)
</field>
<field name="appears_on_payslip" eval="False"/>
<field name="struct_id" ref="l10n_nl_hr_payroll.hr_payroll_structure_nl_employee_salary"/>
</record>
<record id="l10n_nl_ww_sector_fund" model="hr.salary.rule">
<field name="category_id" ref="l10n_nl_hr_payroll.hr_salary_rule_category_social_security_employer"/>
<field name="name">Unemployment Insurance Sector Fund (WW)</field>
<field name="name@nl">Sectorfonds voor Werkloosheidsverzekering (WW)</field>
<field name="code">WWFund</field>
<field name="sequence">167</field>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
gross = categories['GROSS']
if version.employee_id.is_non_resident and version.l10n_nl_30_percent:
gross *= 0.70
rates = payslip._rule_parameter('l10n_nl_social_security_rates_employer')['WWFund']
result_rate = -(rates[1] if version.employee_id.is_non_resident else rates[0])
cap = rates[2] / 12
result = min(gross, - cap * 100 / result_rate)
</field>
<field name="appears_on_payslip" eval="False"/>
<field name="struct_id" ref="l10n_nl_hr_payroll.hr_payroll_structure_nl_employee_salary"/>
</record>
<record id="l10n_nl_disability_insurance" model="hr.salary.rule">
<field name="category_id" ref="l10n_nl_hr_payroll.hr_salary_rule_category_social_security_employer"/>
<field name="name">Disability Insurance (WAO/WIA)</field>
<field name="name@nl">Invaliditeitsverzekering (WAO/WIA)</field>
<field name="code">WAO/WIA</field>
<field name="sequence">168</field>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
gross = categories['GROSS']
if version.employee_id.is_non_resident and version.l10n_nl_30_percent:
gross *= 0.70
rates = payslip._rule_parameter('l10n_nl_social_security_rates_employer')['WAO/WIA']
result_rate = -(rates[1] if version.employee_id.is_non_resident else rates[0])
cap = rates[2] / 12
result = min(gross, - cap * 100 / result_rate)
</field>
<field name="appears_on_payslip" eval="False"/>
<field name="struct_id" ref="l10n_nl_hr_payroll.hr_payroll_structure_nl_employee_salary"/>
</record>
<record id="l10n_nl_return_to_work_fund" model="hr.salary.rule">
<field name="category_id" ref="l10n_nl_hr_payroll.hr_salary_rule_category_social_security_employer"/>
<field name="name">Return to Work Fund - Average (Whk)</field>
<field name="name@nl">Werkhervattingskas - Gemiddeld (Whk)</field>
<field name="code">Whk</field>
<field name="sequence">169</field>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
gross = categories['GROSS']
if version.employee_id.is_non_resident and version.l10n_nl_30_percent:
gross *= 0.70
rates = payslip._rule_parameter('l10n_nl_social_security_rates_employer')['Whk']
result_rate = -(rates[1] if version.employee_id.is_non_resident else rates[0])
cap = rates[2] / 12
result = min(gross, - cap * 100 / result_rate)
</field>
<field name="appears_on_payslip" eval="False"/>
<field name="struct_id" ref="l10n_nl_hr_payroll.hr_payroll_structure_nl_employee_salary"/>
</record>
<record id="l10n_nl_hr_payroll_structure_nl_employee_salary_attachment_of_salary_rule" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.DED"/>
<field name="name">Attachment of Salary</field>
<field name="sequence">174</field>
<field name="code">ATTACH_SALARY</field>
<field name="condition_select">python</field>
<field name="condition_python">result = 'ATTACH_SALARY' in inputs</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result = -inputs['ATTACH_SALARY'].amount
result_name = inputs['ATTACH_SALARY'].name
</field>
<field name="struct_id" ref="hr_payroll_structure_nl_employee_salary"/>
</record>
<record id="l10n_nl_hr_payroll_structure_nl_employee_salary_assignment_of_salary_rule" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.DED"/>
<field name="name">Assignment of Salary</field>
<field name="sequence">174</field>
<field name="code">ASSIG_SALARY</field>
<field name="condition_select">python</field>
<field name="condition_python">result = 'ASSIG_SALARY' in inputs</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result = -inputs['ASSIG_SALARY'].amount
result_name = inputs['ASSIG_SALARY'].name
</field>
<field name="struct_id" ref="hr_payroll_structure_nl_employee_salary"/>
</record>
<record id="l10n_nl_hr_payroll_structure_nl_employee_salary_child_support" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.DED"/>
<field name="name">Child Support</field>
<field name="code">CHILD_SUPPORT</field>
<field name="amount_select">code</field>
<field name="sequence">174</field>
<field name="condition_select">python</field>
<field name="condition_python">result = 'CHILD_SUPPORT' in inputs</field>
<field name="amount_python_compute">
result = -inputs['CHILD_SUPPORT'].amount
result_name = inputs['CHILD_SUPPORT'].name
</field>
<field name="struct_id" ref="hr_payroll_structure_nl_employee_salary"/>
</record>
<record id="l10n_nl_hr_payroll_structure_nl_employee_salary_deduction_salary_rule" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.DED"/>
<field name="name">Deduction</field>
<field name="sequence">198</field>
<field name="code">DEDUCTION</field>
<field name="condition_select">python</field>
<field name="condition_python">result = 'DEDUCTION' in inputs</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result = -inputs['DEDUCTION'].amount
result_name = inputs['DEDUCTION'].name
</field>
<field name="struct_id" ref="hr_payroll_structure_nl_employee_salary"/>
</record>
<record id="l10n_nl_hr_payroll_structure_nl_employee_salary_reimbursement_salary_rule" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.ALW"/>
<field name="name">Reimbursement</field>
<field name="sequence">199</field>
<field name="code">REIMBURSEMENT</field>
<field name="condition_select">python</field>
<field name="condition_python">result = 'REIMBURSEMENT' in inputs</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result = inputs['REIMBURSEMENT'].amount
result_name = inputs['REIMBURSEMENT'].name
</field>
<field name="struct_id" ref="hr_payroll_structure_nl_employee_salary"/>
</record>
<record id="l10n_nl_hr_payroll_structure_nl_employee_salary_net_salary" model="hr.salary.rule">
<field name="category_id" ref="hr_payroll.NET"/>
<field name="name">Net Salary</field>
<field name="sequence">200</field>
<field name="code">NET</field>
<field name="appears_on_employee_cost_dashboard" eval="True"/>
<field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result = categories['BASIC'] + categories['ALW'] + categories['DED']
</field>
<field name="struct_id" ref="hr_payroll_structure_nl_employee_salary"/>
</record>
</odoo>
@@ -0,0 +1,211 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="base.partner_demo_company_nl" model="res.partner" forcecreate="1">
<field name="name">My Dutch Company</field>
<field name="country_id" ref="base.nl"/>
</record>
<record id="base.demo_company_nl" model="res.company" forcecreate="1">
<field name="name">My Dutch Company</field>
<field name="partner_id" ref="base.partner_demo_company_nl"/>
<field name="currency_id" ref="base.EUR"/>
<field name="street">Korenmolengat 42</field>
<field name="zip">2761 EC</field>
<field name="city">Zevenhuizen</field>
<field name="state_id" ref="base.state_nl_zh"/>
<field name="country_id" ref="base.nl"/>
</record>
<record id="base.user_admin" model="res.users">
<field name="company_ids" eval="[(4, ref('base.demo_company_nl'))]"/>
</record>
<record id="base.user_demo" model="res.users">
<field name="company_ids" eval="[(4, ref('base.demo_company_nl'))]"/>
</record>
<record id="nl_hr_department_rd" model="hr.department">
<field name="name">R&amp;D NL</field>
<field name="company_id" ref="base.demo_company_nl"/>
</record>
<record id="res_partner_wouter" model="res.partner">
<field name="name">Wouter Maas</field>
<field name="street">Van Maasstraat 33</field>
<field name="city">Almere</field>
<field name="zip">6813MQ</field>
<field name="state_id" ref="base.state_nl_fl"/>
<field name="country_id" ref="base.nl"/>
<field name="phone">09 99161280</field>
<field name="company_id" ref="base.demo_company_nl"/>
</record>
<record id="res_partner_wouter" model="res.partner">
<field name="email" model="res.partner" eval="'demo.' + obj(ref('l10n_nl_hr_payroll.res_partner_wouter')).name.split(' ')[-1].lower() + '@example.com'"/>
</record>
<record id="res_partner_lotte" model="res.partner">
<field name="name">Lotte Van Leeuw</field>
<field name="street">Arslanlaan 82d</field>
<field name="city">Burgum</field>
<field name="zip">2622DX</field>
<field name="state_id" ref="base.state_nl_fr"/>
<field name="country_id" ref="base.nl"/>
<field name="phone">09 99676447</field>
<field name="company_id" ref="base.demo_company_nl"/>
</record>
<record id="res_partner_lotte" model="res.partner">
<field name="email" model="res.partner" eval="'demo.' + obj(ref('l10n_nl_hr_payroll.res_partner_lotte')).name.split(' ')[-1].lower() + '@example.com'"/>
</record>
<record id="user_lotte" model="res.users">
<field name="partner_id" ref="l10n_nl_hr_payroll.res_partner_lotte"/>
<!-- [email protected] -->
<field name="login" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_lotte')).name.replace(' ', '.').lower() + '@example.com'"/>
<field name="signature" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_lotte')).name.split(' ')[0][0] + '. ' + obj(ref('l10n_nl_hr_payroll.res_partner_lotte')).name.split(' ')[-1]"/>
<field name="company_ids" eval="[(4, ref('base.demo_company_nl'))]"/>
<field name="company_id" ref="base.demo_company_nl"/>
<field name="group_ids" eval="[(6,0,[ref('base.group_user')])]"/>
<field name="image_1920" type="base64" file="l10n_nl_hr_payroll/static/img/hr_employe_lotte.jpg"/>
</record>
<record id="nl_res_bank_ing" model="res.bank">
<field name="name">ING</field>
<field name="bic">INGBNL2AXXX</field>
<field name="street">ING Straat</field>
<field name="city">Almere</field>
<field name="zip">6899QO</field>
<field name="state" ref="base.state_nl_fl"/>
<field name="country" ref="base.nl"/>
<field name="phone">09 99287728</field>
</record>
<record id="nl_res_bank_ing" model="res.bank">
<field name="email" model="res.bank" eval="obj(ref('l10n_nl_hr_payroll.nl_res_bank_ing')).name.replace(' ', '.').lower() + '@example.com'"/>
</record>
<record id="nl_res_bank_rabobank" model="res.bank">
<field name="name">Rabobank</field>
<field name="bic">RABONL2UXXX</field>
<field name="street">Rabobank laan</field>
<field name="city">Burgum</field>
<field name="zip">2699QO</field>
<field name="state" ref="base.state_nl_fr"/>
<field name="country" ref="base.nl"/>
<field name="phone">09 99023978</field>
</record>
<record id="nl_res_bank_rabobank" model="res.bank">
<field name="email" model="res.bank" eval="obj(ref('l10n_nl_hr_payroll.nl_res_bank_rabobank')).name.replace(' ', '.').lower() + '@example.com'"/>
</record>
<record id="res_partner_bank_account_wouter" model="res.partner.bank">
<field name="acc_number">NL02INGB0023456789</field>
<field name="allow_out_payment" eval="True"/>
<field name="bank_id" ref="l10n_nl_hr_payroll.nl_res_bank_ing"/>
<field name="partner_id" ref="l10n_nl_hr_payroll.res_partner_wouter"/>
<field name="company_id" ref="base.demo_company_nl"/>
<field name="currency_id" ref="base.EUR"/>
</record>
<record id="res_partner_bank_account_lotte" model="res.partner.bank">
<field name="acc_number">NL02RABO0123456789</field>
<field name="allow_out_payment" eval="True"/>
<field name="bank_id" ref="l10n_nl_hr_payroll.nl_res_bank_rabobank"/>
<field name="partner_id" ref="l10n_nl_hr_payroll.res_partner_lotte"/>
<field name="company_id" ref="base.demo_company_nl"/>
<field name="currency_id" ref="base.EUR"/>
</record>
<record id="hr_employee_wouter" model="hr.employee">
<field name="name" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_wouter')).name"/>
<field name="image_1920" type="base64" file="l10n_nl_hr_payroll/static/img/hr_employee_wouter.jpg"/>
<field name="work_phone">09 99437379</field>
<field name="work_email" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_wouter')).name.replace(' ', '.').lower() + '@example.com'"/>
<field name="work_contact_id" ref="l10n_nl_hr_payroll.res_partner_wouter"/>
<field name="company_id" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_wouter')).company_id"/>
<field name="resource_calendar_id" ref="resource.resource_calendar_std"/>
<field name="tz">Europe/Amsterdam</field>
<field name="private_street" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_wouter')).street"/>
<field name="private_city" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_wouter')).city"/>
<field name="private_zip" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_wouter')).zip"/>
<field name="private_state_id" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_wouter')).state_id"/>
<field name="private_country_id" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_wouter')).country_id"/>
<field name="private_email" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_wouter')).email"/>
<field name="private_phone" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_wouter')).phone"/>
<field name="distance_home_work">52</field>
<field name="country_id" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_wouter')).country_id"/>
<field name="identification_id">9999.67.890</field>
<field name="sex">male</field>
<field name="birthday" eval="datetime(1967, 1, 12).date()"/>
<field name="place_of_birth">Arnhem</field>
<field name="country_of_birth" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_wouter')).country_id"/>
<field name="emergency_contact">Gerrit Maas</field>
<field name="emergency_phone">09 99676812</field>
<field name="certificate">bachelor</field>
<field name="study_field">Mechanical Engineering</field>
<field name="study_school">TU Delft</field>
<field name="marital">single</field>
<field name="bank_account_ids" eval="[(4, ref('l10n_nl_hr_payroll.res_partner_bank_account_wouter'))]"/>
<field name="job_id" ref="hr.job_developer"/>
<field name="department_id" ref="l10n_nl_hr_payroll.nl_hr_department_rd"/>
<field name="structure_type_id" ref="l10n_nl_hr_payroll.structure_type_employee_nl"/>
<field name="wage_type">monthly</field>
<field name="wage">3800</field>
<field name="hr_responsible_id" ref="base.user_demo"/>
<field name="contract_date_start" eval="(DateTime.today() + relativedelta(years=-3, month=1, day=1))"/>
<field name="date_version" eval="(DateTime.today() + relativedelta(years=-3, month=1, day=1))"/>
<field name="resource_calendar_id" model="resource.calendar" eval="obj().search([('company_id', '=', obj().env.ref('base.demo_company_nl').id)], limit=1)"/>
</record>
<record id="hr_employee_lotte" model="hr.employee">
<field name="name" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_lotte')).name"/>
<field name="job_title">Software Developer</field>
<field name="image_1920" type="base64" file="l10n_nl_hr_payroll/static/img/hr_employe_lotte.jpg"/>
<field name="work_phone">09 99896249</field>
<field name="work_email" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_lotte')).name.replace(' ', '.').lower() + '@example.com'"/>
<field name="parent_id" ref="l10n_nl_hr_payroll.hr_employee_wouter"/>
<field name="user_id" ref="l10n_nl_hr_payroll.user_lotte"/>
<field name="company_id" ref="base.demo_company_nl"/>
<field name="resource_calendar_id" ref="resource.resource_calendar_std"/>
<field name="tz">Europe/Amsterdam</field>
<field name="private_street" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_lotte')).street"/>
<field name="private_city" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_lotte')).city"/>
<field name="private_zip" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_lotte')).zip"/>
<field name="private_state_id" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_lotte')).state_id"/>
<field name="private_country_id" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_lotte')).country_id"/>
<field name="private_email" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_lotte')).email"/>
<field name="private_phone" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_lotte')).phone"/>
<field name="distance_home_work">22</field>
<field name="country_id" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_lotte')).country_id"/>
<field name="identification_id">9999.23.987</field>
<field name="sex">female</field>
<field name="birthday" eval="datetime(1993, 10, 30).date()"/>
<field name="place_of_birth">Maastricht</field>
<field name="country_of_birth" model="res.partner" eval="obj(ref('l10n_nl_hr_payroll.res_partner_lotte')).country_id"/>
<field name="emergency_contact">Stijn Van Leeuw</field>
<field name="emergency_phone">09 99326891</field>
<field name="certificate">master</field>
<field name="study_field">Computer Science</field>
<field name="study_school">Utrecht University</field>
<field name="marital">single</field>
<field name="bank_account_ids" eval="[(4, ref('l10n_nl_hr_payroll.res_partner_bank_account_lotte'))]"/>
<field name="job_id" ref="hr.job_developer"/>
<field name="department_id" ref="l10n_nl_hr_payroll.nl_hr_department_rd"/>
<field name="structure_type_id" ref="l10n_nl_hr_payroll.structure_type_employee_nl"/>
<field name="wage_type">monthly</field>
<field name="wage">3000</field>
<field name="hr_responsible_id" ref="base.user_demo"/>
<field name="date_version" eval="(DateTime.today() + relativedelta(years=-2, month=1, day=1))"/>
<field name="contract_date_start" eval="(DateTime.today() + relativedelta(years=-2, month=1, day=1))"/>
<field name="contract_date_end" eval="(DateTime.today() + relativedelta(years=-1, month=1, day=1, days=-2))"/>
<field name="resource_calendar_id" model="resource.calendar" eval="obj().search([('company_id', '=', obj().env.ref('base.demo_company_nl').id)], limit=1)"/>
</record>
<function name="create_version" model="hr.employee">
<value eval="[ref('l10n_nl_hr_payroll.hr_employee_lotte')]"/>
<value eval="{
'date_version': DateTime.today() + relativedelta(years=-1, month=1, day=1, days=-2) + relativedelta(days=1),
'contract_date_start': DateTime.today() + relativedelta(years=-1, month=1, day=1, days=-2) + relativedelta(days=1),
'contract_date_end': False,
'wage': 3600.00
}"/>
</function>
</odoo>
@@ -0,0 +1,142 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * l10n_nl_hr_payroll
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 19.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-17 18:07+0000\n"
"PO-Revision-Date: 2026-07-17 18:07+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: l10n_nl_hr_payroll
#: model:ir.actions.report,print_report_name:l10n_nl_hr_payroll.action_report_payslip_nl
msgid "'Payslip - %s' % (object.employee_id.name)"
msgstr ""
#. module: l10n_nl_hr_payroll
#: model:ir.model.fields,field_description:l10n_nl_hr_payroll.field_hr_employee__l10n_nl_30_percent
#: model:ir.model.fields,field_description:l10n_nl_hr_payroll.field_hr_version__l10n_nl_30_percent
msgid "30% Exemption"
msgstr ""
#. module: l10n_nl_hr_payroll
#: model:hr.salary.rule,name:l10n_nl_hr_payroll.l10n_nl_hr_payroll_structure_nl_employee_salary_assignment_of_salary_rule
msgid "Assignment of Salary"
msgstr ""
#. module: l10n_nl_hr_payroll
#: model:hr.salary.rule,name:l10n_nl_hr_payroll.l10n_nl_hr_payroll_structure_nl_employee_salary_attachment_of_salary_rule
msgid "Attachment of Salary"
msgstr ""
#. module: l10n_nl_hr_payroll
#: model:hr.salary.rule,name:l10n_nl_hr_payroll.l10n_nl_hr_payroll_structure_nl_employee_salary_basic_salary_rule
msgid "Basic Salary"
msgstr ""
#. module: l10n_nl_hr_payroll
#: model:hr.salary.rule,name:l10n_nl_hr_payroll.l10n_nl_hr_payroll_structure_nl_employee_salary_child_support
msgid "Child Support"
msgstr ""
#. module: l10n_nl_hr_payroll
#: model:hr.salary.rule,name:l10n_nl_hr_payroll.l10n_nl_hr_payroll_structure_nl_employee_salary_deduction_salary_rule
msgid "Deduction"
msgstr ""
#. module: l10n_nl_hr_payroll
#: model:ir.model.fields,field_description:l10n_nl_hr_payroll.field_hr_employee__display_name
#: model:ir.model.fields,field_description:l10n_nl_hr_payroll.field_hr_payroll_structure_type__display_name
#: model:ir.model.fields,field_description:l10n_nl_hr_payroll.field_hr_payslip__display_name
#: model:ir.model.fields,field_description:l10n_nl_hr_payroll.field_hr_version__display_name
msgid "Display Name"
msgstr ""
#. module: l10n_nl_hr_payroll
#: model:ir.model,name:l10n_nl_hr_payroll.model_hr_employee
msgid "Employee"
msgstr ""
#. module: l10n_nl_hr_payroll
#: model:ir.model,name:l10n_nl_hr_payroll.model_hr_version
msgid "Employee Contract"
msgstr ""
#. module: l10n_nl_hr_payroll
#: model:ir.model.fields,field_description:l10n_nl_hr_payroll.field_hr_employee__id
#: model:ir.model.fields,field_description:l10n_nl_hr_payroll.field_hr_payroll_structure_type__id
#: model:ir.model.fields,field_description:l10n_nl_hr_payroll.field_hr_payslip__id
#: model:ir.model.fields,field_description:l10n_nl_hr_payroll.field_hr_version__id
msgid "ID"
msgstr ""
#. module: l10n_nl_hr_payroll
#: model:ir.actions.report,name:l10n_nl_hr_payroll.action_report_payslip_nl
msgid "NL: Payslip"
msgstr ""
#. module: l10n_nl_hr_payroll
#: model:hr.salary.rule,name:l10n_nl_hr_payroll.l10n_nl_hr_payroll_structure_nl_employee_salary_net_salary
msgid "Net Salary"
msgstr ""
#. module: l10n_nl_hr_payroll
#: model_terms:ir.ui.view,arch_db:l10n_nl_hr_payroll.hr_contract_template_view_form
msgid "Netherlands Payroll"
msgstr ""
#. module: l10n_nl_hr_payroll
#: model:hr.payroll.structure,name:l10n_nl_hr_payroll.hr_payroll_structure_nl_employee_salary
msgid "Netherlands: Regular Pay"
msgstr ""
#. module: l10n_nl_hr_payroll
#: model:ir.model,name:l10n_nl_hr_payroll.model_hr_payslip
msgid "Pay Slip"
msgstr ""
#. module: l10n_nl_hr_payroll
#: model:hr.department,name:l10n_nl_hr_payroll.nl_hr_department_rd
msgid "R&D NL"
msgstr ""
#. module: l10n_nl_hr_payroll
#: model:hr.salary.rule,name:l10n_nl_hr_payroll.l10n_nl_hr_payroll_structure_nl_employee_salary_reimbursement_salary_rule
msgid "Reimbursement"
msgstr ""
#. module: l10n_nl_hr_payroll
#: model:ir.model,name:l10n_nl_hr_payroll.model_hr_payroll_structure_type
msgid "Salary Structure Type"
msgstr ""
#. module: l10n_nl_hr_payroll
#: model:hr.salary.rule,name:l10n_nl_hr_payroll.l10n_nl_hr_payroll_structure_nl_employee_salary_gross_salary_rule
msgid "Taxable Salary"
msgstr ""
#. module: l10n_nl_hr_payroll
#: model:ir.model.fields,help:l10n_nl_hr_payroll.field_hr_employee__l10n_nl_30_percent
#: model:ir.model.fields,help:l10n_nl_hr_payroll.field_hr_version__l10n_nl_30_percent
msgid ""
"The 30% reimbursement ruling (also known as the 30% facility) is a tax "
"advantage for highly skilled migrants moving to the Netherlands for a "
"specific employment role. When the necessary conditions are met, the "
"employer can grant a tax-free allowance equivalent to 30% of the gross "
"salary subject to Dutch payroll tax. This reimbursement is intended as "
"compensation for the extra costs that international employees can incur when"
" moving to a new country for their work. "
msgstr ""
#. module: l10n_nl_hr_payroll
#. odoo-python
#: code:addons/l10n_nl_hr_payroll/models/hr_payroll_structure_type.py:0
msgid "month"
msgstr ""
+155
View File
@@ -0,0 +1,155 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * l10n_nl_hr_payroll
#
# Weblate <[email protected]>, 2025, 2026.
# Bren Driesen <[email protected]>, 2026.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~18.2+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-17 18:07+0000\n"
"PO-Revision-Date: 2026-07-27 13:09+0000\n"
"Last-Translator: Bren Driesen <[email protected]>\n"
"Language-Team: Dutch <https://translate.odoo.com/projects/odoo-19-l10n/"
"l10n_nl_hr_payroll/nl/>\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 2026.6.1\n"
#. module: l10n_nl_hr_payroll
#: model:ir.actions.report,print_report_name:l10n_nl_hr_payroll.action_report_payslip_nl
msgid "'Payslip - %s' % (object.employee_id.name)"
msgstr "'Loonstrook - %s' % (object.employee_id.name)"
#. module: l10n_nl_hr_payroll
#: model:ir.model.fields,field_description:l10n_nl_hr_payroll.field_hr_employee__l10n_nl_30_percent
#: model:ir.model.fields,field_description:l10n_nl_hr_payroll.field_hr_version__l10n_nl_30_percent
msgid "30% Exemption"
msgstr "30%-regeling"
#. module: l10n_nl_hr_payroll
#: model:hr.salary.rule,name:l10n_nl_hr_payroll.l10n_nl_hr_payroll_structure_nl_employee_salary_assignment_of_salary_rule
msgid "Assignment of Salary"
msgstr "Loonoverdracht"
#. module: l10n_nl_hr_payroll
#: model:hr.salary.rule,name:l10n_nl_hr_payroll.l10n_nl_hr_payroll_structure_nl_employee_salary_attachment_of_salary_rule
msgid "Attachment of Salary"
msgstr "Loonbeslag"
#. module: l10n_nl_hr_payroll
#: model:hr.salary.rule,name:l10n_nl_hr_payroll.l10n_nl_hr_payroll_structure_nl_employee_salary_basic_salary_rule
msgid "Basic Salary"
msgstr "Brutoloon"
#. module: l10n_nl_hr_payroll
#: model:hr.salary.rule,name:l10n_nl_hr_payroll.l10n_nl_hr_payroll_structure_nl_employee_salary_child_support
msgid "Child Support"
msgstr "Kinderalimentatie"
#. module: l10n_nl_hr_payroll
#: model:hr.salary.rule,name:l10n_nl_hr_payroll.l10n_nl_hr_payroll_structure_nl_employee_salary_deduction_salary_rule
msgid "Deduction"
msgstr "Inhouding"
#. module: l10n_nl_hr_payroll
#: model:ir.model.fields,field_description:l10n_nl_hr_payroll.field_hr_employee__display_name
#: model:ir.model.fields,field_description:l10n_nl_hr_payroll.field_hr_payroll_structure_type__display_name
#: model:ir.model.fields,field_description:l10n_nl_hr_payroll.field_hr_payslip__display_name
#: model:ir.model.fields,field_description:l10n_nl_hr_payroll.field_hr_version__display_name
msgid "Display Name"
msgstr "Schermnaam"
#. module: l10n_nl_hr_payroll
#: model:ir.model,name:l10n_nl_hr_payroll.model_hr_employee
msgid "Employee"
msgstr "Werknemer"
#. module: l10n_nl_hr_payroll
#: model:ir.model,name:l10n_nl_hr_payroll.model_hr_version
msgid "Employee Contract"
msgstr "Werknemerscontract"
#. module: l10n_nl_hr_payroll
#: model:ir.model.fields,field_description:l10n_nl_hr_payroll.field_hr_employee__id
#: model:ir.model.fields,field_description:l10n_nl_hr_payroll.field_hr_payroll_structure_type__id
#: model:ir.model.fields,field_description:l10n_nl_hr_payroll.field_hr_payslip__id
#: model:ir.model.fields,field_description:l10n_nl_hr_payroll.field_hr_version__id
msgid "ID"
msgstr "ID"
#. module: l10n_nl_hr_payroll
#: model:ir.actions.report,name:l10n_nl_hr_payroll.action_report_payslip_nl
msgid "NL: Payslip"
msgstr "NL: Loonstrook"
#. module: l10n_nl_hr_payroll
#: model:hr.salary.rule,name:l10n_nl_hr_payroll.l10n_nl_hr_payroll_structure_nl_employee_salary_net_salary
msgid "Net Salary"
msgstr "Nettoloon"
#. module: l10n_nl_hr_payroll
#: model_terms:ir.ui.view,arch_db:l10n_nl_hr_payroll.hr_contract_template_view_form
msgid "Netherlands Payroll"
msgstr "Loonadministratie Nederland"
#. module: l10n_nl_hr_payroll
#: model:hr.payroll.structure,name:l10n_nl_hr_payroll.hr_payroll_structure_nl_employee_salary
msgid "Netherlands: Regular Pay"
msgstr "Nederland: Regulier loon"
#. module: l10n_nl_hr_payroll
#: model:ir.model,name:l10n_nl_hr_payroll.model_hr_payslip
msgid "Pay Slip"
msgstr "Loonstrook"
#. module: l10n_nl_hr_payroll
#: model:hr.department,name:l10n_nl_hr_payroll.nl_hr_department_rd
msgid "R&D NL"
msgstr "R&D NL"
#. module: l10n_nl_hr_payroll
#: model:hr.salary.rule,name:l10n_nl_hr_payroll.l10n_nl_hr_payroll_structure_nl_employee_salary_reimbursement_salary_rule
msgid "Reimbursement"
msgstr "Vergoeding"
#. module: l10n_nl_hr_payroll
#: model:ir.model,name:l10n_nl_hr_payroll.model_hr_payroll_structure_type
msgid "Salary Structure Type"
msgstr "Soort salarisstructuur"
#. module: l10n_nl_hr_payroll
#: model:hr.salary.rule,name:l10n_nl_hr_payroll.l10n_nl_hr_payroll_structure_nl_employee_salary_gross_salary_rule
msgid "Taxable Salary"
msgstr "Belastbaar loon"
#. module: l10n_nl_hr_payroll
#: model:ir.model.fields,help:l10n_nl_hr_payroll.field_hr_employee__l10n_nl_30_percent
#: model:ir.model.fields,help:l10n_nl_hr_payroll.field_hr_version__l10n_nl_30_percent
msgid ""
"The 30% reimbursement ruling (also known as the 30% facility) is a tax "
"advantage for highly skilled migrants moving to the Netherlands for a "
"specific employment role. When the necessary conditions are met, the "
"employer can grant a tax-free allowance equivalent to 30% of the gross "
"salary subject to Dutch payroll tax. This reimbursement is intended as "
"compensation for the extra costs that international employees can incur when "
"moving to a new country for their work. "
msgstr ""
"De 30%-teruggaveregeling (ook bekend als de 30%-regeling) is een "
"belastingvoordeel voor hoogopgeleide buitenlandse werknemers die naar "
"Nederland verhuizen voor een specifieke functie. Als er aan de nodige "
"voorwaarden wordt voldaan, kan de werkgever een belastingvrije vergoeding "
"toekennen ter hoogte van 30% van het brutoloon waarover Nederlandse "
"loonbelasting wordt geheven. Deze vergoeding is een compensatie voor de "
"extra kosten die internationale werknemers kunnen maken als ze voor hun werk "
"naar een nieuw land verhuizen. "
#. module: l10n_nl_hr_payroll
#. odoo-python
#: code:addons/l10n_nl_hr_payroll/models/hr_payroll_structure_type.py:0
msgid "month"
msgstr ""
+6
View File
@@ -0,0 +1,6 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import hr_payroll_structure_type
from . import hr_payslip
from . import hr_version
from . import hr_employee
+7
View File
@@ -0,0 +1,7 @@
from odoo import fields, models
class HrEmployee(models.Model):
_inherit = 'hr.employee'
l10n_nl_30_percent = fields.Boolean(readonly=False, related="version_id.l10n_nl_30_percent", inherited=True, groups="hr_payroll.group_hr_payroll_user")
@@ -0,0 +1,13 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models
class HrPayrollStructureType(models.Model):
_inherit = 'hr.payroll.structure.type'
_description = 'Salary Structure Type'
def _get_selection_schedule_pay(self):
if self.env.company.country_code == 'NL':
return [('monthly', self.env._('month'))]
return super()._get_selection_schedule_pay()
+19
View File
@@ -0,0 +1,19 @@
# -*- coding:utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models
class HrPayslip(models.Model):
_inherit = 'hr.payslip'
def _get_data_files_to_update(self):
# Note: file order should be maintained
return super()._get_data_files_to_update() + [(
'l10n_nl_hr_payroll', [
'data/hr_salary_rule_category_data.xml',
'data/hr_payroll_structure_type_data.xml',
'data/hr_payroll_structure_data.xml',
'data/hr_rule_parameters_data.xml',
'data/hr_salary_rule_data.xml',
])]
+18
View File
@@ -0,0 +1,18 @@
from odoo import api, models, fields
class HrVersion(models.Model):
_inherit = 'hr.version'
l10n_nl_30_percent = fields.Boolean(
string="30% Exemption", groups="hr_payroll.group_hr_payroll_user", tracking=True,
help="The 30% reimbursement ruling (also known as the 30% facility) is a tax advantage for highly skilled migrants moving to the Netherlands for a specific employment role. When the necessary conditions are met, the employer can grant a tax-free allowance equivalent to 30% of the gross salary subject to Dutch payroll tax. This reimbursement is intended as compensation for the extra costs that international employees can incur when moving to a new country for their work. ")
@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 == "NL":
whitelisted_fields += [
"l10n_nl_30_percent",
]
return whitelisted_fields
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

+3
View File
@@ -0,0 +1,3 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import test_contract_template_whitelist
@@ -0,0 +1,39 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.tests import TransactionCase, tagged
@tagged('post_install_l10n', 'post_install', '-at_install')
class TestWhitelistFromTemplate(TransactionCase):
def setUp(self):
super().setUp()
self.company_nl = self.env['res.company'].create({
'name': 'NL Co',
'country_id': self.env.ref('base.nl').id,
})
self.employee_nl = self.env['hr.employee'].create({
'name': 'NL Employee',
'company_id': self.company_nl.id,
})
def test_nl_contract_template_loading(self):
Version = self.env['hr.version'].with_company(self.company_nl)
template = Version.create({
'name': 'NL Template',
'l10n_nl_30_percent': True,
})
contract = self.employee_nl.version_id
self.assertEqual(contract.l10n_nl_30_percent, False)
wizard = self.env['hr.version.wizard']\
.with_company(self.company_nl)\
.with_context(active_model='hr.employee', active_id=self.employee_nl.id)\
.create({'contract_template_id': template.id})
wizard.action_load_template()
for field in Version._get_whitelist_fields_from_template():
self.assertEqual(contract[field], template[field])
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="hr_contract_template_view_form" model="ir.ui.view">
<field name="name">hr.contract.view.form</field>
<field name="model">hr.version</field>
<field name="inherit_id" ref="hr.hr_contract_template_form_view"/>
<field name="arch" type="xml">
<group name="salary_info" position="inside">
<group string="Netherlands Payroll" invisible="country_code != 'NL'">
<field name="l10n_nl_30_percent"/>
</group>
</group>
</field>
</record>
</odoo>
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="hr_employee_view_form" model="ir.ui.view">
<field name="name">hr.employee.view.form</field>
<field name="model">hr.employee</field>
<field name="inherit_id" ref="hr_payroll.payroll_hr_employee_view_form"/>
<field name="arch" type="xml">
<group name="contract" position="inside">
<field name="l10n_nl_30_percent" invisible="country_code != 'NL'"/>
</group>
</field>
</record>
</odoo>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="action_report_payslip_nl" model="ir.actions.report">
<field name="name">NL: Payslip</field>
<field name="model">hr.payslip</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">l10n_nl_hr_payroll.report_payslip_nl_lang</field>
<field name="report_file">l10n_nl_hr_payroll.report_payslip_nl_lang</field>
<field name="print_report_name">'Payslip - %s' % (object.employee_id.name)</field>
<field name="binding_model_id" ref="hr_payroll.model_hr_payslip"/>
<field name="binding_type">report</field>
<!-- Erase fields to avoid double PDF posting -->
<field name="attachment"></field>
<field name="attachment_use" eval="False"/>
</record>
</odoo>
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_payslip_nl" inherit_id="hr_payroll.report_payslip" primary="True">
</template>
<template id="report_payslip_nl_lang">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="o">
<t t-set="o" t-value="o.with_context(lang=o.employee_id.lang or o.env.lang)"/>
<t t-call="l10n_nl_hr_payroll.report_payslip_nl" t-lang="o.env.lang"/>
</t>
</t>
</template>
</odoo>