Merge branch 'mig/12.0/l10n_us_hr_payroll__2020' into '12.0'

mig/12.0/l10n_us_hr_payroll__2020 into 12.0

See merge request hibou-io/hibou-odoo/suite!295
This commit is contained in:
Jared Kipe
2020-04-18 23:05:40 +00:00
54 changed files with 5004 additions and 34 deletions

View File

@@ -1,3 +1,12 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from . import models
def _post_install_hook(cr, registry):
"""
This method will set the default for the Payslip Sum Behavior
"""
cr.execute("SELECT id FROM ir_config_parameter WHERE key = 'hr_payroll.payslip.sum_behavior';")
existing = cr.fetchall()
if not existing:
cr.execute("INSERT INTO ir_config_parameter (key, value) VALUES ('hr_payroll.payslip.sum_behavior', 'date');")

View File

@@ -28,10 +28,19 @@ USA Payroll Rules.
'data/federal/fed_941_fica_rules.xml',
'data/federal/fed_941_fit_parameters.xml',
'data/federal/fed_941_fit_rules.xml',
'data/state/ak_alaska.xml',
'data/state/al_alabama.xml',
'data/state/ar_arkansas.xml',
'data/state/az_arizona.xml',
'data/state/ca_california.xml',
'data/state/co_colorado.xml',
'data/state/ct_connecticut.xml',
'data/state/de_delaware.xml',
'data/state/fl_florida.xml',
'data/state/ga_georgia.xml',
'data/state/hi_hawaii.xml',
'data/state/ia_iowa.xml',
'data/state/id_idaho.xml',
'data/state/il_illinois.xml',
'data/state/mi_michigan.xml',
'data/state/mn_minnesota.xml',
@@ -39,7 +48,9 @@ USA Payroll Rules.
'data/state/ms_mississippi.xml',
'data/state/mt_montana.xml',
'data/state/nc_northcarolina.xml',
'data/state/nh_new_hampshire.xml',
'data/state/nj_newjersey.xml',
'data/state/nm_new_mexico.xml',
'data/state/oh_ohio.xml',
'data/state/pa_pennsylvania.xml',
'data/state/tx_texas.xml',
@@ -47,8 +58,13 @@ USA Payroll Rules.
'data/state/wa_washington.xml',
'data/final.xml',
'views/hr_contract_views.xml',
'views/res_config_settings_views.xml',
'views/us_payroll_config_views.xml',
],
'installable': True,
'demo': [
],
'auto_install': False,
'post_init_hook': '_post_install_hook',
'license': 'OPL-1',
}

View File

@@ -16,17 +16,46 @@
ref('hr_payroll_rule_ee_fed_941_fit'),
ref('hr_payroll_rule_er_us_ak_suta'),
ref('hr_payroll_rule_ee_us_ak_suta'),
ref('hr_payroll_rule_er_us_al_suta'),
ref('hr_payroll_rule_ee_us_al_sit'),
ref('hr_payroll_rule_er_us_ar_suta'),
ref('hr_payroll_rule_ee_us_ar_sit'),
ref('hr_payroll_rule_er_us_az_suta'),
ref('hr_payroll_rule_ee_us_az_sit'),
ref('hr_payroll_rule_er_us_ca_suta'),
ref('hr_payroll_rule_er_us_ca_suta_ett'),
ref('hr_payroll_rule_ee_us_ca_suta_sdi'),
ref('hr_payroll_rule_ee_us_ca_sit'),
ref('hr_payroll_rule_er_us_co_suta'),
ref('hr_payroll_rule_ee_us_co_sit'),
ref('hr_payroll_rule_er_us_ct_suta'),
ref('hr_payroll_rule_ee_us_ct_sit'),
ref('hr_payroll_rule_er_us_de_suta'),
ref('hr_payroll_rule_ee_us_de_sit'),
ref('hr_payroll_rule_er_us_fl_suta'),
ref('hr_payroll_rule_er_us_ga_suta'),
ref('hr_payroll_rule_ee_us_ga_sit'),
ref('hr_payroll_rule_er_us_hi_suta'),
ref('hr_payroll_rule_ee_us_hi_sit'),
ref('hr_payroll_rule_er_us_ia_suta'),
ref('hr_payroll_rule_ee_us_ia_sit'),
ref('hr_payroll_rule_er_us_id_suta'),
ref('hr_payroll_rule_ee_us_id_sit'),
ref('hr_payroll_rule_er_us_il_suta'),
ref('hr_payroll_rule_ee_us_il_sit'),
@@ -49,6 +78,8 @@
ref('hr_payroll_rule_er_us_nc_suta'),
ref('hr_payroll_rule_ee_us_nc_sit'),
ref('hr_payroll_rule_er_us_nh_suta'),
ref('hr_payroll_rule_er_us_nj_suta'),
ref('hr_payroll_rule_ee_us_nj_suta'),
ref('hr_payroll_rule_er_us_nj_sdi'),
@@ -59,6 +90,9 @@
ref('hr_payroll_rule_ee_us_nj_fli'),
ref('hr_payroll_rule_ee_us_nj_sit'),
ref('hr_payroll_rule_er_us_nm_suta'),
ref('hr_payroll_rule_ee_us_nm_sit'),
ref('hr_payroll_rule_er_us_oh_suta'),
ref('hr_payroll_rule_ee_us_oh_sit'),

View File

@@ -0,0 +1,88 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<data noupdate="1">
<record id="rule_parameter_us_ak_suta_wage_base_2019" model="hr.payroll.rate">
<field name="name">US AK Alaska SUTA Wage Base</field>
<field name="code">us_ak_suta_wage_base</field>
<field name="parameter_value">39900.00</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ak_suta_wage_base_2020" model="hr.payroll.rate">
<field name="name">US AK Alaska SUTA Wage Base</field>
<field name="code">us_ak_suta_wage_base</field>
<field name="parameter_value">41500.00</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<data noupdate="1">
<record id="rule_parameter_us_ak_suta_rate_2019" model="hr.payroll.rate">
<field name="name">US AK Alaska SUTA Rate</field>
<field name="code">us_ak_suta_rate</field>
<field name="parameter_value">1.780</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ak_suta_rate_2020" model="hr.payroll.rate">
<field name="name">US AK Alaska SUTA Rate</field>
<field name="code">us_ak_suta_rate</field>
<field name="parameter_value">1.590</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<data noupdate="1">
<record id="rule_parameter_us_ak_suta_ee_rate_2019" model="hr.payroll.rate">
<field name="name">US AK Alaska SUTA Rate EE</field>
<field name="code">us_ak_suta_ee_rate</field>
<field name="parameter_value">0.500</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ak_suta_ee_rate_2020" model="hr.payroll.rate">
<field name="name">US AK Alaska SUTA Rate EE</field>
<field name="code">us_ak_suta_ee_rate</field>
<field name="parameter_value">0.500</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_ak_dor" model="res.partner">
<field name="name">US Alaska - Department of Labor and Workforce Development (ADLWD) - Unemployment Tax</field>
</record>
<record id="contrib_register_us_ak_dor" model="hr.contribution.register">
<field name="name">US Alaska - Department of Labor and Workforce Development (ADLWD) - Unemployment Tax</field>
<field name="partner_id" ref="res_partner_us_ak_dor"/>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_ak_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US AK Alaska State Unemployment</field>
<field name="code">ER_US_AK_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ak_suta_wage_base', rate='us_ak_suta_rate', state_code='AK')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ak_suta_wage_base', rate='us_ak_suta_rate', state_code='AK')</field>
<field name="register_id" ref="contrib_register_us_ak_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_ak_suta" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="category_id" ref="hr_payroll_category_ee_us_suta"/>
<field name="name">EE: US AK Alaska State Unemployment (UC-2)</field>
<field name="code">EE_US_AK_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ak_suta_wage_base', rate='us_ak_suta_ee_rate', state_code='AK')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ak_suta_wage_base', rate='us_ak_suta_ee_rate', state_code='AK')</field>
<field name="register_id" ref="contrib_register_us_ak_dor"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,179 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<data noupdate="1">
<record id="rule_parameter_us_al_suta_wage_base_2019" model="hr.payroll.rate">
<field name="name">US AL Alabama SUTA Wage Base</field>
<field name="code">us_al_suta_wage_base</field>
<field name="parameter_value">8000.0</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_al_suta_wage_base_2020" model="hr.payroll.rate">
<field name="name">US AL Alabama SUTA Wage Base</field>
<field name="code">us_al_suta_wage_base</field>
<field name="parameter_value">8000.0</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<data noupdate="1">
<record id="rule_parameter_us_al_suta_rate_2019" model="hr.payroll.rate">
<field name="name">US AL Alabama SUTA Rate</field>
<field name="code">us_al_suta_rate</field>
<field name="parameter_value">2.7</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_al_suta_rate_2020" model="hr.payroll.rate">
<field name="name">US AL Alabama SUTA Rate</field>
<field name="code">us_al_suta_rate</field>
<field name="parameter_value">2.7</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<data noupdate="1">
<record id="rule_parameter_us_al_sit_tax_rate_2019" model="hr.payroll.rate">
<field name="name">US AL Alabama SIT Tax Rate</field>
<field name="code">us_al_sit_tax_rate</field>
<field name="parameter_value">{
'0': [(500, 2),( 3000, 4),('inf', 5)],
'M': [( 1000, 2),( 6000, 4),('inf', 5)],
}</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_al_sit_tax_rate_2020" model="hr.payroll.rate">
<field name="name">US AL Alabama SIT Tax Rate</field>
<field name="code">us_al_sit_tax_rate</field>
<field name="parameter_value">{
'0' : [(500, 2),(2500, 4),('inf', 5)],
'M': [(1000, 2),(5000, 4),('inf', 5)],
}</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<data noupdate="1">
<record id="rule_parameter_us_al_sit_dependent_rate_2019" model="hr.payroll.rate">
<field name="name">US AL Alabama Dependent Rate</field>
<field name="code">us_al_sit_dependent_rate</field>
<field name="parameter_value">[
( 1000, 20000),
( 500, 100000),
( 300, 'inf'),
]</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_al_sit_dependent_rate_2020" model="hr.payroll.rate">
<field name="name">US AL Alabama Dependent Rate</field>
<field name="code">us_al_sit_dependent_rate</field>
<field name="parameter_value">[
( 1000, 20000),
( 500, 100000),
( 300, 'inf'),
]</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<data noupdate="1">
<record id="rule_parameter_us_al_sit_standard_deduction_rate_2019" model="hr.payroll.rate">
<field name="name">US AL Alabama Standard Deduction Rate</field>
<field name="code">us_al_sit_standard_deduction_rate</field>
<field name="parameter_value">{
'0': ((23499.0, 2500.0), (33000.0, 2500.0, 25.0, 500.0), ('inf', 2000.0)),
'S': ((23499.0, 2500.0), (33000.0, 2500.0, 25.0, 500.0), ('inf', 2000.0)),
'MS': ((10749.0, 3750.0), (15500.0, 3750.0, 88.0, 250.0), ('inf', 2000.0)),
'M': ((23499.0, 7500.0), (33000.0, 7500.0, 175.0, 500.0), ('inf', 4000.0)),
'H': ((23499.0, 4700.0), (33000.0, 7500.0, 175.0, 500.0), ('inf', 4000.0)),
}</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_al_sit_standard_deduction_rate_2020" model="hr.payroll.rate">
<field name="name">US AL Alabama Standard Deduction Rate</field>
<field name="code">us_al_sit_standard_deduction_rate</field>
<field name="parameter_value">{
'0': ((23499.0, 2500.0), (33000.0, 2500.0, 25.0, 500.0), ('inf', 2000.0)),
'S': ((23499.0, 2500.0), (33000.0, 2500.0, 25.0, 500.0), ('inf', 2000.0)),
'MS': ((10749.0, 3750.0), (15500.0, 3750.0, 88.0, 250.0), ('inf', 2000.0)),
'M': ((23499.0, 7500.0), (33000.0, 7500.0, 175.0, 500.0), ('inf', 4000.0)),
'H': ((23499.0, 4700.0), (33000.0, 7500.0, 175.0, 500.0), ('inf', 4000.0)),
}</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<data noupdate="1">
<record id="rule_parameter_us_al_sit_personal_exemption_rate_2019" model="hr.payroll.rate">
<field name="name">US AL Alabama Personal Exemption Rate</field>
<field name="code">us_al_sit_personal_exemption_rate</field>
<field name="parameter_value">{
'0' : 0,
'S' : 1500,
'MS': 1500,
'M' : 3000,
'H' : 3000,
}</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_al_sit_personal_exemption_rate_2020" model="hr.payroll.rate">
<field name="name">US AL Alabama Personal Exemption Rate</field>
<field name="code">us_al_sit_personal_exemption_rate</field>
<field name="parameter_value">{
'0' : 0,
'S' : 1500,
'MS': 1500,
'M' : 3000,
'H' : 3000,
}</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_al_dor" model="res.partner">
<field name="name">US Alabama - Department of Economic Security (IDES) - Unemployment Tax</field>
</record>
<record id="contrib_register_us_al_dor" model="hr.contribution.register">
<field name="name">US Alabama - Department of Economic Security (IDES) - Unemployment Tax</field>
<field name="partner_id" ref="res_partner_us_al_dor"/>
</record>
<record id="res_partner_us_al_dor_sit" model="res.partner">
<field name="name">US Alabama - Department of Revenue (IDOR) - Income Tax</field>
</record>
<record id="contrib_register_us_al_dor_sit" model="hr.contribution.register">
<field name="name">US Alabama - Department of Revenue (IDOR) - Unemployment Tax</field>
<field name="partner_id" ref="res_partner_us_al_dor_sit"/>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_al_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US AL Alabama State Unemployment</field>
<field name="code">ER_US_AL_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_al_suta_wage_base', rate='us_al_suta_rate', state_code='AL')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_al_suta_wage_base', rate='us_al_suta_rate', state_code='AL')</field>
<field name="register_id" ref="contrib_register_us_al_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_al_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US AL Alabama State Income Tax Withholding</field>
<field name="code">EE_US_AL_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = al_alabama_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = al_alabama_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="register_id" ref="contrib_register_us_al_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -45,7 +45,7 @@
<field name="name">US Arizona - Department of Revenue (ADOR) - Income Tax</field>
</record>
<record id="contrib_register_us_az_dor_sit" model="hr.contribution.register">
<field name="name">US Arizona - Department of Revenue (ADOR) - Unemployment Tax</field>
<field name="name">US Arizona - Department of Revenue (ADOR) - Income Tax</field>
<field name="partner_id" ref="res_partner_us_az_dor_sit"/>
</record>

View File

