mirror of
https://gitlab.com/hibou-io/hibou-odoo/suite.git
synced 2025-01-20 12:37:31 +02:00
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:
@@ -1,3 +1,12 @@
|
|||||||
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
|
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
|
||||||
|
|
||||||
from . import models
|
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');")
|
||||||
|
|||||||
@@ -28,10 +28,19 @@ USA Payroll Rules.
|
|||||||
'data/federal/fed_941_fica_rules.xml',
|
'data/federal/fed_941_fica_rules.xml',
|
||||||
'data/federal/fed_941_fit_parameters.xml',
|
'data/federal/fed_941_fit_parameters.xml',
|
||||||
'data/federal/fed_941_fit_rules.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/ar_arkansas.xml',
|
||||||
'data/state/az_arizona.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/fl_florida.xml',
|
||||||
'data/state/ga_georgia.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/il_illinois.xml',
|
||||||
'data/state/mi_michigan.xml',
|
'data/state/mi_michigan.xml',
|
||||||
'data/state/mn_minnesota.xml',
|
'data/state/mn_minnesota.xml',
|
||||||
@@ -39,7 +48,9 @@ USA Payroll Rules.
|
|||||||
'data/state/ms_mississippi.xml',
|
'data/state/ms_mississippi.xml',
|
||||||
'data/state/mt_montana.xml',
|
'data/state/mt_montana.xml',
|
||||||
'data/state/nc_northcarolina.xml',
|
'data/state/nc_northcarolina.xml',
|
||||||
|
'data/state/nh_new_hampshire.xml',
|
||||||
'data/state/nj_newjersey.xml',
|
'data/state/nj_newjersey.xml',
|
||||||
|
'data/state/nm_new_mexico.xml',
|
||||||
'data/state/oh_ohio.xml',
|
'data/state/oh_ohio.xml',
|
||||||
'data/state/pa_pennsylvania.xml',
|
'data/state/pa_pennsylvania.xml',
|
||||||
'data/state/tx_texas.xml',
|
'data/state/tx_texas.xml',
|
||||||
@@ -47,8 +58,13 @@ USA Payroll Rules.
|
|||||||
'data/state/wa_washington.xml',
|
'data/state/wa_washington.xml',
|
||||||
'data/final.xml',
|
'data/final.xml',
|
||||||
'views/hr_contract_views.xml',
|
'views/hr_contract_views.xml',
|
||||||
|
'views/res_config_settings_views.xml',
|
||||||
'views/us_payroll_config_views.xml',
|
'views/us_payroll_config_views.xml',
|
||||||
],
|
],
|
||||||
'installable': True,
|
'installable': True,
|
||||||
|
'demo': [
|
||||||
|
],
|
||||||
|
'auto_install': False,
|
||||||
|
'post_init_hook': '_post_install_hook',
|
||||||
'license': 'OPL-1',
|
'license': 'OPL-1',
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,17 +16,46 @@
|
|||||||
|
|
||||||
ref('hr_payroll_rule_ee_fed_941_fit'),
|
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_er_us_ar_suta'),
|
||||||
ref('hr_payroll_rule_ee_us_ar_sit'),
|
ref('hr_payroll_rule_ee_us_ar_sit'),
|
||||||
|
|
||||||
ref('hr_payroll_rule_er_us_az_suta'),
|
ref('hr_payroll_rule_er_us_az_suta'),
|
||||||
ref('hr_payroll_rule_ee_us_az_sit'),
|
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_fl_suta'),
|
||||||
|
|
||||||
ref('hr_payroll_rule_er_us_ga_suta'),
|
ref('hr_payroll_rule_er_us_ga_suta'),
|
||||||
ref('hr_payroll_rule_ee_us_ga_sit'),
|
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_er_us_il_suta'),
|
||||||
ref('hr_payroll_rule_ee_us_il_sit'),
|
ref('hr_payroll_rule_ee_us_il_sit'),
|
||||||
|
|
||||||
@@ -49,6 +78,8 @@
|
|||||||
ref('hr_payroll_rule_er_us_nc_suta'),
|
ref('hr_payroll_rule_er_us_nc_suta'),
|
||||||
ref('hr_payroll_rule_ee_us_nc_sit'),
|
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_er_us_nj_suta'),
|
||||||
ref('hr_payroll_rule_ee_us_nj_suta'),
|
ref('hr_payroll_rule_ee_us_nj_suta'),
|
||||||
ref('hr_payroll_rule_er_us_nj_sdi'),
|
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_fli'),
|
||||||
ref('hr_payroll_rule_ee_us_nj_sit'),
|
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_er_us_oh_suta'),
|
||||||
ref('hr_payroll_rule_ee_us_oh_sit'),
|
ref('hr_payroll_rule_ee_us_oh_sit'),
|
||||||
|
|
||||||
|
|||||||
88
l10n_us_hr_payroll/data/state/ak_alaska.xml
Normal file
88
l10n_us_hr_payroll/data/state/ak_alaska.xml
Normal 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>
|
||||||
179
l10n_us_hr_payroll/data/state/al_alabama.xml
Normal file
179
l10n_us_hr_payroll/data/state/al_alabama.xml
Normal 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>
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
<field name="name">US Arizona - Department of Revenue (ADOR) - Income Tax</field>
|
<field name="name">US Arizona - Department of Revenue (ADOR) - Income Tax</field>
|
||||||
</record>
|
</record>
|
||||||
<record id="contrib_register_us_az_dor_sit" model="hr.contribution.register">
|
<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"/>
|
<field name="partner_id" ref="res_partner_us_az_dor_sit"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|||||||
336
l10n_us_hr_payroll/data/state/ca_california.xml
Normal file
336
l10n_us_hr_payroll/data/state/ca_california.xml
Normal 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>
|
||||||
89
l10n_us_hr_payroll/data/state/co_colorado.xml
Normal file
89
l10n_us_hr_payroll/data/state/co_colorado.xml
Normal 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>
|
||||||
1212
l10n_us_hr_payroll/data/state/ct_connecticut.xml
Normal file
1212
l10n_us_hr_payroll/data/state/ct_connecticut.xml
Normal file
File diff suppressed because it is too large
Load Diff
107
l10n_us_hr_payroll/data/state/de_delaware.xml
Normal file
107
l10n_us_hr_payroll/data/state/de_delaware.xml
Normal 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>
|
||||||
121
l10n_us_hr_payroll/data/state/hi_hawaii.xml
Normal file
121
l10n_us_hr_payroll/data/state/hi_hawaii.xml
Normal 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>
|
||||||
168
l10n_us_hr_payroll/data/state/ia_iowa.xml
Normal file
168
l10n_us_hr_payroll/data/state/ia_iowa.xml
Normal 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>
|
||||||
170
l10n_us_hr_payroll/data/state/id_idaho.xml
Normal file
170
l10n_us_hr_payroll/data/state/id_idaho.xml
Normal 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>
|
||||||
@@ -65,6 +65,7 @@
|
|||||||
<!-- Partners and Contribution Registers -->
|
<!-- Partners and Contribution Registers -->
|
||||||
<record id="res_partner_us_il_dor" model="res.partner">
|
<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="name">US Illinois - Department of Economic Security (IDES) - Unemployment Tax</field>
|
||||||
|
<field name="supplier">1</field>
|
||||||
</record>
|
</record>
|
||||||
<record id="contrib_register_us_il_dor" model="hr.contribution.register">
|
<record id="contrib_register_us_il_dor" model="hr.contribution.register">
|
||||||
<field name="name">US Illinois - Department of Economic Security (IDES) - Unemployment Tax</field>
|
<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">
|
<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="name">US Illinois - Department of Revenue (IDOR) - Income Tax</field>
|
||||||
|
<field name="supplier">1</field>
|
||||||
</record>
|
</record>
|
||||||
<record id="contrib_register_us_il_dor_sit" model="hr.contribution.register">
|
<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"/>
|
<field name="partner_id" ref="res_partner_us_il_dor_sit"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|||||||
47
l10n_us_hr_payroll/data/state/nh_new_hampshire.xml
Normal file
47
l10n_us_hr_payroll/data/state/nh_new_hampshire.xml
Normal 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>
|
||||||
107
l10n_us_hr_payroll/data/state/nm_new_mexico.xml
Normal file
107
l10n_us_hr_payroll/data/state/nm_new_mexico.xml
Normal 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>
|
||||||
@@ -9,6 +9,11 @@ FIELDS_CONTRACT_TO_US_PAYROLL_FORMS_2020 = {
|
|||||||
'fica_exempt': 'fed_941_fica_exempt',
|
'fica_exempt': 'fed_941_fica_exempt',
|
||||||
'futa_type': 'fed_940_type',
|
'futa_type': 'fed_940_type',
|
||||||
# State
|
# 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_allowances': 'ar_ar4ec_sit_allowances',
|
||||||
'ar_w4_tax_exempt': 'state_income_tax_exempt',
|
'ar_w4_tax_exempt': 'state_income_tax_exempt',
|
||||||
'ar_w4_additional_wh': 'state_income_tax_additional_withholding',
|
'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_withholding_percentage': 'az_a4_sit_withholding_percentage',
|
||||||
'az_a4_additional_withholding': 'state_income_tax_additional_withholding',
|
'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_filing_status': 'ga_g4_sit_filing_status',
|
||||||
'ga_g4_dependent_allowances': 'ga_g4_sit_dependent_allowances',
|
'ga_g4_dependent_allowances': 'ga_g4_sit_dependent_allowances',
|
||||||
'ga_g4_additional_allowances': 'ga_g4_sit_additional_allowances',
|
'ga_g4_additional_allowances': 'ga_g4_sit_additional_allowances',
|
||||||
'ga_g4_additional_wh': 'state_income_tax_additional_withholding',
|
'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_basic_allowances': 'il_w4_sit_basic_allowances',
|
||||||
'il_w4_additional_allowances': 'il_w4_sit_additional_allowances',
|
'il_w4_additional_allowances': 'il_w4_sit_additional_allowances',
|
||||||
'il_w4_additional_wh': 'state_income_tax_additional_withholding',
|
'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_futa_wages_2018',
|
||||||
'l10n_us_hr_payroll.hr_payroll_rules_fed_inc_withhold_2018_married',
|
'l10n_us_hr_payroll.hr_payroll_rules_fed_inc_withhold_2018_married',
|
||||||
# State
|
# 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_wages',
|
||||||
'l10n_us_ar_hr_payroll.hr_payroll_ar_unemp',
|
'l10n_us_ar_hr_payroll.hr_payroll_ar_unemp',
|
||||||
'l10n_us_ar_hr_payroll.hr_payroll_ar_income_withhold',
|
'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_az_income_withhold',
|
||||||
'l10n_us_az_hr_payroll.hr_payroll_rules_az_unemp_wages',
|
'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_wages',
|
||||||
'l10n_us_fl_hr_payroll.hr_payroll_fl_unemp',
|
'l10n_us_fl_hr_payroll.hr_payroll_fl_unemp',
|
||||||
'l10n_us_fl_hr_payroll.hr_payroll_rules_fl_unemp_wages_2018',
|
'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_ga_income_withhold',
|
||||||
'l10n_us_ga_hr_payroll.hr_payroll_rules_ga_unemp_wages',
|
'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_wages',
|
||||||
'l10n_us_il_hr_payroll.hr_payroll_il_unemp',
|
'l10n_us_il_hr_payroll.hr_payroll_il_unemp',
|
||||||
'l10n_us_il_hr_payroll.hr_payroll_il_income_withhold',
|
'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_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',
|
'l10n_us_hr_payroll.hr_payroll_rules_fed_inc_withhold_2018_single': 'l10n_us_hr_payroll.hr_payroll_rule_ee_fed_941_fit',
|
||||||
# State
|
# 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_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.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',
|
'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_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_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.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.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',
|
'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_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_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_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.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',
|
'l10n_us_il_hr_payroll.contrib_register_il_des_unemp': 'l10n_us_hr_payroll.contrib_register_us_il_dor',
|
||||||
|
|||||||
@@ -3,4 +3,5 @@
|
|||||||
from . import hr_contract
|
from . import hr_contract
|
||||||
from . import hr_payslip
|
from . import hr_payslip
|
||||||
from . import hr_salary_rule
|
from . import hr_salary_rule
|
||||||
|
from . import res_config_settings
|
||||||
from . import us_payroll_config
|
from . import us_payroll_config
|
||||||
|
|||||||
@@ -203,6 +203,8 @@ def ee_us_941_fit(payslip, categories, worked_days, inputs):
|
|||||||
|
|
||||||
schedule_pay = payslip.dict.contract_id.schedule_pay
|
schedule_pay = payslip.dict.contract_id.schedule_pay
|
||||||
wage = fit_wage(payslip, categories)
|
wage = fit_wage(payslip, categories)
|
||||||
|
if not wage:
|
||||||
|
return 0.0, 0.0
|
||||||
|
|
||||||
#_logger.warn('initial gross wage: ' + str(wage))
|
#_logger.warn('initial gross wage: ' + str(wage))
|
||||||
year = payslip.dict.get_year()
|
year = payslip.dict.get_year()
|
||||||
|
|||||||
@@ -14,9 +14,17 @@ from .federal.fed_941 import ee_us_941_fica_ss, \
|
|||||||
from .state.general import general_state_unemployment, \
|
from .state.general import general_state_unemployment, \
|
||||||
general_state_income_withholding, \
|
general_state_income_withholding, \
|
||||||
is_us_state
|
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.ar_arkansas import ar_arkansas_state_income_withholding
|
||||||
from .state.az_arizona import az_arizona_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.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.il_illinois import il_illinois_state_income_withholding
|
||||||
from .state.mi_michigan import mi_michigan_state_income_withholding
|
from .state.mi_michigan import mi_michigan_state_income_withholding
|
||||||
from .state.mn_minnesota import mn_minnesota_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.mt_montana import mt_montana_state_income_withholding
|
||||||
from .state.nc_northcarolina import nc_northcarolina_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.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.oh_ohio import oh_ohio_state_income_withholding
|
||||||
from .state.va_virginia import va_virginia_state_income_withholding
|
from .state.va_virginia import va_virginia_state_income_withholding
|
||||||
from .state.wa_washington import wa_washington_fml_er, \
|
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_unemployment': general_state_unemployment,
|
||||||
'general_state_income_withholding': general_state_income_withholding,
|
'general_state_income_withholding': general_state_income_withholding,
|
||||||
'is_us_state': is_us_state,
|
'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,
|
'ar_arkansas_state_income_withholding': ar_arkansas_state_income_withholding,
|
||||||
'az_arizona_state_income_withholding': az_arizona_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,
|
'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,
|
'il_illinois_state_income_withholding': il_illinois_state_income_withholding,
|
||||||
'mi_michigan_state_income_withholding': mi_michigan_state_income_withholding,
|
'mi_michigan_state_income_withholding': mi_michigan_state_income_withholding,
|
||||||
'mn_minnesota_state_income_withholding': mn_minnesota_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,
|
'mt_montana_state_income_withholding': mt_montana_state_income_withholding,
|
||||||
'nc_northcarolina_state_income_withholding': nc_northcarolina_state_income_withholding,
|
'nc_northcarolina_state_income_withholding': nc_northcarolina_state_income_withholding,
|
||||||
'nj_newjersey_state_income_withholding': nj_newjersey_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,
|
'oh_ohio_state_income_withholding': oh_ohio_state_income_withholding,
|
||||||
'va_virginia_state_income_withholding': va_virginia_state_income_withholding,
|
'va_virginia_state_income_withholding': va_virginia_state_income_withholding,
|
||||||
'wa_washington_fml_er': wa_washington_fml_er,
|
'wa_washington_fml_er': wa_washington_fml_er,
|
||||||
@@ -98,34 +116,52 @@ class HRPayslip(models.Model):
|
|||||||
self.employee_id = employee_id
|
self.employee_id = employee_id
|
||||||
self.dict = dict
|
self.dict = dict
|
||||||
self.env = env
|
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):
|
def __getattr__(self, attr):
|
||||||
return attr in self.dict and self.dict.__getitem__(attr) or 0.0
|
return attr in self.dict and self.dict.__getitem__(attr) or 0.0
|
||||||
|
|
||||||
|
def _compile_browsable_query(self, sum_field):
|
||||||
|
pass
|
||||||
|
|
||||||
class InputLine(BrowsableObject):
|
class InputLine(BrowsableObject):
|
||||||
"""a class that will be used into the python code, mainly for usability purposes"""
|
"""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:
|
def _compile_browsable_query(self, sum_field):
|
||||||
to_date = fields.Date.today()
|
self.__browsable_query = """
|
||||||
self.env.cr.execute("""
|
|
||||||
SELECT sum(amount) as sum
|
SELECT sum(amount) as sum
|
||||||
FROM hr_payslip as hp, hr_payslip_input as pi
|
FROM hr_payslip as hp, hr_payslip_input as pi
|
||||||
WHERE hp.employee_id = %s AND hp.state = 'done'
|
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""",
|
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)
|
||||||
(self.employee_id, from_date, to_date, code))
|
|
||||||
|
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
|
return self.env.cr.fetchone()[0] or 0.0
|
||||||
|
|
||||||
class WorkedDays(BrowsableObject):
|
class WorkedDays(BrowsableObject):
|
||||||
"""a class that will be used into the python code, mainly for usability purposes"""
|
"""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:
|
def _compile_browsable_query(self, sum_field):
|
||||||
to_date = fields.Date.today()
|
self.__browsable_query = """
|
||||||
self.env.cr.execute("""
|
|
||||||
SELECT sum(number_of_days) as number_of_days, sum(number_of_hours) as number_of_hours
|
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
|
FROM hr_payslip as hp, hr_payslip_worked_days as pi
|
||||||
WHERE hp.employee_id = %s AND hp.state = 'done'
|
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""",
|
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)
|
||||||
(self.employee_id, from_date, to_date, code))
|
|
||||||
|
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()
|
return self.env.cr.fetchone()
|
||||||
|
|
||||||
def sum(self, code, from_date, to_date=None):
|
def sum(self, code, from_date, to_date=None):
|
||||||
@@ -139,28 +175,37 @@ class HRPayslip(models.Model):
|
|||||||
class Payslips(BrowsableObject):
|
class Payslips(BrowsableObject):
|
||||||
"""a class that will be used into the python code, mainly for usability purposes"""
|
"""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):
|
def sum(self, code, from_date, to_date=None):
|
||||||
if to_date is None:
|
if to_date is None:
|
||||||
to_date = fields.Date.today()
|
to_date = fields.Date.today()
|
||||||
self.env.cr.execute("""SELECT sum(case when hp.credit_note = False then (pl.total) else (-pl.total) end)
|
self.env.cr.execute(self.__browsable_query_rule, (self.employee_id, from_date, to_date, code))
|
||||||
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))
|
|
||||||
res = self.env.cr.fetchone()
|
res = self.env.cr.fetchone()
|
||||||
return res and res[0] or 0.0
|
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):
|
def sum_category(self, code, from_date, to_date=None):
|
||||||
# Hibou Backport
|
# Hibou Backport
|
||||||
if to_date is None:
|
if to_date is None:
|
||||||
to_date = fields.Date.today()
|
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)
|
self.env.cr.execute(self.__browsable_query_category, (self.employee_id, from_date, to_date, code))
|
||||||
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))
|
|
||||||
res = self.env.cr.fetchone()
|
res = self.env.cr.fetchone()
|
||||||
return res and res[0] or 0.0
|
return res and res[0] or 0.0
|
||||||
|
|
||||||
|
|||||||
24
l10n_us_hr_payroll/models/res_config_settings.py
Normal file
24
l10n_us_hr_payroll/models/res_config_settings.py
Normal 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')
|
||||||
77
l10n_us_hr_payroll/models/state/al_alabama.py
Normal file
77
l10n_us_hr_payroll/models/state/al_alabama.py
Normal 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)
|
||||||
98
l10n_us_hr_payroll/models/state/ca_california.py
Normal file
98
l10n_us_hr_payroll/models/state/ca_california.py
Normal 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)
|
||||||
45
l10n_us_hr_payroll/models/state/co_colorado.py
Normal file
45
l10n_us_hr_payroll/models/state/co_colorado.py
Normal 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)
|
||||||
76
l10n_us_hr_payroll/models/state/ct_connecticut.py
Normal file
76
l10n_us_hr_payroll/models/state/ct_connecticut.py
Normal 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)
|
||||||
49
l10n_us_hr_payroll/models/state/de_delaware.py
Normal file
49
l10n_us_hr_payroll/models/state/de_delaware.py
Normal 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)
|
||||||
43
l10n_us_hr_payroll/models/state/hi_hawaii.py
Normal file
43
l10n_us_hr_payroll/models/state/hi_hawaii.py
Normal 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)
|
||||||
44
l10n_us_hr_payroll/models/state/ia_iowa.py
Normal file
44
l10n_us_hr_payroll/models/state/ia_iowa.py
Normal 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)
|
||||||
41
l10n_us_hr_payroll/models/state/id_idaho.py
Normal file
41
l10n_us_hr_payroll/models/state/id_idaho.py
Normal 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)
|
||||||
40
l10n_us_hr_payroll/models/state/nm_new_mexico.py
Normal file
40
l10n_us_hr_payroll/models/state/nm_new_mexico.py
Normal 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)
|
||||||
@@ -51,12 +51,46 @@ class HRContractUSPayrollConfig(models.Model):
|
|||||||
fed_941_fit_w4_additional_withholding = fields.Float(string='Federal W4 Additional Withholding [4(c)]',
|
fed_941_fit_w4_additional_withholding = fields.Float(string='Federal W4 Additional Withholding [4(c)]',
|
||||||
help='Form W4 (2020+) 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.')
|
ar_ar4ec_sit_allowances = fields.Integer(string='Arkansas AR4EC allowances', help='AR4EC 3.')
|
||||||
|
|
||||||
az_a4_sit_withholding_percentage = fields.Float(
|
az_a4_sit_withholding_percentage = fields.Float(
|
||||||
string='Arizona A-4 Withholding Percentage',
|
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.')
|
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([
|
ga_g4_sit_filing_status = fields.Selection([
|
||||||
('exempt', 'Exempt'),
|
('exempt', 'Exempt'),
|
||||||
('single', 'Single'),
|
('single', 'Single'),
|
||||||
@@ -70,6 +104,23 @@ class HRContractUSPayrollConfig(models.Model):
|
|||||||
ga_g4_sit_additional_allowances = fields.Integer(string='Georgia G-4 Additional Allowances',
|
ga_g4_sit_additional_allowances = fields.Integer(string='Georgia G-4 Additional Allowances',
|
||||||
help='G-4 5.')
|
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_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.')
|
il_w4_sit_additional_allowances = fields.Integer(string='Illinois IL-W-4 Number of Additional Allowances', help='IL-W-4 Step 2.')
|
||||||
|
|
||||||
|
|||||||
@@ -1,21 +1,49 @@
|
|||||||
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
|
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
|
||||||
|
|
||||||
from . import common
|
from . import common
|
||||||
|
|
||||||
|
from . import test_special
|
||||||
|
|
||||||
from . import test_us_payslip_2019
|
from . import test_us_payslip_2019
|
||||||
from . import test_us_payslip_2020
|
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_2019
|
||||||
from . import test_us_ar_arkansas_payslip_2020
|
from . import test_us_ar_arkansas_payslip_2020
|
||||||
|
|
||||||
from . import test_us_az_arizona_payslip_2019
|
from . import test_us_az_arizona_payslip_2019
|
||||||
from . import test_us_az_arizona_payslip_2020
|
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_2019
|
||||||
from . import test_us_fl_florida_payslip_2020
|
from . import test_us_fl_florida_payslip_2020
|
||||||
|
|
||||||
from . import test_us_ga_georgia_payslip_2019
|
from . import test_us_ga_georgia_payslip_2019
|
||||||
from . import test_us_ga_georgia_payslip_2020
|
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_2019
|
||||||
from . import test_us_il_illinois_payslip_2020
|
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_2019
|
||||||
from . import test_us_nc_northcarolina_payslip_2020
|
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_2019
|
||||||
from . import test_us_nj_newjersey_payslip_2020
|
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_2019
|
||||||
from . import test_us_oh_ohio_payslip_2020
|
from . import test_us_oh_ohio_payslip_2020
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,10 @@ class TestUsPayslip(common.TransactionCase):
|
|||||||
debug = False
|
debug = False
|
||||||
_logger = getLogger(__name__)
|
_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
|
float_info = sys_float_info
|
||||||
|
|
||||||
def float_round(self, value, digits):
|
def float_round(self, value, digits):
|
||||||
@@ -154,15 +158,6 @@ class TestUsPayslip(common.TransactionCase):
|
|||||||
def assertPayrollAlmostEqual(self, first, second):
|
def assertPayrollAlmostEqual(self, first, second):
|
||||||
self.assertAlmostEqual(first, second, self.payroll_digits-1)
|
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={}):
|
def get_us_state(self, code, cache={}):
|
||||||
country_key = 'US_COUNTRY'
|
country_key = 'US_COUNTRY'
|
||||||
if code in cache:
|
if code in cache:
|
||||||
|
|||||||
66
l10n_us_hr_payroll/tests/test_special.py
Normal file
66
l10n_us_hr_payroll/tests/test_special.py
Normal 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)
|
||||||
61
l10n_us_hr_payroll/tests/test_us_ak_alaska_payslip_2019.py
Normal file
61
l10n_us_hr_payroll/tests/test_us_ak_alaska_payslip_2019.py
Normal 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)
|
||||||
15
l10n_us_hr_payroll/tests/test_us_ak_alaska_payslip_2020.py
Normal file
15
l10n_us_hr_payroll/tests/test_us_ak_alaska_payslip_2020.py
Normal 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)
|
||||||
264
l10n_us_hr_payroll/tests/test_us_al_alabama_payslip_2019.py
Normal file
264
l10n_us_hr_payroll/tests/test_us_al_alabama_payslip_2019.py
Normal 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)
|
||||||
36
l10n_us_hr_payroll/tests/test_us_al_alabama_payslip_2020.py
Normal file
36
l10n_us_hr_payroll/tests/test_us_al_alabama_payslip_2020.py
Normal 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)
|
||||||
245
l10n_us_hr_payroll/tests/test_us_ca_california_payslip_2019.py
Normal file
245
l10n_us_hr_payroll/tests/test_us_ca_california_payslip_2019.py
Normal 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)
|
||||||
42
l10n_us_hr_payroll/tests/test_us_ca_california_payslip_2020.py
Executable file
42
l10n_us_hr_payroll/tests/test_us_ca_california_payslip_2020.py
Executable 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)
|
||||||
36
l10n_us_hr_payroll/tests/test_us_co_colorado_payslip_2020.py
Executable file
36
l10n_us_hr_payroll/tests/test_us_co_colorado_payslip_2020.py
Executable 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)
|
||||||
121
l10n_us_hr_payroll/tests/test_us_ct_connecticut_payslip_2019.py
Normal file
121
l10n_us_hr_payroll/tests/test_us_ct_connecticut_payslip_2019.py
Normal 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)
|
||||||
@@ -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)
|
||||||
36
l10n_us_hr_payroll/tests/test_us_de_delaware_payslip_2020.py
Executable file
36
l10n_us_hr_payroll/tests/test_us_de_delaware_payslip_2020.py
Executable 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)
|
||||||
93
l10n_us_hr_payroll/tests/test_us_hi_hawaii_payslip_2019.py
Normal file
93
l10n_us_hr_payroll/tests/test_us_hi_hawaii_payslip_2019.py
Normal 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)
|
||||||
|
|
||||||
35
l10n_us_hr_payroll/tests/test_us_hi_hawaii_payslip_2020.py
Executable file
35
l10n_us_hr_payroll/tests/test_us_hi_hawaii_payslip_2020.py
Executable 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)
|
||||||
152
l10n_us_hr_payroll/tests/test_us_ia_iowa_payslip_2019.py
Normal file
152
l10n_us_hr_payroll/tests/test_us_ia_iowa_payslip_2019.py
Normal 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)
|
||||||
33
l10n_us_hr_payroll/tests/test_us_ia_iowa_payslip_2020.py
Executable file
33
l10n_us_hr_payroll/tests/test_us_ia_iowa_payslip_2020.py
Executable 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)
|
||||||
85
l10n_us_hr_payroll/tests/test_us_id_idaho_payslip_2019.py
Normal file
85
l10n_us_hr_payroll/tests/test_us_id_idaho_payslip_2019.py
Normal 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)
|
||||||
35
l10n_us_hr_payroll/tests/test_us_id_idaho_payslip_2020.py
Executable file
35
l10n_us_hr_payroll/tests/test_us_id_idaho_payslip_2020.py
Executable 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)
|
||||||
@@ -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)
|
||||||
35
l10n_us_hr_payroll/tests/test_us_nm_new_mexico_payslip_2020.py
Executable file
35
l10n_us_hr_payroll/tests/test_us_nm_new_mexico_payslip_2020.py
Executable 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)
|
||||||
32
l10n_us_hr_payroll/views/res_config_settings_views.xml
Normal file
32
l10n_us_hr_payroll/views/res_config_settings_views.xml
Normal 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>
|
||||||
@@ -44,6 +44,13 @@
|
|||||||
<field name="workers_comp_er_code"/>
|
<field name="workers_comp_er_code"/>
|
||||||
</group>
|
</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)]}">
|
<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>
|
<p colspan="2"><h3>Form AR4EC - State Income Tax</h3></p>
|
||||||
<field name="ar_ar4ec_sit_allowances" string="Allowances 3."/>
|
<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="az_a4_sit_withholding_percentage" string="Withholding Percentage 1."/>
|
||||||
<field name="state_income_tax_additional_withholding" string="Additional Withholding 2."/>
|
<field name="state_income_tax_additional_withholding" string="Additional Withholding 2."/>
|
||||||
</group>
|
</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)]}">
|
<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>
|
<p colspan="2"><h3>No additional fields.</h3></p>
|
||||||
</group>
|
</group>
|
||||||
@@ -66,6 +96,23 @@
|
|||||||
<field name="state_income_tax_additional_withholding" string="Additional Withholding 6."/>
|
<field name="state_income_tax_additional_withholding" string="Additional Withholding 6."/>
|
||||||
<field name="state_income_tax_exempt" string="Exempt 8."/>
|
<field name="state_income_tax_exempt" string="Exempt 8."/>
|
||||||
</group>
|
</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)]}">
|
<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>
|
<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."/>
|
<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="nc_nc4_sit_allowances" string="Allowances 1."/>
|
||||||
<field name="state_income_tax_additional_withholding" string="Additional Withholding 2."/>
|
<field name="state_income_tax_additional_withholding" string="Additional Withholding 2."/>
|
||||||
</group>
|
</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)]}">
|
<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>
|
<p colspan="2"><h3>Form NJ-W4 - State Income Tax</h3></p>
|
||||||
<field name="nj_njw4_sit_filing_status" string="Filing Status 2."/>
|
<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="nj_njw4_sit_allowances" string="Allowances 4."/>
|
||||||
<field name="state_income_tax_additional_withholding" string="Additional Withholding 5."/>
|
<field name="state_income_tax_additional_withholding" string="Additional Withholding 5."/>
|
||||||
</group>
|
</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)]}">
|
<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>
|
<p colspan="2"><h3>Form IT-4 - State Income Tax</h3></p>
|
||||||
<field name="state_income_tax_exempt"/>
|
<field name="state_income_tax_exempt"/>
|
||||||
|
|||||||
Reference in New Issue
Block a user