diff --git a/l10n_us_hr_payroll/data/federal/fed_941_fica_parameters.xml b/l10n_us_hr_payroll/data/federal/fed_941_fica_parameters.xml
index 8a25dde0..dbebdf3b 100644
--- a/l10n_us_hr_payroll/data/federal/fed_941_fica_parameters.xml
+++ b/l10n_us_hr_payroll/data/federal/fed_941_fica_parameters.xml
@@ -20,6 +20,12 @@
137700.0
+
+ Federal 941 FICA Social Security Wage Base
+ fed_941_fica_ss_wage_base
+ 142800.0
+
+
diff --git a/l10n_us_hr_payroll/data/federal/fed_941_fit_parameters.xml b/l10n_us_hr_payroll/data/federal/fed_941_fit_parameters.xml
index 89330246..e223d6f4 100644
--- a/l10n_us_hr_payroll/data/federal/fed_941_fit_parameters.xml
+++ b/l10n_us_hr_payroll/data/federal/fed_941_fit_parameters.xml
@@ -2,21 +2,6 @@
-
- Federal 941 FIT Allowance
- fed_941_fit_allowance
-
- {
- 'weekly': 80.80,
- 'bi-weekly': 161.50,
- 'semi-monthly': 175.00,
- 'monthly': 350.00,
- 'quarterly': 1050.00,
- 'semi-annually': 2100.00,
- 'annually': 4200.00,
- }
-
-
Federal 941 FIT Allowance
fed_941_fit_allowance
@@ -38,36 +23,7 @@
4300.0
-
-
- Federal 941 FIT NRA Additional
- fed_941_fit_nra_additional
-
- {
- 'weekly': 153.80,
- 'bi-weekly': 307.70,
- 'semi-monthly': 333.30,
- 'monthly': 666.70,
- 'quarterly': 2000.00,
- 'semi-annually': 4000.00,
- 'annually': 8000.00,
- }
-
-
-
- Federal 941 FIT NRA Additional
- fed_941_fit_nra_additional
- {
- 'weekly': 153.80,
- 'bi-weekly': 307.70,
- 'semi-monthly': 333.30,
- 'monthly': 666.70,
- 'quarterly': 2000.00,
- 'semi-annually': 4000.00,
- 'annually': 8000.00,
- }
-
-
+
Federal 941 FIT NRA Additional
fed_941_fit_nra_additional
@@ -82,165 +38,22 @@
}
+
+ Federal 941 FIT NRA Additional
+ fed_941_fit_nra_additional
+ {
+ 'weekly': 241.30,
+ 'bi-weekly': 482.70,
+ 'semi-monthly': 522.90,
+ 'monthly': 1045.80,
+ 'quarterly': 3137.50,
+ 'semi-annually': 6275.00,
+ 'annually': 12550.00,
+ }
+
+
-
- Federal 941 FIT Table Single
- fed_941_fit_table_single
-
-
- {
- 'weekly': [
- ( 73.00, 0.00, 0),
- ( 260.00, 0.00, 10),
- ( 832.00, 18.70, 12),
- ( 1692.00, 87.34, 22),
- ( 3164.00, 276.54, 24),
- ( 3998.00, 629.82, 32),
- ( 9887.00, 896.70, 35),
- ( 'inf', 2957.85, 37),
- ],
- 'bi-weekly': [
- ( 146.00, 0.00, 0),
- ( 519.00, 0.00, 10),
- ( 1664.00, 37.30, 12),
- ( 3385.00, 174.70, 22),
- ( 6328.00, 553.32, 24),
- ( 7996.00, 1259.64, 32),
- ( 19773.00, 1793.40, 35),
- ( 'inf', 5915.35, 37),
- ],
- 'semi-monthly': [
- ( 158.00, 0.00, 0),
- ( 563.00, 0.00, 10),
- ( 1803.00, 40.50, 12),
- ( 3667.00, 189.30, 22),
- ( 6855.00, 599.38, 24),
- ( 8663.00, 1364.50, 32),
- ( 21421.00, 1943.06, 35),
- ( 'inf', 6408.36, 37),
- ],
- 'monthly': [
- ( 317.00, 0.00, 0),
- ( 1125.00, 0.00, 10),
- ( 3606.00, 80.80, 12),
- ( 7333.00, 378.52, 22),
- ( 13710.00, 1198.46, 24),
- ( 17325.00, 2728.94, 32),
- ( 42842.00, 3885.74, 35),
- ( 'inf', 12816.69, 37),
- ],
- 'quarterly': [
- ( 950.00, 0.00, 0),
- ( 3375.00, 0.00, 10),
- ( 10819.00, 242.50, 12),
- ( 22000.00, 1135.78, 22),
- ( 41131.00, 3595.60, 24),
- ( 51975.00, 8187.04, 32),
- ( 128525.00, 11657.12, 35),
- ( 'inf', 38449.62, 37),
- ],
- 'semi-annually': [
- ( 1900.00, 0.00, 0),
- ( 6750.00, 0.00, 10),
- ( 21638.00, 485.00, 12),
- ( 44000.00, 2271.56, 22),
- ( 82263.00, 7191.20, 24),
- ( 103950.00, 16374.32, 32),
- ( 257050.00, 23314.16, 35),
- ( 'inf', 76899.16, 37),
- ],
- 'annually': [
- ( 3800.00, 0.00, 0),
- ( 13500.00, 0.00, 10),
- ( 43275.00, 970.00, 12),
- ( 88000.00, 4543.00, 22),
- ( 164525.00, 14382.50, 24),
- ( 207900.00, 32748.50, 32),
- ( 514100.00, 46628.50, 35),
- ( 'inf', 153798.50, 37),
- ],
- }
-
-
-
- Federal 941 FIT Table Single
- fed_941_fit_table_single
-
- {
- 'weekly': [
- ( 73.00, 0.00, 0),
- ( 260.00, 0.00, 10),
- ( 832.00, 18.70, 12),
- ( 1692.00, 87.34, 22),
- ( 3164.00, 276.54, 24),
- ( 3998.00, 629.82, 32),
- ( 9887.00, 896.70, 35),
- ( 'inf', 2957.85, 37),
- ],
- 'bi-weekly': [
- ( 146.00, 0.00, 0),
- ( 519.00, 0.00, 10),
- ( 1664.00, 37.30, 12),
- ( 3385.00, 174.70, 22),
- ( 6328.00, 553.32, 24),
- ( 7996.00, 1259.64, 32),
- ( 19773.00, 1793.40, 35),
- ( 'inf', 5915.35, 37),
- ],
- 'semi-monthly': [
- ( 158.00, 0.00, 0),
- ( 563.00, 0.00, 10),
- ( 1803.00, 40.50, 12),
- ( 3667.00, 189.30, 22),
- ( 6855.00, 599.38, 24),
- ( 8663.00, 1364.50, 32),
- ( 21421.00, 1943.06, 35),
- ( 'inf', 6408.36, 37),
- ],
- 'monthly': [
- ( 317.00, 0.00, 0),
- ( 1125.00, 0.00, 10),
- ( 3606.00, 80.80, 12),
- ( 7333.00, 378.52, 22),
- ( 13710.00, 1198.46, 24),
- ( 17325.00, 2728.94, 32),
- ( 42842.00, 3885.74, 35),
- ( 'inf', 12816.69, 37),
- ],
- 'quarterly': [
- ( 950.00, 0.00, 0),
- ( 3375.00, 0.00, 10),
- ( 10819.00, 242.50, 12),
- ( 22000.00, 1135.78, 22),
- ( 41131.00, 3595.60, 24),
- ( 51975.00, 8187.04, 32),
- ( 128525.00, 11657.12, 35),
- ( 'inf', 38449.62, 37),
- ],
- 'semi-annually': [
- ( 1900.00, 0.00, 0),
- ( 6750.00, 0.00, 10),
- ( 21638.00, 485.00, 12),
- ( 44000.00, 2271.56, 22),
- ( 82263.00, 7191.20, 24),
- ( 103950.00, 16374.32, 32),
- ( 257050.00, 23314.16, 35),
- ( 'inf', 76899.16, 37),
- ],
- 'annually': [
- ( 3800.00, 0.00, 0),
- ( 13500.00, 0.00, 10),
- ( 43275.00, 970.00, 12),
- ( 88000.00, 4543.00, 22),
- ( 164525.00, 14382.50, 24),
- ( 207900.00, 32748.50, 32),
- ( 514100.00, 46628.50, 35),
- ( 'inf', 153798.50, 37),
- ],
- }
-
-
Federal 941 FIT Table Single
fed_941_fit_table_single
@@ -270,165 +83,37 @@
}
+
+ Federal 941 FIT Table Single
+ fed_941_fit_table_single
+
+
+ {
+ 'standard': [
+ ( 0.00, 0.00, 0.00),
+ ( 3950.00, 0.00, 0.10),
+ ( 13900.00, 995.00, 0.12),
+ ( 44475.00, 4664.00, 0.22),
+ ( 90325.00, 14751.00, 0.24),
+ ( 168875.00, 33603.00, 0.32),
+ ( 213375.00, 47843.00, 0.35),
+ ( 527550.00, 157804.25, 0.37),
+ ],
+ 'higher': [
+ ( 0.00, 0.00, 0.00),
+ ( 6275.00, 0.00, 0.10),
+ ( 11250.00, 497.50, 0.12),
+ ( 26538.00, 2332.00, 0.22),
+ ( 49463.00, 7375.50, 0.24),
+ ( 88738.00, 16801.50, 0.32),
+ ( 110988.00, 23921.50, 0.35),
+ ( 268075.00, 78902.13, 0.37),
+ ],
+ }
+
+
-
- Federal 941 FIT Table Married
- fed_941_fit_table_married
-
-
- {
- 'weekly': [
- ( 227.00, 0.00, 0),
- ( 600.00, 0.00, 10),
- ( 1745.00, 37.30, 12),
- ( 3465.00, 174.70, 22),
- ( 6409.00, 553.10, 24),
- ( 8077.00, 1259.66, 32),
- ( 12003.00, 1793.42, 35),
- ( 'inf', 3167.52, 37),
- ],
- 'bi-weekly': [
- ( 454.00, 0.00, 0),
- ( 1200.00, 0.00, 10),
- ( 3490.00, 74.60, 12),
- ( 6931.00, 349.40, 22),
- ( 12817.00, 1106.42, 24),
- ( 16154.00, 2519.06, 32),
- ( 24006.00, 3586.90, 35),
- ( 'inf', 6335.10, 37),
- ],
- 'semi-monthly': [
- ( 492.00, 0.00, 0),
- ( 1300.00, 0.00, 10),
- ( 3781.00, 80.80, 12),
- ( 7508.00, 378.52, 22),
- ( 13885.00, 1198.46, 24),
- ( 17500.00, 2728.94, 32),
- ( 26006.00, 3885.74, 35),
- ( 'inf', 6862.84, 37),
- ],
- 'monthly': [
- ( 983.00, 0.00, 0),
- ( 2600.00, 0.00, 10),
- ( 7563.00, 161.70, 12),
- ( 15017.00, 757.26, 22),
- ( 27771.00, 2397.14, 24),
- ( 35000.00, 5458.10, 32),
- ( 52013.00, 7771.38, 35),
- ( 'inf', 13725.93, 37),
- ],
- 'quarterly': [
- ( 2950.00, 0.00, 0),
- ( 7800.00, 0.00, 10),
- ( 22688.00, 485.00, 12),
- ( 45050.00, 2271.56, 22),
- ( 83313.00, 7191.20, 24),
- ( 105000.00, 16374.32, 32),
- ( 156038.00, 23314.16, 35),
- ( 'inf', 41177.46, 37),
- ],
- 'semi-annually': [
- ( 5900.00, 0.00, 0),
- ( 15600.00, 0.00, 10),
- ( 45375.00, 970.00, 12),
- ( 90100.00, 4543.00, 22),
- ( 166625.00, 14382.50, 24),
- ( 210000.00, 32748.50, 32),
- ( 312075.00, 46628.50, 35),
- ( 'inf', 82354.75, 37),
- ],
- 'annually': [
- ( 11800.00, 0.00, 0),
- ( 31200.00, 0.00, 10),
- ( 90750.00, 1940.00, 12),
- ( 180200.00, 9086.00, 22),
- ( 333250.00, 28765.00, 24),
- ( 420000.00, 65497.00, 32),
- ( 624150.00, 93257.00, 35),
- ( 'inf', 164709.50, 37),
- ],
- }
-
-
-
- Federal 941 FIT Table Married
- fed_941_fit_table_married
-
- {
- 'weekly': [
- ( 227.00, 0.00, 0),
- ( 600.00, 0.00, 10),
- ( 1745.00, 37.30, 12),
- ( 3465.00, 174.70, 22),
- ( 6409.00, 553.10, 24),
- ( 8077.00, 1259.66, 32),
- ( 12003.00, 1793.42, 35),
- ( 'inf', 3167.52, 37),
- ],
- 'bi-weekly': [
- ( 454.00, 0.00, 0),
- ( 1200.00, 0.00, 10),
- ( 3490.00, 74.60, 12),
- ( 6931.00, 349.40, 22),
- ( 12817.00, 1106.42, 24),
- ( 16154.00, 2519.06, 32),
- ( 24006.00, 3586.90, 35),
- ( 'inf', 6335.10, 37),
- ],
- 'semi-monthly': [
- ( 492.00, 0.00, 0),
- ( 1300.00, 0.00, 10),
- ( 3781.00, 80.80, 12),
- ( 7508.00, 378.52, 22),
- ( 13885.00, 1198.46, 24),
- ( 17500.00, 2728.94, 32),
- ( 26006.00, 3885.74, 35),
- ( 'inf', 6862.84, 37),
- ],
- 'monthly': [
- ( 983.00, 0.00, 0),
- ( 2600.00, 0.00, 10),
- ( 7563.00, 161.70, 12),
- ( 15017.00, 757.26, 22),
- ( 27771.00, 2397.14, 24),
- ( 35000.00, 5458.10, 32),
- ( 52013.00, 7771.38, 35),
- ( 'inf', 13725.93, 37),
- ],
- 'quarterly': [
- ( 2950.00, 0.00, 0),
- ( 7800.00, 0.00, 10),
- ( 22688.00, 485.00, 12),
- ( 45050.00, 2271.56, 22),
- ( 83313.00, 7191.20, 24),
- ( 105000.00, 16374.32, 32),
- ( 156038.00, 23314.16, 35),
- ( 'inf', 41177.46, 37),
- ],
- 'semi-annually': [
- ( 5900.00, 0.00, 0),
- ( 15600.00, 0.00, 10),
- ( 45375.00, 970.00, 12),
- ( 90100.00, 4543.00, 22),
- ( 166625.00, 14382.50, 24),
- ( 210000.00, 32748.50, 32),
- ( 312075.00, 46628.50, 35),
- ( 'inf', 82354.75, 37),
- ],
- 'annually': [
- ( 11800.00, 0.00, 0),
- ( 31200.00, 0.00, 10),
- ( 90750.00, 1940.00, 12),
- ( 180200.00, 9086.00, 22),
- ( 333250.00, 28765.00, 24),
- ( 420000.00, 65497.00, 32),
- ( 624150.00, 93257.00, 35),
- ( 'inf', 164709.50, 37),
- ],
- }
-
-
Federal 941 FIT Table Married
fed_941_fit_table_married
@@ -458,6 +143,35 @@
}
+
+ Federal 941 FIT Table Married
+ fed_941_fit_table_married
+
+
+ {
+ 'standard': [
+ ( 0.00, 0.00, 0.00),
+ ( 12200.00, 0.00, 0.10),
+ ( 32100.00, 1990.00, 0.12),
+ ( 93250.00, 9328.00, 0.22),
+ ( 184950.00, 29502.00, 0.24),
+ ( 342050.00, 67206.00, 0.32),
+ ( 431050.00, 95686.00, 0.35),
+ ( 640500.00, 168993.50, 0.37),
+ ],
+ 'higher': [
+ ( 0.00, 0.00, 0.00),
+ ( 12550.00, 0.00, 0.10),
+ ( 22500.00, 995.00, 0.12),
+ ( 53075.00, 4664.00, 0.22),
+ ( 98925.00, 14751.00, 0.24),
+ ( 177475.00, 33603.00, 0.32),
+ ( 221975.00, 47843.00, 0.35),
+ ( 326700.00, 84496.75, 0.37),
+ ],
+ }
+
+
Federal 941 FIT Table Head of Household
@@ -488,5 +202,34 @@
}
+
+ Federal 941 FIT Table Head of Household
+ fed_941_fit_table_hh
+
+
+ {
+ 'standard': [
+ ( 0.00, 0.00, 0.00),
+ ( 10200.00, 0.00, 0.10),
+ ( 24400.00, 1420.00, 0.12),
+ ( 64400.00, 6220.00, 0.22),
+ ( 96550.00, 13293.00, 0.24),
+ ( 175100.00, 32145.00, 0.32),
+ ( 219600.00, 46385.00, 0.35),
+ ( 533800.00, 156355.50, 0.37),
+ ],
+ 'higher': [
+ ( 0.00, 0.00, 0.00),
+ ( 9400.00, 0.00, 0.10),
+ ( 16500.00, 710.00, 0.12),
+ ( 36500.00, 3110.00, 0.22),
+ ( 52575.00, 6646.50, 0.24),
+ ( 91950.00, 16072.50, 0.32),
+ ( 114100.00, 23192.50, 0.35),
+ ( 271200.00, 78177.50, 0.37),
+ ],
+ }
+
+
\ No newline at end of file
diff --git a/l10n_us_hr_payroll/data/state/ak_alaska.xml b/l10n_us_hr_payroll/data/state/ak_alaska.xml
index d63c387d..c1dd1efd 100644
--- a/l10n_us_hr_payroll/data/state/ak_alaska.xml
+++ b/l10n_us_hr_payroll/data/state/ak_alaska.xml
@@ -2,49 +2,49 @@
-
- US AK Alaska SUTA Wage Base
- us_ak_suta_wage_base
- 39900.00
-
-
US AK Alaska SUTA Wage Base
us_ak_suta_wage_base
41500.00
+
+ US AK Alaska SUTA Wage Base
+ us_ak_suta_wage_base
+ 43600.00
+
+
-
- US AK Alaska SUTA Rate
- us_ak_suta_rate
- 1.780
-
-
US AK Alaska SUTA Rate
us_ak_suta_rate
1.590
+
+ US AK Alaska SUTA Rate
+ us_ak_suta_rate
+ 2.570
+
+
-
- US AK Alaska SUTA Rate EE
- us_ak_suta_ee_rate
- 0.500
-
-
US AK Alaska SUTA Rate EE
us_ak_suta_ee_rate
0.500
+
+ US AK Alaska SUTA Rate EE
+ us_ak_suta_ee_rate
+ 0.500
+
+
diff --git a/l10n_us_hr_payroll/data/state/al_alabama.xml b/l10n_us_hr_payroll/data/state/al_alabama.xml
index bf2d0a7f..183fcf24 100644
--- a/l10n_us_hr_payroll/data/state/al_alabama.xml
+++ b/l10n_us_hr_payroll/data/state/al_alabama.xml
@@ -2,12 +2,6 @@
-
- US AL Alabama SUTA Wage Base
- us_al_suta_wage_base
- 8000.0
-
-
US AL Alabama SUTA Wage Base
us_al_suta_wage_base
@@ -18,12 +12,6 @@
-
- US AL Alabama SUTA Rate
- us_al_suta_rate
- 2.7
-
-
US AL Alabama SUTA Rate
us_al_suta_rate
@@ -33,23 +21,6 @@
-
- US AL Alabama SIT Tax Rate
- us_al_sit_tax_rate
- {
- '0': [
- ( 500, 2),
- ( 3000, 4),
- ('inf', 5),
- ],
- 'M': [
- ( 1000, 2),
- ( 6000, 4),
- ('inf', 5),
- ],
- }
-
-
US AL Alabama SIT Tax Rate
us_al_sit_tax_rate
@@ -70,18 +41,6 @@
-
-
-
- US AL Alabama Dependent Rate
- us_al_sit_dependent_rate
- [
- ( 1000, 20000),
- ( 500, 100000),
- ( 300, 'inf'),
- ]
-
-
@@ -97,20 +56,6 @@
-
-
-
- US AL Alabama Standard Deduction Rate
- us_al_sit_standard_deduction_rate
- {
- '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)),
- }
-
-
@@ -128,20 +73,6 @@
-
-
-
- US AL Alabama Personal Exemption Rate
- us_al_sit_personal_exemption_rate
- {
- '0' : 0,
- 'S' : 1500,
- 'MS': 1500,
- 'M' : 3000,
- 'H' : 3000,
- }
-
-
diff --git a/l10n_us_hr_payroll/data/state/ar_arkansas.xml b/l10n_us_hr_payroll/data/state/ar_arkansas.xml
index 1940ef85..33aafab0 100644
--- a/l10n_us_hr_payroll/data/state/ar_arkansas.xml
+++ b/l10n_us_hr_payroll/data/state/ar_arkansas.xml
@@ -2,56 +2,37 @@
-
- US AR Arkansas SUTA Wage Base
- us_ar_suta_wage_base
- 10000.0
-
-
US AR Arkansas SUTA Wage Base
us_ar_suta_wage_base
8000.0
+
+ US AR Arkansas SUTA Wage Base
+ us_ar_suta_wage_base
+ 10000.0
+
+
-
- US AR Arkansas SUTA Rate
- us_ar_suta_rate
- 3.2
-
-
US AR Arkansas SUTA Rate
us_ar_suta_rate
2.9
+
+ US AR Arkansas SUTA Rate
+ us_ar_suta_rate
+ 3.2
+
+
-
- US AR Arkansas SIT Tax Rate
- us_ar_sit_tax_rate
- [
- ( 4599, 0.0, 0.00),
- ( 9099, 2.0, 91.98),
- ( 13699, 3.0, 182.97),
- ( 22599, 3.4, 237.77),
- ( 37899, 5.0, 421.46),
- ( 80800, 5.9, 762.55),
- ( 81800, 6.6, 1243.40),
- ( 82800, 6.6, 1143.40),
- ( 84100, 6.6, 1043.40),
- ( 85200, 6.6, 943.40),
- ( 86200, 6.6, 843.40),
- ( 'inf', 6.6, 803.40),
- ]
-
-
@@ -73,15 +54,28 @@
]
+
+ US AR Arkansas SIT Tax Rate
+ us_ar_sit_tax_rate
+ [
+ ( 4699, 0.0, 0.00),
+ ( 9199, 2.0, 93.98),
+ ( 13899, 3.0, 185.97),
+ ( 22899, 3.4, 241.57),
+ ( 38499, 5.0, 427.71),
+ ( 82000, 5.9, 774.20),
+ ( 83000, 5.9, 681.70),
+ ( 84000, 5.9, 581.70),
+ ( 85300, 5.9, 481.70),
+ ( 86400, 5.9, 381.70),
+ ( 87500, 5.9, 281.70),
+ ( 'inf', 5.9, 241.70),
+ ]
+
+
-
- US AR Arkansas Allowances Rate
- us_ar_sit_standard_deduction_rate
- 2200.0
-
-
US AR Arkansas Allowances Rate
us_ar_sit_standard_deduction_rate
diff --git a/l10n_us_hr_payroll/data/state/az_arizona.xml b/l10n_us_hr_payroll/data/state/az_arizona.xml
index 92bb3ef1..317a4756 100644
--- a/l10n_us_hr_payroll/data/state/az_arizona.xml
+++ b/l10n_us_hr_payroll/data/state/az_arizona.xml
@@ -2,12 +2,6 @@
-
- US AZ Arizona SUTA Wage Base
- us_az_suta_wage_base
- 7000.0
-
-
US AZ Arizona SUTA Wage Base
us_az_suta_wage_base
@@ -18,12 +12,6 @@
-
- US AZ Arizona SUTA Rate
- us_az_suta_rate
- 2.0
-
-
US AZ Arizona SUTA Rate
us_az_suta_rate
@@ -32,6 +20,8 @@
+
+
US Arizona - Department of Economic Security (ADES) - Unemployment Tax
diff --git a/l10n_us_hr_payroll/data/state/ca_california.xml b/l10n_us_hr_payroll/data/state/ca_california.xml
index 663699bb..fd7374c1 100644
--- a/l10n_us_hr_payroll/data/state/ca_california.xml
+++ b/l10n_us_hr_payroll/data/state/ca_california.xml
@@ -2,12 +2,6 @@
-
- US CA California SUTA Wage Base
- us_ca_suta_wage_base
- 7000.0
-
-
US CA California SUTA Wage Base
us_ca_suta_wage_base
@@ -18,12 +12,6 @@
-
- US CA California SUTA Rate
- us_ca_suta_rate
- 3.5
-
-
US CA California SUTA Rate
us_ca_suta_rate
@@ -34,12 +22,6 @@
-
- US CA California SUTA ETT Rate
- us_ca_suta_ett_rate
- 0.1
-
-
US CA California SUTA ETT Rate
us_ca_suta_ett_rate
@@ -50,286 +32,21 @@
-
- US CA California SUTA SDI Rate
- us_ca_suta_sdi_rate
- 1.0
-
-
US CA California SUTA SDI Rate
us_ca_suta_sdi_rate
1.0
+
+ US CA California SUTA SDI Rate
+ us_ca_suta_sdi_rate
+ 1.2
+
+
-
- US CA California SIT Tax Rate
- us_ca_sit_tax_rate
- {
- 'head_household': {
- 'weekly': (
- ( 316, 0.0110, 0.00),
- ( 750, 0.0220, 3.48),
- ( 967, 0.0440, 13.03),
- ( 1196, 0.0660, 22.58),
- ( 1413, 0.0880, 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.0110, 0.00),
- ( 1500, 0.0220, 6.95),
- ( 1934, 0.0440, 26.05),
- ( 2392, 0.0660, 45.15),
- ( 2826, 0.0880, 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.0110, 0.00),
- ( 1625, 0.0220, 7.55),
- ( 2094, 0.0440, 28.21),
- ( 2592, 0.0660, 48.85),
- ( 3062, 0.0880, 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.0110, 0.00),
- ( 3250, 0.0220, 15.09),
- ( 4188, 0.0440, 56.41),
- ( 5184, 0.0660, 97.68),
- ( 6124, 0.0880, 163.42),
- (31250, 0.1023, 246.14),
- (37500, 0.1133, 2816.53),
- (62500, 0.1243, 3524.66),
- (83334, 0.1353, 6632.16),
- ('inf', 0.1463, 9451.00),
- ),
- 'quarterly': (
- ( 4114, 0.0110, 0.00),
- ( 9748, 0.0220, 45.25),
- ( 12566, 0.0440, 169.20),
- ( 15552, 0.0660, 293.19),
- ( 18369, 0.0880, 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.0110, 0.00),
- ( 19496, 0.0220, 90.51),
- ( 25132, 0.0440, 338.41),
- ( 31104, 0.0660, 586.39),
- ( 36738, 0.0880, 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.0110, 0.00),
- ( 38991, 0.0220, 181.03),
- ( 50264, 0.0440, 676.78),
- ( 62206, 0.0660, 1172.79),
- ( 73477, 0.0880, 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.0110, 0.00),
- ( 750, 0.0220, 3.48),
- ( 1184, 0.0440, 13.03),
- ( 1642, 0.0660, 32.13),
- ( 2076, 0.0880, 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.0110, 0.00),
- ( 1500, 0.0220, 6.95),
- ( 2368, 0.0440, 26.05),
- ( 3284, 0.0660, 64.24),
- ( 4152, 0.0880, 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.0110, 0.00),
- ( 1624, 0.0220, 7.55),
- ( 2564, 0.0440, 28.19),
- ( 3560, 0.0660, 69.55),
- ( 4498, 0.0880, 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.0110, 0.00),
- ( 3248, 0.0220, 15.09),
- ( 5128, 0.0440, 56.36),
- ( 7120, 0.0660, 139.08),
- ( 8996, 0.0880, 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.0110, 0.00),
- ( 9748, 0.0220, 45.23),
- ( 15384, 0.0440, 169.22),
- ( 21356, 0.0660, 417.20),
- ( 26990, 0.0880, 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.0110, 0.00),
- ( 19496, 0.0220, 90.46),
- ( 30768, 0.0440, 338.44),
- ( 42712, 0.0660, 834.41),
- ( 53980, 0.0880, 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.0110, 0.00),
- ( 38990, 0.0220, 180.91),
- ( 61538, 0.0440, 676.88),
- ( 85422, 0.0660, 1668.99),
- ( 107960, 0.0880, 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.0110, 0.00),
- ( 375, 0.0220, 1.74),
- ( 592, 0.0440, 6.51),
- ( 821, 0.0660, 16.06),
- ( 1038, 0.0880, 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.0110, 0.00),
- ( 750, 0.0220, 3.48),
- ( 1184, 0.0440, 13.03),
- ( 1642, 0.066, 32.13),
- ( 2076, 0.0880, 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.0110, 0.00),
- ( 812, 0.0220, 3.77),
- ( 1282, 0.0440, 14.09),
- ( 1780, 0.0660, 34.77),
- ( 2249, 0.0880, 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.0110, 0.00),
- ( 1624, 0.0220, 7.55),
- ( 2564, 0.0440, 28.19),
- ( 3560, 0.0660, 69.55),
- ( 4498, 0.0880, 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.0110, 0.00),
- ( 4874, 0.0220, 22.62),
- ( 7692, 0.0440, 84.62),
- ( 10678, 0.066, 208.61),
- ( 13495, 0.0880, 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.0110, 0.00),
- ( 9748, 0.0220, 45.23),
- ( 15384, 0.0440, 169.22),
- ( 21356, 0.0660, 417.20),
- ( 26990, 0.0880, 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.0110, 0.00),
- ( 19495, 0.0220, 90.45),
- ( 30769, 0.0440, 338.43),
- ( 42711, 0.0660, 834.49),
- ( 53980, 0.0880, 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),
- ),
- },
- }
-
-
US CA California SIT Tax Rate
us_ca_sit_tax_rate
@@ -595,23 +312,274 @@
}
+
+ US CA California SIT Tax Rate
+ us_ca_sit_tax_rate
+ {
+ 'head_household': {
+ 'weekly': (
+ ( 344, 0.0110, 0.00),
+ ( 814, 0.0220, 3.78),
+ ( 1050, 0.0440, 14.12),
+ ( 1299, 0.0660, 24.50),
+ ( 1535, 0.0880, 40.93),
+ ( 7833, 0.1023, 61.70),
+ ( 9400, 0.1133, 705.99),
+ (15667, 0.1243, 883.53),
+ (19231, 0.1353, 1662.52),
+ ('inf', 0.1463, 2144.73),
+ ),
+ 'bi-weekly': (
+ ( 688, 0.0110, 0.00),
+ ( 1628, 0.0220, 7.57),
+ ( 2100, 0.0440, 28.25),
+ ( 2598, 0.0660, 49.02),
+ ( 3070, 0.0880, 81.89),
+ (15666, 0.1023, 123.43),
+ (18800, 0.1133, 1412.00),
+ (31334, 0.1243, 1767.08),
+ (38462, 0.1353, 3325.06),
+ ('inf', 0.1463, 4289.48),
+ ),
+ 'semi-monthly': (
+ ( 745, 0.0110, 0.00),
+ ( 1765, 0.0220, 8.20),
+ ( 2275, 0.0440, 30.64),
+ ( 2815, 0.0660, 53.08),
+ ( 3326, 0.0880, 88.72),
+ (16972, 0.1023, 133.69),
+ (20367, 0.1133, 1529.68),
+ (33944, 0.1243, 1914.33),
+ (41667, 0.1353, 3601.95),
+ ('inf', 0.1463, 4646.87),
+ ),
+ 'monthly': (
+ ( 1490, 0.0110, 0.00),
+ ( 3530, 0.0220, 16.39),
+ ( 4550, 0.0440, 61.27),
+ ( 5630, 0.0660, 106.15),
+ ( 6652, 0.0880, 177.43),
+ (33944, 0.1023, 267.37),
+ (40734, 0.1133, 3059.34),
+ (67888, 0.1243, 3828.65),
+ (83334, 0.1353, 7203.89),
+ ('inf', 0.1463, 9293.73),
+ ),
+ 'quarterly': (
+ ( 4469, 0.0110, 0.00),
+ ( 10588, 0.0220, 49.13),
+ ( 13649, 0.0440, 183.78),
+ ( 16892, 0.0660, 318.46),
+ ( 19953, 0.0880, 532.50),
+ (101832, 0.1023, 801.87),
+ (122199, 0.1133, 9178.09),
+ (203665, 0.1243, 11485.67),
+ (250000, 0.1353, 21611.89),
+ ( 'inf', 0.1463, 27881.02),
+ ),
+ 'semi-annual': (
+ ( 8938, 0.0110, 0.00),
+ ( 21176, 0.0220, 98.32),
+ ( 27298, 0.0440, 367.56),
+ ( 33784, 0.0660, 636.93),
+ ( 39906, 0.0880, 1065.01),
+ (203664, 0.1023, 1603.75),
+ (244398, 0.1133, 18356.19),
+ (407330, 0.1243, 22971.35),
+ (500000, 0.1353, 43223.80),
+ ( 'inf', 0.1463, 55762.05),
+ ),
+ 'annually': (
+ ( 17876, 0.0110, 0.00),
+ ( 42353, 0.0220, 196.64),
+ ( 54597, 0.0440, 735.13),
+ ( 67569, 0.0660, 1273.87),
+ ( 79812, 0.0880, 2130.02),
+ ( 407329, 0.1023, 3207.40),
+ ( 488796, 0.1133, 36712.39),
+ ( 814658, 0.1243, 45942.60),
+ (1000000, 0.1353, 86447.25),
+ ( 'inf', 0.1463, 111524.02),
+ ),
+ },
+ 'married': {
+ 'weekly': (
+ ( 344, 0.0110, 0.00),
+ ( 814, 0.0220, 3.78),
+ ( 1286, 0.0440, 14.12),
+ ( 1784, 0.0660, 34.89),
+ ( 2256, 0.0880, 67.76),
+ (11520, 0.1023, 109.30),
+ (13824, 0.1133, 1057.01),
+ (19231, 0.1243, 1318.05),
+ (23039, 0.1353, 1990.14),
+ ('inf', 0.1463, 2505.36),
+ ),
+ 'bi-weekly': (
+ ( 688, 0.0110, 0.00),
+ ( 1628, 0.0220, 7.57),
+ ( 2572, 0.0440, 28.25),
+ ( 3568, 0.0660, 69.79),
+ ( 4512, 0.0880, 135.53),
+ (23040, 0.1023, 218.60),
+ (27648, 0.1133, 2114.01),
+ (38462, 0.1243, 2636.10),
+ (46078, 0.1353, 2398.28),
+ ('inf', 0.1463, 5010.72),
+ ),
+ 'semi-monthly': (
+ ( 744, 0.0110, 0.00),
+ ( 1764, 0.0220, 8.18),
+ ( 2786, 0.0440, 30.62),
+ ( 3866, 0.0660, 75.59),
+ ( 4886, 0.0880, 146.87),
+ (24960, 0.1023, 236.63),
+ (29950, 0.1133, 2290.20),
+ (41667, 0.1243, 2855.57),
+ (49918, 0.1353, 4311.99),
+ ('inf', 0.1463, 5428.35),
+ ),
+ 'monthly': (
+ ( 1488, 0.0110, 0.00),
+ ( 3528, 0.0220, 16.37),
+ ( 5572, 0.0440, 61.25),
+ ( 7732, 0.0660, 151.19),
+ ( 9772, 0.0880, 293.75),
+ (49920, 0.1023, 473.27),
+ (59900, 0.1133, 4580.41),
+ (83334, 0.1243, 5711.14),
+ (99836, 0.1353, 8623.99),
+ ('inf', 0.1463, 10856.71),
+ ),
+ 'quarterly': (
+ ( 4466, 0.0110, 0.00),
+ ( 10588, 0.0220, 49.13),
+ ( 16710, 0.0440, 183.81),
+ ( 23198, 0.0660, 453.18),
+ ( 29318, 0.0880, 881.39),
+ (149754, 0.1023, 1419.95),
+ (179704, 0.1133, 13740.55),
+ (250000, 0.1243, 17133.89),
+ (299506, 0.1353, 25871.68),
+ ( 'inf', 0.1463, 32569.84),
+ ),
+ 'semi-annual': (
+ ( 8932, 0.0110, 0.00),
+ ( 21176, 0.0220, 98.25),
+ ( 33420, 0.0440, 367.62),
+ ( 46396, 0.0660, 906.36),
+ ( 58636, 0.0880, 1762.78),
+ (299508, 0.1023, 2839.90),
+ (359408, 0.1133, 27481.11),
+ (500000, 0.1243, 34267.78),
+ (599012, 0.1353, 51743.37),
+ ( 'inf', 0.1463, 65139.69),
+ ),
+ 'annually': (
+ ( 17864, 0.0110, 0.00),
+ ( 42350, 0.0220, 196.50),
+ ( 66842, 0.0440, 735.19),
+ ( 92788, 0.0660, 1812.84),
+ ( 117268, 0.0880, 3525.28),
+ ( 599016, 0.1023, 5679.52),
+ ( 718814, 0.1133, 54962.34),
+ (1000000, 0.1243, 68535.45),
+ (1198024, 0.1353, 103486.87),
+ ( 'inf', 0.1463, 130279.52),
+ ),
+ },
+ 'single': {
+ 'weekly': (
+ ( 172, 0.0110, 0.00),
+ ( 407, 0.0220, 1.89),
+ ( 643, 0.0440, 7.06),
+ ( 892, 0.0660, 17.44),
+ ( 1128, 0.0880, 33.87),
+ ( 5760, 0.1023, 54.64),
+ ( 6912, 0.1133, 528.49),
+ (11519, 0.1243, 659.01),
+ (19231, 0.1353, 1231.66),
+ ('inf', 0.1463, 2275.09),
+ ),
+ 'bi-weekly': (
+ ( 344, 0.0110, 0.00),
+ ( 814, 0.0220, 3.78),
+ ( 1286, 0.0440, 14.12),
+ ( 1784, 0.0660, 34.89),
+ ( 2256, 0.0880, 67.76),
+ (11520, 0.1023, 109.30),
+ (13824, 0.1133, 1057.01),
+ (23038, 0.1243, 1318.05),
+ (38462, 0.1353, 2463.35),
+ ('inf', 0.1463, 4550.22),
+ ),
+ 'semi-monthly': (
+ ( 372, 0.0110, 0.00),
+ ( 882, 0.0220, 4.09),
+ ( 1393, 0.0440, 15.31),
+ ( 1933, 0.0660, 37.79),
+ ( 2443, 0.0880, 73.43),
+ (12480, 0.1023, 118.31),
+ (14975, 0.1133, 1145.10),
+ (24959, 0.1243, 1427.78),
+ (41667, 0.1353, 2668.79),
+ ('inf', 0.1463, 4929.38),
+ ),
+ 'monthly': (
+ ( 744, 0.0110, 0.00),
+ ( 1764, 0.0220, 8.18),
+ ( 2786, 0.0440, 30.62),
+ ( 3866, 0.0660, 75.59),
+ ( 4886, 0.0880, 146.87),
+ (24960, 0.1023, 236.63),
+ (29950, 0.1133, 2290.20),
+ (49918, 0.1243, 2855.57),
+ (83334, 0.1353, 5337.59),
+ ('inf', 0.1463, 9858.77),
+ ),
+ 'quarterly': (
+ ( 2233, 0.0110, 0.00),
+ ( 5294, 0.0220, 24.56),
+ ( 8355, 0.0440, 91.90),
+ ( 11599, 0.0660, 226.58),
+ ( 14659, 0.0880, 440.68),
+ ( 74877, 0.1023, 709.96),
+ ( 89852, 0.1133, 6870.26),
+ (149753, 0.1243, 8566.93),
+ (250000, 0.1353, 16012.62),
+ ( 'inf', 0.1463, 29576.04),
+ ),
+ 'semi-annual': (
+ ( 4466, 0.0110, 0.00),
+ ( 10588, 0.0220, 49.13),
+ ( 16710, 0.0440, 183.81),
+ ( 23198, 0.0660, 453.18),
+ ( 29318, 0.0880, 881.39),
+ (149754, 0.1023, 1419.95),
+ (179704, 0.1133, 13740.55),
+ (299506, 0.1243, 17133.89),
+ (500000, 0.1353, 32025.28),
+ ( 'inf', 0.1463, 59152.12),
+ ),
+ 'annually': (
+ ( 8932, 0.0110, 0.00),
+ ( 21175, 0.0220, 98.25),
+ ( 33421, 0.0440, 367.60),
+ ( 46394, 0.0660, 906.42),
+ ( 58634, 0.0880, 1762.64),
+ ( 299508, 0.1023, 2839.76),
+ ( 359407, 0.1133, 27481.17),
+ ( 599012, 0.1243, 34267.73),
+ (1000000, 0.1353, 64050.63),
+ ( 'inf', 0.1463, 118304.31),
+ ),
+ },
+ }
+
+
-
- US CA California Low Income Exemption Rate
- us_ca_sit_income_exemption_rate
- {
- '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),
- }
-
-
@@ -628,23 +596,23 @@
}
+
+ US CA California Low Income Exemption Rate
+ us_ca_sit_income_exemption_rate
+ {
+ 'weekly': ( 294, 294, 587, 587),
+ 'bi-weekly': ( 587, 587, 1174, 1174),
+ 'semi-monthly': ( 636, 636, 1272, 1272),
+ 'monthly': ( 1272, 1272, 2545, 2545),
+ 'quarterly': ( 3817, 3817, 7634, 7634),
+ 'semi-annual': ( 7634, 7634, 15267, 15267),
+ 'annually': (15267, 15267, 30534, 30534),
+ }
+
+
-
- US CA California Estimated Deduction Rate
- us_ca_sit_estimated_deduction_rate
- {
- '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),
- }
-
-
@@ -664,20 +632,6 @@
-
- US CA California Standard Deduction Rate
- us_ca_sit_standard_deduction_rate
- {
- '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),
- }
-
-
@@ -694,23 +648,25 @@
}
+
+
+
+ US CA California Standard Deduction Rate
+ us_ca_sit_standard_deduction_rate
+ {
+ 'weekly': ( 88, 88, 177, 177),
+ 'bi-weekly': ( 177, 177, 354, 354),
+ 'semi-monthly': ( 192, 192, 383, 383),
+ 'monthly': ( 383, 383, 767, 767),
+ 'quarterly': (1150, 1150, 2301, 2301),
+ 'semi-annual': (2301, 2301, 4601, 4601),
+ 'annually': (4601, 4601, 9202, 9202),
+ }
+
+
-
- US CA California Exemption Allowance Rate
- us_ca_sit_exemption_allowance_rate
- {
- '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),
- }
-
-
@@ -727,6 +683,22 @@
}
+
+
+
+ US CA California Exemption Allowance Rate
+ us_ca_sit_exemption_allowance_rate
+ {
+ 'weekly': ( 2.62, 5.25, 7.87, 10.49, 13.12, 15.74, 18.36, 20.98, 23.61, 26.23),
+ 'bi-weekly': ( 5.25, 10.49, 15.74, 20.98, 26.23, 31.48, 36.72, 41.97, 47.22, 52.46),
+ 'semi-monthly': ( 5.68, 11.37, 17.05, 22.73, 28.42, 34.10, 39.78, 45.47, 51.15, 56.83),
+ 'monthly': ( 11.37, 22.73, 34.10, 45.47, 56.83, 68.20, 79.57, 90.93, 102.30, 113.67),
+ 'quarterly': ( 34.10, 68.20, 102.30, 136.40, 170.50, 204.60, 238.70, 272.80, 306.90, 341.00),
+ 'semi-annual': ( 68.20, 136.40, 204.60, 272.80, 341.00, 409.20, 477.40, 545.60, 613.80, 682.00),
+ 'annually': (136.40, 272.80, 409.20, 545.60, 682.00, 818.40, 954.80, 1091.20, 1227.60, 1364.00),
+ }
+
+
diff --git a/l10n_us_hr_payroll/data/state/ct_connecticut.xml b/l10n_us_hr_payroll/data/state/ct_connecticut.xml
index d74dc140..dd2ed137 100644
--- a/l10n_us_hr_payroll/data/state/ct_connecticut.xml
+++ b/l10n_us_hr_payroll/data/state/ct_connecticut.xml
@@ -2,12 +2,6 @@
-
- US CT Connecticut SUTA Wage Base
- us_ct_suta_wage_base
- 15000.0
-
-
US CT Connecticut SUTA Wage Base
us_ct_suta_wage_base
@@ -18,12 +12,6 @@
-
- US CT Connecticut SUTA Rate
- us_ct_suta_rate
- 3.4
-
-
US CT Connecticut SUTA Rate
us_ct_suta_rate
@@ -33,58 +21,6 @@
-
- US CT Connecticut SIT Initial Tax Rate
- us_ct_sit_initial_tax_rate
- {
- 'a': [
- ( 10000, 0, 3.00),
- ( 50000, 300, 5.00),
- (100000, 2300, 5.50),
- (200000, 5050, 6.00),
- (250000, 11050, 6.50),
- (500000, 14300, 6.90),
- ( 'inf', 31550, 6.99),
- ],
- 'b': [
- ( 16000, 0, 3.00),
- ( 80000, 480, 5.00),
- (160000, 3680, 5.50),
- (320000, 8080, 6.00),
- (400000, 17680, 6.50),
- (800000, 22880, 6.90),
- ( 'inf', 50480, 6.99),
- ],
- 'c': [
- ( 20000, 0, 3.00),
- ( 100000, 600, 5.00),
- ( 200000, 4600, 5.50),
- ( 400000, 10100, 6.00),
- ( 500000, 22100, 6.50),
- (1000000, 28600, 6.90),
- ( 'inf', 63100, 6.99),
- ],
- 'd': [
- ( 10000, 0, 3.00),
- ( 50000, 300, 5.00),
- (100000, 2300, 5.50),
- (200000, 5050, 6.00),
- (250000, 11050, 6.50),
- (500000, 14300, 6.90),
- ( 'inf', 31550, 6.99),
- ],
- 'f': [
- ( 10000, 0, 3.00),
- ( 50000, 300, 5.00),
- (100000, 2300, 5.50),
- (200000, 5050, 6.00),
- (250000, 11050, 6.50),
- (500000, 14300, 6.90),
- ( 'inf', 31550, 6.99),
- ],
- }
-
-
@@ -142,79 +78,6 @@
-
- US CT Connecticut Tax Rate
- us_ct_sit_tax_rate
- {
- 'a': [
- (50250, 0),
- (52750, 20),
- (55250, 40),
- (57750, 60),
- (60250, 80),
- (62750, 100),
- (65250, 120),
- (67750, 140),
- (70250, 160),
- (72750, 180),
- ('inf', 200),
- ],
- 'b': [
- ( 78500, 0),
- ( 82500, 32),
- ( 86500, 64),
- ( 90500, 96),
- ( 94500, 128),
- ( 98500, 160),
- (102500, 192),
- (106500, 224),
- (110500, 256),
- (114500, 288),
- ( 'inf', 320),
- ],
- 'c': [
- (100500, 0),
- (105500, 40),
- (110500, 80),
- (115500, 120),
- (120500, 160),
- (125500, 200),
- (130500, 240),
- (135500, 280),
- (140500, 320),
- (145500, 360),
- ( 'inf', 400),
-
- ],
- 'd': [
- (50250, 0),
- (52750, 20),
- (55250, 40),
- (57750, 60),
- (60250, 80),
- (62750, 100),
- (65250, 120),
- (67750, 140),
- (70250, 160),
- (72750, 180),
- ('inf', 200),
- ],
- 'f': [
- ( 56500, 0),
- ( 61500, 20),
- ( 66500, 40),
- ( 71500, 60),
- ( 76500, 80),
- ( 81500, 100),
- ( 86500, 120),
- ( 91500, 140),
- ( 96500, 160),
- (101500, 180),
- ( 'inf', 200),
- ],
- }
-
-
@@ -293,133 +156,6 @@
-
- US CT Connecticut Decimal Rate
- us_ct_sit_decimal_rate
- {
- 'a': [
- (15000, 0.75),
- (15500, 0.70),
- (16000, 0.65),
- (16500, 0.60),
- (17000, 0.55),
- (17500, 0.50),
- (18000, 0.45),
- (18500, 0.40),
- (20000, 0.35),
- (20500, 0.30),
- (21000, 0.25),
- (21500, 0.20),
- (25000, 0.15),
- (25500, 0.14),
- (26000, 0.13),
- (26500, 0.12),
- (27000, 0.11),
- (48000, 0.10),
- (48500, 0.09),
- (49000, 0.08),
- (49500, 0.08),
- (50000, 0.06),
- (50500, 0.05),
- (51000, 0.03),
- (51500, 0.03),
- (52000, 0.02),
- (52500, 0.01),
- ('inf', 0.00),
- ],
- 'b': [
- (24000, 0.75),
- (24500, 0.70),
- (25000, 0.65),
- (25500, 0.60),
- (26000, 0.55),
- (26500, 0.50),
- (27000, 0.45),
- (27500, 0.40),
- (34000, 0.35),
- (34500, 0.30),
- (35000, 0.25),
- (35500, 0.20),
- (44000, 0.15),
- (44500, 0.14),
- (45000, 0.13),
- (45500, 0.12),
- (46000, 0.11),
- (74000, 0.10),
- (74500, 0.09),
- (75000, 0.08),
- (75500, 0.08),
- (76000, 0.06),
- (76500, 0.05),
- (77000, 0.03),
- (77500, 0.03),
- (78000, 0.02),
- (78500, 0.01),
- ('inf', 0.00),
- ],
- 'c': [
- (30000, 0.75),
- (30500, 0.70),
- (31000, 0.65),
- (31500, 0.60),
- (32000, 0.55),
- (32500, 0.50),
- (33000, 0.45),
- (33500, 0.40),
- (40000, 0.35),
- (40500, 0.30),
- (41000, 0.25),
- (41500, 0.20),
- (50000, 0.15),
- (50500, 0.14),
- (51000, 0.13),
- (51500, 0.12),
- (52000, 0.11),
- (96000, 0.10),
- (96500, 0.09),
- (97000, 0.08),
- (97500, 0.08),
- (98000, 0.06),
- (98500, 0.05),
- (99000, 0.03),
- (99500, 0.03),
- (100000, 0.02),
- (100500, 0.01),
- ('inf', 0.00),
- ],
- 'f': [
- (18800, 0.75),
- (19300, 0.70),
- (19800, 0.65),
- (20300, 0.60),
- (20800, 0.55),
- (21300, 0.50),
- (21800, 0.45),
- (22300, 0.40),
- (25000, 0.35),
- (25500, 0.30),
- (26000, 0.25),
- (26500, 0.20),
- (31300, 0.15),
- (31800, 0.14),
- (32300, 0.13),
- (32800, 0.12),
- (33300, 0.11),
- (60000, 0.10),
- (60500, 0.09),
- (61000, 0.08),
- (61500, 0.08),
- (62000, 0.06),
- (62500, 0.05),
- (63000, 0.03),
- (63500, 0.03),
- (64000, 0.02),
- (64500, 0.01),
- ('inf', 0.00),
- ],
- }
-
-
@@ -991,95 +727,6 @@
-
- US CT Connecticut Personal Exemption Rate
- us_ct_sit_personal_exemption_rate
- {
- 'a' : [
- (24000, 12000),
- (25000, 11000),
- (26000, 10000),
- (27000, 9000),
- (28000, 8000),
- (29000, 7000),
- (30000, 6000),
- (31000, 5000),
- (32000, 4000),
- (33000, 3000),
- (34000, 2000),
- (35000, 1000),
- ('inf', 0),
- ],
- 'b' : [
- (38000, 19000),
- (39000, 18000),
- (40000, 17000),
- (41000, 16000),
- (42000, 15000),
- (43000, 14000),
- (44000, 13000),
- (45000, 12000),
- (46000, 11000),
- (47000, 10000),
- (48000, 9000),
- (49000, 8000),
- (50000, 7000),
- (51000, 6000),
- (52000, 5000),
- (53000, 4000),
- (54000, 3000),
- (55000, 2000),
- (56000, 1000),
- ('inf', 0),
- ],
- 'c': [
- (48000, 24000),
- (49000, 23000),
- (50000, 22000),
- (51000, 21000),
- (52000, 20000),
- (53000, 19000),
- (54000, 18000),
- (55000, 17000),
- (56000, 16000),
- (57000, 15000),
- (58000, 14000),
- (59000, 13000),
- (60000, 12000),
- (61000, 11000),
- (62000, 10000),
- (63000, 9000),
- (64000, 8000),
- (65000, 7000),
- (66000, 6000),
- (67000, 5000),
- (68000, 4000),
- (69000, 3000),
- (70000, 2000),
- (71000, 1000),
- ('inf', 0),
- ],
- 'f' : [
- (30000, 15000),
- (31000, 14000),
- (22000, 13000),
- (33000, 12000),
- (34000, 11000),
- (35000, 10000),
- (36000, 9000),
- (37000, 8000),
- (38000, 7000),
- (39000, 6000),
- (40000, 5000),
- (41000, 4000),
- (42000, 3000),
- (43000, 2000),
- (44000, 1000),
- ('inf', 0),
- ],
- }
-
-
diff --git a/l10n_us_hr_payroll/data/state/fl_florida.xml b/l10n_us_hr_payroll/data/state/fl_florida.xml
index 56265ef8..1c8a7472 100644
--- a/l10n_us_hr_payroll/data/state/fl_florida.xml
+++ b/l10n_us_hr_payroll/data/state/fl_florida.xml
@@ -2,12 +2,6 @@
-
- US FL Florida SUTA Wage Base
- us_fl_suta_wage_base
- 7000.00
-
-
US FL Florida SUTA Wage Base
us_fl_suta_wage_base
@@ -18,18 +12,18 @@
-
- US FL Florida SUTA Rate
- us_fl_suta_rate
- 2.7
-
-
US FL Florida SUTA Rate
us_fl_suta_rate
2.7
+
+ US FL Florida SUTA Rate
+ us_fl_suta_rate
+ 2.9
+
+
diff --git a/l10n_us_hr_payroll/data/state/ga_georgia.xml b/l10n_us_hr_payroll/data/state/ga_georgia.xml
index e53cf36d..dc9c778e 100644
--- a/l10n_us_hr_payroll/data/state/ga_georgia.xml
+++ b/l10n_us_hr_payroll/data/state/ga_georgia.xml
@@ -2,12 +2,6 @@
-
- US GA Georgia SUTA Wage Base
- us_ga_suta_wage_base
- 9500.00
-
-
US GA Georgia SUTA Wage Base
us_ga_suta_wage_base
@@ -18,12 +12,6 @@
-
- US GA Georgia SUTA Rate
- us_ga_suta_rate
- 2.7
-
-
US GA Georgia SUTA Rate
us_ga_suta_rate
@@ -33,303 +21,6 @@
-
- US GA Georgia SIT Rate Table
- us_ga_sit_rate
- {
- 'married filing joint, both spouses working': {
- 'weekly': (
- ( 9.50, 0.00, 1.00),
- (29.00, 0.10, 2.00),
- (48.00, 0.48, 3.00),
- (67.50, 1.06, 4.00),
- (96.00, 1.83, 5.00),
- ('inf', 3.27, 5.75),
- ),
- 'bi-weekly': (
- ( 19.00, 0.00, 1.00),
- ( 57.50, 0.19, 2.00),
- ( 96.00, 0.96, 3.00),
- (135.00, 2.12, 4.00),
- (192.00, 3.65, 5.00),
- ( 'inf', 6.54, 5.75),
- ),
- 'semi-monthly': (
- ( 21.00, 0.00, 1.00),
- ( 62.50, 0.21, 2.00),
- (104.00, 1.04, 3.00),
- (146.00, 2.29, 4.00),
- (208.00, 3.96, 5.00),
- ( 'inf', 7.08, 5.75),
- ),
- 'monthly': (
- ( 41.50, 0.00, 1.00),
- (125.50, 0.42, 2.00),
- (208.00, 2.08, 3.00),
- (292.00, 4.58, 4.00),
- (417.00, 7.92, 5.00),
- ( 'inf', 14.17, 5.75),
- ),
- 'quarterly': (
- ( 125.00, 0.00, 1.00),
- ( 375.00, 1.25, 2.00),
- ( 625.00, 6.25, 3.00),
- ( 875.00, 13.75, 4.00),
- (1250.00, 23.75, 5.00),
- ( 'inf', 42.50, 5.75),
- ),
- 'semi-annual': (
- ( 250.00, 0.00, 1.00),
- ( 750.00, 2.50, 2.00),
- (1250.00, 12.50, 3.00),
- (1750.00, 27.50, 4.00),
- (2500.00, 47.50, 5.00),
- ( 'inf', 85.00, 5.75),
- ),
- 'annual': (
- ( 500.00, 0.00, 1.00),
- (1500.00, 5.00, 2.00),
- (2500.00, 25.00, 3.00),
- (3500.00, 55.00, 4.00),
- (5000.00, 95.00, 5.00),
- ( 'inf', 170.00, 5.75),
- ),
- },
- 'married filing joint, one spouse working': {
- 'weekly': (
- ( 19.00, 0.00, 1.00),
- ( 57.50, 0.19, 2.00),
- ( 96.00, 0.96, 3.00),
- (135.00, 2.12, 4.00),
- (192.50, 3.65, 5.00),
- ( 'inf', 6.54, 5.75),
- ),
- 'bi-weekly': (
- ( 38.50, 0.00, 1.00),
- (115.00, 0.38, 2.00),
- (192.00, 1.92, 3.00),
- (269.00, 4.23, 4.00),
- (385.00, 7.31, 5.00),
- ( 'inf', 13.08, 5.75),
- ),
- 'semi-monthly': (
- ( 41.50, 0.00, 1.00),
- (125.00, 0.42, 2.00),
- (208.00, 2.08, 3.00),
- (292.00, 4.58, 4.00),
- (417.00, 7.92, 5.00),
- ( 'inf', 14.17, 5.75),
- ),
- 'monthly': (
- ( 83.00, 0.00, 1.00),
- (250.00, 0.83, 2.00),
- (417.00, 4.17, 3.00),
- (583.00, 9.17, 4.00),
- (833.00, 15.83, 5.00),
- ( 'inf', 28.33, 5.75),
- ),
- 'quarterly': (
- ( 250.00, 0.00, 1.00),
- ( 750.00, 2.50, 2.00),
- (1250.00, 12.50, 3.00),
- (1750.00, 27.50, 4.00),
- (2500.00, 47.50, 5.00),
- ( 'inf', 85.00, 5.75),
- ),
- 'semi-annual': (
- ( 500.00, 0.00, 1.00),
- (1500.00, 5.00, 2.00),
- (2500.00, 25.00, 3.00),
- (3500.00, 55.00, 4.00),
- (5000.00, 95.00, 5.00),
- ( 'inf', 170.00, 5.75),
- ),
- 'annual': (
- ( 1000.00, 0.00, 1.00),
- ( 3000.00, 10.00, 2.00),
- ( 5000.00, 50.00, 3.00),
- ( 7000.00, 110.00, 4.00),
- (10000.00, 190.00, 5.00),
- ( 'inf', 340.00, 5.75),
- ),
- },
- 'single': {
- 'weekly': (
- ( 14.50, 0.00, 1.00),
- ( 43.50, 0.14, 2.00),
- ( 72.00, 0.72, 3.00),
- (101.00, 1.59, 4.00),
- (135.00, 2.74, 5.00),
- ( 'inf', 4.42, 5.75),
- ),
- 'bi-weekly': (
- ( 29.00, 0.00, 1.00),
- ( 86.50, 0.29, 2.00),
- (144.00, 1.44, 3.00),
- (202.00, 3.17, 4.00),
- (269.00, 5.48, 5.00),
- ( 'inf', 8.85, 5.75),
- ),
- 'semi-monthly': (
- ( 31.00, 0.00, 1.00),
- ( 93.50, 0.31, 2.00),
- (156.00, 1.56, 3.00),
- (219.00, 3.34, 4.00),
- (292.00, 5.94, 5.00),
- ( 'inf', 9.58, 5.75),
- ),
- 'monthly': (
- ( 62.50, 0.00, 1.00),
- (187.00, 0.62, 2.00),
- (312.00, 3.12, 3.00),
- (437.00, 6.87, 4.00),
- (583.00, 11.87, 5.00),
- ( 'inf', 19.17, 5.75),
- ),
- 'quarterly': (
- ( 187.50, 0.00, 1.00),
- ( 562.50, 1.88, 2.00),
- ( 937.50, 9.38, 3.00),
- (1312.00, 20.63, 4.00),
- (1750.00, 35.63, 5.00),
- ( 'inf', 57.50, 5.75),
- ),
- 'semi-annual': (
- ( 375.00, 0.00, 1.00),
- (1125.00, 3.75, 2.00),
- (1875.00, 18.75, 3.00),
- (2625.00, 41.25, 4.00),
- (3500.00, 71.25, 5.00),
- ( 'inf', 115.00, 5.75),
- ),
- 'annual': (
- ( 750.00, 0.00, 1.00),
- (2250.00, 7.50, 2.00),
- (3750.00, 37.50, 3.00),
- (5250.00, 82.50, 4.00),
- (7000.00, 142.50, 5.00),
- ( 'inf', 230.00, 5.75),
- ),
- },
- 'head of household': {
- 'weekly': (
- ( 19.00, 0.00, 1.00),
- ( 57.50, 0.19, 2.00),
- ( 96.00, 0.96, 3.00),
- (135.00, 2.12, 4.00),
- (192.50, 3.65, 5.00),
- ( 'inf', 6.54, 5.75),
- ),
- 'bi-weekly': (
- ( 38.50, 0.00, 1.00),
- (115.00, 0.38, 2.00),
- (192.00, 1.92, 3.00),
- (269.00, 4.23, 4.00),
- (385.00, 7.31, 5.00),
- ( 'inf', 13.08, 5.75),
- ),
- 'semi-monthly': (
- ( 41.50, 0.00, 1.00),
- (125.00, 0.42, 2.00),
- (208.00, 2.08, 3.00),
- (292.00, 4.58, 4.00),
- (417.00, 7.92, 5.00),
- ( 'inf', 14.17, 5.75),
- ),
- 'monthly': (
- ( 83.00, 0.00, 1.00),
- (250.00, 0.83, 2.00),
- (417.00, 4.17, 3.00),
- (583.00, 9.17, 4.00),
- (833.00, 15.83, 5.00),
- ( 'inf', 28.33, 5.75),
- ),
- 'quarterly': (
- ( 250.00, 0.00, 1.00),
- ( 750.00, 2.50, 2.00),
- (1250.00, 12.50, 3.00),
- (1750.00, 27.50, 4.00),
- (2500.00, 47.50, 5.00),
- ( 'inf', 85.00, 5.75),
- ),
- 'semi-annual': (
- ( 500.00, 0.00, 1.00),
- (1500.00, 5.00, 2.00),
- (2500.00, 25.00, 3.00),
- (3500.00, 55.00, 4.00),
- (5000.00, 95.00, 5.00),
- ( 'inf', 170.00, 5.75),
- ),
- 'annual': (
- ( 1000.00, 0.00, 1.00),
- ( 3000.00, 10.00, 2.00),
- ( 5000.00, 50.00, 3.00),
- ( 7000.00, 110.00, 4.00),
- (10000.00, 190.00, 5.00),
- ( 'inf', 340.00, 5.75),
- ),
- },
- 'married filing separate': {
- 'weekly': (
- ( 9.50, 0.00, 1.00),
- (29.00, 0.10, 2.00),
- (48.00, 0.48, 3.00),
- (67.50, 1.06, 4.00),
- (96.00, 1.83, 5.00),
- ('inf', 3.27, 5.75),
- ),
- 'bi-weekly': (
- ( 19.00, 0.00, 1.00),
- ( 57.50, 0.19, 2.00),
- ( 96.00, 0.96, 3.00),
- (135.00, 2.12, 4.00),
- (192.00, 3.65, 5.00),
- ( 'inf', 6.54, 5.75),
- ),
- 'semi-monthly': (
- ( 21.00, 0.00, 1.00),
- ( 62.50, 0.21, 2.00),
- (104.00, 1.04, 3.00),
- (146.00, 2.29, 4.00),
- (208.00, 3.96, 5.00),
- ( 'inf', 7.08, 5.75),
- ),
- 'monthly': (
- ( 41.50, 0.00, 1.00),
- (125.50, 0.42, 2.00),
- (208.00, 2.08, 3.00),
- (292.00, 4.58, 4.00),
- (417.00, 7.92, 5.00),
- ( 'inf', 14.17, 5.75),
- ),
- 'quarterly': (
- ( 125.00, 0.00, 1.00),
- ( 375.00, 1.25, 2.00),
- ( 625.00, 6.25, 3.00),
- ( 875.00, 13.75, 4.00),
- (1250.00, 23.75, 5.00),
- ( 'inf', 42.50, 5.75),
- ),
- 'semi-annual': (
- ( 250.00, 0.00, 1.00),
- ( 750.00, 2.50, 2.00),
- (1250.00, 12.50, 3.00),
- (1750.00, 27.50, 4.00),
- (2500.00, 47.50, 5.00),
- ( 'inf', 85.00, 5.75),
- ),
- 'annual': (
- ( 500.00, 0.00, 1.00),
- (1500.00, 5.00, 2.00),
- (2500.00, 25.00, 3.00),
- (3500.00, 55.00, 4.00),
- (5000.00, 95.00, 5.00),
- ( 'inf', 170.00, 5.75),
- ),
- },
- }
-
-
@@ -632,58 +323,6 @@
-
- US GA Georgia SIT Personal Allowance
- us_ga_sit_personal_allowance
- {
- 'married filing joint, both spouses working': {
- 'weekly': 142.30,
- 'bi-weekly': 284.62,
- 'semi-monthly': 308.33,
- 'monthly': 616.67,
- 'quarterly': 1850.00,
- 'semi-annual': 3700.00,
- 'annual': 7400.00,
- },
- 'married filing joint, one spouse working': {
- 'weekly': 142.30,
- 'bi-weekly': 284.62,
- 'semi-monthly': 308.33,
- 'monthly': 616.67,
- 'quarterly': 1850.00,
- 'semi-annual': 3700.00,
- 'annual': 7400.00,
- },
- 'single': {
- 'weekly': 51.92,
- 'bi-weekly': 103.85,
- 'semi-monthly': 112.50,
- 'monthly': 225.00,
- 'quarterly': 675.00,
- 'semi-annual': 1350.00,
- 'annual': 2700.00,
- },
- 'head of household': {
- 'weekly': 51.92,
- 'bi-weekly': 103.85,
- 'semi-monthly': 112.50,
- 'monthly': 225.00,
- 'quarterly': 675.00,
- 'semi-annual': 1350.00,
- 'annual': 2700.00,
- },
- 'married filing separate': {
- 'weekly': 71.15,
- 'bi-weekly': 142.30,
- 'semi-monthly': 154.16,
- 'monthly': 308.33,
- 'quarterly': 925.00,
- 'semi-annual': 1850.00,
- 'annual': 3700.00,
- },
- }
-
-
@@ -741,20 +380,6 @@
-
- US GA Georgia SIT Dependent Allowance Rate
- us_ga_sit_dependent_allowance_rate
- {
- 'weekly': 57.50,
- 'bi-weekly': 115.00,
- 'semi-monthly': 125.00,
- 'monthly': 250.00,
- 'quarterly': 750.00,
- 'semi-annual': 1500.00,
- 'annual': 3000.00,
- }
-
-
@@ -774,58 +399,6 @@
-
- US GA Georgia SIT Deduction
- us_ga_sit_deduction
- {
- 'married filing joint, both spouses working': {
- 'weekly': 115.50,
- 'bi-weekly': 230.75,
- 'semi-monthly': 250.00,
- 'monthly': 500.00,
- 'quarterly': 1500.00,
- 'semi-annual': 3000.00,
- 'annual': 6000.00,
- },
- 'married filing joint, one spouse working': {
- 'weekly': 115.50,
- 'bi-weekly': 230.75,
- 'semi-monthly': 250.00,
- 'monthly': 500.00,
- 'quarterly': 1500.00,
- 'semi-annual': 3000.00,
- 'annual': 6000.00,
- },
- 'single': {
- 'weekly': 88.50,
- 'bi-weekly': 177.00,
- 'semi-monthly': 191.75,
- 'monthly': 383.50,
- 'quarterly': 1150.00,
- 'semi-annual': 2300.00,
- 'annual': 4600.00,
- },
- 'head of household': {
- 'weekly': 88.50,
- 'bi-weekly': 177.00,
- 'semi-monthly': 191.75,
- 'monthly': 383.50,
- 'quarterly': 1150.00,
- 'semi-annual': 2300.00,
- 'annual': 4600.00,
- },
- 'married filing separate': {
- 'weekly': 57.75,
- 'bi-weekly': 115.50,
- 'semi-monthly': 125.00,
- 'monthly': 250.00,
- 'quarterly': 750.00,
- 'semi-annual': 1500.00,
- 'annual': 3000.00,
- },
- }
-
-
diff --git a/l10n_us_hr_payroll/data/state/hi_hawaii.xml b/l10n_us_hr_payroll/data/state/hi_hawaii.xml
index e4c07ab2..0e792c3b 100644
--- a/l10n_us_hr_payroll/data/state/hi_hawaii.xml
+++ b/l10n_us_hr_payroll/data/state/hi_hawaii.xml
@@ -2,34 +2,34 @@
-
- US HI Hawaii SUTA Wage Base
- us_hi_suta_wage_base
- 46800.0
-
-
US HI Hawaii SUTA Wage Base
us_hi_suta_wage_base
48100.0
+
+ US HI Hawaii SUTA Wage Base
+ us_hi_suta_wage_base
+ 47400.0
+
+
-
- US HI Hawaii SUTA Rate
- us_hi_suta_rate
- 2.40
-
-
US HI Hawaii SUTA Rate
us_hi_suta_rate
2.40
+
+ US HI Hawaii SUTA Rate
+ us_hi_suta_rate
+ 5.2
+
+
diff --git a/l10n_us_hr_payroll/data/state/ia_iowa.xml b/l10n_us_hr_payroll/data/state/ia_iowa.xml
index 89e9e036..773c16d6 100644
--- a/l10n_us_hr_payroll/data/state/ia_iowa.xml
+++ b/l10n_us_hr_payroll/data/state/ia_iowa.xml
@@ -2,28 +2,22 @@
-
- US IA Iowa SUTA Wage Base
- us_ia_suta_wage_base
- 30600.0
-
-
US IA Iowa SUTA Wage Base
us_ia_suta_wage_base
31600.0
+
+ US IA Iowa SUTA Wage Base
+ us_ia_suta_wage_base
+ 32400.0
+
+
-
- US IA Iowa SUTA Rate
- us_ia_suta_rate
- 1.0
-
-
US IA Iowa SUTA Rate
us_ia_suta_rate
@@ -33,79 +27,6 @@
-
- US IA Iowa SIT Tax Rate
- us_ia_sit_tax_rate
- {
- 'daily': (
- ( 5.13, 0.0033, 0.00),
- ( 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.00),
- ( 51.27, 0.0067, 0.08),
- ( 102.52, 0.0225, 0.25),
- ( 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.0225, 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),
- ),
- }
-
-
@@ -182,22 +103,71 @@
}
+
+ US IA Iowa SIT Tax Rate
+ us_ia_sit_tax_rate
+ {
+ 'weekly': (
+ ( 32.23, 0.0033, 0.00),
+ ( 64.46, 0.0067, 0.11),
+ ( 128.92, 0.0225, 0.33),
+ ( 290.08, 0.0414, 1.78),
+ ( 483.46, 0.0563, 8.45),
+ ( 644.62, 0.0596, 19.34),
+ ( 966.92, 0.0625, 28.95),
+ (1450.38, 0.0744, 49.09),
+ ( 'inf', 0.0853, 85.06),
+ ),
+ 'bi-weekly': (
+ ( 64.46, 0.0033, 0.00),
+ ( 128.92, 0.0067, 0.21),
+ ( 257.85, 0.0225, 0.64),
+ ( 580.15, 0.0414, 3.54),
+ ( 966.92, 0.0563, 16.88),
+ (1289.23, 0.0596, 38.66),
+ (1933.85, 0.0625, 57.87),
+ (2900.77, 0.0744, 98.16),
+ ( 'inf', 0.0853, 170.10),
+ ),
+ 'semi-monthly': (
+ ( 69.83, 0.0033, 0.00),
+ ( 139.67, 0.0067, 0.23),
+ ( 279.33, 0.0225, 0.70),
+ ( 628.50, 0.0414, 3.84),
+ (1047.50, 0.0563, 18.30),
+ (1396.67, 0.0596, 41.89),
+ (2095.00, 0.0625, 62.70),
+ (3142.50, 0.0744, 106.35),
+ ( 'inf', 0.0853, 184.28),
+ ),
+ 'monthly': (
+ ( 139.67, 0.0033, 0.00),
+ ( 279.33, 0.0067, 0.46),
+ ( 558.67, 0.0225, 1.40),
+ (1257.00, 0.0414, 7.69),
+ (2095.00, 0.0563, 36.60),
+ (2793.33, 0.0596, 83.78),
+ (4190.00, 0.0625, 125.40),
+ (6285.00, 0.0744, 212.69),
+ ( 'inf', 0.0853, 368.56),
+ ),
+ 'annual': (
+ ( 1676.00, 0.0033, 0.00),
+ ( 3352.00, 0.0067, 5.53),
+ ( 6704.00, 0.0225, 16.76),
+ (15084.00, 0.0414, 92.18),
+ (25140.00, 0.0563, 439.11),
+ (33520.00, 0.0596, 1005.26),
+ (50280.00, 0.0625, 1504.71),
+ (75420.00, 0.0744, 2552.21),
+ ( 'inf', 0.0853, 4422.63),
+ ),
+ }
+
+
-
- US IA Iowa Standard Deduction Rate
- us_ia_sit_standard_deduction_rate
- {
- '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),
- }
-
-
@@ -213,22 +183,21 @@
}
+
+ US IA Iowa Standard Deduction Rate
+ us_ia_sit_standard_deduction_rate
+ {
+ 'weekly': ( 40.96, 100.77),
+ 'bi-weekly': ( 81.92, 201.54),
+ 'semi-monthly': ( 88.75, 218.33),
+ 'monthly': ( 177.50, 436.67),
+ 'annually': (2130.00, 5240.00),
+ }
+
+
-
- US IA Iowa Deduction Allowance Rate
- us_ia_sit_deduction_allowance_rate
- {
- 'daily': 0.15,
- 'weekly': 0.77,
- 'bi-weekly': 1.54,
- 'semi-monthly': 1.67,
- 'monthly': 3.33,
- 'annually': 40.00,
- }
-
-
diff --git a/l10n_us_hr_payroll/data/state/id_idaho.xml b/l10n_us_hr_payroll/data/state/id_idaho.xml
index 7331326e..a75b16d5 100644
--- a/l10n_us_hr_payroll/data/state/id_idaho.xml
+++ b/l10n_us_hr_payroll/data/state/id_idaho.xml
@@ -2,28 +2,22 @@
-
- US ID Idaho SUTA Wage Base
- us_id_suta_wage_base
- 40000.0
-
-
US ID Idaho SUTA Wage Base
us_id_suta_wage_base
41600.0
+
+ US ID Idaho SUTA Wage Base
+ us_id_suta_wage_base
+ 43000.0
+
+
-
- US ID Idaho SUTA Rate
- us_id_suta_rate
- 1.0
-
-
US ID Idaho SUTA Rate
us_id_suta_rate
@@ -33,169 +27,6 @@
-
- US ID Idaho SIT Tax Rate
- us_id_sit_tax_rate
- {
- 'single': {
- 'weekly': (
- ( 235, 0.00, 0.000),
- ( 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.000),
- ( 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.000),
- ( 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.000),
- ( 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.000),
- (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.000),
- ( 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.000),
- ( 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.000),
- ( 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.000),
- ( 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.000),
- (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.000),
- ( 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.000),
- ( 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.000),
- ( 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.000),
- ( 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.000),
- (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),
- ),
- },
- }
-
-
@@ -364,18 +195,6 @@
-
- US ID Idaho Child Tax Credit Allowance Rate
- us_id_sit_ictcat_rate
- {
- 'weekly': 56.92,
- 'bi-weekly': 113.85,
- 'semi-monthly': 123.33,
- 'monthly': 246.67,
- 'annually': 2960.00,
- }
-
-
diff --git a/l10n_us_hr_payroll/data/state/il_illinois.xml b/l10n_us_hr_payroll/data/state/il_illinois.xml
index 2dbcac77..11daf905 100644
--- a/l10n_us_hr_payroll/data/state/il_illinois.xml
+++ b/l10n_us_hr_payroll/data/state/il_illinois.xml
@@ -2,58 +2,54 @@
-
- US IL Illinois SUTA Wage Base
- us_il_suta_wage_base
- 12960.0
-
-
US IL Illinois SUTA Wage Base
us_il_suta_wage_base
12740.0
+
+
+ US IL Illinois SUTA Wage Base
+ us_il_suta_wage_base
+ 12960.0
+
+
-
- US IL Illinois SUTA Rate
- us_il_suta_rate
- 3.175
-
-
US IL Illinois SUTA Rate
us_il_suta_rate
3.125
+
+
+ US IL Illinois SUTA Rate
+ us_il_suta_rate
+ 3.175
+
+
-
- US IL Illinois Basic Allowances Rate
- us_il_sit_basic_allowances_rate
- 2275.0
-
-
US IL Illinois Basic Allowances Rate
us_il_sit_basic_allowances_rate
2325.0
+
+ US IL Illinois Basic Allowances Rate
+ us_il_sit_basic_allowances_rate
+ 2375.0
+
+
-
- US IL Illinois Additional Allowances Rate
- us_il_sit_additional_allowances_rate
- 1000.0
-
-
US IL Illinois Additional Allowances Rate
us_il_sit_additional_allowances_rate
diff --git a/l10n_us_hr_payroll/data/state/ky_kentucky.xml b/l10n_us_hr_payroll/data/state/ky_kentucky.xml
index 53eb3190..49b1ff8d 100644
--- a/l10n_us_hr_payroll/data/state/ky_kentucky.xml
+++ b/l10n_us_hr_payroll/data/state/ky_kentucky.xml
@@ -8,6 +8,12 @@
10800.0
+
+ US KY Kentucky SUTA Wage Base
+ us_ky_suta_wage_base
+ 11100.0
+
+
@@ -28,6 +34,12 @@
2650
+
+ US KY Kentucky Standard Deduction Rate
+ us_ky_sit_standard_deduction_rate
+ 2690
+
+
diff --git a/l10n_us_hr_payroll/data/state/la_louisiana.xml b/l10n_us_hr_payroll/data/state/la_louisiana.xml
index 78cd6069..f67ff3a1 100644
--- a/l10n_us_hr_payroll/data/state/la_louisiana.xml
+++ b/l10n_us_hr_payroll/data/state/la_louisiana.xml
@@ -2,12 +2,6 @@
-
- US LA Louisiana SUTA Wage Base
- us_la_suta_wage_base
- 7700.0
-
-
US LA Louisiana SUTA Wage Base
us_la_suta_wage_base
@@ -18,38 +12,21 @@
-
- US LA Louisiana SUTA Rate
- us_la_suta_rate
- 1.14
-
-
US LA Louisiana SUTA Rate
us_la_suta_rate
1.14
+
+ US LA Louisiana SUTA Rate
+ us_la_suta_rate
+ 1.0
+
+
-
- US LA Louisiana SIT Tax Rate
- us_la_sit_tax_rate
- {
- 'single': (
- (12500.00, 2.10),
- (50000.00, 1.60),
- ( 'inf', 1.35),
- ),
- 'married': (
- ( 25000.00, 2.10),
- (100000.00, 1.65),
- ( 'inf', 1.35),
- ),
- }
-
-
US LA Louisiana SIT Tax Rate
us_la_sit_tax_rate
@@ -67,15 +44,26 @@
}
+
+ US LA Louisiana SIT Tax Rate
+ us_la_sit_tax_rate
+ {
+ 'single': (
+ (12500.00, 2.00),
+ (50000.00, 4.00),
+ ( 'inf', 6.00)
+ ),
+ 'married': (
+ ( 25000.00, 2.00),
+ (100000.00, 4.00),
+ ( 'inf', 6.00)
+ ),
+ }
+
+
-
- US LA Louisiana Personal Exemption Rate
- us_la_sit_personal_exemption_rate
- 4500
-
-
US LA Louisiana Personal Exemption Rate
us_la_sit_personal_exemption_rate
@@ -85,12 +73,6 @@
-
- US LA Louisiana Dependent Rate
- us_la_sit_dependent_rate
- 1000.0
-
-
US LA Louisiana Dependent Rate
us_la_sit_dependent_rate
diff --git a/l10n_us_hr_payroll/data/state/me_maine.xml b/l10n_us_hr_payroll/data/state/me_maine.xml
index 15fadbb9..414fcf7e 100644
--- a/l10n_us_hr_payroll/data/state/me_maine.xml
+++ b/l10n_us_hr_payroll/data/state/me_maine.xml
@@ -18,6 +18,12 @@
1.92
+
+ US ME Maine SUTA Rate
+ us_me_suta_rate
+ 2.31
+
+
@@ -38,6 +44,23 @@
}
+
+ US ME Maine SIT Tax Rate
+ us_me_sit_tax_rate
+ {
+ 'single': (
+ ( 22450, 0, 5.80),
+ ( 53150, 1302, 6.75),
+ ( 'inf', 3374, 7.15),
+ ),
+ 'married': (
+ ( 44950, 0, 5.80),
+ ( 106350, 2607, 6.75),
+ ( 'inf', 6752, 7.15),
+ ),
+ }
+
+
@@ -56,6 +79,21 @@
}
+
+ US ME Maine Standard Deduction Rate
+ us_me_sit_standard_deduction_rate
+ {
+ 'single': {
+ ( 83850, 9700),
+ (158850, 75000),
+ },
+ 'married': {
+ (167700, 22250),
+ (317700, 150000),
+ },
+ }
+
+
diff --git a/l10n_us_hr_payroll/data/state/mi_michigan.xml b/l10n_us_hr_payroll/data/state/mi_michigan.xml
index df0f6352..dc9fec08 100644
--- a/l10n_us_hr_payroll/data/state/mi_michigan.xml
+++ b/l10n_us_hr_payroll/data/state/mi_michigan.xml
@@ -2,28 +2,22 @@
-
- US MI Michigan SUTA Wage Base
- us_mi_suta_wage_base
- 9500.0
-
-
US MI Michigan SUTA Wage Base
us_mi_suta_wage_base
9000.0
+
+ US MI Michigan SUTA Wage Base
+ us_mi_suta_wage_base
+ 9500.0
+
+
-
- US MI Michigan SUTA Rate
- us_mi_suta_rate
- 2.7
-
-
US MI Michigan SUTA Rate
us_mi_suta_rate
@@ -33,18 +27,18 @@
-
- US MI Michigan Exemption Rate
- us_mi_sit_exemption_rate
- 4400.0
-
-
US MI Michigan Exemption Rate
us_mi_sit_exemption_rate
4750.0
+
+ US MI Michigan Exemption Rate
+ us_mi_sit_exemption_rate
+ 4900.0
+
+
diff --git a/l10n_us_hr_payroll/data/state/mn_minnesota.xml b/l10n_us_hr_payroll/data/state/mn_minnesota.xml
index 6408358c..2476735e 100644
--- a/l10n_us_hr_payroll/data/state/mn_minnesota.xml
+++ b/l10n_us_hr_payroll/data/state/mn_minnesota.xml
@@ -2,12 +2,6 @@
-
- US MN Minnesota SUTA Wage Base
- us_mn_suta_wage_base
- 34000.0
-
-
US MN Minnesota SUTA Wage Base
us_mn_suta_wage_base
@@ -18,12 +12,6 @@
-
- US MN Minnesota SUTA Rate
- us_mn_suta_rate
- 1.11
-
-
US MN Minnesota SUTA Rate
us_mn_suta_rate
@@ -33,25 +21,6 @@
-
- US MN Minnesota SIT Tax Rate
- us_mn_sit_tax_rate
- {
- 'single': (
- ( 28920, 2400, 5.35, 0.00),
- ( 89510, 28920, 7.05, 1418.82),
- (166290, 89510, 7.85, 5690.42),
- ( 'inf', 166290, 9.85, 11717.65),
- ),
- 'married': (
- ( 47820, 9050, 5.35, 0.00),
- ( 163070, 47820, 7.05, 2074.20),
- ( 282200, 163070, 7.85, 10199.33),
- ( 'inf', 282200, 9.85, 19551.04),
- ),
- }
-
-
@@ -73,15 +42,28 @@
}
+
+ US MN Minnesota SIT Tax Rate
+ us_mn_sit_tax_rate
+ {
+ 'single': (
+ ( 31055, 3825, 5.35, 0.00),
+ ( 93265, 31055, 6.80, 1418.82),
+ (169865, 93265, 7.85, 5687.09),
+ ( 'inf', 169865, 9.85, 11700.19),
+ ),
+ 'married': (
+ ( 51810, 12000, 5.35, 0.00),
+ ( 170140, 51810, 6.80, 2129.84),
+ ( 288200, 170140, 7.85, 10176.28),
+ ( 'inf', 288200, 9.85, 19443.99),
+ ),
+ }
+
+
-
- US MN Minnesota Allowances Rate
- us_mn_sit_allowances_rate
- 4250.0
-
-
@@ -90,6 +72,12 @@
4300.0
+
+ US MN Minnesota Allowances Rate
+ us_mn_sit_allowances_rate
+ 4350.0
+
+
diff --git a/l10n_us_hr_payroll/data/state/mo_missouri.xml b/l10n_us_hr_payroll/data/state/mo_missouri.xml
index 500126b2..57923828 100644
--- a/l10n_us_hr_payroll/data/state/mo_missouri.xml
+++ b/l10n_us_hr_payroll/data/state/mo_missouri.xml
@@ -2,54 +2,37 @@
-
- US MO Missouri SUTA Wage Base
- us_mo_suta_wage_base
- 12000.0
-
-
US MO Missouri SUTA Wage Base
us_mo_suta_wage_base
11500.0
+
+ US MO Missouri SUTA Wage Base
+ us_mo_suta_wage_base
+ 11000.0
+
+
-
- US MO Missouri SUTA Rate
- us_mo_suta_rate
- 2.376
-
-
US MO Missouri SUTA Rate
us_mo_suta_rate
2.376
+
+ US MO Missouri SUTA Rate
+ us_mo_suta_rate
+ 2.7
+
+
-
-
- US MO Missouri SIT Rate Table
- us_mo_sit_rate
- [
- (1053.0, 1.5),
- (1053.0, 2.0),
- (1053.0, 2.5),
- (1053.0, 3.0),
- (1053.0, 3.5),
- (1053.0, 4.0),
- (1053.0, 4.5),
- (1053.0, 5.0),
- ( 'inf', 5.4),
- ]
-
-
@@ -68,20 +51,25 @@
]
+
+ US MO Missouri SIT Rate Table
+ us_mo_sit_rate
+ [
+ (1088.0, 1.5),
+ (1088.0, 2.0),
+ (1088.0, 2.5),
+ (1088.0, 3.0),
+ (1088.0, 3.5),
+ (1088.0, 4.0),
+ (1088.0, 4.5),
+ (1088.0, 5.0),
+ ( 'inf', 5.4),
+ ]
+
+
-
-
- US MO Missouri SIT Deduction
- us_mo_sit_deduction
- {
- 'single': 12400.0,
- 'married': 24800.0,
- 'head_of_household': 18650.0,
- }
-
-
@@ -94,6 +82,16 @@
}
+
+ US MO Missouri SIT Deduction
+ us_mo_sit_deduction
+ {
+ 'single': 12550.0,
+ 'married': 25100.0,
+ 'head_of_household': 18800.0,
+ }
+
+
diff --git a/l10n_us_hr_payroll/data/state/ms_mississippi.xml b/l10n_us_hr_payroll/data/state/ms_mississippi.xml
index fd9d670d..bde1d087 100644
--- a/l10n_us_hr_payroll/data/state/ms_mississippi.xml
+++ b/l10n_us_hr_payroll/data/state/ms_mississippi.xml
@@ -2,12 +2,6 @@
-
- US MS Mississippi SUTA Wage Base
- us_ms_suta_wage_base
- 14000.0
-
-
US MS Mississippi SUTA Wage Base
us_ms_suta_wage_base
@@ -18,31 +12,21 @@
-
- US MS Mississippi SUTA Rate
- us_ms_suta_rate
- 1.2
-
-
US MS Mississippi SUTA Rate
us_ms_suta_rate
1.2
+
+ US MS Mississippi SUTA Rate
+ us_ms_suta_rate
+ 1.0
+
+
-
- US MS Mississippi SIT Rate Table
- us_ms_sit_rate
- [
- ( 10000.00, 290.0, 0.05),
- ( 5000.00, 90.0, 0.04),
- ( 2000.00, 0.0, 0.03),
- ]
-
-
@@ -55,20 +39,19 @@
]
+
+ US MS Mississippi SIT Rate Table
+ us_ms_sit_rate
+ [
+ ( 10000.00, 230.0, 0.05),
+ ( 5000.00, 30.0, 0.04),
+ ( 3000.00, 0.0, 0.03),
+ ]
+
+
-
- US MS Mississippi SIT Deduction
- us_ms_sit_deduction
- {
- 'single': 2300.0,
- 'head_of_household': 3400.0,
- 'married_dual': 2300.0,
- 'married': 4600.0,
- }
-
-
diff --git a/l10n_us_hr_payroll/data/state/mt_montana.xml b/l10n_us_hr_payroll/data/state/mt_montana.xml
index d73c74f3..1a324c64 100644
--- a/l10n_us_hr_payroll/data/state/mt_montana.xml
+++ b/l10n_us_hr_payroll/data/state/mt_montana.xml
@@ -2,28 +2,22 @@
-
- US MT Montana SUTA Wage Base
- us_mt_suta_wage_base
- 33000.00
-
-
US MT Montana SUTA Wage Base
us_mt_suta_wage_base
34100.00
+
+ US MT Montana SUTA Wage Base
+ us_mt_suta_wage_base
+ 35300.00
+
+
-
- US MT Montana SUTA Rate (UI)
- us_mt_suta_rate
- 1.18
-
-
US MT Montana SUTA Rate (UI)
us_mt_suta_rate
diff --git a/l10n_us_hr_payroll/data/state/nc_northcarolina.xml b/l10n_us_hr_payroll/data/state/nc_northcarolina.xml
index 4e032b89..00b65c76 100644
--- a/l10n_us_hr_payroll/data/state/nc_northcarolina.xml
+++ b/l10n_us_hr_payroll/data/state/nc_northcarolina.xml
@@ -2,50 +2,37 @@
-
- US NC North Carolina SUTA Wage Base
- us_nc_suta_wage_base
- 24300.0
-
-
US NC North Carolina SUTA Wage Base
us_nc_suta_wage_base
25200.0
+
+ US NC North Carolina SUTA Wage Base
+ us_nc_suta_wage_base
+ 26000.0
+
+
-
- US NC North Carolina SUTA Rate
- us_nc_suta_rate
- 1.0
-
-
US NC North Carolina SUTA Rate
us_nc_suta_rate
1.0
+
+ US NC North Carolina SUTA Rate
+ us_nc_suta_rate
+ 1.0
+
+
-
-
-
- US NC North Carolina Allowance Rate
- us_nc_sit_allowance_rate
- {
- 'weekly': {'allowance': 48.08, 'standard_deduction': 192.31, 'standard_deduction_hh': 288.46},
- 'bi-weekly': {'allowance': 96.15, 'standard_deduction': 384.62, 'standard_deduction_hh': 576.92},
- 'semi-monthly': {'allowance': 104.17, 'standard_deduction': 416.67, 'standard_deduction_hh': 625.00},
- 'monthly': {'allowance': 208.33, 'standard_deduction': 833.33, 'standard_deduction_hh': 1250.00},
- }
-
-
@@ -59,6 +46,21 @@
}
+
+
+
+
+
+ US NC North Carolina Allowance Rate
+ us_nc_sit_allowance_rate
+ {
+ 'weekly': {'allowance': 48.08, 'standard_deduction': 206.73, 'standard_deduction_hh': 310.10},
+ 'bi-weekly': {'allowance': 96.15, 'standard_deduction': 413.46, 'standard_deduction_hh': 620.19},
+ 'semi-monthly': {'allowance': 104.17, 'standard_deduction': 447.92, 'standard_deduction_hh': 671.88},
+ 'monthly': {'allowance': 208.33, 'standard_deduction': 895.83, 'standard_deduction_hh': 1343.75},
+ }
+
+
diff --git a/l10n_us_hr_payroll/data/state/nd_north_dakota.xml b/l10n_us_hr_payroll/data/state/nd_north_dakota.xml
index 37f129b9..2c1e4053 100644
--- a/l10n_us_hr_payroll/data/state/nd_north_dakota.xml
+++ b/l10n_us_hr_payroll/data/state/nd_north_dakota.xml
@@ -8,6 +8,12 @@
37900.0
+
+ US ND North Dakota SUTA Wage Base
+ us_nd_suta_wage_base
+ 38500.0
+
+
@@ -202,6 +208,187 @@
}
+
+ US ND North Dakota SIT Tax Rate
+ us_nd_sit_tax_rate
+ {
+ 'single': {
+ 'weekly': (
+ ( 121, 0.00, 0.00),
+ ( 900, 0.00, 1.10),
+ ( 2007, 8.57, 2.04),
+ ( 4057, 31.15, 2.27),
+ ( 8678, 77.69, 2.64),
+ ('inf', 199.68, 2.90),
+ ),
+ 'bi-weekly': (
+ ( 241, 0.00, 0.00),
+ ( 1800, 0.00, 1.10),
+ ( 4014, 17.15, 2.04),
+ ( 8113, 62.31, 2.27),
+ ( 17357, 155.36, 2.64),
+ ( 'inf', 399.40, 2.90),
+ ),
+ 'semi-monthly': (
+ ( 261, 0.00, 0.00),
+ ( 1950, 0.00, 1.10),
+ ( 4349, 18.58, 2.04),
+ ( 8790, 67.52, 2.27),
+ ( 18790, 168.33, 2.64),
+ ( 'inf', 432.67, 2.90),
+ ),
+ 'monthly': (
+ ( 523, 0.00, 0.00),
+ ( 3900, 0.00, 1.10),
+ ( 8698, 37.15, 2.04),
+ ( 17579, 135.03, 2.27),
+ ( 37606, 336.62, 2.64),
+ ( 'inf', 865.34, 2.90),
+ ),
+ 'quarterly': (
+ ( 1569, 0.00, 0.00),
+ ( 11700, 0.00, 1.10),
+ ( 26094, 111.44, 2.04),
+ ( 52738, 405.08, 2.27),
+ ( 112819, 1009.90, 2.64),
+ ( 'inf', 2596.04, 2.90),
+ ),
+ 'semi-annual': (
+ ( 3138, 0.00, 0.00),
+ ( 23400, 0.00, 1.10),
+ ( 52188, 222.88, 2.04),
+ ( 105475, 810.16, 2.27),
+ ( 225638, 2019.77, 2.64),
+ ( 'inf', 5192.08, 2.90),
+ ),
+ 'annual': (
+ ( 6275, 0.00, 0.00),
+ ( 46800, 0.00, 1.10),
+ ( 104375, 445.78, 2.04),
+ ( 210950, 1620.31, 2.27),
+ ( 451275, 4039.56, 2.64),
+ ( 'inf', 10384.14, 2.90),
+ ),
+ },
+ 'married': {
+ 'weekly': (
+ ( 241, 0.00, 0.00),
+ ( 892, 0.00, 1.10),
+ ( 1814, 7.16, 2.04),
+ ( 2637, 25.97, 2.27),
+ ( 4520, 44.65, 2.64),
+ ('inf', 94.36, 2.90),
+ ),
+ 'bi-weekly': (
+ ( 483, 0.00, 0.00),
+ ( 1785, 0.00, 1.10),
+ ( 3628, 14.32, 2.04),
+ ( 5274, 51.92, 2.27),
+ ( 9040, 89.28, 2.64),
+ ( 'inf', 188.71, 2.90),
+ ),
+ 'semi-monthly': (
+ ( 523, 0.00, 0.00),
+ ( 1933, 0.00, 1.10),
+ ( 3930, 15.51, 2.04),
+ ( 5714, 56.25, 2.27),
+ ( 9794, 96.75, 2.64),
+ ( 'inf', 204.46, 2.90),
+ ),
+ 'monthly': (
+ ( 1046, 0.00, 0.00),
+ ( 3867, 0.00, 1.10),
+ ( 7860, 31.03, 2.04),
+ ( 11427, 112.49, 2.27),
+ ( 19588, 193.46, 2.64),
+ ( 'inf', 408.91, 2.90),
+ ),
+ 'quarterly': (
+ ( 3138, 0.00, 0.00),
+ ( 11600, 0.00, 1.10),
+ ( 23581, 93.08, 2.04),
+ ( 34281, 337.49, 2.27),
+ ( 58763, 580.38, 2.64),
+ ( 'inf', 1226.71, 2.90),
+ ),
+ 'semi-annual': (
+ ( 6275, 0.00, 0.00),
+ ( 23200, 0.00, 1.10),
+ ( 47163, 186.18, 2.04),
+ ( 68563, 675.02, 2.27),
+ ( 117525, 1160.80, 2.64),
+ ( 'inf', 2453.40, 2.90),
+ ),
+ 'annual': (
+ ( 12550, 0.00, 0.00),
+ ( 46400, 0.00, 1.10),
+ ( 94325, 372.35, 2.04),
+ ( 137125, 1350.02, 2.27),
+ ( 235050, 2321.58, 2.64),
+ ( 'inf', 4906.80, 2.90),
+ ),
+ },
+ 'head_household':{
+ 'weekly': (
+ ( 121, 0.00, 0.00),
+ ( 900, 0.00, 1.10),
+ ( 2007, 8.57, 2.04),
+ ( 4057, 31.15, 2.27),
+ ( 8678, 77.69, 2.64),
+ ('inf', 199.68, 2.90),
+ ),
+ 'bi-weekly': (
+ ( 241, 0.00, 0.00),
+ ( 1800, 0.00, 1.10),
+ ( 4014, 17.15, 2.04),
+ ( 8113, 62.31, 2.27),
+ ( 17357, 155.36, 2.64),
+ ( 'inf', 399.40, 2.90),
+ ),
+ 'semi-monthly': (
+ ( 261, 0.00, 0.00),
+ ( 1950, 0.00, 1.10),
+ ( 4349, 18.58, 2.04),
+ ( 8790, 67.52, 2.27),
+ ( 18790, 168.33, 2.64),
+ ( 'inf', 432.67, 2.90),
+ ),
+ 'monthly': (
+ ( 523, 0.00, 0.00),
+ ( 3900, 0.00, 1.10),
+ ( 8698, 37.15, 2.04),
+ ( 17579, 135.03, 2.27),
+ ( 37606, 336.62, 2.64),
+ ( 'inf', 865.34, 2.90),
+ ),
+ 'quarterly': (
+ ( 1569, 0.00, 0.00),
+ ( 11700, 0.00, 1.10),
+ ( 26094, 111.44, 2.04),
+ ( 52738, 405.08, 2.27),
+ ( 112819, 1009.90, 2.64),
+ ( 'inf', 2596.04, 2.90),
+ ),
+ 'semi-annual': (
+ ( 3138, 0.00, 0.00),
+ ( 23400, 0.00, 1.10),
+ ( 52188, 222.88, 2.04),
+ ( 105475, 810.16, 2.27),
+ ( 225638, 2019.77, 2.64),
+ ( 'inf', 5192.08, 2.90),
+ ),
+ 'annual': (
+ ( 6275, 0.00, 0.00),
+ ( 46800, 0.00, 1.10),
+ ( 104375, 445.78, 2.04),
+ ( 210950, 1620.31, 2.27),
+ ( 451275, 4039.56, 2.64),
+ ( 'inf', 10384.14, 2.90),
+ ),
+ },
+ }
+
+
diff --git a/l10n_us_hr_payroll/data/state/ne_nebraska.xml b/l10n_us_hr_payroll/data/state/ne_nebraska.xml
index bd35fe1f..40551b13 100644
--- a/l10n_us_hr_payroll/data/state/ne_nebraska.xml
+++ b/l10n_us_hr_payroll/data/state/ne_nebraska.xml
@@ -18,6 +18,12 @@
1.25
+
+ US NE Nebraska SUTA Rate
+ us_ne_suta_rate
+ 2.5
+
+
diff --git a/l10n_us_hr_payroll/data/state/nh_new_hampshire.xml b/l10n_us_hr_payroll/data/state/nh_new_hampshire.xml
index 74504122..2b9aa7f2 100644
--- a/l10n_us_hr_payroll/data/state/nh_new_hampshire.xml
+++ b/l10n_us_hr_payroll/data/state/nh_new_hampshire.xml
@@ -18,6 +18,12 @@
1.2
+
+ US NH New Hampshire SUTA Rate
+ us_nh_suta_rate
+ 2.7
+
+
diff --git a/l10n_us_hr_payroll/data/state/nj_newjersey.xml b/l10n_us_hr_payroll/data/state/nj_newjersey.xml
index acd3729e..eb96a682 100644
--- a/l10n_us_hr_payroll/data/state/nj_newjersey.xml
+++ b/l10n_us_hr_payroll/data/state/nj_newjersey.xml
@@ -2,29 +2,23 @@
-
- US NJ NewJersey SUTA Wage Base
- us_nj_suta_wage_base
- 34400.00
-
-
US NJ NewJersey SUTA Wage Base
us_nj_suta_wage_base
35300.00
+
+ US NJ NewJersey SUTA Wage Base
+ us_nj_suta_wage_base
+ 36200.00
+
+
-
- US NJ New Jersey Employer Unemployment SUTA Rate
- us_nj_suta_rate
- 2.6825
-
-
US NJ New Jersey Employer Unemployment SUTA Rate
us_nj_suta_rate
@@ -34,12 +28,6 @@
-
- US NJ New Jersey Employee Unemployment SUTA Rate
- us_nj_suta_ee_rate
- 0.3825
-
-
US NJ New Jersey Employee Unemployment SUTA Rate
us_nj_suta_ee_rate
@@ -50,12 +38,6 @@
-
- US NJ New Jersey Employer State Disability Insurance Rate
- us_nj_sdi_rate
- 0.5
-
-
US NJ New Jersey Employer State Disability Insurance Rate
us_nj_sdi_rate
@@ -65,28 +47,22 @@
-
- US NJ New Jersey Employee State Disability Insurance Rate
- us_nj_sdi_ee_rate
- 0.17
-
-
US NJ New Jersey Employee State Disability Insurance Rate
us_nj_sdi_ee_rate
0.26
+
+ US NJ New Jersey Employee State Disability Insurance Rate
+ us_nj_sdi_ee_rate
+ 0.47
+
+
-
- US NJ New Jersey Employer Workforce Development Rate
- us_nj_wf_rate
- 0.1175
-
-
US NJ New Jersey Employer Workforce Development Rate
us_nj_wf_rate
@@ -96,12 +72,6 @@
-
- US NJ New Jersey Employee Workforce Development Rate
- us_nj_wf_ee_rate
- 0.0425
-
-
US NJ New Jersey Employee Workforce Development Rate
us_nj_wf_ee_rate
@@ -112,12 +82,6 @@
-
- US NJ New Jersey Employer Family Leave Insurance Rate
- us_nj_fli_rate
- 0.0
-
-
US NJ New Jersey Employer Family Leave Insurance Rate
us_nj_fli_rate
@@ -127,368 +91,22 @@
-
- US NJ New Jersey Employee Family Leave Insurance Rate
- us_nj_fli_ee_rate
- 0.08
-
-
US NJ New Jersey Employee Family Leave Insurance Rate
us_nj_fli_ee_rate
0.16
+
+ US NJ New Jersey Employee Family Leave Insurance Rate
+ us_nj_fli_ee_rate
+ 0.28
+
+
-
- US NJ NewJersey SIT Rate Table
- us_nj_sit_rate
- {
- 'A': {
- 'weekly': (
- ( 385, 0.00, 1.50),
- ( 673, 5.77, 2.00),
- ( 769, 11.54, 3.90),
- ( 1442, 15.29, 6.10),
- ( 9615, 56.34, 7.00),
- (96154, 628.46, 9.90),
- ('inf', 9195.77, 11.80),
- ),
- 'bi-weekly': (
- ( 769, 0.00, 1.50),
- ( 1346, 12.00, 2.00),
- ( 1538, 23.00, 3.90),
- ( 2885, 31.00, 6.10),
- ( 19231, 113.00, 7.00),
- (192308, 1257.00, 9.90),
- ( 'inf', 18392.00, 11.80),
- ),
- 'semi-monthly': (
- ( 833, 0.00, 1.50),
- ( 1458, 13.00, 2.00),
- ( 1667, 25.00, 3.90),
- ( 3125, 33.00, 6.10),
- ( 20833, 122.00, 7.00),
- (208333, 1362.00, 9.90),
- ( 'inf', 19924.00, 11.80),
- ),
- 'monthly': (
- ( 1667, 0.00, 1.50),
- ( 2917, 25.00, 2.00),
- ( 3333, 50.00, 3.90),
- ( 6250, 66.00, 6.10),
- ( 41667, 244.00, 7.00),
- (416667, 2723.00, 9.90),
- ( 'inf', 39848.00, 11.80),
- ),
- 'quarterly': (
- ( 5000, 0.00, 1.50),
- ( 8750, 75.00, 2.00),
- ( 10000, 150.00, 3.90),
- ( 18750, 198.75, 6.10),
- ( 125000, 732.50, 7.00),
- (1250000, 8170.00, 9.90),
- ( 'inf', 119545.00, 11.80),
- ),
- 'semi-annual': (
- ( 10000, 0.00, 1.50),
- ( 17500, 150.00, 2.00),
- ( 20000, 300.00, 3.90),
- ( 37500, 397.50, 6.10),
- ( 250000, 1465.00, 7.00),
- (2500000, 16340.00, 9.90),
- ( 'inf', 239090.00, 11.80),
- ),
- 'annual': (
- ( 20000, 0.00, 1.50),
- ( 35000, 300.00, 2.00),
- ( 40000, 600.00, 3.90),
- ( 75000, 795.00, 6.10),
- ( 500000, 2930.00, 7.00),
- (5000000, 32680.00, 9.90),
- ( 'inf', 478180.00, 11.80),
- ),
- },
- 'B': {
- 'weekly': (
- ( 385, 0.00, 1.50),
- ( 962, 5.77, 2.00),
- ( 1346, 17.31, 2.70),
- ( 1538, 27.69, 3.90),
- ( 2885, 35.19, 6.10),
- ( 9615, 117.31, 7.00),
- (96154, 588.46, 9.90),
- ('inf', 9155.77, 11.80),
- ),
- 'bi-weekly': (
- ( 769, 0.00, 1.50),
- ( 1923, 12.00, 2.00),
- ( 2692, 35.00, 2.70),
- ( 3076, 55.00, 3.90),
- ( 5769, 70.00, 6.10),
- ( 19231, 235.00, 7.00),
- (192308, 1177.00, 9.90),
- ( 'inf', 18312.00, 11.80),
- ),
- 'semi-monthly': (
- ( 833, 0.00, 1.50),
- ( 2083, 12.50, 2.00),
- ( 2917, 37.50, 2.70),
- ( 3333, 59.99, 3.90),
- ( 6250, 76.25, 6.10),
- ( 20833, 254.19, 7.00),
- (208333, 1275.00, 9.90),
- ( 'inf', 19838.00, 11.80),
- ),
- 'monthly': (
- ( 1667, 0.00, 1.50),
- ( 4167, 25.00, 2.00),
- ( 5833, 75.00, 2.70),
- ( 6667, 120.00, 3.90),
- ( 12500, 153.00, 6.10),
- ( 41667, 508.00, 7.00),
- (416667, 2550.00, 9.90),
- ( 'inf', 39675.00, 11.80),
- ),
- 'quarterly': (
- ( 5000, 0.00, 1.50),
- ( 12500, 75.00, 2.00),
- ( 17500, 225.00, 2.70),
- ( 20000, 360.00, 3.90),
- ( 37500, 397.50, 6.10),
- ( 125000, 1525.00, 7.00),
- (1250000, 7650.00, 9.90),
- ( 'inf', 119025.00, 11.80),
- ),
- 'semi-annual': (
- ( 10000, 0.00, 1.50),
- ( 25000, 150.00, 2.00),
- ( 35000, 450.00, 2.70),
- ( 40000, 720.00, 3.90),
- ( 75000, 915.00, 6.10),
- ( 250000, 3050.00, 7.00),
- (2500000, 15300.00, 9.90),
- ( 'inf', 238050.00, 11.80),
- ),
- 'annual': (
- ( 20000, 0.00, 1.50),
- ( 50000, 300.00, 2.00),
- ( 70000, 900.00, 2.70),
- (80000, 1440.00, 3.90),
- ( 150000, 1830.00, 6.10),
- ( 500000, 6100.00, 7.00),
- (5000000, 30600.00, 9.90),
- ( 'inf', 476100.00, 11.80),
- ),
- },
- 'C': {
- 'weekly': (
- ( 385, 0.00, 1.50),
- ( 769, 5.77, 2.30),
- ( 962, 14.62, 2.80),
- ( 1154, 20.00, 3.50),
- ( 2885, 26.73, 5.60),
- ( 9615, 123.65, 6.60),
- (96154, 567.88, 9.90),
- ('inf', 9135.19, 11.80),
- ),
- 'bi-weekly': (
- ( 769, 0.00, 1.50),
- ( 1538, 11.54, 2.30),
- ( 1923, 29.23, 2.80),
- ( 2308, 40.00, 3.50),
- ( 5769, 53.46, 5.60),
- ( 19231, 247.31, 6.60),
- (192308, 1135.77, 9.90),
- ( 'inf', 18270.38, 11.80),
- ),
- 'semi-monthly': (
- ( 833, 0.00, 1.50),
- ( 1667, 12.50, 2.30),
- ( 2083, 31.67, 2.80),
- ( 2500, 43.33, 3.50),
- ( 6250, 57.92, 5.60),
- ( 20833, 267.92, 6.60),
- (208333, 1230.42, 9.90),
- ( 'inf', 19792.92, 11.80),
- ),
- 'monthly': (
- ( 1667, 0.00, 1.50),
- ( 3333, 25.00, 2.30),
- ( 4167, 63.33, 2.80),
- ( 5000, 86.67, 3.50),
- ( 12500, 115.83, 5.60),
- ( 41667, 535.85, 6.60),
- (416667, 2460.83, 9.90),
- ( 'inf', 39585.83, 11.80),
- ),
- 'quarterly': (
- ( 5000, 0.00, 1.50),
- ( 10000, 75.00, 2.30),
- ( 12500, 190.00, 2.80),
- ( 15000, 260.00, 3.50),
- ( 37500, 347.50, 5.60),
- ( 125000, 1607.50, 6.60),
- (1250000, 7382.50, 9.90),
- ( 'inf', 118757.50, 11.80),
- ),
- 'semi-annual': (
- ( 10000, 0.00, 1.50),
- ( 20000, 150.00, 2.30),
- ( 25000, 380.00, 2.80),
- ( 30000, 520.00, 3.50),
- ( 75000, 695.00, 5.60),
- ( 250000, 3215.00, 6.60),
- (2500000, 14765.00, 9.90),
- ( 'inf', 237515.00, 11.80),
- ),
- 'annual': (
- ( 20000, 0.00, 1.50),
- ( 40000, 300.00, 2.30),
- ( 50000, 760.00, 2.80),
- ( 60000, 1040.00, 3.50),
- ( 150000, 1390.00, 5.60),
- ( 500000, 6430.00, 6.60),
- (5000000, 29530.00, 9.90),
- ( 'inf', 475030.00, 11.80),
- ),
- },
- 'D': {
- 'weekly': (
- ( 385, 0.00, 1.50),
- ( 769, 5.77, 2.70),
- ( 962, 16.15, 3.40),
- ( 1154, 22.69, 4.30),
- ( 2885, 30.96, 5.60),
- ( 9615, 127.88, 6.50),
- ( 96154, 565.38, 9.90),
- ( 'inf', 9132.69, 11.80),
- ),
- 'bi-weekly': (
- ( 769, 0.00, 1.50),
- ( 1538, 11.54, 2.70),
- ( 1923, 32.31, 3.40),
- ( 2308, 45.38, 4.30),
- ( 5769, 61.92, 5.60),
- ( 19231, 255.77, 6.50),
- (192308, 1130.77, 9.90),
- ( 'inf', 18265.38, 11.80),
- ),
- 'semi-monthly': (
- ( 833, 0.00, 1.50),
- ( 1667, 12.50, 2.70),
- ( 2083, 35.00, 3.40),
- ( 2500, 49.17, 4.30),
- ( 6250, 67.08, 5.60),
- ( 20833, 277.08, 6.50),
- (208333, 1225.00, 9.90),
- ( 'inf', 19787.50, 11.80),
- ),
- 'monthly': (
- ( 1667, 0.00, 1.50),
- ( 3333, 25.00, 2.70),
- ( 4167, 70.00, 3.40),
- ( 5000, 98.33, 4.00),
- ( 12500, 134.17, 5.60),
- ( 41667, 554.17, 6.50),
- (416667, 2450.00, 9.90),
- ( 'inf', 39575.00, 11.80),
- ),
- 'quarterly': (
- ( 5000, 0.00, 1.50),
- ( 10000, 75.00, 2.07),
- ( 12500, 210.00, 3.40),
- ( 15000, 295.00, 4.30),
- ( 37500, 402.50, 5.60),
- ( 125000, 1662.50, 6.50),
- (1250000, 7350.00, 9.90),
- ( 'inf', 118725.00, 11.80),
- ),
- 'semi-annual': (
- ( 10000, 0.00, 1.50),
- ( 20000, 150.00, 2.70),
- ( 25000, 420.00, 3.40),
- ( 30000, 590.00, 4.30),
- ( 75000, 805.00, 5.60),
- ( 250000, 3325.00, 6.50),
- (2500000, 14700.00, 9.90),
- ( 'inf', 237450.00, 11.80),
- ),
- 'annual': (
- ( 20000, 0.00, 1.50),
- ( 40000, 300.00, 2.70),
- ( 50000, 840.00, 3.40),
- ( 60000, 1180.00, 4.30),
- ( 150000, 1610.00, 5.60),
- ( 250000, 6650.00, 6.50),
- (2500000, 29400.00, 9.90),
- ( 'inf', 474900.00, 11.80),
- ),
- },
- 'E': {
- 'weekly': (
- ( 385, 0.00, 1.50),
- ( 673, 5.77, 2.00),
- ( 1923, 11.54, 5.80),
- ( 9615, 84.04, 6.50),
- ( 96154, 584.04, 9.90),
- ( 'inf', 9151.35, 11.80),
- ),
- 'bi-weekly': (
- ( 769, 0.00, 1.50),
- ( 1346, 12.00, 2.00),
- ( 3846, 23.00, 5.80),
- ( 19231, 168.00, 6.50),
- (192308, 1168.00, 9.90),
- ( 'inf', 18303.00, 11.80),
- ),
- 'semi-monthly': (
- ( 833, 0.00, 1.50),
- ( 1458, 13.00, 2.00),
- ( 4167, 25.00, 5.80),
- ( 20833, 182.00, 6.50),
- (208333, 1265.00, 9.90),
- ( 'inf', 19828.00, 11.80),
- ),
- 'monthly': (
- ( 1667, 0.00, 1.50),
- ( 2916, 25.00, 2.00),
- ( 8333, 50.00, 5.80),
- ( 41667, 364.00, 6.50),
- (416667, 2531.00, 9.90),
- ( 'inf', 39656.00, 11.80),
- ),
- 'quarterly': (
- ( 5000, 0.00, 1.50),
- ( 8750, 75.00, 2.00),
- ( 25000, 150.00, 5.80),
- ( 125000, 1092.50, 6.50),
- (1250000, 7592.50, 9.90),
- ( 'inf', 118967.50, 11.80),
- ),
- 'semi-annual': (
- ( 10000, 0.00, 1.50),
- ( 17500, 150.00, 2.00),
- ( 50000, 300.00, 5.80),
- ( 250000, 2185.00, 6.50),
- (2500000, 15185.00, 9.90),
- ( 'inf', 237935.00, 11.80),
- ),
- 'annual': (
- ( 20000, 0.00, 1.50),
- ( 35000, 300.00, 2.00),
- ( 100000, 600.00, 5.80),
- ( 500000, 4370.00, 6.50),
- (5000000, 30370.00, 9.90),
- ( 'inf', 475870.00, 11.80),
- ),
- },
- }
-
-
US NJ NewJersey SIT Rate Table
@@ -501,8 +119,8 @@
( 769, 11.54, 3.90),
( 1442, 15.29, 6.10),
( 9615, 56.34, 7.00),
- (96154, 628.46, 9.90),
- ('inf', 9195.77, 11.80),
+ (19231, 628.46, 9.90),
+ ('inf', 1580.38, 11.80),
),
'bi-weekly': (
( 769, 0.00, 1.50),
@@ -510,8 +128,8 @@
( 1538, 23.00, 3.90),
( 2885, 31.00, 6.10),
( 19231, 113.00, 7.00),
- (192308, 1257.00, 9.90),
- ( 'inf', 18392.00, 11.80),
+ ( 38462, 1257.00, 9.90),
+ ( 'inf', 3161.00, 11.80),
),
'semi-monthly': (
( 833, 0.00, 1.50),
@@ -519,8 +137,8 @@
( 1667, 25.00, 3.90),
( 3125, 33.00, 6.10),
( 20833, 122.00, 7.00),
- (208333, 1362.00, 9.90),
- ( 'inf', 19924.00, 11.80),
+ ( 41667, 1362.00, 9.90),
+ ( 'inf', 3424.00, 11.80),
),
'monthly': (
( 1667, 0.00, 1.50),
@@ -528,8 +146,8 @@
( 3333, 50.00, 3.90),
( 6250, 66.00, 6.10),
( 41667, 244.00, 7.00),
- (416667, 2723.00, 9.90),
- ( 'inf', 39848.00, 11.80),
+ ( 83333, 2723.00, 9.90),
+ ( 'inf', 6848.00, 11.80),
),
'quarterly': (
( 5000, 0.00, 1.50),
@@ -537,8 +155,8 @@
( 10000, 150.00, 3.90),
( 18750, 198.75, 6.10),
( 125000, 732.50, 7.00),
- (1250000, 8170.00, 9.90),
- ( 'inf', 119545.00, 11.80),
+ ( 250000, 8170.00, 9.90),
+ ( 'inf', 20545.00, 11.80),
),
'semi-annual': (
( 10000, 0.00, 1.50),
@@ -546,8 +164,8 @@
( 20000, 300.00, 3.90),
( 37500, 397.50, 6.10),
( 250000, 1465.00, 7.00),
- (2500000, 16340.00, 9.90),
- ( 'inf', 239090.00, 11.80),
+ ( 500000, 16340.00, 9.90),
+ ( 'inf', 41060.00, 11.80),
),
'annual': (
( 20000, 0.00, 1.50),
@@ -567,8 +185,8 @@
( 1538, 27.69, 3.90),
( 2885, 35.19, 6.10),
( 9615, 117.31, 7.00),
- (96154, 588.46, 9.90),
- ('inf', 9155.77, 11.80),
+ (19231, 588.46, 9.90),
+ ('inf', 1540.38, 11.80),
),
'bi-weekly': (
( 769, 0.00, 1.50),
@@ -577,8 +195,8 @@
( 3076, 55.00, 3.90),
( 5769, 70.00, 6.10),
( 19231, 235.00, 7.00),
- (192308, 1177.00, 9.90),
- ( 'inf', 18312.00, 11.80),
+ ( 38462, 1177.00, 9.90),
+ ( 'inf', 3081.00, 11.80),
),
'semi-monthly': (
( 833, 0.00, 1.50),
@@ -587,8 +205,8 @@
( 3333, 59.99, 3.90),
( 6250, 76.25, 6.10),
( 20833, 254.19, 7.00),
- (208333, 1275.00, 9.90),
- ( 'inf', 19838.00, 11.80),
+ ( 41667, 1275.00, 9.90),
+ ( 'inf', 3338.00, 11.80),
),
'monthly': (
( 1667, 0.00, 1.50),
@@ -597,8 +215,8 @@
( 6667, 120.00, 3.90),
( 12500, 153.00, 6.10),
( 41667, 508.00, 7.00),
- (416667, 2550.00, 9.90),
- ( 'inf', 39675.00, 11.80),
+ ( 83333, 2550.00, 9.90),
+ ( 'inf', 6675.00, 11.80),
),
'quarterly': (
( 5000, 0.00, 1.50),
@@ -607,8 +225,8 @@
( 20000, 360.00, 3.90),
( 37500, 397.50, 6.10),
( 125000, 1525.00, 7.00),
- (1250000, 7650.00, 9.90),
- ( 'inf', 119025.00, 11.80),
+ ( 250000, 7650.00, 9.90),
+ ( 'inf', 20025.00, 11.80),
),
'semi-annual': (
( 10000, 0.00, 1.50),
@@ -617,8 +235,8 @@
( 40000, 720.00, 3.90),
( 75000, 915.00, 6.10),
( 250000, 3050.00, 7.00),
- (2500000, 15300.00, 9.90),
- ( 'inf', 238050.00, 11.80),
+ ( 500000, 15300.00, 9.90),
+ ( 'inf', 40050.00, 11.80),
),
'annual': (
( 20000, 0.00, 1.50),
@@ -639,8 +257,8 @@
( 1154, 20.00, 3.50),
( 2885, 26.73, 5.60),
( 9615, 123.65, 6.60),
- (96154, 567.88, 9.90),
- ('inf', 9135.19, 11.80),
+ (19231, 567.88, 9.90),
+ ('inf', 1519.81, 11.80),
),
'bi-weekly': (
( 769, 0.00, 1.50),
@@ -649,8 +267,8 @@
( 2308, 40.00, 3.50),
( 5769, 53.46, 5.60),
( 19231, 247.31, 6.60),
- (192308, 1135.77, 9.90),
- ( 'inf', 18270.38, 11.80),
+ ( 38462, 1135.77, 9.90),
+ ( 'inf', 3039.62, 11.80),
),
'semi-monthly': (
( 833, 0.00, 1.50),
@@ -659,8 +277,8 @@
( 2500, 43.33, 3.50),
( 6250, 57.92, 5.60),
( 20833, 267.92, 6.60),
- (208333, 1230.42, 9.90),
- ( 'inf', 19792.92, 11.80),
+ ( 41667, 1230.42, 9.90),
+ ( 'inf', 3292.92, 11.80),
),
'monthly': (
( 1667, 0.00, 1.50),
@@ -669,8 +287,8 @@
( 5000, 86.67, 3.50),
( 12500, 115.83, 5.60),
( 41667, 535.85, 6.60),
- (416667, 2460.83, 9.90),
- ( 'inf', 39585.83, 11.80),
+ ( 83333, 2460.83, 9.90),
+ ( 'inf', 6585.83, 11.80),
),
'quarterly': (
( 5000, 0.00, 1.50),
@@ -679,8 +297,8 @@
( 15000, 260.00, 3.50),
( 37500, 347.50, 5.60),
( 125000, 1607.50, 6.60),
- (1250000, 7382.50, 9.90),
- ( 'inf', 118757.50, 11.80),
+ ( 250000, 7382.50, 9.90),
+ ( 'inf', 19757.50, 11.80),
),
'semi-annual': (
( 10000, 0.00, 1.50),
@@ -689,8 +307,8 @@
( 30000, 520.00, 3.50),
( 75000, 695.00, 5.60),
( 250000, 3215.00, 6.60),
- (2500000, 14765.00, 9.90),
- ( 'inf', 237515.00, 11.80),
+ ( 500000, 14765.00, 9.90),
+ ( 'inf', 39515.00, 11.80),
),
'annual': (
( 20000, 0.00, 1.50),
@@ -711,8 +329,8 @@
( 1154, 22.69, 4.30),
( 2885, 30.96, 5.60),
( 9615, 127.88, 6.50),
- ( 96154, 565.38, 9.90),
- ( 'inf', 9132.69, 11.80),
+ ( 19231, 565.38, 9.90),
+ ( 'inf', 1517.31, 11.80),
),
'bi-weekly': (
( 769, 0.00, 1.50),
@@ -721,8 +339,8 @@
( 2308, 45.38, 4.30),
( 5769, 61.92, 5.60),
( 19231, 255.77, 6.50),
- (192308, 1130.77, 9.90),
- ( 'inf', 18265.38, 11.80),
+ ( 38462, 1130.77, 9.90),
+ ( 'inf', 3034.62, 11.80),
),
'semi-monthly': (
( 833, 0.00, 1.50),
@@ -731,8 +349,8 @@
( 2500, 49.17, 4.30),
( 6250, 67.08, 5.60),
( 20833, 277.08, 6.50),
- (208333, 1225.00, 9.90),
- ( 'inf', 19787.50, 11.80),
+ ( 41667, 1225.00, 9.90),
+ ( 'inf', 3287.50, 11.80),
),
'monthly': (
( 1667, 0.00, 1.50),
@@ -741,8 +359,8 @@
( 5000, 98.33, 4.00),
( 12500, 134.17, 5.60),
( 41667, 554.17, 6.50),
- (416667, 2450.00, 9.90),
- ( 'inf', 39575.00, 11.80),
+ ( 83333, 2450.00, 9.90),
+ ( 'inf', 6575.00, 11.80),
),
'quarterly': (
( 5000, 0.00, 1.50),
@@ -751,8 +369,8 @@
( 15000, 295.00, 4.30),
( 37500, 402.50, 5.60),
( 125000, 1662.50, 6.50),
- (1250000, 7350.00, 9.90),
- ( 'inf', 118725.00, 11.80),
+ ( 250000, 7350.00, 9.90),
+ ( 'inf', 19725.00, 11.80),
),
'semi-annual': (
( 10000, 0.00, 1.50),
@@ -761,8 +379,8 @@
( 30000, 590.00, 4.30),
( 75000, 805.00, 5.60),
( 250000, 3325.00, 6.50),
- (2500000, 14700.00, 9.90),
- ( 'inf', 237450.00, 11.80),
+ ( 500000, 14700.00, 9.90),
+ ( 'inf', 39450.00, 11.80),
),
'annual': (
( 20000, 0.00, 1.50),
@@ -836,24 +454,355 @@
}
+
+ US NJ NewJersey SIT Rate Table
+ us_nj_sit_rate
+ {
+ 'A': {
+ 'weekly': (
+ ( 385, 0.00, 1.50),
+ ( 673, 5.77, 2.00),
+ ( 769, 11.54, 3.90),
+ ( 1442, 15.29, 6.10),
+ ( 9615, 56.34, 7.00),
+ (19231, 628.46, 9.90),
+ ('inf', 1580.38, 11.80),
+ ),
+ 'bi-weekly': (
+ ( 769, 0.00, 1.50),
+ ( 1346, 12.00, 2.00),
+ ( 1538, 23.00, 3.90),
+ ( 2885, 31.00, 6.10),
+ ( 19231, 113.00, 7.00),
+ ( 38462, 1257.00, 9.90),
+ ( 'inf', 3161.00, 11.80),
+ ),
+ 'semi-monthly': (
+ ( 833, 0.00, 1.50),
+ ( 1458, 13.00, 2.00),
+ ( 1667, 25.00, 3.90),
+ ( 3125, 33.00, 6.10),
+ ( 20833, 122.00, 7.00),
+ ( 41667, 1362.00, 9.90),
+ ( 'inf', 3424.00, 11.80),
+ ),
+ 'monthly': (
+ ( 1667, 0.00, 1.50),
+ ( 2917, 25.00, 2.00),
+ ( 3333, 50.00, 3.90),
+ ( 6250, 66.00, 6.10),
+ ( 41667, 244.00, 7.00),
+ ( 83333, 2723.00, 9.90),
+ ( 'inf', 6848.00, 11.80),
+ ),
+ 'quarterly': (
+ ( 5000, 0.00, 1.50),
+ ( 8750, 75.00, 2.00),
+ ( 10000, 150.00, 3.90),
+ ( 18750, 198.75, 6.10),
+ ( 125000, 732.50, 7.00),
+ ( 250000, 8170.00, 9.90),
+ ( 'inf', 20545.00, 11.80),
+ ),
+ 'semi-annual': (
+ ( 10000, 0.00, 1.50),
+ ( 17500, 150.00, 2.00),
+ ( 20000, 300.00, 3.90),
+ ( 37500, 397.50, 6.10),
+ ( 250000, 1465.00, 7.00),
+ ( 500000, 16340.00, 9.90),
+ ( 'inf', 41060.00, 11.80),
+ ),
+ 'annual': (
+ ( 20000, 0.00, 1.50),
+ ( 35000, 300.00, 2.00),
+ ( 40000, 600.00, 3.90),
+ ( 75000, 795.00, 6.10),
+ ( 500000, 2930.00, 7.00),
+ (1000000, 32680.00, 9.90),
+ ( 'inf', 82180.00, 11.80),
+ ),
+ },
+ 'B': {
+ 'weekly': (
+ ( 385, 0.00, 1.50),
+ ( 962, 5.77, 2.00),
+ ( 1346, 17.31, 2.70),
+ ( 1538, 27.69, 3.90),
+ ( 2885, 35.19, 6.10),
+ ( 9615, 117.31, 7.00),
+ (19231, 588.46, 9.90),
+ ('inf', 1540.38, 11.80),
+ ),
+ 'bi-weekly': (
+ ( 769, 0.00, 1.50),
+ ( 1923, 12.00, 2.00),
+ ( 2692, 35.00, 2.70),
+ ( 3076, 55.00, 3.90),
+ ( 5769, 70.00, 6.10),
+ ( 19231, 235.00, 7.00),
+ ( 38462, 1177.00, 9.90),
+ ( 'inf', 3081.00, 11.80),
+ ),
+ 'semi-monthly': (
+ ( 833, 0.00, 1.50),
+ ( 2083, 12.50, 2.00),
+ ( 2917, 37.50, 2.70),
+ ( 3333, 59.99, 3.90),
+ ( 6250, 76.25, 6.10),
+ ( 20833, 254.19, 7.00),
+ ( 41667, 1275.00, 9.90),
+ ( 'inf', 3338.00, 11.80),
+ ),
+ 'monthly': (
+ ( 1667, 0.00, 1.50),
+ ( 4167, 25.00, 2.00),
+ ( 5833, 75.00, 2.70),
+ ( 6667, 120.00, 3.90),
+ ( 12500, 153.00, 6.10),
+ ( 41667, 508.00, 7.00),
+ ( 83333, 2550.00, 9.90),
+ ( 'inf', 6675.00, 11.80),
+ ),
+ 'quarterly': (
+ ( 5000, 0.00, 1.50),
+ ( 12500, 75.00, 2.00),
+ ( 17500, 225.00, 2.70),
+ ( 20000, 360.00, 3.90),
+ ( 37500, 397.50, 6.10),
+ ( 125000, 1525.00, 7.00),
+ ( 250000, 7650.00, 9.90),
+ ( 'inf', 20025.00, 11.80),
+ ),
+ 'semi-annual': (
+ ( 10000, 0.00, 1.50),
+ ( 25000, 150.00, 2.00),
+ ( 35000, 450.00, 2.70),
+ ( 40000, 720.00, 3.90),
+ ( 75000, 915.00, 6.10),
+ ( 250000, 3050.00, 7.00),
+ ( 500000, 15300.00, 9.90),
+ ( 'inf', 40050.00, 11.80),
+ ),
+ 'annual': (
+ ( 20000, 0.00, 1.50),
+ ( 50000, 300.00, 2.00),
+ ( 70000, 900.00, 2.70),
+ (80000, 1440.00, 3.90),
+ ( 150000, 1830.00, 6.10),
+ ( 500000, 6100.00, 7.00),
+ (1000000, 30600.00, 9.90),
+ ( 'inf', 80100.00, 11.80),
+ ),
+ },
+ 'C': {
+ 'weekly': (
+ ( 385, 0.00, 1.50),
+ ( 769, 5.77, 2.30),
+ ( 962, 14.62, 2.80),
+ ( 1154, 20.00, 3.50),
+ ( 2885, 26.73, 5.60),
+ ( 9615, 123.65, 6.60),
+ (19231, 567.88, 9.90),
+ ('inf', 1519.81, 11.80),
+ ),
+ 'bi-weekly': (
+ ( 769, 0.00, 1.50),
+ ( 1538, 11.54, 2.30),
+ ( 1923, 29.23, 2.80),
+ ( 2308, 40.00, 3.50),
+ ( 5769, 53.46, 5.60),
+ ( 19231, 247.31, 6.60),
+ ( 38462, 1135.77, 9.90),
+ ( 'inf', 3039.62, 11.80),
+ ),
+ 'semi-monthly': (
+ ( 833, 0.00, 1.50),
+ ( 1667, 12.50, 2.30),
+ ( 2083, 31.67, 2.80),
+ ( 2500, 43.33, 3.50),
+ ( 6250, 57.92, 5.60),
+ ( 20833, 267.92, 6.60),
+ ( 41667, 1230.42, 9.90),
+ ( 'inf', 3292.92, 11.80),
+ ),
+ 'monthly': (
+ ( 1667, 0.00, 1.50),
+ ( 3333, 25.00, 2.30),
+ ( 4167, 63.33, 2.80),
+ ( 5000, 86.67, 3.50),
+ ( 12500, 115.83, 5.60),
+ ( 41667, 535.85, 6.60),
+ ( 83333, 2460.83, 9.90),
+ ( 'inf', 6585.83, 11.80),
+ ),
+ 'quarterly': (
+ ( 5000, 0.00, 1.50),
+ ( 10000, 75.00, 2.30),
+ ( 12500, 190.00, 2.80),
+ ( 15000, 260.00, 3.50),
+ ( 37500, 347.50, 5.60),
+ ( 125000, 1607.50, 6.60),
+ ( 250000, 7382.50, 9.90),
+ ( 'inf', 19757.50, 11.80),
+ ),
+ 'semi-annual': (
+ ( 10000, 0.00, 1.50),
+ ( 20000, 150.00, 2.30),
+ ( 25000, 380.00, 2.80),
+ ( 30000, 520.00, 3.50),
+ ( 75000, 695.00, 5.60),
+ ( 250000, 3215.00, 6.60),
+ ( 500000, 14765.00, 9.90),
+ ( 'inf', 39515.00, 11.80),
+ ),
+ 'annual': (
+ ( 20000, 0.00, 1.50),
+ ( 40000, 300.00, 2.30),
+ ( 50000, 760.00, 2.80),
+ ( 60000, 1040.00, 3.50),
+ ( 150000, 1390.00, 5.60),
+ ( 500000, 6430.00, 6.60),
+ (1000000, 29530.00, 9.90),
+ ( 'inf', 79030.00, 11.80),
+ ),
+ },
+ 'D': {
+ 'weekly': (
+ ( 385, 0.00, 1.50),
+ ( 769, 5.77, 2.70),
+ ( 962, 16.15, 3.40),
+ ( 1154, 22.69, 4.30),
+ ( 2885, 30.96, 5.60),
+ ( 9615, 127.88, 6.50),
+ ( 19231, 565.38, 9.90),
+ ( 'inf', 1517.31, 11.80),
+ ),
+ 'bi-weekly': (
+ ( 769, 0.00, 1.50),
+ ( 1538, 11.54, 2.70),
+ ( 1923, 32.31, 3.40),
+ ( 2308, 45.38, 4.30),
+ ( 5769, 61.92, 5.60),
+ ( 19231, 255.77, 6.50),
+ ( 38462, 1130.77, 9.90),
+ ( 'inf', 3034.62, 11.80),
+ ),
+ 'semi-monthly': (
+ ( 833, 0.00, 1.50),
+ ( 1667, 12.50, 2.70),
+ ( 2083, 35.00, 3.40),
+ ( 2500, 49.17, 4.30),
+ ( 6250, 67.08, 5.60),
+ ( 20833, 277.08, 6.50),
+ ( 41667, 1225.00, 9.90),
+ ( 'inf', 3287.50, 11.80),
+ ),
+ 'monthly': (
+ ( 1667, 0.00, 1.50),
+ ( 3333, 25.00, 2.70),
+ ( 4167, 70.00, 3.40),
+ ( 5000, 98.33, 4.00),
+ ( 12500, 134.17, 5.60),
+ ( 41667, 554.17, 6.50),
+ ( 83333, 2450.00, 9.90),
+ ( 'inf', 6575.00, 11.80),
+ ),
+ 'quarterly': (
+ ( 5000, 0.00, 1.50),
+ ( 10000, 75.00, 2.07),
+ ( 12500, 210.00, 3.40),
+ ( 15000, 295.00, 4.30),
+ ( 37500, 402.50, 5.60),
+ ( 125000, 1662.50, 6.50),
+ ( 250000, 7350.00, 9.90),
+ ( 'inf', 19725.00, 11.80),
+ ),
+ 'semi-annual': (
+ ( 10000, 0.00, 1.50),
+ ( 20000, 150.00, 2.70),
+ ( 25000, 420.00, 3.40),
+ ( 30000, 590.00, 4.30),
+ ( 75000, 805.00, 5.60),
+ ( 250000, 3325.00, 6.50),
+ ( 500000, 14700.00, 9.90),
+ ( 'inf', 39450.00, 11.80),
+ ),
+ 'annual': (
+ ( 20000, 0.00, 1.50),
+ ( 40000, 300.00, 2.70),
+ ( 50000, 840.00, 3.40),
+ ( 60000, 1180.00, 4.30),
+ ( 150000, 1610.00, 5.60),
+ ( 250000, 6650.00, 6.50),
+ (1000000, 29400.00, 9.90),
+ ( 'inf', 78900.00, 11.80),
+ ),
+ },
+ 'E': {
+ 'weekly': (
+ ( 385, 0.00, 1.50),
+ ( 673, 5.77, 2.00),
+ ( 1923, 11.54, 5.80),
+ ( 9615, 84.04, 6.50),
+ ( 19231, 584.04, 9.90),
+ ( 'inf', 1535.96, 11.80),
+ ),
+ 'bi-weekly': (
+ ( 769, 0.00, 1.50),
+ ( 1346, 12.00, 2.00),
+ ( 3846, 23.00, 5.80),
+ ( 19231, 168.00, 6.50),
+ ( 38462, 1168.00, 9.90),
+ ( 'inf', 3072.00, 11.80),
+ ),
+ 'semi-monthly': (
+ ( 833, 0.00, 1.50),
+ ( 1458, 13.00, 2.00),
+ ( 4167, 25.00, 5.80),
+ ( 20833, 182.00, 6.50),
+ ( 41667, 1265.00, 9.90),
+ ( 'inf', 3328.00, 11.80),
+ ),
+ 'monthly': (
+ ( 1667, 0.00, 1.50),
+ ( 2916, 25.00, 2.00),
+ ( 8333, 50.00, 5.80),
+ ( 41667, 364.00, 6.50),
+ ( 83333, 2531.00, 9.90),
+ ( 'inf', 6656.00, 11.80),
+ ),
+ 'quarterly': (
+ ( 5000, 0.00, 1.50),
+ ( 8750, 75.00, 2.00),
+ ( 25000, 150.00, 5.80),
+ ( 125000, 1092.50, 6.50),
+ ( 250000, 7592.50, 9.90),
+ ( 'inf', 19967.50, 11.80),
+ ),
+ 'semi-annual': (
+ ( 10000, 0.00, 1.50),
+ ( 17500, 150.00, 2.00),
+ ( 50000, 300.00, 5.80),
+ ( 250000, 2185.00, 6.50),
+ ( 500000, 15185.00, 9.90),
+ ( 'inf', 39935.00, 11.80),
+ ),
+ 'annual': (
+ ( 20000, 0.00, 1.50),
+ ( 35000, 300.00, 2.00),
+ ( 100000, 600.00, 5.80),
+ ( 500000, 4370.00, 6.50),
+ (1000000, 30370.00, 9.90),
+ ( 'inf', 79870.00, 11.80),
+ ),
+ },
+ }
+
+
-
- US NJ NewJersey SIT Allowance Rate
- us_nj_sit_allowance_rate
- {
- 'weekly': 19.20,
- 'bi-weekly': 38.40,
- 'semi-monthly': 41.60,
- 'monthly': 83.30,
- 'quarterly': 250.00,
- 'semi-annual': 500.00,
- 'annual': 1000.00,
- 'daily or miscellaneous': 2.70,
- }
-
-
US NJ NewJersey SIT Allowance Rate
diff --git a/l10n_us_hr_payroll/data/state/nm_new_mexico.xml b/l10n_us_hr_payroll/data/state/nm_new_mexico.xml
index 9a8238f7..75180ca7 100644
--- a/l10n_us_hr_payroll/data/state/nm_new_mexico.xml
+++ b/l10n_us_hr_payroll/data/state/nm_new_mexico.xml
@@ -8,6 +8,12 @@
25800.0
+
+ US NM New Mexico SUTA Wage Base
+ us_nm_suta_wage_base
+ 27000.0
+
+
@@ -245,6 +251,271 @@
}
+
+ US NM New Mexico SIT Tax Rate
+ us_nm_sit_tax_rate
+ {
+ 'single': {
+ 'weekly': (
+ ( 121, 0.00, 0.0),
+ ( 226, 0.00, 1.7),
+ ( 332, 1.80, 3.2),
+ ( 428, 5.18, 4.7),
+ ( 621, 9.70, 4.9),
+ ( 928, 19.13, 4.9),
+ ( 1371, 34.20, 4.9),
+ ( 2525, 55.88, 4.9),
+ ( 4159, 112.41, 4.9),
+ ('inf', 192.51, 5.9),
+ ),
+ 'bi-weekly': (
+ ( 241, 0.00, 0.0),
+ ( 453, 0.00, 1.7),
+ ( 664, 3.60, 3.2),
+ ( 857, 10.37, 4.7),
+ ( 1241, 19.40, 4.9),
+ ( 1857, 38.25, 4.9),
+ ( 2741, 68.40, 4.9),
+ ( 5049, 111.75, 4.9),
+ ( 8318, 224.83, 4.9),
+ ('inf', 385.02, 5.9),
+ ),
+ 'semi-monthly': (
+ ( 261, 0.00, 0.0),
+ ( 491, 0.00, 1.7),
+ ( 720, 3.90, 3.2),
+ ( 928, 11.23, 4.7),
+ ( 1345, 21.02, 4.9),
+ ( 2011, 41.44, 4.9),
+ ( 2970, 74.10, 4.9),
+ ( 2470, 121.06, 4.9),
+ ( 9011, 243.56, 4.9),
+ ('inf', 417.10, 5.9),
+ ),
+ 'monthly': (
+ ( 523, 0.00, 0.0),
+ ( 981, 0.00, 1.7),
+ ( 1440, 7.79, 3.2),
+ ( 1856, 22.46, 4.7),
+ ( 2690, 42.04, 4.9),
+ ( 4023, 82.88, 4.9),
+ ( 5940, 148.21, 4.9),
+ (10940, 242.13, 4.9),
+ (18023, 487.13, 4.9),
+ ('inf', 834.21, 5.9),
+ ),
+ 'quarterly': (
+ ( 1569, 0.00, 0.0),
+ ( 2944, 0.00, 1.7),
+ ( 4319, 23.38, 3.2),
+ ( 5569, 67.38, 4.7),
+ ( 8069, 126.13, 4.9),
+ ( 12069, 248.63, 4.9),
+ ( 17819, 444.63, 4.9),
+ ( 32819, 726.38, 4.9),
+ ( 54069, 1461.38, 4.9),
+ ( 'inf', 2502.63, 5.9),
+ ),
+ 'semi-annual': (
+ ( 3138, 0.00, 0.0),
+ ( 5888, 0.00, 1.7),
+ ( 8638, 46.75, 3.2),
+ ( 11138, 134.75, 4.7),
+ ( 16138, 252.25, 4.9),
+ ( 24138, 497.25, 4.9),
+ ( 35638, 889.25, 4.9),
+ ( 65638, 1452.75, 4.9),
+ (108138, 2922.75, 4.9),
+ ('inf' , 5005.25, 5.9),
+ ),
+ 'annually': (
+ ( 6275, 0.00, 0.0),
+ ( 11775, 0.00, 1.7),
+ ( 17275, 93.50, 3.2),
+ ( 22275, 269.50, 4.7),
+ ( 32275, 504.50, 4.9),
+ ( 48275, 994.50, 4.9),
+ ( 71275, 1778.50, 4.9),
+ (131275, 2905.50, 4.9),
+ (216275, 5845.50, 4.9),
+ ( 'inf', 10010.50, 5.9),
+ ),
+ },
+ 'married': {
+ 'weekly': (
+ ( 241, 0.00, 0.0),
+ ( 395, 0.00, 1.7),
+ ( 549, 2.62, 3.2),
+ ( 703, 7.54, 4.7),
+ ( 1011, 14.77, 4.9),
+ ( 1472, 29.85, 4.9),
+ ( 2164, 52.46, 4.9),
+ ( 4088, 86.38, 4.9),
+ ( 6299, 180.62, 4.9),
+ ('inf', 288.98, 5.9),
+ ),
+ 'bi-weekly': (
+ ( 483, 0.00, 0.0),
+ ( 790, 0.00, 1.7),
+ ( 1089, 5.23, 3.2),
+ ( 1406, 15.08, 4.7),
+ ( 2021, 29.54, 4.9),
+ ( 2944, 59.69, 4.9),
+ ( 4329, 104.92, 4.9),
+ ( 8175, 172.77, 4.9),
+ (12598, 361.23, 4.9),
+ ('inf', 577.96, 5.9),
+ ),
+ 'semi-monthly': (
+ ( 523, 0.00, 0.0),
+ ( 856, 0.00, 1.7),
+ ( 1190, 5.67, 3.2),
+ ( 1523, 16.33, 4.7),
+ ( 2190, 32.00, 4.9),
+ ( 3190, 64.67, 4.9),
+ ( 4690, 113.67, 4.9),
+ ( 8856, 187.17, 4.9),
+ (13648, 391.33, 4.9),
+ ('inf', 626.13, 5.9),
+ ),
+ 'monthly': (
+ ( 1046, 0.00, 0.0),
+ ( 1713, 0.00, 1.7),
+ ( 2379, 11.33, 3.2),
+ ( 3046, 32.67, 4.7),
+ ( 4379, 64.00, 4.9),
+ ( 6379, 129.33, 4.9),
+ ( 9379, 227.33, 4.9),
+ (17713, 374.33, 4.9),
+ (27296, 782.67, 4.9),
+ ('inf', 1252.25, 5.9),
+ ),
+ 'quarterly': (
+ ( 3138, 0.00, 0.0),
+ ( 5138, 0.00, 1.7),
+ ( 7138, 34.00, 3.2),
+ ( 9138, 98.00, 4.7),
+ (13138, 192.00, 4.9),
+ (19138, 388.00, 4.9),
+ (28138, 682.00, 4.9),
+ (53138, 1123.00, 4.9),
+ (81888, 2348.00, 4.9),
+ ('inf', 3756.75, 5.9),
+ ),
+ 'semi-annual': (
+ ( 6275, 0.00, 0.0),
+ ( 10275, 0.00, 1.7),
+ ( 14275, 68.00, 3.2),
+ ( 18275, 196.00, 4.7),
+ ( 26275, 384.00, 4.9),
+ ( 38275, 776.00, 4.9),
+ ( 56275, 1364.00, 4.9),
+ (106275, 2246.00, 4.9),
+ (163775, 4696.00, 4.9),
+ ( 'inf', 7513.50, 5.9),
+ ),
+ 'annually': (
+ ( 12450, 0.00, 0.0),
+ ( 20450, 0.00, 1.7),
+ ( 28450, 136.00, 3.2),
+ ( 36450, 392.00, 4.7),
+ ( 52450, 768.00, 4.9),
+ ( 76450, 1552.00, 4.9),
+ (112450, 2728.00, 4.9),
+ (212550, 4492.00, 4.9),
+ (327550, 9392.00, 4.9),
+ ( 'inf', 15027.00, 5.9),
+ ),
+ },
+ 'married_as_single': {
+ 'weekly': (
+ ( 181, 0.00, 0.0),
+ ( 335, 0.00, 1.7),
+ ( 488, 2.62, 3.2),
+ ( 642, 7.54, 4.7),
+ ( 950, 14.77, 4.9),
+ ( 1412, 29.85, 4.9),
+ ( 2104, 52.46, 4.9),
+ ( 2027, 86.38, 4.9),
+ ( 6238, 180.62, 4.9),
+ ('inf', 288.98, 5.9),
+ ),
+ 'bi-weekly': (
+ ( 362, 0.00, 0.0),
+ ( 669, 0.00, 1.7),
+ ( 977, 5.23, 3.2),
+ ( 1285, 15.08, 4.7),
+ ( 1900, 29.54, 4.9),
+ ( 2823, 59.69, 4.9),
+ ( 4208, 104.92, 4.9),
+ ( 8054, 172.77, 4.9),
+ (12477, 361.23, 4.9),
+ ('inf', 577.96, 5.9),
+ ),
+ 'semi-monthly': (
+ ( 392, 0.00, 0.0),
+ ( 725, 0.00, 1.7),
+ ( 1058, 5.67, 3.2),
+ ( 1392, 16.33, 4.7),
+ ( 2058, 32.00, 4.9),
+ ( 3058, 64.67, 4.9),
+ ( 4558, 113.67, 4.9),
+ ( 8725, 187.17, 4.9),
+ (13517, 391.33, 4.9),
+ ('inf', 626.13, 5.9),
+ ),
+ 'monthly': (
+ ( 783, 0.00, 0.0),
+ ( 1450, 0.00, 1.7),
+ ( 2117, 11.33, 3.2),
+ ( 2783, 32.67, 4.7),
+ ( 4117, 64.00, 4.9),
+ ( 6117, 129.33, 4.9),
+ ( 9117, 227.33, 4.9),
+ (17450, 374.33, 4.9),
+ (27033, 782.67, 4.9),
+ ('inf', 1252.25, 5.9),
+ ),
+ 'quarterly': (
+ ( 2350, 0.00, 0.0),
+ ( 4350, 0.00, 1.7),
+ ( 6350, 34.00, 3.2),
+ ( 8350, 98.00, 4.7),
+ ( 12350, 192.00, 4.9),
+ ( 18350, 388.00, 4.9),
+ ( 27350, 682.00, 4.9),
+ ( 52350, 1123.00, 4.9),
+ ( 81100, 2348.00, 4.9),
+ ( 'inf', 3756.75, 5.9),
+ ),
+ 'semi-annual': (
+ ( 4700, 0.00, 0.0),
+ ( 8700, 0.00, 1.7),
+ ( 12700, 68.00, 3.2),
+ ( 16700, 196.00, 4.7),
+ ( 24700, 384.00, 4.9),
+ ( 36700, 776.00, 4.9),
+ ( 54700, 1364.00, 4.9),
+ (104700, 2246.00, 4.9),
+ (162200, 4696.00, 4.9),
+ ( 'inf', 7513.50, 5.9),
+ ),
+ 'annually': (
+ ( 9400, 0.00, 0.0),
+ ( 17400, 0.00, 1.7),
+ ( 25400, 136.00, 3.2),
+ ( 33400, 392.00, 4.7),
+ ( 49400, 768.00, 4.9),
+ ( 73400, 1552.00, 4.9),
+ (109400, 2728.00, 4.9),
+ (209400, 4492.00, 4.9),
+ (324400, 9392.00, 4.9),
+ ( 'inf', 15027.00, 5.9),
+ ),
+ }
+ }
+
+
diff --git a/l10n_us_hr_payroll/data/state/nv_nevada.xml b/l10n_us_hr_payroll/data/state/nv_nevada.xml
index 59022d7c..523ba58c 100644
--- a/l10n_us_hr_payroll/data/state/nv_nevada.xml
+++ b/l10n_us_hr_payroll/data/state/nv_nevada.xml
@@ -8,6 +8,12 @@
32500.00
+
+ US NV Nevada SUTA Wage Base
+ us_nv_suta_wage_base
+ 33400.00
+
+
diff --git a/l10n_us_hr_payroll/data/state/ny_new_york.xml b/l10n_us_hr_payroll/data/state/ny_new_york.xml
index 73010b8b..7a68f7ac 100644
--- a/l10n_us_hr_payroll/data/state/ny_new_york.xml
+++ b/l10n_us_hr_payroll/data/state/ny_new_york.xml
@@ -2,18 +2,18 @@
-
- US NY New York SUTA Wage Base
- us_ny_suta_wage_base
- 11400.0
-
-
US NY New York SUTA Wage Base
us_ny_suta_wage_base
11600.0
+
+ US NY New York SUTA Wage Base
+ us_ny_suta_wage_base
+ 11800.0
+
+
@@ -63,27 +63,6 @@
-
- US NY New York SIT Tax Rate
- us_ny_sit_tax_rate
- {
- 'single': {
- 'weekly': ((163, 0.0400, 0.0), (225, 0.0450, 6.54), (267, 0.0525, 9.31), (412, 0.0590, 11.54), (1551, 0.0633, 20.04), (1862, 0.0657, 92.17), (2070, 0.0758, 112.58), (3032, 0.0808, 128.38), (4142, 0.0707, 206.08), (5104, 0.0856, 284.60), (20722, 0.0735, 366.90), (21684, 0.5208, 1514.85), ('inf', 0.0962, 2015.62)),
- 'bi-weekly': ((327, 0.0400, 0.0), (450, 0.0450, 13.08), (535, 0.0525, 18.62), (823, 0.0590, 23.08), (3102, 0.0633, 40.08), (3723, 0.0657, 184.35), (4140, 0.0758, 225.15), (6063, 0.0808, 256.77), (8285, 0.0707, 412.15), (10208, 0.0856, 569.19), (41444, 0.0735, 733.81), (43367, 0.5208, 3029.69), ('inf', 0.0962, 4021.23)),
- 'semi-monthly': ((354, 0.0400, 0.0), (488, 0.0450, 14.17), (579, 0.0525, 20.17), (892, 0.0590, 25.00), (3360, 0.0633, 43.42), (4033, 0.0657, 199.71), (4485, 0.0758, 243.92), (6569, 0.0808, 278.17), (8975, 0.0707, 446.50), (11058, 0.0856, 616.63), (44898, 0.0735, 794.96), (46981, 0.5208, 3282.17), ('inf', 0.0962, 4367.17)),
- 'monthly': ((708, 0.0400, 0.0), (975, 0.0450, 28.33), (1158, 0.0525, 40.33), (1783, 0.0590, 50.00), (6721, 0.0633, 86.83), (8067, 0.0657, 399.42), (8971, 0.0758, 487.83), (13138, 0.0808, 556.33), (17950, 0.0707, 893.00), (22117, 0.0856, 1233.25), (89796, 0.0735, 1589.92), (93963, 0.5208, 6564.33), ('inf', 0.0962, 8734.33)),
- 'annually': ((8500, 0.0400, 0.0), (11700, 0.0450, 340.00), (13900, 0.0525, 484.00), (21400, 0.0590, 600.00), (80650, 0.0633, 1042.00), (96800, 0.0657, 4793.00), (107650, 0.0758, 5854.00), (157650, 0.0808, 6676.00), (215400, 0.0707, 10716.00), (265400, 0.0856, 14799.00), (1077550, 0.0735, 19079.00), (1127550, 0.5208, 78772.00), ('inf', 0.0962, 104812.00)),
- },
- 'married': {
- 'weekly': ((163, 0.0400, 0.0), (225, 0.0450, 6.54), (267, 0.0525, 9.31), (412, 0.0590, 11.54), (1551, 0.0633, 20.04), (1862, 0.0657, 92.17), (2070, 0.0783, 112.58), (3032, 0.0833, 128.90), (4068, 0.0785, 209.00), (6215, 0.0707, 290.37), (7177, 0.0916, 442.17), (20722, 0.0735, 530.25), (41449, 0.0765, 1525.83), (42411, 0.9454, 3111.42), ('inf', 0.0962, 4020.46)),
- 'bi-weekly': ((327, 0.0400, 0.0), (450, 0.0450, 13.08), (535, 0.0525, 18.62), (823, 0.0590, 23.08), (3102, 0.0633, 40.08), (3723, 0.0657, 184.35), (4140, 0.0783, 225.15), (6063, 0.0833, 257.81), (8137, 0.0785, 418.00), (12431, 0.0707, 580.73), (14354, 0.0916, 884.35), (41444, 0.0735, 1060.50), (82898, 0.0765, 3051.65), (84821, 0.9454, 6222.85), ('inf', 0.0962, 8040.92)),
- 'semi-monthly': ((354, 0.0400, 0.0), (488, 0.0450, 14.17), (579, 0.0525, 20.17), (892, 0.0590, 25.00), (3360, 0.0633, 43.42), (4033, 0.0657, 199.71), (4485, 0.0783, 243.92), (6569, 0.0833, 279.29), (8815, 0.0785, 452.83), (13476, 0.0707, 629.13), (15550, 0.0916, 958.04), (44898, 0.0735, 1148.88), (89806, 0.0765, 3305.96), (91890, 0.9454, 6741.42), ('inf', 0.0962, 8711.00)),
- 'monthly': ((708, 0.0400, 0.0), (975, 0.0450, 28.33), (1158, 0.0525, 40.33), (1783, 0.0590, 50.00), (6721, 0.0633, 86.83), (8067, 0.0657, 399.42), (8971, 0.0783, 487.83), (13138, 0.0833, 558.58), (17629, 0.0785, 905.67), (26933, 0.0707, 1258.25), (31100, 0.0916, 1916.08), (89796, 0.0735, 2297.75), (179613, 0.0765, 6611.92), (183779, 0.9454, 13482.83), ('inf', 0.0962, 17422.00)),
- 'annually': ((8500, 0.0400, 0.0), (11700, 0.0450, 340.00), (13900, 0.0525, 484.00), (21400, 0.0590, 600.00), (80650, 0.0633, 1042.00), (96800, 0.0657, 4793.00), (107650, 0.0783, 5854.00), (157650, 0.0833, 6703.00), (211550, 0.0785, 10868.00), (323200, 0.0707, 15099.00), (373200, 0.0916, 22993.00), (1077550, 0.0735, 27573.00), (2155350, 0.0765, 79343.00), (2205350, 0.9454, 161794.00), ('inf', 0.0962, 209064.00)),
- }
- }
-
-
US NY New York SIT Tax Rate
us_ny_sit_tax_rate
@@ -255,21 +234,180 @@
}
+
+ US NY New York SIT Tax Rate
+ us_ny_sit_tax_rate
+ {
+ 'single': {
+ 'weekly': (
+ ( 163, 0.0400, 0.00),
+ ( 225, 0.0450, 6.54),
+ ( 267, 0.0525, 9.31),
+ ( 412, 0.0590, 11.54),
+ ( 1551, 0.0597, 20.04),
+ ( 1862, 0.0633, 88.06),
+ ( 2070, 0.0738, 107.73),
+ ( 3032, 0.0788, 123.12),
+ ( 4142, 0.0683, 198.88),
+ ( 5104, 0.0959, 274.75),
+ (20722, 0.0735, 366.96),
+ (21684, 0.5208, 1514.90),
+ ('inf', 0.0962, 2015.67),
+ ),
+ 'bi-weekly': (
+ ( 327, 0.0400, 0.00),
+ ( 450, 0.0450, 13.08),
+ ( 535, 0.0525, 18.62),
+ ( 823, 0.0590, 23.08),
+ ( 3102, 0.0597, 40.08),
+ ( 3723, 0.0633, 176.12),
+ ( 4140, 0.0738, 215.46),
+ ( 6063, 0.0788, 246.23),
+ ( 8285, 0.0683, 397.77),
+ (10208, 0.0959, 549.50),
+ (41444, 0.0735, 733.92),
+ (43367, 0.5208, 3029.81),
+ ('inf', 0.0962, 4031.45),
+ ),
+ 'semi-monthly': (
+ ( 354, 0.0400, 0.00),
+ ( 488, 0.0450, 14.17),
+ ( 579, 0.0525, 20.17),
+ ( 892, 0.0590, 25.00),
+ ( 3360, 0.0597, 43.42),
+ ( 4033, 0.0633, 190.79),
+ ( 4485, 0.0738, 233.42),
+ ( 6569, 0.0788, 266.75),
+ ( 8975, 0.0683, 430.92),
+ (11058, 0.0959, 595.29),
+ (44898, 0.0735, 795.08),
+ (46981, 0.5208, 3282.29),
+ ('inf', 0.0962, 4367.29),
+ ),
+ 'monthly': (
+ ( 708, 0.0400, 0.00),
+ ( 975, 0.0450, 28.33),
+ ( 1158, 0.0525, 40.33),
+ ( 1783, 0.0590, 50.00),
+ ( 6721, 0.0597, 86.83),
+ ( 8067, 0.0633, 381.58),
+ ( 8971, 0.0738, 466.83),
+ (13138, 0.0788, 533.50),
+ (17950, 0.0683, 861.83),
+ (22117, 0.0959, 1190.58),
+ (89796, 0.0735, 1590.17),
+ (93963, 0.5208, 6564.58),
+ ('inf', 0.0962, 8734.58),
+ ),
+ 'annually': (
+ ( 8500, 0.0400, 0.00),
+ ( 11700, 0.0450, 340.00),
+ ( 13900, 0.0525, 484.00),
+ ( 21400, 0.0590, 600.00),
+ ( 80650, 0.0597, 1042.00),
+ ( 96800, 0.0633, 4579.00),
+ ( 107650, 0.0738, 5602.00),
+ ( 157650, 0.0788, 6402.00),
+ ( 215400, 0.0683, 10342.00),
+ ( 265400, 0.0959, 14287.00),
+ (1077550, 0.0735, 19082.00),
+ (1127550, 0.5208, 78775.00),
+ ( 'inf', 0.0962, 104815.00),
+ ),
+ },
+ 'married': {
+ 'weekly': (
+ ( 163, 0.0400, 0.00),
+ ( 225, 0.0450, 6.54),
+ ( 267, 0.0525, 9.31),
+ ( 412, 0.0590, 11.54),
+ ( 1551, 0.0597, 20.04),
+ ( 1862, 0.0633, 88.06),
+ ( 2070, 0.0728, 107.73),
+ ( 3032, 0.0778, 122.90),
+ ( 4068, 0.0799, 197.71),
+ ( 6215, 0.0683, 280.54),
+ ( 7177, 0.1071, 427.19),
+ (20722, 0.0735, 530.17),
+ (41449, 0.0765, 1525.73),
+ (42411, 0.9454, 3111.35),
+ ('inf', 0.0962, 4020.38),
+ ),
+ 'bi-weekly': (
+ ( 327, 0.0400, 0.00),
+ ( 450, 0.0450, 13.08),
+ ( 535, 0.0525, 18.62),
+ ( 823, 0.0590, 23.08),
+ ( 3102, 0.0597, 40.08),
+ ( 3723, 0.0633, 176.12),
+ ( 4140, 0.0728, 215.46),
+ ( 6063, 0.0778, 245.81),
+ ( 8137, 0.0799, 395.42),
+ (12431, 0.0683, 561.08),
+ (14354, 0.1071, 854.38),
+ (41444, 0.0735, 1060.35),
+ (82898, 0.0765, 3051.46),
+ (84821, 0.9454, 6222.69),
+ ('inf', 0.0962, 8040.77),
+ ),
+ 'semi-monthly': (
+ ( 354, 0.0400, 0.00),
+ ( 488, 0.0450, 14.17),
+ ( 579, 0.0525, 20.17),
+ ( 892, 0.0590, 25.00),
+ ( 3360, 0.0597, 43.42),
+ ( 4033, 0.0633, 190.79),
+ ( 4485, 0.0728, 233.42),
+ ( 6569, 0.0778, 266.29),
+ ( 8815, 0.0799, 428.38),
+ (13467, 0.0683, 607.83),
+ (15550, 0.1071, 925.58),
+ (44898, 0.0735, 1148.71),
+ (89806, 0.0765, 3305.75),
+ (91890, 0.9454, 6741.25),
+ ('inf', 0.0962, 8710.83),
+ ),
+ 'monthly': (
+ ( 708, 0.0400, 0.00),
+ ( 975, 0.0450, 28.33),
+ ( 1158, 0.0525, 40.33),
+ ( 1783, 0.0590, 50.00),
+ ( 6721, 0.0597, 86.83),
+ ( 8067, 0.0633, 381.58),
+ ( 8971, 0.0728, 466.83),
+ ( 13138, 0.0778, 532.58),
+ ( 17629, 0.0799, 856.75),
+ ( 26933, 0.0683, 1215.67),
+ ( 31100, 0.1071, 1851.17),
+ ( 89796, 0.0735, 2297.42),
+ (179613, 0.0765, 6611.50),
+ (183779, 0.9454, 13482.50),
+ ( 'inf', 0.0962, 17421.67),
+ ),
+ 'annually': (
+ ( 8500, 0.0400, 0.00),
+ ( 11700, 0.0450, 340.00),
+ ( 13900, 0.0525, 484.00),
+ ( 21400, 0.0590, 600.00),
+ ( 80650, 0.0597, 1042.00),
+ ( 96800, 0.0633, 4579.00),
+ ( 107650, 0.0728, 5602.00),
+ ( 157650, 0.0778, 6391.00),
+ ( 211550, 0.0799, 10281.00),
+ ( 323200, 0.0683, 14588.00),
+ ( 373200, 0.1071, 22214.00),
+ (1077550, 0.0735, 27569.00),
+ (2155350, 0.0765, 79338.00),
+ (2205350, 0.9454, 161790.00),
+ ( 'inf', 0.0962, 209060.00),
+ ),
+ }
+ }
+
+
-
- US NY New York Over 10 Exemption Rate
- us_ny_sit_over_10_exemption_rate
- {
- 'weekly': (142.30, 152.90, 19.25),
- 'bi-weekly': (284.60, 305.80, 38.50),
- 'semi-monthly': (308.35, 331.25, 41.65),
- 'monthly': (616.70, 662.50, 83.30),
- 'annual': (7400, 7950, 1000),
- }
-
-
US NY New York Over 10 Exemption Rate
us_ny_sit_over_10_exemption_rate
@@ -282,30 +420,21 @@
}
+
+ US NY New York Over 10 Exemption Rate
+ us_ny_sit_over_10_exemption_rate
+ {
+ 'weekly': (142.30, 152.90, 19.25),
+ 'bi-weekly': (284.60, 305.80, 38.50),
+ 'semi-monthly': (308.35, 331.25, 41.65),
+ 'monthly': (616.70, 662.50, 83.30),
+ 'annual': (7400, 7950, 1000),
+ }
+
+
-
- US NY New York Deduction Exemption Rate
- us_ny_sit_deduction_exemption_rate
- {
- 'single': {
- 'weekly': (142.30, 161.55, 180.80, 200.05, 219.30, 238.55, 257.80, 277.05, 296.30, 315.55, 334.80),
- 'bi-weekly': (284.60, 323.10, 361.60, 400.10, 438.60, 477.10, 515.60, 544.10, 592.60, 631.10, 669.60),
- 'semi-monthly': (308.35, 350.0, 391.65, 433.30, 474.95, 516.60, 558.25, 599.90, 641.55, 683.20, 724.85),
- 'monthly': (616.70, 700, 783.30, 866.60, 949.90, 1033.20, 1116.50, 1199.80, 1283.10, 1366.40, 1449.70),
- 'annually': (7400, 8400, 9400, 10400, 11400, 12400, 13400, 14400, 15400, 16400, 17400),
- },
- 'married': {
- 'weekly': (152.90, 172.15, 191.40, 210.65, 229.90, 249.15, 268.40, 287.65, 306.90, 326.15, 345.40),
- 'bi-weekly': (305.80, 344.30, 382.80, 421.30, 459.80, 498.30, 536.80, 575.30, 613.80, 652.30, 690.80),
- 'semi-monthly': (331.25, 372.90, 414.55, 456.20, 497.85, 539.50, 581.15, 622.80, 664.45, 706.10, 747.75),
- 'monthly': (662.50, 745.80, 829.10, 912.40, 995.70, 1079.00, 1162.30, 1245.60, 1328.90, 1412.20, 1495.50),
- 'annually': (7950, 8950, 9950, 10950, 11950, 12950, 13950, 14950, 15950, 16950, 17950),
- },
- }
-
-
US NY New York Deduction Exemption Rate
us_ny_sit_deduction_exemption_rate
diff --git a/l10n_us_hr_payroll/data/state/oh_ohio.xml b/l10n_us_hr_payroll/data/state/oh_ohio.xml
index 91d16bd8..a4bdd33f 100644
--- a/l10n_us_hr_payroll/data/state/oh_ohio.xml
+++ b/l10n_us_hr_payroll/data/state/oh_ohio.xml
@@ -2,12 +2,6 @@
-
- US OH Ohio SUTA Wage Base
- us_oh_suta_wage_base
- 9500.00
-
-
US OH Ohio SUTA Wage Base
us_oh_suta_wage_base
@@ -18,12 +12,6 @@
-
- US OH Ohio SUTA Rate
- us_oh_suta_rate
- 2.7
-
-
US OH Ohio SUTA Rate
us_oh_suta_rate
@@ -33,23 +21,6 @@
-
- US OH Ohio SIT Rate Table
- us_oh_sit_rate
-
-
- [
- ( 5000.00, 0.0, 0.005),
- ( 10000.00, 25.0, 0.010),
- ( 15000.00, 75.0, 0.020),
- ( 20000.00, 175.0, 0.025),
- ( 40000.00, 300.0, 0.030),
- ( 80000.00, 900.0, 0.035),
- ( 100000.00, 2300.0, 0.040),
- ( 'inf', 3100.0, 0.050),
- ]
-
-
US OH Ohio SIT Rate Table
us_oh_sit_rate
@@ -70,12 +41,6 @@
-
- US OH Ohio SIT Exemption Rate
- us_oh_sit_exemption_rate
- 650.0
-
-
US OH Ohio SIT Exemption Rate
us_oh_sit_exemption_rate
@@ -85,12 +50,6 @@
-
- US OH Ohio SIT Multiplier Value
- us_oh_sit_multiplier
- 1.075
-
-
US OH Ohio SIT Multiplier Value
us_oh_sit_multiplier
diff --git a/l10n_us_hr_payroll/data/state/ok_oklahoma.xml b/l10n_us_hr_payroll/data/state/ok_oklahoma.xml
index 86deb82d..d79511db 100644
--- a/l10n_us_hr_payroll/data/state/ok_oklahoma.xml
+++ b/l10n_us_hr_payroll/data/state/ok_oklahoma.xml
@@ -8,6 +8,12 @@
18700.0
+
+ US OK Oklahoma SUTA Wage Base
+ us_ok_suta_wage_base
+ 24000.0
+
+
@@ -18,6 +24,12 @@
1.5
+
+ US OK Oklahoma SUTA Rate
+ us_ok_suta_rate
+ 1.0
+
+
diff --git a/l10n_us_hr_payroll/data/state/pa_pennsylvania.xml b/l10n_us_hr_payroll/data/state/pa_pennsylvania.xml
index d0db79c9..149f6f9d 100644
--- a/l10n_us_hr_payroll/data/state/pa_pennsylvania.xml
+++ b/l10n_us_hr_payroll/data/state/pa_pennsylvania.xml
@@ -2,12 +2,6 @@
-
- US PA Pennsylvania SUTA Wage Base (ER)
- us_pa_suta_wage_base
- 10000.00
-
-
US PA Pennsylvania SUTA Wage Base (ER)
us_pa_suta_wage_base
@@ -18,12 +12,6 @@
-
- US PA Pennsylvania SUTA Rate
- us_pa_suta_rate
- 3.6890
-
-
US PA Pennsylvania SUTA Rate
us_pa_suta_rate
@@ -33,12 +21,6 @@
-
- US PA Pennsylvania SUTA Employee Rate
- us_pa_suta_ee_rate
- 0.06
-
-
US PA Pennsylvania SUTA Employee Rate
us_pa_suta_ee_rate
@@ -48,12 +30,6 @@
-
- US PA Pennsylvania SIT Rate
- us_pa_sit_rate
- 3.07
-
-
US PA Pennsylvania SIT Rate
us_pa_sit_rate
diff --git a/l10n_us_hr_payroll/data/state/ri_rhode_island.xml b/l10n_us_hr_payroll/data/state/ri_rhode_island.xml
index 35b6041a..c9b23bb9 100644
--- a/l10n_us_hr_payroll/data/state/ri_rhode_island.xml
+++ b/l10n_us_hr_payroll/data/state/ri_rhode_island.xml
@@ -36,6 +36,20 @@
}
+
+ US RI Rhode Island Exemption Rate
+ us_ri_sit_exemption_rate
+ {
+ 'weekly' : (( 0.00, 19.23), ( 4514.42, 0.00)),
+ 'bi-weekly' : (( 0.00, 38.46), ( 9028.85, 0.00)),
+ 'semi-monthly': (( 0.00, 41.67), ( 9781.25, 0.00)),
+ 'monthly' : (( 0.00, 83.33), ( 19562.50, 0.00)),
+ 'quarterly' : (( 0.00, 250.00), ( 58687.50, 0.00)),
+ 'semi-annually': (( 0.00, 500.00), ( 117375.00, 0.00)),
+ 'annually': (( 0.00, 1000.0), ( 234750.00, 0.00)),
+ }
+
+
@@ -81,6 +95,48 @@
}
+
+ US RI Rhode Island SIT Tax Rate
+ us_ri_sit_tax_rate
+ {
+ 'weekly': (
+ ( 1273, 0.00, 3.75),
+ ( 2895, 47.74, 4.75),
+ ('inf', 124.79, 5.99),
+ ),
+ 'bi-weekly': (
+ ( 2546, 0.00, 3.75),
+ ( 5790, 95.48, 4.75),
+ ('inf', 249.57, 5.99),
+ ),
+ 'semi-monthly': (
+ ( 2758, 0.00, 3.75),
+ ( 6273, 103.43, 4.75),
+ ('inf', 270.39, 5.99),
+ ),
+ 'monthly': (
+ ( 5517, 0.00, 3.75),
+ (12546, 206.89, 4.75),
+ ('inf', 540.77, 5.99),
+ ),
+ 'quarterly': (
+ (16550, 0.00, 3.75),
+ (37638, 620.63, 4.75),
+ ('inf', 1622.31, 5.99),
+ ),
+ 'semi-annually': (
+ (33100, 0.00, 3.75),
+ (75275, 1241.25, 4.75),
+ ('inf', 3244.56, 5.99),
+ ),
+ 'annually': (
+ ( 66200, 0.00, 3.75),
+ (150550, 2482.50, 4.75),
+ ( 'inf', 6489.13, 5.99),
+ ),
+ }
+
+
diff --git a/l10n_us_hr_payroll/data/state/sc_south_carolina.xml b/l10n_us_hr_payroll/data/state/sc_south_carolina.xml
index add7ed8d..325b4c47 100644
--- a/l10n_us_hr_payroll/data/state/sc_south_carolina.xml
+++ b/l10n_us_hr_payroll/data/state/sc_south_carolina.xml
@@ -2,12 +2,6 @@
-
- US SC South Carolina SUTA Wage Base
- us_sc_suta_wage_base
- 14000.0
-
-
US SC South Carolina SUTA Wage Base
us_sc_suta_wage_base
@@ -18,12 +12,6 @@
-
- US SC South Carolina SUTA Rate
- us_sc_suta_rate
- 1.09
-
-
US SC South Carolina SUTA Rate
@@ -34,19 +22,6 @@
-
- US SC South Carolina SIT Tax Rate
- us_sc_sit_tax_rate
- [
- ( 2450, 1.1, 0.0),
- ( 4900, 3.0, 26.95),
- ( 7350, 4.0, 100.45),
- ( 9800, 5.0, 198.45),
- (12250, 6.0, 320.95),
- ('inf', 7.0, 467.95),
- ]
-
-
US SC South Carolina SIT Tax Rate
@@ -61,36 +36,49 @@
]
+
+ US SC South Carolina SIT Tax Rate
+ us_sc_sit_tax_rate
+ [
+ ( 2800, 0.5, 0.0),
+ ( 5610, 3.0, 70.00),
+ ( 8410, 4.0, 126.10),
+ (11220, 5.0, 210.20),
+ (14030, 6.0, 322.40),
+ ('inf', 7.0, 462.70),
+ ]
+
+
-
- US SC South Carolina Personal Exemption Rate
- us_sc_sit_personal_exemption_rate
- 2510
-
-
US SC South Carolina Personal Exemption Rate
us_sc_sit_personal_exemption_rate
2590
+
+ US SC South Carolina Personal Exemption Rate
+ us_sc_sit_personal_exemption_rate
+ 2670
+
+
-
- US SC South Carolina Standard Deduction Rate
- us_sc_sit_standard_deduction_rate
- 3470.0
-
-
US SC South Carolina Standard Deduction Rate
us_sc_sit_standard_deduction_rate
3820.0
+
+ US SC South Carolina Standard Deduction Rate
+ us_sc_sit_standard_deduction_rate
+ 4200.0
+
+
diff --git a/l10n_us_hr_payroll/data/state/tx_texas.xml b/l10n_us_hr_payroll/data/state/tx_texas.xml
index f8bed825..601d60bd 100644
--- a/l10n_us_hr_payroll/data/state/tx_texas.xml
+++ b/l10n_us_hr_payroll/data/state/tx_texas.xml
@@ -2,12 +2,6 @@
-
- US TX Texas SUTA Wage Base
- us_tx_suta_wage_base
- 9000.0
-
-
US TX Texas SUTA Wage Base
us_tx_suta_wage_base
@@ -18,12 +12,6 @@
-
- US TX Texas SUTA Rate
- us_tx_suta_rate
- 2.7
-
-
US TX Texas SUTA Rate
us_tx_suta_rate
@@ -33,12 +21,6 @@
-
- US TX Texas Obligation Assessment Rate
- us_tx_suta_oa_rate
- 0.0
-
-
US TX Texas Obligation Assessment Rate
us_tx_suta_oa_rate
@@ -48,12 +30,6 @@
-
- US TX Texas Employment & Training Investment Assessment Rate
- us_tx_suta_etia_rate
- 0.1
-
-
US TX Texas Employment & Training Investment Assessment Rate
us_tx_suta_etia_rate
diff --git a/l10n_us_hr_payroll/data/state/ut_utah.xml b/l10n_us_hr_payroll/data/state/ut_utah.xml
index b1928223..707a086f 100644
--- a/l10n_us_hr_payroll/data/state/ut_utah.xml
+++ b/l10n_us_hr_payroll/data/state/ut_utah.xml
@@ -8,6 +8,12 @@
36600.0
+
+ US UT Utah SUTA Wage Base
+ us_ut_suta_wage_base
+ 38900.0
+
+
@@ -18,6 +24,12 @@
0.1
+
+ US UT Utah SUTA Rate
+ us_ut_suta_rate
+ 0.1052
+
+
diff --git a/l10n_us_hr_payroll/data/state/va_virginia.xml b/l10n_us_hr_payroll/data/state/va_virginia.xml
index a7e04b5b..9845acd2 100644
--- a/l10n_us_hr_payroll/data/state/va_virginia.xml
+++ b/l10n_us_hr_payroll/data/state/va_virginia.xml
@@ -2,12 +2,6 @@
-
- US VA Virginia SUTA Wage Base
- us_va_suta_wage_base
- 8000.0
-
-
US VA Virginia SUTA Wage Base
us_va_suta_wage_base
@@ -18,18 +12,18 @@
-
- US VA Virginia SUTA Rate
- us_va_suta_rate
- 2.51
-
-
US VA Virginia SUTA Rate
us_va_suta_rate
2.51
+
+ US VA Virginia SUTA Rate
+ us_va_suta_rate
+ 2.5
+
+
diff --git a/l10n_us_hr_payroll/data/state/vt_vermont.xml b/l10n_us_hr_payroll/data/state/vt_vermont.xml
index a6df6085..bbc933d9 100644
--- a/l10n_us_hr_payroll/data/state/vt_vermont.xml
+++ b/l10n_us_hr_payroll/data/state/vt_vermont.xml
@@ -8,6 +8,12 @@
16100.0
+
+ US VT Vermont SUTA Wage Base
+ us_vt_suta_wage_base
+ 14100.0
+
+
@@ -34,6 +40,19 @@
}
+
+ US VT Vermont Allowances Rate
+ us_vt_sit_allowances_rate
+ {
+ 'weekly' : 84.62,
+ 'bi-weekly' : 169.23,
+ 'semi-monthly': 183.33,
+ 'monthly' : 366.67,
+ 'quarterly' : 1100.00,
+ 'annually': 4400.00,
+ }
+
+
@@ -132,6 +151,101 @@
}
+
+ US VT Vermont SIT Tax Rate
+ us_vt_sit_tax_rate
+ {
+ 'single': {
+ 'weekly': (
+ ( 61, 0.00, 0.00),
+ ( 849, 0.00, 3.35),
+ ( 1969, 26.40, 6.60),
+ ( 4041, 100.32, 7.60),
+ ('inf', 257.79, 8.75),
+ ),
+ 'bi-weekly': (
+ ( 122, 0.00, 0.00),
+ ( 1697, 0.00, 3.35),
+ ( 3938, 52.76, 6.60),
+ ( 8082, 200.67, 7.60),
+ ('inf', 515.61, 8.75),
+ ),
+ 'semi-monthly': (
+ ( 132, 0.00, 0.00),
+ ( 1839, 0.00, 3.35),
+ ( 4266, 57.18, 6.60),
+ ( 8755, 217.37, 7.60),
+ ('inf', 558.53, 8.75),
+ ),
+ 'monthly': (
+ ( 265, 0.00, 0.00),
+ ( 3677, 0.00, 3.35),
+ ( 8531, 114.30, 6.60),
+ (17510, 434.67, 7.60),
+ ('inf', 1117.07, 8.75),
+ ),
+ 'quarterly': (
+ ( 794, 0.00, 0.00),
+ (11031, 0.00, 3.35),
+ (25594, 342.94, 6.60),
+ (52531, 1304.10, 7.60),
+ ('inf', 3351.31, 8.75),
+ ),
+ 'annually': (
+ ( 3175, 0.00, 0.00),
+ ( 44125, 0.00, 3.35),
+ (102375, 1371.83, 6.60),
+ (210125, 5216.33, 7.60),
+ ( 'inf', 13405.33, 8.75),
+ ),
+ },
+ 'married': {
+ 'weekly': (
+ ( 183, 0.00, 0.00),
+ ( 1499, 0.00, 3.35),
+ ( 3363, 44.09, 6.60),
+ ( 5028, 167.11, 7.60),
+ ('inf', 293.65, 8.75),
+ ),
+ 'bi-weekly': (
+ ( 366, 0.00, 0.00),
+ ( 2997, 0.00, 3.35),
+ ( 6726, 88.14, 6.60),
+ (10057, 334.25, 7.60),
+ ('inf', 587.41, 8.75),
+ ),
+ 'semi-monthly': (
+ ( 397, 0.00, 0.00),
+ ( 3247, 0.00, 3.35),
+ ( 7286, 95.48, 6.60),
+ (10895, 362.05, 7.60),
+ ('inf', 636.33, 8.75),
+ ),
+ 'monthly': (
+ ( 794, 0.00, 0.00),
+ ( 6494, 0.00, 3.35),
+ (14573, 190.95, 6.60),
+ (21790, 724.16, 7.60),
+ ('inf', 1272.66, 8.75),
+ ),
+ 'quarterly': (
+ ( 2381, 0.00, 0.00),
+ (19481, 0.00, 3.35),
+ (43719, 572.85, 6.60),
+ (65719, 2172.56, 7.60),
+ ('inf', 3817.96, 8.75),
+ ),
+ 'annually': (
+ ( 9525, 0.00, 0.00),
+ ( 77925, 0.00, 3.35),
+ (174875, 2291.40, 6.60),
+ (261475, 8690.10, 7.60),
+ ( 'inf', 15271.70, 8.75),
+ ),
+ },
+ }
+
+
diff --git a/l10n_us_hr_payroll/data/state/wa_washington.xml b/l10n_us_hr_payroll/data/state/wa_washington.xml
index 91100d4e..81f032ba 100644
--- a/l10n_us_hr_payroll/data/state/wa_washington.xml
+++ b/l10n_us_hr_payroll/data/state/wa_washington.xml
@@ -2,58 +2,52 @@
-
- US WA Washington SUTA Wage Base
- us_wa_suta_wage_base
- 49800.0
-
-
US WA Washington SUTA Wage Base
us_wa_suta_wage_base
52700.00
+
+ US WA Washington SUTA Wage Base
+ us_wa_suta_wage_base
+ 56500.0
+
+
-
- US WA Washington FML Wage Base
- us_wa_fml_wage_base
- 132900.00
-
-
US WA Washington FML Wage Base
us_wa_fml_wage_base
137700.00
+
+ US WA Washington FML Wage Base
+ us_wa_fml_wage_base
+ 142800.00
+
+
-
- US WA Washington SUTA Rate
- us_wa_suta_rate
- 1.18
-
-
US WA Washington SUTA Rate
us_wa_suta_rate
1.0
+
+ US WA Washington SUTA Rate
+ us_wa_suta_rate
+ 2.16
+
+
-
- US WA Washington FML Rate (Total)
- us_wa_fml_rate
- 0.4
-
-
US WA Washington FML Rate (Total)
us_wa_fml_rate
@@ -63,33 +57,33 @@
-
- US WA Washington FML Rate (Employee)
- us_wa_fml_rate_ee
- 66.33
-
-
US WA Washington FML Rate (Employee)
us_wa_fml_rate_ee
66.33
+
+ US WA Washington FML Rate (Employee)
+ us_wa_fml_rate_ee
+ 63.33
+
+
-
- US WA Washington FML Rate (Employer)
- us_wa_fml_rate_er
- 33.67
-
-
US WA Washington FML Rate (Employer)
us_wa_fml_rate_er
33.67
+
+ US WA Washington FML Rate (Employer)
+ us_wa_fml_rate_er
+ 36.67
+
+
diff --git a/l10n_us_hr_payroll/data/state/wy_wyoming.xml b/l10n_us_hr_payroll/data/state/wy_wyoming.xml
index ac62e3f0..f1bfb745 100644
--- a/l10n_us_hr_payroll/data/state/wy_wyoming.xml
+++ b/l10n_us_hr_payroll/data/state/wy_wyoming.xml
@@ -2,18 +2,18 @@
-
- US WY Wyoming SUTA Wage Base
- us_wy_suta_wage_base
- 25400.00
-
-
US WY Wyoming SUTA Wage Base
us_wy_suta_wage_base
26400.00
+
+ US WY Wyoming SUTA Wage Base
+ us_wy_suta_wage_base
+ 27300.00
+
+
diff --git a/l10n_us_hr_payroll/models/state/me_maine.py b/l10n_us_hr_payroll/models/state/me_maine.py
index fa5bf874..3b37779d 100644
--- a/l10n_us_hr_payroll/models/state/me_maine.py
+++ b/l10n_us_hr_payroll/models/state/me_maine.py
@@ -38,7 +38,8 @@ def me_maine_state_income_withholding(payslip, categories, worked_days, inputs):
exemption_amt = allowances * personal_exemption
last = 0.0
standard_deduction_amt = 0.0
- for row in standard_deduction:
+
+ for row in standard_deduction: #Standard_deduction is a set so looping through without giving it order isn't working
amt, flat_amt = row
if taxable_income < 82900:
standard_deduction_amt = flat_amt
diff --git a/l10n_us_hr_payroll/tests/__init__.py b/l10n_us_hr_payroll/tests/__init__.py
index a7c95ebf..3bdd9240 100755
--- a/l10n_us_hr_payroll/tests/__init__.py
+++ b/l10n_us_hr_payroll/tests/__init__.py
@@ -4,127 +4,146 @@ from . import common
from . import test_special
-from . import test_us_payslip_2019
from . import test_us_payslip_2020
+from . import test_us_payslip_2021
-from . import test_us_ak_alaska_payslip_2019
from . import test_us_ak_alaska_payslip_2020
+from . import test_us_ak_alaska_payslip_2021
-from . import test_us_al_alabama_payslip_2019
from . import test_us_al_alabama_payslip_2020
+from . import test_us_al_alabama_payslip_2021
-from . import test_us_ar_arkansas_payslip_2019
from . import test_us_ar_arkansas_payslip_2020
+from . import test_us_ar_arkansas_payslip_2021
-from . import test_us_az_arizona_payslip_2019
from . import test_us_az_arizona_payslip_2020
+from . import test_us_az_arizona_payslip_2021
-from . import test_us_ca_california_payslip_2019
from . import test_us_ca_california_payslip_2020
+from . import test_us_ca_california_payslip_2021
from . import test_us_co_colorado_payslip_2020
+from . import test_us_co_colorado_payslip_2021
-from . import test_us_ct_connecticut_payslip_2019
from . import test_us_ct_connecticut_payslip_2020
+from . import test_us_ct_connecticut_payslip_2021
from . import test_us_de_delaware_payslip_2020
+from . import test_us_de_delaware_payslip_2021
-from . import test_us_fl_florida_payslip_2019
from . import test_us_fl_florida_payslip_2020
+from . import test_us_fl_florida_payslip_2021
-from . import test_us_ga_georgia_payslip_2019
from . import test_us_ga_georgia_payslip_2020
+from . import test_us_ga_georgia_payslip_2021
-from . import test_us_hi_hawaii_payslip_2019
from . import test_us_hi_hawaii_payslip_2020
+from . import test_us_hi_hawaii_payslip_2021
-from . import test_us_ia_iowa_payslip_2019
from . import test_us_ia_iowa_payslip_2020
+from . import test_us_ia_iowa_payslip_2021
-from . import test_us_id_idaho_payslip_2019
from . import test_us_id_idaho_payslip_2020
+from . import test_us_id_idaho_payslip_2021
-from . import test_us_il_illinois_payslip_2019
from . import test_us_il_illinois_payslip_2020
+from . import test_us_il_illinois_payslip_2021
from . import test_us_in_indiana_payslip_2020
+from . import test_us_in_indiana_payslip_2021
from . import test_us_ky_kentucky_payslip_2020
+from . import test_us_ky_kentucky_payslip_2021
from . import test_us_ks_kansas_payslip_2020
+from . import test_us_ks_kansas_payslip_2021
-from . import test_us_la_louisiana_payslip_2019
from . import test_us_la_louisiana_payslip_2020
+from . import test_us_la_louisiana_payslip_2021
from . import test_us_me_maine_payslip_2020
+from . import test_us_me_maine_payslip_2021
-from . import test_us_mi_michigan_payslip_2019
from . import test_us_mi_michigan_payslip_2020
+from . import test_us_mi_michigan_payslip_2021
-from . import test_us_mn_minnesota_payslip_2019
from . import test_us_mn_minnesota_payslip_2020
+from . import test_us_mn_minnesota_payslip_2021
-from . import test_us_mo_missouri_payslip_2019
from . import test_us_mo_missouri_payslip_2020
+from . import test_us_mo_missouri_payslip_2021
-from . import test_us_ms_mississippi_payslip_2019
from . import test_us_ms_mississippi_payslip_2020
+from . import test_us_ms_mississippi_payslip_2021
-from . import test_us_mt_montana_payslip_2019
from . import test_us_mt_montana_payslip_2020
+from . import test_us_mt_montana_payslip_2021
-from . import test_us_nc_northcarolina_payslip_2019
from . import test_us_nc_northcarolina_payslip_2020
+from . import test_us_nc_northcarolina_payslip_2021
from . import test_us_nd_north_dakota_payslip_2020
+from . import test_us_nd_north_dakota_payslip_2021
from . import test_us_ne_nebraska_payslip_2020
+from . import test_us_ne_nebraska_payslip_2021
from . import test_us_nh_new_hampshire_payslip_2020
+from . import test_us_nh_new_hampshire_payslip_2021
-from . import test_us_nj_newjersey_payslip_2019
from . import test_us_nj_newjersey_payslip_2020
+from . import test_us_nj_newjersey_payslip_2021
from . import test_us_nm_new_mexico_payslip_2020
+from . import test_us_nm_new_mexico_payslip_2021
from . import test_us_nv_nevada_payslip_2020
+from . import test_us_nv_nevada_payslip_2021
-from . import test_us_ny_new_york_payslip_2019
from . import test_us_ny_new_york_payslip_2020
+from . import test_us_ny_new_york_payslip_2021
-from . import test_us_oh_ohio_payslip_2019
from . import test_us_oh_ohio_payslip_2020
+from . import test_us_oh_ohio_payslip_2021
from . import test_us_ok_oklahoma_payslip_2020
+from . import test_us_ok_oklahoma_payslip_2021
-from . import test_us_pa_pennsylvania_payslip_2019
from . import test_us_pa_pennsylvania_payslip_2020
+from . import test_us_pa_pennsylvania_payslip_2021
from . import test_us_ri_rhode_island_payslip_2020
+from . import test_us_ri_rhode_island_payslip_2021
-from . import test_us_sc_south_carolina_payslip_2019
from . import test_us_sc_south_carolina_payslip_2020
+from . import test_us_sc_south_carolina_payslip_2021
from . import test_us_sd_south_dakota_payslip_2020
+from . import test_us_sd_south_dakota_payslip_2021
from . import test_us_tn_tennessee_payslip_2020
+from . import test_us_tn_tennessee_payslip_2021
-from . import test_us_tx_texas_payslip_2019
from . import test_us_tx_texas_payslip_2020
+from . import test_us_tx_texas_payslip_2021
from . import test_us_us_utah_payslip_2020
+from . import test_us_us_utah_payslip_2021
from . import test_us_vt_vermont_payslip_2020
+from . import test_us_vt_vermont_payslip_2021
-from . import test_us_va_virginia_payslip_2019
from . import test_us_va_virginia_payslip_2020
+from . import test_us_va_virginia_payslip_2021
-from . import test_us_wa_washington_payslip_2019
from . import test_us_wa_washington_payslip_2020
+from . import test_us_wa_washington_payslip_2021
from . import test_us_wv_west_virginia_payslip_2020
+from . import test_us_wv_west_virginia_payslip_2021
from . import test_us_wi_wisconsin_payslip_2020
+from . import test_us_wi_wisconsin_payslip_2021
-from . import test_us_wy_wyoming_payslip_2019
from . import test_us_wy_wyoming_payslip_2020
+from . import test_us_wy_wyoming_payslip_2021
diff --git a/l10n_us_hr_payroll/tests/test_special.py b/l10n_us_hr_payroll/tests/test_special.py
index d68df65d..b4537466 100644
--- a/l10n_us_hr_payroll/tests/test_special.py
+++ b/l10n_us_hr_payroll/tests/test_special.py
@@ -7,7 +7,7 @@ class TestSpecial(TestUsPayslip):
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 = self._createPayslip(employee, '2020-01-01', '2020-01-14')
payslip.compute_sheet()
def test_payslip_sum_behavior(self):
@@ -27,8 +27,8 @@ class TestSpecial(TestUsPayslip):
'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')
+ytd_category = payslip.sum_category('test_sum_behavior', '2021-01-01', '2022-01-01')
+ytd_rule = payslip.sum('test_sum_behavior', '2021-01-01', '2022-01-01')
result = 0.0
if ytd_category != ytd_rule:
# error
@@ -43,7 +43,7 @@ elif ytd_rule == 0.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 = self._createPayslip(employee, '2020-12-30', '2021-01-12')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertEqual(cats['test_sum_behavior'], 1.0)
@@ -52,7 +52,7 @@ elif ytd_rule == 0.0:
# 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 = self._createPayslip(employee, '2021-01-13', '2021-01-27')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertEqual(cats['test_sum_behavior'], 1.0)
@@ -60,7 +60,7 @@ elif ytd_rule == 0.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 = self._createPayslip(employee, '2021-01-13', '2021-01-27')
payslip.compute_sheet()
cats = self._getCategories(payslip)
self.assertEqual(cats['test_sum_behavior'], 0.0)
@@ -104,14 +104,14 @@ result += payslip.sum_category('ALW', str(year) + '-01-01', str(year+1) + '-01-0
salary = 80000.0
employee = self._createEmployee()
contract = self._createContract(employee, wage=salary, schedule_pay='bi-weekly')
- payslip = self._createPayslip(employee, '2020-01-01', '2020-01-14')
+ payslip = self._createPayslip(employee, '2021-01-01', '2021-01-14')
payslip.compute_sheet()
cats = self._getCategories(payslip)
rules = self._getRules(payslip)
self.assertEqual(rules['RECURSION_TEST'], 200.0)
process_payslip(payslip)
- payslip = self._createPayslip(employee, '2020-01-15', '2020-01-27')
+ payslip = self._createPayslip(employee, '2021-01-15', '2021-01-27')
payslip.compute_sheet()
cats = self._getCategories(payslip)
rules = self._getRules(payslip)
diff --git a/l10n_us_hr_payroll/tests/test_us_ak_alaska_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_ak_alaska_payslip_2019.py
deleted file mode 100644
index 3eb62184..00000000
--- a/l10n_us_hr_payroll/tests/test_us_ak_alaska_payslip_2019.py
+++ /dev/null
@@ -1,61 +0,0 @@
-# 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)
diff --git a/l10n_us_hr_payroll/tests/test_us_ak_alaska_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_ak_alaska_payslip_2021.py
new file mode 100644
index 00000000..ebf84eda
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_ak_alaska_payslip_2021.py
@@ -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 = 43600.00
+ AK_UNEMP = 2.57
+ AK_UNEMP_EE = 0.5
+
+ def test_2021_taxes(self):
+ self._test_er_suta('AK', self.AK_UNEMP, date(2021, 1, 1), wage_base=self.AK_UNEMP_MAX_WAGE)
+ self._test_ee_suta('AK', self.AK_UNEMP_EE, date(2021, 1, 1), wage_base=self.AK_UNEMP_MAX_WAGE)
diff --git a/l10n_us_hr_payroll/tests/test_us_al_alabama_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_al_alabama_payslip_2019.py
deleted file mode 100644
index 33ddb2f9..00000000
--- a/l10n_us_hr_payroll/tests/test_us_al_alabama_payslip_2019.py
+++ /dev/null
@@ -1,264 +0,0 @@
-# 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='',
- 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)
diff --git a/l10n_us_hr_payroll/tests/test_us_al_alabama_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_al_alabama_payslip_2021.py
new file mode 100644
index 00000000..56376094
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_al_alabama_payslip_2021.py
@@ -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_2021_taxes_example(self):
+ self._test_er_suta('AL', self.AL_UNEMP, date(2021, 1, 1), wage_base=self.AL_UNEMP_MAX_WAGE)
+ self._test_sit(10000.0, 'S', False, 0.0, 1.0, 'weekly', date(2021, 1, 1), 349.37)
+ self._test_sit(850.0, 'M', False, 0.0, 2.0, 'weekly', date(2021, 1, 1), 30.00)
+ self._test_sit(5000.0, 'H', False, 0.0, 2.0, 'bi-weekly', date(2021, 1, 1), 191.33)
+ self._test_sit(20000.0, 'MS', False, 2.0, 0, 'monthly', date(2021, 1, 1), 758.86)
+ self._test_sit(5500.0, '', True, 2.0, 150, 'weekly', date(2021, 1, 1), 0.00)
diff --git a/l10n_us_hr_payroll/tests/test_us_ar_arkansas_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_ar_arkansas_payslip_2019.py
deleted file mode 100644
index 73b0f59c..00000000
--- a/l10n_us_hr_payroll/tests/test_us_ar_arkansas_payslip_2019.py
+++ /dev/null
@@ -1,72 +0,0 @@
-# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
-
-from .common import TestUsPayslip, process_payslip
-
-
-class TestUsARPayslip(TestUsPayslip):
- # https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/whformula.pdf Calculation based on this file.
- AR_UNEMP_MAX_WAGE = 10000.00
- AR_UNEMP = -3.2 / 100.0
- AR_INC_TAX = -0.0535
-
- def test_taxes_monthly(self):
- salary = 2127.0
- schedule_pay = 'monthly'
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('AR'),
- state_income_tax_additional_withholding=0.0,
- ar_ar4ec_sit_allowances=2.0,
- state_income_tax_exempt=False,
- schedule_pay='monthly')
-
- self._log('2019 Arkansas tax first payslip weekly:')
- payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
- payslip.compute_sheet()
- cats = self._getCategories(payslip)
-
- # Not exempt from rule 1 or rule 2 - unemployment wages., and actual unemployment.
- self.assertPayrollEqual(cats['ER_US_SUTA'], salary * self.AR_UNEMP)
-
- process_payslip(payslip)
-
- # Make a new payslip, this one will have maximums
- remaining_AR_UNEMP_wages = self.AR_UNEMP_MAX_WAGE - salary if (self.AR_UNEMP_MAX_WAGE - 2*salary < salary) else salary
- # We reached the cap of 10000.0 in the first payslip.
- self._log('2019 Arkansas 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_AR_UNEMP_wages * self.AR_UNEMP)
-
- def test_additional_withholding(self):
- salary = 5000.0
- schedule_pay = 'monthly'
- pay_periods = 12
- allowances = 2
- # TODO: comment on how it was calculated
- test_ar_amt = 2598.60
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('AR'),
- state_income_tax_additional_withholding=100.0,
- ar_ar4ec_sit_allowances=2.0,
- state_income_tax_exempt=False,
- schedule_pay='monthly')
-
-
- self._log('2019 Arkansas 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.AR_UNEMP)
- # TODO: change to hand the test_ar_amt already be divided by pay periods
- self.assertPayrollAlmostEqual(cats['EE_US_SIT'], -round(test_ar_amt / pay_periods) - 100)
-
- process_payslip(payslip)
diff --git a/l10n_us_hr_payroll/tests/test_us_ar_arkansas_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_ar_arkansas_payslip_2021.py
new file mode 100644
index 00000000..f7a2928e
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_ar_arkansas_payslip_2021.py
@@ -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 TestUsARPayslip(TestUsPayslip):
+ # Taxes and Rates
+ AR_UNEMP_MAX_WAGE = 10000.0
+ AR_UNEMP = 3.2
+
+ def _test_sit(self, wage, exemptions, allowances, additional_withholding, schedule_pay, date_start, expected_withholding):
+
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ state_id=self.get_us_state('AR'),
+ state_income_tax_exempt=exemptions,
+ state_income_tax_additional_withholding=additional_withholding,
+ ar_ar4ec_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_2021_taxes_example(self):
+ self._test_er_suta('AR', self.AR_UNEMP, date(2021, 1, 1), wage_base=self.AR_UNEMP_MAX_WAGE)
+ self._test_sit(5000.0, True, 0.0, 0, 'monthly', date(2021, 1, 1), 0.0)
+ self._test_sit(5000.0, False, 0.0, 0, 'monthly', date(2021, 1, 1), 220.0)
+ self._test_sit(700.0, False, 0.0, 150, 'weekly', date(2021, 1, 1), 175.0)
+ self._test_sit(7000.0, False, 2.0, 0, 'semi-monthly', date(2021, 1, 1), 395.0)
+ self._test_sit(3000.0, False, 1.0, 0, 'bi-weekly', date(2021, 1, 1), 141.0)
diff --git a/l10n_us_hr_payroll/tests/test_us_az_arizona_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_az_arizona_payslip_2019.py
deleted file mode 100644
index b97063b6..00000000
--- a/l10n_us_hr_payroll/tests/test_us_az_arizona_payslip_2019.py
+++ /dev/null
@@ -1,72 +0,0 @@
-# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
-
-from .common import TestUsPayslip, process_payslip
-
-
-class TestUsAZPayslip(TestUsPayslip):
-
- # TAXES AND RATES
- AZ_UNEMP_MAX_WAGE = 7000.00
- AZ_UNEMP = -(2.00 / 100.0)
-
- def test_taxes_with_additional_wh(self):
- salary = 15000.00
- schedule_pay = 'weekly'
- withholding_percentage = 5.1
- percent_wh = (5.10 / 100) # 5.1%
- additional_wh = 12.50
-
- wh_to_test = -((percent_wh * salary) + additional_wh)
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('AZ'),
- state_income_tax_additional_withholding=12.50,
- az_a4_sit_withholding_percentage=withholding_percentage,
- schedule_pay=schedule_pay)
-
- self._log('2019 Arizona 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'], self.AZ_UNEMP_MAX_WAGE * self.AZ_UNEMP)
- self.assertPayrollEqual(cats['EE_US_SIT'], wh_to_test)
-
- process_payslip(payslip)
-
- remaining_AZ_UNEMP_wages = 0.0 # We already reached max unemployment wages.
-
- self._log('2019 Arizona 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_AZ_UNEMP_wages * self.AZ_UNEMP)
-
- def test_taxes_monthly(self):
- salary = 1000.00
- schedule_pay = 'monthly'
- withholding_percentage = 2.7
- percent_wh = (2.70 / 100) # 2.7%
- additional_wh = 0.0
- wh_to_test = -((percent_wh * salary) + additional_wh)
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('AZ'),
- state_income_tax_additional_withholding=0.0,
- az_a4_sit_withholding_percentage=withholding_percentage,
- schedule_pay=schedule_pay)
-
- self._log('2019 Arizona 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.AZ_UNEMP)
- self.assertPayrollEqual(cats['EE_US_SIT'], wh_to_test)
-
- process_payslip(payslip)
diff --git a/l10n_us_hr_payroll/tests/test_us_az_arizona_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_az_arizona_payslip_2021.py
new file mode 100644
index 00000000..582fd58b
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_az_arizona_payslip_2021.py
@@ -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 TestUsAZPayslip(TestUsPayslip):
+ # Taxes and Rates
+ AZ_UNEMP_MAX_WAGE = 7000.0
+ AZ_UNEMP = 2.0
+
+ def _test_sit(self, wage, additional_withholding, withholding_percent, schedule_pay, date_start, expected_withholding):
+
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ state_id=self.get_us_state('AZ'),
+ state_income_tax_additional_withholding=additional_withholding,
+ az_a4_sit_withholding_percentage=withholding_percent,
+ 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_2021_taxes_example(self):
+ self._test_er_suta('AZ', self.AZ_UNEMP, date(2021, 1, 1), wage_base=self.AZ_UNEMP_MAX_WAGE)
+ self._test_sit(1000.0, 0.0, 2.70, 'monthly', date(2021, 1, 1), 27.0)
+ self._test_sit(1000.0, 10.0, 2.70, 'monthly', date(2021, 1, 1), 37.0)
+ self._test_sit(15000.0, 0.0, 3.60, 'weekly', date(2021, 1, 1), 540.0)
+ self._test_sit(8000.0, 0.0, 4.20, 'semi-monthly', date(2021, 1, 1), 336.0)
+ self._test_sit(8000.0, 0.0, 0.00, 'semi-monthly', date(2021, 1, 1), 0.0)
diff --git a/l10n_us_hr_payroll/tests/test_us_ca_california_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_ca_california_payslip_2019.py
deleted file mode 100644
index b9331fe3..00000000
--- a/l10n_us_hr_payroll/tests/test_us_ca_california_payslip_2019.py
+++ /dev/null
@@ -1,245 +0,0 @@
-# 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)
\ No newline at end of file
diff --git a/l10n_us_hr_payroll/tests/test_us_ca_california_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_ca_california_payslip_2021.py
new file mode 100755
index 00000000..5a0b8b7f
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_ca_california_payslip_2021.py
@@ -0,0 +1,43 @@
+# 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):
+ ###
+ # 2021 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.2
+
+ 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_2021_taxes_example1(self):
+ combined_er_rate = self.CA_UIT + self.CA_ETT
+ self._test_er_suta('CA', combined_er_rate, date(2021, 1, 1), wage_base=self.CA_UNEMP_MAX_WAGE)
+ self._test_ee_suta('CA', self.CA_SDI, date(2021, 1, 1), wage_base=self.CA_UNEMP_MAX_WAGE, relaxed=True)
+ # these expected values come from examples in https://edd.ca.gov/pdf_pub_ctr/21methb.pdf
+ self._test_sit(210.0, 'single', 1, 0, 0, 'weekly', date(2021, 1, 1), 0.00)
+ self._test_sit(1250.0, 'married', 2, 1, 0, 'bi-weekly', date(2021, 1, 1), 0.82)
+ self._test_sit(4100.0, 'married', 5, 0, 0, 'monthly', date(2021, 1, 1), 0.13)
+ self._test_sit(800.0, 'head_household', 3, 0, 0, 'weekly', date(2021, 1, 1), 2.05)
+ self._test_sit(1800.0, 'married', 4, 0, 0, 'semi-monthly', date(2021, 1, 1), 0.24)
+ self._test_sit(45000.0, 'married', 4, 0, 0, 'annually', date(2021, 1, 1), 45.45)
+ self._test_sit(45000.0, 'married', 4, 0, 20.0, 'annually', date(2021, 1, 1), 65.45)
+ self._test_sit(6000.0, '', 4, 0, 20.0, 'annually', date(2021, 1, 1), 0.00)
diff --git a/l10n_us_hr_payroll/tests/test_us_co_colorado_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_co_colorado_payslip_2021.py
new file mode 100755
index 00000000..754e1623
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_co_colorado_payslip_2021.py
@@ -0,0 +1,37 @@
+# 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):
+ ###
+ # 2021 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_2021_taxes_example(self):
+ self._test_er_suta('CO', self.CO_UNEMP, date(2021, 1, 1), wage_base=self.CO_UNEMP_MAX_WAGE)
+ self._test_sit(5000.0, 'married', 0.0, 'semi-monthly', date(2021, 1, 1), 216.07)
+ self._test_sit(800.0, 'single', 0.0, 'weekly', date(2021, 1, 1), 33.48)
+ self._test_sit(20000.0, 'married', 0.0, 'quarterly', date(2021, 1, 1), 833.4)
+ self._test_sit(20000.0, 'married', 10.0, 'quarterly', date(2021, 1, 1), 843.4)
+ self._test_sit(20000.0, 'married', 0.0, 'quarterly', date(2021, 1, 1), 0.0, True)
+ self._test_sit(800.0, '', 0.0, 'weekly', date(2021, 1, 1), 0.00)
diff --git a/l10n_us_hr_payroll/tests/test_us_ct_connecticut_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_ct_connecticut_payslip_2019.py
deleted file mode 100644
index ab423131..00000000
--- a/l10n_us_hr_payroll/tests/test_us_ct_connecticut_payslip_2019.py
+++ /dev/null
@@ -1,121 +0,0 @@
-# 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)
diff --git a/l10n_us_hr_payroll/tests/test_us_ct_connecticut_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_ct_connecticut_payslip_2021.py
new file mode 100644
index 00000000..661131ea
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_ct_connecticut_payslip_2021.py
@@ -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 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_2021_taxes_example(self):
+ self._test_er_suta('CT', self.CT_UNEMP, date(2021, 1, 1), wage_base=self.CT_UNEMP_MAX_WAGE)
+ self._test_sit(10000.0, 'a', 0.0, 'weekly', date(2021, 1, 1), 693.23)
+ self._test_sit(12000.0, 'b', 15.0, 'bi-weekly', date(2021, 1, 1), 688.85)
+ self._test_sit(5000.0, 'f', 15.0, 'monthly', date(2021, 1, 1), 230.25)
+ self._test_sit(15000.0, 'c', 0.0, 'monthly', date(2021, 1, 1), 783.33)
+ self._test_sit(18000.0, 'b', 0.0, 'weekly', date(2021, 1, 1), 1254.35)
+ self._test_sit(500.0, 'd', 0.0, 'weekly', date(2021, 1, 1), 21.15)
diff --git a/l10n_us_hr_payroll/tests/test_us_de_delaware_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_de_delaware_payslip_2021.py
new file mode 100755
index 00000000..ad8b2453
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_de_delaware_payslip_2021.py
@@ -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):
+ ###
+ # 2021 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_2021_taxes_example(self):
+ self._test_er_suta('DE', self.DE_UNEMP, date(2021, 1, 1), wage_base=self.DE_UNEMP_MAX_WAGE)
+ self._test_sit(480.77, 'single', 0.0, 1.0, 'weekly', date(2021, 1, 1), 13.88)
+ self._test_sit(5000.0, 'single', 0.0, 2.0, 'monthly', date(2021, 1, 1), 211.93)
+ self._test_sit(5000.0, 'single', 10.0, 1.0, 'monthly', date(2021, 1, 1), 231.1)
+ self._test_sit(20000.0, 'married', 0.0, 3.0, 'quarterly', date(2021, 1, 1), 876.0)
diff --git a/l10n_us_hr_payroll/tests/test_us_fl_florida_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_fl_florida_payslip_2019.py
deleted file mode 100755
index 419be377..00000000
--- a/l10n_us_hr_payroll/tests/test_us_fl_florida_payslip_2019.py
+++ /dev/null
@@ -1,84 +0,0 @@
-# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
-
-from .common import TestUsPayslip, process_payslip
-from odoo.addons.l10n_us_hr_payroll.models.hr_contract import USHRContract
-
-
-class TestUsFlPayslip(TestUsPayslip):
- ###
- # 2019 Taxes and Rates
- ###
- FL_UNEMP_MAX_WAGE = 7000.0
- FL_UNEMP = -2.7 / 100.0
-
- def test_2019_taxes(self):
- salary = 5000.0
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('FL'))
-
- self._log('2019 Florida 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.FL_UNEMP)
-
- process_payslip(payslip)
-
- # Make a new payslip, this one will have maximums
-
- remaining_fl_unemp_wages = self.FL_UNEMP_MAX_WAGE - salary if (self.FL_UNEMP_MAX_WAGE - 2*salary < salary) \
- else salary
-
- self._log('2019 Florida 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'], remaining_fl_unemp_wages * self.FL_UNEMP)
-
- def test_2019_taxes_with_external(self):
- salary = 5000.0
- external_wages = 6000.0
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- external_wages=external_wages,
- state_id=self.get_us_state('FL'))
-
- self._log('2019 Forida_external 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.FL_UNEMP_MAX_WAGE - external_wages) * self.FL_UNEMP)
-
- def test_2019_taxes_with_state_exempt(self):
- salary = 5000.0
- external_wages = 6000.0
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- external_wages=external_wages,
- futa_type=USHRContract.FUTA_TYPE_BASIC,
- state_id=self.get_us_state('FL'))
-
- self._log('2019 Forida_external tax first payslip:')
- payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
-
- payslip.compute_sheet()
-
- cats = self._getCategories(payslip)
-
- self.assertPayrollEqual(cats.get('ER_US_SUTA', 0.0), 0.0)
diff --git a/l10n_us_hr_payroll/tests/test_us_fl_florida_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_fl_florida_payslip_2021.py
new file mode 100755
index 00000000..f146bf4e
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_fl_florida_payslip_2021.py
@@ -0,0 +1,16 @@
+# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
+
+from datetime import date
+from .common import TestUsPayslip
+
+
+class TestUsFlPayslip(TestUsPayslip):
+ ###
+ # 2021 Taxes and Rates
+ ###
+ FL_UNEMP_MAX_WAGE = 7000.0
+ FL_UNEMP = 2.9
+
+ def test_2021_taxes(self):
+ # Only has state unemployment
+ self._test_er_suta('FL', self.FL_UNEMP, date(2021, 1, 1), wage_base=self.FL_UNEMP_MAX_WAGE)
diff --git a/l10n_us_hr_payroll/tests/test_us_ga_georgia_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_ga_georgia_payslip_2019.py
deleted file mode 100755
index 98206965..00000000
--- a/l10n_us_hr_payroll/tests/test_us_ga_georgia_payslip_2019.py
+++ /dev/null
@@ -1,135 +0,0 @@
-# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
-
-from .common import TestUsPayslip, process_payslip
-
-
-class TestUsGAPayslip(TestUsPayslip):
-
- # TAXES AND RATES
- GA_UNEMP_MAX_WAGE = 9500.00
- GA_UNEMP = -(2.70 / 100.0)
-
- def test_taxes_weekly_single_with_additional_wh(self):
- salary = 15000.00
- schedule_pay = 'weekly'
- allowances = 1
- filing_status = 'single'
- additional_wh = 12.50
- # Hand Calculated Amount to Test
- # Step 1 - Subtract standard deduction from wages. Std Deduct for single weekly is 88.50
- # step1 = 15000.00 - 88.50 = 14911.5
- # Step 2 - Subtract personal allowance from step1. Allowance for single weekly is 51.92
- # step2 = step1 - 51.92 = 14859.58
- # Step 3 - Subtract amount for dependents. Weekly dependent allowance is 57.50
- # step3 = 14859.58 - 57.50 = 14802.08
- # Step 4 -Determine wh amount from tables
- # step4 = 4.42 + ((5.75 / 100.00) * (14802.08 - 135.00))
- # Add additional_wh
- # wh = 847.7771 + 12.50 = 860.2771
- wh = -860.28
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('GA'),
- ga_g4_sit_dependent_allowances=allowances,
- ga_g4_sit_additional_allowances=0,
- ga_g4_sit_filing_status=filing_status,
- state_income_tax_additional_withholding=additional_wh,
- schedule_pay=schedule_pay)
-
- self.assertEqual(contract.schedule_pay, 'weekly')
-
- self._log('2019 Georgia 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'], self.GA_UNEMP_MAX_WAGE * self.GA_UNEMP)
- self.assertPayrollEqual(cats['EE_US_SIT'], wh)
-
- process_payslip(payslip)
-
- remaining_GA_UNEMP_wages = 0.0 # We already reached max unemployment wages.
-
- self._log('2019 Georgia 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_GA_UNEMP_wages * self.GA_UNEMP)
-
-
- def test_taxes_monthly_head_of_household(self):
- salary = 25000.00
- schedule_pay = 'monthly'
- allowances = 2
- filing_status = 'head of household'
- additional_wh = 15.00
- # Hand Calculated Amount to Test
- # Step 1 - Subtract standard deduction from wages. Std Deduct for head of household monthly is 383.50
- # step1 = 25000.00 - 383.50 = 24616.5
- # Step 2 - Subtract personal allowance from step1. Allowance for head of household monthly is 225.00
- # step2 = 24616.5 - 225.00 = 24391.5
- # Step 3 - Subtract amount for dependents. Weekly dependent allowance is 250.00
- # step3 = 24391.5 - (2 * 250.00) = 23891.5
- # Step 4 - Determine wh amount from tables
- # step4 = 28.33 + ((5.75 / 100.00) * (23891.5 - 833.00)) = 1354.19375
- # Add additional_wh
- # wh = 1354.19375 + 15.00 = 1369.19375
- wh = -1369.19
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('GA'),
- ga_g4_sit_dependent_allowances=allowances,
- ga_g4_sit_additional_allowances=0,
- ga_g4_sit_filing_status=filing_status,
- state_income_tax_additional_withholding=additional_wh,
- schedule_pay=schedule_pay)
-
- self.assertEqual(contract.schedule_pay, 'monthly')
-
- self._log('2019 Georgia 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.GA_UNEMP_MAX_WAGE * self.GA_UNEMP)
- self.assertPayrollAlmostEqual(cats['EE_US_SIT'], wh)
-
- process_payslip(payslip)
-
- remaining_GA_UNEMP_wages = 0.0 # We already reached max unemployment wages.
-
- self._log('2019 Georgia 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_GA_UNEMP_wages * self.GA_UNEMP)
-
- def test_taxes_exempt(self):
- salary = 25000.00
- schedule_pay = 'monthly'
- allowances = 2
- filing_status = ''
- additional_wh = 15.00
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('GA'),
- ga_g4_sit_dependent_allowances=allowances,
- ga_g4_sit_additional_allowances=0,
- ga_g4_sit_filing_status=filing_status,
- state_income_tax_additional_withholding=additional_wh,
- schedule_pay=schedule_pay)
-
- self._log('2019 Georgia tax first payslip exempt:')
- payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
- payslip.compute_sheet()
- cats = self._getCategories(payslip)
-
- self.assertPayrollEqual(cats.get('EE_US_SIT', 0), 0)
diff --git a/l10n_us_hr_payroll/tests/test_us_ga_georgia_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_ga_georgia_payslip_2021.py
new file mode 100755
index 00000000..56cb9abc
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_ga_georgia_payslip_2021.py
@@ -0,0 +1,39 @@
+# 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 TestUsGAPayslip(TestUsPayslip):
+
+ # TAXES AND RATES
+ GA_UNEMP_MAX_WAGE = 9500.00
+ GA_UNEMP = 2.70
+
+ # Example calculated based on https://dor.georgia.gov/employers-tax-guide 2021_employer tax gauide
+
+ def _test_sit(self, wage, filing_status, additional_withholding, dependent_allowances, additional_allowances,
+ schedule_pay, date_start, expected_withholding):
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ state_id=self.get_us_state('GA'),
+ ga_g4_sit_filing_status=filing_status,
+ state_income_tax_additional_withholding=additional_withholding,
+ ga_g4_sit_dependent_allowances=dependent_allowances,
+ ga_g4_sit_additional_allowances=additional_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.assertPayrollAlmostEqual(cats.get('EE_US_SIT', 0.0), -expected_withholding)
+
+ def test_2021_taxes_example(self):
+ self._test_er_suta('GA', self.GA_UNEMP, date(2021, 1, 1), wage_base=self.GA_UNEMP_MAX_WAGE)
+ self._test_sit(15000.0, 'single', 12.50, 1, 0, 'weekly', date(2021, 1, 1), 860.28)
+ self._test_sit(25000.0, 'head of household', 15.00, 2, 0, 'monthly', date(2021, 1, 1), 1369.19)
+ self._test_sit(425.0, 'married filing separate', 0.0, 1, 0, 'weekly', date(2021, 1, 1), 11.45)
+ self._test_sit(3000.0, 'single', 0.00, 1, 1, 'quarterly', date(2021, 1, 1), 0.0)
+ self._test_sit(2500.0, '', 0.00, 1, 1, 'quarterly', date(2021, 1, 1), 0.0)
diff --git a/l10n_us_hr_payroll/tests/test_us_hi_hawaii_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_hi_hawaii_payslip_2019.py
deleted file mode 100644
index 13f1f2b5..00000000
--- a/l10n_us_hr_payroll/tests/test_us_hi_hawaii_payslip_2019.py
+++ /dev/null
@@ -1,93 +0,0 @@
-# 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)
-
diff --git a/l10n_us_hr_payroll/tests/test_us_hi_hawaii_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_hi_hawaii_payslip_2021.py
new file mode 100755
index 00000000..0463b227
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_hi_hawaii_payslip_2021.py
@@ -0,0 +1,37 @@
+# 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):
+ ###
+ # 2021 Taxes and Rates
+ ###
+ HI_UNEMP_MAX_WAGE = 47400.00
+ HI_UNEMP = 5.2
+
+ 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_2021_taxes_example(self):
+ self._test_er_suta('HI', self.HI_UNEMP, date(2021, 1, 1), wage_base=self.HI_UNEMP_MAX_WAGE)
+ self._test_sit(375.0, 'single', 0.0, 3.0, 'weekly', date(2021, 1, 1), 15.3)
+ self._test_sit(5000.0, 'married', 0.0, 2.0, 'monthly', date(2021, 1, 1), 287.1)
+ self._test_sit(5000.0, 'married', 10.0, 2.0, 'monthly', date(2021, 1, 1), 297.1)
+ self._test_sit(50000.0, 'head_of_household', 0.0, 3.0, 'weekly', date(2021, 1, 1), 3933.65)
+ self._test_sit(750.0, 'single', 10.0, 3.0, 'bi-weekly', date(2021, 1, 1), 40.59)
+ self._test_sit(3000.0, '', 0.0, 3.0, 'weekly', date(2021, 1, 1), 0.00)
diff --git a/l10n_us_hr_payroll/tests/test_us_ia_iowa_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_ia_iowa_payslip_2019.py
deleted file mode 100644
index cb3bccfd..00000000
--- a/l10n_us_hr_payroll/tests/test_us_ia_iowa_payslip_2019.py
+++ /dev/null
@@ -1,152 +0,0 @@
-# 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)
\ No newline at end of file
diff --git a/l10n_us_hr_payroll/tests/test_us_ia_iowa_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_ia_iowa_payslip_2021.py
new file mode 100755
index 00000000..396acfe4
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_ia_iowa_payslip_2021.py
@@ -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 TestUsIAPayslip(TestUsPayslip):
+ ###
+ # 2021 Taxes and Rates
+ ###
+ IA_UNEMP_MAX_WAGE = 32400.0
+ IA_UNEMP = 1.0
+
+ def _test_sit(self, wage, exempt, 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_exempt=exempt,
+ 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.assertPayrollAlmostEqual(cats.get('EE_US_SIT', 0.0), -expected_withholding)
+
+ def test_2021_taxes_example(self):
+ self._test_er_suta('IA', self.IA_UNEMP, date(2021, 1, 1), wage_base=self.IA_UNEMP_MAX_WAGE)
+ self._test_sit(2100.0, False, 0.0, 3.0, 'bi-weekly', date(2021, 1, 1), 79.31)
+ self._test_sit(3000.0, True, 10.0, 1.0, 'bi-weekly', date(2021, 1, 1), 0.00)
+ self._test_sit(300.0, False, 0.0, 1.0, 'weekly', date(2021, 1, 1), 6.14)
+ self._test_sit(5000.0, False, 0.0, 1.0, 'monthly', date(2021, 1, 1), 218.06)
+ self._test_sit(7500.0, False, 10.0, 2.0, 'semi-monthly', date(2021, 1, 1), 421.71)
diff --git a/l10n_us_hr_payroll/tests/test_us_id_idaho_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_id_idaho_payslip_2019.py
deleted file mode 100644
index 8e3576d6..00000000
--- a/l10n_us_hr_payroll/tests/test_us_id_idaho_payslip_2019.py
+++ /dev/null
@@ -1,85 +0,0 @@
-# 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)
diff --git a/l10n_us_hr_payroll/tests/test_us_id_idaho_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_id_idaho_payslip_2021.py
new file mode 100755
index 00000000..c6149719
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_id_idaho_payslip_2021.py
@@ -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):
+ ###
+ # 2021 Taxes and Rates
+ ###
+ ID_UNEMP_MAX_WAGE = 43000.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_2021_taxes_example(self):
+ self._test_er_suta('ID', self.ID_UNEMP, date(2021, 1, 1), wage_base=self.ID_UNEMP_MAX_WAGE)
+ self._test_sit(1212.0, 'single', 4.0, 'bi-weekly', date(2021, 1, 1), 10.0)
+ self._test_sit(10000.0, 'married', 1.0, 'annually', date(2021, 1, 1), 0.0)
+ self._test_sit(52000.0, 'married', 4.0, 'monthly', date(2021, 1, 1), 3345.0)
+ self._test_sit(5000.0, 'head of household', 0.0, 'semi-monthly', date(2021, 1, 1), 300.0)
+ self._test_sit(5900.0, 'single', 5.0, 'weekly', date(2021, 1, 1), 367.0)
diff --git a/l10n_us_hr_payroll/tests/test_us_il_illinois_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_il_illinois_payslip_2019.py
deleted file mode 100644
index ba633607..00000000
--- a/l10n_us_hr_payroll/tests/test_us_il_illinois_payslip_2019.py
+++ /dev/null
@@ -1,71 +0,0 @@
-# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
-
-from .common import TestUsPayslip, process_payslip
-
-
-class TestUsILPayslip(TestUsPayslip):
- # TAXES AND RATES
- IL_UNEMP_MAX_WAGE = 12960.00
- IL_UNEMP = -(3.175 / 100.0)
-
- def test_taxes_monthly(self):
- salary = 15000.00
- schedule_pay = 'monthly'
- basic_allowances = 1
- additional_allowances = 1
- flat_rate = (4.95 / 100)
- wh_to_test = -(flat_rate * (salary - ((basic_allowances * 2275 + additional_allowances * 1000) / 12.0)))
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('IL'),
- state_income_tax_additional_withholding=0.0,
- il_w4_sit_basic_allowances=1.0,
- il_w4_sit_additional_allowances=1.0,
- schedule_pay='monthly')
-
- self._log('2019 Illinois 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.IL_UNEMP_MAX_WAGE * self.IL_UNEMP)
- self.assertPayrollEqual(cats['EE_US_SIT'], wh_to_test)
-
- process_payslip(payslip)
-
- remaining_IL_UNEMP_wages = 0.0 # We already reached max unemployment wages.
-
- self._log('2019 Illinois 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_IL_UNEMP_wages * self.IL_UNEMP)
-
- def test_taxes_with_additional_wh(self):
- salary = 15000.00
- schedule_pay = 'monthly'
- basic_allowances = 1
- additional_allowances = 1
- additional_wh = 15.0
- flat_rate = (4.95 / 100)
- wh_to_test = -(flat_rate * (salary - ((basic_allowances * 2275 + additional_allowances * 1000) / 12.0)) + additional_wh)
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('IL'),
- state_income_tax_additional_withholding=15.0,
- il_w4_sit_basic_allowances=1.0,
- il_w4_sit_additional_allowances=1.0,
- schedule_pay='monthly')
-
- self._log('2019 Illinois 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.IL_UNEMP_MAX_WAGE * self.IL_UNEMP)
- self.assertPayrollEqual(cats['EE_US_SIT'], wh_to_test)
diff --git a/l10n_us_hr_payroll/tests/test_us_il_illinois_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_il_illinois_payslip_2021.py
new file mode 100644
index 00000000..4f62cb5e
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_il_illinois_payslip_2021.py
@@ -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 TestUsILPayslip(TestUsPayslip):
+ # Taxes and Rates
+ IL_UNEMP_MAX_WAGE = 12960.0
+ IL_UNEMP = 3.175
+
+ def _test_sit(self, wage, additional_withholding, basic_allowances, additional_allowances, schedule_pay, date_start, expected_withholding):
+
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ state_id=self.get_us_state('IL'),
+ state_income_tax_additional_withholding=additional_withholding,
+ il_w4_sit_basic_allowances=basic_allowances,
+ il_w4_sit_additional_allowances=additional_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_2021_taxes_example(self):
+ self._test_er_suta('IL', self.IL_UNEMP, date(2021, 1, 1), wage_base=self.IL_UNEMP_MAX_WAGE, relaxed=True)
+ self._test_sit(800.0, 0.0, 2, 2, 'weekly', date(2021, 1, 1), 33.17)
+ self._test_sit(800.0, 10.0, 2, 2, 'weekly', date(2021, 1, 1), 43.17)
+ self._test_sit(2500.0, 0.0, 1, 1, 'monthly', date(2021, 1, 1), 109.83)
+ self._test_sit(2500.0, 0.0, 0, 0, 'monthly', date(2021, 1, 1), 123.75)
+ self._test_sit(3000.0, 15.0, 0, 0, 'quarterly', date(2021, 1, 1), 163.50)
+
diff --git a/l10n_us_hr_payroll/tests/test_us_in_indiana_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_in_indiana_payslip_2021.py
new file mode 100755
index 00000000..53b7ddf3
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_in_indiana_payslip_2021.py
@@ -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 TestUsINPayslip(TestUsPayslip):
+ ###
+ # 2020 Taxes and Rates
+ ###
+ IN_UNEMP_MAX_WAGE = 9500.0
+ IN_UNEMP = 2.5
+ # Calculation based on https://www.in.gov/dor/files/dn01.pdf
+
+ def _test_sit(self, wage, additional_withholding, personal_exemption, dependent_exemption, schedule_pay, date_start, expected_withholding):
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ state_id=self.get_us_state('IN'),
+ state_income_tax_additional_withholding=additional_withholding,
+ in_w4_sit_personal_exemption=personal_exemption,
+ in_w4_sit_dependent_exemption=dependent_exemption,
+ 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('IN', self.IN_UNEMP, date(2020, 1, 1), wage_base=self.IN_UNEMP_MAX_WAGE)
+ self._test_sit(800.0, 0.0, 5.0, 3.0, 'weekly', date(2020, 1, 1), 19.94)
+ self._test_sit(800.0, 10.0, 5.0, 3.0, 'weekly', date(2020, 1, 1), 29.94)
+ self._test_sit(9000.0, 0.0, 4.0, 3.0, 'monthly', date(2020, 1, 1), 267.82)
+ self._test_sit(10000.0, 0.0, 2.0, 2.0, 'bi-weekly', date(2020, 1, 1), 316.79)
diff --git a/l10n_us_hr_payroll/tests/test_us_ks_kansas_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_ks_kansas_payslip_2021.py
new file mode 100755
index 00000000..fba4c2f5
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_ks_kansas_payslip_2021.py
@@ -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 TestUsKSPayslip(TestUsPayslip):
+ ###
+ # 2021 Taxes and Rates
+ ###
+ KS_UNEMP_MAX_WAGE = 14000.0
+ KS_UNEMP = 2.7
+ # Calculation based on example https://revenue.ky.gov/Forms/42A003(T)%20(12-2019)%202120%20Tax%20Tables.pdf
+
+ def _test_sit(self, wage, filing_status, allowances, additional_withholding, schedule_pay, date_start, expected_withholding):
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ state_id=self.get_us_state('KS'),
+ ks_k4_sit_filing_status=filing_status,
+ ks_k4_sit_allowances=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._log('Computed period tax: ' + str(expected_withholding))
+ self.assertPayrollAlmostEqual(cats.get('EE_US_SIT', 0.0), -expected_withholding)
+
+ def test_2021_taxes_example(self):
+ self._test_er_suta('KS', self.KS_UNEMP, date(2021, 1, 1), wage_base=self.KS_UNEMP_MAX_WAGE)
+ self._test_sit(6250, 'married', 2, 0, 'semi-monthly', date(2021, 1, 1), 290.00)
+ self._test_sit(5000, 'single', 1, 0, 'monthly', date(2021, 1, 1), 222.00)
+ self._test_sit(1500, 'married', 0, 0, 'bi-weekly', date(2021, 1, 1), 39.00)
+ self._test_sit(750, 'single', 2, 10, 'weekly', date(2021, 1, 1), 36.00)
diff --git a/l10n_us_hr_payroll/tests/test_us_ky_kentucky_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_ky_kentucky_payslip_2021.py
new file mode 100755
index 00000000..d05add23
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_ky_kentucky_payslip_2021.py
@@ -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 TestUsKYPayslip(TestUsPayslip):
+ ###
+ # 2021 Taxes and Rates
+ ###
+ KY_UNEMP_MAX_WAGE = 11100.0
+ KY_UNEMP = 2.7
+ # Calculation based on example https://revenue.ky.gov/Forms/42A003(T)%20(12-2019)%202120%20Tax%20Tables.pdf
+
+ def _test_sit(self, wage, additional_withholding, schedule_pay, date_start, expected_withholding):
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ state_id=self.get_us_state('KY'),
+ 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_2021_taxes_example(self):
+ self._test_er_suta('KY', self.KY_UNEMP, date(2021, 1, 1), wage_base=self.KY_UNEMP_MAX_WAGE)
+ # page 8 of https://revenue.ky.gov/Software-Developer/Software%20Development%20Documents/2021%20Withholding%20Tax%20Tables%20-%20Computer%20Formual%2042A003(T)(12-20)(10-15-20%20DRAFT).pdf
+ self._test_sit(3020, 0.0, 'monthly', date(2021, 1, 1), 139.79)
+ self._test_sit(1500, 0.0, 'bi-weekly', date(2021, 1, 1), 69.83)
+ self._test_sit(1500, 10.0, 'bi-weekly', date(2021, 1, 1), 79.83)
+ self._test_sit(750, 00.0, 'weekly', date(2021, 1, 1), 34.91)
+ self._test_sit(7000, 0.0, 'semi-monthly', date(2021, 1, 1), 344.39)
diff --git a/l10n_us_hr_payroll/tests/test_us_la_louisiana_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_la_louisiana_payslip_2019.py
deleted file mode 100644
index 1d01c618..00000000
--- a/l10n_us_hr_payroll/tests/test_us_la_louisiana_payslip_2019.py
+++ /dev/null
@@ -1,91 +0,0 @@
-# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
-
-from .common import TestUsPayslip, process_payslip
-
-
-class TestUsLAPayslip(TestUsPayslip):
-
- # TAXES AND RATES
- LA_UNEMP_MAX_WAGE = 7700.00
- LA_UNEMP = -(1.14 / 100.0)
-
- def test_taxes_single_weekly(self):
- salary = 700.00
- schedule_pay = 'weekly'
- filing_status = 'single'
- exemptions = 1
- dependents = 2
- additional_withholding = 0
- # SEE http://revenue.louisiana.gov/TaxForms/1306(1_12)TF.pdf for example calculations
- # wh_to test is 19.42
- # Our algorithm correctly rounds whereas theirs does it prematurely.
- wh_to_check = -19.43
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('LA'),
- la_l4_sit_filing_status=filing_status,
- state_income_tax_additional_withholding=additional_withholding,
- la_l4_sit_exemptions=exemptions,
- la_l4_sit_dependents=dependents,
- schedule_pay=schedule_pay)
-
- self._log('2019 Louisiana 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.LA_UNEMP)
- self.assertPayrollEqual(cats['EE_US_SIT'], wh_to_check)
-
- process_payslip(payslip)
-
- remaining_la_unemp_wages = self.LA_UNEMP_MAX_WAGE - salary if (self.LA_UNEMP_MAX_WAGE - 2*salary < salary) \
- else salary
-
- self._log('2019 Louisiana 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_la_unemp_wages * self.LA_UNEMP)
-
- def test_taxes_married_biweekly(self):
- salary = 4600.00
- schedule_pay = 'bi-weekly'
- filing_status = 'married'
- exemptions = 2
- dependents = 3
- additional_withholding = 0
- # SEE http://revenue.louisiana.gov/TaxForms/1306(1_12)TF.pdf for example calculations
- # wh_to test is 157.12
- wh_to_check = -157.12
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('LA'),
- la_l4_sit_filing_status=filing_status,
- state_income_tax_additional_withholding=additional_withholding,
- la_l4_sit_exemptions=exemptions,
- la_l4_sit_dependents=dependents,
- schedule_pay=schedule_pay)
-
- self._log('2019 Louisiana tax first payslip bi-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.LA_UNEMP)
- self.assertPayrollEqual(cats['EE_US_SIT'], wh_to_check)
-
- process_payslip(payslip)
-
- remaining_la_unemp_wages = self.LA_UNEMP_MAX_WAGE - salary if (self.LA_UNEMP_MAX_WAGE - 2*salary < salary) \
- else salary
-
- self._log('2019 Louisiana tax second payslip bi-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_la_unemp_wages * self.LA_UNEMP)
diff --git a/l10n_us_hr_payroll/tests/test_us_la_louisiana_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_la_louisiana_payslip_2021.py
new file mode 100755
index 00000000..d23c3ab3
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_la_louisiana_payslip_2021.py
@@ -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 TestUsLAPayslip(TestUsPayslip):
+ ###
+ # 2020 Taxes and Rates
+ ###
+ LA_UNEMP_MAX_WAGE = 7700.0
+ LA_UNEMP = 1.14
+ # Calculation based on http://revenue.louisiana.gov/TaxForms/1306(1_12)TF.pdf
+
+ def _test_sit(self, wage, filing_status, additional_withholding, exemptions, dependents, schedule_pay, date_start, expected_withholding):
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ state_id=self.get_us_state('LA'),
+ la_l4_sit_filing_status=filing_status,
+ state_income_tax_additional_withholding=additional_withholding,
+ la_l4_sit_exemptions=exemptions,
+ la_l4_sit_dependents=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.assertPayrollAlmostEqual(cats.get('EE_US_SIT', 0.0), -expected_withholding)
+
+ def test_2020_taxes_example(self):
+ self._test_er_suta('LA', self.LA_UNEMP, date(2020, 1, 1), wage_base=self.LA_UNEMP_MAX_WAGE)
+ self._test_sit(700.0, 'single', 0.0, 1.0, 2.0, 'weekly', date(2020, 1, 1), 19.43)
+ self._test_sit(4600.0, 'married', 0.0, 2.0, 3.0, 'bi-weekly', date(2020, 1, 1), 157.12)
+ self._test_sit(6000.0, 'single', 10.0, 2.0, 3.0, 'monthly', date(2020, 1, 1), 219.08)
diff --git a/l10n_us_hr_payroll/tests/test_us_me_maine_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_me_maine_payslip_2021.py
new file mode 100644
index 00000000..2324b278
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_me_maine_payslip_2021.py
@@ -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 TestUsMEPayslip(TestUsPayslip):
+ ###
+ # 2021 Taxes and Rates
+ ###
+ ME_UNEMP_MAX_WAGE = 12000.0
+ ME_UNEMP = 2.31
+ # Calculation based on this file page.6 and 7 https://www.maine.gov/revenue/forms/with/2021/20_WH_Tab&Instructions.pdf
+
+ def _test_sit(self, wage, filing_status, additional_withholding, exempt, allowances, schedule_pay, date_start, expected_withholding):
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ state_id=self.get_us_state('ME'),
+ me_w4me_sit_filing_status=filing_status,
+ state_income_tax_additional_withholding=additional_withholding,
+ state_income_tax_exempt=exempt,
+ me_w4me_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.assertPayrollAlmostEqual(cats.get('EE_US_SIT', 0.0), -expected_withholding)
+
+ def test_2021_taxes_example(self):
+ # todo: not calculating correctly according to https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/21_wh_tab_instr_1.pdf
+ # See examples on page 7
+
+ self._test_er_suta('ME', self.ME_UNEMP, date(2021, 1, 1), wage_base=self.ME_UNEMP_MAX_WAGE)
+ self._test_sit(300.0, 'single', 0.0, False, 2, 'weekly', date(2021, 1, 1), 0.0)
+ self._test_sit(1800.0, 'single', 0.0, False, 2, 'bi-weekly', date(2021, 1, 1), 6.00)
+ self._test_sit(4500.0, 'married', 0.0, True, 0, 'weekly', date(2021, 1, 1), 0.00)
+ self._test_sit(4500.0, 'married', 0.0, False, 2, 'monthly', date(2021, 1, 1), 113.00)
+ self._test_sit(4500.0, 'married', 10.0, False, 2, 'weekly', date(2021, 1, 1), 287.00)
+ self._test_sit(7000.0, '', 10.0, False, 2, 'weekly', date(2021, 1, 1), 0.00)
diff --git a/l10n_us_hr_payroll/tests/test_us_mi_michigan_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_mi_michigan_payslip_2019.py
deleted file mode 100755
index b12baed2..00000000
--- a/l10n_us_hr_payroll/tests/test_us_mi_michigan_payslip_2019.py
+++ /dev/null
@@ -1,194 +0,0 @@
-# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
-
-from .common import TestUsPayslip, process_payslip
-
-
-class TestUsMIPayslip(TestUsPayslip):
- # Taxes and Rates
- MI_UNEMP_MAX_WAGE = 9500.0
- MI_UNEMP = - 2.7 / 100.0
- MI_INC_TAX = - 4.25 / 100.0
- ANNUAL_EXEMPTION_AMOUNT = 4400.00
- PAY_PERIOD_DIVISOR = {
- 'weekly': 52.0,
- 'bi-weekly': 26.0,
- 'semi-monthly': 24.0,
- 'monthly': 12.0
- }
-
- def test_2019_taxes_weekly(self):
- salary = 5000.0
- schedule_pay = 'weekly'
- exemptions = 1
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('MI'),
- state_income_tax_additional_withholding=0.0,
- mi_w4_sit_exemptions=1.0,
- schedule_pay='weekly')
-
- allowance_amount = self.ANNUAL_EXEMPTION_AMOUNT / self.PAY_PERIOD_DIVISOR[schedule_pay]
- wh = -((salary - (allowance_amount * exemptions)) * -self.MI_INC_TAX)
-
- self._log('2019 Michigan 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.MI_UNEMP)
- self.assertPayrollAlmostEqual(cats['EE_US_SIT'], wh)
- #
- process_payslip(payslip)
-
- # Make a new payslip, this one will have maximums
- remaining_MI_UNEMP_wages = self.MI_UNEMP_MAX_WAGE - salary if (self.MI_UNEMP_MAX_WAGE - 2*salary < salary) \
- else salary
-
- self._log('2019 Michigan 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_MI_UNEMP_wages * self.MI_UNEMP)
-
- def test_2019_taxes_biweekly(self):
- salary = 5000.0
- schedule_pay = 'bi-weekly'
- allowance_amount = self.ANNUAL_EXEMPTION_AMOUNT / self.PAY_PERIOD_DIVISOR[schedule_pay]
- exemption = 2
-
- wh = -((salary - (allowance_amount * exemption)) * -self.MI_INC_TAX)
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('MI'),
- state_income_tax_additional_withholding=0.0,
- mi_w4_sit_exemptions=2.0,
- schedule_pay='bi-weekly')
-
- self._log('2019 Michigan tax first payslip bi-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.MI_UNEMP)
- self.assertPayrollEqual(cats['EE_US_SIT'], wh)
-
- process_payslip(payslip)
-
- # Make a new payslip, this one will have maximums
- remaining_MI_UNEMP_wages = self.MI_UNEMP_MAX_WAGE - salary if (self.MI_UNEMP_MAX_WAGE - 2*salary < salary) \
- else salary
-
- self._log('2019 Michigan tax second payslip bi-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_MI_UNEMP_wages * self.MI_UNEMP)
-
- def test_2019_taxes_semimonthly(self):
- salary = 5000.0
- schedule_pay = 'semi-monthly'
- allowance_amount = self.ANNUAL_EXEMPTION_AMOUNT / self.PAY_PERIOD_DIVISOR[schedule_pay]
- exemption = 1
-
- wh = -((salary - (allowance_amount * exemption)) * -self.MI_INC_TAX)
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('MI'),
- state_income_tax_additional_withholding=0.0,
- mi_w4_sit_exemptions=1.0,
- schedule_pay='semi-monthly')
-
- self._log('2019 Michigan tax first payslip semi-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.MI_UNEMP)
- self.assertPayrollEqual(cats['EE_US_SIT'], wh)
-
- process_payslip(payslip)
-
- # Make a new payslip, this one will have maximums
- remaining_MI_UNEMP_wages = self.MI_UNEMP_MAX_WAGE - salary if (self.MI_UNEMP_MAX_WAGE - 2 * salary < salary) \
- else salary
-
- self._log('2019 Michigan tax second payslip semi-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_MI_UNEMP_wages * self.MI_UNEMP)
-
- def test_2019_taxes_monthly(self):
- salary = 5000.0
- schedule_pay = 'monthly'
- allowance_amount = self.ANNUAL_EXEMPTION_AMOUNT / self.PAY_PERIOD_DIVISOR[schedule_pay]
- exemption = 1
-
- wh = -((salary - (allowance_amount * exemption)) * -self.MI_INC_TAX)
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('MI'),
- state_income_tax_additional_withholding=0.0,
- mi_w4_sit_exemptions=1.0,
- schedule_pay='monthly')
-
- self._log('2019 Michigan 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.MI_UNEMP)
- self.assertPayrollEqual(cats['EE_US_SIT'], wh)
-
- process_payslip(payslip)
-
- # Make a new payslip, this one will have maximums
- remaining_MI_UNEMP_wages = self.MI_UNEMP_MAX_WAGE - salary if (
- self.MI_UNEMP_MAX_WAGE - (2 * salary) < salary) \
- else salary
-
- self._log('2019 Michigan 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_MI_UNEMP_wages * self.MI_UNEMP)
-
- def test_additional_withholding(self):
- salary = 5000.0
- schedule_pay = 'weekly'
- allowance_amount = 0.0
- allowance_amount = self.ANNUAL_EXEMPTION_AMOUNT / self.PAY_PERIOD_DIVISOR[schedule_pay]
- additional_wh = 40.0
- exemption = 1
-
- wh = -(((salary - (allowance_amount * exemption)) * -self.MI_INC_TAX) + additional_wh)
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('MI'),
- state_income_tax_additional_withholding=40.0,
- mi_w4_sit_exemptions=1.0,
- schedule_pay='weekly')
-
- self._log('2019 Michigan tax first payslip with additional withholding:')
- 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.MI_UNEMP)
- self.assertPayrollAlmostEqual(cats['EE_US_SIT'], wh)
-
- process_payslip(payslip)
diff --git a/l10n_us_hr_payroll/tests/test_us_mi_michigan_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_mi_michigan_payslip_2021.py
new file mode 100755
index 00000000..690749f8
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_mi_michigan_payslip_2021.py
@@ -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 TestUsMIPayslip(TestUsPayslip):
+ # Taxes and Rates
+ MI_UNEMP_MAX_WAGE = 9500.0
+ MI_UNEMP = 2.7
+
+ def _test_sit(self, wage, exemptions, additional_withholding, schedule_pay, date_start, expected_withholding):
+
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ state_id=self.get_us_state('MI'),
+ mi_w4_sit_exemptions=exemptions,
+ 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_2021_taxes_example(self):
+ self._test_er_suta('MI', self.MI_UNEMP, date(2021, 1, 1), wage_base=self.MI_UNEMP_MAX_WAGE)
+ self._test_sit(750.0, 1, 100.0, 'weekly', date(2021, 1, 1), 127.87)
+ self._test_sit(1750.0, 1, 0.0, 'bi-weekly', date(2021, 1, 1), 66.37)
+ self._test_sit(5000.0, 1, 5.0, 'semi-monthly', date(2021, 1, 1), 208.83)
+ self._test_sit(8000.0, 1, 5.0, 'monthly', date(2021, 1, 1), 327.65)
+ self._test_sit(5000.0, 2, 0.0, 'monthly', date(2021, 1, 1), 177.79)
+
diff --git a/l10n_us_hr_payroll/tests/test_us_mn_minnesota_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_mn_minnesota_payslip_2019.py
deleted file mode 100755
index 2a64b57d..00000000
--- a/l10n_us_hr_payroll/tests/test_us_mn_minnesota_payslip_2019.py
+++ /dev/null
@@ -1,159 +0,0 @@
-# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
-
-from .common import TestUsPayslip, process_payslip
-
-
-class TestUsMNPayslip(TestUsPayslip):
- # TAXES AND RATES
- MN_UNEMP_MAX_WAGE = 34000.0
- MN_UNEMP = -1.11 / 100.0
-
- def test_taxes_weekly(self):
- salary = 30000.0
- # Hand Calculated Amount to Test
- # Step 1 -> 30000.00 for wages per period Step 2 -> 52.0 for weekly -> 30000 * 52 -> 1560000
- # Step 3 -> allowances * 4250.0 -> 4250.00 in this case.
- # Step 4 -> Step 2 - Step 3 -> 1560000 - 4250.00 -> 1555750
- # Step 5 -> using chart -> we have last row -> ((1555750 - 166290) * (9.85 / 100)) + 11717.65 -> 148579.46
- # Step 6 -> Convert back to pay period amount and round - > 2857.297 - > 2857.0
- # wh = 2857.0
- wh = -2857.0
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('MN'),
- mn_w4mn_sit_filing_status='single',
- state_income_tax_additional_withholding=0.0,
- mn_w4mn_sit_allowances=1.0,
- schedule_pay='weekly')
-
- self._log('2019 Minnesota 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.MN_UNEMP)
- self.assertPayrollAlmostEqual(cats['EE_US_SIT'], wh) # Test numbers are off by 1 penny
-
- process_payslip(payslip)
-
- # Make a new payslip, this one will have maximums
- remaining_MN_UNEMP_wages = self.MN_UNEMP_MAX_WAGE - salary if (self.MN_UNEMP_MAX_WAGE - 2*salary < salary) \
- else salary
-
- self._log('2019 Minnesota 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_MN_UNEMP_wages * self.MN_UNEMP)
-
- def test_taxes_married(self):
- salary = 5000.00
-
- # Hand Calculated Amount to Test
- # Step 1 -> 5000.0 for wages per period Step 2 -> 52.0 for weekly -> 5000 * 52 -> 260,000
- # Step 3 -> allowances * 4250.0 -> 4250.00 in this case.
- # Step 4 -> Step 2 - Step 3 -> 260,000 - 4250.00 -> 255750.0
- # For step five we used the married section
- # Step 5 -> using chart -> we have 2nd last row -> ((255750 - 163070) * (7.85 / 100)) + 10199.33 ->
- # Step 6 -> Convert back to pay period amount and round
- # wh = 336.0
- wh = -336.0
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('MN'),
- mn_w4mn_sit_filing_status='married',
- state_income_tax_additional_withholding=0.0,
- mn_w4mn_sit_allowances=1.0,
- schedule_pay='weekly')
-
- self._log('2019 Minnesota tax first payslip married:')
- 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.MN_UNEMP)
- self.assertPayrollAlmostEqual(cats['EE_US_SIT'], wh)
-
- def test_taxes_semimonthly(self):
- salary = 6500.00
- # Hand Calculated Amount to Test
- # Step 1 -> 6500.00 for wages per period Step 2 -> 24 for semi-monthly -> 6500.00 * 24 -> 156000.00
- # Step 3 -> allowances * 4250.0 -> 4250.00 in this case.
- # Step 4 -> Step 2 - Step 3 -> 156000.00 - 4250.00 -> 151750.0
- # Step 5 -> using chart -> we have 2nd last row -> ((151750.0- 89510) * (7.85 / 100)) + 5690.42 -> 10576.26
- # Step 6 -> Convert back to pay period amount and round
- # wh = -441
- wh = -441.00
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('MN'),
- mn_w4mn_sit_filing_status='single',
- state_income_tax_additional_withholding=0.0,
- mn_w4mn_sit_allowances=1.0,
- schedule_pay='semi-monthly')
-
-
- self._log('2019 Minnesota tax first payslip semimonthly:')
- 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.MN_UNEMP)
- self.assertPayrollAlmostEqual(cats['EE_US_SIT'], wh)
-
- def test_tax_exempt(self):
- salary = 5500.00
- wh = 0
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('MN'),
- mn_w4mn_sit_filing_status='',
- state_income_tax_additional_withholding=0.0,
- mn_w4mn_sit_allowances=2.0,
- schedule_pay='weekly')
-
- self._log('2019 Minnesota 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.MN_UNEMP)
- self.assertPayrollAlmostEqual(cats['EE_US_SIT'], wh)
-
- def test_additional_withholding(self):
- salary = 5500.0
- # Hand Calculated Amount to Test
- # Step 1 -> 5500 for wages per period Step 2 -> 52 for weekly -> 5500 * 52 -> 286000.00
- # Step 3 -> allowances * 4250.0 -> 8500 in this case.
- # Step 4 -> Step 2 - Step 3 -> 286000.00 - 8500 -> 277500
- # Step 5 -> using chart -> we have last row -> ((277500- 166290) * (9.85 / 100)) + 11717.65 -> 22671.835
- # Step 6 -> Convert back to pay period amount and round
- # wh = -436.0
- # Add additional_withholding
- # wh = -436.0 + 40.0
- wh = -476.0
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('MN'),
- mn_w4mn_sit_filing_status='single',
- state_income_tax_additional_withholding=40.0,
- mn_w4mn_sit_allowances=2.0,
- schedule_pay='weekly')
-
- self._log('2019 Minnesota 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['ER_US_SUTA'], salary * self.MN_UNEMP)
- self.assertPayrollAlmostEqual(cats['EE_US_SIT'], wh)
diff --git a/l10n_us_hr_payroll/tests/test_us_mn_minnesota_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_mn_minnesota_payslip_2021.py
new file mode 100755
index 00000000..dbae6ddd
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_mn_minnesota_payslip_2021.py
@@ -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 TestUsMNPayslip(TestUsPayslip):
+ # TAXES AND RATES
+ MN_UNEMP_MAX_WAGE = 35000.0
+ MN_UNEMP = 1.11
+
+ def _test_sit(self, wage, filing_status, allowances, additional_withholding, schedule_pay, date_start, expected_withholding):
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ state_id=self.get_us_state('MN'),
+ mn_w4mn_sit_filing_status=filing_status,
+ state_income_tax_additional_withholding=additional_withholding,
+ mn_w4mn_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_2021_taxes_example(self):
+ self._test_er_suta('MN', self.MN_UNEMP, date(2021, 1, 1), wage_base=self.MN_UNEMP_MAX_WAGE)
+ self._test_sit(5000.0, 'single', 1.0, 0.0, 'weekly', date(2021, 1, 1), 388.0)
+ self._test_sit(30000.0, 'single', 1.0, 0.0, 'weekly', date(2021, 1, 1), 2850.0)
+ self._test_sit(5000.0, 'married', 1.0, 0.0, 'weekly', date(2021, 1, 1), 325.0)
+ self._test_sit(6500.0, 'single', 1.0, 0.0, 'semi-monthly', date(2021, 1, 1), 428.0)
+ self._test_sit(5500.0, '', 2.0, 0.0, 'weekly', date(2021, 1, 1), 0.0)
+ self._test_sit(5500.0, 'single', 2.0, 40.0, 'weekly', date(2021, 1, 1), 469.0)
diff --git a/l10n_us_hr_payroll/tests/test_us_mo_missouri_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_mo_missouri_payslip_2019.py
deleted file mode 100755
index 27a0ad93..00000000
--- a/l10n_us_hr_payroll/tests/test_us_mo_missouri_payslip_2019.py
+++ /dev/null
@@ -1,188 +0,0 @@
-
-from datetime import date
-from .common import TestUsPayslip
-
-
-class TestUsMoPayslip(TestUsPayslip):
- # Calculations from http://dor.mo.gov/forms/4282_2019.pdf
- SALARY = 12000.0
- MO_UNEMP = -2.376 / 100.0
-
- TAX = [
- (1053.0, 1.5),
- (1053.0, 2.0),
- (1053.0, 2.5),
- (1053.0, 3.0),
- (1053.0, 3.5),
- (1053.0, 4.0),
- (1053.0, 4.5),
- (1053.0, 5.0),
- (999999999.0, 5.4),
- ]
-
- def test_2019_taxes_single(self):
- # Payroll Period Monthly
- salary = self.SALARY
- pp = 12.0
- gross_salary = salary * pp
- spouse_employed = False
-
- # Single
- standard_deduction = 12400.0
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('MO'),
- mo_mow4_sit_filing_status='single',
- state_income_tax_additional_withholding=0.0,
- schedule_pay='monthly')
-
- self._log('2019 Missouri tax single 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.MO_UNEMP)
-
- mo_taxable_income = gross_salary - standard_deduction
- self._log('%s = %s - %s -' % (mo_taxable_income, gross_salary, standard_deduction))
-
- remaining_taxable_income = mo_taxable_income
- tax = 0.0
- for amt, rate in self.TAX:
- amt = float(amt)
- rate = rate / 100.0
- self._log(str(amt) + ' : ' + str(rate) + ' : ' + str(remaining_taxable_income))
- if (remaining_taxable_income - amt) > 0.0 or (remaining_taxable_income - amt) == 0.0:
- tax += rate * amt
- else:
- tax += rate * remaining_taxable_income
- break
- remaining_taxable_income = remaining_taxable_income - amt
-
- tax = -tax
- self._log('Computed annual tax: ' + str(tax))
-
- tax = tax / pp
- tax = round(tax)
- self._log('Computed period tax: ' + str(tax))
- self.assertPayrollEqual(cats['EE_US_SIT'], tax)
-
- def test_2019_spouse_not_employed(self):
- # Payroll Period Semi-monthly
- salary = self.SALARY
- pp = 24.0
- gross_salary = salary * pp
-
- # Married
- standard_deduction = 24800.0
-
- employee = self._createEmployee()
-
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('MO'),
- mo_mow4_sit_filing_status='married',
- state_income_tax_additional_withholding=0.0,
- schedule_pay='semi-monthly')
-
- self._log('2019 Missouri tax first payslip:')
- payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
-
- payslip.compute_sheet()
-
- cats = self._getCategories(payslip)
-
- mo_taxable_income = gross_salary - standard_deduction
- self._log(mo_taxable_income)
-
- remaining_taxable_income = mo_taxable_income
- tax = 0.0
- for amt, rate in self.TAX:
- amt = float(amt)
- rate = rate / 100.0
- self._log(str(amt) + ' : ' + str(rate) + ' : ' + str(remaining_taxable_income))
- if (remaining_taxable_income - amt) > 0.0 or (remaining_taxable_income - amt) == 0.0:
- tax += rate * amt
- else:
- tax += rate * remaining_taxable_income
- break
- remaining_taxable_income = remaining_taxable_income - amt
-
- tax = -tax
- self._log('Computed annual tax: ' + str(tax))
-
- tax = tax / pp
- tax = round(tax)
- self._log('Computed period tax: ' + str(tax))
- self.assertPayrollEqual(cats['EE_US_SIT'], tax)
-
- def test_2019_head_of_household(self):
- # Payroll Period Weekly
- salary = self.SALARY
-
- # Payroll Period Weekly
- salary = self.SALARY
- pp = 52.0
- gross_salary = salary * pp
-
- # Single HoH
- standard_deduction = 18650.0
-
- employee = self._createEmployee()
-
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('MO'),
- mo_mow4_sit_filing_status='head_of_household',
- state_income_tax_additional_withholding=0.0,
- schedule_pay='weekly')
-
- self._log('2019 Missouri tax first payslip:')
- payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
-
- payslip.compute_sheet()
-
- cats = self._getCategories(payslip)
-
- mo_taxable_income = gross_salary - standard_deduction
- self._log(mo_taxable_income)
-
- remaining_taxable_income = mo_taxable_income
- tax = 0.0
- for amt, rate in self.TAX:
- amt = float(amt)
- rate = rate / 100.0
- self._log(str(amt) + ' : ' + str(rate) + ' : ' + str(remaining_taxable_income))
- if (remaining_taxable_income - amt) > 0.0 or (remaining_taxable_income - amt) == 0.0:
- tax += rate * amt
- else:
- tax += rate * remaining_taxable_income
- break
- remaining_taxable_income = remaining_taxable_income - amt
- tax = -tax
- self._log('Computed annual tax: ' + str(tax))
-
- tax = tax / pp
- tax = round(tax)
- self._log('Computed period tax: ' + str(tax))
- self.assertPayrollEqual(cats['EE_US_SIT'], tax)
-
- def test_2019_underflow(self):
- # Payroll Period Weekly
- salary = 200.0
-
- employee = self._createEmployee()
-
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('MO'))
-
- payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
- payslip.compute_sheet()
- cats = self._getCategories(payslip)
-
- self.assertPayrollEqual(cats['EE_US_SIT'], 0.0)
diff --git a/l10n_us_hr_payroll/tests/test_us_mo_missouri_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_mo_missouri_payslip_2021.py
new file mode 100755
index 00000000..0824e2b9
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_mo_missouri_payslip_2021.py
@@ -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 TestUsMoPayslip(TestUsPayslip):
+ # Calculations from http://dor.mo.gov/forms/4282_2021.pdf
+ MO_UNEMP_MAX_WAGE = 11000.0
+ MO_UNEMP = 2.7
+
+ 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('MO'),
+ mo_mow4_sit_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.assertPayrollAlmostEqual(cats.get('EE_US_SIT', 0.0), -expected_withholding)
+
+ def test_2021_taxes_example(self):
+ self._test_er_suta('MO', self.MO_UNEMP, date(2021, 1, 1), wage_base=self.MO_UNEMP_MAX_WAGE)
+ self._test_sit(750.0, 'single', 0.0, 'weekly', date(2021, 1, 1), 24.00)
+ self._test_sit(2500.0, 'single', 5.0, 'bi-weekly', date(2021, 1, 1), 107.00)
+ self._test_sit(7000.0, 'married', 0.0, 'monthly', date(2021, 1, 1), 249.00)
+ self._test_sit(5000.0, 'married', 10.0, 'semi-monthly', date(2021, 1, 1), 216.00)
+ self._test_sit(6000.0, '', 0.0, 'monthly', date(2021, 1, 1), 0.00)
+
diff --git a/l10n_us_hr_payroll/tests/test_us_ms_mississippi_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_ms_mississippi_payslip_2019.py
deleted file mode 100755
index e7ce35d0..00000000
--- a/l10n_us_hr_payroll/tests/test_us_ms_mississippi_payslip_2019.py
+++ /dev/null
@@ -1,94 +0,0 @@
-# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
-
-from .common import TestUsPayslip
-
-
-class TestUsMsPayslip(TestUsPayslip):
- # Calculations from https://www.dor.ms.gov/Documents/Computer%20Payroll%20Accounting%201-2-19.pdf
- MS_UNEMP = -1.2 / 100.0
-
- def test_2019_taxes_one(self):
- salary = 1250.0
- ms_89_350_exemption = 11000.0
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('MS'),
- ms_89_350_sit_filing_status='head_of_household',
- ms_89_350_sit_exemption_value=ms_89_350_exemption,
- state_income_tax_additional_withholding=0.0,
- schedule_pay='semi-monthly')
-
- self._log('2019 Mississippi tax single 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.MS_UNEMP)
-
- STDED = 3400.0 # Head of Household
- AGP = salary * 24 # Semi-Monthly
- TI = AGP - (ms_89_350_exemption + STDED)
- self.assertPayrollEqual(TI, 15600.0)
- TAX = ((TI - 10000) * 0.05) + 290 # Over 10,000
- self.assertPayrollEqual(TAX, 570.0)
-
- ms_withhold = round(TAX / 24) # Semi-Monthly
- self.assertPayrollEqual(cats['EE_US_SIT'], -ms_withhold)
-
- def test_2019_taxes_one_exempt(self):
- salary = 1250.0
- ms_89_350_exemption = 11000.0
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('MS'),
- ms_89_350_sit_filing_status='',
- ms_89_350_sit_exemption_value=ms_89_350_exemption,
- state_income_tax_additional_withholding=0.0,
- schedule_pay='semi-monthly')
-
- self._log('2019 Mississippi tax single first payslip:')
- payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
-
- payslip.compute_sheet()
-
- cats = self._getCategories(payslip)
- self.assertPayrollEqual(cats.get('EE_US_SIT', 0.0), 0.0)
-
- def test_2019_taxes_additional(self):
- salary = 1250.0
- ms_89_350_exemption = 11000.0
- additional = 40.0
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('MS'),
- ms_89_350_sit_filing_status='head_of_household',
- ms_89_350_sit_exemption_value=ms_89_350_exemption,
- state_income_tax_additional_withholding=additional,
- schedule_pay='semi-monthly')
-
- self._log('2019 Mississippi tax single 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.MS_UNEMP)
-
- STDED = 3400.0 # Head of Household
- AGP = salary * 24 # Semi-Monthly
- TI = AGP - (ms_89_350_exemption + STDED)
- self.assertPayrollEqual(TI, 15600.0)
- TAX = ((TI - 10000) * 0.05) + 290 # Over 10,000
- self.assertPayrollEqual(TAX, 570.0)
-
- ms_withhold = round(TAX / 24) # Semi-Monthly
- self.assertPayrollEqual(cats['EE_US_SIT'], -ms_withhold + -additional)
diff --git a/l10n_us_hr_payroll/tests/test_us_ms_mississippi_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_ms_mississippi_payslip_2021.py
new file mode 100755
index 00000000..d59bded9
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_ms_mississippi_payslip_2021.py
@@ -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 TestUsMsPayslip(TestUsPayslip):
+ # Calculations from https://www.dor.ms.gov/Documents/Computer%20Payroll%20Flowchart.pdf
+ MS_UNEMP = 1.0
+ MS_UNEMP_MAX_WAGE = 14000.0
+
+ def _test_sit(self, wage, filing_status, additional_withholding, exemption, schedule_pay, date_start, expected_withholding):
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ state_id=self.get_us_state('MS'),
+ ms_89_350_sit_filing_status=filing_status,
+ state_income_tax_additional_withholding=additional_withholding,
+ ms_89_350_sit_exemption_value=exemption,
+ 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.assertPayrollAlmostEqual(cats.get('EE_US_SIT', 0.0), -expected_withholding)
+
+ def test_2021_taxes_example(self):
+ self._test_er_suta('MS', self.MS_UNEMP, date(2021, 1, 1), wage_base=self.MS_UNEMP_MAX_WAGE)
+ self._test_sit(1250.0, 'head_of_household', 0.0, 11000, 'semi-monthly', date(2021, 1, 1), 21.00)
+ self._test_sit(500.0, '', 5.0, 0, 'bi-weekly', date(2021, 1, 1), 0.00)
+ self._test_sit(12000.0, 'single', 0.0, 11000, 'monthly', date(2021, 1, 1), 522.00)
+ self._test_sit(2500.0, 'married', 5.0, 500, 'bi-weekly', date(2021, 1, 1), 110.00)
+
+
diff --git a/l10n_us_hr_payroll/tests/test_us_mt_montana_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_mt_montana_payslip_2019.py
deleted file mode 100755
index ff6e2daf..00000000
--- a/l10n_us_hr_payroll/tests/test_us_mt_montana_payslip_2019.py
+++ /dev/null
@@ -1,139 +0,0 @@
-# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
-
-from .common import TestUsPayslip, process_payslip
-
-
-class TestUsMtPayslip(TestUsPayslip):
- # Calculations from https://app.mt.gov/myrevenue/Endpoint/DownloadPdf?yearId=705
- MT_UNEMP = -1.18 / 100.0
- MT_UNEMP_AFT = -0.13 / 100.0
-
- def test_2019_taxes_one(self):
- # Payroll Period Semi-Monthly example
- salary = 550
- mt_mw4_exemptions = 5
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('MT'),
- mt_mw4_sit_exemptions=mt_mw4_exemptions,
- schedule_pay='semi-monthly')
-
- self._log('2019 Montana tax single 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.MT_UNEMP + self.MT_UNEMP_AFT)) # New non-combined...
-
- mt_taxable_income = salary - (79.0 * mt_mw4_exemptions)
- mt_withhold = round(0 + (0.018 * (mt_taxable_income - 0)))
- self.assertPayrollEqual(mt_taxable_income, 155.0)
- self.assertPayrollEqual(mt_withhold, 3.0)
- self.assertPayrollEqual(cats['EE_US_SIT'], -mt_withhold)
-
- def test_2019_taxes_two(self):
- # Payroll Period Bi-Weekly example
- salary = 2950
- mt_mw4_exemptions = 2
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('MT'),
- mt_mw4_sit_exemptions=mt_mw4_exemptions,
- schedule_pay='bi-weekly')
-
- self._log('2019 Montana tax single 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'], round(salary * (self.MT_UNEMP + self.MT_UNEMP_AFT), 2))
-
- # Note!!
- # The example calculation uses A = 16 but the actual table describes this as A = 18
- mt_taxable_income = salary - (73.0 * mt_mw4_exemptions)
- mt_withhold = round(18 + (0.06 * (mt_taxable_income - 577)))
- self.assertPayrollEqual(mt_taxable_income, 2804.0)
- self.assertPayrollEqual(mt_withhold, 152.0)
- self.assertPayrollEqual(cats['EE_US_SIT'], -mt_withhold)
-
- def test_2019_taxes_three(self):
- # Payroll Period Weekly example
- salary = 135
- mt_mw4_exemptions = 1
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('MT'),
- mt_mw4_sit_exemptions=mt_mw4_exemptions,
- schedule_pay='weekly')
-
- self._log('2019 Montana tax single 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'], round(salary * (self.MT_UNEMP + self.MT_UNEMP_AFT), 2))
-
- mt_taxable_income = salary - (37.0 * mt_mw4_exemptions)
- mt_withhold = round(0 + (0.018 * (mt_taxable_income - 0)))
- self.assertPayrollEqual(mt_taxable_income, 98.0)
- self.assertPayrollEqual(mt_withhold, 2.0)
- self.assertPayrollEqual(cats['EE_US_SIT'], -mt_withhold)
-
- def test_2019_taxes_three_exempt(self):
- # Payroll Period Weekly example
- salary = 135
- mt_mw4_exemptions = 1
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('MT'),
- mt_mw4_sit_exemptions=mt_mw4_exemptions,
- mt_mw4_sit_exempt='reserve',
- schedule_pay='weekly')
-
- self._log('2019 Montana tax single first payslip:')
- payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
-
- payslip.compute_sheet()
-
- cats = self._getCategories(payslip)
- self.assertPayrollEqual(cats.get('EE_US_SIT', 0.0), 0.0)
-
- def test_2019_taxes_three_additional(self):
- # Payroll Period Weekly example
- salary = 135
- mt_mw4_exemptions = 1
- mt_mw4_additional_withholding = 20.0
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('MT'),
- mt_mw4_sit_exemptions=mt_mw4_exemptions,
- state_income_tax_additional_withholding=mt_mw4_additional_withholding,
- schedule_pay='weekly')
-
- self._log('2019 Montana tax single first payslip:')
- payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
-
- payslip.compute_sheet()
- cats = self._getCategories(payslip)
-
- mt_taxable_income = salary - (37.0 * mt_mw4_exemptions)
- mt_withhold = round(0 + (0.018 * (mt_taxable_income - 0)))
- self.assertPayrollEqual(mt_taxable_income, 98.0)
- self.assertPayrollEqual(mt_withhold, 2.0)
- self.assertPayrollEqual(cats['EE_US_SIT'], -mt_withhold + -mt_mw4_additional_withholding)
diff --git a/l10n_us_hr_payroll/tests/test_us_mt_montana_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_mt_montana_payslip_2021.py
new file mode 100755
index 00000000..755f6208
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_mt_montana_payslip_2021.py
@@ -0,0 +1,37 @@
+# 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 TestUsMtPayslip(TestUsPayslip):
+ ###
+ # 2021 Taxes and Rates
+ ###
+ MT_UNEMP_WAGE_MAX = 35300.0
+ MT_UNEMP = 1.18
+ MT_UNEMP_AFT = 0.13
+
+ # Calculations from https://app.mt.gov/myrevenue/Endpoint/DownloadPdf?yearId=705
+ def _test_sit(self, wage, additional_withholding, exemptions, schedule_pay, date_start, expected_withholding):
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ state_id=self.get_us_state('MT'),
+ state_income_tax_additional_withholding=additional_withholding,
+ mt_mw4_sit_exemptions=exemptions,
+ 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_2021_taxes_one(self):
+ combined_rate = self.MT_UNEMP + self.MT_UNEMP_AFT # Combined for test as they both go to the same category and have the same cap
+ self._test_er_suta('MT', combined_rate + .0001, date(2021, 1, 1), wage_base=self.MT_UNEMP_WAGE_MAX, relaxed=True)
+ self._test_sit(550.0, 0.0, 5.0, 'semi-monthly', date(2021, 1, 1), 3.0)
+ self._test_sit(2950.0, 10.0, 2.0, 'bi-weekly', date(2021, 1, 1), 162.0)
+ self._test_sit(5000.0, 0.0, 1.0, 'monthly', date(2021, 1, 1), 256.0)
+ self._test_sit(750.0, 0.0, 1.0, 'weekly', date(2021, 1, 1), 34.0)
diff --git a/l10n_us_hr_payroll/tests/test_us_nc_northcarolina_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_nc_northcarolina_payslip_2019.py
deleted file mode 100755
index 14c1c5b2..00000000
--- a/l10n_us_hr_payroll/tests/test_us_nc_northcarolina_payslip_2019.py
+++ /dev/null
@@ -1,270 +0,0 @@
-# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
-
-from .common import TestUsPayslip, process_payslip
-
-
-class TestUsNCPayslip(TestUsPayslip):
- ###
- # Taxes and Rates
- ###
- NC_UNEMP_MAX_WAGE = 24300.0
- NC_UNEMP = -1.0 / 100.0
- NC_INC_TAX = -0.0535
-
-
- def test_2019_taxes_weekly(self):
- salary = 20000.0
- # allowance_multiplier and Portion of Standard Deduction for weekly
- allowance_multiplier = 48.08
- PST = 192.31
- exemption = 1
- # Algorithm derived from percentage method in https://files.nc.gov/ncdor/documents/files/nc-30_book_web.pdf
- wh = -round((salary - (PST + (allowance_multiplier * exemption))) * -self.NC_INC_TAX)
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('NC'),
- nc_nc4_sit_filing_status='married',
- state_income_tax_additional_withholding=0.0,
- nc_nc4_sit_allowances=1.0,
- schedule_pay='weekly')
-
- self._log('2019 North Carolina 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_SIT'], wh)
-
- process_payslip(payslip)
-
- # Make a new payslip, this one will have maximums
-
- remaining_NC_UNEMP_wages = self.NC_UNEMP_MAX_WAGE - salary if (self.NC_UNEMP_MAX_WAGE - 2*salary < salary) \
- else salary
- self._log('2019 North Carolina 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_NC_UNEMP_wages * self.NC_UNEMP)
-
- def test_2019_taxes_with_external_weekly(self):
- salary = 5000.0
- schedule_pay = 'weekly'
-
- employee = self._createEmployee()
-
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('NC'),
- nc_nc4_sit_filing_status='married',
- state_income_tax_additional_withholding=0.0,
- nc_nc4_sit_allowances=1.0,
- schedule_pay='weekly')
-
- self._log('2019 NorthCarolina_external 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.NC_UNEMP)
-
- def test_2019_taxes_biweekly(self):
- salary = 5000.0
- schedule_pay = 'bi-weekly'
- # allowance_multiplier and Portion of Standard Deduction for weekly
- allowance_multiplier = 96.15
- PST = 384.62
-
- allowances = 2
- # Algorithm derived from percentage method in https://files.nc.gov/ncdor/documents/files/nc-30_book_web.pdf
-
- wh = -round((salary - (PST + (allowance_multiplier * allowances))) * -self.NC_INC_TAX)
-
- employee = self._createEmployee()
-
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('NC'),
- nc_nc4_sit_filing_status='married',
- state_income_tax_additional_withholding=0.0,
- nc_nc4_sit_allowances=2.0,
- schedule_pay='bi-weekly')
-
- self._log('2019 North Carolina tax first payslip bi-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.NC_UNEMP)
- self.assertPayrollEqual(cats['EE_US_SIT'], wh)
-
- process_payslip(payslip)
-
- # Make a new payslip, this one will have maximums
-
- remaining_NC_UNEMP_wages = self.NC_UNEMP_MAX_WAGE - salary if (self.NC_UNEMP_MAX_WAGE - 2*salary < salary) \
- else salary
-
- self._log('2019 North Carolina tax second payslip bi-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_NC_UNEMP_wages * self.NC_UNEMP)
-
- def test_2019_taxes_semimonthly(self):
- salary = 4000.0
- # allowance_multiplier and Portion of Standard Deduction for weekly
- allowance_multiplier = 104.17
- PST = 625.00
-
- allowances = 1
- # Algorithm derived from percentage method in https://files.nc.gov/ncdor/documents/files/nc-30_book_web.pdf
-
- wh = -round((salary - (PST + (allowance_multiplier * allowances))) * -self.NC_INC_TAX)
-
- employee = self._createEmployee()
-
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('NC'),
- nc_nc4_sit_filing_status='head_household',
- state_income_tax_additional_withholding=0.0,
- nc_nc4_sit_allowances=1.0,
- schedule_pay='semi-monthly')
-
- self._log('2019 North Carolina 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.NC_UNEMP)
- self.assertPayrollEqual(cats['EE_US_SIT'], wh)
-
- process_payslip(payslip)
-
- # Make a new payslip, this one will have maximums
-
- remaining_NC_UNEMP_wages = self.NC_UNEMP_MAX_WAGE - salary if (self.NC_UNEMP_MAX_WAGE - 2 * salary < salary) \
- else salary
-
- self._log('2019 North Carolina 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'], remaining_NC_UNEMP_wages * self.NC_UNEMP)
-
- def test_2019_taxes_monthly(self):
- salary = 4000.0
- schedule_pay = 'monthly'
- # allowance_multiplier and Portion of Standard Deduction for weekly
- allowance_multiplier = 208.33
- PST = 833.33
-
- allowances = 1
- # Algorithm derived from percentage method in https://files.nc.gov/ncdor/documents/files/nc-30_book_web.pdf
-
- wh = -round((salary - (PST + (allowance_multiplier * allowances))) * -self.NC_INC_TAX)
-
- employee = self._createEmployee()
-
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('NC'),
- nc_nc4_sit_filing_status='single',
- state_income_tax_additional_withholding=0.0,
- nc_nc4_sit_allowances=1.0,
- schedule_pay='monthly')
-
- self._log('2019 North Carolina 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.NC_UNEMP)
- self.assertPayrollEqual(cats['EE_US_SIT'], wh)
-
- process_payslip(payslip)
-
- # Make a new payslip, this one will have maximums
-
- remaining_NC_UNEMP_wages = self.NC_UNEMP_MAX_WAGE - salary if (
- self.NC_UNEMP_MAX_WAGE - 2 * salary < salary) \
- else salary
-
- self._log('2019 North Carolina 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'], remaining_NC_UNEMP_wages * self.NC_UNEMP)
-
- def test_additional_withholding(self):
- salary = 4000.0
- # allowance_multiplier and Portion of Standard Deduction for weekly
- allowance_multiplier = 48.08
- PST = 192.31
- additional_wh = 40.0
-
- #4000 - (168.27 + (48.08 * 1)
-
- allowances = 1
- # Algorithm derived from percentage method in https://files.nc.gov/ncdor/documents/files/nc-30_book_web.pdf
-
- wh = -round(((salary - (PST + (allowance_multiplier * allowances))) * -self.NC_INC_TAX) + additional_wh)
-
- employee = self._createEmployee()
-
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('NC'),
- nc_nc4_sit_filing_status='married',
- state_income_tax_additional_withholding=40.0,
- nc_nc4_sit_allowances=1.0,
- schedule_pay='weekly')
-
- self._log('2019 North Carolina 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_SIT'], wh)
-
- process_payslip(payslip)
-
- # Make a new payslip, this one will have maximums
-
- remaining_NC_UNEMP_wages = self.NC_UNEMP_MAX_WAGE - salary if (self.NC_UNEMP_MAX_WAGE - 2 * salary < salary) \
- else salary
-
- self._log('2019 North Carolina 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_NC_UNEMP_wages * self.NC_UNEMP)
diff --git a/l10n_us_hr_payroll/tests/test_us_nc_northcarolina_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_nc_northcarolina_payslip_2021.py
new file mode 100755
index 00000000..b8119f21
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_nc_northcarolina_payslip_2021.py
@@ -0,0 +1,39 @@
+# 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 TestUsNCPayslip(TestUsPayslip):
+ ###
+ # 2021 Taxes and Rates
+ ###
+ # Example based on https://files.nc.gov/ncdor/documents/files/2021-NC-30-Final.pdf page 19
+ NC_UNEMP_MAX_WAGE = 26000.0
+ NC_UNEMP = 1.0
+ # get NC_INC_TAX from 'Annualized Tax" line 8 in the example on page 19
+ NC_INC_TAX = 0.0535
+
+ def _test_sit(self, wage, filing_status, allowances, additional_withholding, schedule_pay, date_start, expected_withholding):
+
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ state_id=self.get_us_state('NC'),
+ nc_nc4_sit_filing_status=filing_status,
+ nc_nc4_sit_allowances=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._log('Computed period tax: ' + str(expected_withholding))
+ self.assertPayrollEqual(cats.get('EE_US_SIT', 0.0), -expected_withholding if filing_status else 0.0)
+
+ def test_2021_taxes_example(self):
+ self._test_er_suta('NC', self.NC_UNEMP, date(2021, 1, 1), wage_base=self.NC_UNEMP_MAX_WAGE)
+ self._test_sit(20000.0, 'single', 1, 100.0, 'weekly', date(2021, 1, 1), 1156.0)
+ self._test_sit(5000.0, 'married', 1, 0.0, 'weekly', date(2021, 1, 1), 254.0)
+ self._test_sit(4000.0, 'head_household', 1, 5.0, 'semi-monthly', date(2021, 1, 1), 177.0)
+ self._test_sit(7000.0, '', 1, 5.0, 'monthly', date(2021, 1, 1), 0.0)
diff --git a/l10n_us_hr_payroll/tests/test_us_nd_north_dakota_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_nd_north_dakota_payslip_2021.py
new file mode 100644
index 00000000..c4dfaeb5
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_nd_north_dakota_payslip_2021.py
@@ -0,0 +1,37 @@
+# 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 TestUsNDPayslip(TestUsPayslip):
+ ###
+ # 2021 Taxes and Rates
+ ###
+ ND_UNEMP_MAX_WAGE = 38500.0
+ ND_UNEMP = 1.02
+ # Calculation based on this file page.47 https://www.nd.gov/tax/data/upfiles/media/rates-and-instructions.pdf?20210110115917
+
+ 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('ND'),
+ nd_w4_sit_filing_status=filing_status,
+ state_income_tax_additional_withholding=additional_withholding,
+ nd_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.assertPayrollAlmostEqual(cats.get('EE_US_SIT', 0.0), -expected_withholding)
+
+ def test_2021_taxes_example(self):
+ self._test_er_suta('ND', self.ND_UNEMP, date(2021, 1, 1), wage_base=self.ND_UNEMP_MAX_WAGE)
+ self._test_sit(700.0, 'single', 0.0, 0.0, 'weekly', date(2021, 1, 1), 6.0)
+ self._test_sit(5000.0, 'married', 0.0, 2.0, 'bi-weekly', date(2021, 1, 1), 76.0)
+ self._test_sit(25000.0, 'head_household', 0.0, 0.0, 'monthly', date(2021, 1, 1), 533.0)
+ self._test_sit(25000.0, 'head_household', 10.0, 2.0, 'monthly', date(2021, 1, 1), 524.0)
+ self._test_sit(3000.0, '', 10.0, 2.0, 'monthly', date(2021, 1, 1), 0.0)
diff --git a/l10n_us_hr_payroll/tests/test_us_ne_nebraska_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_ne_nebraska_payslip_2021.py
new file mode 100644
index 00000000..294856a7
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_ne_nebraska_payslip_2021.py
@@ -0,0 +1,38 @@
+# 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 TestUsNEPayslip(TestUsPayslip):
+ ###
+ # 2021 Taxes and Rates
+ ###
+ NE_UNEMP_MAX_WAGE = 9000.0
+ NE_UNEMP = 2.5
+
+ def _test_sit(self, wage, filing_status, exempt, additional_withholding, allowances, schedule_pay, date_start, expected_withholding):
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ state_id=self.get_us_state('NE'),
+ ne_w4n_sit_filing_status=filing_status,
+ state_income_tax_exempt=exempt,
+ state_income_tax_additional_withholding=additional_withholding,
+ ne_w4n_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.assertPayrollAlmostEqual(cats.get('EE_US_SIT', 0.0), -expected_withholding)
+
+ def test_2021_taxes_example(self):
+ self._test_er_suta('NE', self.NE_UNEMP, date(2021, 1, 1), wage_base=self.NE_UNEMP_MAX_WAGE)
+ self._test_sit(750.0, 'single', False, 0.0, 2, 'weekly', date(2021, 1, 1), 27.53)
+ self._test_sit(9500.0, 'single', False, 0.0, 1, 'bi-weekly', date(2021, 1, 1), 612.63)
+ self._test_sit(10500.0, 'married', False, 0.0, 1, 'bi-weekly', date(2021, 1, 1), 659.85)
+ self._test_sit(9500.0, 'single', True, 0.0, 1, 'bi-weekly', date(2021, 1, 1), 0.0)
+ self._test_sit(10500.0, 'single', False, 10.0, 2, 'monthly', date(2021, 1, 1), 625.2)
+ self._test_sit(4000.0, 'single', False, 0.0, 1, 'monthly', date(2021, 1, 1), 179.44)
diff --git a/l10n_us_hr_payroll/tests/test_us_nh_new_hampshire_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_nh_new_hampshire_payslip_2021.py
new file mode 100644
index 00000000..5c1b4a1f
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_nh_new_hampshire_payslip_2021.py
@@ -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 = 2.7
+
+ def test_2021_taxes(self):
+ self._test_er_suta('NH', self.NH_UNEMP, date(2021, 1, 1), wage_base=self.NH_UNEMP_MAX_WAGE)
diff --git a/l10n_us_hr_payroll/tests/test_us_nj_newjersey_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_nj_newjersey_payslip_2019.py
deleted file mode 100755
index c28849b5..00000000
--- a/l10n_us_hr_payroll/tests/test_us_nj_newjersey_payslip_2019.py
+++ /dev/null
@@ -1,128 +0,0 @@
-# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
-
-from .common import TestUsPayslip, process_payslip
-
-
-class TestUsNJPayslip(TestUsPayslip):
- ###
- # 2019 Taxes and Rates
- ###
- NJ_UNEMP_MAX_WAGE = 34400.0 # Note that this is used for SDI and FLI as well
-
- ER_NJ_UNEMP = -2.6825 / 100.0
- EE_NJ_UNEMP = -0.3825 / 100.0
-
- ER_NJ_SDI = -0.5 / 100.0
- EE_NJ_SDI = -0.17 / 100.0
-
- ER_NJ_WF = -0.1175 / 100.0
- EE_NJ_WF = -0.0425 / 100.0
-
- ER_NJ_FLI = 0.0
- EE_NJ_FLI = -0.08 / 100.0
-
- # Examples found on page 24 of http://www.state.nj.us/treasury/taxation/pdf/current/njwt.pdf
- def test_2019_taxes_example1(self):
- salary = 300
-
- # Tax Percentage Method for Single, taxable under $385
- wh = -4.21
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('NJ'),
- nj_njw4_sit_filing_status='single',
- nj_njw4_sit_allowances=1,
- state_income_tax_additional_withholding=0.0,
- nj_njw4_sit_rate_table='A',
- schedule_pay='weekly')
-
- self._log('2019 New Jersey tax first payslip:')
- payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
-
- payslip.compute_sheet()
-
- cats = self._getCategories(payslip)
-
- self.assertPayrollEqual(cats['EE_US_SUTA'], salary * (self.EE_NJ_UNEMP + self.EE_NJ_SDI + self.EE_NJ_WF + self.EE_NJ_FLI))
- self.assertPayrollEqual(cats['ER_US_SUTA'], salary * (self.ER_NJ_UNEMP + self.ER_NJ_SDI + self.ER_NJ_WF + self.ER_NJ_FLI))
- self.assertTrue(all((cats['EE_US_SUTA'], cats['ER_US_SUTA'])))
- # self.assertPayrollEqual(cats['EE_US_NJ_SDI_SIT'], cats['EE_US_NJ_SDI_SIT'] * self.EE_NJ_SDI)
- # self.assertPayrollEqual(cats['ER_US_NJ_SDI_SUTA'], cats['ER_US_NJ_SDI_SUTA'] * self.ER_NJ_SDI)
- # self.assertPayrollEqual(cats['EE_US_NJ_FLI_SIT'], cats['EE_US_NJ_FLI_SIT'] * self.EE_NJ_FLI)
- # self.assertPayrollEqual(cats['EE_US_NJ_WF_SIT'], cats['EE_US_NJ_WF_SIT'] * self.EE_NJ_WF)
- self.assertPayrollEqual(cats['EE_US_SIT'], wh)
-
- process_payslip(payslip)
-
- # # Make a new payslip, this one will have maximums
- #
- remaining_nj_unemp_wages = self.NJ_UNEMP_MAX_WAGE - salary if (self.NJ_UNEMP_MAX_WAGE - 2 * salary < salary) \
- else salary
-
- self._log('2019 New Jersey tax second payslip:')
- payslip = self._createPayslip(employee, '2019-02-01', '2019-02-28')
-
- payslip.compute_sheet()
-
- cats = self._getCategories(payslip)
-
- # self.assertPayrollEqual(cats['WAGE_US_NJ_UNEMP'], remaining_nj_unemp_wages)
- self.assertPayrollEqual(cats['ER_US_SUTA'], remaining_nj_unemp_wages * (self.ER_NJ_UNEMP + self.ER_NJ_SDI + self.ER_NJ_WF + self.ER_NJ_FLI))
- self.assertPayrollEqual(cats['EE_US_SUTA'], remaining_nj_unemp_wages * (self.EE_NJ_UNEMP + self.EE_NJ_SDI + self.EE_NJ_WF + self.EE_NJ_FLI))
-
- def test_2019_taxes_example2(self):
- salary = 1400.00
-
- # Tax Percentage Method for Single, taxable pay over $962, under $1346
- wh = -27.58
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('NJ'),
- nj_njw4_sit_filing_status='married_separate',
- nj_njw4_sit_allowances=3,
- state_income_tax_additional_withholding=0.0,
- #nj_njw4_sit_rate_table='B',
- schedule_pay='weekly')
-
- self.assertEqual(contract.schedule_pay, 'weekly')
-
- self._log('2019 New Jersey tax first payslip:')
- payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
-
- payslip.compute_sheet()
-
- cats = self._getCategories(payslip)
-
- self.assertPayrollEqual(cats['EE_US_SIT'], wh)
-
-
- def test_2019_taxes_to_the_limits(self):
- salary = 30000.00
-
- # Tax Percentage Method for Single, taxable pay over $18750, under 125000
- wh = -1467.51
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('NJ'),
- nj_njw4_sit_filing_status='married_joint',
- nj_njw4_sit_allowances=3,
- state_income_tax_additional_withholding=0.0,
- # nj_njw4_sit_rate_table='B',
- schedule_pay='quarterly')
-
- self.assertEqual(contract.schedule_pay, 'quarterly')
-
- self._log('2019 New Jersey tax first payslip:')
- payslip = self._createPayslip(employee, '2019-01-01', '2019-03-31')
-
- payslip.compute_sheet()
-
- cats = self._getCategories(payslip)
-
- self.assertPayrollEqual(cats['EE_US_SIT'], wh)
diff --git a/l10n_us_hr_payroll/tests/test_us_nj_newjersey_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_nj_newjersey_payslip_2021.py
new file mode 100755
index 00000000..2b3fc627
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_nj_newjersey_payslip_2021.py
@@ -0,0 +1,51 @@
+# 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 TestUsNJPayslip(TestUsPayslip):
+ ###
+ # 2021 Taxes and Rates
+ ###
+ NJ_UNEMP_MAX_WAGE = 36200.0 # Note that this is used for SDI and FLI as well
+
+ ER_NJ_UNEMP = 2.6825
+ EE_NJ_UNEMP = 0.3825
+
+ ER_NJ_SDI = 0.5
+ EE_NJ_SDI = 0.47
+
+ ER_NJ_WF = 0.1175
+ EE_NJ_WF = 0.0425
+
+ ER_NJ_FLI = 0.0
+ EE_NJ_FLI = 0.28
+
+ def _test_sit(self, wage, filing_status, allowances, schedule_pay, date_start, expected_withholding, rate_table=False):
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ state_id=self.get_us_state('NJ'),
+ nj_njw4_sit_filing_status=filing_status,
+ nj_njw4_sit_allowances=allowances,
+ state_income_tax_additional_withholding=0.0,
+ nj_njw4_sit_rate_table=rate_table,
+ 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_2021_taxes_example1(self):
+ combined_er_rate = self.ER_NJ_UNEMP + self.ER_NJ_FLI + self.ER_NJ_SDI + self.ER_NJ_WF
+ self._test_er_suta('NJ', combined_er_rate, date(2021, 1, 1), wage_base=self.NJ_UNEMP_MAX_WAGE, relaxed=True)
+ combined_ee_rate = self.EE_NJ_UNEMP + self.EE_NJ_FLI + self.EE_NJ_SDI + self.EE_NJ_WF
+ self._test_ee_suta('NJ', combined_ee_rate, date(2021, 1, 1), wage_base=self.NJ_UNEMP_MAX_WAGE, relaxed=True)
+ # these expected values come from https://www.state.nj.us/treasury/taxation/pdf/current/njwt.pdf
+ self._test_sit(300.0, 'single', 1, 'weekly', date(2021, 1, 1), 4.21)
+ self._test_sit(375.0, 'married_separate', 3, 'weekly', date(2021, 1, 1), 4.76)
+ self._test_sit(1400.0, 'head_household', 3, 'weekly', date(2021, 1, 1), 27.60)
+ self._test_sit(1400.0, '', 3, 'weekly', date(2021, 1, 1), 0.00)
+ self._test_sit(2500.0, 'single', 3, 'bi-weekly', date(2021, 1, 1), 82.66)
+ self._test_sit(15000.0, 'married_joint', 2, 'monthly', date(2021, 1, 1), 844.85)
diff --git a/l10n_us_hr_payroll/tests/test_us_nm_new_mexico_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_nm_new_mexico_payslip_2021.py
new file mode 100755
index 00000000..317977ba
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_nm_new_mexico_payslip_2021.py
@@ -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 TestUsNMPayslip(TestUsPayslip):
+ ###
+ # 2021 Taxes and Rates
+ ###
+ NM_UNEMP_MAX_WAGE = 27000.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+2021.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_2021_taxes_example(self):
+ self._test_er_suta('NM', self.NM_UNEMP, date(2021, 1, 1), wage_base=self.NM_UNEMP_MAX_WAGE)
+ self._test_sit(1000.0, 'married', 0.0, 'weekly', date(2021, 1, 1), 29.32)
+ self._test_sit(1000.0, 'married', 10.0, 'weekly', date(2021, 1, 1), 39.32)
+ self._test_sit(25000.0, 'single', 0.0, 'bi-weekly', date(2021, 1, 1), 1369.25)
+ self._test_sit(25000.0, 'married_as_single', 0.0, 'monthly', date(2021, 1, 1), 1152.63)
+ self._test_sit(4400.0, '', 0.0, 'monthly', date(2021, 1, 1), 0.00)
diff --git a/l10n_us_hr_payroll/tests/test_us_nv_nevada_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_nv_nevada_payslip_2021.py
new file mode 100755
index 00000000..284990a0
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_nv_nevada_payslip_2021.py
@@ -0,0 +1,16 @@
+# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
+
+from datetime import date
+from .common import TestUsPayslip
+
+
+class TestUsNVPayslip(TestUsPayslip):
+ ###
+ # 2021 Taxes and Rates
+ ###
+ NV_UNEMP_MAX_WAGE = 33400.0
+ NV_UNEMP = 2.95
+
+ def test_2021_taxes(self):
+ # Only has state unemployment
+ self._test_er_suta('NV', self.NV_UNEMP, date(2021, 1, 1), wage_base=self.NV_UNEMP_MAX_WAGE)
diff --git a/l10n_us_hr_payroll/tests/test_us_ny_new_york_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_ny_new_york_payslip_2021.py
new file mode 100644
index 00000000..e8f0383d
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_ny_new_york_payslip_2021.py
@@ -0,0 +1,39 @@
+# 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 TestUsNYPayslip(TestUsPayslip):
+ ###
+ # 2021 Taxes and Rates
+ ###
+ NY_UNEMP_MAX_WAGE = 11800.0
+ NY_UNEMP = 2.5 #todo: update Feb 2021
+ NY_RSF = 0.075 #todo: update Feb 2021
+ NY_MCTMT = 0.0 #todo: update Feb 2021
+
+ 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('NY'),
+ ny_it2104_sit_filing_status=filing_status,
+ state_income_tax_additional_withholding=additional_withholding,
+ ny_it2104_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.assertPayrollAlmostEqual(cats.get('EE_US_SIT', 0.0), -expected_withholding)
+
+ def test_2020_taxes_example(self):
+ combined_er_rate = self.NY_UNEMP + self.NY_RSF + self.NY_MCTMT
+ self._test_er_suta('NY', combined_er_rate, date(2021, 1, 1), wage_base=self.NY_UNEMP_MAX_WAGE, relaxed=True)
+ self._test_sit(400.0, 'single', 0.0, 3, 'weekly', date(2021, 1, 1), 8.20)
+ self._test_sit(10000.0, 'single', 0.0, 3, 'monthly', date(2021, 1, 1), 546.30)
+ self._test_sit(8000.0, 'married', 0.0, 5, 'monthly', date(2021, 1, 1), 394.24)
+ self._test_sit(4500.0, 'married', 10.0, 3, 'semi-monthly', date(2021, 1, 1), 244.21)
+ self._test_sit(50000.0, '', 0.0, 0, 'monthly', date(2021, 1, 1), 0.00)
diff --git a/l10n_us_hr_payroll/tests/test_us_oh_ohio_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_oh_ohio_payslip_2019.py
deleted file mode 100755
index d1f65f05..00000000
--- a/l10n_us_hr_payroll/tests/test_us_oh_ohio_payslip_2019.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
-
-from .common import TestUsPayslip, process_payslip
-from odoo.addons.l10n_us_hr_payroll.models.hr_contract import USHRContract
-
-
-class TestUsOhPayslip(TestUsPayslip):
- ###
- # Taxes and Rates
- ###
- OH_UNEMP_MAX_WAGE = 9500.0
- OH_UNEMP = -2.7 / 100.0
-
- def test_2019_taxes(self):
- salary = 5000.0
-
- # For formula here
- # http://www.tax.ohio.gov/Portals/0/employer_withholding/August2015Rates/WTH_OptionalComputerFormula_073015.pdf
- tw = salary * 12 # = 60000
- wd = ((tw - 40000) * 0.035 + 900) / 12 * 1.075
-
- employee = self._createEmployee()
-
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('OH'),
- )
-
- self._log('2019 Ohio 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.OH_UNEMP)
- self.assertPayrollAlmostEqual(cats['EE_US_SIT'], -wd) # Off by 0.6 cents so it rounds off by a penny
- #self.assertPayrollEqual(cats['EE_US_SIT'], -wd)
-
- process_payslip(payslip)
-
- # Make a new payslip, this one will have maximums
-
- remaining_oh_unemp_wages = self.OH_UNEMP_MAX_WAGE - salary if (self.OH_UNEMP_MAX_WAGE - 2*salary < salary) \
- else salary
-
- self._log('2019 Ohio 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'], remaining_oh_unemp_wages * self.OH_UNEMP)
-
- def test_2019_taxes_with_external(self):
- salary = 5000.0
- external_wages = 6000.0
-
- employee = self._createEmployee()
-
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('OH'),
- external_wages=external_wages,
- )
-
- self._log('2019 Ohio_external 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.OH_UNEMP_MAX_WAGE - external_wages) * self.OH_UNEMP)
-
- def test_2019_taxes_with_state_exempt(self):
- salary = 5000.0
- external_wages = 6000.0
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('OH'),
- external_wages=external_wages,
- futa_type=USHRContract.FUTA_TYPE_BASIC)
-
- self._log('2019 Ohio exempt tax first payslip:')
- payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
-
- payslip.compute_sheet()
-
- cats = self._getCategories(payslip)
-
- # FUTA_TYPE_BASIC
- self.assertPayrollEqual(cats.get('ER_US_SUTA', 0.0), salary * 0.0)
diff --git a/l10n_us_hr_payroll/tests/test_us_oh_ohio_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_oh_ohio_payslip_2021.py
new file mode 100755
index 00000000..a05ff6ca
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_oh_ohio_payslip_2021.py
@@ -0,0 +1,108 @@
+# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
+
+from datetime import date
+from .common import TestUsPayslip, process_payslip
+
+
+class TestUsOhPayslip(TestUsPayslip):
+ ###
+ # Taxes and Rates
+ ###
+ OH_UNEMP_MAX_WAGE = 9000.0
+ OH_UNEMP = 2.7
+
+ def test_2021_taxes(self):
+ self._test_er_suta('OH', self.OH_UNEMP, date(2021, 1, 1), wage_base=self.OH_UNEMP_MAX_WAGE)
+
+ def _run_test_sit(self,
+ wage=0.0,
+ schedule_pay='monthly',
+ filing_status='single',
+ dependent_credit=0.0,
+ other_income=0.0,
+ deductions=0.0,
+ additional_withholding=0.0,
+ is_nonresident_alien=False,
+ state_income_tax_exempt=False,
+ state_income_tax_additional_withholding=0.0,
+ oh_it4_sit_exemptions=0,
+ expected=0.0,
+ ):
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ schedule_pay=schedule_pay,
+ fed_941_fit_w4_is_nonresident_alien=is_nonresident_alien,
+ fed_941_fit_w4_filing_status=filing_status,
+ fed_941_fit_w4_multiple_jobs_higher=False,
+ fed_941_fit_w4_dependent_credit=dependent_credit,
+ fed_941_fit_w4_other_income=other_income,
+ fed_941_fit_w4_deductions=deductions,
+ fed_941_fit_w4_additional_withholding=additional_withholding,
+ state_income_tax_exempt=state_income_tax_exempt,
+ state_income_tax_additional_withholding=state_income_tax_additional_withholding,
+ oh_it4_sit_exemptions=oh_it4_sit_exemptions,
+ state_id=self.get_us_state('OH'),
+ )
+ payslip = self._createPayslip(employee, '2021-01-01', '2021-01-31')
+ payslip.compute_sheet()
+ cats = self._getCategories(payslip)
+ # Instead of PayrollEqual after initial first round of testing.
+ self.assertPayrollAlmostEqual(cats.get('EE_US_SIT', 0.0), -expected)
+ return payslip
+
+ def test_2021_sit_1(self):
+ wage = 400.0
+ exemptions = 1
+ additional = 10.0
+ pay_periods = 12.0
+ annual_adjusted_wage = (wage * pay_periods) - (650.0 * exemptions)
+ self.assertPayrollEqual(4150.0, annual_adjusted_wage)
+ WD = ((annual_adjusted_wage * 0.005) / pay_periods) * 1.032
+ self.assertPayrollEqual(WD, 1.7845)
+ expected = WD + additional
+ self._run_test_sit(wage=wage,
+ schedule_pay='monthly',
+ state_income_tax_exempt=False,
+ state_income_tax_additional_withholding=additional,
+ oh_it4_sit_exemptions=exemptions,
+ expected=expected,
+ )
+
+ # the above agrees with online calculator to the penny 0.01
+ # below expected coming from calculator to 0.10
+ #
+ # semi-monthly
+ self._run_test_sit(wage=1200,
+ schedule_pay='semi-monthly',
+ state_income_tax_exempt=False,
+ state_income_tax_additional_withholding=20.0,
+ oh_it4_sit_exemptions=2,
+ expected=42.58,
+ )
+
+ # bi-weekly
+ self._run_test_sit(wage=3000,
+ schedule_pay='bi-weekly',
+ state_income_tax_exempt=False,
+ #state_income_tax_additional_withholding=0.0,
+ oh_it4_sit_exemptions=0,
+ expected=88.51,
+ )
+ # weekly
+ self._run_test_sit(wage=355,
+ schedule_pay='weekly',
+ state_income_tax_exempt=False,
+ # state_income_tax_additional_withholding=0.0,
+ oh_it4_sit_exemptions=1,
+ expected=4.87,
+ )
+
+ # Exempt!
+ self._run_test_sit(wage=355,
+ schedule_pay='weekly',
+ state_income_tax_exempt=True,
+ # state_income_tax_additional_withholding=0.0,
+ oh_it4_sit_exemptions=1,
+ expected=0.0,
+ )
diff --git a/l10n_us_hr_payroll/tests/test_us_ok_oklahoma_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_ok_oklahoma_payslip_2021.py
new file mode 100755
index 00000000..096f3dfd
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_ok_oklahoma_payslip_2021.py
@@ -0,0 +1,38 @@
+# 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 TestUsOKPayslip(TestUsPayslip):
+ ###
+ # 2021 Taxes and Rates
+ ###
+ OK_UNEMP_MAX_WAGE = 24000.0
+ OK_UNEMP = 1.0
+ # Calculation based on example https://www.ok.gov/tax/documents/2021WHTables.pdf
+
+ def _test_sit(self, wage, filing_status, allowances, additional_withholding, exempt, schedule_pay, date_start, expected_withholding):
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ state_id=self.get_us_state('OK'),
+ ok_w4_sit_filing_status=filing_status,
+ ok_w4_sit_allowances=allowances,
+ state_income_tax_additional_withholding=additional_withholding,
+ state_income_tax_exempt=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_2021_taxes_example(self):
+ self._test_er_suta('OK', self.OK_UNEMP, date(2021, 1, 1), wage_base=self.OK_UNEMP_MAX_WAGE)
+ self._test_sit(1825, 'married', 2, 0, False, 'semi-monthly', date(2021, 1, 1), 46.00)
+ self._test_sit(1825, 'married', 2, 0, True, 'monthly', date(2021, 1, 1), 0.00)
+ self._test_sit(1000, 'single', 1, 0, False, 'weekly', date(2021, 1, 1), 39.00)
+ self._test_sit(1000, 'single', 1, 10, False, 'weekly', date(2021, 1, 1), 49.00)
+ self._test_sit(5000, 'head_household', 2, 10, False, 'monthly', date(2021, 1, 1), 210.00)
diff --git a/l10n_us_hr_payroll/tests/test_us_pa_pennsylvania_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_pa_pennsylvania_payslip_2019.py
deleted file mode 100755
index ce7e4fb4..00000000
--- a/l10n_us_hr_payroll/tests/test_us_pa_pennsylvania_payslip_2019.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
-
-from .common import TestUsPayslip, process_payslip
-
-
-class TestUsPAPayslip(TestUsPayslip):
- ###
- # Taxes and Rates
- ###
- PA_UNEMP_MAX_WAGE = 10000.0
- ER_PA_UNEMP = -3.6890 / 100.0
- EE_PA_UNEMP = -0.06 / 100.0
- PA_INC_WITHHOLD = 3.07
-
- def test_2019_taxes(self):
- salary = 4166.67
- wh = -127.92
-
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('PA'))
-
- self._log('2019 Pennsylvania tax first payslip:')
- payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
- payslip.compute_sheet()
-
- cats = self._getCategories(payslip)
-
- self.assertPayrollEqual(cats['EE_US_SUTA'], cats['GROSS'] * self.EE_PA_UNEMP)
- self.assertPayrollEqual(cats['ER_US_SUTA'], cats['GROSS'] * self.ER_PA_UNEMP)
- self.assertPayrollEqual(cats['EE_US_SIT'], wh)
diff --git a/l10n_us_hr_payroll/tests/test_us_pa_pennsylvania_payslip_2020.py b/l10n_us_hr_payroll/tests/test_us_pa_pennsylvania_payslip_2020.py
index 3dd3fd27..fe053f79 100755
--- a/l10n_us_hr_payroll/tests/test_us_pa_pennsylvania_payslip_2020.py
+++ b/l10n_us_hr_payroll/tests/test_us_pa_pennsylvania_payslip_2020.py
@@ -24,7 +24,7 @@ class TestUsPAPayslip(TestUsPayslip):
wage=salary,
state_id=self.get_us_state('PA'))
- self._log('2019 Pennsylvania tax first payslip:')
+ self._log('2020 Pennsylvania tax first payslip:')
payslip = self._createPayslip(employee, '2020-01-01', '2020-01-31')
payslip.compute_sheet()
cats = self._getCategories(payslip)
diff --git a/l10n_us_hr_payroll/tests/test_us_pa_pennsylvania_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_pa_pennsylvania_payslip_2021.py
new file mode 100755
index 00000000..8f11073e
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_pa_pennsylvania_payslip_2021.py
@@ -0,0 +1,43 @@
+# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
+
+from datetime import date
+from .common import TestUsPayslip
+
+
+class TestUsPAPayslip(TestUsPayslip):
+ ###
+ # Taxes and Rates
+ ###
+ PA_UNEMP_MAX_WAGE = 10000.0
+ ER_PA_UNEMP = 3.6890
+ EE_PA_UNEMP = 0.06
+ PA_INC_WITHHOLD = 3.07
+
+ def test_2021_taxes(self):
+ self._test_er_suta('PA', self.ER_PA_UNEMP, date(2021, 1, 1), wage_base=self.PA_UNEMP_MAX_WAGE)
+ self._test_ee_suta('PA', self.EE_PA_UNEMP, date(2021, 1, 1))
+
+ salary = 4166.67
+ wh = -127.92
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=salary,
+ state_id=self.get_us_state('PA'))
+
+ self._log('2021 Pennsylvania tax first payslip:')
+ payslip = self._createPayslip(employee, '2021-01-01', '2021-01-31')
+ payslip.compute_sheet()
+ cats = self._getCategories(payslip)
+ self.assertPayrollEqual(cats['EE_US_SIT'], wh)
+
+ # Test Additional
+ contract.us_payroll_config_id.state_income_tax_additional_withholding = 100.0
+ payslip.compute_sheet()
+ cats = self._getCategories(payslip)
+ self.assertPayrollEqual(cats['EE_US_SIT'], wh - 100.0)
+
+ # Test Exempt
+ contract.us_payroll_config_id.state_income_tax_exempt = True
+ payslip.compute_sheet()
+ cats = self._getCategories(payslip)
+ self.assertPayrollEqual(cats.get('EE_US_SIT', 0.0), 0.0)
diff --git a/l10n_us_hr_payroll/tests/test_us_payslip_2020.py b/l10n_us_hr_payroll/tests/test_us_payslip_2020.py
index c10a230b..ea421e0d 100644
--- a/l10n_us_hr_payroll/tests/test_us_payslip_2020.py
+++ b/l10n_us_hr_payroll/tests/test_us_payslip_2020.py
@@ -40,16 +40,6 @@ class TestUsPayslip2020(TestUsPayslip):
contract = self._createContract(employee, wage=salary)
self._log(contract.read())
- self._log('2019 tax last slip')
- payslip = self._createPayslip(employee, '2019-12-01', '2019-12-31')
- payslip.compute_sheet()
- self._log(payslip.read())
- process_payslip(payslip)
-
- # Ensure amounts are there, they shouldn't be added in the next year...
- cats = self._getCategories(payslip)
- self.assertTrue(cats['ER_US_940_FUTA'], self.FUTA_MAX_WAGE * self.FUTA)
-
self._log('2020 tax first payslip:')
payslip = self._createPayslip(employee, '2020-01-01', '2020-01-31')
payslip.compute_sheet()
diff --git a/l10n_us_hr_payroll/tests/test_us_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_payslip_2021.py
new file mode 100644
index 00000000..d3b13132
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_payslip_2021.py
@@ -0,0 +1,300 @@
+# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
+
+from .common import TestUsPayslip, process_payslip
+
+from odoo.addons.l10n_us_hr_payroll.models.hr_contract import USHRContract
+
+from sys import float_info
+
+
+class TestUsPayslip2021(TestUsPayslip):
+ # FUTA Constants
+ FUTA_RATE_NORMAL = 0.6
+ FUTA_RATE_BASIC = 6.0
+ FUTA_RATE_EXEMPT = 0.0
+
+ # Wage caps
+ FICA_SS_MAX_WAGE = 142800.0
+ FICA_M_MAX_WAGE = float_info.max
+ FICA_M_ADD_START_WAGE = 200000.0
+ FUTA_MAX_WAGE = 7000.0
+
+ # Rates
+ FICA_SS = 6.2 / -100.0
+ FICA_M = 1.45 / -100.0
+ FUTA = FUTA_RATE_NORMAL / -100.0
+ FICA_M_ADD = 0.9 / -100.0
+
+ ###
+ # 2021 Taxes and Rates
+ ###
+
+ def test_2021_taxes(self):
+ # salary is high so that second payslip runs over max
+ # social security salary
+ salary = 80000.0
+
+ employee = self._createEmployee()
+
+ contract = self._createContract(employee, wage=salary)
+ self._log(contract.read())
+
+ self._log('2020 tax last slip')
+ payslip = self._createPayslip(employee, '2020-12-01', '2020-12-31')
+ self.assertEqual(payslip.contract_id, contract)
+ payslip.compute_sheet()
+ self._log(payslip.read())
+ process_payslip(payslip)
+
+ # Ensure amounts are there, they shouldn't be added in the next year...
+ cats = self._getCategories(payslip)
+ self.assertTrue(cats['ER_US_940_FUTA'], ' Value should be well above whatever was available that year!')
+
+ self._log('2021 tax first payslip:')
+ payslip = self._createPayslip(employee, '2021-01-01', '2021-01-31')
+
+ payslip.compute_sheet()
+
+ cats = self._getCategories(payslip)
+ rules = self._getRules(payslip)
+ # Employee
+ self.assertPayrollEqual(rules['EE_US_941_FICA_SS'], cats['BASIC'] * self.FICA_SS)
+ self.assertPayrollEqual(rules['EE_US_941_FICA_M'], cats['BASIC'] * self.FICA_M)
+ self.assertPayrollEqual(rules['EE_US_941_FICA_M_ADD'], 0.0)
+ # Employer
+ self.assertPayrollEqual(rules['ER_US_941_FICA_SS'], rules['EE_US_941_FICA_SS'])
+ self.assertPayrollEqual(rules['ER_US_941_FICA_M'], rules['EE_US_941_FICA_M'])
+ self.assertTrue(cats['ER_US_940_FUTA'], self.FUTA_MAX_WAGE * self.FUTA)
+
+ process_payslip(payslip)
+
+ # Make a new payslip, this one will have reached Medicare Additional (employee only)
+ remaining_ss_wages = self.FICA_SS_MAX_WAGE - salary if (self.FICA_SS_MAX_WAGE - 2 * salary < salary) else salary
+ remaining_m_wages = self.FICA_M_MAX_WAGE - salary if (self.FICA_M_MAX_WAGE - 2 * salary < salary) else salary
+
+ self._log('2021 tax second payslip:')
+ payslip = self._createPayslip(employee, '2021-02-01', '2021-02-28')
+ payslip.compute_sheet()
+
+ cats = self._getCategories(payslip)
+ rules = self._getRules(payslip)
+
+ self.assertPayrollEqual(rules['EE_US_941_FICA_SS'], remaining_ss_wages * self.FICA_SS)
+ self.assertPayrollEqual(rules['EE_US_941_FICA_M'], remaining_m_wages * self.FICA_M)
+ self.assertPayrollEqual(rules['EE_US_941_FICA_M_ADD'], 0.0)
+ self.assertPayrollEqual(cats['ER_US_940_FUTA'], 0.0)
+
+ process_payslip(payslip)
+
+ # Make a new payslip, this one will have reached Medicare Additional (employee only)
+ self._log('2021 tax third payslip:')
+ payslip = self._createPayslip(employee, '2021-03-01', '2021-03-31')
+ payslip.compute_sheet()
+
+ cats = self._getCategories(payslip)
+ rules = self._getRules(payslip)
+
+ self.assertPayrollEqual(rules['EE_US_941_FICA_M_ADD'], (self.FICA_M_ADD_START_WAGE - (salary * 2)) * self.FICA_M_ADD) # aka 40k
+
+ process_payslip(payslip)
+
+ # Make a new payslip, this one will have all salary as Medicare Additional
+
+ self._log('2021 tax fourth payslip:')
+ payslip = self._createPayslip(employee, '2021-04-01', '2021-04-30')
+ payslip.compute_sheet()
+
+ cats = self._getCategories(payslip)
+ rules = self._getRules(payslip)
+
+ self.assertPayrollEqual(rules['EE_US_941_FICA_M_ADD'], salary * self.FICA_M_ADD)
+
+ process_payslip(payslip)
+
+ def test_2021_taxes_with_external(self):
+ # social security salary
+ salary = self.FICA_M_ADD_START_WAGE
+ external_wages = 6000.0
+
+ employee = self._createEmployee()
+
+ self._createContract(employee, wage=salary, external_wages=external_wages)
+
+ self._log('2021 tax first payslip:')
+ payslip = self._createPayslip(employee, '2021-01-01', '2021-01-31')
+ payslip.compute_sheet()
+
+ cats = self._getCategories(payslip)
+ rules = self._getRules(payslip)
+ self.assertPayrollEqual(rules['EE_US_941_FICA_SS'], (self.FICA_SS_MAX_WAGE - external_wages) * self.FICA_SS)
+ self.assertPayrollEqual(rules['EE_US_941_FICA_M'], salary * self.FICA_M)
+ self.assertPayrollEqual(rules['EE_US_941_FICA_M_ADD'], external_wages * self.FICA_M_ADD)
+ self.assertPayrollEqual(rules['ER_US_941_FICA_SS'], rules['EE_US_941_FICA_SS'])
+ self.assertPayrollEqual(rules['ER_US_941_FICA_M'], rules['EE_US_941_FICA_M'])
+ self.assertPayrollEqual(cats['ER_US_940_FUTA'], (self.FUTA_MAX_WAGE - external_wages) * self.FUTA)
+
+ def test_2021_taxes_with_full_futa(self):
+ futa_rate = self.FUTA_RATE_BASIC / -100.0
+ # social security salary
+ salary = self.FICA_M_ADD_START_WAGE
+
+ employee = self._createEmployee()
+
+ self._createContract(employee, wage=salary, fed_940_type=USHRContract.FUTA_TYPE_BASIC)
+
+ self._log('2021 tax first payslip:')
+ payslip = self._createPayslip(employee, '2021-01-01', '2021-01-31')
+
+ payslip.compute_sheet()
+
+ cats = self._getCategories(payslip)
+ rules = self._getRules(payslip)
+ self.assertPayrollEqual(rules['EE_US_941_FICA_SS'], self.FICA_SS_MAX_WAGE * self.FICA_SS)
+ self.assertPayrollEqual(rules['EE_US_941_FICA_M'], salary * self.FICA_M)
+ self.assertPayrollEqual(rules['EE_US_941_FICA_M_ADD'], 0.0 * self.FICA_M_ADD)
+ self.assertPayrollEqual(rules['ER_US_941_FICA_SS'], rules['EE_US_941_FICA_SS'])
+ self.assertPayrollEqual(rules['ER_US_941_FICA_M'], rules['EE_US_941_FICA_M'])
+ self.assertPayrollEqual(cats['ER_US_940_FUTA'], self.FUTA_MAX_WAGE * futa_rate)
+
+ def test_2021_taxes_with_futa_exempt(self):
+ futa_rate = self.FUTA_RATE_EXEMPT / -100.0 # because of exemption
+
+ # social security salary
+ salary = self.FICA_M_ADD_START_WAGE
+ employee = self._createEmployee()
+ self._createContract(employee, wage=salary, fed_940_type=USHRContract.FUTA_TYPE_EXEMPT)
+ self._log('2021 tax first payslip:')
+ payslip = self._createPayslip(employee, '2021-01-01', '2021-01-31')
+ payslip.compute_sheet()
+ cats = self._getCategories(payslip)
+ self.assertPayrollEqual(cats['ER_US_940_FUTA'], 0.0)
+
+ def test_2021_taxes_with_fica_exempt(self):
+ salary = 6000.0
+ schedule_pay = 'bi-weekly'
+ employee = self._createEmployee()
+ contract = self._createContract(employee, wage=salary, schedule_pay=schedule_pay)
+ contract.us_payroll_config_id.fed_941_fica_exempt = True
+
+ self._log('2021 tax w4 exempt payslip:')
+ payslip = self._createPayslip(employee, '2021-01-01', '2021-01-31')
+
+ payslip.compute_sheet()
+
+ cats = self._getCategories(payslip)
+ self.assertPayrollEqual(cats['EE_US_941_FICA'], 0.0)
+ self.assertPayrollEqual(cats['ER_US_941_FICA'], 0.0)
+
+ """
+ For Federal Income Tax Withholding, we are utilizing the calculations from the new IRS Excel calculator.
+ Given that you CAN round, we will round to compare even though we will calculate as close to the penny as possible
+ with the wage * computed_percent method.
+ """
+
+ def _run_test_fit(self,
+ wage=0.0,
+ schedule_pay='monthly',
+ filing_status='single',
+ dependent_credit=0.0,
+ other_income=0.0,
+ deductions=0.0,
+ additional_withholding=0.0,
+ is_nonresident_alien=False,
+ expected_standard=0.0,
+ expected_higher=0.0,
+ ):
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ schedule_pay=schedule_pay,
+ fed_941_fit_w4_is_nonresident_alien=is_nonresident_alien,
+ fed_941_fit_w4_filing_status=filing_status,
+ fed_941_fit_w4_multiple_jobs_higher=False,
+ fed_941_fit_w4_dependent_credit=dependent_credit,
+ fed_941_fit_w4_other_income=other_income,
+ fed_941_fit_w4_deductions=deductions,
+ fed_941_fit_w4_additional_withholding=additional_withholding,
+ )
+ payslip = self._createPayslip(employee, '2021-01-01', '2021-01-31')
+ payslip.compute_sheet()
+ cats = self._getCategories(payslip)
+ self.assertPayrollEqual(round(cats.get('EE_US_941_FIT', 0.0)), -expected_standard)
+
+ contract.us_payroll_config_id.fed_941_fit_w4_multiple_jobs_higher = True
+ payslip.compute_sheet()
+ cats = self._getCategories(payslip)
+ self.assertPayrollEqual(round(cats.get('EE_US_941_FIT', 0.0)), -expected_higher)
+ return payslip
+
+ def test_2021_fed_income_withholding_single(self):
+ _ = self._run_test_fit(
+ wage=6000.0,
+ schedule_pay='monthly',
+ filing_status='single',
+ dependent_credit=100.0,
+ other_income=200.0,
+ deductions=300.0,
+ additional_withholding=400.0,
+ is_nonresident_alien=False,
+ expected_standard=1125.0,
+ expected_higher=1455.0,
+ )
+
+ def test_2021_fed_income_withholding_married_as_single(self):
+ # This is "Head of Household" though the field name is the same for historical reasons.
+ _ = self._run_test_fit(
+ wage=500.0,
+ schedule_pay='weekly',
+ filing_status='married_as_single',
+ dependent_credit=20.0,
+ other_income=30.0,
+ deductions=40.0,
+ additional_withholding=10.0,
+ is_nonresident_alien=False,
+ expected_standard=23.0,
+ expected_higher=45.0,
+ )
+
+ def test_2021_fed_income_withholding_married(self):
+ _ = self._run_test_fit(
+ wage=14000.00,
+ schedule_pay='bi-weekly',
+ filing_status='married',
+ dependent_credit=2500.0,
+ other_income=1200.0,
+ deductions=1000.0,
+ additional_withholding=0.0,
+ is_nonresident_alien=False,
+ expected_standard=2603.0,
+ expected_higher=3687.0,
+ )
+
+ def test_2021_fed_income_withholding_nonresident_alien(self):
+ # Monthly NRA additional wage is 1033.30
+ # Wage input on IRS Form entered as (3500+1033.30)=4533.30, not 3500.0
+ _ = self._run_test_fit(
+ wage=3500.00,
+ schedule_pay='monthly',
+ filing_status='married',
+ dependent_credit=340.0,
+ other_income=0.0,
+ deductions=0.0,
+ additional_withholding=0.0,
+ is_nonresident_alien=True,
+ expected_standard=233.0,
+ expected_higher=387.0,
+ )
+
+ def test_2021_taxes_with_w4_exempt(self):
+ _ = self._run_test_fit(
+ wage=3500.00,
+ schedule_pay='monthly',
+ filing_status='', # Exempt
+ dependent_credit=340.0,
+ other_income=0.0,
+ deductions=0.0,
+ additional_withholding=0.0,
+ is_nonresident_alien=True,
+ expected_standard=0.0,
+ expected_higher=0.0,
+ )
diff --git a/l10n_us_hr_payroll/tests/test_us_ri_rhode_island_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_ri_rhode_island_payslip_2021.py
new file mode 100755
index 00000000..3fe9a189
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_ri_rhode_island_payslip_2021.py
@@ -0,0 +1,37 @@
+# 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 TestUsRIPayslip(TestUsPayslip):
+ ###
+ # 2021 Taxes and Rates
+ ###
+ RI_UNEMP_MAX_WAGE = 24000.0
+ RI_UNEMP = 1.06
+ # Calculation based on example http://www.tax.ri.gov/forms/2021/Withholding/2021%20Withhholding%20Tax%20Booklet.pdf
+
+ def _test_sit(self, wage, allowances, additional_withholding, exempt, schedule_pay, date_start, expected_withholding):
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ state_id=self.get_us_state('RI'),
+ ri_w4_sit_allowances=allowances,
+ state_income_tax_additional_withholding=additional_withholding,
+ state_income_tax_exempt=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_2021_taxes_example(self):
+ self._test_er_suta('RI', self.RI_UNEMP, date(2021, 1, 1), wage_base=self.RI_UNEMP_MAX_WAGE)
+ self._test_sit(2195, 1, 0, False, 'weekly', date(2021, 1, 1), 90.62)
+ self._test_sit(1800, 2, 10, True, 'weekly', date(2021, 1, 1), 0.00)
+ self._test_sit(10000, 1, 0, False, 'bi-weekly', date(2021, 1, 1), 501.75)
+ self._test_sit(18000, 2, 0, False, 'monthly', date(2021, 1, 1), 857.48)
+ self._test_sit(18000, 2, 10, False, 'monthly', date(2021, 1, 1), 867.47)
diff --git a/l10n_us_hr_payroll/tests/test_us_sc_south_carolina_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_sc_south_carolina_payslip_2019.py
deleted file mode 100644
index 793f84c4..00000000
--- a/l10n_us_hr_payroll/tests/test_us_sc_south_carolina_payslip_2019.py
+++ /dev/null
@@ -1,97 +0,0 @@
-# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
-
-from .common import TestUsPayslip, process_payslip
-
-
-class TestUsSCPayslip(TestUsPayslip):
-
- # Taxes and Rates
- SC_UNEMP_MAX_WAGE = 14000.0
- US_SC_UNEMP = -1.09 / 100
- US_SC_exemption_amount = 2510.00
-
- def test_2019_taxes_weekly(self):
- # We will hand calculate the amount to test for state withholding.
- schedule_pay = 'weekly'
- salary = 50000.00 # Employee is paid 50000 per week to be in top tax bracket
- allowances = 2
- # Calculate annual wages
- annual = 50000 * 52.0
- # From our annual we deduct personal exemption amounts.
- # We deduct 2510.00 per exemption. Since we have two exemptions:
- personal_exemption = self.US_SC_exemption_amount * allowances # 5020.0
- # From annual, we will also deduct a standard_deduction of 3470.00 or .1 of salary, which ever
- # is small -> if 1 or more exemptions, else 0
- standard_deduction = 3470.00
- taxable_income = annual - personal_exemption - standard_deduction # 2591510.0
- # We then calculate the amounts off the SC tax pdf tables.
- # 2591478.0 is in the highest bracket
- test_amt = (taxable_income * (7.0 / 100.0)) - 467.95
- test_amt = 180935.51
- # Make it per period then negative
- test_amt = (test_amt / 52.0) # Divided by 52 since it is weekly.
- # test_amt = 3479.52
- test_amt = -test_amt
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('SC'),
- state_income_tax_exempt=False,
- sc_w4_sit_allowances=allowances,
- schedule_pay=schedule_pay)
-
- self._log('2019 South Carolina tax first payslip:')
- payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
- payslip.compute_sheet()
- cats = self._getCategories(payslip)
-
- self.assertPayrollAlmostEqual(cats['ER_US_SUTA'], self.SC_UNEMP_MAX_WAGE * self.US_SC_UNEMP)
- self.assertPayrollAlmostEqual(cats['EE_US_SIT'], test_amt)
-
- process_payslip(payslip)
-
- remaining_SC_UNEMP_wages = self.SC_UNEMP_MAX_WAGE - annual if (annual < self.SC_UNEMP_MAX_WAGE) \
- else 0.00
-
- self._log('2019 South Carolina tax second payslip:')
-
- payslip = self._createPayslip(employee, '2019-02-01', '2019-02-28')
- payslip.compute_sheet()
- cats = self._getCategories(payslip)
-
- self.assertEqual(0.0, remaining_SC_UNEMP_wages)
- self.assertPayrollEqual(cats['ER_US_SUTA'], remaining_SC_UNEMP_wages * self.US_SC_UNEMP)
-
- def test_2019_taxes_filing_status(self):
- salary = 20000.00 # Wages per pay period
- schedule_pay = 'monthly'
- annual = salary * 12
- allowances = 1
- # Hand Calculations
- personal_exemption = 2510.00
- standard_deduction = min(3470.00, .1 * annual) # 3470.0 but min is shown for the process
- taxable = annual - personal_exemption - standard_deduction
- # taxable = 234020
- test_amt = ((taxable) * (7.0 / 100.0)) - 467.95 # 15991.850000000002
- test_amt = test_amt / 12.0 # Put it into monthly -> 1332.654166666667
- # Make it negative
- test_amt = -test_amt
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('SC'),
- state_income_tax_exempt=False,
- sc_w4_sit_allowances=allowances,
- schedule_pay=schedule_pay)
-
- self._log('2019 South Carolina 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.SC_UNEMP_MAX_WAGE * self.US_SC_UNEMP)
- self.assertPayrollAlmostEqual(cats['EE_US_SIT'], test_amt)
-
- process_payslip(payslip)
diff --git a/l10n_us_hr_payroll/tests/test_us_sc_south_carolina_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_sc_south_carolina_payslip_2021.py
new file mode 100644
index 00000000..3fb11459
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_sc_south_carolina_payslip_2021.py
@@ -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 TestUsSCPayslip(TestUsPayslip):
+ ###
+ # 2021 Taxes and Rates
+ ###
+ SC_UNEMP_MAX_WAGE = 14000.0
+ SC_UNEMP = 0.55
+ # Calculation based on https://dor.sc.gov/forms-site/Forms/WH1603F_2021.pdf
+
+ def _test_sit(self, wage, additional_withholding, exempt, allowances, schedule_pay, date_start, expected_withholding):
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ state_id=self.get_us_state('SC'),
+ state_income_tax_additional_withholding=additional_withholding,
+ state_income_tax_exempt=exempt,
+ sc_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.assertPayrollAlmostEqual(cats.get('EE_US_SIT', 0.0), -expected_withholding)
+
+ def test_2021_taxes_example(self):
+ self._test_er_suta('SC', self.SC_UNEMP, date(2021, 1, 1), wage_base=self.SC_UNEMP_MAX_WAGE)
+ self._test_sit(750.0, 0.0, False, 3.0, 'weekly', date(2021, 1, 1), 27.57)
+ self._test_sit(800.0, 0.0, True, 0.0, 'weekly', date(2021, 1, 1), 0.00)
+ self._test_sit(9000.0, 0.0, False, 0.0, 'monthly', date(2021, 1, 1), 591.44)
+ self._test_sit(5000.0, 10.0, False, 2.0, 'semi-monthly', date(2021, 1, 1), 312.90)
diff --git a/l10n_us_hr_payroll/tests/test_us_sd_south_dakota_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_sd_south_dakota_payslip_2021.py
new file mode 100644
index 00000000..577a82ec
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_sd_south_dakota_payslip_2021.py
@@ -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 TestUsSDPayslip(TestUsPayslip):
+ # TAXES AND RATES
+ SD_UNEMP_MAX_WAGE = 15000.00
+ SD_UNEMP = 1.75
+
+ def test_2021_taxes(self):
+ self._test_er_suta('SD', self.SD_UNEMP, date(2021, 1, 1), wage_base=self.SD_UNEMP_MAX_WAGE)
diff --git a/l10n_us_hr_payroll/tests/test_us_tn_tennessee_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_tn_tennessee_payslip_2021.py
new file mode 100644
index 00000000..3a3080e6
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_tn_tennessee_payslip_2021.py
@@ -0,0 +1,14 @@
+# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
+
+from datetime import date
+from .common import TestUsPayslip
+
+
+class TestUsTNPayslip(TestUsPayslip):
+ # TAXES AND RATES
+ # todo: 2021 rates not published yet
+ TN_UNEMP_MAX_WAGE = 7000.00
+ TN_UNEMP = 2.7
+
+ def test_2021_taxes(self):
+ self._test_er_suta('TN', self.TN_UNEMP, date(2021, 1, 1), wage_base=self.TN_UNEMP_MAX_WAGE)
diff --git a/l10n_us_hr_payroll/tests/test_us_tx_texas_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_tx_texas_payslip_2019.py
deleted file mode 100755
index 15e657ae..00000000
--- a/l10n_us_hr_payroll/tests/test_us_tx_texas_payslip_2019.py
+++ /dev/null
@@ -1,100 +0,0 @@
-# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
-
-from .common import TestUsPayslip, process_payslip
-from odoo.addons.l10n_us_hr_payroll.models.hr_contract import USHRContract
-
-class TestUsTXPayslip(TestUsPayslip):
- ###
- # 2019 Taxes and Rates
- ###
- TX_UNEMP_MAX_WAGE = 9000.0
- TX_UNEMP = -2.7 / 100.0
- TX_OA = 0.0
- TX_ETIA = -0.1 / 100.0
-
- def test_2019_taxes(self):
- salary = 5000.0
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('TX'),
- )
-
- self._log('2019 Texas tax first payslip:')
- payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
-
- payslip.compute_sheet()
-
- cats = self._getCategories(payslip)
- rules = self._getRules(payslip)
-
- self.assertPayrollEqual(rules['ER_US_TX_SUTA'], salary * self.TX_UNEMP)
- self.assertPayrollEqual(rules['ER_US_TX_SUTA_OA'], salary * self.TX_OA)
- self.assertPayrollEqual(rules['ER_US_TX_SUTA_ETIA'], salary * self.TX_ETIA)
-
- process_payslip(payslip)
-
- # Make a new payslip, this one will have maximums
-
- remaining_tx_unemp_wages = self.TX_UNEMP_MAX_WAGE - salary if (self.TX_UNEMP_MAX_WAGE - 2*salary < salary) \
- else salary
-
- self._log('2019 Texas tax second payslip:')
- payslip = self._createPayslip(employee, '2019-02-01', '2019-02-28')
-
- payslip.compute_sheet()
-
- cats = self._getCategories(payslip)
- rules = self._getRules(payslip)
-
- self.assertPayrollEqual(rules['ER_US_TX_SUTA'], remaining_tx_unemp_wages * self.TX_UNEMP)
-
- def test_2019_taxes_with_external(self):
- salary = 5000.0
- external_wages = 6000.0
-
- employee = self._createEmployee()
-
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('TX'),
- external_wages=external_wages,
- )
-
- self._log('2019 Texas_external tax first payslip:')
- payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
-
- payslip.compute_sheet()
-
- cats = self._getCategories(payslip)
- rules = self._getRules(payslip)
-
- expected_wage = self.TX_UNEMP_MAX_WAGE - external_wages
- self.assertPayrollEqual(rules['ER_US_TX_SUTA'], expected_wage * self.TX_UNEMP)
- self.assertPayrollEqual(rules['ER_US_TX_SUTA_OA'], expected_wage * self.TX_OA)
- self.assertPayrollEqual(rules['ER_US_TX_SUTA_ETIA'], expected_wage * self.TX_ETIA)
-
- def test_2019_taxes_with_state_exempt(self):
- salary = 5000.0
- external_wages = 6000.0
-
- employee = self._createEmployee()
-
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('TX'),
- external_wages=external_wages,
- futa_type=USHRContract.FUTA_TYPE_BASIC)
-
- self._log('2019 Texas_external tax first payslip:')
- payslip = self._createPayslip(employee, '2019-01-01', '2019-01-31')
-
- payslip.compute_sheet()
-
- cats = self._getCategories(payslip)
- rules = self._getRules(payslip)
-
- self.assertPayrollEqual(rules.get('ER_US_TX_SUTA', 0.0), 0.0)
- self.assertPayrollEqual(rules.get('ER_US_TX_SUTA_OA', 0.0), 0.0)
- self.assertPayrollEqual(rules.get('ER_US_TX_SUTA_ETIA', 0.0), 0.0)
diff --git a/l10n_us_hr_payroll/tests/test_us_tx_texas_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_tx_texas_payslip_2021.py
new file mode 100755
index 00000000..14d8066f
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_tx_texas_payslip_2021.py
@@ -0,0 +1,17 @@
+# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
+
+from datetime import date
+from .common import TestUsPayslip
+
+class TestUsTXPayslip(TestUsPayslip):
+ ###
+ # 2021 Taxes and Rates
+ ###
+ TX_UNEMP_MAX_WAGE = 9000.0
+ TX_UNEMP = 2.7
+ TX_OA = 0.0
+ TX_ETIA = 0.1
+
+ def test_2021_taxes(self):
+ combined_rate = self.TX_UNEMP + self.TX_OA + self.TX_ETIA
+ self._test_er_suta('TX', combined_rate, date(2021, 1, 1), wage_base=self.TX_UNEMP_MAX_WAGE)
diff --git a/l10n_us_hr_payroll/tests/test_us_us_utah_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_us_utah_payslip_2021.py
new file mode 100755
index 00000000..0b23b462
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_us_utah_payslip_2021.py
@@ -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 TestUsUTPayslip(TestUsPayslip):
+ ###
+ # 2021 Taxes and Rates
+ ###
+ UT_UNEMP_MAX_WAGE = 38900.0
+ UT_UNEMP = 0.1052
+ # Calculation based on example https://tax.utah.gov/forms/pubs/pub-14.pdf
+
+ 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('UT'),
+ ut_w4_sit_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.assertPayrollAlmostEqual(cats.get('EE_US_SIT', 0.0), -expected_withholding)
+
+ def test_2021_taxes_example(self):
+ self._test_er_suta('UT', self.UT_UNEMP, date(2021, 1, 1), wage_base=self.UT_UNEMP_MAX_WAGE)
+ self._test_sit(400, 'single', 0, 'weekly', date(2021, 1, 1), 16.00)
+ self._test_sit(1000, 'single', 0, 'bi-weekly', date(2021, 1, 1), 45.00)
+ self._test_sit(855, 'married', 0, 'semi-monthly', date(2021, 1, 1), 16.00)
+ self._test_sit(2500, 'married', 0, 'monthly', date(2021, 1, 1), 81.00)
+ self._test_sit(8000, 'head_household', 10, 'quarterly', date(2021, 1, 1), 397.00)
diff --git a/l10n_us_hr_payroll/tests/test_us_va_virginia_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_va_virginia_payslip_2019.py
deleted file mode 100644
index b8f14393..00000000
--- a/l10n_us_hr_payroll/tests/test_us_va_virginia_payslip_2019.py
+++ /dev/null
@@ -1,133 +0,0 @@
-# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
-
-from datetime import date
-from .common import TestUsPayslip, process_payslip
-from odoo.addons.l10n_us_hr_payroll.models.hr_contract import USHRContract
-
-
-class TestUsVaPayslip(TestUsPayslip):
- ###
- # Taxes and Rates
- ###
- VA_UNEMP_MAX_WAGE = 8000.0
- VA_UNEMP = 2.51
- VA_SIT_DEDUCTION = 4500.0
- VA_SIT_EXEMPTION = 930.0
- VA_SIT_OTHER_EXEMPTION = 800.0
-
- def test_2019_taxes(self):
- salary = 5000.0
-
- # For formula from https://www.tax.virginia.gov/withholding-calculator
- """
- Key
- G = Gross Pay for Pay Period P = Pay periods per year
- A = Annualized gross pay E1 = Personal and Dependent Exemptions
- T = Annualized taxable income E2 = Age 65 and Over & Blind Exemptions
- WH = Tax to be withheld for pay period W = Annualized tax to be withheld
- G x P - [$3000+ (E1 x 930) + (E2 x 800)] = T
- Calculate W as follows:
- If T is: W is:
- Not over $3,000 2% of T
- Over But Not Over Then
- $3,000 $5,000 $60 + (3% of excess over $3,000)
- $5,000 $17,000 $120 + (5% of excess over $5,000)
- $17,000 $720 + (5.75% of excess over $17,000)
- W / P = WH
- """
- e1 = 2
- e2 = 0
- t = salary * 12 - (self.VA_SIT_DEDUCTION + (e1 * self.VA_SIT_EXEMPTION) + (e2 * self.VA_SIT_OTHER_EXEMPTION))
-
- if t <= 3000:
- w = 0.02 * t
- elif t <= 5000:
- w = 60 + (0.03 * (t - 3000))
- elif t <= 17000:
- w = 120 + (0.05 * (t - 5000))
- else:
- w = 720 + (0.0575 * (t - 17000))
-
- wh = w / 12
-
- employee = self._createEmployee()
-
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('VA'),
- va_va4_sit_exemptions=e1,
- va_va4_sit_other_exemptions=e2
- )
-
- # tax rates
- va_unemp = self.VA_UNEMP / -100.0
-
- self._log('2019 Virginia 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 * va_unemp)
- self.assertPayrollEqual(cats['EE_US_SIT'], -wh)
-
- process_payslip(payslip)
-
- # Make a new payslip, this one will have maximums
-
- remaining_va_unemp_wages = self.VA_UNEMP_MAX_WAGE - salary if (self.VA_UNEMP_MAX_WAGE - 2*salary < salary) \
- else salary
-
- self._log('2019 Virginia 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'], remaining_va_unemp_wages * va_unemp)
-
- def test_2019_taxes_with_external(self):
- salary = 5000.0
- external_wages = 6000.0
-
- employee = self._createEmployee()
-
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('VA'),
- external_wages=external_wages,
- )
-
- # tax rates
- va_unemp = self.VA_UNEMP / -100.0
-
- self._log('2019 Virginia_external 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.VA_UNEMP_MAX_WAGE - external_wages) * va_unemp)
-
- def test_2019_taxes_with_state_exempt(self):
- salary = 5000.0
- external_wages = 6000.0
-
- employee = self._createEmployee()
-
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('VA'),
- external_wages=external_wages,
- futa_type=USHRContract.FUTA_TYPE_BASIC)
-
- # tax rates
- self._log('2019 Virginia exempt 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'], 0.0)
diff --git a/l10n_us_hr_payroll/tests/test_us_va_virginia_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_va_virginia_payslip_2021.py
new file mode 100644
index 00000000..6a789c06
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_va_virginia_payslip_2021.py
@@ -0,0 +1,116 @@
+# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
+
+from datetime import date
+from .common import TestUsPayslip
+
+
+class TestUsVaPayslip(TestUsPayslip):
+ ###
+ # Taxes and Rates
+ ###
+ VA_UNEMP_MAX_WAGE = 8000.0
+ VA_UNEMP = 2.5
+ VA_SIT_DEDUCTION = 4500.0
+ VA_SIT_EXEMPTION = 930.0
+ VA_SIT_OTHER_EXEMPTION = 800.0
+
+ def _run_test_sit(self,
+ wage=0.0,
+ schedule_pay='monthly',
+ filing_status='single',
+ dependent_credit=0.0,
+ other_income=0.0,
+ deductions=0.0,
+ additional_withholding=0.0,
+ is_nonresident_alien=False,
+ state_income_tax_exempt=False,
+ state_income_tax_additional_withholding=0.0,
+ va_va4_sit_exemptions=0,
+ va_va4_sit_other_exemptions=0,
+ expected=0.0,
+ ):
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ schedule_pay=schedule_pay,
+ fed_941_fit_w4_is_nonresident_alien=is_nonresident_alien,
+ fed_941_fit_w4_filing_status=filing_status,
+ fed_941_fit_w4_multiple_jobs_higher=False,
+ fed_941_fit_w4_dependent_credit=dependent_credit,
+ fed_941_fit_w4_other_income=other_income,
+ fed_941_fit_w4_deductions=deductions,
+ fed_941_fit_w4_additional_withholding=additional_withholding,
+ state_income_tax_exempt=state_income_tax_exempt,
+ state_income_tax_additional_withholding=state_income_tax_additional_withholding,
+ va_va4_sit_exemptions=va_va4_sit_exemptions,
+ va_va4_sit_other_exemptions=va_va4_sit_other_exemptions,
+ state_id=self.get_us_state('VA'),
+ )
+ payslip = self._createPayslip(employee, '2021-01-01', '2021-01-31')
+ payslip.compute_sheet()
+ cats = self._getCategories(payslip)
+ # Instead of PayrollEqual after initial first round of testing.
+ self.assertPayrollAlmostEqual(cats.get('EE_US_SIT', 0.0), -expected)
+ return payslip
+
+ def test_2021_taxes(self):
+ self._test_er_suta('VA', self.VA_UNEMP, date(2021, 1, 1), wage_base=self.VA_UNEMP_MAX_WAGE)
+
+ salary = 5000.0
+
+ # For formula from https://www.tax.virginia.gov/withholding-calculator
+ e1 = 2
+ e2 = 0
+ t = salary * 12 - (self.VA_SIT_DEDUCTION + (e1 * self.VA_SIT_EXEMPTION) + (e2 * self.VA_SIT_OTHER_EXEMPTION))
+
+ if t <= 3000:
+ w = 0.02 * t
+ elif t <= 5000:
+ w = 60 + (0.03 * (t - 3000))
+ elif t <= 17000:
+ w = 120 + (0.05 * (t - 5000))
+ else:
+ w = 720 + (0.0575 * (t - 17000))
+
+ wh = w / 12
+
+ self._run_test_sit(wage=salary,
+ schedule_pay='monthly',
+ state_income_tax_exempt=False,
+ state_income_tax_additional_withholding=0.0,
+ va_va4_sit_exemptions=e1,
+ va_va4_sit_other_exemptions=e2,
+ expected=wh,)
+ self.assertPayrollEqual(wh, 235.57) # To test against calculator
+
+ # Below expected comes from the calculator linked above
+ self._run_test_sit(wage=450.0,
+ schedule_pay='weekly',
+ state_income_tax_exempt=False,
+ state_income_tax_additional_withholding=0.0,
+ va_va4_sit_exemptions=3,
+ va_va4_sit_other_exemptions=1,
+ expected=12.22,)
+ self._run_test_sit(wage=2500.0,
+ schedule_pay='bi-weekly',
+ state_income_tax_exempt=False,
+ state_income_tax_additional_withholding=0.0,
+ va_va4_sit_exemptions=1,
+ va_va4_sit_other_exemptions=0,
+ expected=121.84,)
+ self._run_test_sit(wage=10000.0,
+ schedule_pay='semi-monthly',
+ state_income_tax_exempt=False,
+ state_income_tax_additional_withholding=100.0,
+ va_va4_sit_exemptions=0,
+ va_va4_sit_other_exemptions=1,
+ expected=651.57,)
+
+ # Test exempt
+ self._run_test_sit(wage=2400.0,
+ schedule_pay='monthly',
+ state_income_tax_exempt=True,
+ state_income_tax_additional_withholding=0.0,
+ va_va4_sit_exemptions=1,
+ va_va4_sit_other_exemptions=1,
+ expected=0.0,)
diff --git a/l10n_us_hr_payroll/tests/test_us_vt_vermont_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_vt_vermont_payslip_2021.py
new file mode 100755
index 00000000..67fb7a99
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_vt_vermont_payslip_2021.py
@@ -0,0 +1,37 @@
+# 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 TestUsVTPayslip(TestUsPayslip):
+ ###
+ # 2021 Taxes and Rates
+ ###
+ VT_UNEMP_MAX_WAGE = 14100.0
+ VT_UNEMP = 1.0
+ # Calculation based on example https://tax.vermont.gov/sites/tax/files/documents/WithholdingInstructions.pdf
+
+ def _test_sit(self, wage, filing_status, allowances, additional_withholding, exempt, schedule_pay, date_start, expected_withholding):
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ state_id=self.get_us_state('VT'),
+ vt_w4vt_sit_filing_status=filing_status,
+ vt_w4vt_sit_allowances=allowances,
+ state_income_tax_additional_withholding=additional_withholding,
+ state_income_tax_exempt=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_2021_taxes_example(self):
+ self._test_er_suta('VT', self.VT_UNEMP, date(2021, 1, 1), wage_base=self.VT_UNEMP_MAX_WAGE)
+ self._test_sit(1800, 'married', 2, 0, False, 'weekly', date(2021, 1, 1), 52.79)
+ self._test_sit(1800, 'married', 2, 10, False, 'weekly', date(2021, 1, 1), 62.79)
+ self._test_sit(1000, 'single', 1, 0, True, 'weekly', date(2021, 1, 1), 0.00)
+ self._test_sit(8000, 'single', 1, 10, False, 'bi-weekly', date(2021, 1, 1), 506.52)
diff --git a/l10n_us_hr_payroll/tests/test_us_wa_washington_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_wa_washington_payslip_2021.py
similarity index 63%
rename from l10n_us_hr_payroll/tests/test_us_wa_washington_payslip_2019.py
rename to l10n_us_hr_payroll/tests/test_us_wa_washington_payslip_2021.py
index 88486960..a35e14d6 100755
--- a/l10n_us_hr_payroll/tests/test_us_wa_washington_payslip_2019.py
+++ b/l10n_us_hr_payroll/tests/test_us_wa_washington_payslip_2021.py
@@ -8,11 +8,12 @@ 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
+ WA_FML_RATE_EE = 63.33
+ WA_FML_RATE_ER = 36.67
def setUp(self):
super(TestUsWAPayslip, self).setUp()
@@ -36,7 +37,8 @@ class TestUsWAPayslip(TestUsPayslip):
'parameter_value': str(self.test_er_lni * 100),
})
- def test_2019_taxes(self):
+ def test_2021_taxes(self):
+ self.debug = True
salary = 25000.0
employee = self._createEmployee()
@@ -50,39 +52,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.assertEqual(hours_in_period, 184) # only asserted to test algorithm
+ self.assertPayrollAlmostEqual(hours_in_period, 168.0) # 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)
diff --git a/l10n_us_hr_payroll/tests/test_us_wi_wisconsin_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_wi_wisconsin_payslip_2021.py
new file mode 100755
index 00000000..59a9e814
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_wi_wisconsin_payslip_2021.py
@@ -0,0 +1,39 @@
+# 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 TestUsWIPayslip(TestUsPayslip):
+ ###
+ # 2021 Taxes and Rates
+ ###
+ WI_UNEMP_MAX_WAGE = 14000.0
+ WI_UNEMP = 3.05
+ # Calculation based on example https://www.revenue.wi.gov/DOR%20Publications/pb166.pdf
+
+ def _test_sit(self, wage, filing_status, exemption, additional_withholding, exempt, schedule_pay, date_start, expected_withholding):
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ state_id=self.get_us_state('WI'),
+ wi_wt4_sit_filing_status=filing_status,
+ wi_wt4_sit_exemptions=exemption,
+ state_income_tax_additional_withholding=additional_withholding,
+ state_income_tax_exempt=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.assertPayrollAlmostEqual(cats.get('EE_US_SIT', 0.0), -expected_withholding)
+
+ def test_2021_taxes_example(self):
+ self._test_er_suta('WI', self.WI_UNEMP, date(2021, 1, 1), wage_base=self.WI_UNEMP_MAX_WAGE)
+ self._test_sit(300, 'single', 1, 0, False, 'weekly', date(2021, 1, 1), 7.21)
+ self._test_sit(700, 'married', 3, 0, False, 'bi-weekly', date(2021, 1, 1), 13.35)
+ self._test_sit(7000, 'single', 1, 10, True, 'bi-weekly', date(2021, 1, 1), 0.00)
+ self._test_sit(10000, 'married', 3, 10, False, 'bi-weekly', date(2021, 1, 1), 633.65)
+ # ((48000 - 26227) * (7.0224 /100) + 1073.55 - 44) / 12
+ self._test_sit(4000, 'single', 2, 0, False, 'monthly', date(2021, 1, 1), 213.21)
diff --git a/l10n_us_hr_payroll/tests/test_us_wv_west_virginia_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_wv_west_virginia_payslip_2021.py
new file mode 100755
index 00000000..ec16d379
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_wv_west_virginia_payslip_2021.py
@@ -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 TestUsWVPayslip(TestUsPayslip):
+ ###
+ # 2021 Taxes and Rates
+ ###
+ WV_UNEMP_MAX_WAGE = 12000.0
+ WV_UNEMP = 2.7
+ # Calculation based on example https://tax.wv.gov/Documents/TaxForms/it100.1a.pdf
+
+ def _test_sit(self, wage, filing_status, exemption, additional_withholding, schedule_pay, date_start, expected_withholding):
+ employee = self._createEmployee()
+ contract = self._createContract(employee,
+ wage=wage,
+ state_id=self.get_us_state('WV'),
+ wv_it104_sit_filing_status=filing_status,
+ wv_it104_sit_exemptions=exemption,
+ 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_2021_taxes_example(self):
+ self._test_er_suta('WV', self.WV_UNEMP, date(2021, 1, 1), wage_base=self.WV_UNEMP_MAX_WAGE)
+ self._test_sit(1250, 'married', 2, 0, 'semi-monthly', date(2021, 1, 1), 44.00)
+ self._test_sit(1300, 'single', 1, 0, 'bi-weekly', date(2021, 1, 1), 46.00)
+ self._test_sit(1300, 'single', 1, 10, 'bi-weekly', date(2021, 1, 1), 56.00)
+ self._test_sit(15000, 'single', 2, 0, 'monthly', date(2021, 1, 1), 860.00)
diff --git a/l10n_us_hr_payroll/tests/test_us_wy_wyoming_payslip_2019.py b/l10n_us_hr_payroll/tests/test_us_wy_wyoming_payslip_2019.py
deleted file mode 100644
index a8fa3df8..00000000
--- a/l10n_us_hr_payroll/tests/test_us_wy_wyoming_payslip_2019.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
-
-from datetime import date
-from .common import TestUsPayslip, process_payslip
-
-
-class TestUsWYPayslip(TestUsPayslip):
-
- # TAXES AND RATES
- WY_UNEMP_MAX_WAGE = 25400
- WY_UNEMP = -2.10 / 100.0
-
- def test_2019_taxes(self):
- salary = 15000.00
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('WY'))
-
- self._log('2019 Wyoming 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.WY_UNEMP)
-
- process_payslip(payslip)
-
- # Make a new payslip, this one will have maximums
-
- remaining_wy_unemp_wages = self.WY_UNEMP_MAX_WAGE - salary if (self.WY_UNEMP_MAX_WAGE - 2*salary < salary) \
- else salary
-
- self._log('2019 Wyoming 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'], remaining_wy_unemp_wages * self.WY_UNEMP)
-
- def test_2019_taxes_with_external(self):
- # Wage is the cap itself, 25400
- # so salary is equal to self.WY_UNEMP
- salary = 25400
-
- employee = self._createEmployee()
- contract = self._createContract(employee,
- wage=salary,
- state_id=self.get_us_state('WY'))
-
- self._log('2019 Wyoming External 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.WY_UNEMP)
diff --git a/l10n_us_hr_payroll/tests/test_us_wy_wyoming_payslip_2021.py b/l10n_us_hr_payroll/tests/test_us_wy_wyoming_payslip_2021.py
new file mode 100644
index 00000000..8d651a9a
--- /dev/null
+++ b/l10n_us_hr_payroll/tests/test_us_wy_wyoming_payslip_2021.py
@@ -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 TestUsWYPayslip(TestUsPayslip):
+ # TAXES AND RATES
+ WY_UNEMP_MAX_WAGE = 27300.00
+ WY_UNEMP = 8.5
+
+ def test_2021_taxes(self):
+ self._test_er_suta('WY', self.WY_UNEMP, date(2021, 1, 1), wage_base=self.WY_UNEMP_MAX_WAGE)