@@ -0,0 +1,336 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<data noupdate="1">
<record id="rule_parameter_us_ca_suta_wage_base_2019" model="hr.payroll.rate">
<field name="name">US CA California SUTA Wage Base</field>
<field name="code">us_ca_suta_wage_base</field>
<field name="parameter_value">7000.0</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ca_suta_wage_base_2020" model="hr.payroll.rate">
<field name="name">US CA California SUTA Wage Base</field>
<field name="code">us_ca_suta_wage_base</field>
<field name="parameter_value">7000.0</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<data noupdate="1">
<record id="rule_parameter_us_ca_suta_rate_2019" model="hr.payroll.rate">
<field name="name">US CA California SUTA Rate</field>
<field name="code">us_ca_suta_rate</field>
<field name="parameter_value">3.5</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ca_suta_rate_2020" model="hr.payroll.rate">
<field name="name">US CA California SUTA Rate</field>
<field name="code">us_ca_suta_rate</field>
<field name="parameter_value">3.4</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- ETT Rate -->
<data noupdate="1">
<record id="rule_parameter_us_ca_suta_ett_rate_2019" model="hr.payroll.rate">
<field name="name">US CA California SUTA ETT Rate</field>
<field name="code">us_ca_suta_ett_rate</field>
<field name="parameter_value">0.1</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ca_suta_ett_rate_2020" model="hr.payroll.rate">
<field name="name">US CA California SUTA ETT Rate</field>
<field name="code">us_ca_suta_ett_rate</field>
<field name="parameter_value">0.1</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- SDI Rate -->
<data noupdate="1">
<record id="rule_parameter_us_ca_suta_sdi_rate_2019" model="hr.payroll.rate">
<field name="name">US CA California SUTA SDI Rate</field>
<field name="code">us_ca_suta_sdi_rate</field>
<field name="parameter_value">1.0</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ca_suta_sdi_rate_2020" model="hr.payroll.rate">
<field name="name">US CA California SUTA SDI Rate</field>
<field name="code">us_ca_suta_sdi_rate</field>
<field name="parameter_value">1.0</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<data noupdate="1">
<record id="rule_parameter_us_ca_sit_tax_rate_2019" model="hr.payroll.rate">
<field name="name">US CA California SIT Tax Rate</field>
<field name="code">us_ca_sit_tax_rate</field>
<field name="parameter_value">{
'head_household': {
'weekly': ((316, 0.011, 0.0), (750, 0.022, 3.48), (967, 0.044, 13.03), (1196, 0.066, 22.58), (1413, 0.088, 37.69), (7212, 0.1023, 56.79), (8654, 0.1133, 650.03), (14423, 0.1243, 813.41), (19231, 0.1353, 1530.50), ('inf', 0.1463, 2181.02)),
'bi-weekly': ((632, 0.011, 0.0), (1500, 0.022, 6.95), (1934, 0.044, 26.05), (2392, 0.066, 45.15), (2826, 0.088, 75.38), (14424, 0.1023, 113.57), (17308, 0.1133, 1300.05), (28846, 0.1243, 1626.81), (38462, 0.1353, 3060.98), ('inf', 0.1463, 4362.02)),
'semi-monthly': ((686, 0.011, 0.0), (1625, 0.022, 7.55), (2094, 0.044, 28.21), (2592, 0.066, 48.85), (3062, 0.088, 81.72), (15625, 0.1023, 123.08), (18750, 0.1133, 1408.27), (31250, 0.1243, 1762.33), (41667, 0.1353, 3316.08), ('inf', 0.1463, 4725.50)),
'monthly': ((1372, 0.011, 0.0), (3250, 0.022, 15.09), (4188, 0.044, 56.41), (5184, 0.066, 97.68), (6124, 0.088, 163.42), (31250, 0.1023, 246.148), (37500, 0.1133, 2816.53), (62500, 0.1243, 3524.66), (83334, 0.1353, 6632.16), ('inf', 0.1463, 9451.00)),
'quarterly': ((4114, 0.011, 0.0), (9748, 0.022, 45.25), (12566, 0.044, 169.20), (15552, 0.066, 293.19), (18369, 0.088, 490.27), (93751, 0.1023, 738.17), (112501, 0.1133, 8449.75), (187501, 0.1243, 10574.13), (250000, 0.1353, 19896.63), ('inf', 0.1463, 28352.74)),
'semi-annual': ((8228, 0.011, 0.0), (19496, 0.022, 90.51), (25132, 0.044, 338.41), (31104, 0.066, 586.39), (36738, 0.088, 980.54), (187502, 0.1023, 1476.33), (225002, 0.1133, 16899.49), (375002, 0.1243, 21148.24), (500000, 0.1353, 39793.24), ('inf', 0.1463, 56705.47)),
'annually': ((16457, 0.011, 0.0), (38991, 0.022, 181.03), (50264, 0.044, 676.78), (62206, 0.066, 1172.79), (73477, 0.088, 1960.96), (375002, 0.1023, 2952.81), (450003, 0.1133, 33798.82), (750003, 0.1243, 42296.43), (1000000, 0.1353, 79586.43), ('inf', 0.1463, 113411.02)),
},
'married': {
'weekly': ((316, 0.011, 0.0),(750, 0.022, 3.48),(1184, 0.044, 13.03),(1642, 0.066, 32.13), (2076, 0.088, 62.36),(10606, 0.1023, 100.55),(12726, 0.1133, 973.17),(19231, 0.1243, 1213.37),(21210, 0.1353, 2021.94),('inf', 0.1463, 2289.70)),
'bi-weekly': ((632, 0.011, 0.0), (1500, 0.022, 6.95), (2368, 0.044, 26.05), (3284, 0.066, 64.24), (4152, 0.088, 124.70), (21212, 0.1023, 201.08), (25452, 0.1133, 1946.32), (38462, 0.1243, 2426.71), (42420, 0.1353, 4043.85), ('inf', 0.1463, 4579.37)),
'semi-monthly': ((686, 0.011, 0.0), (1624, 0.022, 7.55), (2564, 0.044, 28.19), (3560, 0.066, 69.55), (4498, 0.088, 135.29), (22978, 0.1023, 217.83), (27574, 0.1133, 2108.33), (41667, 0.1243, 2629.06), (45956, 0.1353, 4380.82), ('inf', 0.1463, 4961.12)),
'monthly': ((1372, 0.011, 0.0), (3248, 0.022, 15.09), (5128, 0.044, 56.36), (7120, 0.066, 139.08), (8996, 0.088, 270.55), (45956, 0.1023, 435.64), (55148, 0.1133, 4216.65), (83334, 0.1243, 5258.10), (91912, 0.1353, 8761.62), ('inf', 0.1463, 9922.22)),
'quarterly': ((4112, 0.011, 0.0), (9748, 0.022, 45.23), (15384, 0.044, 169.22), (21356, 0.066, 417.20), (26990, 0.088, 811.35), (137870, 0.1023, 1307.14), (165442, 0.1133, 12650.16), (250000, 0.1243, 15774.07), (275736, 0.1353, 26284.63), ('inf', 0.1463, 29766.71)),
'semi-annual': ((8224, 0.011, 0.0), (19496, 0.022, 90.46), (30768, 0.044, 338.44), (42712, 0.066, 834.41), (53980, 0.088, 1622.71), (275740, 0.1023, 2614.29), (330884, 0.1133, 25300.34), (500000, 0.1243, 31548.16), (551472, 0.1353, 52569.28), ('inf', 0.1463, 59533.44)),
'annually': ((16446, 0.011, 0.0), (38990, 0.022, 180.91), (61538, 0.044, 676.88), (85422, 0.066, 1668.99), (107960, 0.088, 3245.33), (551476, 0.1023, 5228.67), (661768, 0.1133, 50600.36), (1000000, 0.1243, 63096.44), (1102946, 0.1353, 105138.68), ('inf', 0.1463, 119067.26)),
},
'single': {
'weekly': ((158, 0.011, 0.0), (375, 0.022, 1.74), (592, 0.044, 6.51), (821, 0.066, 16.06), (1038, 0.088, 31.17), (5303, 0.1023, 50.27), (6363, 0.1133, 486.58), (10605, 0.1243, 606.68), (19231, 0.1353, 1133.96), ('inf', 0.1463, 2301.06)),
'bi-weekly': ((316, 0.011, 0.0), (750, 0.022, 3.48), (1184, 0.044, 13.03), (1642, 0.066, 32.13), (2076, 0.088, 62.36), (10606, 0.1023, 100.55), (12726, 0.1133, 973.17), (21210, 0.1243, 1213.37), (38462, 0.1353, 2267.93), ('inf', 0.1463, 4602.13)),
'semi-monthly': ((343, 0.011, 0.0), (812, 0.022, 3.77), (1282, 0.044, 14.09), (1780, 0.066, 34.77), (2249, 0.088, 67.64), (11489, 0.1023, 108.91), (13787, 0.1133, 1054.16), (22978, 0.1243, 1314.52), (41667, 0.1353, 2456.96),('inf', 0.1463, 4985.58)),
'monthly': ((686, 0.011, 0.0), (1624, 0.022, 7.55), (2564, 0.044, 28.19), (3560, 0.066, 69.55), (4498, 0.088, 135.29), (22978, 0.1023, 217.83), (27574, 0.1133, 2108.33), (45956, 0.1243, 2629.06), (83334, 0.1353, 4913.94), ('inf', 0.1463, 9971.18)),
'quarterly': ((2056, 0.011, 0.0), (4874, 0.022, 22.62), (7692, 0.044, 84.62), (10678, 0.066, 208.61), (13495, 0.088, 405.69), (68935, 0.1023, 653.59), (82721, 0.1133, 6325.10), (137868, 0.1243, 7887.05), (250000, 0.1353, 14741.82), ('inf', 0.1463, 29913.28)),
'semi-annual': ((4112, 0.011, 0.0), (9748, 0.022, 45.23), (15384, 0.044, 169.22), (21356, 0.066, 417.20), (26990, 0.088, 811.35), (137870, 0.1023, 1307.14), (165442, 0.1133, 12650.16), (275736, 0.1243, 15774.07), (500000, 0.1353, 29483.61), ('inf', 0.1463, 59826.53)),
'annually': ((8223, 0.011, 0.0), (19495, 0.022, 90.45), (30769, 0.044, 338.43), (42711, 0.066, 834.49), (53980, 0.088, 1622.66), (275738, 0.1023, 2614.33), (330884, 0.1133, 25300.17), (551473, 0.1243, 31548.21), (1000000, 0.1353, 58967.42), ('inf', 0.1463, 119653.12)),
},
}</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ca_sit_tax_rate_2020" model="hr.payroll.rate">
<field name="name">US CA California SIT Tax Rate</field>
<field name="code">us_ca_sit_tax_rate</field>
<field name="parameter_value">{
'head_household': {
'weekly': ((339, 0.011, 0.0), (803, 0.022, 3.73), (1035, 0.044, 13.93), (1281, 0.066, 24.15), (1514, 0.088, 40.39), (7725, 0.1023, 60.89), (9270, 0.1133, 696.28), (15450, 0.1243, 871.33), (19231, 0.1353, 1639.50), ('inf', 0.1463, 2151.07)),
'bi-weekly': ((678, 0.011, 0.0), (1606, 0.022, 7.46), (2070, 0.044, 27.88), (2562, 0.066, 48.30), (3028, 0.088, 80.77), (15450, 0.1023, 121.78), (18540, 0.1133, 1392.55), (30900, 0.1243, 1742.65), (38462, 0.1353, 3279.00), ('inf', 0.1463, 4302.14)),
'semi-monthly': ((735, 0.011, 0.0), (1740, 0.022, 8.09), (2243, 0.044, 30.20), (2777, 0.066, 52.33), (3280, 0.088, 87.57), (16738, 0.1023, 131.83), (20085, 0.1133, 1508.58), (33475, 0.1243, 1887.80), (41667, 0.1353, 3552.18), ('inf', 0.1463, 4660.56)),
'monthly': ((1470, 0.011, 0.0), (3480, 0.022, 16.17), (4486, 0.044, 60.39), (5554, 0.066, 104.65), (6560, 0.088, 175.14), (33476, 0.1023, 263.67), (40170, 0.1133, 3017.18), (66950, 0.1243, 3775.61), (83334, 0.1353, 7104.36), ('inf', 0.1463, 9321.12)),
'quarterly': ((4407, 0.011, 0.0), (10442, 0.022, 48.48), (13461, 0.044, 181.25), (16659, 0.066, 314.09), (19678, 0.088, 525.16), (100426, 0.1023, 790.83), (120512, 0.1133, 9051.35), (200853, 0.1243, 11327.09), (250000, 0.1353, 21313.48), ('inf', 0.1463, 27963.07)),
'semi-annual': ((8814, 0.011, 0.0), (20884, 0.022, 96.95), (26922, 0.044, 362.49), (33318, 0.066, 628.16), (39356, 0.088, 1050.30), (200852, 0.1023, 1581.64), (241024, 0.1133, 18102.68), (401706, 0.1243, 22654.17), (500000, 0.1353, 42626.94), ('inf', 0.1463, 55926.12)),
'annually': ((17629, 0.011, 0.0), (41768, 0.022, 193.92), (53843, 0.044, 724.98), (66636, 0.066, 1256.28), (78710, 0.088, 2100.62), (401705, 0.1023, 3163.13), (482047, 0.1133, 36205.52), (803410, 0.1243, 45308.27), (1000000, 0.1353, 85253.69), ('inf', 0.1463, 111852.32)),
},
'married': {
'weekly': ((338, 0.011, 0.0),(804, 0.022, 3.72),(1268, 0.044, 13.97),(1760, 0.066, 34.39), (2224, 0.088, 66.86),(11360, 0.1023, 107.69),(13632, 0.1133, 1042.30),(19231, 0.1243, 1299.72),(22721, 0.1353, 1995.68),('inf', 0.1463, 2467.88)),
'bi-weekly': ((676, 0.011, 0.0), (1608, 0.022, 7.44), (2536, 0.044, 27.94), (3520, 0.066, 68.77), (4448, 0.088, 124.70), (21212, 0.1023, 201.08), (25452, 0.1133, 1946.32), (38462, 0.1243, 2426.71), (42420, 0.1353, 4043.85), ('inf', 0.1463, 4579.37)),
'semi-monthly': ((734, 0.011, 0.0), (1740, 0.022, 8.07), (2746, 0.044, 30.20), (3812, 0.066, 74.46), (4818, 0.088, 144.82), (24614, 0.1023, 233.35), (29538, 0.1133, 2258.48), (41667, 0.1243, 2816.37), (49229, 0.1353, 4324.00), ('inf', 0.1463, 5347.14)),
'monthly': ((1468, 0.011, 0.0), (3480, 0.022, 16.15), (5492, 0.044, 60.41), (7624, 0.066, 148.94), (9636, 0.088, 2889.65), (49228, 0.1023, 466.71), (59076, 0.1133, 4516.97), (83334, 0.1243, 5632.75), (98458, 0.1353, 8648.02), ('inf', 0.1463, 10694.30)),
'quarterly': ((4404, 0.011, 0.0), (10442, 0.022, 48.44), (16480, 0.044, 181.28), (22876, 0.066, 446.95), (28912, 0.088, 869.09), (147686, 0.1023, 1400.26), (177222, 0.1133, 13550.84), (250000, 0.1243, 16897.27), (295371, 0.1353, 25943.58), ('inf', 0.1463, 32082.28)),
'semi-annual': ((8808, 0.011, 0.0), (20884, 0.022, 96.89), (32960, 0.044, 362.56), (45752, 0.066, 893.90), (57824, 0.088, 1738.17), (295372, 0.1023, 2800.51), (354444, 0.1133, 27101.67), (500000, 0.1243, 33794.53), (590742, 0.1353, 51887.14), ('inf', 0.1463, 64164.53)),
'annually': ((17618, 0.011, 0.0), (41766, 0.022, 193.80), (65920, 0.044, 725.06), (91506, 0.066, 1787.84), (115648, 0.088, 3476.52), (590746, 0.1023, 5601.02), (708890, 0.1133, 54203.55), (1000000, 0.1243, 67589.27), (1181484, 0.1353, 103774.24), ('inf', 0.1463, 128329.03)),
},
'single': {
'weekly': ((169, 0.011, 0.0), (402, 0.022, 1.86), (634, 0.044, 6.99), (880, 0.066, 17.20), (1112, 0.088, 33.44), (5680, 0.1023, 53.86), (6816, 0.1133, 521.17), (11360, 0.1243, 649.88), (19231, 0.1353, 1214.70), ('inf', 0.1463, 2279.65)),
'bi-weekly': ((338, 0.011, 0.0), (804, 0.022, 3.72), (1268, 0.044, 13.97), (1760, 0.066, 34.39), (2224, 0.088, 66.86), (11360, 0.1023, 107.69), (13632, 0.1133, 1042.30), (22720, 0.1243, 1299.72), (38462, 0.1353, 2429.36), ('inf', 0.1463, 4559.25)),
'semi-monthly': ((367, 0.011, 0.0), (870, 0.022, 4.04), (1373, 0.044, 15.11), (1906, 0.066, 37.24), (2409, 0.088, 72.42), (12307, 0.1023, 116.68), (14769, 0.1133, 1129.25), (24614, 0.1243, 1408.19), (41667, 0.1353, 2631.92),('inf', 0.1463, 4939.19)),
'monthly': ((734, 0.011, 0.0), (1740, 0.022, 8.07), (2746, 0.044, 30.20), (3812, 0.066, 74.46), (4818, 0.088, 144.82), (24614, 0.1023, 233.35), (29538, 0.1133, 2258.48), (49228, 0.1243, 2816.37), (83334, 0.1353, 5263.84), ('inf', 0.1463, 9878.38)),
'quarterly': ((2202, 0.011, 0.0), (5221, 0.022, 24.22), (8240, 0.044, 90.64), (11438, 0.066, 223.48), (14456, 0.088, 434.55), (73843, 0.1023, 700.13), (88611, 0.1133, 6775.42), (147686, 0.1243, 8448.63), (250000, 0.1353, 15791.65), ('inf', 0.1463, 29634.73)),
'semi-annual': ((4404, 0.011, 0.0), (10442, 0.022, 48.44), (16480, 0.044, 181.28), (22876, 0.066, 446.95), (28912, 0.088, 869.09), (147686, 0.1023, 1400.26), (177222, 0.1133, 13550.84), (295372, 0.1243, 16897.27), (500000, 0.1353, 31583.32), ('inf', 0.1463, 59269.49)),
'annually': ((8809, 0.011, 0.0), (20883, 0.022, 96.90), (32960, 0.044, 362.53), (45753, 0.066, 893.92), (57824, 0.088, 1738.26), (295373, 0.1023, 2800.51), (354445, 0.1133, 27101.77), (590742, 0.1243, 33794.63), (1000000, 0.1353, 63166.35), ('inf', 0.1463, 118538.96)),
},
}</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<data noupdate="1">
<record id="rule_parameter_us_ca_sit_income_exemption_rate_2019" model="hr.payroll.rate">
<field name="name">US CA California Low Income Exemption Rate</field>
<field name="code">us_ca_sit_income_exemption_rate</field>
<field name="parameter_value">{
'weekly': ( 280, 280, 561, 561),
'bi-weekly': ( 561, 561, 1121, 1121),
'semi-monthly': ( 607, 607, 1214, 1214),
'monthly': ( 1214, 1214, 2429, 2429),
'quarterly': ( 3643, 3643, 7287, 7287),
'semi-annual': ( 7287, 7287, 14573, 14573),
'annually': (14573, 14573, 29146, 29146),
}</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ca_sit_income_exemption_rate_2020" model="hr.payroll.rate">
<field name="name">US CA California Low Income Exemption Rate</field>
<field name="code">us_ca_sit_income_exemption_rate</field>
<field name="parameter_value">{
'weekly': ( 289, 289, 579, 579),
'bi-weekly': ( 579, 579, 1157, 1157),
'semi-monthly': ( 627, 627, 1253, 1253),
'monthly': ( 1254, 1254, 2507, 2507),
'quarterly': ( 3761, 3761, 7521, 7521),
'semi-annual': ( 7521, 7521, 15042, 15042),
'annually': (15042, 15042, 30083, 30083),
}</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<data noupdate="1">
<record id="rule_parameter_us_ca_sit_estimated_deduction_rate_2019" model="hr.payroll.rate">
<field name="name">US CA California Estimated Deduction Rate</field>
<field name="code">us_ca_sit_estimated_deduction_rate</field>
<field name="parameter_value">{
'weekly': ( 19, 38, 58, 77, 96, 115, 135, 154, 173, 192),
'bi-weekly': ( 38, 77, 115, 154, 192, 231, 269, 308, 346, 385),
'semi-monthly': ( 42, 83, 125, 167, 208, 250, 292, 333, 375, 417),
'monthly': ( 83, 167, 250, 333, 417, 500, 583, 667, 750, 833),
'quarterly': ( 250, 500, 750, 1000, 1250, 1500, 1750, 2000, 2250, 2500),
'semi-annual': ( 500, 1000, 1500, 2000, 2500, 3000, 3500, 4000, 4500, 5000),
'annually': (1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000),
}</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ca_sit_estimated_deduction_rate_2020" model="hr.payroll.rate">
<field name="name">US CA California Estimated Deduction Rate</field>
<field name="code">us_ca_sit_estimated_deduction_rate</field>
<field name="parameter_value">{
'weekly': ( 19, 38, 58, 77, 96, 115, 135, 154, 173, 192),
'bi-weekly': ( 38, 77, 115, 154, 192, 231, 269, 308, 346, 385),
'semi-monthly': ( 42, 83, 125, 167, 208, 250, 292, 333, 375, 417),
'monthly': ( 83, 167, 250, 333, 417, 500, 583, 667, 750, 833),
'quarterly': ( 250, 500, 750, 1000, 1250, 1500, 1750, 2000, 2250, 2500),
'semi-annual': ( 500, 1000, 1500, 2000, 2500, 3000, 3500, 4000, 4500, 5000),
'annually': (1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000),
}</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<data noupdate="1">
<record id="rule_parameter_us_ca_sit_standard_deduction_rate_2019" model="hr.payroll.rate">
<field name="name">US CA California Standard Deduction Rate</field>
<field name="code">us_ca_sit_standard_deduction_rate</field>
<field name="parameter_value">{
'weekly': ( 85, 85, 169, 169),
'bi-weekly': ( 169, 169, 339, 339),
'semi-monthly': ( 183, 183, 367, 367),
'monthly': ( 367, 367, 734, 734),
'quarterly': (1100, 1100, 2201, 2201),
'semi-annual': (2201, 2201, 4401, 4401),
'annually': (4401, 4401, 8802, 8802),
}</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ca_sit_standard_deduction_rate_2020" model="hr.payroll.rate">
<field name="name">US CA California Standard Deduction Rate</field>
<field name="code">us_ca_sit_standard_deduction_rate</field>
<field name="parameter_value">{
'weekly': ( 87, 87, 175, 175),
'bi-weekly': ( 175, 175, 349, 349),
'semi-monthly': ( 189, 189, 378, 378),
'monthly': ( 378, 378, 756, 756),
'quarterly': (1134, 1134, 2269, 2269),
'semi-annual': (2269, 2269, 4537, 4537),
'annually': (4537, 4537, 9074, 9074),
}</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<data noupdate="1">
<record id="rule_parameter_us_ca_sit_exemption_allowance_rate_2019" model="hr.payroll.rate">
<field name="name">US CA California Exemption Allowance Rate</field>
<field name="code">us_ca_sit_exemption_allowance_rate</field>
<field name="parameter_value">{
'weekly': ( 2.41, 4.82, 7.23, 9.65, 12.06, 14.47, 16.88, 19.29, 21.70, 24.12),
'bi-weekly': ( 4.82, 9.65, 14.47, 19.29, 24.12, 28.94, 33.76, 38.58, 43.41, 48.23),
'semi-monthly': ( 5.23, 10.45, 15.68, 20.90, 26.13, 31.35, 36.58, 41.80, 47.03, 52.25),
'monthly': ( 10.45, 20.90, 31.35, 41.80, 52.25, 62.70, 73.15, 83.60, 94.05, 104.50),
'quarterly': ( 31.35, 62.70, 94.05, 125.40, 156.75, 188.10, 219.45, 250.80, 282.15, 313.50),
'semi-annual': ( 62.70, 125.40, 188.10, 250.80, 313.50, 376.20, 438.90, 501.60, 564.30, 627.00),
'annually': (125.40, 250.80, 376.20, 501.60, 627.00, 752.40, 877.80, 1003.20, 1128.60, 1254.00),
}</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ca_sit_exemption_allowance_rate_2020" model="hr.payroll.rate">
<field name="name">US CA California Exemption Allowance Rate</field>
<field name="code">us_ca_sit_exemption_allowance_rate</field>
<field name="parameter_value">{
'weekly': ( 2.58, 5.16, 7.74, 10.32, 12.90, 15.48, 18.07, 20.65, 23.23, 25.81),
'bi-weekly': ( 5.16, 10.32, 15.48, 20.65, 25.81, 30.97, 36.13, 41.29, 46.45, 51.62),
'semi-monthly': ( 5.59, 11.18, 16.78, 22.37, 27.96, 33.55, 39.14, 44.73, 50.33, 55.92),
'monthly': ( 11.18, 22.37, 33.55, 44.73, 55.92, 67.10, 78.28, 89.47, 100.65, 111.83),
'quarterly': ( 33.55, 67.10, 100.65, 134.20, 167.75, 201.30, 234.85, 268.40, 301.95, 335.50),
'semi-annual': ( 67.10, 134.20, 201.30, 268.40, 335.50, 402.60, 469.70, 536.80, 603.90, 671.00),
'annually': (134.20, 268.40, 402.60, 536.80, 671.00, 805.20, 939.40, 1073.60, 1207.80, 1342.00),
}</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_ca_dor" model="res.partner">
<field name="name">US California - Department of Taxation (CA DE88) - Unemployment Tax</field>
<field name="supplier">1</field>
</record>
<record id="contrib_register_us_ca_dor" model="hr.contribution.register">
<field name="name">US California - Department of Taxation (CA DE88) - Unemployment Tax</field>
<field name="partner_id" ref="res_partner_us_ca_dor"/>
</record>
<record id="res_partner_us_ca_dor_sit" model="res.partner">
<field name="name">US California - Department of Taxation - Income Tax</field>
<field name="supplier">1</field>
</record>
<record id="contrib_register_us_ca_dor_sit" model="hr.contribution.register">
<field name="name">US California - Department of Taxation - Income Tax</field>
<field name="partner_id" ref="res_partner_us_ca_dor_sit"/>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_ca_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US CA California State Unemployment</field>
<field name="code">ER_US_CA_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ca_suta_wage_base', rate='us_ca_suta_rate', state_code='CA')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ca_suta_wage_base', rate='us_ca_suta_rate', state_code='CA')</field>
<field name="register_id" ref="contrib_register_us_ca_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_er_us_ca_suta_ett" model="hr.salary.rule">
<field name="sequence" eval="451"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US CA California State Employee Training Tax</field>
<field name="code">ER_US_CA_SUTA_ETT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ca_suta_wage_base', rate='us_ca_suta_ett_rate', state_code='CA')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ca_suta_wage_base', rate='us_ca_suta_ett_rate', state_code='CA')</field>
<field name="register_id" ref="contrib_register_us_ca_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_ca_suta_sdi" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="category_id" ref="hr_payroll_category_ee_us_suta"/>
<field name="name">EE: US CA California State Disability Insurance</field>
<field name="code">EE_US_CA_SUTA_SDI</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ca_suta_wage_base', rate='us_ca_suta_sdi_rate', state_code='CA')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ca_suta_wage_base', rate='us_ca_suta_sdi_rate', state_code='CA')</field>
<field name="register_id" ref="contrib_register_us_ca_dor"/>
<field name="appears_on_payslip" eval="True"/>
</record>
<record id="hr_payroll_rule_ee_us_ca_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US CA California State Income Tax Withholding</field>
<field name="code">EE_US_CA_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = ca_california_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = ca_california_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="register_id" ref="contrib_register_us_ca_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,89 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<data noupdate="1">
<record id="rule_parameter_us_co_suta_wage_base_2020" model="hr.payroll.rate">
<field name="name">US CO Colorado SUTA Wage Base</field>
<field name="code">us_co_suta_wage_base</field>
<field name="parameter_value">13600.0</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<data noupdate="1">
<record id="rule_parameter_us_co_suta_rate_2020" model="hr.payroll.rate">
<field name="name">US CO Colorado SUTA Rate</field>
<field name="code">us_co_suta_rate</field>
<field name="parameter_value">1.7</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<data noupdate="1">
<record id="rule_parameter_us_co_sit_tax_rate_2020" model="hr.payroll.rate">
<field name="name">US CO Colorado SIT Tax Rate</field>
<field name="code">us_co_sit_tax_rate</field>
<field name="parameter_value">4.63</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<data noupdate="1">
<record id="rule_parameter_us_co_sit_exemption_rate_2020" model="hr.payroll.rate">
<field name="name">US CO Colorado SIT Exemption Rate</field>
<field name="code">us_co_sit_exemption_rate</field>
<field name="parameter_value">4000</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_co_dor" model="res.partner">
<field name="name">US Colorado - Department of Labor and Employment - Unemployment Tax</field>
<field name="supplier">1</field>
</record>
<record id="contrib_register_us_co_dor" model="hr.contribution.register">
<field name="name">US Colorado - Department of Labor and Employment - Unemployment Tax</field>
<field name="partner_id" ref="res_partner_us_co_dor"/>
</record>
<record id="res_partner_us_co_dor_sit" model="res.partner">
<field name="name">US Colorado - Division of Revenue - Income Tax</field>
<field name="supplier">1</field>
</record>
<record id="contrib_register_us_co_dor_sit" model="hr.contribution.register">
<field name="name">US Colorado - Division of Revenue - Income Tax</field>
<field name="partner_id" ref="res_partner_us_co_dor_sit"/>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_co_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US CO Colorado State Unemployment</field>
<field name="code">ER_US_CO_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_co_suta_wage_base', rate='us_co_suta_rate', state_code='CO')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_co_suta_wage_base', rate='us_co_suta_rate', state_code='CO')</field>
<field name="register_id" ref="contrib_register_us_co_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_co_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US CO Colorado State Income Tax Withholding</field>
<field name="code">EE_US_CO_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = co_colorado_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = co_colorado_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="register_id" ref="contrib_register_us_co_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<data noupdate="1">
<record id="rule_parameter_us_de_suta_wage_base_2020" model="hr.payroll.rate">
<field name="name">US DE Delaware SUTA Wage Base</field>
<field name="code">us_de_suta_wage_base</field>
<field name="parameter_value">16500.0</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<data noupdate="1">
<record id="rule_parameter_us_de_suta_rate_2020" model="hr.payroll.rate">
<field name="name">US DE Delaware SUTA Rate</field>
<field name="code">us_de_suta_rate</field>
<field name="parameter_value">1.50</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<data noupdate="1">
<record id="rule_parameter_us_de_sit_tax_rate_2020" model="hr.payroll.rate">
<field name="name">US DE Delaware SIT Tax Rate</field>
<field name="code">us_de_sit_tax_rate</field>
<field name="parameter_value">[
( 2000, 0.0, 0.00),
( 5000, 0.0, 2.20),
(10000, 66.0, 3.90),
(20000, 261.0, 4.80),
(25000, 741.0, 5.20),
(60000, 1001.0, 5.55),
('inf', 2943.0, 6.60),
]</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<data noupdate="1">
<record id="rule_parameter_us_de_sit_standard_deduction_rate_2020" model="hr.payroll.rate">
<field name="name">US DE Delaware Standard Deduction Rate</field>
<field name="code">us_de_sit_standard_deduction_rate</field>
<field name="parameter_value">3250</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<data noupdate="1">
<record id="rule_parameter_us_de_sit_personal_exemption_rate_2020" model="hr.payroll.rate">
<field name="name">US DE Delaware Personal Exemption Rate</field>
<field name="code">us_de_sit_personal_exemption_rate</field>
<field name="parameter_value">110</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_de_dor" model="res.partner">
<field name="name">US Delaware - Division of Unemployment Insurance - Unemployment Tax</field>
<field name="supplier">1</field>
</record>
<record id="contrib_register_us_de_dor" model="hr.contribution.register">
<field name="name">US Delaware - Division of Unemployment Insurance - Unemployment Tax</field>
<field name="partner_id" ref="res_partner_us_de_dor"/>
</record>
<record id="res_partner_us_de_dor_sit" model="res.partner">
<field name="name">US Delaware - Division of Revenue - Income Tax</field>
<field name="supplier">1</field>
</record>
<record id="contrib_register_us_de_dor_sit" model="hr.contribution.register">
<field name="name">US Delaware - Division of Revenue - Unemployment Tax</field>
<field name="partner_id" ref="res_partner_us_de_dor_sit"/>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_de_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US DE Delaware State Unemployment</field>
<field name="code">ER_US_DE_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_de_suta_wage_base', rate='us_de_suta_rate', state_code='DE')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_de_suta_wage_base', rate='us_de_suta_rate', state_code='DE')</field>
<field name="register_id" ref="contrib_register_us_de_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_de_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US DE Delaware State Income Tax Withholding</field>
<field name="code">EE_US_DE_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = de_delaware_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = de_delaware_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="register_id" ref="contrib_register_us_de_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,121 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<data noupdate="1">
<record id="rule_parameter_us_hi_suta_wage_base_2019" model="hr.payroll.rate">
<field name="name">US HI Hawaii SUTA Wage Base</field>
<field name="code">us_hi_suta_wage_base</field>
<field name="parameter_value">46800.0</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_hi_suta_wage_base_2020" model="hr.payroll.rate">
<field name="name">US HI Hawaii SUTA Wage Base</field>
<field name="code">us_hi_suta_wage_base</field>
<field name="parameter_value">48100.0</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<data noupdate="1">
<record id="rule_parameter_us_hi_suta_rate_2019" model="hr.payroll.rate">
<field name="name">US HI Hawaii SUTA Rate</field>
<field name="code">us_hi_suta_rate</field>
<field name="parameter_value">2.40</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_hi_suta_rate_2020" model="hr.payroll.rate">
<field name="name">US HI Hawaii SUTA Rate</field>
<field name="code">us_hi_suta_rate</field>
<field name="parameter_value">2.40</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<data noupdate="1">
<record id="rule_parameter_us_hi_sit_tax_rate_2019" model="hr.payroll.rate">
<field name="name">US HI Hawaii SIT Tax Rate</field>
<field name="code">us_hi_sit_tax_rate</field>
<field name="parameter_value">{
'single': ((2400, 0.00, 1.40), (4800, 34.00, 3.20), (9600, 110.00, 5.50), (14400, 374.00, 6.40), (19200, 682.00, 6.80), (24000, 1008.00, 7.20), (36000, 1354.00, 7.60), ('inf', 2266.00, 7.90)),
'married': ((4800, 0.00, 1.40), (9600, 67.00, 3.20), (19200, 221.00, 5.50), (28800, 749.00, 6.40), (38400, 1363.00, 6.80), (48000, 2016.00, 7.20), (72000, 2707.00, 7.60), ('inf', 4531.00, 7.90)),
'head_of_household': ((2400, 0.00, 1.40), (4800, 34.00, 3.20), (9600, 110.00, 5.50), (14400, 374.00, 6.40), (19200, 682.00, 6.80), (24000, 1008.00, 7.20), (36000, 1354.00, 7.60), ('inf', 2266.00, 7.90)),
}</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_hi_sit_tax_rate_2020" model="hr.payroll.rate">
<field name="name">US HI Hawaii SIT Tax Rate</field>
<field name="code">us_hi_sit_tax_rate</field>
<field name="parameter_value">{
'single': ((2400, 0.00, 1.40), (4800, 34.00, 3.20), (9600, 110.00, 5.50), (14400, 374.00, 6.40), (19200, 682.00, 6.80), (24000, 1008.00, 7.20), (36000, 1354.00, 7.60), ('inf', 2266.00, 7.90)),
'married': ((4800, 0.00, 1.40), (9600, 67.00, 3.20), (19200, 221.00, 5.50), (28800, 749.00, 6.40), (38400, 1363.00, 6.80), (48000, 2016.00, 7.20), (72000, 2707.00, 7.60), ('inf', 4531.00, 7.90)),
'head_of_household': ((2400, 0.00, 1.40), (4800, 34.00, 3.20), (9600, 110.00, 5.50), (14400, 374.00, 6.40), (19200, 682.00, 6.80), (24000, 1008.00, 7.20), (36000, 1354.00, 7.60), ('inf', 2266.00, 7.90)),
}</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<data noupdate="1">
<record id="rule_parameter_us_hi_sit_personal_exemption_rate_2019" model="hr.payroll.rate">
<field name="name">US HI Hawaii Personal Exemption Rate</field>
<field name="code">us_hi_sit_personal_exemption_rate</field>
<field name="parameter_value">1144</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_hi_sit_personal_exemption_rate_2020" model="hr.payroll.rate">
<field name="name">US HI Hawaii Personal Exemption Rate</field>
<field name="code">us_hi_sit_personal_exemption_rate</field>
<field name="parameter_value">1144</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_hi_dor" model="res.partner">
<field name="name">US Hawaii - Department of Labor and Industrial Relations - Unemployment Tax</field>
<field name="supplier">1</field>
</record>
<record id="contrib_register_us_hi_dor" model="hr.contribution.register">
<field name="name">US Hawaii - Department of Labor and Industrial Relations - Unemployment Tax</field>
<field name="partner_id" ref="res_partner_us_hi_dor"/>
</record>
<record id="res_partner_us_hi_dor_sit" model="res.partner">
<field name="name">US Hawaii - Department of Taxation - Income Tax</field>
<field name="supplier">1</field>
</record>
<record id="contrib_register_us_hi_dor_sit" model="hr.contribution.register">
<field name="name">US Hawaii - Department of Taxation - Income Tax</field>
<field name="partner_id" ref="res_partner_us_hi_dor_sit"/>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_hi_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US HI Hawaii State Unemployment</field>
<field name="code">ER_US_HI_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_hi_suta_wage_base', rate='us_hi_suta_rate', state_code='HI')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_hi_suta_wage_base', rate='us_hi_suta_rate', state_code='HI')</field>
<field name="register_id" ref="contrib_register_us_hi_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_hi_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US HI Hawaii State Income Tax Withholding</field>
<field name="code">EE_US_HI_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = hi_hawaii_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = hi_hawaii_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="register_id" ref="contrib_register_us_hi_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,168 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<data noupdate="1">
<record id="rule_parameter_us_ia_suta_wage_base_2019" model="hr.payroll.rate">
<field name="name">US IA Iowa SUTA Wage Base</field>
<field name="code">us_ia_suta_wage_base</field>
<field name="parameter_value">30600.0</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ia_suta_wage_base_2020" model="hr.payroll.rate">
<field name="name">US IA Iowa SUTA Wage Base</field>
<field name="code">us_ia_suta_wage_base</field>
<field name="parameter_value">31600.0</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<data noupdate="1">
<record id="rule_parameter_us_ia_suta_rate_2019" model="hr.payroll.rate">
<field name="name">US IA Iowa SUTA Rate</field>
<field name="code">us_ia_suta_rate</field>
<field name="parameter_value">1.0</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ia_suta_rate_2020" model="hr.payroll.rate">
<field name="name">US IA Iowa SUTA Rate</field>
<field name="code">us_ia_suta_rate</field>
<field name="parameter_value">1.0</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<data noupdate="1">
<record id="rule_parameter_us_ia_sit_tax_rate_2019" model="hr.payroll.rate">
<field name="name">US IA Iowa SIT Tax Rate</field>
<field name="code">us_ia_sit_tax_rate</field>
<field name="parameter_value">{
'daily': [(5.13, 0.0033, 0.0), (10.25, 0.0067, 0.02), (20.50, 0.0225, 0.05), (46.13, 0.0414, 0.28), (76.89, 0.0563, 1.34), (102.52, 0.0596, 3.07), (153.78, 0.0625, 4.60), (230.68, 0.0744, 7.80), ('inf', 0.0853, 13.52)],
'weekly': [(25.63, 0.0033, 0.0), (51.27, 0.0067, 0.08), (102.52, 0.0225, 0.025), (230.67, 0.0414, 1.40), (384.46, 0.0563, 6.71), (512.62, 0.0596, 15.37), (768.92, 0.0625, 23.01), (1153.38, 0.0744, 39.03), ('inf', 0.0853, 67.63)],
'bi-weekly': [(51.27, 0.0033, 0.00), (102.54, 0.0067, 0.17), (205.04, 0.00225, 0.51), (461.35, 0.0414, 2.82), (768.92, 0.0563, 13.43), (1025.23, 0.0596, 30.75), (1537.85, 0.0625, 46.03), (2306.77, 0.0744, 78.07), ('inf', 0.0853, 135.28)],
'semi-monthly': [(55.54, 0.0033, 0.00), (111.08, 0.0067, 0.18), (222.13, 0.0225, 0.55), (499.79, 0.0414, 3.05), (833.00, 0.0563, 14.59), (1110.67, 0.0596, 33.31), (1666.00, 0.0625, 49.86), (2499.00, 0.0744, 84.57), ('inf', 0.0853, 146.55)],
'monthly': [(111.08, 0.0033, 0.00), (222.17, 0.0067, 0.37), (444.25, 0.0225, 1.11), (999.58, 0.0414, 6.11), (1666.00, 0.0563, 29.10), (2221.33, 0.0596, 62.66), (3332.00, 0.0625, 99.72), (4998.00, 0.0744, 169.14), ('inf', 0.0853, 293.09)],
'annual': [(1333.00, 0.0033, 0.00), (2666.00, 0.0067, 4.40), (5331.00, 0.0225, 13.33), (11995.00, 0.0414, 73.29), (19992.00, 0.0563, 349.19), (26656.00, 0.0596, 799.41), (39984.00, 0.0625, 1196.58), (59976.00, 0.0744, 2029.58), ('inf', 0.0853, 3516.98)],
}</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ia_sit_tax_rate_2020" model="hr.payroll.rate">
<field name="name">US IA Iowa SIT Tax Rate</field>
<field name="code">us_ia_sit_tax_rate</field>
<field name="parameter_value">{
'daily': [(5.69, 0.0033, 0.0), (11.38, 0.0067, 0.02), (22.76, 0.0225, 0.06), (51.22, 0.0414, 0.32), (85.36, 0.0563, 1.50), (113.81, 0.0596, 3.42), (170.71, 0.0625, 5.12), (256.07, 0.0744, 8.68), ('inf', 0.0853, 15.03)],
'weekly': [(28.46, 0.0033, 0.0), (56.90, 0.0067, 0.09), (113.81, 0.0225, 0.028), (256.08, 0.0414, 1.56), (426.79, 0.0563, 7.45), (569.04, 0.0596, 17.06), (853.56, 0.0625, 25.54), (1280.35, 0.0744, 43.32), ('inf', 0.0853, 75.07)],
'bi-weekly': [(56.92, 0.0033, 0.00), (113.81, 0.0067, 0.19), (227.62, 0.00225, 0.57), (512.15, 0.0414, 3.13), (853.58, 0.0563, 14.91), (1138.08, 0.0596, 34.13), (1707.12, 0.0625, 51.09), (2560.69, 0.0744, 86.66), ('inf', 0.0853, 150.17)],
'semi-monthly': [(61.67, 0.0033, 0.00), (123.29, 0.0067, 0.20), (246.58, 0.0225, 0.61), (554.83, 0.0414, 3.38), (924.71, 0.0563, 16.14), (1232.92, 0.0596, 36.96), (1849.38, 0.0625, 55.33), (2774.08, 0.0744, 93.86), ('inf', 0.0853, 162.66)],
'monthly': [(123.33, 0.0033, 0.00), (246.58, 0.0067, 0.41), (493.17, 0.0225, 1.24), (1109.67, 0.0414, 6.79), (1849.42, 0.0563, 32.31), (2465.83, 0.0596, 73.96), (3698.75, 0.0625, 110.70), (5548.17, 0.0744, 187.76), ('inf', 0.0853, 325.36)],
'annual': [(1480.00, 0.0033, 0.00), (2959.00, 0.0067, 4.88), (5918.00, 0.0225, 14.79), (13316.00, 0.0414, 81.37), (22193.00, 0.0563, 387.65), (29590.00, 0.0596, 887.43), (44385.00, 0.0625, 1328.29), (66578.00, 0.0744, 2252.98), ('inf', 0.0853, 3904.14)],
}</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<data noupdate="1">
<record id="rule_parameter_us_ia_sit_standard_deduction_rate_2019" model="hr.payroll.rate">
<field name="name">US IA Iowa Standard Deduction Rate</field>
<field name="code">us_ia_sit_standard_deduction_rate</field>
<field name="parameter_value">{
'daily': ( 6.50, 16.00),
'weekly': ( 32.50, 80.00),
'bi-weekly': ( 65.00, 160.00),
'semi-monthly': ( 70.42, 173.33),
'monthly': ( 140.83, 346.67),
'annually': (1690.00, 4160.00),
}</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ia_sit_standard_deduction_rate_2020" model="hr.payroll.rate">
<field name="name">US IA Iowa Standard Deduction Rate</field>
<field name="code">us_ia_sit_standard_deduction_rate</field>
<field name="parameter_value">{
'daily': ( 7.23, 17.81),
'weekly': ( 36.15, 89.04),
'bi-weekly': ( 72.31, 178.08),
'semi-monthly': ( 78.33, 192.92),
'monthly': ( 156.67, 385.83),
'annually': (1880.00, 4630.00),
}</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<data noupdate="1">
<record id="rule_parameter_us_ia_sit_deduction_allowance_rate_2019" model="hr.payroll.rate">
<field name="name">US IA Iowa Deduction Allowance Rate</field>
<field name="code">us_ia_sit_deduction_allowance_rate</field>
<field name="parameter_value">{
'daily': 0.15,
'weekly': 0.77,
'bi-weekly': 1.54,
'semi-monthly': 1.67,
'monthly': 3.33,
'annually': 40.00,
}</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_ia_sit_deduction_allowance_rate_2020" model="hr.payroll.rate">
<field name="name">US IA Iowa Deduction Allowance Rate</field>
<field name="code">us_ia_sit_deduction_allowance_rate</field>
<field name="parameter_value">{
'daily': 0.15,
'weekly': 0.77,
'bi-weekly': 1.54,
'semi-monthly': 1.67,
'monthly': 3.33,
'annually': 40.00,
}</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_ia_dor" model="res.partner">
<field name="name">US Iowa - Workforce Development - Unemployment Tax</field>
</record>
<record id="contrib_register_us_ia_dor" model="hr.contribution.register">
<field name="name">US Iowa - Workforce Development - Unemployment Tax</field>
<field name="partner_id" ref="res_partner_us_ia_dor"/>
</record>
<record id="res_partner_us_ia_dor_sit" model="res.partner">
<field name="name">US Iowa - Department of Revenue - Income Tax</field>
</record>
<record id="contrib_register_us_ia_dor_sit" model="hr.contribution.register">
<field name="name">US Iowa - Department of Revenue - Income Tax</field>
<field name="partner_id" ref="res_partner_us_ia_dor_sit"/>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_ia_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US IA Iowa State Unemployment</field>
<field name="code">ER_US_IA_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ia_suta_wage_base', rate='us_ia_suta_rate', state_code='IA')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_ia_suta_wage_base', rate='us_ia_suta_rate', state_code='IA')</field>
<field name="register_id" ref="contrib_register_us_ia_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_ia_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US IA Iowa State Income Tax Withholding</field>
<field name="code">EE_US_IA_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = ia_iowa_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = ia_iowa_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="register_id" ref="contrib_register_us_ia_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,170 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<data noupdate="1">
<record id="rule_parameter_us_id_suta_wage_base_2019" model="hr.payroll.rate">
<field name="name">US ID Idaho SUTA Wage Base</field>
<field name="code">us_id_suta_wage_base</field>
<field name="parameter_value">40000.0</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_id_suta_wage_base_2020" model="hr.payroll.rate">
<field name="name">US ID Idaho SUTA Wage Base</field>
<field name="code">us_id_suta_wage_base</field>
<field name="parameter_value">41600.0</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<data noupdate="1">
<record id="rule_parameter_us_id_suta_rate_2019" model="hr.payroll.rate">
<field name="name">US ID Idaho SUTA Rate</field>
<field name="code">us_id_suta_rate</field>
<field name="parameter_value">1.0</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_id_suta_rate_2020" model="hr.payroll.rate">
<field name="name">US ID Idaho SUTA Rate</field>
<field name="code">us_id_suta_rate</field>
<field name="parameter_value">1.0</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<data noupdate="1">
<record id="rule_parameter_us_id_sit_tax_rate_2019" model="hr.payroll.rate">
<field name="name">US ID Idaho SIT Tax Rate</field>
<field name="code">us_id_sit_tax_rate</field>
<field name="parameter_value">{
'single': {
'weekly': ((235, 0.00, 0.00), (264, 0.00, 1.125), (294, 0.00, 3.125), (324, 1.00, 3.625), (353, 2.00, 4.625), (383, 4.00, 5.625), (457, 5.00, 6.625), ('inf', 10.00, 6.925)),
'bi-weekly': ((469, 0.00, 0.00), (529, 0.00, 1.125), (588, 1.00, 3.125), (647, 3.00, 3.625), (706, 5.00, 4.625), (766, 7.00, 5.625), (914, 11.00, 6.625), ('inf', 21.00, 6.925)),
'semi-monthly': ((508, 0.00, 0.00), (573, 0.00, 1.125), (637, 1.00, 3.125), (701, 3.00, 3.625), (765, 5.00, 4.625), (829, 8.00, 5.625), (990, 12.00, 6.625), ('inf', 22.00, 6.925)),
'monthly': ((1017, 0.00, 0.00), (1145, 0.00, 1.125), (1273, 1.00, 3.125), (1402, 5.00, 3.625), (1530, 10.00, 4.625), (1659, 16.00, 5.625), (1980, 23.00, 6.625), ('inf', 45.00, 6.925)),
'annually': ((12200, 0.00, 0.00), (13741, 0.00, 1.125), (15281, 17.00, 3.125), (16822, 65.00, 3.625), (18362, 121.00, 4.625), (19903, 192.00, 5.625), (23754, 279.00, 6.625), ('inf', 534.00, 6.925)),
},
'married': {
'weekly': ((469, 0.00, 0.00), (529, 0.00, 1.125), (588, 0.00, 3.125), (647, 1.00, 3.625), (706, 2.00, 4.625), (766, 4.00, 5.625), (914, 5.00, 6.625), ('inf', 10.00, 6.925)),
'bi-weekly': ((938, 0.00, 0.00), (1057, 0.00, 1.125), (1175, 1.00, 3.125), (1294, 5.00, 3.625), (1412, 9.00, 4.625), (1531, 15.00, 5.625), (1827, 21.00, 6.625), ('inf', 41.00, 6.925)),
'semi-monthly': ((1017, 0.00, 0.00), (1145, 0.00, 1.125), (1273, 1.00, 3.125), (1402, 5.00, 3.625), (1530, 10.00, 4.625), (1659, 16.00, 5.625), (1980, 23.00, 6.625), ('inf', 45.00, 6.925)),
'monthly': ((2033, 0.00, 0.00), (2290, 0.00, 1.125), (2547, 3.00, 3.125), (2804, 11.00, 3.625), (3060, 20.00, 4.625), (3317, 32.00, 5.625), (3959, 47.00, 6.625), ('inf', 89.00, 6.925)),
'annually': ((24400, 0.00, 0.00), (27482, 0.00, 1.125), (30562, 35.00, 3.125), (33644, 131.00, 3.625), (36724, 243.00, 4.625), (39806, 385.00, 5.625), (47508, 558.00, 6.625), ('inf', 1068.00, 6.925)),
},
'head of household': {
'weekly': ((235, 0.00, 0.00), (264, 0.00, 1.125), (294, 0.00, 3.125), (324, 1.00, 3.625), (353, 2.00, 4.625), (383, 4.00, 5.625), (457, 5.00, 6.625), ('inf', 10.00, 6.925)),
'bi-weekly': ((469, 0.00, 0.00), (529, 0.00, 1.125), (588, 1.00, 3.125), (647, 3.00, 3.625), (706, 5.00, 4.625), (766, 7.00, 5.625), (914, 11.00, 6.625), ('inf', 21.00, 6.925)),
'semi-monthly': ((508, 0.00, 0.00), (573, 0.00, 1.125), (637, 1.00, 3.125), (701, 3.00, 3.625), (765, 5.00, 4.625), (829, 8.00, 5.625), (990, 12.00, 6.625), ('inf', 22.00, 6.925)),
'monthly': ((1017, 0.00, 0.00), (1145, 0.00, 1.125), (1273, 1.00, 3.125), (1402, 5.00, 3.625), (1530, 10.00, 4.625), (1659, 16.00, 5.625), (1980, 23.00, 6.625), ('inf', 45.00, 6.925)),
'annually': ((12200, 0.00, 0.00), (13741, 0.00, 1.125), (15281, 17.00, 3.125), (16822, 65.00, 3.625), (18362, 121.00, 4.625), (19903, 192.00, 5.625), (23754, 279.00, 6.625), ('inf', 534.00, 6.925)),
},
}</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_id_sit_tax_rate_2020" model="hr.payroll.rate">
<field name="name">US ID Idaho SIT Tax Rate</field>
<field name="code">us_id_sit_tax_rate</field>
<field name="parameter_value">{
'single': {
'weekly': ((235, 0.00, 0.00), (264, 0.00, 1.125), (294, 0.00, 3.125), (324, 1.00, 3.625), (353, 2.00, 4.625), (383, 4.00, 5.625), (457, 5.00, 6.625), ('inf', 10.00, 6.925)),
'bi-weekly': ((469, 0.00, 0.00), (529, 0.00, 1.125), (588, 1.00, 3.125), (647, 3.00, 3.625), (706, 5.00, 4.625), (766, 7.00, 5.625), (914, 11.00, 6.625), ('inf', 21.00, 6.925)),
'semi-monthly': ((508, 0.00, 0.00), (573, 0.00, 1.125), (637, 1.00, 3.125), (701, 3.00, 3.625), (765, 5.00, 4.625), (829, 8.00, 5.625), (990, 12.00, 6.625), ('inf', 22.00, 6.925)),
'monthly': ((1017, 0.00, 0.00), (1145, 0.00, 1.125), (1273, 1.00, 3.125), (1402, 5.00, 3.625), (1530, 10.00, 4.625), (1659, 16.00, 5.625), (1980, 23.00, 6.625), ('inf', 45.00, 6.925)),
'annually': ((12200, 0.00, 0.00), (13741, 0.00, 1.125), (15281, 17.00, 3.125), (16822, 65.00, 3.625), (18362, 121.00, 4.625), (19903, 192.00, 5.625), (23754, 279.00, 6.625), ('inf', 534.00, 6.925)),
},
'married': {
'weekly': ((469, 0.00, 0.00), (529, 0.00, 1.125), (588, 0.00, 3.125), (647, 1.00, 3.625), (706, 2.00, 4.625), (766, 4.00, 5.625), (914, 5.00, 6.625), ('inf', 10.00, 6.925)),
'bi-weekly': ((938, 0.00, 0.00), (1057, 0.00, 1.125), (1175, 1.00, 3.125), (1294, 5.00, 3.625), (1412, 9.00, 4.625), (1531, 15.00, 5.625), (1827, 21.00, 6.625), ('inf', 41.00, 6.925)),
'semi-monthly': ((1017, 0.00, 0.00), (1145, 0.00, 1.125), (1273, 1.00, 3.125), (1402, 5.00, 3.625), (1530, 10.00, 4.625), (1659, 16.00, 5.625), (1980, 23.00, 6.625), ('inf', 45.00, 6.925)),
'monthly': ((2033, 0.00, 0.00), (2290, 0.00, 1.125), (2547, 3.00, 3.125), (2804, 11.00, 3.625), (3060, 20.00, 4.625), (3317, 32.00, 5.625), (3959, 47.00, 6.625), ('inf', 89.00, 6.925)),
'annually': ((24400, 0.00, 0.00), (27482, 0.00, 1.125), (30562, 35.00, 3.125), (33644, 131.00, 3.625), (36724, 243.00, 4.625), (39806, 385.00, 5.625), (47508, 558.00, 6.625), ('inf', 1068.00, 6.925)),
},
'head of household': {
'weekly': ((235, 0.00, 0.00), (264, 0.00, 1.125), (294, 0.00, 3.125), (324, 1.00, 3.625), (353, 2.00, 4.625), (383, 4.00, 5.625), (457, 5.00, 6.625), ('inf', 10.00, 6.925)),
'bi-weekly': ((469, 0.00, 0.00), (529, 0.00, 1.125), (588, 1.00, 3.125), (647, 3.00, 3.625), (706, 5.00, 4.625), (766, 7.00, 5.625), (914, 11.00, 6.625), ('inf', 21.00, 6.925)),
'semi-monthly': ((508, 0.00, 0.00), (573, 0.00, 1.125), (637, 1.00, 3.125), (701, 3.00, 3.625), (765, 5.00, 4.625), (829, 8.00, 5.625), (990, 12.00, 6.625), ('inf', 22.00, 6.925)),
'monthly': ((1017, 0.00, 0.00), (1145, 0.00, 1.125), (1273, 1.00, 3.125), (1402, 5.00, 3.625), (1530, 10.00, 4.625), (1659, 16.00, 5.625), (1980, 23.00, 6.625), ('inf', 45.00, 6.925)),
'annually': ((12200, 0.00, 0.00), (13741, 0.00, 1.125), (15281, 17.00, 3.125), (16822, 65.00, 3.625), (18362, 121.00, 4.625), (19903, 192.00, 5.625), (23754, 279.00, 6.625), ('inf', 534.00, 6.925)),
},
}</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<data noupdate="1">
<record id="rule_parameter_us_id_sit_ictcat_rate_2019" model="hr.payroll.rate">
<field name="name">US ID Idaho Child Tax Credit Allowance Rate</field>
<field name="code">us_id_sit_ictcat_rate</field>
<field name="parameter_value">{
'weekly': 56.92,
'bi-weekly': 113.85,
'semi-monthly': 123.33,
'monthly': 246.67,
'annually': 2960.00,
}</field>
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
</record>
<record id="rule_parameter_us_id_sit_ictcat_rate_2020" model="hr.payroll.rate">
<field name="name">US ID Idaho Child Tax Credit Allowance Rate</field>
<field name="code">us_id_sit_ictcat_rate</field>
<field name="parameter_value">{
'weekly': 56.92,
'bi-weekly': 113.85,
'semi-monthly': 123.33,
'monthly': 246.67,
'annually': 2960.00,
}</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_id_dor" model="res.partner">
<field name="name">US Idaho - Department of Labor (IDOL) - Unemployment Tax</field>
<field name="supplier">1</field>
</record>
<record id="contrib_register_us_id_dor" model="hr.contribution.register">
<field name="name">US Idaho - Department of Labor (IDOL) - Unemployment Tax</field>
<field name="partner_id" ref="res_partner_us_id_dor"/>
</record>
<record id="res_partner_us_id_dor_sit" model="res.partner">
<field name="name">US Idaho - State Tax Commission (ISTC) - Income Tax</field>
<field name="supplier">1</field>
</record>
<record id="contrib_register_us_id_dor_sit" model="hr.contribution.register">
<field name="name">US Idaho - State Tax Commission (ISTC) - Income Tax</field>
<field name="partner_id" ref="res_partner_us_id_dor_sit"/>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_id_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US ID Idaho State Unemployment</field>
<field name="code">ER_US_ID_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_id_suta_wage_base', rate='us_id_suta_rate', state_code='ID')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_id_suta_wage_base', rate='us_id_suta_rate', state_code='ID')</field>
<field name="register_id" ref="contrib_register_us_id_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_id_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US ID Idaho State Income Tax Withholding</field>
<field name="code">EE_US_ID_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = id_idaho_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = id_idaho_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="register_id" ref="contrib_register_us_id_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -65,6 +65,7 @@
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_il_dor" model="res.partner">
<field name="name">US Illinois - Department of Economic Security (IDES) - Unemployment Tax</field>
<field name="supplier">1</field>
</record>
<record id="contrib_register_us_il_dor" model="hr.contribution.register">
<field name="name">US Illinois - Department of Economic Security (IDES) - Unemployment Tax</field>
@@ -73,9 +74,10 @@
<record id="res_partner_us_il_dor_sit" model="res.partner">
<field name="name">US Illinois - Department of Revenue (IDOR) - Income Tax</field>
<field name="supplier">1</field>
</record>
<record id="contrib_register_us_il_dor_sit" model="hr.contribution.register">
<field name="name">US Illinois - Department of Revenue (IDOR) - Unemployment Tax</field>
<field name="name">US Illinois - Department of Revenue (IDOR) - Income Tax</field>
<field name="partner_id" ref="res_partner_us_il_dor_sit"/>
</record>

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<data noupdate="1">
<record id="rule_parameter_us_nh_suta_wage_base_2020" model="hr.payroll.rate">
<field name="name">US NH New Hampshire SUTA Wage Base</field>
<field name="code">us_nh_suta_wage_base</field>
<field name="parameter_value">14000.00</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<data noupdate="1">
<record id="rule_parameter_us_nh_suta_rate_2020" model="hr.payroll.rate">
<field name="name">US NH New Hampshire SUTA Rate</field>
<field name="code">us_nh_suta_rate</field>
<field name="parameter_value">1.2</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_nh_dor" model="res.partner">
<field name="name">US New Hampshire - Department of Employment Security - Unemployment Tax</field>
<field name="supplier">1</field>
</record>
<record id="contrib_register_us_nh_dor" model="hr.contribution.register">
<field name="name">US New Hampshire - Department of Employment Security - Unemployment Tax</field>
<field name="partner_id" ref="res_partner_us_nh_dor"/>
</record>
<!-- Rules -->
<record id="hr_payroll_rule_er_us_nh_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US NH New Hampshire State Unemployment</field>
<field name="code">ER_US_NH_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_nh_suta_wage_base', rate='us_nh_suta_rate', state_code='NH')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_nh_suta_wage_base', rate='us_nh_suta_rate', state_code='NH')</field>
<field name="register_id" ref="contrib_register_us_nh_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
</odoo>

