diff --git a/l10n_us_ca_hr_payroll/data/base.xml b/l10n_us_ca_hr_payroll/data/base.xml index b00d6277..93ac0a62 100755 --- a/l10n_us_ca_hr_payroll/data/base.xml +++ b/l10n_us_ca_hr_payroll/data/base.xml @@ -36,12 +36,12 @@ Employment Training Tax California Department of Taxation - Employment Training Tax - + State Disability Insurance California Department of Taxation - State Disability Insurance - + diff --git a/l10n_us_ca_hr_payroll/data/rules_2018.xml b/l10n_us_ca_hr_payroll/data/rules_2018.xml index dd8c7d6e..e74376a1 100755 --- a/l10n_us_ca_hr_payroll/data/rules_2018.xml +++ b/l10n_us_ca_hr_payroll/data/rules_2018.xml @@ -87,7 +87,7 @@ result = categories.CA_ETT_WAGES if result_rate == 0.0: result = 0.0 - + diff --git a/l10n_us_ks_hr_payroll/data/rules_2018.xml b/l10n_us_ks_hr_payroll/data/rules_2018.xml index 29b9110c..ea88f973 100755 --- a/l10n_us_ks_hr_payroll/data/rules_2018.xml +++ b/l10n_us_ks_hr_payroll/data/rules_2018.xml @@ -60,11 +60,14 @@ allowances = contract.ks_k4_allowances additional_withholding = contract.ks_additional_withholding schedule_pay = contract.schedule_pay filing_status = contract.ks_k4_filing_status +tax_rate_table = [] # Tables are found in https://www.ksrevenue.org/pdf/kw1002017.pdf # First check for exemption status (Step 1) if filing_status == 'exempt': result = 0 +elif wages <= 0: + result = 0 else: # Calculate Withholding Allowance Amounts using table (allowance multipliers are from table). @@ -94,7 +97,7 @@ else: (float('inf'), 0.057, 24.09), ] - elif filing_status == 'married': + elif filing_status == 'married' and wages > 0: tax_rate_table = [ (144, 0.0, 0.0), (721, 0.031, 0.0), @@ -112,7 +115,7 @@ else: (float('inf'), 0.057, 48.17), ] - elif filing_status == 'married': + elif filing_status == 'married' and wages > 0: tax_rate_table = [ (288, 0.0, 0.0), (1442, 0.031, 0.0), @@ -130,7 +133,7 @@ else: (float('inf'), 0.057, 52.19), ] - elif filing_status == 'married': + elif filing_status == 'married' and wages > 0: tax_rate_table = [ (313, 0.0, 0.0), (1563, 0.031, 0.0), @@ -148,7 +151,7 @@ else: (float('inf'), 0.057, 104.38), ] - elif filing_status == 'married': + elif filing_status == 'married' and wages > 0: tax_rate_table = [ (625, 0.0, 0.0), (3125, 0.031, 0.0), @@ -166,7 +169,7 @@ else: (float('inf'), 0.057, 313.13), ] - elif filing_status == 'married': + elif filing_status == 'married' and wages > 0: tax_rate_table = [ (1875, 0.0, 0.0), (9375, 0.031, 0.0), @@ -184,7 +187,7 @@ else: (float('inf'), 0.057, 626.25), ] - elif filing_status == 'married': + elif filing_status == 'married' and wages > 0: tax_rate_table = [ (3750, 0.0, 0.0), (18750, 0.031, 0.0), @@ -202,7 +205,7 @@ else: (float('inf'), 0.057, 1252.50), ] - elif filing_status == 'married': + elif filing_status == 'married' and wages > 0: tax_rate_table = [ (7500, 0.0, 0.0), (37500, 0.031, 0.0), 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)