From b409dba9103a2567a47c5c9da1c1cdbbfa48593f Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Tue, 7 Jan 2020 16:06:31 -0800 Subject: [PATCH] IMP `l10n_us_hr_payroll` Implement generic state income tax exempt and additional fields. Include in PA Tests and State Form section. --- l10n_us_hr_payroll/data/state/pa_pennsylvania.xml | 6 +++--- l10n_us_hr_payroll/models/state/general.py | 12 ++++++++---- l10n_us_hr_payroll/models/us_payroll_config.py | 2 ++ .../tests/test_us_pa_pennsylvania_payslip_2020.py | 12 ++++++++++++ l10n_us_hr_payroll/views/us_payroll_config_views.xml | 4 ++++ 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/l10n_us_hr_payroll/data/state/pa_pennsylvania.xml b/l10n_us_hr_payroll/data/state/pa_pennsylvania.xml index 53312b39..f46a92b4 100644 --- a/l10n_us_hr_payroll/data/state/pa_pennsylvania.xml +++ b/l10n_us_hr_payroll/data/state/pa_pennsylvania.xml @@ -90,7 +90,7 @@ - ER: US PA Pennsylvania State Unemployment (RT-6) + ER: US PA Pennsylvania State Unemployment (UC-2) ER_US_PA_SUTA python result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_pa_suta_wage_base', rate='us_pa_suta_rate', state_code='PA') @@ -104,7 +104,7 @@ - EE: US PA Pennsylvania State Unemployment (RT-6) + EE: US PA Pennsylvania State Unemployment (UC-2) EE_US_PA_SUTA python result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, rate='us_pa_suta_ee_rate', state_code='PA') @@ -118,7 +118,7 @@ - EE: US PA Pennsylvania State Income Tax Withholding + EE: US PA Pennsylvania State Income Tax Withholding (PA-501) EE_US_PA_SIT python result, _ = general_state_income_withholding(payslip, categories, worked_days, inputs, rate='us_pa_sit_rate', state_code='PA') diff --git a/l10n_us_hr_payroll/models/state/general.py b/l10n_us_hr_payroll/models/state/general.py index 0185aea8..eff29da8 100644 --- a/l10n_us_hr_payroll/models/state/general.py +++ b/l10n_us_hr_payroll/models/state/general.py @@ -99,14 +99,12 @@ def general_state_income_withholding(payslip, categories, worked_days, inputs, w Returns SUTA eligible wage and rate. WAGE = GROSS - WAGE_US_941_FIT_EXEMPT - The Federal Income Tax Filing status (W4) is used for Exemption. - :return: result, result_rate (wage, percent) """ if not _state_applies(payslip, state_code): return 0.0, 0.0 - if not payslip.contract_id.us_payroll_config_value('fed_941_fit_w4_filing_status'): + if payslip.contract_id.us_payroll_config_value('state_income_tax_exempt'): return 0.0, 0.0 # Determine Wage @@ -116,4 +114,10 @@ def general_state_income_withholding(payslip, categories, worked_days, inputs, w ytd_wage += payslip.contract_id.external_wages wage = categories.GROSS - categories.WAGE_US_941_FIT_EXEMPT - return _general_rate(payslip, wage, ytd_wage, wage_base=wage_base, wage_start=wage_start, rate=rate) + result, result_rate = _general_rate(payslip, wage, ytd_wage, wage_base=wage_base, wage_start=wage_start, rate=rate) + additional = payslip.contract_id.us_payroll_config_value('state_income_tax_additional_withholding') + if additional: + tax = result * (result_rate / 100.0) + tax -= additional # assumed result_rate is negative and that the 'additional' should increase it. + return result, ((tax / result) * 100.0) + return result, result_rate diff --git a/l10n_us_hr_payroll/models/us_payroll_config.py b/l10n_us_hr_payroll/models/us_payroll_config.py index d87ebcac..e75b5210 100644 --- a/l10n_us_hr_payroll/models/us_payroll_config.py +++ b/l10n_us_hr_payroll/models/us_payroll_config.py @@ -15,6 +15,8 @@ class HRContractUSPayrollConfig(models.Model): employee_id = fields.Many2one('hr.employee', string="Employee", required=True) state_id = fields.Many2one('res.country.state', string="Applied State") state_code = fields.Char(related='state_id.code') + state_income_tax_exempt = fields.Boolean(string='State Income Tax Exempt') + state_income_tax_additional_withholding = fields.Float(string='State Income Tax Additional Withholding') fed_940_type = fields.Selection([ (FUTA_TYPE_EXEMPT, 'Exempt (0%)'), diff --git a/l10n_us_hr_payroll/tests/test_us_pa_pennsylvania_payslip_2020.py b/l10n_us_hr_payroll/tests/test_us_pa_pennsylvania_payslip_2020.py index 9433e805..3dd3fd27 100755 --- a/l10n_us_hr_payroll/tests/test_us_pa_pennsylvania_payslip_2020.py +++ b/l10n_us_hr_payroll/tests/test_us_pa_pennsylvania_payslip_2020.py @@ -29,3 +29,15 @@ class TestUsPAPayslip(TestUsPayslip): payslip.compute_sheet() cats = self._getCategories(payslip) self.assertPayrollEqual(cats['EE_US_SIT'], wh) + + # Test Additional + contract.us_payroll_config_id.state_income_tax_additional_withholding = 100.0 + payslip.compute_sheet() + cats = self._getCategories(payslip) + self.assertPayrollEqual(cats['EE_US_SIT'], wh - 100.0) + + # Test Exempt + contract.us_payroll_config_id.state_income_tax_exempt = True + payslip.compute_sheet() + cats = self._getCategories(payslip) + self.assertPayrollEqual(cats.get('EE_US_SIT', 0.0), 0.0) diff --git a/l10n_us_hr_payroll/views/us_payroll_config_views.xml b/l10n_us_hr_payroll/views/us_payroll_config_views.xml index e7ae0338..701920b3 100644 --- a/l10n_us_hr_payroll/views/us_payroll_config_views.xml +++ b/l10n_us_hr_payroll/views/us_payroll_config_views.xml @@ -44,6 +44,10 @@

No additional fields.

+ + + +