View File

@@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Wage Base -->
<data noupdate="1">
<record id="rule_parameter_us_nm_suta_wage_base_2020" model="hr.payroll.rate">
<field name="name">US NM New Mexico SUTA Wage Base</field>
<field name="code">us_nm_suta_wage_base</field>
<field name="parameter_value">25800.0</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Rate -->
<data noupdate="1">
<record id="rule_parameter_us_nm_suta_rate_2020" model="hr.payroll.rate">
<field name="name">US NM New Mexico SUTA Rate</field>
<field name="code">us_nm_suta_rate</field>
<field name="parameter_value">1.0</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<data noupdate="1">
<record id="rule_parameter_us_nm_sit_tax_rate_2020" model="hr.payroll.rate">
<field name="name">US NM New Mexico SIT Tax Rate</field>
<field name="code">us_nm_sit_tax_rate</field>
<field name="parameter_value">{
'single': {
'weekly': ((119, 0.00, 0.0), (225, 0.00, 1.7), (331, 1.80, 3.2), (427, 5.18, 4.7), (619, 9.70, 4.9), (927, 19.13, 4.9), (1369, 34.20, 4.9), ('inf', 55.88, 4.9)),
'bi-weekly': ((238, 0.00, 0.0), (450, 0.00, 1.7), (662, 3.60, 3.2), (854, 10.37, 4.7), (1238, 19.40, 4.9), (1854, 38.25, 4.9), (2738, 68.40, 4.9), ('inf', 111.75, 4.9)),
'semi-monthly': ((258, 0.00, 0.0), (488, 0.00, 1.7), (717, 3.90, 3.2), (925, 11.23, 4.7), (1342, 21.02, 4.9), (2008, 41.44, 4.9), (2967, 74.10, 4.9), ('inf', 121.06, 4.9)),
'monthly': ((517, 0.00, 0.0), (975, 0.00, 1.7), (1433, 7.79, 3.2), (1850, 22.46, 4.7), (2683, 42.04, 4.9), (4017, 82.88, 4.9), (5933, 148.21, 4.9), ('inf', 242.13, 4.9)),
'quarterly': ((1550, 0.00, 0.0), (2925, 0.00, 1.7), (4300, 23.38, 3.2), (5550, 67.38, 4.7), (8050, 126.13, 4.9), (12050, 248.63, 4.9), (17800, 444.63, 4.9), ('inf', 726.38, 4.9)),
'semi-annual': ((3100, 0.00, 0.0), (5850, 0.00, 1.7), (8600, 46.75, 3.2), (11100, 134.75, 4.7), (16100, 252.25, 4.9), (24100, 497.25, 4.9), (35600, 889.25, 4.9), ('inf', 1452.75, 4.9)),
'annually': ((6200, 0.00, 0.0), (11700, 0.00, 1.7), (17200, 93.50, 3.2), (22200, 269.50, 4.7), (32200, 504.50, 4.9), (48200, 994.50, 4.9), (71200, 1778.50, 4.9), ('inf', 2905.50, 4.9)),
},
'married': {
'weekly': ((238, 0.00, 0.0), (392, 0.00, 1.7), (546, 2.62, 3.2), (700, 7.54, 4.7), (1008, 14.77, 4.9), (1469, 29.85, 4.9), (2162, 52.46, 4.9), ('inf', 86.38, 4.9)),
'bi-weekly': ((477, 0.00, 0.0), (785, 0.00, 1.7), (1092, 5.23, 3.2), (1400, 15.08, 4.7), (2015, 29.54, 4.9), (2938, 59.69, 4.9), (4323, 104.92, 4.9), ('inf', 172.77, 4.9)),
'semi-monthly': ((517, 0.00, 0.0), (850, 0.00, 1.7), (1183, 5.67, 3.2), (1517, 16.33, 4.7), (2183, 32.00, 4.9), (3183, 64.67, 4.9), (4683, 113.67, 4.9), ('inf', 187.17, 4.9)),
'monthly': ((1033, 0.00, 0.0), (1700, 0.00, 1.7), (2367, 11.33, 3.2), (3033, 32.67, 4.7), (4367, 64.00, 4.9), (6367, 129.33, 4.9), (9367, 227.33, 4.9), ('inf', 374.33, 4.9)),
'quarterly': ((3100, 0.00, 0.0), (5100, 0.00, 1.7), (7100, 34.00, 3.2), (9100, 98.00, 4.7), (13100, 192.00, 4.9), (19100, 388.00, 4.9), (28100, 682.00, 4.9), ('inf', 1123.00, 4.9)),
'semi-annual': ((6200, 0.00, 0.0), (10200, 0.00, 1.7), (14200, 68.00, 3.2), (18200, 196.00, 4.7), (26200, 384.00, 4.9), (38200, 776.00, 4.9), (56200, 1364.00, 4.9), ('inf', 2246.00, 4.9)),
'annually': ((12400, 0.00, 0.0), (20400, 0.00, 1.7), (28400, 136.00, 3.2), (36400, 392.00, 4.7), (52400, 768.00, 4.9), (76400, 1552.00, 4.9), (112400, 2728.00, 4.9), ('inf', 4492.00, 4.9)),
},
'married_as_single': {
'weekly': ((179, 0.00, 0.0), (333, 0.00, 1.7), (487, 2.62, 3.2), (641, 7.54, 4.7), (949, 14.77, 4.9), (1410, 29.85, 4.9), (2102, 52.46, 4.9), ('inf', 86.38, 4.9)),
'bi-weekly': ((359, 0.00, 0.0), (666, 0.00, 1.7), (974, 5.23, 3.2), (1282, 15.08, 4.7), (1897, 29.54, 4.9), (2820, 59.69, 4.9), (4205, 104.92, 4.9), ('inf', 172.77, 4.9)),
'semi-monthly': ((389, 0.00, 0.0), (722, 0.00, 1.7), (1055, 5.67, 3.2), (1389, 16.33, 4.7), (2055, 32.00, 4.9), (3055, 64.67, 4.9), (4555, 113.67, 4.9), ('inf', 187.17, 4.9)),
'monthly': ((777, 0.00, 0.0), (1444, 0.00, 1.7), (2110, 11.33, 3.2), (2777, 32.67, 4.7), (4110, 64.00, 4.9), (6110, 129.33, 4.9), (9110, 227.33, 4.9), ('inf', 374.33, 4.9)),
'quarterly': ((2331, 0.00, 0.0), (4331, 0.00, 1.7), (6331, 34.00, 3.2), (8331, 98.00, 4.7), (12331, 192.00, 4.9), (18331, 388.00, 4.9), (27331, 682.00, 4.9), ('inf', 1123.00, 4.9)),
'semi-annual': ((4663, 0.00, 0.0), (8663, 0.00, 1.7), (12663, 68.00, 3.2), (16663, 196.00, 4.7), (24663, 384.00, 4.9), (36663, 776.00, 4.9), (54663, 1364.00, 4.9), ('inf', 2246.00, 4.9)),
'annually': ((9325, 0.00, 0.0), (17325, 0.00, 1.7), (25325, 136.00, 3.2), (33325, 392.00, 4.7), (49325, 768.00, 4.9), (73325, 1552.00, 4.9), (109325, 2728.00, 4.9), ('inf', 4492.00, 4.9)),
}
}</field>
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
</record>
</data>
<!-- Partners and Contribution Registers -->
<record id="res_partner_us_nm_dor" model="res.partner">
<field name="name">US New Mexico - Department of Workforce Solutions - Unemployment Tax</field>
</record>
<record id="contrib_register_us_nm_dor" model="hr.contribution.register">
<field name="name">US New Mexico - Department of Workforce Solutions - Unemployment Tax</field>
<field name="partner_id" ref="res_partner_us_nm_dor"/>
</record>
<record id="res_partner_us_nm_dor_sit" model="res.partner">
<field name="name">US New Mexico - Department of Taxation and Revenue - Income Tax</field>
</record>
<record id="contrib_register_us_nm_dor_sit" model="hr.contribution.register">
<field name="name">US New Mexico - Department of Taxation and Revenue - Unemployment Tax</field>
<field name="partner_id" ref="res_partner_us_nm_dor_sit"/>
</record>
<!-- Categories -->
<!-- Rules -->
<record id="hr_payroll_rule_er_us_nm_suta" model="hr.salary.rule">
<field name="sequence" eval="450"/>
<field name="category_id" ref="hr_payroll_category_er_us_suta"/>
<field name="name">ER: US NM New Mexico State Unemployment</field>
<field name="code">ER_US_NM_SUTA</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_nm_suta_wage_base', rate='us_nm_suta_rate', state_code='NM')</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = general_state_unemployment(payslip, categories, worked_days, inputs, wage_base='us_nm_suta_wage_base', rate='us_nm_suta_rate', state_code='NM')</field>
<field name="register_id" ref="contrib_register_us_nm_dor"/>
<field name="appears_on_payslip" eval="False"/>
</record>
<record id="hr_payroll_rule_ee_us_nm_sit" model="hr.salary.rule">
<field name="sequence" eval="195"/>
<field name="category_id" ref="hr_payroll_category_ee_us_sit"/>
<field name="name">EE: US NM New Mexico State Income Tax Withholding</field>
<field name="code">EE_US_NM_SIT</field>
<field name="condition_select">python</field>
<field name="condition_python">result, _ = nm_new_mexico_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">result, result_rate = nm_new_mexico_state_income_withholding(payslip, categories, worked_days, inputs)</field>
<field name="register_id" ref="contrib_register_us_nm_dor_sit"/>
<field name="appears_on_payslip" eval="True"/>
</record>
</odoo>

