mirror of
https://gitlab.com/hibou-io/hibou-odoo/suite.git
synced 2025-01-20 12:37:31 +02:00
Update l10n_us_nj_hr_payroll for 2019 refactor (WIP)
This commit is contained in:
@@ -1 +1 @@
|
||||
from . import us_nj_hr_payroll
|
||||
from . import models
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
56
l10n_us_nj_hr_payroll/data/rates.xml
Normal file
56
l10n_us_nj_hr_payroll/data/rates.xml
Normal 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>
|
||||
@@ -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 <= 0.0:
|
||||
result = 0
|
||||
elif remaining < 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 <= 0.0:
|
||||
result = 0
|
||||
elif remaining < 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 <= 0.0:
|
||||
result = 0
|
||||
elif remaining < 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 <= 0.0:
|
||||
result = 0
|
||||
elif remaining < 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
|
||||
1
l10n_us_nj_hr_payroll/models/__init__.py
Normal file
1
l10n_us_nj_hr_payroll/models/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import us_nj_hr_payroll
|
||||
21
l10n_us_nj_hr_payroll/models/us_nj_hr_payroll.py
Executable file
21
l10n_us_nj_hr_payroll/models/us_nj_hr_payroll.py
Executable 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.')
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user