mirror of
https://gitlab.com/hibou-io/hibou-odoo/suite.git
synced 2025-01-20 12:37:31 +02:00
Abstract fixes and behaviors.
- Adds configurable option for Payslip rule calculation sum date field.
- Fixes inconsistency between .sum_category('CODE') and .categories['CODE']
- Adds semi-monthly Semi-monthly schedule_pay
All features are tested and the tests themselves should serve as test harnesses for other 'payroll' modules.
128 lines
5.3 KiB
Python
128 lines
5.3 KiB
Python
from .common import TestPayslip, process_payslip
|
|
|
|
|
|
class TestSpecial(TestPayslip):
|
|
|
|
def test_get_year(self):
|
|
salary = 80000.0
|
|
employee = self._createEmployee()
|
|
# so the schedule_pay is now on the Structure...
|
|
contract = self._createContract(employee, wage=salary)
|
|
payslip = self._createPayslip(employee, '2020-01-01', '2020-01-14')
|
|
self.assertEqual(payslip.get_year(), 2020)
|
|
|
|
def test_semi_monthly(self):
|
|
salary = 80000.0
|
|
employee = self._createEmployee()
|
|
# so the schedule_pay is now on the Structure...
|
|
contract = self._createContract(employee, wage=salary, schedule_pay='semi-monthly')
|
|
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-14')
|
|
|
|
def test_payslip_sum_behavior(self):
|
|
self.env['ir.config_parameter'].set_param('hr_payroll.payslip.sum_behavior', 'date')
|
|
rule_category_comp = self.env.ref('hr_payroll.COMP')
|
|
test_rule_category = self.env['hr.salary.rule.category'].create({
|
|
'name': 'Test Sum Behavior',
|
|
'code': 'test_sum_behavior',
|
|
'parent_id': rule_category_comp.id,
|
|
})
|
|
test_rule = self.env['hr.salary.rule'].create({
|
|
'sequence': 450,
|
|
'struct_id': self.structure.id,
|
|
'category_id': test_rule_category.id,
|
|
'name': 'Test Sum Behavior',
|
|
'code': 'test_sum_behavior',
|
|
'condition_select': 'python',
|
|
'condition_python': 'result = 1',
|
|
'amount_select': 'code',
|
|
'amount_python_compute': '''
|
|
ytd_category = payslip.sum_category('test_sum_behavior', '2020-01-01', '2021-01-01')
|
|
ytd_rule = payslip.sum('test_sum_behavior', '2020-01-01', '2021-01-01')
|
|
result = 0.0
|
|
if ytd_category != ytd_rule:
|
|
# error
|
|
result = -1.0
|
|
elif ytd_rule == 0.0:
|
|
# first payslip in period
|
|
result = 1.0
|
|
'''
|
|
})
|
|
salary = 80000.0
|
|
employee = self._createEmployee()
|
|
contract = self._createContract(employee, wage=salary, schedule_pay='bi-weekly')
|
|
payslip = self._createPayslip(employee, '2019-12-30', '2020-01-12')
|
|
cats = self._getCategories(payslip)
|
|
self.assertEqual(cats['BASIC'], salary)
|
|
self.assertEqual(cats['test_sum_behavior'], 1.0)
|
|
process_payslip(payslip)
|
|
|
|
# Basic date_from behavior.
|
|
self.env['ir.config_parameter'].set_param('hr_payroll.payslip.sum_behavior', 'date_from')
|
|
# The the date_from on the last payslip will not be found
|
|
payslip = self._createPayslip(employee, '2020-01-13', '2020-01-27')
|
|
payslip.compute_sheet()
|
|
cats = self._getCategories(payslip)
|
|
self.assertEqual(cats['test_sum_behavior'], 1.0)
|
|
|
|
# date_to behavior.
|
|
self.env['ir.config_parameter'].set_param('hr_payroll.payslip.sum_behavior', 'date_to')
|
|
# The date_to on the last payslip is found
|
|
payslip = self._createPayslip(employee, '2020-01-13', '2020-01-27')
|
|
payslip.compute_sheet()
|
|
cats = self._getCategories(payslip)
|
|
self.assertEqual(cats['test_sum_behavior'], 0.0)
|
|
|
|
def test_recursive_salary_rule_category(self):
|
|
self.debug = True
|
|
# In this scenario, you are in rule code that will check for the category
|
|
# and a subcategory will also
|
|
alw_category = self.env.ref('hr_payroll.ALW')
|
|
ded_category = self.env.ref('hr_payroll.DED')
|
|
test_category = self.env['hr.salary.rule.category'].create({
|
|
'name': 'Special ALW',
|
|
'code': 'ALW_SPECIAL_RECURSIVE',
|
|
'parent_id': alw_category.id,
|
|
})
|
|
test_special_alw = self.env['hr.salary.rule'].create({
|
|
'name': 'Flat amount 200',
|
|
'code': 'ALW_SPECIAL_RECURSIVE',
|
|
'category_id': test_category.id,
|
|
'condition_select': 'none',
|
|
'amount_select': 'fix',
|
|
'amount_fix': 200.0,
|
|
'struct_id': self.structure.id,
|
|
})
|
|
test_recursion = self.env['hr.salary.rule'].create({
|
|
'name': 'Actual Test Behavior',
|
|
'code': 'RECURSION_TEST',
|
|
'category_id': ded_category.id,
|
|
'condition_select': 'none',
|
|
'amount_select': 'code',
|
|
'amount_python_compute': """
|
|
# this rule will always be the total of the ALW category and YTD ALW category
|
|
result = categories.ALW
|
|
# Note, this tests the hr.payslip.get_year() to return an integer rep of year
|
|
year = payslip.dict.get_year()
|
|
result += payslip.sum_category('ALW', str(year) + '-01-01', str(year+1) + '-01-01')
|
|
""",
|
|
'sequence': 101,
|
|
'struct_id': self.structure.id,
|
|
})
|
|
|
|
salary = 80000.0
|
|
employee = self._createEmployee()
|
|
contract = self._createContract(employee, wage=salary, schedule_pay='bi-weekly')
|
|
payslip = self._createPayslip(employee, '2020-01-01', '2020-01-14')
|
|
payslip.compute_sheet()
|
|
cats = self._getCategories(payslip)
|
|
rules = self._getRules(payslip)
|
|
self.assertEqual(rules['RECURSION_TEST'], 200.0)
|
|
process_payslip(payslip)
|
|
|
|
payslip = self._createPayslip(employee, '2020-01-15', '2020-01-27')
|
|
payslip.compute_sheet()
|
|
cats = self._getCategories(payslip)
|
|
rules = self._getRules(payslip)
|
|
# two hundred is in the YTD ALW
|
|
self.assertEqual(rules['RECURSION_TEST'], 200.0 + 200.0)
|