View File

@@ -9,6 +9,11 @@ FIELDS_CONTRACT_TO_US_PAYROLL_FORMS_2020 = {
'fica_exempt': 'fed_941_fica_exempt',
'futa_type': 'fed_940_type',
# State
'al_a4_filing_status': 'al_a4_sit_exemptions',
'al_a4_dependents': 'al_a4_sit_dependents',
'al_a4_personal_exemption': 'state_income_tax_exempt',
'al_a4_additional_wh': 'state_income_tax_additional_withholding',
'ar_w4_allowances': 'ar_ar4ec_sit_allowances',
'ar_w4_tax_exempt': 'state_income_tax_exempt',
'ar_w4_additional_wh': 'state_income_tax_additional_withholding',
@@ -16,11 +21,25 @@ FIELDS_CONTRACT_TO_US_PAYROLL_FORMS_2020 = {
'az_a4_withholding_percentage': 'az_a4_sit_withholding_percentage',
'az_a4_additional_withholding': 'state_income_tax_additional_withholding',
'ca_de4_allowances': 'ca_de4_sit_allowances',
'ca_additional_allowances': 'ca_sit_additional_allowances',
'ca_de4_filing_status': 'ca_de4_sit_filing_status',
'ct_w4na_code': 'ct_w4na_sit_code',
'ct_w4na_wh_amount': 'state_income_tax_additional_withholding',
'ga_g4_filing_status': 'ga_g4_sit_filing_status',
'ga_g4_dependent_allowances': 'ga_g4_sit_dependent_allowances',
'ga_g4_additional_allowances': 'ga_g4_sit_additional_allowances',
'ga_g4_additional_wh': 'state_income_tax_additional_withholding',
'ia_w4_allowances': 'ia_w4_sit_allowances',
'ia_w4_additional_wh': 'state_income_tax_additional_withholding',
'ia_w4_tax_exempt': 'state_income_tax_exempt',
'id_w4_filing_status': 'id_w4_sit_filing_status',
'id_w4_allowances': 'id_w4_sit_allowances',
'il_w4_basic_allowances': 'il_w4_sit_basic_allowances',
'il_w4_additional_allowances': 'il_w4_sit_additional_allowances',
'il_w4_additional_wh': 'state_income_tax_additional_withholding',
@@ -79,6 +98,16 @@ XMLIDS_TO_REMOVE_2020 = [
'l10n_us_hr_payroll.hr_payroll_rules_futa_wages_2018',
'l10n_us_hr_payroll.hr_payroll_rules_fed_inc_withhold_2018_married',
# State
'l10n_us_ak_hr_payroll.hr_payroll_ak_unemp_wages',
'l10n_us_ak_hr_payroll.hr_payroll_ak_unemp',
'l10n_us_ak_hr_payroll.hr_payroll_ak_unemp_ee',
'l10n_us_ak_hr_payroll.hr_payroll_rules_ak_unemp_wages',
'l10n_us_al_hr_payroll.hr_payroll_al_unemp_wages',
'l10n_us_al_hr_payroll.hr_payroll_al_unemp',
'l10n_us_al_hr_payroll.hr_payroll_al_income_withhold',
'l10n_us_al_hr_payroll.hr_payroll_rules_al_unemp_wages',
'l10n_us_ar_hr_payroll.hr_payroll_ar_unemp_wages',
'l10n_us_ar_hr_payroll.hr_payroll_ar_unemp',
'l10n_us_ar_hr_payroll.hr_payroll_ar_income_withhold',
@@ -89,6 +118,24 @@ XMLIDS_TO_REMOVE_2020 = [
'l10n_us_az_hr_payroll.hr_payroll_az_income_withhold',
'l10n_us_az_hr_payroll.hr_payroll_rules_az_unemp_wages',
'l10n_us_ca_hr_payroll.res_partner_cador_ett',
'l10n_us_ca_hr_payroll.res_partner_cador_sdi',
'l10n_us_ca_hr_payroll.hr_payroll_ca_uit_wages',
'l10n_us_ca_hr_payroll.hr_payroll_ca_uit',
'l10n_us_ca_hr_payroll.hr_payroll_ca_ett_wages',
'l10n_us_ca_hr_payroll.hr_payroll_ca_ett',
'l10n_us_ca_hr_payroll.hr_payroll_ca_sdi_wages',
'l10n_us_ca_hr_payroll.hr_payroll_ca_sdi',
'l10n_us_ca_hr_payroll.hr_payroll_ca_income_withhold',
'l10n_us_ca_hr_payroll.hr_payroll_rules_ca_uit_wages_2018',
'l10n_us_ca_hr_payroll.hr_payroll_rules_ca_ett_wages_2018',
'l10n_us_ca_hr_payroll.hr_payroll_rules_ca_sdi_wages_2018',
'l10n_us_ct_hr_payroll.hr_payroll_ct_unemp_wages',
'l10n_us_ct_hr_payroll.hr_payroll_ct_unemp',
'l10n_us_ct_hr_payroll.hr_payroll_ct_income_withhold',
'l10n_us_ct_hr_payroll.hr_payroll_rules_ct_unemp_wages',
'l10n_us_fl_hr_payroll.hr_payroll_fl_unemp_wages',
'l10n_us_fl_hr_payroll.hr_payroll_fl_unemp',
'l10n_us_fl_hr_payroll.hr_payroll_rules_fl_unemp_wages_2018',
@@ -98,6 +145,16 @@ XMLIDS_TO_REMOVE_2020 = [
'l10n_us_ga_hr_payroll.hr_payroll_ga_income_withhold',
'l10n_us_ga_hr_payroll.hr_payroll_rules_ga_unemp_wages',
'l10n_us_ia_hr_payroll.hr_payroll_ia_unemp_wages',
'l10n_us_ia_hr_payroll.hr_payroll_ia_unemp',
'l10n_us_ia_hr_payroll.hr_payroll_ia_income_withhold',
'l10n_us_ia_hr_payroll.hr_payroll_rules_ia_unemp_wages',
'l10n_us_id_hr_payroll.hr_payroll_id_unemp_wages',
'l10n_us_id_hr_payroll.hr_payroll_id_unemp',
'l10n_us_id_hr_payroll.hr_payroll_id_income_withhold',
'l10n_us_id_hr_payroll.hr_payroll_rules_id_unemp_wages',
'l10n_us_il_hr_payroll.hr_payroll_il_unemp_wages',
'l10n_us_il_hr_payroll.hr_payroll_il_unemp',
'l10n_us_il_hr_payroll.hr_payroll_il_income_withhold',
@@ -208,6 +265,18 @@ XMLIDS_TO_RENAME_2020 = {
'l10n_us_hr_payroll.hr_payroll_rules_fica_comp_m': 'l10n_us_hr_payroll.hr_payroll_rule_er_fed_941_m',
'l10n_us_hr_payroll.hr_payroll_rules_fed_inc_withhold_2018_single': 'l10n_us_hr_payroll.hr_payroll_rule_ee_fed_941_fit',
# State
'l10n_us_ak_hr_payroll.res_partner_ak_dlwd_unemp': 'l10n_us_hr_payroll.res_partner_us_ak_dor',
'l10n_us_ak_hr_payroll.contrib_register_ak_dlwd_unemp': 'l10n_us_hr_payroll.contrib_register_us_ak_dor',
'l10n_us_ak_hr_payroll.hr_payroll_rules_ak_unemp': 'l10n_us_hr_payroll.hr_payroll_rule_er_us_ak_suta',
'l10n_us_ak_hr_payroll.hr_payroll_rules_ak_unemp_ee': 'l10n_us_hr_payroll.hr_payroll_rule_ee_us_ak_sit',
'l10n_us_al_hr_payroll.res_partner_al_dol_unemp': 'l10n_us_hr_payroll.res_partner_us_al_dor',
'l10n_us_al_hr_payroll.res_partner_al_dor_withhold': 'l10n_us_hr_payroll.res_partner_us_al_dor_sit',
'l10n_us_al_hr_payroll.contrib_register_al_dol_unemp': 'l10n_us_hr_payroll.contrib_register_us_al_dor',
'l10n_us_al_hr_payroll.contrib_register_al_dor_withhold': 'l10n_us_hr_payroll.contrib_register_us_al_dor_sit',
'l10n_us_al_hr_payroll.hr_payroll_rules_al_unemp': 'l10n_us_hr_payroll.hr_payroll_rules_az_unemp',
'l10n_us_al_hr_payroll.hr_payroll_rules_al_inc_withhold': 'l10n_us_hr_payroll.hr_payroll_rules_az_inc_withhold',
'l10n_us_ar_hr_payroll.res_partner_ar_dws_unemp': 'l10n_us_hr_payroll.res_partner_us_ar_dor',
'l10n_us_ar_hr_payroll.res_partner_ar_dfa_withhold': 'l10n_us_hr_payroll.res_partner_us_ar_dor_sit',
'l10n_us_ar_hr_payroll.contrib_register_ar_dws_unemp': 'l10n_us_hr_payroll.contrib_register_us_ar_dor',
@@ -222,6 +291,22 @@ XMLIDS_TO_RENAME_2020 = {
'l10n_us_az_hr_payroll.hr_payroll_az_unemp': 'l10n_us_hr_payroll.hr_payroll_rule_er_us_az_suta',
'l10n_us_az_hr_payroll.hr_payroll_az_income_withhold': 'l10n_us_hr_payroll.hr_payroll_rule_ee_us_az_sit',
'l10n_us_ca_hr_payroll.res_partner_cador_uit': 'l10n_us_hr_payroll.res_partner_us_ca_dor',
'l10n_us_ca_hr_payroll.res_partner_cador_withhold': 'l10n_us_hr_payroll.res_partner_us_ca_dor_sit',
'l10n_us_ca_hr_payroll.contrib_register_cador_uit': 'l10n_us_hr_payroll.contrib_register_us_ca_dor',
'l10n_us_ca_hr_payroll.contrib_register_cador_withhold': 'l10n_us_hr_payroll.contrib_register_us_ca_dor_sit',
'l10n_us_ca_hr_payroll.hr_payroll_rules_ca_uit_2018': 'l10n_us_hr_payroll.hr_payroll_rule_er_us_ca_suta',
'l10n_us_ca_hr_payroll.hr_payroll_rules_ca_ett_2018': 'l10n_us_hr_payroll.hr_payroll_rule_er_us_ca_ett_suta',
'l10n_us_ca_hr_payroll.hr_payroll_rules_ca_sdi_2018': 'l10n_us_hr_payroll.hr_payroll_rule_ee_us_ca_sdi_sit',
'l10n_us_ca_hr_payroll.hr_payroll_rules_ca_inc_withhold_2018': 'l10n_us_hr_payroll.hr_payroll_rule_ee_us_ca_sit',
'l10n_us_ct_hr_payroll.res_partner_ct_dol_unemp': 'l10n_us_hr_payroll.res_partner_us_ct_dor',
'l10n_us_ct_hr_payroll.res_partner_ct_drs_withhold': 'l10n_us_hr_payroll.res_partner_us_ct_dor_sit',
'l10n_us_ct_hr_payroll.contrib_register_ct_dol_unemp': 'l10n_us_hr_payroll.contrib_register_us_ct_dor',
'l10n_us_ct_hr_payroll.contrib_register_ct_drs_withhold': 'l10n_us_hr_payroll.contrib_register_us_ct_dor_sit',
'l10n_us_ct_hr_payroll.hr_payroll_rules_ct_unemp': 'l10n_us_hr_payroll.hr_payroll_rule_er_us_ct_suta',
'l10n_us_ct_hr_payroll.hr_payroll_rules_ct_inc_withhold': 'l10n_us_hr_payroll.hr_payroll_rule_ee_us_ct_sit',
'l10n_us_fl_hr_payroll.hr_payroll_rules_fl_unemp_2018': 'l10n_us_hr_payroll.hr_payroll_rule_er_us_fl_suta',
'l10n_us_fl_hr_payroll.res_partner_fldor': 'l10n_us_hr_payroll.res_partner_us_fl_dor',
'l10n_us_fl_hr_payroll.contrib_register_fldor': 'l10n_us_hr_payroll.contrib_register_us_fl_dor',
@@ -233,6 +318,20 @@ XMLIDS_TO_RENAME_2020 = {
'l10n_us_ga_hr_payroll.hr_payroll_rules_ga_unemp': 'l10n_us_hr_payroll.hr_payroll_rule_er_us_ga_suta',
'l10n_us_ga_hr_payroll.hr_payroll_rules_ga_inc_withhold': 'l10n_us_hr_payroll.hr_payroll_rule_ee_us_ga_sit',
'l10n_us_ia_hr_payroll.res_partner_ia_wd_unemp': 'l10n_us_hr_payroll.res_partner_us_ia_dor',
'l10n_us_ia_hr_payroll.res_partner_ia_dor_withhold': 'l10n_us_hr_payroll.res_partner_us_ia_dor_sit',
'l10n_us_ia_hr_payroll.contrib_register_ia_wd_unemp': 'l10n_us_hr_payroll.contrib_register_us_ia_dor',
'l10n_us_ia_hr_payroll.contrib_register_ia_dor_withhold': 'l10n_us_hr_payroll.contrib_register_us_ia_dor_sit',
'l10n_us_ia_hr_payroll.hr_payroll_rules_ia_unemp': 'l10n_us_hr_payroll.hr_payroll_rule_er_us_ia_suta',
'l10n_us_ia_hr_payroll.hr_payroll_rules_ia_inc_withhold': 'l10n_us_hr_payroll.hr_payroll_rule_ee_us_ia_sit',
'l10n_us_id_hr_payroll.res_partner_id_dol_unemp':'l10n_us_hr_payroll.res_partner_us_id_dor',
'l10n_us_id_hr_payroll.res_partner_id_stc_withhold': 'l10n_us_hr_payroll.res_partner_us_id_dor_sit',
'l10n_us_id_hr_payroll.contrib_register_id_dol_unemp': 'l10n_us_hr_payroll.contrib_register_us_id_dor',
'l10n_us_id_hr_payroll.contrib_register_id_stc_withhold': 'l10n_us_hr_payroll.contrib_register_us_id_dor_sit',
'l10n_us_id_hr_payroll.hr_payroll_rules_id_unemp': 'l10n_us_hr_payroll.hr_payroll_rule_er_us_id_suta',
'l10n_us_id_hr_payroll.hr_payroll_rules_id_inc_withhold': 'l10n_us_hr_payroll.hr_payroll_rule_ee_us_id_sit',
'l10n_us_il_hr_payroll.res_partner_il_des_unemp': 'l10n_us_hr_payroll.res_partner_us_il_dor',
'l10n_us_il_hr_payroll.res_partner_il_dor_withhold': 'l10n_us_hr_payroll.res_partner_us_il_dor_sit',
'l10n_us_il_hr_payroll.contrib_register_il_des_unemp': 'l10n_us_hr_payroll.contrib_register_us_il_dor',

View File

@@ -3,4 +3,5 @@
from . import hr_contract
from . import hr_payslip
from . import hr_salary_rule
from . import res_config_settings
from . import us_payroll_config

View File

@@ -203,6 +203,8 @@ def ee_us_941_fit(payslip, categories, worked_days, inputs):
schedule_pay = payslip.dict.contract_id.schedule_pay
wage = fit_wage(payslip, categories)
if not wage:
return 0.0, 0.0
#_logger.warn('initial gross wage: ' + str(wage))
year = payslip.dict.get_year()

View File

@@ -14,9 +14,17 @@ from .federal.fed_941 import ee_us_941_fica_ss, \
from .state.general import general_state_unemployment, \
general_state_income_withholding, \
is_us_state
from .state.al_alabama import al_alabama_state_income_withholding
from .state.ar_arkansas import ar_arkansas_state_income_withholding
from .state.az_arizona import az_arizona_state_income_withholding
from .state.ca_california import ca_california_state_income_withholding
from .state.co_colorado import co_colorado_state_income_withholding
from .state.ct_connecticut import ct_connecticut_state_income_withholding
from .state.de_delaware import de_delaware_state_income_withholding
from .state.ga_georgia import ga_georgia_state_income_withholding
from .state.hi_hawaii import hi_hawaii_state_income_withholding
from .state.ia_iowa import ia_iowa_state_income_withholding
from .state.id_idaho import id_idaho_state_income_withholding
from .state.il_illinois import il_illinois_state_income_withholding
from .state.mi_michigan import mi_michigan_state_income_withholding
from .state.mn_minnesota import mn_minnesota_state_income_withholding
@@ -25,6 +33,7 @@ from .state.ms_mississippi import ms_mississippi_state_income_withholding
from .state.mt_montana import mt_montana_state_income_withholding
from .state.nc_northcarolina import nc_northcarolina_state_income_withholding
from .state.nj_newjersey import nj_newjersey_state_income_withholding
from .state.nm_new_mexico import nm_new_mexico_state_income_withholding
from .state.oh_ohio import oh_ohio_state_income_withholding
from .state.va_virginia import va_virginia_state_income_withholding
from .state.wa_washington import wa_washington_fml_er, \
@@ -61,9 +70,17 @@ class HRPayslip(models.Model):
'general_state_unemployment': general_state_unemployment,
'general_state_income_withholding': general_state_income_withholding,
'is_us_state': is_us_state,
'al_alabama_state_income_withholding': al_alabama_state_income_withholding,
'ar_arkansas_state_income_withholding': ar_arkansas_state_income_withholding,
'az_arizona_state_income_withholding': az_arizona_state_income_withholding,
'ca_california_state_income_withholding': ca_california_state_income_withholding,
'co_colorado_state_income_withholding': co_colorado_state_income_withholding,
'ct_connecticut_state_income_withholding': ct_connecticut_state_income_withholding,
'de_delaware_state_income_withholding': de_delaware_state_income_withholding,
'ga_georgia_state_income_withholding': ga_georgia_state_income_withholding,
'hi_hawaii_state_income_withholding': hi_hawaii_state_income_withholding,
'ia_iowa_state_income_withholding': ia_iowa_state_income_withholding,
'id_idaho_state_income_withholding': id_idaho_state_income_withholding,
'il_illinois_state_income_withholding': il_illinois_state_income_withholding,
'mi_michigan_state_income_withholding': mi_michigan_state_income_withholding,
'mn_minnesota_state_income_withholding': mn_minnesota_state_income_withholding,
@@ -72,6 +89,7 @@ class HRPayslip(models.Model):
'mt_montana_state_income_withholding': mt_montana_state_income_withholding,
'nc_northcarolina_state_income_withholding': nc_northcarolina_state_income_withholding,
'nj_newjersey_state_income_withholding': nj_newjersey_state_income_withholding,
'nm_new_mexico_state_income_withholding': nm_new_mexico_state_income_withholding,
'oh_ohio_state_income_withholding': oh_ohio_state_income_withholding,
'va_virginia_state_income_withholding': va_virginia_state_income_withholding,
'wa_washington_fml_er': wa_washington_fml_er,
@@ -98,34 +116,52 @@ class HRPayslip(models.Model):
self.employee_id = employee_id
self.dict = dict
self.env = env
# Customization to allow changing the behavior of the discrete browsable objects.
# you can think of this as 'compiling' the query based on the configuration.
sum_field = env['ir.config_parameter'].sudo().get_param('hr_payroll.payslip.sum_behavior', 'date_from')
if sum_field == 'date' and 'date' not in env['hr.payslip']:
# missing attribute, closest by definition
sum_field = 'date_to'
if not sum_field:
sum_field = 'date_from'
self._compile_browsable_query(sum_field)
def __getattr__(self, attr):
return attr in self.dict and self.dict.__getitem__(attr) or 0.0
def _compile_browsable_query(self, sum_field):
pass
class InputLine(BrowsableObject):
"""a class that will be used into the python code, mainly for usability purposes"""
def sum(self, code, from_date, to_date=None):
if to_date is None:
to_date = fields.Date.today()
self.env.cr.execute("""
def _compile_browsable_query(self, sum_field):
self.__browsable_query = """
SELECT sum(amount) as sum
FROM hr_payslip as hp, hr_payslip_input as pi
WHERE hp.employee_id = %s AND hp.state = 'done'
AND hp.date_from >= %s AND hp.date_to <= %s AND hp.id = pi.payslip_id AND pi.code = %s""",
(self.employee_id, from_date, to_date, code))
AND hp.{sum_field} >= %s AND hp.date_to <= %s AND hp.id = pi.payslip_id AND pi.code = %s""".format(sum_field=sum_field)
def sum(self, code, from_date, to_date=None):
if to_date is None:
to_date = fields.Date.today()
self.env.cr.execute(self.__browsable_query, (self.employee_id, from_date, to_date, code))
return self.env.cr.fetchone()[0] or 0.0
class WorkedDays(BrowsableObject):
"""a class that will be used into the python code, mainly for usability purposes"""
def _sum(self, code, from_date, to_date=None):
if to_date is None:
to_date = fields.Date.today()
self.env.cr.execute("""
def _compile_browsable_query(self, sum_field):
self.__browsable_query = """
SELECT sum(number_of_days) as number_of_days, sum(number_of_hours) as number_of_hours
FROM hr_payslip as hp, hr_payslip_worked_days as pi
WHERE hp.employee_id = %s AND hp.state = 'done'
AND hp.date_from >= %s AND hp.date_to <= %s AND hp.id = pi.payslip_id AND pi.code = %s""",
(self.employee_id, from_date, to_date, code))
AND hp.{sum_field} >= %s AND hp.date_to <= %s AND hp.id = pi.payslip_id AND pi.code = %s""".format(sum_field=sum_field)
def _sum(self, code, from_date, to_date=None):
if to_date is None:
to_date = fields.Date.today()
self.env.cr.execute(self.__browsable_query, (self.employee_id, from_date, to_date, code))
return self.env.cr.fetchone()
def sum(self, code, from_date, to_date=None):
@@ -139,28 +175,37 @@ class HRPayslip(models.Model):
class Payslips(BrowsableObject):
"""a class that will be used into the python code, mainly for usability purposes"""
def _compile_browsable_query(self, sum_field):
# Note that the core odoo has this as `hp.credit_note = False` but what if it is NULL?
# reverse of the desired behavior.
self.__browsable_query_rule = """
SELECT sum(case when hp.credit_note is not True then (pl.total) else (-pl.total) end)
FROM hr_payslip as hp, hr_payslip_line as pl
WHERE hp.employee_id = %s AND hp.state = 'done'
AND hp.{sum_field} >= %s AND hp.date_to <= %s AND hp.id = pl.slip_id AND pl.code = %s""".format(sum_field=sum_field)
self.__browsable_query_category = """
SELECT sum(case when hp.credit_note is not True then (pl.total) else (-pl.total) end)
FROM hr_payslip as hp, hr_payslip_line as pl, hr_salary_rule_category as rc
WHERE hp.employee_id = %s AND hp.state = 'done'
AND hp.{sum_field} >= %s AND hp.date_to <= %s AND hp.id = pl.slip_id
AND rc.id = pl.category_id AND rc.code = %s""".format(sum_field=sum_field)
def sum(self, code, from_date, to_date=None):
if to_date is None:
to_date = fields.Date.today()
self.env.cr.execute("""SELECT sum(case when hp.credit_note = False then (pl.total) else (-pl.total) end)
FROM hr_payslip as hp, hr_payslip_line as pl
WHERE hp.employee_id = %s AND hp.state = 'done'
AND hp.date_from >= %s AND hp.date_to <= %s AND hp.id = pl.slip_id AND pl.code = %s""",
(self.employee_id, from_date, to_date, code))
self.env.cr.execute(self.__browsable_query_rule, (self.employee_id, from_date, to_date, code))
res = self.env.cr.fetchone()
return res and res[0] or 0.0
def rule_parameter(self, code):
return self.env['hr.rule.parameter']._get_parameter_from_code(code, self.dict.date_to)
def sum_category(self, code, from_date, to_date=None):
# Hibou Backport
if to_date is None:
to_date = fields.Date.today()
self.env.cr.execute("""SELECT sum(case when hp.credit_note is not True then (pl.total) else (-pl.total) end)
FROM hr_payslip as hp, hr_payslip_line as pl, hr_salary_rule_category as rc
WHERE hp.employee_id = %s AND hp.state = 'done'
AND hp.date_from >= %s AND hp.date_to <= %s AND hp.id = pl.slip_id
AND rc.id = pl.category_id AND rc.code = %s""",
(self.employee_id, from_date, to_date, code))
self.env.cr.execute(self.__browsable_query_category, (self.employee_id, from_date, to_date, code))
res = self.env.cr.fetchone()
return res and res[0] or 0.0

View File

@@ -0,0 +1,24 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from odoo import fields, models
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
payslip_sum_type = fields.Selection([
('date_from', 'Date From'),
('date_to', 'Date To'),
('date', 'Accounting Date'),
], 'Payslip Sum Behavior', help="Behavior for what payslips are considered "
"during rule execution. Stock Odoo behavior "
"would not consider a payslip starting on 2019-12-30 "
"ending on 2020-01-07 when summing a 2020 payslip category.\n\n"
"Accounting Date requires Payroll Accounting and will "
"fall back to date_to as the 'closest behavior'.",
config_parameter='hr_payroll.payslip.sum_behavior')
def set_values(self):
super(ResConfigSettings, self).set_values()
self.env['ir.config_parameter'].set_param('hr_payroll.payslip.sum_behavior',
self.payslip_sum_type or 'date_from')

View File

@@ -0,0 +1,77 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def al_alabama_state_income_withholding(payslip, categories, worked_days, inputs):
"""
Returns SIT eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
state_code = 'AL'
if not _state_applies(payslip, state_code):
return 0.0, 0.0
# Determine Wage
wage = sit_wage(payslip, categories)
if not wage:
return 0.0, 0.0
personal_exempt = payslip.dict.contract_id.us_payroll_config_value('state_income_tax_exempt')
if personal_exempt:
return 0.0, 0.0
pay_periods = payslip.dict.get_pay_periods_in_year()
additional = payslip.dict.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
tax_table = payslip.dict.rule_parameter('us_al_sit_tax_rate')
exemptions = payslip.dict.contract_id.us_payroll_config_value('al_a4_sit_exemptions')
dependent_rate = payslip.dict.rule_parameter('us_al_sit_dependent_rate')
standard_deduction = payslip.dict.rule_parameter('us_al_sit_standard_deduction_rate').get(exemptions, 0.0)
personal_exemption = payslip.dict.rule_parameter('us_al_sit_personal_exemption_rate').get(exemptions, 0.0)
dependent = payslip.dict.contract_id.us_payroll_config_value('al_a4_sit_dependents')
fed_withholding = categories.EE_US_941_FIT
annual_wage = wage * pay_periods
standard_deduction_amt = 0.0
personal_exemption_amt = 0.0
dependent_amt = 0.0
withholding = 0.0
if standard_deduction:
row = standard_deduction
last_amt = 0.0
for data in row:
if annual_wage < float(data[0]):
if len(data) > 3:
increment_count = (- (wage - last_amt) // data[3])
standard_deduction_amt = data[1] - (increment_count * data[2])
else:
standard_deduction_amt = data[1]
else:
last_amt = data[0]
after_deduction = annual_wage - standard_deduction_amt
after_fed_withholding = (fed_withholding * pay_periods) + after_deduction
if not personal_exempt:
personal_exemption_amt = personal_exemption
after_personal_exemption = after_fed_withholding - personal_exemption_amt
for row in dependent_rate:
if annual_wage < float(row[1]):
dependent_amt = row[0] * dependent
break
taxable_amount = after_personal_exemption - dependent_amt
last = 0.0
tax_table = tax_table['M'] if exemptions == 'M' else tax_table['0']
for row in tax_table:
if taxable_amount < float(row[0]):
withholding = withholding + ((taxable_amount - last) * (row[1] / 100))
break
withholding = withholding + ((row[0] - last) * (row[1] / 100))
last = row[0]
if withholding < 0.0:
withholding = 0.0
withholding /= pay_periods
withholding += additional
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,98 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
MAX_ALLOWANCES = 10
def ca_california_state_income_withholding(payslip, categories, worked_days, inputs):
"""
Returns SIT eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
state_code = 'CA'
if not _state_applies(payslip, state_code):
return 0.0, 0.0
# Determine Wage
wage = sit_wage(payslip, categories)
if not wage:
return 0.0, 0.0
filing_status = payslip.dict.contract_id.us_payroll_config_value('ca_de4_sit_filing_status')
if not filing_status:
return 0.0, 0.0
schedule_pay = payslip.dict.contract_id.schedule_pay
additional = payslip.dict.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
sit_allowances = payslip.dict.contract_id.us_payroll_config_value('ca_de4_sit_allowances')
additional_allowances = payslip.dict.contract_id.us_payroll_config_value('ca_de4_sit_additional_allowances')
low_income_exemption = payslip.dict.rule_parameter('us_ca_sit_income_exemption_rate')[schedule_pay]
estimated_deduction = payslip.dict.rule_parameter('us_ca_sit_estimated_deduction_rate')[schedule_pay]
tax_table = payslip.dict.rule_parameter('us_ca_sit_tax_rate')[filing_status].get(schedule_pay)
standard_deduction = payslip.dict.rule_parameter('us_ca_sit_standard_deduction_rate')[schedule_pay]
exemption_allowances = payslip.dict.rule_parameter('us_ca_sit_exemption_allowance_rate')[schedule_pay]
low_income = False
if filing_status == 'head_household':
_, _, _, income = low_income_exemption
if wage <= income:
low_income = True
elif filing_status == 'married':
if sit_allowances >= 2:
_, _, income, _ = low_income_exemption
if wage <= income:
low_income = True
else:
_, income, _, _ = low_income_exemption
if wage <= income:
low_income = True
else:
income, _, _, _ = low_income_exemption
if wage <= income:
low_income = True
withholding = 0.0
taxable_wage = wage
if not low_income:
allowance_index = max(additional_allowances - 1, 0)
if additional_allowances > MAX_ALLOWANCES:
deduction = (estimated_deduction[0] * additional_allowances)
taxable_wage -= deduction
elif additional_allowances > 0:
deduction = estimated_deduction[allowance_index]
taxable_wage -= deduction
if filing_status == 'head_household':
_, _, _, deduction = standard_deduction
taxable_wage -= deduction
elif filing_status == 'married':
if sit_allowances >= 2:
_, _, deduction, _ = standard_deduction
taxable_wage -= deduction
else:
_, deduction, _, _ = standard_deduction
taxable_wage -= deduction
else:
deduction, _, _, _ = standard_deduction
taxable_wage -= deduction
over = 0.0
for row in tax_table:
if taxable_wage <= row[0]:
withholding = ((taxable_wage - over) * row[1]) + row[2]
break
over = row[0]
allowance_index = sit_allowances - 1
if sit_allowances > MAX_ALLOWANCES:
deduction = exemption_allowances[0] * sit_allowances
withholding -= deduction
elif sit_allowances > 0:
deduction = exemption_allowances[allowance_index]
withholding -= deduction
withholding += additional
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,45 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def co_colorado_state_income_withholding(payslip, categories, worked_days, inputs):
"""
Returns SIT eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
state_code = 'CO'
if not _state_applies(payslip, state_code):
return 0.0, 0.0
# Determine Wage
wage = sit_wage(payslip, categories)
if not wage:
return 0.0, 0.0
filing_status = payslip.dict.contract_id.us_payroll_config_value('fed_941_fit_w4_filing_status')
if not filing_status:
return 0.0, 0.0
state_exempt = payslip.dict.contract_id.us_payroll_config_value('state_income_tax_exempt')
if state_exempt:
return 0.0, 0.0
pay_periods = payslip.dict.get_pay_periods_in_year()
additional = payslip.dict.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
exemption_rate = payslip.dict.rule_parameter('us_co_sit_exemption_rate')
tax_rate = payslip.dict.rule_parameter('us_co_sit_tax_rate')
taxable_income = wage * pay_periods
if filing_status == 'married':
taxable_income -= exemption_rate * 2
else:
taxable_income -= exemption_rate
withholding = taxable_income * (tax_rate / 100)
withholding = max(withholding, 0.0)
withholding = withholding / pay_periods
withholding += additional
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,76 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def ct_connecticut_state_income_withholding(payslip, categories, worked_days, inputs):
"""
Returns SIT eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
state_code = 'CT'
if not _state_applies(payslip, state_code):
return 0.0, 0.0
# Determine Wage
wage = sit_wage(payslip, categories)
if not wage:
return 0.0, 0.0
pay_periods = payslip.dict.get_pay_periods_in_year()
additional = payslip.dict.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
withholding_code = payslip.dict.contract_id.us_payroll_config_value('ct_w4na_sit_code')
exemption_table = payslip.dict.rule_parameter('us_ct_sit_personal_exemption_rate').get(withholding_code, [('inf', 0.0)])
initial_tax_tbl = payslip.dict.rule_parameter('us_ct_sit_initial_tax_rate').get(withholding_code, [('inf', 0.0, 0.0)])
tax_table = payslip.dict.rule_parameter('us_ct_sit_tax_rate').get(withholding_code, [('inf', 0.0)])
recapture_table = payslip.dict.rule_parameter('us_ct_sit_recapture_rate').get(withholding_code, [('inf', 0.0)])
decimal_table = payslip.dict.rule_parameter('us_ct_sit_decimal_rate').get(withholding_code, [('inf', 0.0)])
annual_wages = wage * pay_periods
personal_exemption = 0.0
for bracket in exemption_table:
if annual_wages <= float(bracket[0]):
personal_exemption = bracket[1]
break
withholding = 0.0
taxable_income = annual_wages - personal_exemption
if taxable_income < 0.0:
taxable_income = 0.0
if taxable_income:
initial_tax = 0.0
last = 0.0
for bracket in initial_tax_tbl:
if taxable_income <= float(bracket[0]):
initial_tax = bracket[1] + ((bracket[2] / 100.0) * (taxable_income - last))
break
last = bracket[0]
tax_add_back = 0.0
for bracket in tax_table:
if annual_wages <= float(bracket[0]):
tax_add_back = bracket[1]
break
recapture_amount = 0.0
for bracket in recapture_table:
if annual_wages <= float(bracket[0]):
recapture_amount = bracket[1]
break
withholding = initial_tax + tax_add_back + recapture_amount
decimal_amount = 1.0
for bracket in decimal_table:
if annual_wages <= float(bracket[0]):
decimal_amount= bracket[1]
break
withholding = withholding * (1.00 - decimal_amount)
if withholding < 0.0:
withholding = 0.0
withholding /= pay_periods
withholding += additional
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,49 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def de_delaware_state_income_withholding(payslip, categories, worked_days, inputs):
"""
Returns SIT eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
state_code = 'DE'
if not _state_applies(payslip, state_code):
return 0.0, 0.0
# Determine Wage
wage = sit_wage(payslip, categories)
if not wage:
return 0.0, 0.0
filing_status = payslip.dict.contract_id.us_payroll_config_value('de_w4_sit_filing_status')
if not filing_status:
return 0.0, 0.0
pay_periods = payslip.dict.get_pay_periods_in_year()
additional = payslip.dict.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
tax_table = payslip.dict.rule_parameter('us_de_sit_tax_rate')
personal_exemption = payslip.dict.rule_parameter('us_de_sit_personal_exemption_rate')
allowances = payslip.dict.contract_id.us_payroll_config_value('de_w4_sit_dependent')
standard_deduction = payslip.dict.rule_parameter('us_de_sit_standard_deduction_rate')
taxable_income = wage * pay_periods
if filing_status == 'single':
taxable_income -= standard_deduction
else:
taxable_income -= standard_deduction * 2
withholding = 0.0
last = 0.0
for row in tax_table:
if taxable_income <= float(row[0]):
withholding = (row[1] + ((row[2] / 100.0) * (taxable_income - last)) - (allowances * personal_exemption))
break
last = row[0]
withholding = max(withholding, 0.0)
withholding = withholding / pay_periods
withholding += additional
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,43 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def hi_hawaii_state_income_withholding(payslip, categories, worked_days, inputs):
"""
Returns SIT eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
state_code = 'HI'
if not _state_applies(payslip, state_code):
return 0.0, 0.0
# Determine Wage
wage = sit_wage(payslip, categories)
if not wage:
return 0.0, 0.0
filing_status = payslip.dict.contract_id.us_payroll_config_value('hi_hw4_sit_filing_status')
if not filing_status:
return 0.0, 0.0
pay_periods = payslip.dict.get_pay_periods_in_year()
additional = payslip.dict.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
allowances = payslip.dict.contract_id.us_payroll_config_value('hi_hw4_sit_allowances')
tax_table = payslip.dict.rule_parameter('us_hi_sit_tax_rate')[filing_status]
personal_exemption = payslip.dict.rule_parameter('us_hi_sit_personal_exemption_rate')
taxable_income = (wage * pay_periods) - (personal_exemption * allowances)
withholding = 0.0
last = 0.0
for row in tax_table:
if taxable_income <= float(row[0]):
withholding = row[1] + ((row[2] / 100.0) * (taxable_income - last))
break
last = row[0]
withholding = max(withholding, 0.0)
withholding = withholding / pay_periods
withholding += additional
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,44 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def ia_iowa_state_income_withholding(payslip, categories, worked_days, inputs):
"""
Returns SIT eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
state_code = 'IA'
if not _state_applies(payslip, state_code):
return 0.0, 0.0
# Determine Wage
wage = sit_wage(payslip, categories)
if not wage:
return 0.0, 0.0
schedule_pay = payslip.dict.contract_id.schedule_pay
fed_withholding = categories.EE_US_941_FIT
additional = payslip.dict.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
allowances = payslip.dict.contract_id.us_payroll_config_value('ia_w4_sit_allowances')
standard_deduction = payslip.dict.rule_parameter('us_ia_sit_standard_deduction_rate')[schedule_pay]
tax_table = payslip.dict.rule_parameter('us_ia_sit_tax_rate')[schedule_pay]
deduction_per_allowance = payslip.dict.rule_parameter('us_ia_sit_deduction_allowance_rate')[schedule_pay]
t1 = wage + fed_withholding
t2 = t1 - standard_deduction[0] if allowances < 2 else standard_deduction[1]
t3 = 0.0
last = 0.0
for row in tax_table:
cap, rate, flat_fee = row
if float(cap) > float(t2):
taxed_amount = t2 - last
t3 = flat_fee + (rate * taxed_amount)
break
last = cap
withholding = t3 - (deduction_per_allowance * allowances)
withholding = max(withholding, 0.0)
withholding += additional
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,41 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def id_idaho_state_income_withholding(payslip, categories, worked_days, inputs):
"""
Returns SIT eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
state_code = 'ID'
if not _state_applies(payslip, state_code):
return 0.0, 0.0
# Determine Wage
wage = sit_wage(payslip, categories)
if not wage:
return 0.0, 0.0
filing_status = payslip.dict.contract_id.us_payroll_config_value('id_w4_sit_filing_status')
if not filing_status:
return 0.0, 0.0
schedule_pay = payslip.dict.contract_id.schedule_pay
allowances = payslip.dict.contract_id.us_payroll_config_value('id_w4_sit_allowances')
ictcat_table = payslip.dict.rule_parameter('us_id_sit_ictcat_rate')[schedule_pay]
tax_table = payslip.dict.rule_parameter('us_id_sit_tax_rate')[filing_status].get(schedule_pay)
taxable_income = wage - (ictcat_table * allowances)
withholding = 0.0
last = 0.0
for row in tax_table:
if taxable_income <= float(row[0]):
withholding = row[1] + ((row[2] / 100.0) * (taxable_income - last))
break
last = row[0]
withholding = max(withholding, 0.0)
withholding = round(withholding)
return wage, -((withholding / wage) * 100.0)

View File

@@ -0,0 +1,40 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .general import _state_applies, sit_wage
def nm_new_mexico_state_income_withholding(payslip, categories, worked_days, inputs):
"""
Returns SIT eligible wage and rate.
:return: result, result_rate (wage, percent)
"""
state_code = 'NM'
if not _state_applies(payslip, state_code):
return 0.0, 0.0
# Determine Wage
wage = sit_wage(payslip, categories)
if not wage:
return 0.0, 0.0
filing_status = payslip.dict.contract_id.us_payroll_config_value('fed_941_fit_w4_filing_status')
if not filing_status:
return 0.0, 0.0
schedule_pay = payslip.dict.contract_id.schedule_pay
additional = payslip.dict.contract_id.us_payroll_config_value('state_income_tax_additional_withholding')
tax_table = payslip.dict.rule_parameter('us_nm_sit_tax_rate')[filing_status].get(schedule_pay)
taxable_income = wage
withholding = 0.0
last = 0.0
for row in tax_table:
if taxable_income <= float(row[0]):
withholding = row[1] + ((row[2] / 100.0) * (taxable_income - last))
break
last = row[0]
withholding = max(withholding, 0.0)
withholding += additional
return wage, -((withholding / wage) * 100.0)

View File

@@ -51,12 +51,46 @@ class HRContractUSPayrollConfig(models.Model):
fed_941_fit_w4_additional_withholding = fields.Float(string='Federal W4 Additional Withholding [4(c)]',
help='Form W4 (2020+) 4(c)')
al_a4_sit_exemptions = fields.Selection([
('0', '0'),
('S', 'S'),
('MS', 'MS'),
('M', 'M'),
('H', 'H'),
], string='Alabama A4 Withholding Exemptions', help='A4 1. 2. 3.')
al_a4_sit_dependents = fields.Integer(string='Alabama A4 Dependents', help='A4 4.')
ar_ar4ec_sit_allowances = fields.Integer(string='Arkansas AR4EC allowances', help='AR4EC 3.')
az_a4_sit_withholding_percentage = fields.Float(
string='Arizona A-4 Withholding Percentage',
help='A-4 1. (0.8 or 1.3 or 1.8 or 2.7 or 3.6 or 4.2 or 5.1 or 0 for exempt.')
ca_de4_sit_allowances = fields.Integer(string='California W-4 Allowances',
help='CA W-4 3.')
ca_de4_sit_additional_allowances = fields.Integer(string='California W-4 Additional Allowances',
help='CA W-4 4(c).')
ca_de4_sit_filing_status = fields.Selection([
('', 'Exempt'),
('single', 'Single or Married filing separately'),
('married', 'Married filing jointly'),
('head_household', 'Head of Household')
], string='California W-4 Filing Status', help='CA W-4 1(c).')
ct_w4na_sit_code = fields.Selection([
('a', 'A'),
('b', 'B'),
('c', 'C'),
('d', 'D'),
('f', 'F'),
], string='Connecticut CT-W4 Withholding Code', help='CT-W4 1.')
de_w4_sit_filing_status = fields.Selection([
('single', 'Single or Married filing separately'),
('married', 'Married filing jointly'),
], string='Delaware W-4 Marital Status', help='DE W-4 3.')
de_w4_sit_dependent = fields.Integer(string='Delaware W-4 Dependents', help='DE W-4 4.')
ga_g4_sit_filing_status = fields.Selection([
('exempt', 'Exempt'),
('single', 'Single'),
@@ -70,6 +104,23 @@ class HRContractUSPayrollConfig(models.Model):
ga_g4_sit_additional_allowances = fields.Integer(string='Georgia G-4 Additional Allowances',
help='G-4 5.')
hi_hw4_sit_filing_status = fields.Selection([
('', 'Exempt'),
('single', 'Single'),
('married', 'Married'),
('head_of_household', 'Head of Household'),
], string='Hawaii HW-4 Marital Status', help='HI HW-4 3.')
hi_hw4_sit_allowances = fields.Integer(string='Hawaii HW-4 Allowances', help='HI HW-4 4.')
ia_w4_sit_allowances = fields.Integer(string='Iowa W-4 allowances', help='IA W-4 6.')
id_w4_sit_filing_status = fields.Selection([
('single', 'Single'),
('married', 'Married'),
('head of household', 'Head of Household'),
], string='Idaho ID W-4 Withholding Status', help='ID W-4 A.B.C.')
id_w4_sit_allowances = fields.Integer(string='Idaho ID W-4 Allowances', help='ID W-4 1.')
il_w4_sit_basic_allowances = fields.Integer(string='Illinois IL-W-4 Number of Basic Allowances', help='IL-W-4 Step 1.')
il_w4_sit_additional_allowances = fields.Integer(string='Illinois IL-W-4 Number of Additional Allowances', help='IL-W-4 Step 2.')

View File

@@ -1,21 +1,49 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from . import common
from . import test_special
from . import test_us_payslip_2019
from . import test_us_payslip_2020
from . import test_us_ak_alaska_payslip_2019
from . import test_us_ak_alaska_payslip_2020
from . import test_us_al_alabama_payslip_2019
from . import test_us_al_alabama_payslip_2020
from . import test_us_ar_arkansas_payslip_2019
from . import test_us_ar_arkansas_payslip_2020
from . import test_us_az_arizona_payslip_2019
from . import test_us_az_arizona_payslip_2020
from . import test_us_ca_california_payslip_2019
from . import test_us_ca_california_payslip_2020
from . import test_us_co_colorado_payslip_2020
from . import test_us_ct_connecticut_payslip_2019
from . import test_us_ct_connecticut_payslip_2020
from . import test_us_de_delaware_payslip_2020
from . import test_us_fl_florida_payslip_2019
from . import test_us_fl_florida_payslip_2020
from . import test_us_ga_georgia_payslip_2019
from . import test_us_ga_georgia_payslip_2020
from . import test_us_hi_hawaii_payslip_2019
from . import test_us_hi_hawaii_payslip_2020
from . import test_us_ia_iowa_payslip_2019
from . import test_us_ia_iowa_payslip_2020
from . import test_us_id_idaho_payslip_2019
from . import test_us_id_idaho_payslip_2020
from . import test_us_il_illinois_payslip_2019
from . import test_us_il_illinois_payslip_2020
@@ -37,9 +65,13 @@ from . import test_us_mt_montana_payslip_2020
from . import test_us_nc_northcarolina_payslip_2019
from . import test_us_nc_northcarolina_payslip_2020
from . import test_us_nh_new_hampshire_payslip_2020
from . import test_us_nj_newjersey_payslip_2019
from . import test_us_nj_newjersey_payslip_2020
from . import test_us_nm_new_mexico_payslip_2020
from . import test_us_oh_ohio_payslip_2019
from . import test_us_oh_ohio_payslip_2020

View File

@@ -22,6 +22,10 @@ class TestUsPayslip(common.TransactionCase):
debug = False
_logger = getLogger(__name__)
def setUp(self):
super(TestUsPayslip, self).setUp()
self.env['ir.config_parameter'].set_param('hr_payroll.payslip.sum_behavior', 'date_to')
float_info = sys_float_info
def float_round(self, value, digits):
@@ -154,15 +158,6 @@ class TestUsPayslip(common.TransactionCase):
def assertPayrollAlmostEqual(self, first, second):
self.assertAlmostEqual(first, second, self.payroll_digits-1)
def test_semi_monthly(self):
salary = 80000.0
employee = self._createEmployee()
# so the schedule_pay is now on the Structure...
contract = self._createContract(employee, wage=salary, schedule_pay='semi-monthly')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-14')
payslip.compute_sheet()
def get_us_state(self, code, cache={}):
country_key = 'US_COUNTRY'
if code in cache:

View File

@@ -0,0 +1,66 @@
from .common import TestUsPayslip, process_payslip
class TestSpecial(TestUsPayslip):
def test_semi_monthly(self):
salary = 80000.0
employee = self._createEmployee()
# so the schedule_pay is now on the Structure...
contract = self._createContract(employee, wage=salary, schedule_pay='semi-monthly')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-14')
payslip.compute_sheet()
def test_payslip_sum_behavior(self):
us_structure = self.env.ref('l10n_us_hr_payroll.structure_type_employee')
rule_category_comp = self.env.ref('hr_payroll.COMP')
test_rule_category = self.env['hr.salary.rule.category'].create({
'name': 'Test Sum Behavior',
'code': 'test_sum_behavior',
'parent_id': rule_category_comp.id,
})
test_rule = self.env['hr.salary.rule'].create({
'sequence': 450,
'category_id': test_rule_category.id,
'name': 'Test Sum Behavior',
'code': 'test_sum_behavior',
'condition_select': 'python',
'condition_python': 'result = 1',
'amount_select': 'code',
'amount_python_compute': '''
ytd_category = payslip.sum_category('test_sum_behavior', '2020-01-01', '2021-01-01')
ytd_rule = payslip.sum('test_sum_behavior', '2020-01-01', '2021-01-01')
result = 0.0
if ytd_category != ytd_rule:
# error
result = -1.0
elif ytd_rule == 0.0:
# first payslip in period
result = 1.0
'''
})
us_structure.write({'rule_ids': [(4, test_rule.id, 0)]})
salary = 80000.0
employee = self._createEmployee()
contract = self._createContract(employee, wage=salary, schedule_pay='bi-weekly')
payslip = self._createPayslip(employee, '2019-12-30', '2020-01-12')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertEqual(cats['test_sum_behavior'], 1.0)
process_payslip(payslip)
# Basic date_from behavior.
self.env['ir.config_parameter'].set_param('hr_payroll.payslip.sum_behavior', 'date_from')
# The the date_from on the last payslip will not be found
payslip = self._createPayslip(employee, '2020-01-13', '2020-01-27')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertEqual(cats['test_sum_behavior'], 1.0)
# date_to behavior.
self.env['ir.config_parameter'].set_param('hr_payroll.payslip.sum_behavior', 'date_to')
# The date_to on the last payslip is found
payslip = self._createPayslip(employee, '2020-01-13', '2020-01-27')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertEqual(cats['test_sum_behavior'], 0.0)

View File

@@ -0,0 +1,61 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .common import TestUsPayslip, process_payslip
class TestUsAKPayslip(TestUsPayslip):
# TAXES AND RATES
AK_UNEMP_MAX_WAGE = 39900.00
AK_UNEMP = -(1.780 / 100.0)
AK_UNEMP_EE = -(0.5 / 100.0)
def test_taxes_monthly_over_max(self):
salary = 50000.00
schedule_pay = 'monthly'
employee = self._createEmployee()
contract = self._createContract(employee,
wage=salary,
state_id=self.get_us_state('AK'),
state_income_tax_additional_withholding=0.0,
schedule_pay=schedule_pay)
self._log('2019 Alaska tax first payslip monthly:')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], self.AK_UNEMP_MAX_WAGE * self.AK_UNEMP)
self.assertPayrollEqual(cats['EE_US_SUTA'], self.AK_UNEMP_MAX_WAGE * self.AK_UNEMP_EE)
process_payslip(payslip)
remaining_ak_unemp_wages = 0.00 # We already reached the maximum wage for unemployment insurance.
self._log('2019 Alaska tax second payslip monthly:')
payslip = self._createPayslip(employee, '2019-02-01', '2019-02-28')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], remaining_ak_unemp_wages * self.AK_UNEMP) # 0
def test_taxes_weekly_under_max(self):
salary = 5000.00
schedule_pay = 'weekly'
employee = self._createEmployee()
contract = self._createContract(employee,
wage=salary,
state_id=self.get_us_state('AK'),
state_income_tax_additional_withholding=0.0,
schedule_pay=schedule_pay)
self._log('2019 Alaska tax first payslip weekly:')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], salary * self.AK_UNEMP)
self.assertPayrollEqual(cats['EE_US_SUTA'], salary * self.AK_UNEMP_EE)
process_payslip(payslip)

View File

@@ -0,0 +1,15 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from datetime import date
from .common import TestUsPayslip
class TestUsAKPayslip(TestUsPayslip):
# TAXES AND RATES
AK_UNEMP_MAX_WAGE = 41500.00
AK_UNEMP = 1.590
AK_UNEMP_EE = 0.5
def test_2020_taxes(self):
self._test_er_suta('AK', self.AK_UNEMP, date(2020, 1, 1), wage_base=self.AK_UNEMP_MAX_WAGE)
self._test_ee_suta('AK', self.AK_UNEMP_EE, date(2020, 1, 1), wage_base=self.AK_UNEMP_MAX_WAGE)

View File

@@ -0,0 +1,264 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .common import TestUsPayslip, process_payslip
class TestUsALPayslip(TestUsPayslip):
# TAXES AND RATES
AL_UNEMP_MAX_WAGE = 8000.00
AL_UNEMP = -2.70 / 100.0
def test_taxes_weekly(self):
salary = 10000.00
schedule_pay = 'weekly'
dependents = 1
filing_status = 'S'
# see https://revenue.alabama.gov/wp-content/uploads/2019/01/whbooklet_0119.pdf for reference
# Hand Calculated Amount to Test
# Step 1 -> 10000.00 for wages per period , 52.0 for weekly -> 10000 * 52 -> 520000.0
# Step 2A -> standard deduction for highest wage bracket -> 2000. Subtract from yearly income
# 520000 - 2000 = 518000.0
# Step 2B -> Subtract Federal Income Tax in yearly form -> Our Fed withholding is -2999.66 * 52 = -155982.32
# -> 518000.0 - 155982.32 = 362017.68
# Step 2C -> Subtract the personal exemption -> 1500 for single filing_status
# -> 362017.68 - 1500 = 360517.68
# Step 2D -> Since income is so high, only 300$ per dependent -> 300$. Subtract
# -> 360517.68 - 300 = 360217.68
#
# Step 5 (after adding previous lines) -> Compute marginal taxes.
# (500 * (2.00 / 100)) + (2500 * (4.00 / 100)) + ((360217.68 - 500 - 2500) * (5.00 / 100)) -> 17970.884000000002
# Convert back to pay period
# wh = round(17970.884000000002, 2) -> 17970.88 / 52.0 -> 345.59
wh = -345.59
employee = self._createEmployee()
contract = self._createContract(employee,
wage=salary,
state_id=self.get_us_state('AL'),
al_a4_sit_exemptions=filing_status,
state_income_tax_additional_withholding=0.0,
state_income_tax_exempt=False,
al_a4_sit_dependents=dependents,
schedule_pay=schedule_pay)
self._log('2019 Alabama tax first payslip weekly:')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['EE_US_941_FIT'], -2999.66) # Hand Calculated.
self.assertPayrollEqual(cats['ER_US_SUTA'], self.AL_UNEMP_MAX_WAGE * self.AL_UNEMP)
self.assertPayrollEqual(cats['EE_US_SIT'], wh)
process_payslip(payslip)
remaining_AL_UNEMP_wages = 0.00 # We already reached the maximum wage for unemployment insurance.
self._log('2019 Alabama tax second payslip weekly:')
payslip = self._createPayslip(employee, '2019-02-01', '2019-02-28')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], remaining_AL_UNEMP_wages * self.AL_UNEMP) # 0
def test_taxes_married_jointly(self):
salary = 10000.00
schedule_pay = 'weekly'
dependents = 1
filing_status = 'M'
# see https://revenue.alabama.gov/wp-content/uploads/2019/01/whbooklet_0119.pdf for reference
# Hand Calculated Amount to Test
# Step 1 -> 10000.00 for wages per period , 52.0 for weekly -> 10000 * 52 -> 520000.0
# Step 2A -> standard deduction for highest wage bracket -> 4000. Subtract from yearly income
# 520000 - 4000 = 516000.0
# Step 2B -> Subtract Federal Income Tax in yearly form -> Our Fed withholding is -2999.66 * 52 = -155982.32
# -> 516000.0 - 155982.32 = 360017.68
# Step 2C -> Subtract the personal exemption -> 3000 for married filing jointly.
# -> 360017.68 - 3000 = 357017.68
# Step 2D -> Since income is so high, only 300$ per dependent -> 300$. Subtract
# -> 357017.68 - 300 = 356717.68
#
# Step 5 (after adding previous lines) -> Compute marginal taxes.
# (1000 * (2.00 / 100)) + (5000 * (4.00 / 100)) + ((356717.68 - 1000 - 50000) * (5.00 / 100))
# -> 17755.884000000002
# Convert back to pay period
# wh = round(17755.884000000002, 2) -> 15505.88 / 52.0 -> 341.45923076923077
wh = -341.46
employee = self._createEmployee()
contract = self._createContract(employee,
wage=salary,
state_id=self.get_us_state('AL'),
al_a4_sit_exemptions=filing_status,
state_income_tax_additional_withholding=0.0,
state_income_tax_exempt=False,
al_a4_sit_dependents=dependents,
schedule_pay=schedule_pay)
self._log('2019 Alabama tax first payslip weekly:')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['EE_US_941_FIT'], -2999.66) # Hand Calculated.
self.assertPayrollEqual(cats['ER_US_SUTA'], self.AL_UNEMP_MAX_WAGE * self.AL_UNEMP)
self.assertPayrollEqual(cats['EE_US_SIT'], wh)
process_payslip(payslip)
def test_taxes_semimonthly_filing_seperate(self):
salary = 20000.00
schedule_pay = 'monthly'
filing_status = 'MS'
dependents = 2
# see https://revenue.alabama.gov/wp-content/uploads/2019/01/whbooklet_0119.pdf for reference
# Hand Calculated Amount to Test
# Step 1 -> 10000.00 for wages per period , 12.0 for monthly -> 20000 * 12 -> 240000.00
# Step 2A -> standard deduction for highest wage bracket -> 2000. Subtract from yearly income
# 240000.00 - 2000 = 238000.00
# Step 2B -> Subtract Federal Income Tax in yearly form -> Our Fed withholding is -4821.99 * 12 = -57863.88
# -> 238000.00 - 57863.88 = 180136.12
# Step 2C -> Subtract the personal exemption -> 1500 for married filing separately
# -> 180136.12 - 1500 = 178636.12
# Step 2D -> Since income is so high, only 300$ per dependent -> 600. Subtract
# -> 178636.12 - 600 = 178036.12
#
# Step 5 (after adding previous lines) -> Compute marginal taxes.
# (500 * (2.00 / 100)) + (2500 * (4.00 / 100)) + ((178036.12 - 500 - 2500) * (5.00 / 100)) -> 8861.806
# Convert back to pay period
# wh = 8861.806 / 12.0 rounded -> 738.48
wh = -738.48
employee = self._createEmployee()
contract = self._createContract(employee,
wage=salary,
state_id=self.get_us_state('AL'),
al_a4_sit_exemptions=filing_status,
state_income_tax_additional_withholding=0.0,
state_income_tax_exempt=False,
al_a4_sit_dependents=dependents,
schedule_pay=schedule_pay)
self._log('2019 Alabama tax first payslip monthly:')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['EE_US_941_FIT'], -4822.00) # Hand Calculated.
self.assertPayrollEqual(cats['ER_US_SUTA'], self.AL_UNEMP_MAX_WAGE * self.AL_UNEMP)
self.assertPayrollEqual(cats['EE_US_SIT'], wh)
process_payslip(payslip)
def test_tax_exempt(self):
salary = 5500.00
wh = 0
schedule_pay = 'weekly'
dependents = 2
employee = self._createEmployee()
contract = self._createContract(employee,
wage=salary,
state_id=self.get_us_state('AL'),
al_a4_sit_exemptions='0',
state_income_tax_additional_withholding=0.0,
state_income_tax_exempt=True,
al_a4_sit_dependents=dependents,
schedule_pay=schedule_pay)
self._log('2019 Alabama tax first payslip exempt:')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], salary * self.AL_UNEMP)
self.assertPayrollEqual(cats.get('EE_US_SIT', 0.0), wh)
def test_additional_withholding(self):
salary = 5500.0
schedule_pay = 'weekly'
additional_wh = 40.0
dependents = 2
# filing status default is single
# see https://revenue.alabama.gov/wp-content/uploads/2019/01/whbooklet_0119.pdf for reference
# Hand Calculated Amount to Test
# Step 1 -> 5500.00 for wages per period , 52.0 for monthly -> 5500 * 52.0 -> 286000.0
# Step 2A -> standard deduction for highest wage bracket -> 2000. Subtract from yearly income
# 286000.0 - 2000 = 284000.0
# Step 2B -> Subtract Federal Income Tax in yearly form -> Our Fed withholding is -1422.4 * 52.0 = -73964.8
# -> 284000.0 - 73964.8 = 210035.2
# Step 2C -> Subtract the personal exemption -> 1500 for single
# -> 210035.2 - 1500 = 208535.2
# Step 2D -> Since income is so high, only 300$ per dependent -> 600. Subtract
# -> 208535.2 - 600 = 207935.2
#
# Step 5 (after adding previous lines) -> Compute marginal taxes.
# (500 * (2.00 / 100)) + (2500 * (4.00 / 100)) + ((207935.2 - 500 - 2500) * (5.00 / 100)) -> 10356.76
# Convert back to pay period
# wh = 10356.76 / 52.0 rounded -> 199.17
wh = -199.17
employee = self._createEmployee()
contract = self._createContract(employee,
wage=salary,
state_id=self.get_us_state('AL'),
al_a4_sit_exemptions='S',
state_income_tax_additional_withholding=40.0,
state_income_tax_exempt=False,
al_a4_sit_dependents=dependents,
schedule_pay=schedule_pay)
self._log('2019 Alabama tax first payslip additional withholding:')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['EE_US_941_FIT'], -1422.4) # Hand Calculated.
self.assertPayrollEqual(cats['ER_US_SUTA'], salary * self.AL_UNEMP)
self.assertPayrollEqual(cats['EE_US_SIT'], wh - additional_wh)
def test_personal_exemption(self):
salary = 5500.0
schedule_pay = 'weekly'
# filing status default is single
# see https://revenue.alabama.gov/wp-content/uploads/2019/01/whbooklet_0119.pdf for reference
# Hand Calculated Amount to Test
# Step 1 -> 5500.00 for wages per period , 52.0 for monthly -> 5500 * 52.0 -> 286000.0
# Step 2A -> standard deduction for highest wage bracket -> 2000. Subtract from yearly income
# 286000.0 - 2000 = 284000.0
# Step 2B -> Subtract Federal Income Tax in yearly form -> Our Fed withholding is -1422.4 * 52.0 = -73964.8
# -> 284000.0 - 73964.8 = 210035.2
# Step 2C -> Subtract the personal exemption -> 0 for personal exemptioon
# -> 210035.2 - 0 = 210035.2
# Step 2D -> Subtract per dependent. No dependents so 0
# -> 210035.2 - 0 = 210035.2
#
# Step 5 (after adding previous lines) -> Compute marginal taxes.
# (500 * (2.00 / 100)) + (2500 * (4.00 / 100)) + ((210035.2 - 500 - 2500) * (5.00 / 100)) -> 10461.76
# Convert back to pay period
# wh = 10461.76 / 52.0 rounded -> 201.19
wh = -199.74
employee = self._createEmployee()
contract = self._createContract(employee,
wage=salary,
state_id=self.get_us_state('AL'),
al_a4_sit_exemptions='S',
state_income_tax_additional_withholding=0.0,
state_income_tax_exempt=False,
al_a4_sit_dependents=0.0,
schedule_pay=schedule_pay)
self._log('2019 Alabama tax first payslip additional withholding:')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['EE_US_941_FIT'], -1422.4) # Hand Calculated.
self.assertPayrollEqual(cats['ER_US_SUTA'], salary * self.AL_UNEMP)
self.assertPayrollEqual(cats['EE_US_SIT'], wh)

