From b4842fb04953b6b698348a057d7be7cb436d14c8 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Mon, 9 Nov 2026 14:02:34 -0500 Subject: [PATCH 1/3] Backfill Hawaii's UI taxable wage base to 1970 and set its 2015 new-employer rate Hawaii's wage base follows HRS 383-61: the average annual wage, rounded to the nearest hundred dollars, with special rules for 1988, 1991 and 2008 to 2011. DLIR's December 2019 trust fund evaluation lists every base from 1970 to 2020, and its schedule page lists the bases from 2020. The parameter holds those values, except for 2010: there it holds the statute's $34,920 (90% of the $38,800 rounded average), where DLIR lists $34,900. DLIR's evaluation puts schedule D in effect for 2015, so new employers paid 3.0% (HRS 383-66(a)(2) and 383-68), not the 2.4% that backdating gave. In 2016 and 2017, schedule C sets 2.4%. The commit also: - adds YAML cases for 2010 and for 2015 to 2017; - extends #10700's invariant tables to Hawaii's 2015-2017 values; - adds a parameter-only invariants module for the history. Co-Authored-By: Claude Opus 5.5 --- changelog.d/hi-ui-wage-base-history.fixed.md | 1 + .../payroll/unemployment/default_rate.yaml | 12 +- .../unemployment/taxable_wage_base.yaml | 68 +++- ...er_state_payroll_tax_history_invariants.py | 24 +- ...employment_insurance_history_invariants.py | 355 ++++++++++++++++++ .../hi_employer_state_unemployment_tax.yaml | 56 +++ 6 files changed, 504 insertions(+), 12 deletions(-) create mode 100644 changelog.d/hi-ui-wage-base-history.fixed.md create mode 100644 policyengine_us/tests/core/test_hi_unemployment_insurance_history_invariants.py diff --git a/changelog.d/hi-ui-wage-base-history.fixed.md b/changelog.d/hi-ui-wage-base-history.fixed.md new file mode 100644 index 00000000000..4c0304bceec --- /dev/null +++ b/changelog.d/hi-ui-wage-base-history.fixed.md @@ -0,0 +1 @@ +Set Hawaii's employer unemployment insurance taxable wage base for every year from 1970, and its new-employer rate from 2015, when it was 3% under schedule D. diff --git a/policyengine_us/parameters/gov/states/hi/tax/payroll/unemployment/default_rate.yaml b/policyengine_us/parameters/gov/states/hi/tax/payroll/unemployment/default_rate.yaml index 97a1d432f70..2b67fe288cc 100644 --- a/policyengine_us/parameters/gov/states/hi/tax/payroll/unemployment/default_rate.yaml +++ b/policyengine_us/parameters/gov/states/hi/tax/payroll/unemployment/default_rate.yaml @@ -1,7 +1,13 @@ description: Hawaii assigns this unemployment insurance contribution rate to each new employer. values: - # These rates leave out the 0.01% employment and training assessment that - # Section 383-129 adds to contributions. + # New employers take the rate for a .0000 reserve ratio on the year's + # schedule (Section 383-66(a)(2)). DLIR's evaluation puts schedule D in + # effect for 2015 and C for 2016 to 2020, which Section 383-68 sets at 3.0% + # and 2.4% for that reserve ratio. These rates leave out the 0.01% + # employment and training assessment that Section 383-129 adds to + # contributions. + 2015-01-01: 0.03 + 2016-01-01: 0.024 2018-01-01: 0.024 2021-01-01: 0.03 2023-01-01: 0.04 @@ -15,7 +21,7 @@ metadata: reference: - title: Hawaii Department of Labor and Industrial Relations, Tax Rate Schedule and Weekly Benefit Amount (new employer rate and taxable wage base, 2020 to 2026) href: https://labor.hawaii.gov/ui/tax-rate-schedule-and-weekly-benefit-amount/ - - title: Hawaii Department of Labor and Industrial Relations, Annual Evaluation of the Unemployment Compensation Trust Fund, December 2019 (rate schedules and taxable wage bases for 2018 and 2019) + - title: "Hawaii Department of Labor and Industrial Relations, Annual Evaluation of the Unemployment Compensation Trust Fund, December 2019 (contribution rate schedules and the schedule in effect, 2015 to 2020) #page 5,22,27" href: https://labor.hawaii.gov/wp-content/uploads/2020/01/UI-Fund-Evaluation-2020.pdf#page=5 - title: Hawaii Revised Statutes Section 383-66(a)(2), contribution rate for new or newly covered employers href: https://data.capitol.hawaii.gov/hrscurrent/Vol07_Ch0346-0398/HRS0383/HRS_0383-0066.htm diff --git a/policyengine_us/parameters/gov/states/hi/tax/payroll/unemployment/taxable_wage_base.yaml b/policyengine_us/parameters/gov/states/hi/tax/payroll/unemployment/taxable_wage_base.yaml index bf2c23385ad..a961c0ecc06 100644 --- a/policyengine_us/parameters/gov/states/hi/tax/payroll/unemployment/taxable_wage_base.yaml +++ b/policyengine_us/parameters/gov/states/hi/tax/payroll/unemployment/taxable_wage_base.yaml @@ -1,5 +1,67 @@ description: Hawaii limits employer unemployment insurance contributions to this amount of each worker's annual wages. values: + # Section 383-61(b) sets the base at the average annual wage for the four + # quarters ending June 30 of the preceding year, rounded to the nearest + # hundred dollars. Subsections (c) and (d) set the years marked below. DLIR + # lists the bases from 1970 to 2020 in its December 2019 trust fund + # evaluation and the bases from 2020 on its tax rate schedule page. + 1970-01-01: 5_500 + 1971-01-01: 6_000 + 1972-01-01: 6_300 + 1973-01-01: 6_500 + 1974-01-01: 6_800 + 1975-01-01: 7_300 + 1976-01-01: 7_800 + 1977-01-01: 9_300 + 1978-01-01: 9_800 + 1979-01-01: 10_400 + 1980-01-01: 11_200 + 1981-01-01: 12_200 + 1982-01-01: 13_100 + 1983-01-01: 13_800 + 1984-01-01: 14_600 + 1985-01-01: 15_100 + 1986-01-01: 15_600 + 1987-01-01: 16_500 + # Section 383-61(d)(3) set 1988 at half the average annual wage, because the + # ratio of the current to the adequate reserve fund, 2.08, reached 1.2. + 1988-01-01: 8_700 + 1989-01-01: 18_600 + 1990-01-01: 19_900 + # Section 383-61(c) set 1991 at $7,000, the federal unemployment tax base. + 1991-01-01: 7_000 + 1992-01-01: 22_700 + 1993-01-01: 23_900 + 1994-01-01: 25_000 + 1995-01-01: 25_500 + 1996-01-01: 25_800 + 1997-01-01: 26_000 + 1998-01-01: 26_400 + 1999-01-01: 27_000 + 2000-01-01: 27_500 + 2001-01-01: 28_400 + 2002-01-01: 29_300 + 2003-01-01: 30_200 + 2004-01-01: 31_000 + 2005-01-01: 32_300 + 2006-01-01: 34_000 + 2007-01-01: 35_300 + # Section 383-61(c) set 2008 and 2009 at $13,000 while the trust fund held + # at least the adequate reserve (Act 110 of 2007). + 2008-01-01: 13_000 + 2009-01-01: 13_000 + # Section 383-61(c) set 2010 and 2011 at 90% of the average annual wage + # (Act 2 of 2010, retroactive to January 1, 2010). Subsection (b) rounds the + # average to the nearest hundred dollars, so 2010 takes 90% of $38,800. + # DLIR's evaluation lists $34,900 for 2010, rounding the 90% figure too. + 2010-01-01: 34_920 + 2011-01-01: 34_200 + 2012-01-01: 38_800 + 2013-01-01: 39_600 + 2014-01-01: 40_400 + 2015-01-01: 40_900 + 2016-01-01: 42_200 + 2017-01-01: 44_000 2018-01-01: 45_900 2019-01-01: 46_800 2020-01-01: 48_100 @@ -15,7 +77,9 @@ metadata: unit: currency-USD label: Hawaii unemployment taxable wage base reference: + - title: Hawaii Revised Statutes Section 383-61, payment of contributions; wages not included + href: https://data.capitol.hawaii.gov/hrscurrent/Vol07_Ch0346-0398/HRS0383/HRS_0383-0061.htm + - title: "Hawaii Department of Labor and Industrial Relations, Annual Evaluation of the Unemployment Compensation Trust Fund, December 2019 (taxable wage bases, 1970 to 2020) #page 9,29" + href: https://labor.hawaii.gov/wp-content/uploads/2020/01/UI-Fund-Evaluation-2020.pdf#page=9 - title: Hawaii Department of Labor and Industrial Relations, Tax Rate Schedule and Weekly Benefit Amount (new employer rate and taxable wage base, 2020 to 2026) href: https://labor.hawaii.gov/ui/tax-rate-schedule-and-weekly-benefit-amount/ - - title: Hawaii Department of Labor and Industrial Relations, Annual Evaluation of the Unemployment Compensation Trust Fund, December 2019 (rate schedules and taxable wage bases for 2018 and 2019) - href: https://labor.hawaii.gov/wp-content/uploads/2020/01/UI-Fund-Evaluation-2020.pdf#page=5 diff --git a/policyengine_us/tests/core/test_employer_state_payroll_tax_history_invariants.py b/policyengine_us/tests/core/test_employer_state_payroll_tax_history_invariants.py index b4289c71fd3..410598c7354 100644 --- a/policyengine_us/tests/core/test_employer_state_payroll_tax_history_invariants.py +++ b/policyengine_us/tests/core/test_employer_state_payroll_tax_history_invariants.py @@ -16,10 +16,10 @@ default rate and taxable wage base equal the published value for that month, and so do New Jersey's employer TDI and workforce fund rates, Rhode Island's Job Development Fund rate and 2019 adjustment, and Alaska's - employee contribution rate. Apart from Minnesota's wage base, which keeps - DEED's 2014-2017 values, the parameters start in 2018, so 2015-2017 read - the value in force on January 1, 2018, an intended approximation that this - test pins. + employee contribution rate. Minnesota's wage base keeps DEED's 2014-2017 + values, and Hawaii's rate and wage base keep DLIR's earlier values. The + other parameters start in 2018, so 2015-2017 read the value in force on + January 1, 2018, an intended approximation that this test pins. 2. Dates: every stored value of a parameter that an annual rate averages begins a calendar quarter. The annual rates read only the four quarter starts, so this keeps them equal to the average of all twelve months. @@ -657,9 +657,17 @@ } # END PUBLISHED_SUTA -# Minnesota's wage base keeps its 2015-2017 values (DEED, history of tax rate -# factors); every other parameter reads its 2018 value in those years. -PRE_2018_WAGE_BASE = {"MN": {2015: 30_000, 2016: 31_000, 2017: 32_000}} +# Minnesota's wage base (DEED, history of tax rate factors) and Hawaii's rate +# and wage base (DLIR, December 2019 trust fund evaluation, Appendix B: the +# schedule in effect and the taxable wage base) keep their 2015-2017 values; +# every other parameter reads its 2018 value in those years. Hawaii's new +# employers take the .0000 reserve ratio rate of schedule D in 2015 and of +# schedule C in 2016 and 2017 (HRS 383-66(a)(2) and 383-68). +PRE_2018_WAGE_BASE = { + "HI": {2015: 40_900, 2016: 42_200, 2017: 44_000}, + "MN": {2015: 30_000, 2016: 31_000, 2017: 32_000}, +} +PRE_2018_RATE = {"HI": {2015: 0.03, 2016: 0.024, 2017: 0.024}} # New Jersey Department of Labor and Workforce Development, rate information: # new-employer TDI rate and workforce development and supplemental workforce @@ -704,6 +712,8 @@ def _annual_rate(code, year): def _rate_in_month(code, year, month): + if year in PRE_2018_RATE.get(code, {}): + return PRE_2018_RATE[code][year] if year < FIRST_PUBLISHED_YEAR: # Backdating copies the first stored value to earlier years. return _quarterly_rates(code, FIRST_PUBLISHED_YEAR)[0] diff --git a/policyengine_us/tests/core/test_hi_unemployment_insurance_history_invariants.py b/policyengine_us/tests/core/test_hi_unemployment_insurance_history_invariants.py new file mode 100644 index 00000000000..ee75173e887 --- /dev/null +++ b/policyengine_us/tests/core/test_hi_unemployment_insurance_history_invariants.py @@ -0,0 +1,355 @@ +"""Invariants for Hawaii's unemployment insurance wage base and new-employer rate. + +HRS 383-61(b) sets the taxable wage base at the average annual wage for the +four quarters ending June 30 of the preceding year, rounded to the nearest +hundred dollars. Subsections (c) and (d) set 1988, 1991 and 2008 to 2011 +otherwise, and subsections (d) and (f) keep the base at or above the federal +unemployment tax base. HRS 392-43(b)(2) caps temporary disability insurance +benefits from the same average annual wage, so the Department of Labor and +Industrial Relations (DLIR) prints it, to the cent, in each year's TDI notice. + +The tables below copy DLIR's publications, not the parameters: + +- WAGE_BASE: the taxable wage bases in DLIR's December 2019 trust fund + evaluation (Appendix B, 1970 to 2020) and on its tax rate schedule page + (2020 to 2026); +- RESERVE_RATIO and SCHEDULE: the evaluation's ratio of the current to the + adequate reserve fund and the rate schedule in effect, for the rate years + that the tests below use, with the schedule page's schedules from 2021; +- AVERAGE_ANNUAL_WAGE: the average annual wage in DLIR's TDI notices for 2004 + to 2026. + +The tests read only parameters, so they build no simulation: + +1. Publication: on every date from 1970 through 2026, the wage base equals + DLIR's base for that year, apart from 2010 (see 4). A sweep checks the + first and last day of each year, and Hypothesis draws other dates. +2. Dates: every stored wage base starts on January 1. +3. Formula: in each year that the notices cover and that subsections (c) and + (d) leave alone, the base equals the average annual wage rounded half up + to the nearest hundred dollars. +4. Special years: 1991 is $7,000, and 2008 and 2009 are $13,000 with the fund + at or above its adequate reserve (subsection (c)). Subsection (d) sets 1988 + at 50% of the average annual wage for a reserve ratio of 1.2 or more, and + DLIR's $8,700 doubles to an average between the 1987 and 1989 bases. 2010 + and 2011 take 90% of the average annual wage, which subsection (b) rounds + to the nearest hundred dollars. That gives $34,920 for 2010, which the + parameter holds. DLIR's $34,900 also rounds the 90% figure, an intended + difference that source_conflicts/candidates.yaml records as + us-hi:ui-taxable-wage-base-2010-rounding. +5. Federal floor: the base never falls below the highest federal unemployment + tax base enacted by its year, and 1991 meets the $7,000 federal base. +6. New employers: from 2015, the default rate equals the rate that HRS + 383-68 sets for a .0000 reserve ratio on the year's schedule, as HRS + 383-66(a)(2) assigns to new employers. +""" + +from datetime import date +from decimal import ROUND_HALF_UP, Decimal + +from hypothesis import given, settings +from hypothesis import strategies as st + +from policyengine_us.system import system + +HI = system.parameters.gov.states.hi.tax.payroll.unemployment +FUTA = system.parameters.gov.irs.payroll.federal_unemployment + +# DLIR, Annual Evaluation of the Unemployment Compensation Trust Fund, December +# 2019, Appendix B, Total and Taxable Wages (1970 to 2020), and DLIR, Tax Rate +# Schedule and Weekly Benefit Amount (2020 to 2026). +WAGE_BASE = { + 1970: 5_500, + 1971: 6_000, + 1972: 6_300, + 1973: 6_500, + 1974: 6_800, + 1975: 7_300, + 1976: 7_800, + 1977: 9_300, + 1978: 9_800, + 1979: 10_400, + 1980: 11_200, + 1981: 12_200, + 1982: 13_100, + 1983: 13_800, + 1984: 14_600, + 1985: 15_100, + 1986: 15_600, + 1987: 16_500, + 1988: 8_700, + 1989: 18_600, + 1990: 19_900, + 1991: 7_000, + 1992: 22_700, + 1993: 23_900, + 1994: 25_000, + 1995: 25_500, + 1996: 25_800, + 1997: 26_000, + 1998: 26_400, + 1999: 27_000, + 2000: 27_500, + 2001: 28_400, + 2002: 29_300, + 2003: 30_200, + 2004: 31_000, + 2005: 32_300, + 2006: 34_000, + 2007: 35_300, + 2008: 13_000, + 2009: 13_000, + 2010: 34_900, + 2011: 34_200, + 2012: 38_800, + 2013: 39_600, + 2014: 40_400, + 2015: 40_900, + 2016: 42_200, + 2017: 44_000, + 2018: 45_900, + 2019: 46_800, + 2020: 48_100, + 2021: 47_400, + 2022: 51_600, + 2023: 56_700, + 2024: 59_100, + 2025: 62_000, + 2026: 64_500, +} +FIRST_YEAR = min(WAGE_BASE) +LAST_YEAR = max(WAGE_BASE) + +# HRS 383-61(c) sets 2010 at 90% of the rounded average annual wage; DLIR's +# table rounds that figure to $34,900. +STATUTE_READING = {2010: 34_920} + +# The evaluation's Appendix B, Ratio of Current to Adequate Reserve Fund. The +# current reserve fund is the trust fund's assets on November 30 of the year +# before the rate year. +RESERVE_RATIO = {1988: 2.08, 2008: 2.25, 2009: 1.77} + +# Rate schedule in effect: the evaluation's Appendix B through 2020, HRS +# 383-68(c) for 2021 and 2022, and DLIR's schedule page from 2023. +SCHEDULE = { + 2015: "D", + 2016: "C", + 2017: "C", + 2018: "C", + 2019: "C", + 2020: "C", + 2021: "D", + 2022: "D", + 2023: "F", + 2024: "D", + 2025: "C", + 2026: "C", +} + +# HRS 383-68(d), contribution rates for a reserve ratio of .0000 to .0299. +ZERO_RESERVE_RATE = { + "A": "0.017", + "B": "0.019", + "C": "0.024", + "D": "0.030", + "E": "0.034", + "F": "0.040", + "G": "0.046", + "H": "0.052", +} + +# Average annual wage under HRS 383-61(b), from DLIR Disability Compensation +# Division notices of the TDI maximum weekly wage base, with each notice. +AVERAGE_ANNUAL_WAGE = { + 2004: ( + "30972.13", + "https://web.archive.org/web/20050226051453/http://hawaii.gov:80/labor/dcd/pdf/TDI/2004%20TDI%20Wage%20Base.pdf", + ), + 2005: ( + "32336.24", + "https://web.archive.org/web/20050226052914/http://hawaii.gov:80/labor/dcd/pdf/general/2005_WAGE_BASE.pdf", + ), + 2006: ( + "34023.65", + "https://web.archive.org/web/20060227223955/http://hawaii.gov:80/labor/dcd/pdf/general/2006_WAGE_BASE.pdf", + ), + 2007: ( + "35250.68", + "https://web.archive.org/web/20080719002041/http://hawaii.gov/labor/dcd/PDF/general/2007_Wage_Base_12-1-06.pdf", + ), + 2008: ( + "36209.17", + "https://web.archive.org/web/20080724052848/http://hawaii.gov/labor/dcd/PDF/general/WAGE%20BASE-2008%20%28PDF%29.pdf", + ), + 2009: ( + "37718.93", + "https://web.archive.org/web/20121025001236/http://hawaii.gov/labor/dcd/PDF/general/2009%20Wage%20Base.pdf", + ), + 2010: ( + "38750.59", + "https://web.archive.org/web/20101215215838/http://hawaii.gov/labor/dcd/PDF/general/2010%20Wage%20Base.pdf", + ), + 2011: ( + "38002.62", + "https://web.archive.org/web/20101215215837/http://hawaii.gov/labor/dcd/PDF/general/2011%20Wage%20Base.pdf", + ), + 2012: ( + "38818.32", + "https://web.archive.org/web/20121024102028/http://hawaii.gov/labor/dcd/PDF/general/2012%20Wage%20Base.pdf", + ), + 2013: ( + "39613.57", + "https://web.archive.org/web/20141030021517/http://labor.hawaii.gov/dcd/files/2013/01/Old-Wage-Base.pdf", + ), + 2014: ( + "40398.56", + "https://web.archive.org/web/20141030011206/http://labor.hawaii.gov/dcd/files/2013/01/New-Wage-Base.pdf", + ), + 2015: ( + "40879.44", + "https://web.archive.org/web/20160824005208/http://labor.hawaii.gov:80/dcd/files/2013/01/2015-Wage-Base.pdf", + ), + 2016: ( + "42217.41", + "https://web.archive.org/web/20160706000230/http://labor.hawaii.gov:80/dcd/files/2014/11/2016.pdf", + ), + 2017: ( + "43976.82", + "https://web.archive.org/web/20171101222709/https://labor.hawaii.gov/dcd/files/2013/01/17Wbase.pdf", + ), + 2018: ( + "45924.45", + "https://labor.hawaii.gov/dcd/files/2017/11/2018.pdf", + ), + 2019: ( + "46760.69", + "https://labor.hawaii.gov/dcd/files/2018/11/2019wagebase.pdf", + ), + 2020: ( + "48108.20", + "https://web.archive.org/web/20201017202041/https://labor.hawaii.gov/dcd/files/2019/11/newWBA.pdf", + ), + 2021: ( + "47397.51", + "https://web.archive.org/web/20201204141806/https://labor.hawaii.gov/dcd/files/2019/11/newWBA.pdf", + ), + 2022: ( + "51582.77", + "https://web.archive.org/web/20220819164238/https://labor.hawaii.gov/dcd/files/2019/11/newWBA.pdf", + ), + 2023: ( + "56662.05", + "https://web.archive.org/web/20230306111219/https://labor.hawaii.gov/dcd/files/2019/11/newWBA.pdf", + ), + 2024: ( + "59081.47", + "https://labor.hawaii.gov/dcd/files/2023/11/2024-Max-Weekly-Wage-Base-Weekly-Benefit-Amount.pdf", + ), + 2025: ( + "61958.21", + "https://labor.hawaii.gov/dcd/files/2023/05/2025-Max-Weekly-Wage-Base-Rev-2025.03.pdf", + ), + 2026: ( + "64471.82", + "https://labor.hawaii.gov/dcd/files/2025/12/2026-Maximum-Weekly-Wage-Base.pdf", + ), +} +SPECIAL_YEARS = {1988, 1991, 2008, 2009, 2010, 2011} + + +def _base(year): + return HI.taxable_wage_base(f"{year}-01-01") + + +def _expected(year): + return STATUTE_READING.get(year, WAGE_BASE[year]) + + +def _round_to_hundred(amount): + return int(Decimal(amount).quantize(Decimal("1E2"), rounding=ROUND_HALF_UP)) + + +def _average_annual_wage(year): + # HRS 383-61(b): the quotient, rounded to the nearest hundred dollars. + return _round_to_hundred(AVERAGE_ANNUAL_WAGE[year][0]) + + +def _subsection_d_share(ratio): + # HRS 383-61(d)(1) to (3), for 1988 only. + if ratio <= 0.8: + return Decimal("1") + if ratio < 1.2: + return Decimal("0.75") + return Decimal("0.5") + + +def _highest_federal_base_enacted(year): + # 26 U.S.C. 3306(b)(1). Public Law 91-373 (August 10, 1970) raised the base + # from $3,000 to $4,200, Public Law 94-566 (October 20, 1976) to $6,000, + # and Public Law 97-248 to $7,000 for remuneration paid after 1982. + if year < 1976: + return 4_200 + if year < 1983: + return 6_000 + return FUTA.taxable_wage_base(f"{year}-01-01") + + +def test_tables_cover_every_year(): + assert sorted(WAGE_BASE) == list(range(FIRST_YEAR, LAST_YEAR + 1)) + assert sorted(AVERAGE_ANNUAL_WAGE) == list(range(2004, LAST_YEAR + 1)) + assert sorted(SCHEDULE) == list(range(2015, LAST_YEAR + 1)) + + +def test_wage_base_equals_the_published_base_on_the_first_and_last_day(): + for year in range(FIRST_YEAR, LAST_YEAR + 1): + for day in (f"{year}-01-01", f"{year}-12-31"): + assert HI.taxable_wage_base(day) == _expected(year), day + + +@settings(max_examples=200, deadline=None) +@given(st.dates(min_value=date(FIRST_YEAR, 1, 1), max_value=date(LAST_YEAR, 12, 31))) +def test_wage_base_equals_the_published_base_on_any_date(day): + assert HI.taxable_wage_base(day.isoformat()) == _expected(day.year) + + +def test_stored_wage_bases_start_on_january_first(): + stored = [value.instant_str for value in HI.taxable_wage_base.values_list] + assert min(stored) == f"{FIRST_YEAR}-01-01" + assert all(instant.endswith("-01-01") for instant in stored), stored + + +def test_wage_base_follows_the_average_annual_wage(): + for year in sorted(set(AVERAGE_ANNUAL_WAGE) - SPECIAL_YEARS): + assert _base(year) == _average_annual_wage(year), year + assert WAGE_BASE[year] == _average_annual_wage(year), year + + +def test_special_years_follow_subsections_c_and_d(): + assert _base(1991) == 7_000 + for year in (2008, 2009): + assert RESERVE_RATIO[year] >= 1, year + assert _base(year) == 13_000, year + + share = _subsection_d_share(RESERVE_RATIO[1988]) + assert share == Decimal("0.5") + assert _base(1987) < Decimal(_base(1988)) / share < _base(1989) + + for year in (2010, 2011): + ninety_percent = Decimal("0.9") * _average_annual_wage(year) + assert _base(year) == ninety_percent, year + assert WAGE_BASE[year] == _round_to_hundred(ninety_percent), year + assert _base(2010) == 34_920 + assert WAGE_BASE[2010] == 34_900 + + +def test_wage_base_stays_at_or_above_the_federal_base(): + for year in range(FIRST_YEAR, LAST_YEAR + 1): + assert _base(year) >= _highest_federal_base_enacted(year), year + assert _base(1991) == _highest_federal_base_enacted(1991) == 7_000 + + +def test_new_employer_rate_is_the_zero_reserve_rate_of_the_schedule(): + for year, schedule in SCHEDULE.items(): + for day in (f"{year}-01-01", f"{year}-12-31"): + rate = Decimal(str(HI.default_rate(day))) + assert rate == Decimal(ZERO_RESERVE_RATE[schedule]), day diff --git a/policyengine_us/tests/policy/baseline/gov/states/hi/tax/payroll/unemployment/hi_employer_state_unemployment_tax.yaml b/policyengine_us/tests/policy/baseline/gov/states/hi/tax/payroll/unemployment/hi_employer_state_unemployment_tax.yaml index 89f73abc5a4..3eda8650676 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/hi/tax/payroll/unemployment/hi_employer_state_unemployment_tax.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/tax/payroll/unemployment/hi_employer_state_unemployment_tax.yaml @@ -1,3 +1,48 @@ +- name: Hawaii 2010 taxes wages up to 90% of the $38,800 average annual wage. + period: 2010 + absolute_error_margin: 0.01 + input: + state_code: HI + employment_income: 40_000 + output: + taxable_earnings_for_state_unemployment_tax: 34_920 + +- name: Hawaii 2015, its 3% new-employer rate on the $40,900 wage base. + period: 2015 + absolute_error_margin: 0.01 + input: + state_code: HI + employment_income: 100_000 + output: + taxable_earnings_for_state_unemployment_tax: 40_900 + employer_state_unemployment_tax_default_rate: 0.03 + hi_employer_state_unemployment_tax: 1_227 + employer_state_unemployment_tax: 1_227 + +- name: Hawaii 2016, its 2.4% new-employer rate on the $42,200 wage base. + period: 2016 + absolute_error_margin: 0.01 + input: + state_code: HI + employment_income: 100_000 + output: + taxable_earnings_for_state_unemployment_tax: 42_200 + employer_state_unemployment_tax_default_rate: 0.024 + hi_employer_state_unemployment_tax: 1_012.80 + employer_state_unemployment_tax: 1_012.80 + +- name: Hawaii 2017, its 2.4% new-employer rate on the $44,000 wage base. + period: 2017 + absolute_error_margin: 0.01 + input: + state_code: HI + employment_income: 100_000 + output: + taxable_earnings_for_state_unemployment_tax: 44_000 + employer_state_unemployment_tax_default_rate: 0.024 + hi_employer_state_unemployment_tax: 1_056 + employer_state_unemployment_tax: 1_056 + - name: Hawaii 2018, its 2.4% new-employer rate on the $45,900 wage base. period: 2018 absolute_error_margin: 0.01 @@ -106,6 +151,17 @@ hi_employer_state_unemployment_tax: 1_548 employer_state_unemployment_tax: 1_548 +- name: Hawaii 2015 taxes every dollar of wages below the wage base at 3%. + period: 2015 + absolute_error_margin: 0.01 + input: + state_code: HI + employment_income: 30_000 + output: + taxable_earnings_for_state_unemployment_tax: 30_000 + hi_employer_state_unemployment_tax: 900 + employer_state_unemployment_tax: 900 + - name: Hawaii 2018 taxes every dollar of wages below the wage base. period: 2018 absolute_error_margin: 0.01 From 9a90cff5202610b0c0a58176c88eb3b9767efa83 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Mon, 9 Nov 2026 14:07:26 -0500 Subject: [PATCH 2/3] Record Hawaii's 2010 wage base reading as a source-conflict candidate HRS 383-61(b) rounds the average annual wage to the nearest hundred dollars, and subsection (c) takes 90% of it for 2010 with no further rounding, so the base is $34,920. DLIR lists $34,900. PE-US follows the statute. This records the conflict as step 1 of the register process in CONTRIBUTING. Co-Authored-By: Claude Opus 5.5 --- source_conflicts/candidates.yaml | 39 ++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index 542258dfa65..b1ae5bff1c8 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -3187,6 +3187,45 @@ candidates: prs: [] state: unreviewed note: PE-US follows state rules; verify their effective text throughout the historical periods. +- id: us-hi:ui-taxable-wage-base-2010-rounding + program: unemployment-insurance + years: + from: 2010 + to: 2010 + type: calendar + question: Is Hawaii's 2010 unemployment insurance taxable wage base 90% of the average annual wage that HRS + 383-61(b) rounds to the nearest hundred dollars, $34,920, or that figure rounded to the nearest hundred dollars + again, the $34,900 that DLIR lists? + sources: + - kind: statute + citation: HRS 383-61(b) and (c), as amended by Act 2, SLH 2010, section 3 + url: https://data.capitol.hawaii.gov/hrscurrent/Vol07_Ch0346-0398/HRS0383/HRS_0383-0061.htm + - kind: agency-practice + citation: Hawaii DLIR, Annual Evaluation of the Unemployment Compensation Trust Fund, December 2019, Appendix B, + Total and Taxable Wages + url: https://labor.hawaii.gov/wp-content/uploads/2020/01/UI-Fund-Evaluation-2020.pdf#page=29 + - kind: guidance + citation: Hawaii DLIR Disability Compensation Division, 2010 maximum weekly wage base notice (average annual wage + of $38,750.59) + url: https://web.archive.org/web/20101215215838/http://hawaii.gov/labor/dcd/PDF/general/2010%20Wage%20Base.pdf + readings: + statute: Subsection (b) computes the average annual wage and rounds it to the nearest hundred dollars, $38,800 for + 2010. Subsection (c) excludes wages above 90% of that average in 2010 and 2011 and rounds no further, which gives + $34,920. + other: DLIR lists a 2010 taxable wage base of $34,900, 90% of the average annual wage rounded to the nearest + hundred dollars, whether or not DLIR rounds the average first. + example: A worker paid $40,000 in 2010 has $34,920 of taxable wages under the statute's reading and $34,900 under + DLIR's, $20 apart, so each percentage point of contribution rate moves the employer's 2010 contribution by $0.20. + pe_us: + follows: statute + code: + - policyengine_us/parameters/gov/states/hi/tax/payroll/unemployment/taxable_wage_base.yaml + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10770 + state: ruled + note: Subsection (b) defines the average annual wage as the rounded quotient, and subsection (c) applies 90% to that + average without a rounding rule of its own, so the text settles the reading. 2011 has no gap, since 90% of $38,000 + is $34,200 in both readings. PE-US's first modelled year is 2015, so the choice moves no modelled amount. - id: us-ia:alternate-tax-claimed-spouse program: income-tax years: From ba38807b4ed257ca0dc2b182a15e318a65210a52 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Mon, 9 Nov 2026 14:53:17 -0500 Subject: [PATCH 3/3] Correct Hawaii's wage base notes and the 1982 federal floor - The invariants module said HRS 392-43(b)(2) caps TDI benefits. It caps the weekly wages subject to TDI contributions. - The federal floor helper now returns $7,000 from 1982, the year Public Law 97-248 enacted it. - The 2008 comment now says that Act 110 of 2007 first set $13,000 for 2008 to 2010. - The module docstring and the SCHEDULE comment now name the same sources. - The source-conflict note ties the modelled years to FIRST_MODELED_YEAR. Co-Authored-By: Claude Opus 5.5 --- .../unemployment/taxable_wage_base.yaml | 3 ++- ...employment_insurance_history_invariants.py | 27 +++++++++++-------- source_conflicts/candidates.yaml | 3 ++- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/policyengine_us/parameters/gov/states/hi/tax/payroll/unemployment/taxable_wage_base.yaml b/policyengine_us/parameters/gov/states/hi/tax/payroll/unemployment/taxable_wage_base.yaml index a961c0ecc06..b924afe98e1 100644 --- a/policyengine_us/parameters/gov/states/hi/tax/payroll/unemployment/taxable_wage_base.yaml +++ b/policyengine_us/parameters/gov/states/hi/tax/payroll/unemployment/taxable_wage_base.yaml @@ -47,7 +47,8 @@ values: 2006-01-01: 34_000 2007-01-01: 35_300 # Section 383-61(c) set 2008 and 2009 at $13,000 while the trust fund held - # at least the adequate reserve (Act 110 of 2007). + # at least the adequate reserve. Act 110 of 2007 first set $13,000 for 2008 + # to 2010, and Act 2 of 2010 gave 2010 the 90% rule below. 2008-01-01: 13_000 2009-01-01: 13_000 # Section 383-61(c) set 2010 and 2011 at 90% of the average annual wage diff --git a/policyengine_us/tests/core/test_hi_unemployment_insurance_history_invariants.py b/policyengine_us/tests/core/test_hi_unemployment_insurance_history_invariants.py index ee75173e887..0d9589654ef 100644 --- a/policyengine_us/tests/core/test_hi_unemployment_insurance_history_invariants.py +++ b/policyengine_us/tests/core/test_hi_unemployment_insurance_history_invariants.py @@ -4,18 +4,21 @@ four quarters ending June 30 of the preceding year, rounded to the nearest hundred dollars. Subsections (c) and (d) set 1988, 1991 and 2008 to 2011 otherwise, and subsections (d) and (f) keep the base at or above the federal -unemployment tax base. HRS 392-43(b)(2) caps temporary disability insurance -benefits from the same average annual wage, so the Department of Labor and -Industrial Relations (DLIR) prints it, to the cent, in each year's TDI notice. +unemployment tax base. HRS 392-43(b)(2) caps the weekly wages subject to +temporary disability insurance (TDI) contributions at 1.21 times one +fifty-second of the same average annual wage, and the Department of Labor and +Industrial Relations (DLIR) prints that average, to the cent, in each year's +TDI notice. The tables below copy DLIR's publications, not the parameters: - WAGE_BASE: the taxable wage bases in DLIR's December 2019 trust fund evaluation (Appendix B, 1970 to 2020) and on its tax rate schedule page (2020 to 2026); -- RESERVE_RATIO and SCHEDULE: the evaluation's ratio of the current to the - adequate reserve fund and the rate schedule in effect, for the rate years - that the tests below use, with the schedule page's schedules from 2021; +- RESERVE_RATIO: the evaluation's ratio of the current to the adequate + reserve fund for 1988, 2008 and 2009; +- SCHEDULE: the rate schedule in effect, from the evaluation through 2020 and + from the schedule page from 2021; - AVERAGE_ANNUAL_WAGE: the average annual wage in DLIR's TDI notices for 2004 to 2026. @@ -38,7 +41,8 @@ difference that source_conflicts/candidates.yaml records as us-hi:ui-taxable-wage-base-2010-rounding. 5. Federal floor: the base never falls below the highest federal unemployment - tax base enacted by its year, and 1991 meets the $7,000 federal base. + tax base enacted by the end of its year, and 1991 meets the $7,000 federal + base. 6. New employers: from 2015, the default rate equals the rate that HRS 383-68 sets for a .0000 reserve ratio on the year's schedule, as HRS 383-66(a)(2) assigns to new employers. @@ -129,8 +133,8 @@ # before the rate year. RESERVE_RATIO = {1988: 2.08, 2008: 2.25, 2009: 1.77} -# Rate schedule in effect: the evaluation's Appendix B through 2020, HRS -# 383-68(c) for 2021 and 2022, and DLIR's schedule page from 2023. +# Rate schedule in effect: the evaluation's Appendix B through 2020 and DLIR's +# schedule page from 2021. HRS 383-68(c) also sets schedule D for 2021 and 2022. SCHEDULE = { 2015: "D", 2016: "C", @@ -286,10 +290,11 @@ def _subsection_d_share(ratio): def _highest_federal_base_enacted(year): # 26 U.S.C. 3306(b)(1). Public Law 91-373 (August 10, 1970) raised the base # from $3,000 to $4,200, Public Law 94-566 (October 20, 1976) to $6,000, - # and Public Law 97-248 to $7,000 for remuneration paid after 1982. + # and Public Law 97-248 (September 3, 1982) to $7,000 for remuneration paid + # after 1982. if year < 1976: return 4_200 - if year < 1983: + if year < 1982: return 6_000 return FUTA.taxable_wage_base(f"{year}-01-01") diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index b1ae5bff1c8..037bc87465f 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -3225,7 +3225,8 @@ candidates: state: ruled note: Subsection (b) defines the average annual wage as the rounded quotient, and subsection (c) applies 90% to that average without a rounding rule of its own, so the text settles the reading. 2011 has no gap, since 90% of $38,000 - is $34,200 in both readings. PE-US's first modelled year is 2015, so the choice moves no modelled amount. + is $34,200 in both readings. 2010 precedes 2015, PE-US's FIRST_MODELED_YEAR, so the choice moves no amount in a + year PE-US models. - id: us-ia:alternate-tax-claimed-spouse program: income-tax years: