diff --git a/addons/l10n_be_hr_payroll/data/l10n_be_hr_payroll_data.xml b/addons/l10n_be_hr_payroll/data/l10n_be_hr_payroll_data.xml
index 6920f154d9d..0a615069d47 100644
--- a/addons/l10n_be_hr_payroll/data/l10n_be_hr_payroll_data.xml
+++ b/addons/l10n_be_hr_payroll/data/l10n_be_hr_payroll_data.xml
@@ -84,6 +84,18 @@
SSC
+
+
+ IP. Part.
+ IP. PART
+
+
+
+
+ Total Gross
+ GROSSIP
+
+
@@ -152,6 +164,33 @@ elif salary <= 2510.47:
result = 213.48 - (0.2369 * (salary - 1609.47))
+
+
+ Total Gross
+ 90
+ GROSSIP
+
+ python
+ result = bool(contract.ip)
+ code
+ result = categories.BASIC + categories.ALW
+
+
+
+
+ Intellectual Property
+ IP.PART
+ 91
+ python
+
+result = bool(contract.ip)
+
+ code
+
+result = - categories.GROSSIP * contract.ip_wage_rate / 100.0
+
+
+
Special social cotisation
@@ -500,6 +539,34 @@ result = -contract.car_atn
result = bool(contract.representation_fees)
result = contract.representation_fees
+
+
+ Intellectual Property
+ IP
+ code
+ 172
+ python
+ result = bool(contract.ip)
+ result = categories.GROSSIP * contract.ip_wage_rate / 100.0
+
+
+
+ Intellectual Property Income Deduction
+ IP.DED
+ code
+ 173
+ python
+ result = bool(contract.ip)
+
+tax_rate = 0.15
+ip_amount = categories.GROSSIP * contract.ip_wage_rate / 100.0
+if ip_amount >= 0.0 and ip_amount <= 15660:
+ tax_rate = tax_rate / 2.0
+elif ip_amount > 15660 and ip_amount <=31320:
+ tax_rate = tax_rate * 3.0 / 4.0
+result = -min(ip_amount * tax_rate, 11745)
+
+
Net Supplement
@@ -546,7 +613,10 @@ result = -contract.car_atn
ref('hr_payroll_rules_suppl_net'),
ref('hr_payroll_rules_retained_net'),
ref('hr_salary_rule_pp_reduction_employees'),
-
+ ref('hr_salary_rule_ip'),
+ ref('hr_salary_rule_ip_deduction'),
+ ref('hr_salary_rule_ip_part'),
+ ref('hr_salary_rule_gross_with_ip')
])]" name="rule_ids"/>
diff --git a/addons/l10n_be_hr_payroll/models/l10n_be_hr_payroll.py b/addons/l10n_be_hr_payroll/models/l10n_be_hr_payroll.py
index cf9901281c5..00a3af4d803 100644
--- a/addons/l10n_be_hr_payroll/models/l10n_be_hr_payroll.py
+++ b/addons/l10n_be_hr_payroll/models/l10n_be_hr_payroll.py
@@ -85,6 +85,13 @@ class HrContract(models.Model):
eco_checks = fields.Monetary("Eco Vouchers",
default=lambda self: self.get_attribute('eco_checks', 'default_value'),
help="Yearly amount the employee receives in the form of eco vouchers.")
+ ip = fields.Boolean(default=False, track_visibility="onchange")
+ ip_wage_rate = fields.Float(string="IP percentage", help="Should be between 0 and 100 %")
+
+ @api.constrains('ip_wage_rate')
+ def _check_ip_wage_rate(self):
+ if self.filtered(lambda contract: contract.ip_wage_rate < 0 or contract.ip_wage_rate > 100):
+ raise ValidationError(_('The IP rate on wage should be between 0 and 100'))
@api.depends('holidays', 'wage', 'final_yearly_costs')
def _compute_wage_with_holidays(self):
diff --git a/addons/l10n_be_hr_payroll/views/l10n_be_hr_payroll_view.xml b/addons/l10n_be_hr_payroll/views/l10n_be_hr_payroll_view.xml
index 4111ab06878..642a87ef3c5 100644
--- a/addons/l10n_be_hr_payroll/views/l10n_be_hr_payroll_view.xml
+++ b/addons/l10n_be_hr_payroll/views/l10n_be_hr_payroll_view.xml
@@ -117,6 +117,13 @@
+
+
+
+
+
+
+