View File

@@ -0,0 +1,36 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from datetime import date, timedelta
from .common import TestUsPayslip
class TestUsALPayslip(TestUsPayslip):
# Taxes and Rates
AL_UNEMP_MAX_WAGE = 8000.00
AL_UNEMP = 2.70
def _test_sit(self, wage, exempt, exemptions, additional_withholding, dependent, schedule_pay, date_start, expected_withholding):
employee = self._createEmployee()
contract = self._createContract(employee,
wage=wage,
state_id=self.get_us_state('AL'),
al_a4_sit_exemptions=exempt,
state_income_tax_exempt=exemptions,
state_income_tax_additional_withholding=additional_withholding,
al_a4_sit_dependents=dependent,
schedule_pay=schedule_pay)
payslip = self._createPayslip(employee, date_start, date_start + timedelta(days=7))
payslip.compute_sheet()
cats = self._getCategories(payslip)
self._log('Computed period tax: ' + str(expected_withholding))
self.assertPayrollEqual(cats.get('EE_US_SIT', 0.0), -expected_withholding)
def test_2020_taxes_example(self):
self._test_er_suta('AL', self.AL_UNEMP, date(2020, 1, 1), wage_base=self.AL_UNEMP_MAX_WAGE)
self._test_sit(10000.0, 'S', False, 0.0, 1.0, 'weekly', date(2020, 1, 1), 349.08)
self._test_sit(850.0, 'M', False, 0.0, 2.0, 'weekly', date(2020, 1, 1), 29.98)
self._test_sit(5000.0, 'H', False, 0.0, 2.0, 'bi-weekly', date(2020, 1, 1), 191.15)
self._test_sit(20000.0, 'MS', False, 2.0, 0, 'monthly', date(2020, 1, 1), 757.6)
self._test_sit(5500.0, '0', True, 2.0, 150, 'weekly', date(2020, 1, 1), 0)

