Update l10n_us_nj_hr_payroll for 2019 refactor (WIP)

This commit is contained in:
Jared Kipe
2019-01-08 17:28:40 -08:00
parent f0ccdf0b76
commit 60584776a0
10 changed files with 202 additions and 242 deletions

View File

@@ -1 +1 @@
from . import us_nj_hr_payroll
from . import models

View File

@@ -4,7 +4,7 @@
'license': 'AGPL-3',
'category': 'Localization',
'depends': ['l10n_us_hr_payroll'],
'version': '11.0.2018.0.0',
'version': '11.0.2019.0.0',
'description': """
USA::New Jersey Payroll Rules.
==============================
@@ -22,9 +22,10 @@ USA::New Jersey Payroll Rules.
'auto_install': False,
'website': 'https://hibou.io/',
'data':[
'us_nj_hr_payroll_view.xml',
'views/us_nj_hr_payroll_views.xml',
'data/base.xml',
'data/rules_2018.xml',
'data/rates.xml',
'data/rules.xml',
'data/final.xml',
],
'installable': True

View File

@@ -90,64 +90,64 @@
<!-- HR SALARY RULE CATEGORIES-->
<record id="hr_payroll_nj_unemp_wages" model="hr.salary.rule.category">
<field name="name">New Jersey Unemployment Insurance Tax - Wages</field>
<field name="code">NJ_UNEMP_WAGES</field>
<field name="name">Wage: US-NJ Unemployment Insurance</field>
<field name="code">WAGE_US_NJ_UNEMP</field>
</record>
<record id="hr_payroll_nj_sdi_wages" model="hr.salary.rule.category">
<field name="name">New Jersey State Disability Insurance Tax - Wages</field>
<field name="code">NJ_SDI_WAGES</field>
<field name="name">Wage: US-NJ State Disability Insurance</field>
<field name="code">WAGE_US_NJ_SDI</field>
</record>
<record id="hr_payroll_nj_fli_wages" model="hr.salary.rule.category">
<field name="name">New Jersey Family Leave Insurance Tax - Wages</field>
<field name="code">NJ_FLI_WAGES</field>
<field name="name">Wage: US-NJ Family Leave Insurance</field>
<field name="code">WAGE_US_NJ_FLI</field>
</record>
<record id="hr_payroll_nj_wf_wages" model="hr.salary.rule.category">
<field name="name">New Jersey Work Force Development - Wages</field>
<field name="code">NJ_WF_WAGES</field>
<field name="name">Wage: US-NJ Work Force Development</field>
<field name="code">WAGE_US_NJ_WF</field>
</record>
<record id="hr_payroll_nj_unemp_employee" model="hr.salary.rule.category">
<field name="name">New Jersey Unemployment Insurance Tax - Employee</field>
<field name="code">NJ_UNEMP_EMPLOYEE</field>
<field name="name">EE: US-NJ Unemployment Insurance</field>
<field name="code">EE_US_NJ_UNEMP</field>
<field name="parent_id" ref="hr_payroll.DED"/>
</record>
<record id="hr_payroll_nj_unemp_company" model="hr.salary.rule.category">
<field name="name">New Jersey Unemployment Insurance Tax - Employer</field>
<field name="code">NJ_UNEMP_COMPANY</field>
<field name="name">ER: US-NJ Unemployment Insurance</field>
<field name="code">ER_US_NJ_UNEMP</field>
<field name="parent_id" ref="hr_payroll.COMP"/>
</record>
<record id="hr_payroll_nj_sdi_company" model="hr.salary.rule.category">
<field name="name">New Jersey State Disability Insurance - Employer</field>
<field name="code">NJ_SDI_COMPANY</field>
<field name="name">ER: US-NJ State Disability Insurance</field>
<field name="code">ER_US_NJ_SDI</field>
<field name="parent_id" ref="hr_payroll.COMP"/>
</record>
<record id="hr_payroll_nj_sdi_employee" model="hr.salary.rule.category">
<field name="name">New Jersey State Disability Insurance - Employee</field>
<field name="code">NJ_SDI_EMPLOYEE</field>
<field name="name">EE: US-NJ State Disability Insurance</field>
<field name="code">EE_US_NJ_SDI</field>
<field name="parent_id" ref="hr_payroll.DED"/>
</record>
<record id="hr_payroll_nj_fli" model="hr.salary.rule.category">
<field name="name">New Jersey State Family Leave Insurance Tax</field>
<field name="code">NJ_FLI</field>
<field name="name">EE: US-NJ Family Leave Insurance</field>
<field name="code">EE_US_NJ_FLI</field>
<field name="parent_id" ref="hr_payroll.DED"/>
</record>
<record id="hr_payroll_nj_wf" model="hr.salary.rule.category">
<field name="name">New Jersey State Workforce Development/Suppllemental Tax</field>
<field name="code">NJ_WF</field>
<field name="name">EE: US-NJ Workforce Development</field>
<field name="code">EE_US_NJ_WF</field>
<field name="parent_id" ref="hr_payroll.DED"/>
</record>
<record id="hr_payroll_nj_income_withhold" model="hr.salary.rule.category">
<field name="name">New Jersey Income Withholding</field>
<field name="code">NJ_WITHHOLD</field>
<field name="name">EE: US-NJ Income Withholding</field>
<field name="code">EE_US_NJ_INC_WITHHOLD</field>
<field name="parent_id" ref="hr_payroll.DED"/>
</record>

View File

@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<data noupdate="1">
<record id="hr_payroll_rates_nj_er_unemp_2018" model="hr.payroll.rate">
<field name="name">US NJ Unemployment (Company)</field>
<field name="code">ER_US_NJ_UNEMP</field>
<field name="rate">3.4</field>
<field name="date_from">2018-01-01</field>
<field name="wage_limit_year" eval="33700.0"/>
</record>
<record id="hr_payroll_rates_nc_ee_unemp_2018" model="hr.payroll.rate">
<field name="name">US NJ Unemployment (Employee)</field>
<field name="code">EE_US_NJ_UNEMP</field>
<field name="rate">0.3825</field>
<field name="date_from">2018-01-01</field>
</record>
<record id="hr_payroll_rates_nc_er_sdi_2018" model="hr.payroll.rate">
<field name="name">US NJ State Disability Insurance (Company)</field>
<field name="code">ER_US_NJ_SDI</field>
<field name="rate">0.5</field>
<field name="date_from">2018-01-01</field>
<field name="wage_limit_year" eval="33700.0"/>
</record>
<record id="hr_payroll_rates_nc_ee_sdi_2018" model="hr.payroll.rate">
<field name="name">US NJ State Disability Insurance (Employee)</field>
<field name="code">EE_US_NJ_SDI</field>
<field name="rate">0.24</field>
<field name="date_from">2018-01-01</field>
</record>
<record id="hr_payroll_rates_nc_er_fli_2018" model="hr.payroll.rate">
<field name="name">US NJ Family Leave Insurance (Company)</field>
<field name="code">ER_US_NJ_FLI</field>
<field name="rate">0.00</field>
<field name="date_from">2018-01-01</field>
<field name="wage_limit_year" eval="33700.0"/>
</record>
<record id="hr_payroll_rates_nc_ee_fli_2018" model="hr.payroll.rate">
<field name="name">US NJ Family Leave Insurance (Employee)</field>
<field name="code">EE_US_NJ_FLI</field>
<field name="rate">0.1</field>
<field name="date_from">2018-01-01</field>
</record>
<record id="hr_payroll_rates_nc_er_wf_2018" model="hr.payroll.rate">
<field name="name">US NJ Workforce Development (Company)</field>
<field name="code">ER_US_NJ_WF</field>
<field name="rate">0.1175</field>
<field name="date_from">2018-01-01</field>
</record>
<record id="hr_payroll_rates_nc_ee_wf_2018" model="hr.payroll.rate">
<field name="name">US NJ Workforce Development (Employee)</field>
<field name="code">EE_US_NJ_WF</field>
<field name="rate">0.0425</field>
<field name="date_from">2018-01-01</field>
</record>
</data>
</odoo>

View File

@@ -5,18 +5,20 @@
<!-- HR SALARY RULES-->
<!-- UNEMPLOYMENT -->
<record id="hr_payroll_rules_nj_unemp_wages_2018" model="hr.salary.rule">
<field name="sequence" eval="140"/>
<field name="sequence" eval="420"/>
<field name="category_id" ref="hr_payroll_nj_unemp_wages"/>
<field name="name">New Jersey Unemployment Insurance Tax - Wages (2018)</field>
<field name="code">NJ_UNEMP_WAGES_2018</field>
<field name="name">Wage: US-NJ Unemployment Insurance</field>
<field name="code">WAGE_US_NJ_UNEMP</field>
<field name="condition_select">python</field>
<field name="condition_python">result = (payslip.date_to[:4] == '2018')</field>
<field name="condition_python">result = (contract.futa_type != contract.FUTA_TYPE_BASIC)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
###
ytd = payslip.sum('NJ_UNEMP_WAGES_2018', '2018-01-01', '2019-01-01')
year = int(payslip.dict.date_from[:4])
rate = payslip.dict.get_rate('ER_US_NJ_UNEMP')
ytd = payslip.sum('WAGE_US_NJ_UNEMP', str(year) + '-01-01', str(year+1) + '-01-01')
ytd += contract.external_wages
remaining = 33700.0 - ytd
remaining = rate.wage_limit_year - ytd
if remaining &lt;= 0.0:
result = 0
elif remaining &lt; categories.BASIC:
@@ -29,14 +31,15 @@ else:
<record id="hr_payroll_rules_nj_unemp_employee_2018" model="hr.salary.rule">
<field name="sequence" eval="145"/>
<field name="category_id" ref="hr_payroll_nj_unemp_employee"/>
<field name="name">New Jersey Unemployment - Employee(2018)</field>
<field name="code">NJ_UNEMP_EMPLOYEE_2018</field>
<field name="name">EE: US-NJ Unemployment</field>
<field name="code">EE_US_NJ_UNEMP</field>
<field name="condition_select">python</field>
<field name="condition_python">result = (payslip.date_to[:4] == '2018')</field>
<field name="condition_python">result = (contract.futa_type != contract.FUTA_TYPE_BASIC)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result_rate = -contract.nj_unemp_employee_rate(2018)
result = categories.NJ_UNEMP_WAGES
rate = payslip.dict.get_rate('EE_US_NJ_UNEMP')
result_rate = -rate.rate
result = categories.BASIC
# result_rate of 0 implies 100% due to bug
if result_rate == 0.0:
@@ -48,14 +51,15 @@ if result_rate == 0.0:
<record id="hr_payroll_rules_nj_unemp_company_2018" model="hr.salary.rule">
<field name="sequence" eval="443"/>
<field name="category_id" ref="hr_payroll_nj_unemp_company"/>
<field name="name">New Jersey Unemployment - Employer(2018)</field>
<field name="code">NJ_UNEMP_COMPANY_2018</field>
<field name="name">ER: US-NJ Unemployment</field>
<field name="code">ER_US_NJ_UNEMP</field>
<field name="condition_select">python</field>
<field name="condition_python">result = (payslip.date_to[:4] == '2018')</field>
<field name="condition_python">result = (contract.futa_type != contract.FUTA_TYPE_BASIC)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result_rate = -contract.nj_unemp_company_rate(2018)
result = categories.NJ_UNEMP_WAGES
rate = payslip.dict.get_rate('ER_US_NJ_UNEMP')
result_rate = -rate.rate
result = categories.WAGE_US_NJ_UNEMP
# result_rate of 0 implies 100% due to bug
if result_rate == 0.0:
@@ -68,18 +72,20 @@ if result_rate == 0.0:
<!-- STATE DISABILITY INSURANCE -->
<record id="hr_payroll_rules_nj_sdi_wages_2018" model="hr.salary.rule">
<field name="sequence" eval="140"/>
<field name="sequence" eval="420"/>
<field name="category_id" ref="hr_payroll_nj_sdi_wages"/>
<field name="name">New Jersey State Disability Tax - Wages (2018)</field>
<field name="code">NJ_SDI_WAGES_2018</field>
<field name="name">Wage: US-NJ State Disability Insurance</field>
<field name="code">WAGE_US_NJ_SDI</field>
<field name="condition_select">python</field>
<field name="condition_python">result = (payslip.date_to[:4] == '2018')</field>
<field name="condition_python">result = (contract.futa_type != contract.FUTA_TYPE_BASIC)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
###
ytd = payslip.sum('NJ_SDI_WAGES_2018', '2018-01-01', '2019-01-01')
year = int(payslip.dict.date_from[:4])
rate = payslip.dict.get_rate('ER_US_NJ_SDI')
ytd = payslip.sum('WAGE_US_NJ_SDI', str(year) + '-01-01', str(year+1) + '-01-01')
ytd += contract.external_wages
remaining = 33700.0 - ytd
remaining = rate.wage_limit_year - ytd
if remaining &lt;= 0.0:
result = 0
elif remaining &lt; categories.BASIC:
@@ -92,14 +98,15 @@ else:
<record id="hr_payroll_rules_nj_sdi_employee_2018" model="hr.salary.rule">
<field name="sequence" eval="145"/>
<field name="category_id" ref="hr_payroll_nj_sdi_employee"/>
<field name="name">New Jersey State Disability Insurance - Employee(2018)</field>
<field name="code">NJ_SDI_EMPLOYEE_2018</field>
<field name="name">EE: US-NJ State Disability Insurance</field>
<field name="code">EE_US_NJ_SDI</field>
<field name="condition_select">python</field>
<field name="condition_python">result = (payslip.date_to[:4] == '2018')</field>
<field name="condition_python">result = (contract.futa_type != contract.FUTA_TYPE_BASIC)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result_rate = -contract.nj_sdi_employee_rate(2018)
result = categories.NJ_SDI_WAGES
rate = payslip.dict.get_rate('EE_US_NJ_SDI')
result_rate = -rate.rate
result = categories.BASIC
# result_rate of 0 implies 100% due to bug
if result_rate == 0.0:
@@ -111,14 +118,15 @@ if result_rate == 0.0:
<record id="hr_payroll_rules_nj_sdi_company_2018" model="hr.salary.rule">
<field name="sequence" eval="443"/>
<field name="category_id" ref="hr_payroll_nj_sdi_company"/>
<field name="name">New Jersey State Disability Insurance - Employer(2018)</field>
<field name="code">NJ_SDI_COMPANY_2018</field>
<field name="name">ER: US-NJ State Disability Insurance</field>
<field name="code">ER_US_NJ_SDI</field>
<field name="condition_select">python</field>
<field name="condition_python">result = (payslip.date_to[:4] == '2018')</field>
<field name="condition_python">result = (contract.futa_type != contract.FUTA_TYPE_BASIC)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result_rate = -contract.nj_sdi_company_rate(2018)
result = categories.NJ_SDI_WAGES
rate = payslip.dict.get_rate('ER_US_NJ_SDI')
result_rate = -rate.rate
result = categories.WAGE_US_NJ_SDI
# result_rate of 0 implies 100% due to bug
if result_rate == 0.0:
@@ -130,18 +138,20 @@ if result_rate == 0.0:
<!-- FAMILY LEAVE INSURANCE -->
<record id="hr_payroll_rules_nj_fli_wages_2018" model="hr.salary.rule">
<field name="sequence" eval="140"/>
<field name="sequence" eval="420"/>
<field name="category_id" ref="hr_payroll_nj_fli_wages"/>
<field name="name">New Jersey Family Leave Insurance Tax - Wages (2018)</field>
<field name="code">NJ_FLI_WAGES_2018</field>
<field name="name">Wage: US-NJ Family Leave Insurance</field>
<field name="code">WAGE_US_NJ_FLI</field>
<field name="condition_select">python</field>
<field name="condition_python">result = (payslip.date_to[:4] == '2018')</field>
<field name="condition_python">result = (contract.futa_type != contract.FUTA_TYPE_BASIC)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
###
ytd = payslip.sum('NJ_FLI_WAGES_2018', '2018-01-01', '2019-01-01')
year = int(payslip.dict.date_from[:4])
rate = payslip.dict.get_rate('ER_US_NJ_FLI')
ytd = payslip.sum('WAGE_US_NJ_FLI', str(year) + '-01-01', str(year+1) + '-01-01')
ytd += contract.external_wages
remaining = 33700.0 - ytd
remaining = rate.wage_limit_year - ytd
if remaining &lt;= 0.0:
result = 0
elif remaining &lt; categories.BASIC:
@@ -154,14 +164,15 @@ else:
<record id="hr_payroll_rules_nj_fli_2018" model="hr.salary.rule">
<field name="sequence" eval="145"/>
<field name="category_id" ref="hr_payroll_nj_fli"/>
<field name="name">New Jersey Family Leave Insurance(2018)</field>
<field name="code">NJ_FLI_2018</field>
<field name="name">EE: US-NJ Family Leave Insurance</field>
<field name="code">EE_US_NJ_FLI</field>
<field name="condition_select">python</field>
<field name="condition_python">result = (payslip.date_to[:4] == '2018')</field>
<field name="condition_python">result = (contract.futa_type != contract.FUTA_TYPE_BASIC)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result_rate = -contract.nj_fli_rate(2018)
result = categories.NJ_FLI_WAGES
rate = payslip.dict.get_rate('EE_US_NJ_FLI')
result_rate = -rate.rate
result = categories.BASIC
</field>
<field name="register_id" ref="contrib_register_njdor_fli"/>
<field name="appears_on_payslip" eval="False"/>
@@ -171,16 +182,18 @@ result = categories.NJ_FLI_WAGES
<record id="hr_payroll_rules_nj_wf_wages_2018" model="hr.salary.rule">
<field name="sequence" eval="140"/>
<field name="category_id" ref="hr_payroll_nj_wf_wages"/>
<field name="name">New Jersey Workforce Development/Supplemental Workforce Funds Tax - Wages (2018)</field>
<field name="code">NJ_WF_WAGES_2018</field>
<field name="name">Wage: US-NJ Workforce Development Funds</field>
<field name="code">WAGE_US_NJ_WF</field>
<field name="condition_select">python</field>
<field name="condition_python">result = (payslip.date_to[:4] == '2018')</field>
<field name="condition_python">result = (contract.futa_type != contract.FUTA_TYPE_BASIC)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
###
ytd = payslip.sum('NJ_WF_WAGES_2018', '2018-01-01', '2019-01-01')
year = int(payslip.dict.date_from[:4])
rate = payslip.dict.get_rate('ER_US_NJ_WF')
ytd = payslip.sum('WAGE_US_NJ_WF', str(year) + '-01-01', str(year+1) + '-01-01')
ytd += contract.external_wages
remaining = 33700.0 - ytd
remaining = rate.wage_limit_year - ytd
if remaining &lt;= 0.0:
result = 0
elif remaining &lt; categories.BASIC:
@@ -193,14 +206,15 @@ else:
<record id="hr_payroll_rules_nj_wf_2018" model="hr.salary.rule">
<field name="sequence" eval="145"/>
<field name="category_id" ref="hr_payroll_nj_wf"/>
<field name="name">New Jersey Workforce Development/Supplemental Workforce Funds(2018)</field>
<field name="code">NJ_WF_2018</field>
<field name="name">EE: US-NJ Workforce Development Funds</field>
<field name="code">EE_US_NJ_WF</field>
<field name="condition_select">python</field>
<field name="condition_python">result = (payslip.date_to[:4] == '2018')</field>
<field name="condition_python">result = (contract.futa_type != contract.FUTA_TYPE_BASIC)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
result_rate = -contract.nj_wf_rate(2018)
result = categories.NJ_WF_WAGES
rate = payslip.dict.get_rate('EE_US_NJ_WF')
result_rate = -rate.rate
result = categories.BASIC
if result_rate == 0.0:
result = 0.0
@@ -213,10 +227,10 @@ if result_rate == 0.0:
<record id="hr_payroll_rules_nj_inc_withhold_2018" model="hr.salary.rule">
<field name="sequence" eval="145"/>
<field name="category_id" ref="hr_payroll_nj_income_withhold"/>
<field name="name">New Jersey Income Withholding</field>
<field name="code">NJ_INC_WITHHOLD_2018</field>
<field name="name">EE: US-NJ Income Withholding</field>
<field name="code">EE_US_NJ_INC_WITHHOLD</field>
<field name="condition_select">python</field>
<field name="condition_python">result = (payslip.date_to[:4] == '2018')</field>
<field name="condition_python">result = True</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
wages = categories.GROSS

View File

@@ -0,0 +1 @@
from . import us_nj_hr_payroll

View File

@@ -0,0 +1,21 @@
from odoo import models, fields, api
class USNJHrContract(models.Model):
_inherit = 'hr.contract'
nj_njw4_allowances = fields.Integer(string="New Jersey NJ-W4 Allowances",
default=0,
help="Allowances claimed on NJ W-4")
nj_additional_withholding = fields.Float(string="Additional Withholding",
default=0.0,
help='Additional withholding from line 5 of form NJ-W4')
nj_njw4_filing_status = fields.Selection([
('single', 'Single'),
('married_separate', 'Married/Civil Union partner Separate'),
('married_joint', 'Married/Civil Union Couple Joint'),
('widower', 'Widower/Surviving Civil Union Partner'),
('head_household', 'Head of Household')
], string='NJ Filing Status', default='single')
nj_njw4_rate_table = fields.Char(string='Wage Chart Letter',
help='Wage Chart Letter from line 3 of form NJ-W4.')

View File

@@ -6,6 +6,14 @@ class TestUsNJPayslip(TestUsPayslip):
# 2018 Taxes and Rates
###
NJ_UNEMP_MAX_WAGE = 33700.0
EE_NJ_UNEMP = -0.3825 / 100.0
ER_NJ_UNEMP = -3.4 / 100.0
EE_NJ_SDI = -0.24 / 100.0
ER_NJ_SDI = -0.5 / 100.0
EE_NJ_FLI = -0.1 / 100.0
ER_NJ_FLI = 0.0
EE_NJ_WF = -0.0425 / 100.0
ER_NJ_WF = 0.0
# Examples found on page 24 of http://www.state.nj.us/treasury/taxation/pdf/current/njwt.pdf
def test_2018_taxes_example1(self):
@@ -18,13 +26,6 @@ class TestUsNJPayslip(TestUsPayslip):
wh = -4.21
employee = self._createEmployee()
employee.company_id.nj_unemp_employee = 0.3825
employee.company_id.nj_unemp_company = 3.4
employee.company_id.nj_sdi_employee = 0.19
employee.company_id.nj_sdi_company = 0.5
employee.company_id.nj_fli = 0.09
employee.company_id.nj_wf = 0.0
contract = self._createContract(employee,
salary,
struct_id=self.ref(
@@ -35,14 +36,6 @@ class TestUsNJPayslip(TestUsPayslip):
contract.nj_njw4_filing_status = 'single'
contract.nj_njw4_rate_table = 'A'
# tax rates
nj_unemp_employee = contract.nj_unemp_employee_rate(2018) / -100.0
nj_unemp_company = contract.nj_unemp_company_rate(2018) / -100.0
nj_sdi_employee = contract.nj_sdi_employee_rate(2018) / -100.0
nj_sdi_company = contract.nj_sdi_company_rate(2018) / -100.0
nj_fli = contract.nj_fli_rate(2018) / -100.0
nj_wf = contract.nj_wf_rate(2018) / -100.0
self.assertEqual(contract.schedule_pay, 'weekly')
self._log('2018 New Jersey tax first payslip:')
@@ -52,14 +45,14 @@ class TestUsNJPayslip(TestUsPayslip):
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['NJ_UNEMP_WAGES'], salary)
self.assertPayrollEqual(cats['NJ_UNEMP_EMPLOYEE'], round(cats['NJ_UNEMP_WAGES'] * nj_unemp_employee, 2))
self.assertPayrollEqual(cats['NJ_UNEMP_COMPANY'], cats['NJ_UNEMP_WAGES'] * nj_unemp_company)
self.assertPayrollEqual(cats['NJ_SDI_EMPLOYEE'], cats['NJ_SDI_WAGES'] * nj_sdi_employee)
self.assertPayrollEqual(cats['NJ_SDI_COMPANY'], cats['NJ_SDI_WAGES'] * nj_sdi_company)
self.assertPayrollEqual(cats['NJ_FLI'], cats['NJ_FLI_WAGES'] * nj_fli)
self.assertPayrollEqual(cats['NJ_WF'], cats['NJ_WF_WAGES'] * nj_wf)
self.assertPayrollEqual(cats['NJ_WITHHOLD'], wh)
self.assertPayrollEqual(cats['WAGE_US_NJ_UNEMP'], salary)
self.assertPayrollEqual(cats['EE_US_NJ_UNEMP'], round(cats['BASIC'] * self.EE_NJ_UNEMP, 2))
self.assertPayrollEqual(cats['ER_US_NJ_UNEMP'], cats['WAGE_US_NJ_UNEMP'] * self.ER_NJ_UNEMP)
self.assertPayrollEqual(cats['EE_US_NJ_SDI'], cats['BASIC'] * self.EE_NJ_SDI)
self.assertPayrollEqual(cats['ER_US_NJ_SDI'], cats['WAGE_US_NJ_SDI'] * self.ER_NJ_SDI)
self.assertPayrollEqual(cats['EE_US_NJ_FLI'], cats['BASIC'] * self.EE_NJ_FLI)
self.assertPayrollEqual(cats['EE_US_NJ_WF'], cats['BASIC'] * self.EE_NJ_WF)
self.assertPayrollEqual(cats['EE_US_NJ_INC_WITHHOLD'], wh)
process_payslip(payslip)
@@ -75,9 +68,9 @@ class TestUsNJPayslip(TestUsPayslip):
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['NJ_UNEMP_WAGES'], remaining_nj_unemp_wages)
self.assertPayrollEqual(cats['NJ_UNEMP_COMPANY'], remaining_nj_unemp_wages * nj_unemp_company)
self.assertPayrollEqual(cats['NJ_UNEMP_EMPLOYEE'], remaining_nj_unemp_wages * nj_unemp_employee)
self.assertPayrollEqual(cats['WAGE_US_NJ_UNEMP'], remaining_nj_unemp_wages)
self.assertPayrollEqual(cats['ER_US_NJ_UNEMP'], remaining_nj_unemp_wages * self.ER_NJ_UNEMP)
self.assertPayrollEqual(cats['EE_US_NJ_UNEMP'], cats['BASIC'] * self.EE_NJ_UNEMP)
def test_2018_taxes_example2(self):
salary = 1400.00
@@ -89,13 +82,6 @@ class TestUsNJPayslip(TestUsPayslip):
wh = -27.60
employee = self._createEmployee()
employee.company_id.nj_unemp_employee = 0.3825
employee.company_id.nj_unemp_company = 3.4
employee.company_id.nj_sdi_employee = 0.19
employee.company_id.nj_sdi_company = 0.5
employee.company_id.nj_fli = 0.09
employee.company_id.nj_wf = 0.0
contract = self._createContract(employee,
salary,
struct_id=self.ref(
@@ -105,14 +91,6 @@ class TestUsNJPayslip(TestUsPayslip):
contract.nj_additional_withholding = additional_withholding
contract.nj_njw4_filing_status = 'married_joint'
# tax rates
nj_unemp_employee = contract.nj_unemp_employee_rate(2018) / -100.0
nj_unemp_company = contract.nj_unemp_company_rate(2018) / -100.0
nj_sdi_employee = contract.nj_sdi_employee_rate(2018) / -100.0
nj_sdi_company = contract.nj_sdi_company_rate(2018) / -100.0
nj_fli = contract.nj_fli_rate(2018) / -100.0
nj_wf = contract.nj_wf_rate(2018) / -100.0
self.assertEqual(contract.schedule_pay, 'weekly')
self._log('2018 New Jersey tax first payslip:')
@@ -122,13 +100,13 @@ class TestUsNJPayslip(TestUsPayslip):
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['NJ_UNEMP_WAGES'], salary)
self.assertPayrollEqual(cats['NJ_UNEMP_EMPLOYEE'], round((cats['NJ_UNEMP_WAGES'] * nj_unemp_employee), 2))
self.assertPayrollEqual(cats['NJ_UNEMP_COMPANY'], cats['NJ_UNEMP_WAGES'] * nj_unemp_company)
self.assertPayrollEqual(cats['NJ_SDI_EMPLOYEE'], cats['NJ_SDI_WAGES'] * nj_sdi_employee)
self.assertPayrollEqual(cats['NJ_SDI_COMPANY'], cats['NJ_SDI_WAGES'] * nj_sdi_company)
self.assertPayrollEqual(cats['NJ_FLI'], cats['NJ_FLI_WAGES'] * nj_fli)
self.assertPayrollEqual(cats['NJ_WF'], cats['NJ_WF_WAGES'] * nj_wf)
self.assertPayrollEqual(cats['NJ_WITHHOLD'], wh)
self.assertPayrollEqual(cats['WAGE_US_NJ_UNEMP'], salary)
self.assertPayrollEqual(cats['EE_US_NJ_UNEMP'], cats['BASIC'] * self.EE_NJ_UNEMP)
self.assertPayrollEqual(cats['ER_US_NJ_UNEMP'], cats['WAGE_US_NJ_UNEMP'] * self.ER_NJ_UNEMP)
self.assertPayrollEqual(cats['EE_US_NJ_SDI'], cats['BASIC'] * self.EE_NJ_SDI)
self.assertPayrollEqual(cats['ER_US_NJ_SDI'], cats['WAGE_US_NJ_SDI'] * self.ER_NJ_SDI)
self.assertPayrollEqual(cats['EE_US_NJ_FLI'], cats['BASIC'] * self.EE_NJ_FLI)
self.assertPayrollEqual(cats['EE_US_NJ_WF'], cats['BASIC'] * self.EE_NJ_WF)
self.assertPayrollEqual(cats['EE_US_NJ_INC_WITHHOLD'], wh)
process_payslip(payslip)

View File

@@ -1,92 +0,0 @@
from odoo import models, fields, api
class USNJHrContract(models.Model):
_inherit = 'hr.contract'
nj_njw4_allowances = fields.Integer(string="New Jersey NJ-W4 Allowances",
default=0,
help="Allowances claimed on NJ W-4")
nj_additional_withholding = fields.Float(string="Additional Withholding",
default=0.0,
help='Additional withholding from line 5 of form NJ-W4')
nj_njw4_filing_status = fields.Selection([
('single', 'Single'),
('married_separate', 'Married/Civil Union partner Separate'),
('married_joint', 'Married/Civil Union Couple Joint'),
('widower', 'Widower/Surviving Civil Union Partner'),
('head_household', 'Head of Household')
], string='NJ Filing Status', default='single')
nj_njw4_rate_table = fields.Char(string='Wage Chart Letter',
help='Wage Chart Letter from line 3 of form NJ-W4.')
def nj_unemp_employee_rate(self, year):
self.ensure_one()
if self.futa_type == self.FUTA_TYPE_BASIC:
return 0.0
if hasattr(self.employee_id.company_id, 'nj_unemp_employee_rate_' + str(year)):
return self.employee_id.company_id['nj_unemp_employee_rate_' + str(year)]
raise NotImplemented('Year (' + str(year) + ') Not implemented for US New Jersey.')
def nj_unemp_company_rate(self, year):
self.ensure_one()
if self.futa_type == self.FUTA_TYPE_BASIC:
return 0.0
if hasattr(self.employee_id.company_id, 'nj_unemp_company_rate_' + str(year)):
return self.employee_id.company_id['nj_unemp_company_rate_' + str(year)]
raise NotImplemented('Year (' + str(year) + ') Not implemented for US New Jersey.')
def nj_sdi_company_rate(self, year):
self.ensure_one()
if self.futa_type == self.FUTA_TYPE_BASIC:
return 0.0
if hasattr(self.employee_id.company_id, 'nj_sdi_company_rate_' + str(year)):
return self.employee_id.company_id['nj_sdi_company_rate_' + str(year)]
raise NotImplemented('Year (' + str(year) + ') Not implemented for US New Jersey.')
def nj_sdi_employee_rate(self, year):
self.ensure_one()
if self.futa_type == self.FUTA_TYPE_BASIC:
return 0.0
if hasattr(self.employee_id.company_id, 'nj_sdi_employee_rate_' + str(year)):
return self.employee_id.company_id['nj_sdi_employee_rate_' + str(year)]
raise NotImplemented('Year (' + str(year) + ') Not implemented for US New Jersey.')
def nj_fli_rate(self, year):
self.ensure_one()
if self.futa_type == self.FUTA_TYPE_BASIC:
return 0.0
if hasattr(self.employee_id.company_id, 'nj_fli_rate_' + str(year)):
return self.employee_id.company_id['nj_fli_rate_' + str(year)]
raise NotImplemented('Year (' + str(year) + ') Not implemented for US New Jersey.')
def nj_wf_rate(self, year):
self.ensure_one()
if self.futa_type == self.FUTA_TYPE_BASIC:
return 0.0
if hasattr(self.employee_id.company_id, 'nj_wf_rate_' + str(year)):
return self.employee_id.company_id['nj_wf_rate_' + str(year)]
raise NotImplemented('Year (' + str(year) + ') Not implemented for US New Jersey.')
class NJCompany(models.Model):
_inherit = 'res.company'
nj_unemp_company_rate_2018 = fields.Float(string="New Jersey Employer State Unemployment Insurance Rate 2018", default=3.4)
nj_unemp_employee_rate_2018 = fields.Float(string="New Jersey Employee State Unemployment Insurance Rate 2018", default=0.3825)
nj_sdi_company_rate_2018 = fields.Float(string="New Jersey Employer State Disability Insurance Rate 2018", default=0.5)
nj_sdi_employee_rate_2018 = fields.Float(string="New Jersey Employee State Disability Insurance Rate 2018", default=0.19)
nj_fli_rate_2018 = fields.Float(string="New Jersey Family Leave Insurance Rate 2018", default=0.09)
nj_wf_rate_2018 = fields.Float(string="New Jersey Workforce Development Rate 2018", default=0.0)

View File

@@ -1,25 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="us_nj_view_company_form" model="ir.ui.view">
<field name="name">res.company.form</field>
<field name="model">res.company</field>
<field name="priority">20</field>
<field name="inherit_id" ref="base.view_company_form"/>
<field name="arch" type="xml">
<data>
<xpath expr="//field[@name='currency_id']" position="after">
<field name="nj_unemp_company_rate_2018"/>
<field name="nj_unemp_employee_rate_2018"/>
<field name="nj_sdi_company_rate_2018"/>
<field name="nj_sdi_employee_rate_2018"/>
<field name="nj_fli_rate_2018"/>
<field name="nj_wf_rate_2018"/>
</xpath>
</data>
</field>
</record>
<record id="hr_contract_form_l10n_us_nj_inherit" model="ir.ui.view">
<field name="name">hr.contract.form.inherit</field>
<field name="model">hr.contract</field>