Initial commit: OCA Payroll packages (5 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:05 +02:00
commit d19274f581
407 changed files with 214057 additions and 0 deletions

View file

@ -0,0 +1,241 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from .common import TestPayslipBase
class TestSalaryRule(TestPayslipBase):
def setUp(self):
super().setUp()
self.Payslip = self.env["hr.payslip"]
self.Rule = self.env["hr.salary.rule"]
self.test_rule = self.Rule.create(
{
"name": "Test Rule",
"code": "TEST",
"category_id": self.categ_alw.id,
"sequence": 6,
"amount_select": "code",
"amount_python_compute": "result = 0",
}
)
self.developer_pay_structure.write({"rule_ids": [(4, self.test_rule.id)]})
self.parent_test_rule = self.Rule.create(
{
"name": "Parent Test Rule",
"code": "PARENT_TEST",
"category_id": self.categ_alw.id,
"sequence": 6,
"parent_rule_id": self.test_rule.id,
"amount_select": "code",
"amount_python_compute": "result = 100",
}
)
self.developer_pay_structure.write(
{"rule_ids": [(4, self.parent_test_rule.id)]}
)
self.child_test_rule = self.Rule.create(
{
"name": "Child Test Rule",
"code": "CHILD_TEST",
"category_id": self.categ_alw.id,
"sequence": 7,
"parent_rule_id": self.test_rule.id,
"amount_select": "code",
"amount_python_compute": "result = 100",
}
)
def test_python_code_return_values(self):
self.test_rule.amount_python_compute = (
"result_rate = 0\n" "result_qty = 0\n" "result = 0\n"
)
# Open contracts
cc = self.env["hr.contract"].search([("employee_id", "=", self.richard_emp.id)])
cc.kanban_state = "done"
self.env.ref(
"hr_contract.ir_cron_data_contract_update_state"
).method_direct_trigger()
# Create payslip and compute
payslip = self.Payslip.create({"employee_id": self.richard_emp.id})
payslip.onchange_employee()
payslip.compute_sheet()
line = payslip.line_ids.filtered(lambda l: l.code == "TEST")
self.assertEqual(len(line), 1, "I found the Test line")
self.assertEqual(line.amount, 0.0, "The amount is zero")
self.assertEqual(line.rate, 0.0, "The rate is zero")
self.assertEqual(line.quantity, 0.0, "The quantity is zero")
self.assertEqual(line.code, "TEST", "The code is 'TEST'")
def test_python_code_result_not_set(self):
self.test_rule.amount_python_compute = "result = 2"
# Open contracts
cc = self.env["hr.contract"].search([("employee_id", "=", self.richard_emp.id)])
cc.kanban_state = "done"
self.env.ref(
"hr_contract.ir_cron_data_contract_update_state"
).method_direct_trigger()
# Create payslip and compute
payslip = self.Payslip.create({"employee_id": self.richard_emp.id})
payslip.onchange_employee()
payslip.compute_sheet()
line = payslip.line_ids.filtered(lambda l: l.code == "TEST")
self.assertEqual(len(line), 1, "I found the Test line")
self.assertEqual(line.amount, 2.0, "The amount is zero")
self.assertEqual(line.rate, 100.0, "The rate is zero")
self.assertEqual(line.quantity, 1.0, "The quantity is zero")
def test_parent_child_order(self):
# Open contracts
cc = self.env["hr.contract"].search([("employee_id", "=", self.richard_emp.id)])
cc.kanban_state = "done"
self.env.ref(
"hr_contract.ir_cron_data_contract_update_state"
).method_direct_trigger()
# Compute Payslip
payslip = self.Payslip.create({"employee_id": self.richard_emp.id})
payslip.onchange_employee()
payslip.compute_sheet()
# Check child test rule calculated without being in the structure
line = payslip.line_ids.filtered(lambda l: l.code == "CHILD_TEST")
self.assertEqual(len(line), 1, "Child line founded")
# Change sequence of child rule to calculate before of the parent rule
self.child_test_rule.sequence = 5
# Compute Payslip
payslip = self.Payslip.create({"employee_id": self.richard_emp.id})
payslip.onchange_employee()
payslip.compute_sheet()
# Child rule should be computed
line = payslip.line_ids.filtered(lambda l: l.code == "CHILD_TEST")
self.assertEqual(len(line), 1, "Child line founded")
# Change the parent rule condition to return False
self.test_rule.condition_select = "python"
self.test_rule.condition_python = "result = False"
# Compute Payslip
payslip = self.Payslip.create({"employee_id": self.richard_emp.id})
payslip.onchange_employee()
payslip.compute_sheet()
# Parent and child rule should not be calculated even if child rule condition is true
parent_line = payslip.line_ids.filtered(lambda l: l.code == "PARENT_TEST")
child_line = payslip.line_ids.filtered(lambda l: l.code == "CHILD_TEST")
self.assertEqual(len(parent_line), 0, "No parent line found")
self.assertEqual(len(child_line), 0, "No child line found")
def test_rule_and_category_with_and_without_code(self):
rule_test_code = self.SalaryRule.create(
{
"name": "rule test code",
"code": "rule_test_code",
"sequence": 100,
"amount_select": "code",
"amount_python_compute": "result = categories.BASIC + HRA",
}
)
category_without_code = self.SalaryRuleCateg.create({"name": "categ no code"})
rule_without_code = self.SalaryRule.create(
{
"name": "rule without code",
"category_id": category_without_code.id,
"sequence": 10,
"amount_select": "code",
"amount_python_compute": "result = 100",
}
)
rule_without_category = self.SalaryRule.create(
{
"name": "rule without category",
"sequence": 10,
"amount_select": "code",
"amount_python_compute": "result = 100",
}
)
structure = self.PayrollStructure.create(
{
"name": "test code and id",
"rule_ids": [
(4, self.rule_basic.id),
(4, self.rule_hra.id),
(4, rule_test_code.id),
(4, rule_without_code.id),
(4, rule_without_category.id),
],
}
)
payslip = self.Payslip.create(
{
"employee_id": self.richard_emp.id,
"contract_id": self.richard_contract.id,
"struct_id": structure.id,
}
)
payslip.compute_sheet()
line = payslip.line_ids.filtered(lambda l: l.code == "rule_test_code")
self.assertEqual(line.total, 7000, "5000 categories.BASIC + 2000 HRA = 7000")
line = payslip.line_ids.filtered(lambda l: l.name == "rule without code")
self.assertEqual(len(line), 1, "Line found: rule without code")
line = payslip.line_ids.filtered(lambda l: l.name == "rule without category")
self.assertEqual(len(line), 1, "Line found: rule without category")
def test_line_sum_where(self):
rule_fix_1 = self.SalaryRule.create(
{
"name": "Fixed rule 1",
"sequence": 1,
"condition_select": "none",
"amount_select": "fix",
"amount_fix": 100.0,
}
)
rule_fix_2 = self.SalaryRule.create(
{
"name": "Fixed rule 2",
"sequence": 2,
"condition_select": "none",
"amount_select": "fix",
"amount_fix": 200.0,
}
)
rule_line_sum_where = self.Rule.create(
{
"name": "Total fixed values",
"sequence": 3,
"amount_select": "code",
"amount_python_compute": """result = payslip.line_sum_where(
"amount_select", "fix", rules, result_rules
)""",
}
)
self.sales_pay_structure.rule_ids = [
(4, rule_fix_1.id),
(4, rule_fix_2.id),
(4, rule_line_sum_where.id),
]
payslip = self.Payslip.create(
{
"employee_id": self.richard_emp.id,
"contract_id": self.richard_contract.id,
"struct_id": self.sales_pay_structure.id,
}
)
payslip.compute_sheet()
line = payslip.line_ids.filtered(lambda l: l.name == "Total fixed values")
self.assertEqual(line.total, 300, "Fixed rules: 100 + 200 = 300")