View File

@@ -0,0 +1,245 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .common import TestUsPayslip, process_payslip
class TestUsCAPayslip(TestUsPayslip):
###
# Taxes and Rates
###
CA_MAX_WAGE = 7000
CA_UIT = -3.5 / 100.0
CA_ETT = -0.1 / 100.0
CA_SDI = -1.0 / 100.0
# Examples from https://www.edd.ca.gov/pdf_pub_ctr/20methb.pdf
def test_example_a(self):
salary = 210
schedule_pay = 'weekly'
allowances = 1
additional_allowances = 0
wh = 0.00
employee = self._createEmployee()
contract = self._createContract(employee,
wage=salary,
state_id=self.get_us_state('CA'),
ca_de4_sit_filing_status='single',
state_income_tax_additional_withholding=0.0,
ca_de4_sit_allowances=allowances,
ca_de4_sit_additional_allowances=additional_allowances,
schedule_pay=schedule_pay)
self._log('2019 California tax first payslip:')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], salary * (self.CA_UIT + self.CA_ETT))
self.assertPayrollEqual(cats['EE_US_SUTA'], salary * self.CA_SDI)
self.assertPayrollEqual(cats['EE_US_SIT'], wh)
process_payslip(payslip)
def test_example_b(self):
salary = 1250
schedule_pay = 'bi-weekly'
allowances = 2
additional_allowances = 1
# Example B
subject_to_withholding = salary - 38
taxable_income = subject_to_withholding - 339
computed_tax = (taxable_income - 632) * 0.022 + 6.95 # 6.95 Marginal Amount
wh = computed_tax - 9.65 # two exemption allowances
wh = -wh
employee = self._createEmployee()
contract = self._createContract(employee,
wage=salary,
state_id=self.get_us_state('CA'),
ca_de4_sit_filing_status='married',
state_income_tax_additional_withholding=0.0,
ca_de4_sit_allowances=allowances,
ca_de4_sit_additional_allowances=additional_allowances,
schedule_pay=schedule_pay)
self._log('2019 California tax first payslip:')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], salary * (self.CA_UIT + self.CA_ETT))
self.assertPayrollEqual(cats['EE_US_SUTA'], salary * self.CA_SDI)
self.assertPayrollEqual(cats['EE_US_SIT'], wh)
process_payslip(payslip)
def test_example_c(self):
salary = 4100
schedule_pay = 'monthly'
allowances = 5
additional_allowances = 0.0
wh = -9.3
employee = self._createEmployee()
contract = self._createContract(employee,
wage=salary,
state_id=self.get_us_state('CA'),
ca_de4_sit_filing_status='married',
state_income_tax_additional_withholding=0.0,
ca_de4_sit_allowances=allowances,
ca_de4_sit_additional_allowances=additional_allowances,
schedule_pay=schedule_pay)
self._log('2019 California tax first payslip:')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], salary * (self.CA_UIT + self.CA_ETT))
self.assertPayrollEqual(cats['EE_US_SUTA'], salary * self.CA_SDI)
self.assertPayrollEqual(cats['EE_US_SIT'], wh)
process_payslip(payslip)
# Make a new payslip, this one will have maximums
remaining_ca_uit_wages = self.CA_MAX_WAGE - salary if (self.CA_MAX_WAGE - 2 * salary < salary) \
else salary
self._log('2019 California tax second payslip:')
payslip = self._createPayslip(employee, '2019-02-01', '2019-02-28')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], round((remaining_ca_uit_wages * (self.CA_UIT + self.CA_ETT)), 2))
def test_example_d(self):
salary = 800
schedule_pay = 'weekly'
allowances = 3
additional_allowances = 0
wh = -3.18
employee = self._createEmployee()
contract = self._createContract(employee,
wage=salary,
state_id=self.get_us_state('CA'),
ca_de4_sit_filing_status='head_household',
state_income_tax_additional_withholding=0.0,
ca_de4_sit_allowances=allowances,
ca_de4_sit_additional_allowances=additional_allowances,
schedule_pay=schedule_pay)
self._log('2019 California tax first payslip:')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], salary * (self.CA_UIT + self.CA_ETT))
self.assertPayrollEqual(cats['EE_US_SUTA'], salary * self.CA_SDI)
self.assertPayrollEqual(cats['EE_US_SIT'], wh)
process_payslip(payslip)
# Make a new payslip, this one will have maximums
remaining_ca_uit_wages = self.CA_MAX_WAGE - salary if (self.CA_MAX_WAGE - 2 * salary < salary) \
else salary
self._log('2019 California tax second payslip:')
payslip = self._createPayslip(employee, '2019-02-01', '2019-02-28')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], round((remaining_ca_uit_wages * (self.CA_UIT + self.CA_ETT)), 2))
def test_example_e(self):
salary = 1800
schedule_pay = 'semi-monthly'
allowances = 4
additional_allowances = 0
wh = -3.08
employee = self._createEmployee()
contract = self._createContract(employee,
wage=salary,
state_id=self.get_us_state('CA'),
ca_de4_sit_filing_status='married',
state_income_tax_additional_withholding=0.0,
ca_de4_sit_allowances=allowances,
ca_de4_sit_additional_allowances=additional_allowances,
schedule_pay=schedule_pay)
self._log('2019 California tax first payslip:')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], salary * (self.CA_UIT + self.CA_ETT))
self.assertPayrollEqual(cats['EE_US_SUTA'], salary * self.CA_SDI)
self.assertPayrollEqual(cats['EE_US_SIT'], wh)
process_payslip(payslip)
# Make a new payslip, this one will have maximums
remaining_ca_uit_wages = self.CA_MAX_WAGE - salary if (self.CA_MAX_WAGE - 2 * salary < salary) \
else salary
self._log('2019 California tax second payslip:')
payslip = self._createPayslip(employee, '2019-02-01', '2019-02-28')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], round((remaining_ca_uit_wages * (self.CA_UIT + self.CA_ETT)), 2))
def test_example_f(self):
salary = 45000
schedule_pay = 'annually'
allowances = 4
additional_allowances = 0
wh = -113.85
employee = self._createEmployee()
contract = self._createContract(employee,
wage=salary,
state_id=self.get_us_state('CA'),
ca_de4_sit_filing_status='married',
state_income_tax_additional_withholding=0.0,
ca_de4_sit_allowances=allowances,
ca_de4_sit_additional_allowances=additional_allowances,
schedule_pay=schedule_pay)
self._log('2019 California tax first payslip:')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], self.CA_MAX_WAGE * (self.CA_UIT + self.CA_ETT))
self.assertPayrollEqual(cats['EE_US_SUTA'], self.CA_MAX_WAGE * self.CA_SDI)
self.assertPayrollEqual(cats['EE_US_SIT'], wh)
process_payslip(payslip)

