# Part of Odoo. See LICENSE file for full copyright and licensing details. from datetime import date from unittest import skip from odoo import fields from odoo.tests import tagged from odoo.exceptions import UserError from .common import TestPayrollCommon @tagged("post_install_l10n", "post_install", "-at_install", "l10n_au_hr_payroll") class TestPayrollMisc(TestPayrollCommon): def test_misc_payslip_1(self): self.tax_treatment_category = 'F' employee, contract = self._create_employee(contract_info={ 'employee': 'Naruto Uzumaki', 'employment_basis_code': 'F', 'tfn_declaration': 'provided', 'tfn': '999999661', 'salary_sacrifice_superannuation': 200, 'salary_sacrifice_other': 100, 'workplace_giving_employee': 50, 'workplace_giving_employer': 50, 'wage_type': 'monthly', 'wage': 5000, 'casual_loading': 0, 'l10n_au_training_loan': True, 'l10n_au_tax_free_threshold': False, 'non_resident': True}) self.assertEqual(employee.l10n_au_tax_treatment_code, 'FFSXXX') self._test_payslip( employee, contract, expected_worked_days=[ # (work_entry_type_id.id, number_of_day, number_of_hours, amount) (self.work_entry_types['WORK100'].id, 23, 174.8, 5000), ], expected_lines=[ # (code, total) ('BASIC', 5000), ('OTE', 6050), ('EXTRA', 200), ('SALARY.SACRIFICE.TOTAL', -350), ('ALW', 550), ('ALW.TAXFREE', 0), ('RTW', 300), ('SALARY.SACRIFICE.OTHER', -150), ('WORKPLACE.GIVING', -50), ('GROSS', 5650), ('WITHHOLD', -1603), ('RTW.WITHHOLD', -96), ('WITHHOLD.STUDY', -143), ('WITHHOLD.TOTAL', -1842), ('NET', 3808), ('SUPER.CONTRIBUTION', 200), ('SUPER', 695.75), ], input_lines=self.default_input_lines, payslip_date_from=date(2024, 7, 1), payslip_date_to=date(2024, 7, 31), ) def test_misc_payslip_2(self): self.tax_treatment_category = 'F' employee, contract = self._create_employee(contract_info={ 'employee': 'Muhammad Ali', 'employment_basis_code': 'F', 'tfn_declaration': '111111111', 'salary_sacrifice_superannuation': 200, 'salary_sacrifice_other': 100, 'workplace_giving_employee': 50, 'workplace_giving_employer': 50, 'wage_type': 'monthly', 'wage': 5000, 'casual_loading': 0, 'l10n_au_training_loan': False, 'l10n_au_tax_free_threshold': False, 'non_resident': True}) self.assertEqual(employee.l10n_au_tax_treatment_code, 'FFXXXX') self._test_payslip( employee, contract, expected_worked_days=[ # (work_entry_type_id.id, number_of_day, number_of_hours, amount) (self.work_entry_types['WORK100'].id, 23, 174.8, 5000), ], expected_lines=[ # (code, total) ('BASIC', 5000), ('OTE', 6050), ('EXTRA', 200), ('SALARY.SACRIFICE.TOTAL', -350), ('ALW', 550), ('ALW.TAXFREE', 0), ('RTW', 300), ('SALARY.SACRIFICE.OTHER', -150), ('WORKPLACE.GIVING', -50), ('GROSS', 5650), ('WITHHOLD', -1603), ('RTW.WITHHOLD', -96), ('WITHHOLD.TOTAL', -1699), ('NET', 3951), ('SUPER.CONTRIBUTION', 200), ('SUPER', 695.75), ], input_lines=self.default_input_lines, payslip_date_from=date(2024, 7, 1), payslip_date_to=date(2024, 7, 31), ) def test_misc_payslip_3(self): self.tax_treatment_category = 'N' employee, contract = self._create_employee(contract_info={ 'employee': 'Test Employee', 'employment_basis_code': 'F', 'tfn_declaration': '000000000', 'salary_sacrifice_superannuation': 200, 'salary_sacrifice_other': 100, 'workplace_giving_employee': 50, 'workplace_giving_employer': 50, 'wage_type': 'monthly', 'wage': 5000, 'casual_loading': 0, 'l10n_au_training_loan': False, 'l10n_au_tax_free_threshold': False, 'income_stream_type': 'SAW', 'non_resident': True}) self.assertEqual(employee.l10n_au_tax_treatment_code, 'NFXXXX') self._test_payslip( employee, contract, expected_worked_days=[ # (work_entry_type_id.id, number_of_day, number_of_hours, amount) (self.work_entry_types['WORK100'].id, 23, 174.8, 5000), ], expected_lines=[ # (code, total) ('BASIC', 5000), ('OTE', 6050), ('EXTRA', 200), ('SALARY.SACRIFICE.TOTAL', -350), ('ALW', 550), ('ALW.TAXFREE', 0), ('RTW', 300), ('SALARY.SACRIFICE.OTHER', -150), ('WORKPLACE.GIVING', -50), ('GROSS', 5650), ('WITHHOLD', -2407), ('RTW.WITHHOLD', -135), ('WITHHOLD.TOTAL', -2542), ('NET', 3108), ('SUPER.CONTRIBUTION', 200), ('SUPER', 695.75), ], input_lines=self.default_input_lines, payslip_date_from=date(2024, 7, 1), payslip_date_to=date(2024, 7, 31), ) def test_misc_payslip_4(self): self.tax_treatment_category = 'N' employee, contract = self._create_employee(contract_info={ 'employee': 'Test Employee', 'employment_basis_code': 'F', 'tfn_declaration': '000000000', 'salary_sacrifice_superannuation': 200, 'salary_sacrifice_other': 100, 'workplace_giving_employee': 50, 'workplace_giving_employer': 50, 'wage_type': 'monthly', 'wage': 5000, 'casual_loading': 0, 'l10n_au_training_loan': False, 'l10n_au_tax_free_threshold': False, 'income_stream_type': 'SAW', 'non_resident': False}) self.assertEqual(employee.l10n_au_tax_treatment_code, 'NAXXXX') self._test_payslip( employee, contract, expected_worked_days=[ # (work_entry_type_id.id, number_of_day, number_of_hours, amount) (self.work_entry_types['WORK100'].id, 23, 174.8, 5000), ], expected_lines=[ # (code, total) ('BASIC', 5000), ('OTE', 6050), ('EXTRA', 200), ('SALARY.SACRIFICE.TOTAL', -350), ('ALW', 550), ('ALW.TAXFREE', 0), ('RTW', 300), ('SALARY.SACRIFICE.OTHER', -150), ('WORKPLACE.GIVING', -50), ('GROSS', 5650), ('WITHHOLD', -2514.5), ('RTW.WITHHOLD', -141), ('WITHHOLD.TOTAL', -2655.5), ('NET', 2994.5), ('SUPER.CONTRIBUTION', 200), ('SUPER', 695.75), ], input_lines=self.default_input_lines, payslip_date_from=date(2024, 7, 1), payslip_date_to=date(2024, 7, 31), ) def test_misc_payslip_5(self): self.tax_treatment_category = 'D' employee, contract = self._create_employee(contract_info={ 'employee': 'Test Employee', 'employment_basis_code': 'D', 'tfn_declaration': 'provided', 'tfn': '999999661', 'salary_sacrifice_superannuation': 200, 'salary_sacrifice_other': 100, 'workplace_giving_employee': 50, 'workplace_giving_employer': 50, 'wage_type': 'monthly', 'wage': 5000, 'casual_loading': 0, 'l10n_au_training_loan': False, 'l10n_au_tax_free_threshold': False, 'income_stream_type': 'SAW', 'non_resident': False}) self.assertEqual(employee.l10n_au_tax_treatment_code, 'DBXXXX') # ATO Defined should raise error with self.assertRaises(UserError): self._test_payslip( employee, contract, expected_worked_days=[ # (work_entry_type_id.id, number_of_day, number_of_hours, amount) (self.work_entry_types['WORK100'].id, 23, 174.8, 5000), ], expected_lines=[ # (code, total) ('BASIC', 5000), ('OTE', 6050), ('EXTRA', 200), ('SALARY.SACRIFICE.TOTAL', -350), ('ALW', 550), ('ALW.TAXFREE', 0), ('RTW', 300), ('SALARY.SACRIFICE.OTHER', -150), ('WORKPLACE.GIVING', -50), ('GROSS', 5650), ('WITHHOLD', -2514.5), ('RTW.WITHHOLD', -141), ('WITHHOLD.TOTAL', -2655.5), ('NET', 2994.5), ('SUPER.CONTRIBUTION', 200), ('SUPER', 695.75), ], input_lines=self.default_input_lines, payslip_date_from=date(2024, 7, 1), payslip_date_to=date(2024, 7, 31), ) def test_misc_payslip_6(self): self.tax_treatment_category = 'D' def test_misc_payslip_7(self): self.tax_treatment_category = 'D' @skip("VOL Test case to be adapted for salary sacrifice") def test_misc_payslip_8(self): self.tax_treatment_category = 'V' employee, contract = self._create_employee(contract_info={ 'employee': 'Test Employee', 'employment_basis_code': 'F', 'tfn_declaration': 'provided', 'tfn': '999999661', 'salary_sacrifice_superannuation': 200, 'salary_sacrifice_other': 100, 'workplace_giving_employee': 50, 'workplace_giving_employer': 50, 'wage_type': 'monthly', 'wage': 5000, 'casual_loading': 0, 'tax_treatment_option_voluntary': 'C', 'l10n_au_training_loan': False, 'l10n_au_tax_free_threshold': False, 'income_stream_type': 'VOL', 'comissioners_installment_rate': 50, 'non_resident': False}) self.assertEqual(employee.l10n_au_tax_treatment_code, 'VCXXXX') self._test_payslip( employee, contract, expected_worked_days=[ # (work_entry_type_id.id, number_of_day, number_of_hours, amount) (self.work_entry_types['WORK100'].id, 23, 174.8, 5000), ], expected_lines=[ # (code, total) ('BASIC', 5000), ('OTE', 6050), ('EXTRA', 200), ('SALARY.SACRIFICE.TOTAL', -350), ('ALW', 550), ('ALW.TAXFREE', 0), ('RTW', 300), ('SALARY.SACRIFICE.OTHER', -150), ('WORKPLACE.GIVING', -50), ('GROSS', 5650), ('WITHHOLD', -2825), ('WITHHOLD.TOTAL', -2825), ('NET', 2825), ('SUPER.CONTRIBUTION', 200), ('SUPER', 695.75), ], input_lines=self.default_input_lines, payslip_date_from=date(2024, 7, 1), payslip_date_to=date(2024, 7, 31), ) def test_misc_payslip_9(self): self.tax_treatment_category = 'V' employee, contract = self._create_employee(contract_info={ 'employee': 'Test Employee', 'employment_basis_code': 'F', 'tfn_declaration': 'provided', 'tfn': '999999661', 'workplace_giving_employee': 50, 'wage_type': 'monthly', 'wage': 5000, 'casual_loading': 0, 'tax_treatment_option_voluntary': 'O', 'l10n_au_training_loan': False, 'l10n_au_tax_free_threshold': False, 'income_stream_type': 'VOL', 'non_resident': False}) self.assertEqual(employee.l10n_au_tax_treatment_code, 'VOXXXX') self._test_payslip( employee, contract, expected_worked_days=[ # (work_entry_type_id.id, number_of_day, number_of_hours, amount) (self.work_entry_types['WORK100'].id, 23, 174.8, 5000), ], expected_lines=[ # (code, total) ('BASIC', 5000), ('OTE', 5200), ('EXTRA', 200), ('WORKPLACE.GIVING', -50), ('GROSS', 5150), ('WITHHOLD', -1030), ('WITHHOLD.TOTAL', -1030), ('NET', 4120), ('SUPER', 598), ], input_lines=[{ 'input_type_id': self.env.ref('l10n_au_hr_payroll.input_bonus_commissions').id, 'amount': 200, }], payslip_date_from=date(2024, 7, 1), payslip_date_to=date(2024, 7, 31), ) def test_misc_payslip_10_backpay(self): """ Test payslip for backpay for current period https://www.ato.gov.au/tax-rates-and-codes/payg-withholding-schedule-5-tax-table-for-back-payments-commissions-bonuses-and-like-payments/examples Example 1 """ # TODO: self.skipTest("Backpay to be adapted for the treatment field in another PR") self.tax_treatment_category = 'R' employee, contract = self._create_employee(contract_info={ 'employee': 'Test Employee', 'employment_basis_code': 'F', 'tfn_declaration': 'provided', 'tfn': '999999661', 'wage_type': 'monthly', 'schedule_pay': 'weekly', 'wage': 1400, 'l10n_au_training_loan': True, 'non_resident': False, 'l10n_au_tax_free_threshold': True}) inputs = [{ 'input_type_id': self.env.ref('l10n_au_hr_payroll.input_bonus_commissions_prior').id, 'name': 'Annual Bonus', 'amount': 900, }] self._test_payslip( employee, contract, expected_worked_days=[ # (work_entry_type_id.id, number_of_day, number_of_hours, amount) (self.work_entry_types['WORK100'].id, 5, 38, 1400), ], expected_lines=[ # (code, total) ('BASIC', 1400), ('OTE', 2300), ('BACKPAY', 900), ('GROSS', 2300), ('WITHHOLD', -271), ('BACKPAY.WITHHOLD', -312), ('WITHHOLD.STUDY', -94), # 43 (STSL) + 52 (Backpay) ('MEDICARE', 0), ('WITHHOLD.TOTAL', -677), ('NET', 1622.92), ('SUPER', 264.5), ], input_lines=inputs, payslip_date_from=date(2024, 7, 1), payslip_date_to=date(2024, 7, 5), ) def test_misc_payslip_11_child_support(self): self.tax_treatment_category = 'R' employee, contract = self._create_employee(contract_info={ 'employee': 'Test Employee', 'employment_basis_code': 'F', 'tfn_declaration': 'provided', 'tfn': '999999661', 'wage_type': 'monthly', 'schedule_pay': 'weekly', 'wage': 850, 'l10n_au_training_loan': False, 'l10n_au_tax_free_threshold': False}) employee.l10n_au_child_support_deduction = 320 self._test_payslip( employee, contract, expected_worked_days=[ # (work_entry_type_id.id, number_of_day, number_of_hours, amount) (self.work_entry_types['WORK100'].id, 5, 38, 850), ], expected_lines=[ # (code, total) ('BASIC', 850), ('OTE', 850), ('GROSS', 850), ('WITHHOLD', -206), ('WITHHOLD.TOTAL', -206), ('CHILD.SUPPORT', -129.5), ('NET', 514.5), ('SUPER', 97.75), ], payslip_date_from=date(2024, 7, 1), payslip_date_to=date(2024, 7, 5), ) def test_misc_payslip_12_child_support(self): self.tax_treatment_category = 'R' employee, contract = self._create_employee(contract_info={ 'employee': 'Test Employee', 'employment_basis_code': 'F', 'tfn_declaration': 'provided', 'tfn': '999999661', 'wage_type': 'monthly', 'schedule_pay': 'monthly', 'wage': 3100, 'l10n_au_training_loan': False, 'l10n_au_tax_free_threshold': True}) employee.l10n_au_child_support_deduction = 1500 self._test_payslip( employee, contract, expected_worked_days=[ # (work_entry_type_id.id, number_of_day, number_of_hours, amount) (self.work_entry_types['WORK100'].id, 23, 174.8, 3100), ], expected_lines=[ # (code, total) ('BASIC', 3100), ('OTE', 3100), ('GROSS', 3100), ('WITHHOLD', -308), ('MEDICARE', 0), ('WITHHOLD.TOTAL', -308), ('CHILD.SUPPORT', -554.84), ('NET', 2237.16), ('SUPER', 356.5), ], payslip_date_from=date(2024, 7, 1), payslip_date_to=date(2024, 7, 31), ) def test_misc_payslip_13_child_support(self): self.tax_treatment_category = 'R' employee, contract = self._create_employee(contract_info={ 'employee': 'Test Employee', 'employment_basis_code': 'F', 'tfn_declaration': 'provided', 'tfn': '999999661', 'wage_type': 'monthly', 'schedule_pay': 'monthly', 'wage': 4500, 'l10n_au_training_loan': False, 'l10n_au_tax_free_threshold': False}) self._test_payslip( employee, contract, expected_worked_days=[ # (work_entry_type_id.id, number_of_day, number_of_hours, amount) (self.work_entry_types['WORK100'].id, 23, 174.8, 4500), ], expected_lines=[ # (code, total) ('BASIC', 4500), ('OTE', 4500), ('GROSS', 4500), ('WITHHOLD', -1157), ('WITHHOLD.TOTAL', -1157), ('CHILD.SUPPORT.GARNISHEE', -1800), ('CHILD.SUPPORT', -1800), ('NET', 1543.0), ('SUPER', 517.5), ], input_lines=[{ 'input_type_id': self.env.ref('l10n_au_hr_payroll.input_child_support_garnishee_periodic').id, 'name': 'Garnishee Child Support', 'amount': 1800, }], payslip_date_from=date(2024, 7, 1), payslip_date_to=date(2024, 7, 31), ) def test_misc_payslip_14_child_support(self): self.tax_treatment_category = 'R' employee, contract = self._create_employee(contract_info={ 'employee': 'Test Employee', 'employment_basis_code': 'F', 'tfn_declaration': 'provided', 'tfn': '999999661', 'wage_type': 'monthly', 'schedule_pay': 'bi-weekly', 'wage': 2800, 'l10n_au_training_loan': False, 'l10n_au_tax_free_threshold': True}) employee.l10n_au_child_support_garnishee_amount = 0.25 self._test_payslip( employee, contract, expected_worked_days=[ # (work_entry_type_id.id, number_of_day, number_of_hours, amount) (self.work_entry_types['WORK100'].id, 10, 76, 2800), ], expected_lines=[ # (code, total) ('BASIC', 2800), ('OTE', 2800), ('GROSS', 2800), ('WITHHOLD', -542), ('MEDICARE', 0), ('WITHHOLD.TOTAL', -542), ('CHILD.SUPPORT.GARNISHEE', -564), ('CHILD.SUPPORT', -564), ('NET', 1693.38), ('SUPER', 322), ], payslip_date_from=date(2024, 7, 1), payslip_date_to=date(2024, 7, 12), ) def test_misc_payslip_15_child_support(self): self.tax_treatment_category = 'R' employee, contract = self._create_employee(contract_info={ 'employee': 'Test Employee', 'employment_basis_code': 'F', 'tfn_declaration': 'provided', 'tfn': '999999661', 'wage_type': 'monthly', 'schedule_pay': 'monthly', 'wage': 6000, 'l10n_au_training_loan': False, 'l10n_au_tax_free_threshold': True}) employee.l10n_au_child_support_deduction = 300 employee.l10n_au_child_support_garnishee_amount = 0.10 self._test_payslip( employee, contract, expected_worked_days=[ # (work_entry_type_id.id, number_of_day, number_of_hours, amount) (self.work_entry_types['WORK100'].id, 23, 174.8, 6000), ], expected_lines=[ # (code, total) ('BASIC', 6000), ('OTE', 6000), ('GROSS', 6000), ('WITHHOLD', -1157), ('MEDICARE', 0), ('WITHHOLD.TOTAL', -1157), ('CHILD.SUPPORT.GARNISHEE', -484.3), ('CHILD.SUPPORT', -784.3), ('NET', 4058.7), ('SUPER', 690), ], payslip_date_from=date(2024, 7, 1), payslip_date_to=date(2024, 7, 31), ) def test_misc_payslip_16_medicare(self): self.tax_treatment_category = 'R' employee, contract = self._create_employee(contract_info={ 'employee': 'Test Employee', 'employment_basis_code': 'F', 'tfn_declaration': 'provided', 'tfn': '999999661', 'wage_type': 'monthly', 'schedule_pay': 'weekly', 'wage': 3000, 'l10n_au_training_loan': False, 'l10n_au_tax_free_threshold': True, 'medicare_surcharge': '3'}) self._test_payslip( employee, contract, expected_worked_days=[ # (work_entry_type_id.id, number_of_day, number_of_hours, amount) (self.work_entry_types['WORK100'].id, 5, 38, 3000), ], expected_lines=[ # (code, total) ('BASIC', 3000), ('OTE', 3000), ('GROSS', 3000), ('WITHHOLD', -812), ('MEDICARE', -45), ('WITHHOLD.TOTAL', -857), ('NET', 2143), ('SUPER', 345), ], payslip_date_from=date(2024, 7, 1), payslip_date_to=date(2024, 7, 5), ) def test_misc_payslip_17_medicare(self): self.tax_treatment_category = 'R' employee, contract = self._create_employee(contract_info={ 'employee': 'Test Employee', 'employment_basis_code': 'F', 'tfn_declaration': 'provided', 'tfn': '999999661', 'wage_type': 'monthly', 'schedule_pay': 'monthly', 'wage': 3100, 'l10n_au_training_loan': False, 'l10n_au_tax_free_threshold': True, 'medicare_exemption': 'H'}) # Pre July 2024 self._test_payslip( employee, contract, expected_worked_days=[ # (work_entry_type_id.id, number_of_day, number_of_hours, amount) (self.work_entry_types['WORK100'].id, 20, 152, 3100), ], expected_lines=[ # (code, total) ('BASIC', 3100), ('OTE', 3100), ('GROSS', 3100), ('WITHHOLD', -295), ('MEDICARE', 31), ('WITHHOLD.TOTAL', -264), ('NET', 2836), ('SUPER', 341), ], payslip_date_from=date(2024, 6, 1), payslip_date_to=date(2024, 6, 30), ) # Post July 2024 self._test_payslip( employee, contract, expected_worked_days=[ # (work_entry_type_id.id, number_of_day, number_of_hours, amount) (self.work_entry_types['WORK100'].id, 23, 174.8, 3100), ], expected_lines=[ # (code, total) ('BASIC', 3100), ('OTE', 3100), ('GROSS', 3100), ('WITHHOLD', -247), ('MEDICARE', 0), ('WITHHOLD.TOTAL', -247), ('NET', 2853), ('SUPER', 356.5), ], payslip_date_from=date(2024, 7, 1), payslip_date_to=date(2024, 7, 31), ) def test_misc_payslip_18_medicare(self): self.tax_treatment_category = 'R' employee, contract = self._create_employee(contract_info={ 'employee': 'Test Employee', 'employment_basis_code': 'F', 'tfn_declaration': 'provided', 'tfn': '999999661', 'wage_type': 'monthly', 'schedule_pay': 'bi-weekly', 'wage': 2000, 'l10n_au_training_loan': False, 'l10n_au_tax_free_threshold': True, 'medicare_reduction': '3'}) employee.l10n_au_medicare_reduction = '3' self._test_payslip( employee, contract, expected_worked_days=[ # (work_entry_type_id.id, number_of_day, number_of_hours, amount) (self.work_entry_types['WORK100'].id, 10, 76, 2000), ], expected_lines=[ # (code, total) ('BASIC', 2000), ('OTE', 2000), ('GROSS', 2000), ('WITHHOLD', -286.0), ('MEDICARE', 40), ('WITHHOLD.TOTAL', -246), ('NET', 1754.32), ('SUPER', 230), ], payslip_date_from=date(2024, 7, 1), payslip_date_to=date(2024, 7, 12), ) def test_misc_payslip_19_basic_correction(self): self.tax_treatment_category = 'R' employee, contract = self._create_employee(contract_info={ 'employee': 'Test Employee', 'employment_basis_code': 'F', 'tfn_declaration': 'provided', 'tfn': '999999661', 'wage_type': 'monthly', 'schedule_pay': 'weekly', 'wage': 2000, 'l10n_au_training_loan': False, 'l10n_au_tax_free_threshold': True}) self.assertEqual(employee.l10n_au_tax_treatment_code, "RTXXXX") self._test_payslip( employee, contract, expected_worked_days=[ # (work_entry_type_id.id, number_of_day, number_of_hours, amount) (self.work_entry_types['WORK100'].id, 5, 38, 2000), ], expected_lines=[ # (code, total) ('BASIC', 2000), ('OTE', 2000), ('GROSS', 2000), ('WITHHOLD', -463.0), ('MEDICARE', 0), ('WITHHOLD.TOTAL', -463.0), ('NET', 1537.0), ('SUPER', 230), ], payslip_date_from=date(2024, 7, 1), payslip_date_to=date(2024, 7, 5), input_lines=[ { 'input_type_id': self.env.ref('l10n_au_hr_payroll.input_gross_income_correction_ote').id, 'amount': -2000, }, { 'input_type_id': self.env.ref('l10n_au_hr_payroll.input_gross_income_correction_ote').id, 'amount': 2000, }, ] ) def test_misc_payslip_20_special_allowance_cpk(self): self.tax_treatment_category = 'R' employee, contract = self._create_employee(contract_info={ 'employee': 'Test Employee', 'employment_basis_code': 'F', 'tfn_declaration': 'provided', 'tfn': '999999661', 'wage_type': 'monthly', 'schedule_pay': 'weekly', 'wage': 2000, 'l10n_au_training_loan': False, 'l10n_au_tax_free_threshold': True}) self.assertEqual(employee.l10n_au_tax_treatment_code, "RTXXXX") payslip = self.env["hr.payslip"].create({ "name": "payslip", "employee_id": employee.id, "version_id": contract.id, "struct_id": self.default_payroll_structure.id, "date_from": fields.Date.from_string("2025-7-1"), "input_line_ids": [(0, 0, { "input_type_id": self.env.ref("l10n_au_hr_payroll.input_cents_per_kilometer_2").id, "amount": 0, })] }) payslip.l10n_au_other_input_details_ids.filtered( lambda x: x.code == 'ALW.CPK' ).write({'quantity': 300, 'rate': 2}) payslip.compute_sheet() self._test_payslip( employee, contract, expected_worked_days=[ # (work_entry_type_id.id, number_of_day, number_of_hours, amount) (self.work_entry_types['WORK100'].id, 5, 38, 2000), ], expected_lines=[ # (code, total) ('BASIC', 2000), ('OTE', 2000), ('ALW', 336), ('ALW.TAXFREE', 264), ('GROSS', 2336), ('WITHHOLD', -571.0), ('MEDICARE', 0), ('WITHHOLD.TOTAL', -571.0), ('NET', 2029.0), ('SUPER', 240), ], payslip_date_from=date(2024, 7, 1), payslip_date_to=date(2024, 7, 5), payslip=payslip ) def test_misc_payslip_21_child_support_version(self): """Test that payslip uses child support amount from its version, not current employee version. Scenario: - Version 1: child_support = 200 - Version 2 (Feb 2026): child_support = 250 - Payslip prior to Feb 2026 should use 200 (from Version 1), not 250 (from Version 2) """ # Create employee with initial contract (Version 1) self.tax_treatment_category = 'R' employee, contract = self._create_employee(contract_info={ 'employee': 'Test Employee', 'employment_basis_code': 'F', 'tfn_declaration': 'provided', 'tfn': '999999661', 'wage_type': 'monthly', 'schedule_pay': 'bi-weekly', 'wage': 2800, 'l10n_au_training_loan': False, 'l10n_au_tax_free_threshold': True, 'l10n_au_child_support_garnishee_amount': 0.25 }) # Create Version 2 starting Feb 2026 employee.create_version({ 'date_version': fields.Date.to_date('2026-02-01'), 'date_start': fields.Date.to_date('2026-02-01'), 'name': 'Feb 2026', 'l10n_au_child_support_garnishee_amount': 0.1, }) # Verify the payslip uses the amount from Version 1 (0.25), not Version 2 (0.1) self._test_payslip( employee, contract, expected_worked_days=[ # (work_entry_type_id.id, number_of_day, number_of_hours, amount) (self.work_entry_types['WORK100'].id, 10, 76, 2800), ], expected_lines=[ # (code, total) ('BASIC', 2800), ('OTE', 2800), ('GROSS', 2800), ('WITHHOLD', -542), ('MEDICARE', 0), ('WITHHOLD.TOTAL', -542), ('CHILD.SUPPORT.GARNISHEE', -564), ('CHILD.SUPPORT', -564), ('NET', 1693.38), ('SUPER', 322), ], payslip_date_from=date(2024, 7, 1), payslip_date_to=date(2024, 7, 12), ) def test_misc_payslip_21_recompute_income_stream_type(self): self.tax_treatment_category = 'R' employee, contract = self._create_employee(contract_info={ 'employee': 'Test Employee', 'employment_basis_code': 'C', 'tfn_declaration': '111111111', 'wage_type': 'monthly', 'wage': 5000, 'casual_loading': 0, }) payslip = self.env["hr.payslip"].create({ "name": "Test payslip", "employee_id": employee.id, "version_id": contract.id, "struct_id": self.default_payroll_structure.id, "date_from": date(2024, 7, 1), "date_to": date(2024, 7, 31), }) self.assertEqual(payslip.l10n_au_income_stream_type, 'SAW') employee.l10n_au_income_stream_type = 'OSP' payslip.compute_sheet() self.assertEqual(payslip.l10n_au_income_stream_type, employee.l10n_au_income_stream_type) self._test_payslip( employee, contract, payslip=payslip, expected_worked_days=[ # (work_entry_type_id.id, number_of_day, number_of_hours, amount) (self.work_entry_types["WORK100"].id, 23, 174.8, 5000), ], expected_lines=[ # (code, total) ('BASIC', 5000), ('OTE', 5000), ('GROSS', 5000), ('WITHHOLD', -1317), ('WITHHOLD.TOTAL', -1317), ('NET', 3683), ('SUPER', 575), ], )