mirror of
https://gitlab.com/hibou-io/hibou-odoo/suite.git
synced 2025-01-20 12:37:31 +02:00
WA Washington
This commit is contained in:
@@ -1,22 +1,23 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<!-- Wage Base -->
|
||||
<!-- https://esd.wa.gov/employer-taxes/rates#:~:text=State%20Unemployment%20Taxes%20(SUTA),increasing%20from%20%2452%2C700%20in%202020.-->
|
||||
<record id="rule_parameter_us_wa_suta_wage_base" model="hr.rule.parameter">
|
||||
<field name="name">US WA Washington SUTA Wage Base</field>
|
||||
<field name="code">us_wa_suta_wage_base</field>
|
||||
<field name="country_id" ref="base.us"/>
|
||||
</record>
|
||||
<data noupdate="1">
|
||||
<record id="rule_parameter_us_wa_suta_wage_base_2019" model="hr.rule.parameter.value">
|
||||
<field name="parameter_value">49800.0</field>
|
||||
<field name="rule_parameter_id" ref="rule_parameter_us_wa_suta_wage_base"/>
|
||||
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
|
||||
</record>
|
||||
<record id="rule_parameter_us_wa_suta_wage_base_2020" model="hr.rule.parameter.value">
|
||||
<field name="parameter_value">52700.00</field>
|
||||
<field name="rule_parameter_id" ref="rule_parameter_us_wa_suta_wage_base"/>
|
||||
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
|
||||
</record>
|
||||
<record id="rule_parameter_us_wa_suta_wage_base_2021" model="hr.rule.parameter.value">
|
||||
<field name="parameter_value">56500.00</field>
|
||||
<field name="rule_parameter_id" ref="rule_parameter_us_wa_suta_wage_base"/>
|
||||
<field name="date_from" eval="datetime(2021, 1, 1).date()"/>
|
||||
</record>
|
||||
</data>
|
||||
|
||||
<record id="rule_parameter_us_wa_fml_wage_base" model="hr.rule.parameter">
|
||||
@@ -25,16 +26,17 @@
|
||||
<field name="country_id" ref="base.us"/>
|
||||
</record>
|
||||
<data noupdate="1">
|
||||
<record id="rule_parameter_us_wa_fml_wage_base_2019" model="hr.rule.parameter.value">
|
||||
<field name="parameter_value">132900.00</field>
|
||||
<field name="rule_parameter_id" ref="rule_parameter_us_wa_fml_wage_base"/>
|
||||
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
|
||||
</record>
|
||||
<!-- https://paidleave.wa.gov/estimate-your-paid-leave-payments/-->
|
||||
<record id="rule_parameter_us_wa_fml_wage_base_2020" model="hr.rule.parameter.value">
|
||||
<field name="parameter_value">137700.00</field>
|
||||
<field name="rule_parameter_id" ref="rule_parameter_us_wa_fml_wage_base"/>
|
||||
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
|
||||
</record>
|
||||
<record id="rule_parameter_us_wa_fml_wage_base_2021" model="hr.rule.parameter.value">
|
||||
<field name="parameter_value">142800.00</field>
|
||||
<field name="rule_parameter_id" ref="rule_parameter_us_wa_fml_wage_base"/>
|
||||
<field name="date_from" eval="datetime(2021, 1, 1).date()"/>
|
||||
</record>
|
||||
</data>
|
||||
|
||||
<!-- Rate -->
|
||||
@@ -43,17 +45,23 @@
|
||||
<field name="code">us_wa_suta_rate</field>
|
||||
<field name="country_id" ref="base.us"/>
|
||||
</record>
|
||||
<!-- todo: need to figure out how this was/is calculated-->
|
||||
<data noupdate="1">
|
||||
<record id="rule_parameter_us_wa_suta_rate_2019" model="hr.rule.parameter.value">
|
||||
<field name="parameter_value">1.18</field>
|
||||
<field name="rule_parameter_id" ref="rule_parameter_us_wa_suta_rate"/>
|
||||
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
|
||||
</record>
|
||||
<record id="rule_parameter_us_wa_suta_rate_2020" model="hr.rule.parameter.value">
|
||||
<field name="parameter_value">1.0</field>
|
||||
<field name="rule_parameter_id" ref="rule_parameter_us_wa_suta_rate"/>
|
||||
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
|
||||
</record>
|
||||
<!-- https://esd.wa.gov/employer-taxes/determining-rates-->
|
||||
<!-- At the above link and under the "New Employers" Header:-->
|
||||
<!-- "For 2021, new employers will pay 115 percent of the average rate for all businesses in their respective industries."-->
|
||||
<!-- Under "Average tax rates: "The 2021 average tax rate is 1.88%"-->
|
||||
<!-- (1.88 * 1.15) = 2.16-->
|
||||
<record id="rule_parameter_us_wa_suta_rate_2021" model="hr.rule.parameter.value">
|
||||
<field name="parameter_value">2.16</field>
|
||||
<field name="rule_parameter_id" ref="rule_parameter_us_wa_suta_rate"/>
|
||||
<field name="date_from" eval="datetime(2021, 1, 1).date()"/>
|
||||
</record>
|
||||
</data>
|
||||
|
||||
<record id="rule_parameter_us_wa_fml_rate" model="hr.rule.parameter">
|
||||
@@ -62,16 +70,17 @@
|
||||
<field name="country_id" ref="base.us"/>
|
||||
</record>
|
||||
<data noupdate="1">
|
||||
<record id="rule_parameter_us_wa_fml_rate_2019" model="hr.rule.parameter.value">
|
||||
<field name="parameter_value">0.4</field>
|
||||
<field name="rule_parameter_id" ref="rule_parameter_us_wa_fml_rate"/>
|
||||
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
|
||||
</record>
|
||||
<!-- https://resources.paidleave.wa.gov/premium-calculator-->
|
||||
<record id="rule_parameter_us_wa_fml_rate_2020" model="hr.rule.parameter.value">
|
||||
<field name="parameter_value">0.4</field>
|
||||
<field name="rule_parameter_id" ref="rule_parameter_us_wa_fml_rate"/>
|
||||
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
|
||||
</record>
|
||||
<record id="rule_parameter_us_wa_fml_rate_2021" model="hr.rule.parameter.value">
|
||||
<field name="parameter_value">0.4</field>
|
||||
<field name="rule_parameter_id" ref="rule_parameter_us_wa_fml_rate"/>
|
||||
<field name="date_from" eval="datetime(2021, 1, 1).date()"/>
|
||||
</record>
|
||||
</data>
|
||||
|
||||
<record id="rule_parameter_us_wa_fml_rate_ee" model="hr.rule.parameter">
|
||||
@@ -80,16 +89,18 @@
|
||||
<field name="country_id" ref="base.us"/>
|
||||
</record>
|
||||
<data noupdate="1">
|
||||
<record id="rule_parameter_us_wa_fml_rate_ee_2019" model="hr.rule.parameter.value">
|
||||
<field name="parameter_value">66.33</field>
|
||||
<field name="rule_parameter_id" ref="rule_parameter_us_wa_fml_rate_ee"/>
|
||||
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
|
||||
</record>
|
||||
<record id="rule_parameter_us_wa_fml_rate_ee_2020" model="hr.rule.parameter.value">
|
||||
<field name="parameter_value">66.33</field>
|
||||
<field name="rule_parameter_id" ref="rule_parameter_us_wa_fml_rate_ee"/>
|
||||
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
|
||||
</record>
|
||||
<!-- Bullet 4 in: https://resources.paidleave.wa.gov/premium-calculator-->
|
||||
<!-- "Employers may withhold up to 63.33% of the total premium from an employee."-->
|
||||
<record id="rule_parameter_us_wa_fml_rate_ee_2021" model="hr.rule.parameter.value">
|
||||
<field name="parameter_value">66.33</field>
|
||||
<field name="rule_parameter_id" ref="rule_parameter_us_wa_fml_rate_ee"/>
|
||||
<field name="date_from" eval="datetime(2021, 1, 1).date()"/>
|
||||
</record>
|
||||
</data>
|
||||
|
||||
<record id="rule_parameter_us_wa_fml_rate_er" model="hr.rule.parameter">
|
||||
@@ -98,16 +109,18 @@
|
||||
<field name="country_id" ref="base.us"/>
|
||||
</record>
|
||||
<data noupdate="1">
|
||||
<record id="rule_parameter_us_wa_fml_rate_er_2019" model="hr.rule.parameter.value">
|
||||
<field name="parameter_value">33.67</field>
|
||||
<field name="rule_parameter_id" ref="rule_parameter_us_wa_fml_rate_er"/>
|
||||
<field name="date_from" eval="datetime(2019, 1, 1).date()"/>
|
||||
</record>
|
||||
<record id="rule_parameter_us_wa_fml_rate_er_2020" model="hr.rule.parameter.value">
|
||||
<field name="parameter_value">33.67</field>
|
||||
<field name="rule_parameter_id" ref="rule_parameter_us_wa_fml_rate_er"/>
|
||||
<field name="date_from" eval="datetime(2020, 1, 1).date()"/>
|
||||
</record>
|
||||
<!-- Bullet 4 also says in: https://resources.paidleave.wa.gov/premium-calculator-->
|
||||
<!-- "The employer is responsible for paying the other 36.67%"-->
|
||||
<record id="rule_parameter_us_wa_fml_rate_er_2021" model="hr.rule.parameter.value">
|
||||
<field name="parameter_value">33.67</field>
|
||||
<field name="rule_parameter_id" ref="rule_parameter_us_wa_fml_rate_er"/>
|
||||
<field name="date_from" eval="datetime(2021, 1, 1).date()"/>
|
||||
</record>
|
||||
</data>
|
||||
|
||||
<!-- Partners and Contribution Registers -->
|
||||
|
||||
@@ -22,6 +22,7 @@ class TestUsWAPayslip(TestUsPayslip):
|
||||
# 'rate': 0.1261,
|
||||
# 'rate_emp_withhold': 0.05575,
|
||||
# })
|
||||
# todo: figure out how the two rates below corralate with ee and er rates above
|
||||
self.test_ee_lni = 0.05575 # per 100 hours
|
||||
self.test_er_lni = 0.1261 # per 100 hours
|
||||
self.parameter_lni_ee = self.env['hr.rule.parameter'].create({
|
||||
|
||||
@@ -8,8 +8,9 @@ class TestUsWAPayslip(TestUsPayslip):
|
||||
###
|
||||
# Taxes and Rates
|
||||
###
|
||||
WA_UNEMP_MAX_WAGE = 49800.0
|
||||
WA_UNEMP_RATE = 1.18
|
||||
WA_UNEMP_MAX_WAGE = 56500.00
|
||||
WA_UNEMP_RATE = 2.16
|
||||
WA_FML_MAX_WAGE = 142800.00
|
||||
WA_FML_RATE = 0.4
|
||||
WA_FML_RATE_EE = 66.33
|
||||
WA_FML_RATE_ER = 33.67
|
||||
@@ -27,7 +28,7 @@ class TestUsWAPayslip(TestUsPayslip):
|
||||
'name': 'Test LNI EE',
|
||||
'code': 'test_lni_ee',
|
||||
'parameter_version_ids': [(0, 0, {
|
||||
'date_from': date(2019, 1, 1),
|
||||
'date_from': date(2021, 1, 1),
|
||||
'parameter_value': str(self.test_ee_lni * 100),
|
||||
})],
|
||||
})
|
||||
@@ -35,13 +36,15 @@ class TestUsWAPayslip(TestUsPayslip):
|
||||
'name': 'Test LNI ER',
|
||||
'code': 'test_lni_er',
|
||||
'parameter_version_ids': [(0, 0, {
|
||||
'date_from': date(2019, 1, 1),
|
||||
'date_from': date(2021, 1, 1),
|
||||
'parameter_value': str(self.test_er_lni * 100),
|
||||
})],
|
||||
})
|
||||
|
||||
def test_2019_taxes(self):
|
||||
salary = 25000.0
|
||||
def test_2021_taxes(self):
|
||||
self._test_er_suta('WA', self.WA_UNEMP_RATE, date(2021, 1, 1), wage_base=self.WA_UNEMP_MAX_WAGE)
|
||||
|
||||
salary = (self.WA_FML_MAX_WAGE / 2.0) + 1000.0
|
||||
|
||||
employee = self._createEmployee()
|
||||
|
||||
@@ -54,39 +57,34 @@ class TestUsWAPayslip(TestUsPayslip):
|
||||
self._log(str(contract.resource_calendar_id) + ' ' + contract.resource_calendar_id.name)
|
||||
|
||||
|
||||
# tax rates
|
||||
wa_unemp = self.WA_UNEMP_RATE / -100.0
|
||||
|
||||
self._log('2019 Washington tax first payslip:')
|
||||
payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
|
||||
# Non SUTA
|
||||
self._log('2021 Washington tax first payslip:')
|
||||
payslip = self._createPayslip(employee, '2021-01-01', '2021-01-31')
|
||||
hours_in_period = payslip.worked_days_line_ids.filtered(lambda l: l.code == 'WORK100').number_of_hours
|
||||
self.assertAlmostEqual(hours_in_period, 184) # only asserted to test algorithm
|
||||
self.assertPayrollAlmostEqual(hours_in_period, 169) # only asserted to test algorithm
|
||||
payslip.compute_sheet()
|
||||
|
||||
|
||||
cats = self._getCategories(payslip)
|
||||
rules = self._getRules(payslip)
|
||||
|
||||
self.assertPayrollEqual(cats['ER_US_SUTA'], salary * wa_unemp)
|
||||
self.assertPayrollEqual(rules['EE_US_WA_LNI'], -(self.test_ee_lni * hours_in_period))
|
||||
self.assertPayrollAlmostEqual(rules['EE_US_WA_LNI'], -(self.test_ee_lni * hours_in_period))
|
||||
self.assertPayrollEqual(rules['ER_US_WA_LNI'], -(self.test_er_lni * hours_in_period))
|
||||
# Both of these are known to be within 1 penny
|
||||
self.assertPayrollAlmostEqual(rules['EE_US_WA_FML'], -(salary * (self.WA_FML_RATE / 100.0) * (self.WA_FML_RATE_EE / 100.0)))
|
||||
self.assertPayrollAlmostEqual(rules['ER_US_WA_FML'], -(salary * (self.WA_FML_RATE / 100.0) * (self.WA_FML_RATE_ER / 100.0)))
|
||||
|
||||
# FML
|
||||
|
||||
process_payslip(payslip)
|
||||
|
||||
# Make a new payslip, this one will have maximums
|
||||
|
||||
remaining_wa_unemp_wages = self.WA_UNEMP_MAX_WAGE - salary if (self.WA_UNEMP_MAX_WAGE - 2*salary < salary) \
|
||||
else salary
|
||||
|
||||
self._log('2019 Washington tax second payslip:')
|
||||
payslip = self._createPayslip(employee, '2019-02-01', '2019-02-28')
|
||||
# Second payslip
|
||||
remaining_wage = self.WA_FML_MAX_WAGE - salary
|
||||
payslip = self._createPayslip(employee, '2021-03-01', '2021-03-31')
|
||||
payslip.compute_sheet()
|
||||
rules = self._getRules(payslip)
|
||||
self.assertPayrollAlmostEqual(rules['EE_US_WA_FML'], -(remaining_wage * (self.WA_FML_RATE / 100.0) * (self.WA_FML_RATE_EE / 100.0)))
|
||||
self.assertPayrollAlmostEqual(rules['ER_US_WA_FML'], -(remaining_wage * (self.WA_FML_RATE / 100.0) * (self.WA_FML_RATE_ER / 100.0)))
|
||||
process_payslip(payslip)
|
||||
|
||||
cats = self._getCategories(payslip)
|
||||
|
||||
self.assertPayrollEqual(cats['ER_US_SUTA'], remaining_wa_unemp_wages * wa_unemp)
|
||||
# Third payslip
|
||||
payslip = self._createPayslip(employee, '2021-04-01', '2021-04-30')
|
||||
payslip.compute_sheet()
|
||||
rules = self._getRules(payslip)
|
||||
self.assertPayrollAlmostEqual(rules['EE_US_WA_FML'], 0.0)
|
||||
self.assertPayrollAlmostEqual(rules['ER_US_WA_FML'], 0.0)
|
||||
Reference in New Issue
Block a user