View File

@@ -0,0 +1,42 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from datetime import date, timedelta
from .common import TestUsPayslip
class TestUsCAPayslip(TestUsPayslip):
###
# 2020 Taxes and Rates
###
CA_UNEMP_MAX_WAGE = 7000.0 # Note that this is used for SDI and FLI as well
CA_UIT = 3.4
CA_ETT = 0.1
CA_SDI = 1.0
def _test_sit(self, wage, filing_status, allowances, additional_allowances, additional_withholding, schedule_pay, date_start, expected_withholding):
employee = self._createEmployee()
contract = self._createContract(employee,
wage=wage,
state_id=self.get_us_state('CA'),
ca_de4_sit_filing_status=filing_status,
ca_de4_sit_allowances=allowances,
ca_de4_sit_additional_allowances=additional_allowances,
state_income_tax_additional_withholding=additional_withholding,
schedule_pay=schedule_pay)
payslip = self._createPayslip(employee, date_start, date_start + timedelta(days=7))
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollAlmostEqual(cats.get('EE_US_SIT', 0.0), -expected_withholding if filing_status else 0.0)
def test_2020_taxes_example1(self):
combined_er_rate = self.CA_UIT + self.CA_ETT
self._test_er_suta('CA', combined_er_rate, date(2020, 1, 1), wage_base=self.CA_UNEMP_MAX_WAGE)
self._test_ee_suta('CA', self.CA_SDI, date(2020, 1, 1), wage_base=self.CA_UNEMP_MAX_WAGE, relaxed=True)
# these expected values come from https://www.edd.ca.gov/pdf_pub_ctr/20methb.pdf
self._test_sit(210.0, 'single', 1, 0, 0, 'weekly', date(2020, 1, 1), 0.00)
self._test_sit(1250.0, 'married', 2, 1, 0, 'bi-weekly', date(2020, 1, 1), 1.23)
self._test_sit(4100.0, 'married', 5, 0, 0, 'monthly', date(2020, 1, 1), 1.5)
self._test_sit(800.0, 'head_household', 3, 0, 0, 'weekly', date(2020, 1, 1), 2.28)
self._test_sit(1800.0, 'married', 4, 0, 0, 'semi-monthly', date(2020, 1, 1), 0.84)
self._test_sit(45000.0, 'married', 4, 0, 0, 'annually', date(2020, 1, 1), 59.78)
self._test_sit(45000.0, 'married', 4, 0, 20.0, 'annually', date(2020, 1, 1), 79.78)

View File

@@ -0,0 +1,36 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from datetime import date, timedelta
from .common import TestUsPayslip
class TestUsCOPayslip(TestUsPayslip):
###
# 2020 Taxes and Rates
###
CO_UNEMP_MAX_WAGE = 13600.0
CO_UNEMP = 1.7
def _test_sit(self, wage, filing_status, additional_withholding, schedule_pay, date_start, expected_withholding, state_income_tax_exempt=False):
employee = self._createEmployee()
contract = self._createContract(employee,
wage=wage,
state_id=self.get_us_state('CO'),
fed_941_fit_w4_filing_status=filing_status,
state_income_tax_additional_withholding=additional_withholding,
state_income_tax_exempt=state_income_tax_exempt,
schedule_pay=schedule_pay)
payslip = self._createPayslip(employee, date_start, date_start + timedelta(days=7))
payslip.compute_sheet()
cats = self._getCategories(payslip)
self._log('Computed period tax: ' + str(expected_withholding))
self.assertPayrollEqual(cats.get('EE_US_SIT', 0.0), -expected_withholding)
def test_2020_taxes_example(self):
self._test_er_suta('CO', self.CO_UNEMP, date(2020, 1, 1), wage_base=self.CO_UNEMP_MAX_WAGE)
self._test_sit(5000.0, 'married', 0.0, 'semi-monthly', date(2020, 1, 1), 216.07)
self._test_sit(800.0, 'single', 0.0, 'weekly', date(2020, 1, 1), 33.48)
self._test_sit(20000.0, 'married', 0.0, 'quarterly', date(2020, 1, 1), 833.4)
self._test_sit(20000.0, 'married', 10.0, 'quarterly', date(2020, 1, 1), 843.4)
self._test_sit(20000.0, 'married', 0.0, 'quarterly', date(2020, 1, 1), 0.0, True)

View File

@@ -0,0 +1,121 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .common import TestUsPayslip, process_payslip
class TestUsCTPayslip(TestUsPayslip):
# TAXES AND RATES
CT_UNEMP_MAX_WAGE = 15000.00
CT_UNEMP = -(3.40 / 100.0)
def test_taxes_weekly_with_additional_wh(self):
# Tax tables can be found here:
# https://portal.ct.gov/-/media/DRS/Publications/pubsip/2019/IP-2019(1).pdf?la=en
# Step 1 - Wages per period -> 10000.00
salary = 10000.00
# Step 2 and 3 - Annual wages -> 10000.00 * 52.0 -> 520000.0
schedule_pay = 'weekly'
# Step 4 Employee Withholding Code -> A
wh_code = 'a'
# Step 5 - Use annual wages and withholding code with table for exemption amount.
# exemption_amt = 0 since highest bracket.
# Step 6 - Subtract 5 from 3 for taxable income.
# taxable income = 520000.00 since we do not have an exemption.
# Step 7 - Determine initial amount from table
# initial = 31550 + ((6.99 / 100) * (520000.00 - 500000.00))
# 32948.0
# Step 8 - Determine the tax rate phase out add back from table.
# phase_out = 200
# Step 9 - Determine the recapture amount from table.
# Close to top, but not top. -> 2900
# Step 10 - Add Step 7, 8, 9
# 32948.0 + 200 + 2900.00 - > 36048.0
# Step 11 - Determine decimal amount from personal tax credits.
# We get no tax credit.
# Step 12 - Multiple Step 10 by 1.00 - Step 11
# 36048.0 * 1.00 = 36048.0
# Step 13 - Divide by the number of pay periods.
# 36048.0 / 52.0 = 693.23
# Step 14 & 15 & 16- Add / Subtract the additional or under withholding amount. Then Add this to the amount
# for withholding per period.
additional_wh = 12.50
# 693.23 + 12.50 ->
wh = -705.73
employee = self._createEmployee()
contract = self._createContract(employee,
wage=salary,
state_id=self.get_us_state('CT'),
ct_w4na_sit_code=wh_code,
state_income_tax_additional_withholding=additional_wh,
schedule_pay=schedule_pay)
self._log('2019 Connecticut tax first payslip weekly:')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], salary * self.CT_UNEMP)
self.assertPayrollEqual(cats['EE_US_SIT'], wh)
process_payslip(payslip)
remaining_CT_UNEMP_wages = 5000.00 # We already reached the maximum wage for unemployment insurance.
self._log('2019 Connecticut tax second payslip weekly:')
payslip = self._createPayslip(employee, '2019-02-01', '2019-02-28')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], remaining_CT_UNEMP_wages * self.CT_UNEMP)
def test_taxes_weekly_with_different_code(self):
# Tax tables can be found here:
# https://portal.ct.gov/-/media/DRS/Publications/pubsip/2019/IP-2019(1).pdf?la=en
# Step 1 - Wages per period -> 15000.00
salary = 15000.00
# Step 2 and 3 - Annual wages -> 15000.00 * 12.0 -> 180000.0
schedule_pay = 'monthly'
# Step 4 Employee Withholding Code -> B
wh_code = 'b'
# Step 5 - Use annual wages and withholding code with table for exemption amount.
# exemption_amt = 0 since highest bracket.
# Step 6 - Subtract 5 from 3 for taxable income.
# taxable income = 180000.0 since we do not have an exemption.
# Step 7 - Determine initial amount from table
# initial = 8080 + ((6.00 / 100) * (180000.0 - 160000))
# 9280.0
# Step 8 - Determine the tax rate phase out add back from table.
# phase_out = 320
# Step 9 - Determine the recapture amount from table.
# Bottom -> 0
# Step 10 - Add Step 7, 8, 9
# 9280.0 + 320 + 0 - > 9600.0
# Step 11 - Determine decimal amount from personal tax credits.
# We get no tax credit.
# Step 12 - Multiple Step 10 by 1.00 - Step 11
# 9600.0 * 1.00 = 9600.0
# Step 13 - Divide by the number of pay periods.
# 9600.0 / 12.0 = 800.0
# Step 14 & 15 & 16- Add / Subtract the additional or under withholding amount. Then Add this to the amount
# for withholding per period.
additional_wh = 15.00
# 800.0 + 15.00 ->
wh = -815.0
employee = self._createEmployee()
contract = self._createContract(employee,
wage=salary,
state_id=self.get_us_state('CT'),
ct_w4na_sit_code=wh_code,
state_income_tax_additional_withholding=additional_wh,
schedule_pay=schedule_pay)
self._log('2019 Connecticut tax first payslip monthly:')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], self.CT_UNEMP_MAX_WAGE * self.CT_UNEMP)
self.assertPayrollEqual(cats['EE_US_SIT'], wh)

View File

@@ -0,0 +1,34 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from datetime import date, timedelta
from .common import TestUsPayslip
class TestUsCTPayslip(TestUsPayslip):
# Taxes and Rates
CT_UNEMP_MAX_WAGE = 15000.0
CT_UNEMP = 3.2
def _test_sit(self, wage, withholding_code, additional_withholding, schedule_pay, date_start, expected_withholding):
employee = self._createEmployee()
contract = self._createContract(employee,
wage=wage,
state_id=self.get_us_state('CT'),
ct_w4na_sit_code=withholding_code,
state_income_tax_additional_withholding=additional_withholding,
schedule_pay=schedule_pay)
payslip = self._createPayslip(employee, date_start, date_start + timedelta(days=7))
payslip.compute_sheet()
cats = self._getCategories(payslip)
self._log('Computed period tax: ' + str(expected_withholding))
self.assertPayrollEqual(cats.get('EE_US_SIT', 0.0), -expected_withholding)
def test_2020_taxes_example(self):
self._test_er_suta('CT', self.CT_UNEMP, date(2020, 1, 1), wage_base=self.CT_UNEMP_MAX_WAGE)
self._test_sit(10000.0, 'a', 0.0, 'weekly', date(2020, 1, 1), 693.23)
self._test_sit(12000.0, 'b', 15.0, 'bi-weekly', date(2020, 1, 1), 688.85)
self._test_sit(5000.0, 'f', 15.0, 'monthly', date(2020, 1, 1), 230.25)
self._test_sit(15000.0, 'c', 0.0, 'monthly', date(2020, 1, 1), 783.33)
self._test_sit(18000.0, 'b', 0.0, 'weekly', date(2020, 1, 1), 1254.35)

View File

@@ -0,0 +1,36 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from datetime import date, timedelta
from .common import TestUsPayslip
class TestUsDEPayslip(TestUsPayslip):
###
# 2020 Taxes and Rates
###
DE_UNEMP_MAX_WAGE = 16500.0
DE_UNEMP = 1.50
# Calculation based on section 17. https://revenue.delaware.gov/employers-guide-withholding-regulations-employers-duties/
def _test_sit(self, wage, filing_status, additional_withholding, dependents, schedule_pay, date_start, expected_withholding):
employee = self._createEmployee()
contract = self._createContract(employee,
wage=wage,
state_id=self.get_us_state('DE'),
de_w4_sit_filing_status=filing_status,
state_income_tax_additional_withholding=additional_withholding,
de_w4_sit_dependent=dependents,
schedule_pay=schedule_pay)
payslip = self._createPayslip(employee, date_start, date_start + timedelta(days=7))
payslip.compute_sheet()
cats = self._getCategories(payslip)
self._log('Computed period tax: ' + str(expected_withholding))
self.assertPayrollEqual(cats.get('EE_US_SIT', 0.0), -expected_withholding)
def test_2020_taxes_example(self):
self._test_er_suta('DE', self.DE_UNEMP, date(2020, 1, 1), wage_base=self.DE_UNEMP_MAX_WAGE)
self._test_sit(480.77, 'single', 0.0, 1.0, 'weekly', date(2020, 1, 1), 13.88)
self._test_sit(5000.0, 'single', 0.0, 2.0, 'monthly', date(2020, 1, 1), 211.93)
self._test_sit(5000.0, 'single', 10.0, 1.0, 'monthly', date(2020, 1, 1), 231.1)
self._test_sit(20000.0, 'married', 0.0, 3.0, 'quarterly', date(2020, 1, 1), 876.0)

View File

@@ -0,0 +1,93 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .common import TestUsPayslip, process_payslip
class TestUsHIPayslip(TestUsPayslip):
# TAXES AND RATES
HI_UNEMP_MAX_WAGE = 46800.00
HI_UNEMP = -(2.40 / 100.0)
def test_taxes_single_weekly(self):
salary = 375.00
schedule_pay = 'weekly'
filing_status = 'single'
allowances = 3
wh_to_check = -15.3
# Taxable income = (wage * payperiod ) - (allownaces * personal_exemption)
# taxable_income = (375 * 52) - (3 * 1144) = 16068
# Last = row[0] = 692
# withholding = row[1] + ((row[2] / 100.0) * (taxable_income - last))
# withholding = 682 + ((6.80 / 100.0 ) * (16068 - 14400)) = 795.42
# wh_to_check = 795.42/52 = 15.3
employee = self._createEmployee()
contract = self._createContract(employee,
wage=salary,
state_id=self.get_us_state('HI'),
hi_hw4_sit_filing_status=filing_status,
state_income_tax_additional_withholding=0.0,
hi_hw4_sit_allowances=allowances,
schedule_pay=schedule_pay)
self._log('2019 Hawaii tax first payslip single:')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], salary * self.HI_UNEMP)
self.assertPayrollEqual(cats['EE_US_SIT'], wh_to_check)
process_payslip(payslip)
remaining_id_unemp_wages = self.HI_UNEMP_MAX_WAGE - salary if (self.HI_UNEMP_MAX_WAGE - 2*salary < salary) \
else salary
self._log('2019 Hawaii tax second payslip single:')
payslip = self._createPayslip(employee, '2019-02-01', '2019-02-28')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], remaining_id_unemp_wages * self.HI_UNEMP)
def test_taxes_married_monthly(self):
salary = 5000.00
schedule_pay = 'monthly'
filing_status = 'married'
allowances = 2
wh_to_check = -287.1
# Taxable income = (wage * payperiod ) - (allownaces * personal_exemption)
# taxable_income = (5000 * 12) - (2 * 1144) = 57712
# Last = row[0] = 48000
# withholding = row[1] + ((row[2] / 100.0) * (taxable_income - last))
# withholding = 2707 + ((7.70 / 100.0 ) * (57712 - 48000)) = 3445.112
# wh_to_check = 3445.112/52 = 287.092
employee = self._createEmployee()
contract = self._createContract(employee,
wage=salary,
state_id=self.get_us_state('HI'),
hi_hw4_sit_filing_status=filing_status,
state_income_tax_additional_withholding=0.0,
hi_hw4_sit_allowances=allowances,
schedule_pay=schedule_pay)
self._log('2019 Hawaii tax first payslip monthly:')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], salary * self.HI_UNEMP)
self.assertPayrollEqual(cats['EE_US_SIT'], wh_to_check)
process_payslip(payslip)
remaining_id_unemp_wages = self.HI_UNEMP_MAX_WAGE - salary if (self.HI_UNEMP_MAX_WAGE - 2*salary < salary) \
else salary
self._log('2019 Hawaii tax second payslip monthly:')
payslip = self._createPayslip(employee, '2019-02-01', '2019-02-28')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], remaining_id_unemp_wages * self.HI_UNEMP)

