diff --git a/l10n_us_nc_hr_payroll/data/rules_2018.xml b/l10n_us_nc_hr_payroll/data/rules_2018.xml index 58e1f83a..d73ba291 100755 --- a/l10n_us_nc_hr_payroll/data/rules_2018.xml +++ b/l10n_us_nc_hr_payroll/data/rules_2018.xml @@ -95,7 +95,11 @@ else: if contract.nc_nc4_filing_status == 'exempt': result = 0 else: - result = -round(((wages - (PST + (allowance_multiplier * allowances))) * 0.05599) + contract.nc_nc4_additional_wh) + withholding = round(((wages - (PST + (allowance_multiplier * allowances))) * 0.05599) + contract.nc_nc4_additional_wh) + if withholding > 0.0: + result = - withholding + else: + result = 0 diff --git a/l10n_us_nc_hr_payroll/tests/test_us_nc_payslip_2018.py b/l10n_us_nc_hr_payroll/tests/test_us_nc_payslip_2018.py index 249acc27..d7d34a0d 100755 --- a/l10n_us_nc_hr_payroll/tests/test_us_nc_payslip_2018.py +++ b/l10n_us_nc_hr_payroll/tests/test_us_nc_payslip_2018.py @@ -379,3 +379,40 @@ class TestUsNCPayslip(TestUsPayslip): self.assertPayrollEqual(cats['NC_UNEMP_WAGES'], remaining_nc_unemp_wages) self.assertPayrollEqual(cats['NC_UNEMP'], remaining_nc_unemp_wages * nc_unemp) + + def test_underflow(self): + salary = 150.0 + schedule_pay = 'weekly' + # allowance_multiplier and Portion of Standard Deduction for weekly + allowance_multiplier = 48.08 + PST = 168.27 + + exemption = 1 + + # Withholding should be 0, since pay is so low it's less than PST. + wh = 0.0 + + employee = self._createEmployee() + employee.company_id.nc_unemp_rate_2018 = 0.06 + + contract = self._createContract(employee, salary, struct_id=self.ref( + 'l10n_us_nc_hr_payroll.hr_payroll_salary_structure_us_nc_employee'), schedule_pay=schedule_pay) + contract.nc_nc4_allowances = exemption + + self.assertEqual(contract.schedule_pay, 'weekly') + + # tax rates + nc_unemp = contract.nc_unemp_rate(2018) / -100.0 + + self._log('2018 North Carolina tax first payslip weekly:') + payslip = self._createPayslip(employee, '2018-01-01', '2018-01-31') + + payslip.compute_sheet() + + cats = self._getCategories(payslip) + + self.assertPayrollEqual(cats['NC_UNEMP_WAGES'], salary) + self.assertPayrollEqual(cats['NC_UNEMP'], cats['NC_UNEMP_WAGES'] * nc_unemp) + self.assertPayrollEqual(cats['NC_INC_WITHHOLD'], wh) + + process_payslip(payslip)