View File

@@ -0,0 +1,35 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from datetime import date, timedelta
from .common import TestUsPayslip
class TestUsHIPayslip(TestUsPayslip):
###
# 2020 Taxes and Rates
###
HI_UNEMP_MAX_WAGE = 48100.00
HI_UNEMP = 2.4
def _test_sit(self, wage, filing_status, additional_withholding, allowances, schedule_pay, date_start, expected_withholding):
employee = self._createEmployee()
contract = self._createContract(employee,
wage=wage,
state_id=self.get_us_state('HI'),
hi_hw4_sit_filing_status=filing_status,
state_income_tax_additional_withholding=additional_withholding,
hi_hw4_sit_allowances=allowances,
schedule_pay=schedule_pay)
payslip = self._createPayslip(employee, date_start, date_start + timedelta(days=7))
payslip.compute_sheet()
cats = self._getCategories(payslip)
self._log('Computed period tax: ' + str(expected_withholding))
self.assertPayrollEqual(cats.get('EE_US_SIT', 0.0), -expected_withholding)
def test_2020_taxes_example(self):
self._test_er_suta('HI', self.HI_UNEMP, date(2020, 1, 1), wage_base=self.HI_UNEMP_MAX_WAGE)
self._test_sit(375.0, 'single', 0.0, 3.0, 'weekly', date(2020, 1, 1), 15.3)
self._test_sit(5000.0, 'married', 0.0, 2.0, 'monthly', date(2020, 1, 1), 287.1)
self._test_sit(5000.0, 'married', 10.0, 2.0, 'monthly', date(2020, 1, 1), 297.1)
self._test_sit(50000.0, 'head_of_household', 0.0, 3.0, 'weekly', date(2020, 1, 1), 3933.65)

View File

@@ -0,0 +1,152 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .common import TestUsPayslip, process_payslip
class TestUsIAPayslip(TestUsPayslip):
IA_UNEMP_MAX_WAGE = 30600
IA_UNEMP = -1.0 / 100.0
IA_INC_TAX = -0.0535
def test_taxes_weekly(self):
wages = 30000.00
schedule_pay = 'weekly'
allowances = 1
additional_wh = 0.00
employee = self._createEmployee()
contract = self._createContract(employee,
wage=wages,
state_id=self.get_us_state('IA'),
state_income_tax_additional_withholding=additional_wh,
ia_w4_sit_allowances=allowances,
schedule_pay=schedule_pay)
self._log('2019 Iowa tax first payslip weekly:')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
# T1 is the gross taxable wages for the pay period minus the Federal withholding amount. We add the federal
# withholding amount because it is calculated in the base US payroll module as a negative
# t1 = 30000 - (10399.66) = 19600.34
t1_to_test = wages + cats['EE_US_941_FIT']
self.assertPayrollAlmostEqual(t1_to_test, 19600.34)
# T2 is T1 minus our standard deduction which is a table of flat rates dependent on the number of allowances.
# In our case, we have a weekly period which on the table has a std deduct. of $32.50 for 0 or 1 allowances,
# and 80.00 of 2 or more allowances.
standard_deduction = 32.50 # The allowance tells us what standard_deduction amount to use.
# t2 = 19600.34 - 32.50 = 19567.84
t2_to_test = t1_to_test - standard_deduction
self.assertPayrollAlmostEqual(t2_to_test, 19567.84)
# T3 is T2 multiplied by the income rates in the large table plus a flat fee for that bracket.
# 1153.38 is the bracket floor. 8.53 is the rate, and 67.63 is the flat fee.
# t3 = 1638.38
t3_to_test = ((t2_to_test - 1153.38) * (8.53 / 100)) + 67.63
self.assertPayrollAlmostEqual(t3_to_test, 1638.38)
# T4 is T3 minus a flat amount determined by pay period * the number of deductions. For 2019, our weekly
# deduction amount per allowance is 0.77
# t4 = 1638.38 - 0.77 = 155.03
t4_to_test = t3_to_test - (0.77 * allowances)
self.assertPayrollAlmostEqual(t4_to_test, 1637.61)
# t5 is our T4 plus the additional withholding per period
# t5 = 1637.61 + 0.0
# Convert to negative as well.
t5_to_test = -t4_to_test - additional_wh
self.assertPayrollAlmostEqual(t5_to_test, -1637.61)
self.assertPayrollEqual(cats['ER_US_SUTA'], wages * self.IA_UNEMP)
self.assertPayrollEqual(cats['EE_US_SIT'], t5_to_test)
# Make a new payslip, this one will have maximums
remaining_IA_UNEMP_wages = self.IA_UNEMP_MAX_WAGE - wages if (self.IA_UNEMP_MAX_WAGE - 2*wages < wages) \
else wages
self._log('2019 Iowa tax second payslip weekly:')
payslip = self._createPayslip(employee, '2019-02-01', '2019-02-28')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], wages * self.IA_UNEMP)
def test_taxes_biweekly(self):
wages = 3000.00
schedule_pay = 'bi-weekly'
allowances = 1
additional_wh = 0.00
employee = self._createEmployee()
contract = self._createContract(employee,
wage=wages,
state_id=self.get_us_state('IA'),
state_income_tax_additional_withholding=additional_wh,
ia_w4_sit_allowances=allowances,
schedule_pay=schedule_pay)
self._log('2019 Iowa tax first payslip bi-weekly:')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
# T1 is the gross taxable wages for the pay period minus the Federal withholding amount. We add the federal
# withholding amount because it is calculated in the base US payroll module as a negative
t1_to_test = wages + cats['EE_US_941_FIT']
# T2 is T1 minus our standard deduction which is a table of flat rates dependent on the number of allowances.
# In our case, we have a biweekly period which on the table has a std deduct. of $65.00 for 0 or 1 allowances,
# and $160.00 of 2 or more allowances.
standard_deduction = 65.00 # The allowance tells us what standard_deduction amount to use.
t2_to_test = t1_to_test - standard_deduction
# T3 is T2 multiplied by the income rates in the large table plus a flat fee for that bracket.
t3_to_test = ((t2_to_test - 2306.77) * (8.53 / 100)) + 135.28
# T4 is T3 minus a flat amount determined by pay period * the number of deductions. For 2019, our weekly
# deduction amount per allowance is 0.77
t4_to_test = t3_to_test - (1.54 * allowances)
# t5 is our T4 plus the additional withholding per period
t5_to_test = -t4_to_test - additional_wh
self.assertPayrollEqual(cats['ER_US_SUTA'], wages * self.IA_UNEMP)
self.assertPayrollEqual(cats['EE_US_SIT'], t5_to_test - additional_wh)
process_payslip(payslip)
def test_taxes_with_external_weekly(self):
wages = 2500.00
schedule_pay = 'weekly'
allowances = 1
additional_wh = 0.00
employee = self._createEmployee()
contract = self._createContract(employee,
wage=wages,
state_id=self.get_us_state('IA'),
state_income_tax_additional_withholding=additional_wh,
ia_w4_sit_allowances=allowances,
schedule_pay=schedule_pay)
self._log('2019 Iowa external tax first payslip external weekly:')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
# T1 is the gross taxable wages for the pay period minus the Federal withholding amount. We add the federal
# withholding amount because it is calculated in the base US payroll module as a negative
t1_to_test = wages + cats['EE_US_941_FIT']
# T2 is T1 minus our standard deduction which is a table of flat rates dependent on the number of allowances.
# In our case, we have a weekly period which on the table has a std deduct. of $32.50 for 0 or 1 allowances,
# and 80.00 of 2 or more allowances.
standard_deduction = 32.50 # The allowance tells us what standard_deduction amount to use.
t2_to_test = t1_to_test - standard_deduction
# T3 is T2 multiplied by the income rates in the large table plus a flat fee for that bracket.
t3_to_test = ((t2_to_test - 1153.38) * (8.53 / 100)) + 67.63
# T4 is T3 minus a flat amount determined by pay period * the number of deductions. For 2019, our weekly
# deduction amount per allowance is 0.77
t4_to_test = t3_to_test - (0.77 * allowances)
# t5 is our T4 plus the additional withholding per period
t5_to_test = -t4_to_test - additional_wh
self.assertPayrollEqual(cats['ER_US_SUTA'], wages * self.IA_UNEMP)
self.assertPayrollAlmostEqual(cats['EE_US_SIT'], t5_to_test)
process_payslip(payslip)

View File

@@ -0,0 +1,33 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from datetime import date, timedelta
from .common import TestUsPayslip
class TestUsIAPayslip(TestUsPayslip):
###
# 2020 Taxes and Rates
###
IA_UNEMP_MAX_WAGE = 31600.00
IA_UNEMP = 1.0
def _test_sit(self, wage, additional_withholding, allowances, schedule_pay, date_start, expected_withholding):
employee = self._createEmployee()
contract = self._createContract(employee,
wage=wage,
state_id=self.get_us_state('IA'),
state_income_tax_additional_withholding=additional_withholding,
ia_w4_sit_allowances=allowances,
schedule_pay=schedule_pay)
payslip = self._createPayslip(employee, date_start, date_start + timedelta(days=7))
payslip.compute_sheet()
cats = self._getCategories(payslip)
self._log('Computed period tax: ' + str(expected_withholding))
self.assertPayrollEqual(cats.get('EE_US_SIT', 0.0), -expected_withholding)
def test_2020_taxes_example(self):
self._test_er_suta('IA', self.IA_UNEMP, date(2020, 1, 1), wage_base=self.IA_UNEMP_MAX_WAGE)
self._test_sit(3000.0, 0.0, 1.0, 'bi-weekly', date(2020, 1, 1), 146.68)
self._test_sit(3000.0, 10.0, 1.0, 'bi-weekly', date(2020, 1, 1), 156.68)
self._test_sit(30000.0, 0.0, 1.0, 'weekly', date(2020, 1, 1), 1640.04)

View File

@@ -0,0 +1,85 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from .common import TestUsPayslip, process_payslip
class TestUsIDPayslip(TestUsPayslip):
# TAXES AND RATES
ID_UNEMP_MAX_WAGE = 40000.00
ID_UNEMP = -(1.00 / 100.0)
def test_taxes_single_biweekly(self):
salary = 1212.00
schedule_pay = 'bi-weekly'
filing_status = 'single'
allowances = 4
# SEE https://tax.idaho.gov/i-1026.cfm?seg=compute for example calculations
wh_to_check = -10.00
employee = self._createEmployee()
contract = self._createContract(employee,
wage=salary,
state_id=self.get_us_state('ID'),
id_w4_sit_filing_status=filing_status,
id_w4_sit_allowances=allowances,
schedule_pay=schedule_pay)
self._log('2019 Idaho tax first payslip single:')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], salary * self.ID_UNEMP)
self.assertPayrollEqual(cats['EE_US_SIT'], wh_to_check)
process_payslip(payslip)
remaining_id_unemp_wages = self.ID_UNEMP_MAX_WAGE - salary if (self.ID_UNEMP_MAX_WAGE - 2*salary < salary) \
else salary
self._log('2019 Idaho tax second payslip single:')
payslip = self._createPayslip(employee, '2019-02-01', '2019-02-28')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], remaining_id_unemp_wages * self.ID_UNEMP)
def test_taxes_married_monthly(self):
salary = 5000.00
schedule_pay = 'monthly'
filing_status = 'married'
allowances = 2
# ICTCAT says monthly allowances are 246.67
# we have 2 so 246.67 * 2 = 493.34
# 5000.00 - 493.34 = 4506.66
# Wh is 89$ plus 6.925% over 3959,00
# 126.92545499999999 - > 127.0
wh_to_check = -127.0
employee = self._createEmployee()
contract = self._createContract(employee,
wage=salary,
state_id=self.get_us_state('ID'),
id_w4_sit_filing_status=filing_status,
id_w4_sit_allowances=allowances,
schedule_pay=schedule_pay)
self._log('2019 Idaho tax first payslip monthly:')
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], salary * self.ID_UNEMP)
self.assertPayrollEqual(cats['EE_US_SIT'], wh_to_check)
process_payslip(payslip)
remaining_id_unemp_wages = self.ID_UNEMP_MAX_WAGE - salary if (self.ID_UNEMP_MAX_WAGE - 2*salary < salary) \
else salary
self._log('2019 Idaho tax second payslip monthly:')
payslip = self._createPayslip(employee, '2019-02-01', '2019-02-28')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertPayrollEqual(cats['ER_US_SUTA'], remaining_id_unemp_wages * self.ID_UNEMP)

View File

@@ -0,0 +1,35 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from datetime import date, timedelta
from .common import TestUsPayslip
class TestUsIDPayslip(TestUsPayslip):
###
# 2020 Taxes and Rates
###
ID_UNEMP_MAX_WAGE = 41600.00
ID_UNEMP = 1.0
def _test_sit(self, wage, filing_status, allowances, schedule_pay, date_start, expected_withholding):
employee = self._createEmployee()
contract = self._createContract(employee,
wage=wage,
state_id=self.get_us_state('ID'),
id_w4_sit_filing_status=filing_status,
id_w4_sit_allowances=allowances,
schedule_pay=schedule_pay)
payslip = self._createPayslip(employee, date_start, date_start + timedelta(days=7))
payslip.compute_sheet()
cats = self._getCategories(payslip)
self._log('Computed period tax: ' + str(expected_withholding))
self.assertPayrollEqual(cats.get('EE_US_SIT', 0.0), -expected_withholding)
def test_2020_taxes_example(self):
self._test_er_suta('ID', self.ID_UNEMP, date(2020, 1, 1), wage_base=self.ID_UNEMP_MAX_WAGE)
self._test_sit(1212.0, 'single', 4.0, 'bi-weekly', date(2020, 1, 1), 10.0)
self._test_sit(10000.0, 'married', 1.0, 'annually', date(2020, 1, 1), 0.0)
self._test_sit(52000.0, 'married', 4.0, 'monthly', date(2020, 1, 1), 3348.02)
self._test_sit(5000.0, 'head of household', 0.0, 'semi-monthly', date(2020, 1, 1), 300.0)
self._test_sit(5900.0, 'single', 5.0, 'weekly', date(2020, 1, 1), 367.0)

View File

@@ -0,0 +1,13 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from datetime import date
from .common import TestUsPayslip
class TestUsNHPayslip(TestUsPayslip):
# TAXES AND RATES
NH_UNEMP_MAX_WAGE = 14000.00
NH_UNEMP = 1.2
def test_2020_taxes(self):
self._test_er_suta('NH', self.NH_UNEMP, date(2020, 1, 1), wage_base=self.NH_UNEMP_MAX_WAGE)

View File

@@ -0,0 +1,35 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from datetime import date, timedelta
from .common import TestUsPayslip
class TestUsNMPayslip(TestUsPayslip):
###
# 2020 Taxes and Rates
###
NM_UNEMP_MAX_WAGE = 25800.0
NM_UNEMP = 1.0
# Calculation based on section 17. https://s3.amazonaws.com/realFile34821a95-73ca-43e7-b06d-fad20f5183fd/a9bf1098-533b-4a3d-806a-4bf6336af6e4?response-content-disposition=filename%3D%22FYI-104+-+New+Mexico+Withholding+Tax+-+Effective+January+1%2C+2020.pdf%22&response-content-type=application%2Fpdf&AWSAccessKeyId=AKIAJBI25DHBYGD7I7TA&Signature=feu%2F1oJvU6BciRfKcoR0iNxoVZE%3D&Expires=1585159702
def _test_sit(self, wage, filing_status, additional_withholding, schedule_pay, date_start, expected_withholding):
employee = self._createEmployee()
contract = self._createContract(employee,
wage=wage,
state_id=self.get_us_state('NM'),
fed_941_fit_w4_filing_status=filing_status,
state_income_tax_additional_withholding=additional_withholding,
schedule_pay=schedule_pay)
payslip = self._createPayslip(employee, date_start, date_start + timedelta(days=7))
payslip.compute_sheet()
cats = self._getCategories(payslip)
self._log('Computed period tax: ' + str(expected_withholding))
self.assertPayrollEqual(cats.get('EE_US_SIT', 0.0), -expected_withholding)
def test_2020_taxes_example(self):
self._test_er_suta('NM', self.NM_UNEMP, date(2020, 1, 1), wage_base=self.NM_UNEMP_MAX_WAGE)
self._test_sit(1000.0, 'married', 0.0, 'weekly', date(2020, 1, 1), 29.47)
self._test_sit(1000.0, 'married', 10.0, 'weekly', date(2020, 1, 1), 39.47)
self._test_sit(25000.0, 'single', 0.0, 'bi-weekly', date(2020, 1, 1), 1202.60)
self._test_sit(25000.0, 'married_as_single', 0.0, 'monthly', date(2020, 1, 1), 1152.95)

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="res_config_settings_view_form_inherit" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="hr_payroll.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@data-key='hr_payroll']" position="inside">
<div class="row mt16 o_settings_container" id="hr_payroll_accountant">
<div class="col-lg-6 col-12 o_setting_box">
<div class="o_setting_right_pane">
<span class="o_form_label">Payslip Sum Behavior</span>
<div class="text-muted">
Customize the behavior of what payslips are eligible when summing over date ranges in rules.
Generally, "Date To" or "Accounting Date" would be preferred in the United States and anywhere
else where the ending date on the payslip is used to calculate wage bases.
</div>
<div class="content-group">
<div class="row mt16" id="mail_alias_domain">
<label for="payslip_sum_type" class="col-lg-3 o_light_label"/>
<field name="payslip_sum_type"/>
</div>
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

View File

@@ -44,6 +44,13 @@
<field name="workers_comp_er_code"/>
</group>
<group name="state_al_alabama" string="AL Alabama" attrs="{'invisible':[('state_id', '!=', %(base.state_us_1)s)]}">
<p colspan="2"><h3>Form A4 - State Income Tax</h3></p>
<field name="al_a4_sit_exemptions" string="Withholding Exemptions 1. 2. 3."/>
<field name="al_a4_sit_dependents" string="Dependents 4."/>
<field name="state_income_tax_additional_withholding" string="Additional Withholding 5."/>
<field name="state_income_tax_exempt" string="Exempt 6."/>
</group>
<group name="state_ar_arkansas" string="AR Arkansas" attrs="{'invisible':[('state_id', '!=', %(base.state_us_4)s)]}">
<p colspan="2"><h3>Form AR4EC - State Income Tax</h3></p>
<field name="ar_ar4ec_sit_allowances" string="Allowances 3."/>
@@ -55,6 +62,29 @@
<field name="az_a4_sit_withholding_percentage" string="Withholding Percentage 1."/>
<field name="state_income_tax_additional_withholding" string="Additional Withholding 2."/>
</group>
<group name="state_ca_california" string="CA California" attrs="{'invisible':[('state_id', '!=', %(base.state_us_5)s)]}">
<p colspan="2"><h3>Form W-4 - State Income Tax</h3></p>
<field name="ca_de4_sit_filing_status" string="Filing Status 1(c)."/>
<field name="ca_de4_sit_allowances" string="Allowances 3."/>
<field name="ca_de4_sit_additional_allowances" string="Additional Allowances 4(c)."/>
<field name="state_income_tax_additional_withholding" string="Additional Withholding 2."/>
</group>
<group name="state_co_colorado" string="CO Colorado" attrs="{'invisible':[('state_id', '!=', %(base.state_us_6)s)]}">
<p colspan="2"><h3>Form W-4 - State Income Tax</h3></p>
<field name="state_income_tax_additional_withholding" string="Additional Withholding 1."/>
<field name="state_income_tax_exempt" string="State Exempt"/>
</group>
<group name="state_de_delaware" string="DE Delaware" attrs="{'invisible':[('state_id', '!=', %(base.state_us_8)s)]}">
<p colspan="2"><h3>Form DE W-4 - State Income Tax</h3></p>
<field name="de_w4_sit_filing_status" string="Marital Status 3."/>
<field name="de_w4_sit_dependent" string="Dependents Allowances 4."/>
<field name="state_income_tax_additional_withholding" string="Additional Withholding 5."/>
</group>
<group name="state_ct_connecticut" string="CT Connecticut" attrs="{'invisible':[('state_id', '!=', %(base.state_us_7)s)]}">
<p colspan="2"><h3>Form CT-W4 - State Income Tax</h3></p>
<field name="ct_w4na_sit_code" string="Withholding Code 1."/>
<field name="state_income_tax_additional_withholding" string="Additional Withholding 2."/>
</group>
<group name="state_fl_florida" string="FL Florida" attrs="{'invisible':[('state_id', '!=', %(base.state_us_10)s)]}">
<p colspan="2"><h3>No additional fields.</h3></p>
</group>
@@ -66,6 +96,23 @@
<field name="state_income_tax_additional_withholding" string="Additional Withholding 6."/>
<field name="state_income_tax_exempt" string="Exempt 8."/>
</group>
<group name="state_hi_hawaii" string="HI Hawaii" attrs="{'invisible':[('state_id', '!=', %(base.state_us_12)s)]}">
<p colspan="2"><h3>Form HI HW-4 - State Income Tax</h3></p>
<field name="hi_hw4_sit_filing_status" string="Marital Status 3."/>
<field name="hi_hw4_sit_allowances" string="Allowances 4."/>
<field name="state_income_tax_additional_withholding" string="Additional Withholding 5."/>
</group>
<group name="state_ia_iowa" string="IA Iowa" attrs="{'invisible':[('state_id', '!=', %(base.state_us_16)s)]}">
<p colspan="2"><h3>Form IA W-4 - State Income Tax</h3></p>
<field name="ia_w4_sit_allowances" string="Allowances 6."/>
<field name="state_income_tax_additional_withholding" string="Additional Withholding 7."/>
<field name="state_income_tax_exempt" string="Exempt"/>
</group>
<group name="state_id_idaho" string="ID Idaho" attrs="{'invisible':[('state_id', '!=', %(base.state_us_13)s)]}">
<p colspan="2"><h3>Form ID W-4 - State Income Tax</h3></p>
<field name="id_w4_sit_filing_status" string="Withholding Status A.B.C."/>
<field name="id_w4_sit_allowances" string="Allowances 1."/>
</group>
<group name="state_il_illinois" string="IL Illinois" attrs="{'invisible':[('state_id', '!=', %(base.state_us_14)s)]}">
<p colspan="2"><h3>Form IL-W-4 - State Income Tax</h3></p>
<field name="il_w4_sit_basic_allowances" string="Basic Allowances Step 1."/>
@@ -108,6 +155,9 @@
<field name="nc_nc4_sit_allowances" string="Allowances 1."/>
<field name="state_income_tax_additional_withholding" string="Additional Withholding 2."/>
</group>
<group name="state_nh_new_hampshire" string="NH New Hampshire" attrs="{'invisible':[('state_id', '!=', %(base.state_us_24)s)]}">
<p colspan="2"><h3>No additional fields.</h3></p>
</group>
<group name="state_nj_newjersey" string="NJ New Jersey" attrs="{'invisible':[('state_id', '!=', %(base.state_us_25)s)]}">
<p colspan="2"><h3>Form NJ-W4 - State Income Tax</h3></p>
<field name="nj_njw4_sit_filing_status" string="Filing Status 2."/>
@@ -115,6 +165,10 @@
<field name="nj_njw4_sit_allowances" string="Allowances 4."/>
<field name="state_income_tax_additional_withholding" string="Additional Withholding 5."/>
</group>
<group name="state_nm_new_mexico" string="NM New Mexico" attrs="{'invisible':[('state_id', '!=', %(base.state_us_26)s)]}">
<p colspan="2"><h3>Form NM W-4 - State Income Tax</h3></p>
<field name="state_income_tax_additional_withholding" string="Additional Withholding 7."/>
</group>
<group name="state_oh_ohio" string="OH Ohio" attrs="{'invisible':[('state_id', '!=', %(base.state_us_30)s)]}">
<p colspan="2"><h3>Form IT-4 - State Income Tax</h3></p>
<field name="state_income_tax_exempt"/>