From a484f7aa421a25a1868921c6b917d2ea46b69918 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Fri, 9 Oct 2026 10:10:33 -0400 Subject: [PATCH 1/7] Apply Oregon, Maine and Hawaii rules for a filer who can be claimed as a dependent - Maine: personal exemptions count each filer who may not be claimed (1040ME line 13); the dependent exemption credit, the expanded-age childless EITC and the 2021 relief payment leave out a filer who can be claimed and, where the law requires a dependent, a return on which a filer can be claimed. - Oregon: the disabled child exemption and the Oregon Kids Credit count no dependents on a return with a claimable filer (IRC 152(b)(1)); the working family and dependent care credit counts a child only as a dependent and either spouse as an incapacitated qualifying spouse. - Hawaii: a claimable filer has no regular or age exemption (HRS 235-54(a)) but keeps the disability exemption; the child and dependent care credit needs a filer who cannot be claimed (HRS 235-55.6(a)(1)). - The Oregon and Hawaii dependent-exemption reforms follow the same rules. Co-Authored-By: Claude Opus 5.5 --- changelog.d/claimable-filer-or-me-hi.fixed.md | 1 + .../hi_dependent_exemption_reform.py | 3 +- .../or_dependent_exemption_credit_reform.py | 19 +- ...est_claimable_filer_or_me_hi_invariants.py | 69 ++++++ .../income/credits/cdcc/hi_cdcc_eligible.yaml | 206 ++++++++++++++++++ .../exemptions/hi_disabled_exemptions.yaml | 122 +++++++++++ .../exemptions/hi_regular_exemptions.yaml | 142 ++++++++++++ .../eitc/me_pro_forma_childless_eitc.yaml | 94 ++++++++ .../me_dependent_exemption_credit.yaml | 100 +++++++++ .../tax/income/credits/me_relief_rebate.yaml | 108 +++++++++ ...erty_tax_fairness_credit_benefit_base.yaml | 76 +++++++ .../deductions/me_personal_exemption.yaml | 120 ++++++++++ ...r_disabled_child_dependent_exemptions.yaml | 84 +++++++ .../exemption/or_regular_exemptions.yaml | 102 +++++++++ .../or_severely_disabled_exemptions.yaml | 22 ++ .../states/or/tax/income/credits/or_ctc.yaml | 98 +++++++++ ...hdc_has_qualified_individual_eligible.yaml | 126 +++++++++++ .../income/credits/cdcc/hi_cdcc_eligible.py | 20 +- .../exemptions/hi_disabled_exemptions.py | 13 +- .../exemptions/hi_regular_exemptions.py | 17 +- ...ependent_exemption_credit_amount_person.py | 9 + .../eitc/me_pro_forma_childless_eitc.py | 6 + .../me/tax/income/credits/me_relief_rebate.py | 6 +- .../me_personal_exemption_deduction.py | 14 +- .../or_disabled_child_dependent_exemptions.py | 7 +- .../states/or/tax/income/credits/or_ctc.py | 7 +- ...wfhdc_has_qualified_individual_eligible.py | 18 +- 27 files changed, 1586 insertions(+), 23 deletions(-) create mode 100644 changelog.d/claimable-filer-or-me-hi.fixed.md create mode 100644 policyengine_us/tests/core/test_claimable_filer_or_me_hi_invariants.py diff --git a/changelog.d/claimable-filer-or-me-hi.fixed.md b/changelog.d/claimable-filer-or-me-hi.fixed.md new file mode 100644 index 00000000000..c8d4e7be4f0 --- /dev/null +++ b/changelog.d/claimable-filer-or-me-hi.fixed.md @@ -0,0 +1 @@ +Apply Oregon, Maine and Hawaii rules for a filer who can be claimed as a dependent: Maine's personal exemption counts only filers who may not be claimed (1040ME line 13), and Maine's dependent exemption credit, expanded childless EITC and 2021 relief rebate, Oregon's Kids Credit, disabled child exemption and working family household and dependent care credit child, and Hawaii's age-65 exemption and child care credit follow the dependent taxpayer rules; Oregon's working family credit now counts a disabled spouse under either head/spouse label. diff --git a/policyengine_us/reforms/states/hi/dependent_exemption/hi_dependent_exemption_reform.py b/policyengine_us/reforms/states/hi/dependent_exemption/hi_dependent_exemption_reform.py index 3349f9a9f31..897e8fb7236 100644 --- a/policyengine_us/reforms/states/hi/dependent_exemption/hi_dependent_exemption_reform.py +++ b/policyengine_us/reforms/states/hi/dependent_exemption/hi_dependent_exemption_reform.py @@ -89,8 +89,9 @@ def formula(tax_unit, period, parameters): # exactly as the baseline computes it). person = tax_unit.members head_or_spouse = person("is_tax_unit_head_or_spouse", period) + claimed = person("claimed_as_dependent_on_another_return", period) aged = person("age", period) >= p.aged_threshold - aged_head_spouse_count = tax_unit.sum(aged & head_or_spouse) + aged_head_spouse_count = tax_unit.sum(aged & head_or_spouse & ~claimed) personal_amount = (personal_count + aged_head_spouse_count) * p.base diff --git a/policyengine_us/reforms/states/oregon/dependent_exemption_credit/or_dependent_exemption_credit_reform.py b/policyengine_us/reforms/states/oregon/dependent_exemption_credit/or_dependent_exemption_credit_reform.py index b5c52dd18cc..24e87d3fa3c 100644 --- a/policyengine_us/reforms/states/oregon/dependent_exemption_credit/or_dependent_exemption_credit_reform.py +++ b/policyengine_us/reforms/states/oregon/dependent_exemption_credit/or_dependent_exemption_credit_reform.py @@ -15,7 +15,11 @@ def formula(tax_unit, period, parameters): person = tax_unit.members age = person("age", period) - is_dependent = person("is_tax_unit_dependent", period) + # A return on which the filer (or, if joint, either spouse) can be + # claimed as a dependent has no dependents (IRC 152(b)(1)). + is_dependent = person("is_tax_unit_dependent", period) & ~person.tax_unit( + "head_or_spouse_is_dependent_elsewhere", period + ) # Apply age limit if in effect age_threshold = p.age_limit.threshold @@ -39,7 +43,11 @@ class or_older_dependents_count(Variable): def formula(tax_unit, period, parameters): person = tax_unit.members - is_dependent = person("is_tax_unit_dependent", period) + # A return on which the filer (or, if joint, either spouse) can be + # claimed as a dependent has no dependents (IRC 152(b)(1)). + is_dependent = person("is_tax_unit_dependent", period) & ~person.tax_unit( + "head_or_spouse_is_dependent_elsewhere", period + ) total_dependents = tax_unit.sum(is_dependent) eligible_dependents = tax_unit("or_eligible_dependents_count", period) return max_(0, total_dependents - eligible_dependents) @@ -87,9 +95,10 @@ def formula(tax_unit, period, parameters): qualifies = federal_agi <= p.income_limit.regular[filing_status] - # Count head and spouse only (1 for single/hoh, 2 for joint) - head_spouse_count = where( - filing_status == filing_status.possible_values.JOINT, 2, 1 + # Count the filers' own exemptions: none for a filer whom another + # taxpayer can claim (ORS 316.085(1)(b)). + head_spouse_count = tax_unit( + "head_spouse_count_not_dependent_elsewhere", period ) # Add older dependents (those excluded from dependent credit by age limit) diff --git a/policyengine_us/tests/core/test_claimable_filer_or_me_hi_invariants.py b/policyengine_us/tests/core/test_claimable_filer_or_me_hi_invariants.py new file mode 100644 index 00000000000..5d5d9403d00 --- /dev/null +++ b/policyengine_us/tests/core/test_claimable_filer_or_me_hi_invariants.py @@ -0,0 +1,69 @@ +"""Oregon, Maine and Hawaii rules for a filer who can be claimed as a dependent. + +Exemptions and dependent-based credits leave out a claimable filer and, where +the law needs a dependent, a return on which a filer can be claimed. + +For couples drawn by Hypothesis and a seeded population in OR, ME, HI, with +either, both or neither spouse claimed, each output is the same under either +head/spouse labelling, and marking another filer as claimed never raises it. +""" + +import pytest +from hypothesis import HealthCheck, given, settings +from hypothesis import strategies as st + +from policyengine_us.tests.core.test_claimable_filer_federal_invariants import ( + check_monotone, + check_swap, +) +from policyengine_us.tests.core.test_dependent_elsewhere_head_spouse_swap_invariance import ( + CLAIM_PATTERNS, + _crafted_cases, + _seeded_couples, + adults, + dependents, +) + +STATES = ["OR", "ME", "HI"] +YEARS = [2021, 2025, 2026] +OUTPUTS = [ + "or_exemption_credit", + "or_ctc", + "or_wfhdc_has_qualified_individual_eligible", + "me_personal_exemption_deduction", + "me_dependent_exemption_credit", + "me_pro_forma_childless_eitc", + "me_relief_rebate", + "me_property_tax_fairness_credit_benefit_base", + "hi_regular_exemptions", + "hi_disabled_exemptions", + "hi_cdcc_eligible", +] + + +@st.composite +def couples(draw): + return { + "state": draw(st.sampled_from(STATES)), + "adults": [draw(adults()), draw(adults())], + "dependents": draw(st.lists(dependents(), max_size=2)), + "claimed": draw(st.sampled_from(CLAIM_PATTERNS)), + } + + +@settings( + max_examples=2, + deadline=None, + derandomize=True, + suppress_health_check=[HealthCheck.too_slow, HealthCheck.data_too_large], +) +@given(st.sampled_from(YEARS), st.lists(couples(), min_size=6, max_size=12)) +def test_or_me_hi_claimable_filer_rules_are_label_free(year, units): + check_swap(units, year, OUTPUTS) + + +@pytest.mark.parametrize("year", YEARS) +def test_or_me_hi_claimable_filer_rules_seeded_population(year): + units = _seeded_couples(STATES, per_state=3) + _crafted_cases(STATES) + check_swap(units, year, OUTPUTS) + check_monotone(units, year, OUTPUTS) diff --git a/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_eligible.yaml index ba643974b20..1cbda454e24 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_eligible.yaml @@ -44,3 +44,209 @@ state_code: HI output: hi_cdcc_eligible: true + + +- name: 2025 single filer who can be claimed as a dependent cannot claim the credit + period: 2025 + input: + people: + parent: + age: 20 + employment_income: 10000 + claimed_as_dependent_on_another_return: true + child: + age: 4 + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: HI + output: + # HRS 235-55.6(a)(1): the taxpayer "is not claimed or is not otherwise + # eligible to be claimed as a dependent". + hi_cdcc_eligible: false + +- name: 2025 joint return with one claimable spouse has no qualifying child (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 20 + employment_income: 10000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 22 + employment_income: 10000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: HI + output: + hi_cdcc_eligible: false + +- name: 2025 joint return with one claimable spouse has no qualifying child (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 22 + employment_income: 10000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 20 + employment_income: 10000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: HI + output: + hi_cdcc_eligible: false + +- name: 2025 joint return with neither spouse claimable can claim the credit + period: 2025 + input: + people: + person_a: + age: 20 + employment_income: 10000 + person_b: + age: 22 + employment_income: 10000 + child: + age: 4 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: HI + output: + hi_cdcc_eligible: true + +- name: 2025 spouse who cannot be claimed can claim the credit for a claimable incapacitated spouse (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 40 + is_incapable_of_self_care: true + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 40 + employment_income: 10000 + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + households: + household: + members: [person_a, person_b] + state_code: HI + output: + hi_cdcc_eligible: true + +- name: 2025 spouse who cannot be claimed can claim the credit for a claimable incapacitated spouse (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 40 + employment_income: 10000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 40 + is_incapable_of_self_care: true + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_b, person_a] + filing_status: JOINT + households: + household: + members: [person_b, person_a] + state_code: HI + output: + hi_cdcc_eligible: true + +- name: 2025 incapacitated spouse is not the qualifying individual of a spouse who can be claimed (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 40 + employment_income: 10000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 40 + is_incapable_of_self_care: true + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + households: + household: + members: [person_a, person_b] + state_code: HI + output: + hi_cdcc_eligible: false + +- name: 2025 incapacitated spouse is not the qualifying individual of a spouse who can be claimed (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 40 + is_incapable_of_self_care: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 40 + employment_income: 10000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_b, person_a] + filing_status: JOINT + households: + household: + members: [person_b, person_a] + state_code: HI + output: + hi_cdcc_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/exemptions/hi_disabled_exemptions.yaml b/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/exemptions/hi_disabled_exemptions.yaml index 10fcd231ea9..dac54bdea86 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/exemptions/hi_disabled_exemptions.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/exemptions/hi_disabled_exemptions.yaml @@ -102,3 +102,125 @@ state_fips: 15 # HI output: hi_disabled_exemptions: 7_000 + + +- name: 2025 disabled filer who can be claimed as a dependent keeps the disability exemption + period: 2025 + input: + people: + filer: + age: 70 + is_disabled: true + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [filer] + households: + household: + members: [filer] + state_code: HI + output: + # HRS 235-54(c) has no dependency bar. + hi_disabled_exemptions: 7_000 + +- name: 2025 claimable disabled spouse keeps the disability exemption and the other spouse their regular and age exemptions (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 70 + is_disabled: true + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 68 + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + households: + household: + members: [person_a, person_b] + state_code: HI + output: + # $7,000 + (1 + 1) x $1,144. + hi_disabled_exemptions: 9_288 + +- name: 2025 claimable disabled spouse keeps the disability exemption and the other spouse their regular and age exemptions (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 68 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 70 + is_disabled: true + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_b, person_a] + filing_status: JOINT + households: + household: + members: [person_b, person_a] + state_code: HI + output: + hi_disabled_exemptions: 9_288 + +- name: 2025 claimable nondisabled spouse adds nothing to the disabled spouse's exemption (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 68 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 40 + is_disabled: true + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + households: + household: + members: [person_a, person_b] + state_code: HI + output: + # HRS 235-54(a) zeroes the claimable spouse's regular and age exemptions. + hi_disabled_exemptions: 7_000 + +- name: 2025 claimable nondisabled spouse adds nothing to the disabled spouse's exemption (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 40 + is_disabled: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 68 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_b, person_a] + filing_status: JOINT + households: + household: + members: [person_b, person_a] + state_code: HI + output: + hi_disabled_exemptions: 7_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/exemptions/hi_regular_exemptions.yaml b/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/exemptions/hi_regular_exemptions.yaml index 3a6c793e547..70431d803b1 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/exemptions/hi_regular_exemptions.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/exemptions/hi_regular_exemptions.yaml @@ -56,3 +56,145 @@ output: hi_regular_exemptions: 4_576 + + +- name: 2025 single filer aged 65 or older who can be claimed as a dependent has no exemptions + period: 2025 + input: + people: + filer: + age: 70 + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [filer] + households: + household: + members: [filer] + state_code: HI + output: + # HRS 235-54(a): the exemption of a claimable individual "shall be zero". + hi_regular_exemptions: 0 + +- name: 2025 aged joint return with one claimable spouse keeps the other spouse's regular and age exemptions (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 70 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 68 + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + households: + household: + members: [person_a, person_b] + state_code: HI + output: + # (1 + 1) x $1,144. + hi_regular_exemptions: 2_288 + +- name: 2025 aged joint return with one claimable spouse keeps the other spouse's regular and age exemptions (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 68 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 70 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_b, person_a] + filing_status: JOINT + households: + household: + members: [person_b, person_a] + state_code: HI + output: + hi_regular_exemptions: 2_288 + +- name: 2025 aged joint return with neither spouse claimable + period: 2025 + input: + people: + person_a: + age: 70 + person_b: + age: 68 + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + households: + household: + members: [person_a, person_b] + state_code: HI + output: + # (2 + 2) x $1,144. + hi_regular_exemptions: 4_576 + +- name: 2025 joint return with one claimable spouse and a child counts only the other spouse (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 20 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 22 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: HI + output: + # N-11: "You cannot claim any dependents" when either spouse can be + # claimed. + hi_regular_exemptions: 1_144 + +- name: 2025 joint return with one claimable spouse and a child counts only the other spouse (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 22 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 20 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: HI + output: + hi_regular_exemptions: 1_144 diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/eitc/me_pro_forma_childless_eitc.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/eitc/me_pro_forma_childless_eitc.yaml index 5d213b2d4ad..bfa9cef1556 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/eitc/me_pro_forma_childless_eitc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/eitc/me_pro_forma_childless_eitc.yaml @@ -40,3 +40,97 @@ state_code: ME output: me_pro_forma_childless_eitc: 0 + + +- name: 2025 single filer who can be claimed as a dependent has no pro forma childless credit + period: 2025 + input: + people: + filer: + age: 20 + employment_income: 1000 + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [filer] + households: + household: + members: [filer] + state_code: ME + output: + # 36 MRSA 5219-S(6) keeps IRC 32(c)(1)(A)(ii)(III). + me_pro_forma_childless_eitc: 0 + +- name: 2025 joint return with one claimable spouse has no pro forma childless credit (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 20 + employment_income: 500 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 22 + employment_income: 500 + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + households: + household: + members: [person_a, person_b] + state_code: ME + output: + me_pro_forma_childless_eitc: 0 + +- name: 2025 joint return with one claimable spouse has no pro forma childless credit (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 22 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 20 + employment_income: 500 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_b, person_a] + filing_status: JOINT + households: + household: + members: [person_b, person_a] + state_code: ME + output: + me_pro_forma_childless_eitc: 0 + +- name: 2025 joint return with neither spouse claimable has the pro forma childless credit + period: 2025 + input: + people: + person_a: + age: 20 + employment_income: 500 + person_b: + age: 22 + employment_income: 500 + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + households: + household: + members: [person_a, person_b] + state_code: ME + output: + # 7.65% x $1,000. + me_pro_forma_childless_eitc: 76.5 diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/me_dependent_exemption_credit.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/me_dependent_exemption_credit.yaml index c958014868a..a710990c750 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/me_dependent_exemption_credit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/me_dependent_exemption_credit.yaml @@ -137,3 +137,103 @@ state_code: ME output: me_dependent_exemption_credit: 10 + + +- name: 2025 single filer who can be claimed as a dependent gets no dependent exemption credit + period: 2025 + input: + people: + parent: + age: 20 + claimed_as_dependent_on_another_return: true + child: + age: 4 + tax_units: + tax_unit: + members: [parent, child] + me_agi: 0 + households: + household: + members: [parent, child] + state_code: ME + output: + # 36 MRSA 5219-SS counts dependents for whom the federal child or other + # dependent credit may be claimed; IRC 152(b)(1). + me_dependent_exemption_credit: 0 + +- name: 2025 joint return with one claimable spouse gets no dependent exemption credit (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 20 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 22 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + me_agi: 0 + households: + household: + members: [person_a, person_b, child] + state_code: ME + output: + me_dependent_exemption_credit: 0 + +- name: 2025 joint return with one claimable spouse gets no dependent exemption credit (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 22 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 20 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + me_agi: 0 + households: + household: + members: [person_b, person_a, child] + state_code: ME + output: + me_dependent_exemption_credit: 0 + +- name: 2025 joint return with neither spouse claimable gets the doubled credit for a child under 6 + period: 2025 + input: + people: + person_a: + age: 20 + person_b: + age: 22 + child: + age: 4 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + me_agi: 0 + households: + household: + members: [person_a, person_b, child] + state_code: ME + output: + # $305 x 2 for a child under 6. + me_dependent_exemption_credit: 610 diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/me_relief_rebate.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/me_relief_rebate.yaml index 2cb482d23a7..e578cbf3d6d 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/me_relief_rebate.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/me_relief_rebate.yaml @@ -82,3 +82,111 @@ me_refundable_credits: 850 # 1,000 before refundable credits - 850 refundable credits = 150. me_income_tax: 150 + + +- name: 2021 single filer who can be claimed as a dependent gets no relief payment + period: 2021 + input: + people: + filer: + age: 20 + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [filer] + households: + household: + members: [filer] + state_code: ME + output: + # P.L. 2021, c. 635, Part L-3: a recipient "may not be claimed as a + # dependent on another taxpayer's return". + me_relief_rebate: 0 + +- name: 2021 joint return with one claimable spouse gets one relief payment (the claimable spouse is the head) + period: 2021 + input: + people: + person_a: + age: 20 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 22 + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + households: + household: + members: [person_a, person_b] + state_code: ME + output: + me_relief_rebate: 850 + +- name: 2021 joint return with one claimable spouse gets one relief payment (the claimable spouse is the spouse) + period: 2021 + input: + people: + person_b: + age: 22 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 20 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_b, person_a] + filing_status: JOINT + households: + household: + members: [person_b, person_a] + state_code: ME + output: + me_relief_rebate: 850 + +- name: 2021 joint return with both spouses claimable gets no relief payment + period: 2021 + input: + people: + person_a: + age: 20 + claimed_as_dependent_on_another_return: true + person_b: + age: 22 + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + households: + household: + members: [person_a, person_b] + state_code: ME + output: + me_relief_rebate: 0 + +- name: 2021 joint return with neither spouse claimable gets two relief payments + period: 2021 + input: + people: + person_a: + age: 20 + person_b: + age: 22 + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + households: + household: + members: [person_a, person_b] + state_code: ME + output: + me_relief_rebate: 1_700 diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_benefit_base.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_benefit_base.yaml index 8a364c9d489..0f05822f6e1 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_benefit_base.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_benefit_base.yaml @@ -75,3 +75,79 @@ ctc_qualifying_children: 1 output: me_property_tax_fairness_credit_benefit_base: 3_300 + + +- name: 2025 joint return with one claimable spouse uses the base without qualifying children (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 30 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 8 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: ME + output: + # The base counts children for whom the federal child tax credit may be + # claimed (36 MRSA 5219-KK); IRC 152(b)(1) leaves such a return none. + me_property_tax_fairness_credit_benefit_base: 3_300 + +- name: 2025 joint return with one claimable spouse uses the base without qualifying children (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 30 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 30 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 8 + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: ME + output: + me_property_tax_fairness_credit_benefit_base: 3_300 + +- name: 2025 joint return with neither spouse claimable uses the base with qualifying children + period: 2025 + input: + people: + person_a: + age: 30 + person_b: + age: 30 + child: + age: 8 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: ME + output: + me_property_tax_fairness_credit_benefit_base: 4_050 diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/deductions/me_personal_exemption.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/deductions/me_personal_exemption.yaml index 82dec8b791d..d0f204a9cac 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/deductions/me_personal_exemption.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/deductions/me_personal_exemption.yaml @@ -47,3 +47,123 @@ me_agi: 404_500 # $279,500 + $125,000 = $404,500 output: me_personal_exemption_deduction: 0 + +- name: 2025 single filer who may be claimed as a dependent gets no personal exemption + period: 2025 + absolute_error_margin: 0 + input: + people: + person: + age: 20 + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [person] + me_agi: 10_000 + households: + household: + members: [person] + state_code: ME + output: + # Form 1040ME line 13: 0 if you may be claimed as a dependent. + me_personal_exemption_deduction: 0 + +- name: 2025 joint return with only one spouse claimable gets one exemption (the claimable spouse is the head) + period: 2025 + absolute_error_margin: 0 + input: + people: + person_a: + age: 20 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 20 + claimed_as_dependent_on_another_return: false + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + me_agi: 16_000 + households: + household: + members: [person_a, person_b] + state_code: ME + output: + # Form 1040ME line 13: 1 if married filing jointly and only one spouse may + # be claimed as a dependent; 1 x $5,150. + me_personal_exemption_deduction: 5_150 + +- name: 2025 joint return with only one spouse claimable gets one exemption (the claimable spouse is the spouse) + period: 2025 + absolute_error_margin: 0 + input: + people: + person_b: + age: 20 + claimed_as_dependent_on_another_return: false + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 20 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_b, person_a] + filing_status: JOINT + me_agi: 16_000 + households: + household: + members: [person_b, person_a] + state_code: ME + output: + me_personal_exemption_deduction: 5_150 + +- name: 2025 joint return with both spouses claimable gets no exemption + period: 2025 + absolute_error_margin: 0 + input: + people: + person_a: + age: 20 + claimed_as_dependent_on_another_return: true + person_b: + age: 20 + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + me_agi: 16_000 + households: + household: + members: [person_a, person_b] + state_code: ME + output: + me_personal_exemption_deduction: 0 + +- name: 2025 joint return with neither spouse claimable gets two exemptions + period: 2025 + absolute_error_margin: 0 + input: + people: + person_a: + age: 20 + person_b: + age: 20 + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + me_agi: 16_000 + households: + household: + members: [person_a, person_b] + state_code: ME + output: + me_personal_exemption_deduction: 10_300 diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/exemption/or_disabled_child_dependent_exemptions.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/exemption/or_disabled_child_dependent_exemptions.yaml index 11da9ff4b3a..d448d7e1838 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/exemption/or_disabled_child_dependent_exemptions.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/exemption/or_disabled_child_dependent_exemptions.yaml @@ -17,3 +17,87 @@ is_qualifying_child_dependent: true output: or_disabled_child_dependent_exemptions: 0 + + +- name: 2025 joint return with one claimable spouse has no disabled child dependent exemption (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 30 + employment_income: 4000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 4000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 10 + is_disabled: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: OR + output: + # ORS 316.099 requires "a dependent of the taxpayer"; IRC 152(b)(1). + or_disabled_child_dependent_exemptions: 0 + +- name: 2025 joint return with one claimable spouse has no disabled child dependent exemption (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 30 + employment_income: 4000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 30 + employment_income: 4000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 10 + is_disabled: true + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: OR + output: + or_disabled_child_dependent_exemptions: 0 + +- name: 2025 joint return with neither spouse claimable has the disabled child dependent exemption + period: 2025 + input: + people: + person_a: + age: 30 + employment_income: 4000 + person_b: + age: 30 + employment_income: 4000 + child: + age: 10 + is_disabled: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: OR + output: + or_disabled_child_dependent_exemptions: 1 diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/exemption/or_regular_exemptions.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/exemption/or_regular_exemptions.yaml index f1a3b5b7ee3..6a3e6868ad3 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/exemption/or_regular_exemptions.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/exemption/or_regular_exemptions.yaml @@ -46,3 +46,105 @@ output: or_regular_exemptions: 0 + + +- name: 2025 single filer who can be claimed as a dependent has no regular exemption + period: 2025 + input: + people: + filer: + age: 20 + employment_income: 5000 + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [filer] + households: + household: + members: [filer] + state_code: OR + output: + # ORS 316.085(1)(b); OR-17: "If someone else can claim you as a dependent, you + # can't claim an exemption for yourself." + or_regular_exemptions: 0 + +- name: 2025 joint return with one claimable spouse keeps the other spouse's exemption and no dependents (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 20 + employment_income: 4000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 22 + employment_income: 4000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 10 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: OR + output: + # One exemption for the spouse who cannot be claimed; the child is not a + # dependent of such a return (IRC 152(b)(1)). + or_regular_exemptions: 1 + +- name: 2025 joint return with one claimable spouse keeps the other spouse's exemption and no dependents (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 22 + employment_income: 4000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 20 + employment_income: 4000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 10 + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: OR + output: + or_regular_exemptions: 1 + +- name: 2025 joint return with neither spouse claimable counts both and the child + period: 2025 + input: + people: + person_a: + age: 20 + employment_income: 4000 + person_b: + age: 22 + employment_income: 4000 + child: + age: 10 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: OR + output: + or_regular_exemptions: 3 diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/exemption/or_severely_disabled_exemptions.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/exemption/or_severely_disabled_exemptions.yaml index 74a04c8bd46..c9c938492ca 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/exemption/or_severely_disabled_exemptions.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/exemption/or_severely_disabled_exemptions.yaml @@ -17,3 +17,25 @@ is_severely_disabled: true output: or_severely_disabled_exemptions: 0 + + +- name: 2025 severely disabled filer who can be claimed as a dependent keeps the additional exemption + period: 2025 + input: + people: + filer: + age: 40 + is_severely_disabled: true + employment_income: 5000 + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [filer] + households: + household: + members: [filer] + state_code: OR + output: + # OR-17: "You may qualify for the additional exemption even if someone else + # can claim you as a dependent." + or_severely_disabled_exemptions: 1 diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/or_ctc.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/or_ctc.yaml index 1ee454836b6..d5f9bed267d 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/or_ctc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/or_ctc.yaml @@ -197,3 +197,101 @@ # $28,200 exceeds the $28,100 phase-out start by $100 of the $5,000 # width: 1,100 x (1 - 100 / 5,000) = 1,078. or_ctc: 1_078 + + +- name: 2025 single filer who can be claimed as a dependent gets no Oregon Kids Credit + period: 2025 + input: + people: + parent: + age: 20 + claimed_as_dependent_on_another_return: true + child: + age: 5 + tax_units: + tax_unit: + members: [parent, child] + or_agi: 8000 + households: + household: + members: [parent, child] + state_code: OR + output: + # HB 3235 counts dependents under IRC 152(a) without disregarding 152(b)(1). + or_ctc: 0 + +- name: 2025 joint return with one claimable spouse gets no Oregon Kids Credit (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 20 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 22 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + or_agi: 8000 + households: + household: + members: [person_a, person_b, child] + state_code: OR + output: + or_ctc: 0 + +- name: 2025 joint return with one claimable spouse gets no Oregon Kids Credit (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 22 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 20 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + or_agi: 8000 + households: + household: + members: [person_b, person_a, child] + state_code: OR + output: + or_ctc: 0 + +- name: 2025 joint return with neither spouse claimable gets the Oregon Kids Credit + period: 2025 + input: + people: + person_a: + age: 20 + person_b: + age: 22 + child: + age: 5 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + or_agi: 8000 + households: + household: + members: [person_a, person_b, child] + state_code: OR + output: + or_ctc: 1_050 diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_has_qualified_individual_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_has_qualified_individual_eligible.yaml index bb2ae99e241..84e96057cbb 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_has_qualified_individual_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_has_qualified_individual_eligible.yaml @@ -85,3 +85,129 @@ state_code: OR output: or_wfhdc_has_qualified_individual_eligible: false + + +- name: 2025 child of a joint return with one claimable spouse is not a qualified individual (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 20 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 22 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 10 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: OR + output: + # The child must be a dependent (ORS 315.264, IRC 21(b)(1)(A)); IRC 152(b)(1). + or_wfhdc_has_qualified_individual_eligible: false + +- name: 2025 child of a joint return with one claimable spouse is not a qualified individual (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 22 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 20 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 10 + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: OR + output: + or_wfhdc_has_qualified_individual_eligible: false + +- name: 2025 child of a joint return with neither spouse claimable is a qualified individual + period: 2025 + input: + people: + person_a: + age: 20 + person_b: + age: 22 + child: + age: 10 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: OR + output: + or_wfhdc_has_qualified_individual_eligible: true + +- name: 2025 incapacitated spouse who can be claimed is still a qualified individual (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 40 + is_disabled: true + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 40 + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + households: + household: + members: [person_a, person_b] + state_code: OR + output: + # IRC 21(b)(1)(C): a disabled spouse, whichever spouse is labelled head. + or_wfhdc_has_qualified_individual_eligible: true + +- name: 2025 incapacitated spouse who can be claimed is still a qualified individual (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 40 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 40 + is_disabled: true + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_b, person_a] + filing_status: JOINT + households: + household: + members: [person_b, person_a] + state_code: OR + output: + or_wfhdc_has_qualified_individual_eligible: true diff --git a/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_eligible.py b/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_eligible.py index 9e2136eb8ea..dabb23bd89b 100644 --- a/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_eligible.py +++ b/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_eligible.py @@ -13,9 +13,25 @@ class hi_cdcc_eligible(Variable): ) def formula(tax_unit, period, parameters): - count_cdcc_eligible = tax_unit("count_cdcc_eligible", period) + # HRS §235-55.6(a)(1) allows the credit to a taxpayer who "is not + # claimed or is not otherwise eligible to be claimed as a dependent". + # On a joint return a spouse who cannot be claimed may claim it for + # the qualifying individuals, including an incapacitated spouse who + # can be claimed; an incapacitated filer is not the qualifying + # individual of a spouse who can be claimed. + person = tax_unit.members + filer = person("is_tax_unit_head_or_spouse", period) + claimed = person("claimed_as_dependent_on_another_return", period) + claimed_filers = tax_unit.sum(filer & claimed) + other_filer_claimed = (claimed_filers - (filer & claimed)) > 0 + recipient = person("is_cdcc_eligible", period) & ~(filer & other_filer_claimed) + every_filer_dependent = tax_unit("every_filer_is_dependent_elsewhere", period) # HRS §235-55.6(e)(2): a married taxpayer may claim the credit only # on a joint return, unless (e)(4) treats them as unmarried — the # same special rules as IRC §21(e)(2) and (4). filing_status_eligible = tax_unit("cdcc_filing_status_eligible", period) - return (count_cdcc_eligible > 0) & filing_status_eligible + return ( + (tax_unit.sum(recipient) > 0) + & filing_status_eligible + & ~every_filer_dependent + ) diff --git a/policyengine_us/variables/gov/states/hi/tax/income/exemptions/hi_disabled_exemptions.py b/policyengine_us/variables/gov/states/hi/tax/income/exemptions/hi_disabled_exemptions.py index 3931ac4904a..6be44bc760b 100644 --- a/policyengine_us/variables/gov/states/hi/tax/income/exemptions/hi_disabled_exemptions.py +++ b/policyengine_us/variables/gov/states/hi/tax/income/exemptions/hi_disabled_exemptions.py @@ -25,10 +25,17 @@ def formula(tax_unit, period, parameters): any_disabled_head_or_spouse, 0, dependent_amount ) aged = person("age", period) >= p.aged_threshold - # Filer can claim greater of the disabled or base exemption. + # Filer can claim greater of the disabled or base exemption. HRS + # 235-54(c) and HAR 18-235-54(c) grant the $7,000 exemption "instead + # of the exemptions provided by subsection (a)" without a dependency + # bar, so a disabled filer keeps it even if another taxpayer can + # claim them. disabled_exemption = disabled_head_or_spouse * p.disabled - # Aged individuals get an extra base exemption. - head_or_spouse_amount = p.base * (1 + aged) * head_or_spouse + # Aged individuals get an extra base exemption. Under HRS 235-54(a) + # the regular and aged exemptions of a filer whom another taxpayer + # can claim are zero. + claimed = person("claimed_as_dependent_on_another_return", period) + head_or_spouse_amount = p.base * (1 + aged) * head_or_spouse * ~claimed conditional_head_or_spouse_amount = max_( disabled_exemption, head_or_spouse_amount ) diff --git a/policyengine_us/variables/gov/states/hi/tax/income/exemptions/hi_regular_exemptions.py b/policyengine_us/variables/gov/states/hi/tax/income/exemptions/hi_regular_exemptions.py index 199c0122c99..0126dfe5d62 100644 --- a/policyengine_us/variables/gov/states/hi/tax/income/exemptions/hi_regular_exemptions.py +++ b/policyengine_us/variables/gov/states/hi/tax/income/exemptions/hi_regular_exemptions.py @@ -6,17 +6,28 @@ class hi_regular_exemptions(Variable): entity = TaxUnit label = "Hawaii regular exemptions" unit = USD - reference = "https://files.hawaii.gov/tax/forms/2022/n11ins.pdf#page=20" + reference = ( + "https://files.hawaii.gov/tax/forms/2022/n11ins.pdf#page=20", + # HRS 235-54(a): the exemption of an individual whom another taxpayer + # can claim "shall be zero", including the additional exemption for + # age 65 or over. + "https://files.hawaii.gov/tax/legal/hrs/hrs_235.pdf#page=45", + ) definition_period = YEAR defined_for = StateCode.HI def formula(tax_unit, period, parameters): + # The federal count leaves out a filer who can be claimed as a + # dependent and, on such a return, the dependents (HRS 235-54(a); + # N-11 instructions: "You cannot claim any dependents"). exemptions_count = tax_unit("exemptions_count", period) p = parameters(period).gov.states.hi.tax.income.exemptions - # Aged heads and spouses get an extra base exemption. + # Aged heads and spouses who cannot be claimed get an extra base + # exemption. person = tax_unit.members head_or_spouse = person("is_tax_unit_head_or_spouse", period) + claimed = person("claimed_as_dependent_on_another_return", period) aged = person("age", period) >= p.aged_threshold - aged_head_spouse_count = tax_unit.sum(aged & head_or_spouse) + aged_head_spouse_count = tax_unit.sum(aged & head_or_spouse & ~claimed) total_exemption_count_including_aged = exemptions_count + aged_head_spouse_count return total_exemption_count_including_aged * p.base diff --git a/policyengine_us/variables/gov/states/me/tax/income/credits/dependent_exemption/me_dependent_exemption_credit_amount_person.py b/policyengine_us/variables/gov/states/me/tax/income/credits/dependent_exemption/me_dependent_exemption_credit_amount_person.py index 218b4b34fb3..885ba7e12bf 100644 --- a/policyengine_us/variables/gov/states/me/tax/income/credits/dependent_exemption/me_dependent_exemption_credit_amount_person.py +++ b/policyengine_us/variables/gov/states/me/tax/income/credits/dependent_exemption/me_dependent_exemption_credit_amount_person.py @@ -14,6 +14,15 @@ class me_dependent_exemption_credit_amount_person(Variable): def formula(person, period, parameters): dependent = person("is_tax_unit_dependent", period) + # 36 MRSA 5219-SS counts each "qualifying child and dependent" for + # whom the taxpayer is eligible to claim the federal child tax credit + # or credit for other dependents; a return on which the filer (or, if + # joint, either spouse) can be claimed as a dependent has no + # dependents (IRC 152(b)(1)). + dependent_filer = person.tax_unit( + "head_or_spouse_is_dependent_elsewhere", period + ) + dependent = dependent & ~dependent_filer p = parameters(period).gov.states.me.tax.income.credits.dependent_exemption age = person("age", period) multiplier = p.multiplier.calc(age) diff --git a/policyengine_us/variables/gov/states/me/tax/income/credits/eitc/me_pro_forma_childless_eitc.py b/policyengine_us/variables/gov/states/me/tax/income/credits/eitc/me_pro_forma_childless_eitc.py index 61735eb434f..7123d651793 100644 --- a/policyengine_us/variables/gov/states/me/tax/income/credits/eitc/me_pro_forma_childless_eitc.py +++ b/policyengine_us/variables/gov/states/me/tax/income/credits/eitc/me_pro_forma_childless_eitc.py @@ -29,8 +29,14 @@ def formula(tax_unit, period, parameters): reduction = tax_unit("eitc_reduction", period) investment_eligible = tax_unit("eitc_investment_income_eligible", period) filer_has_ssn = tax_unit("filer_meets_eitc_identification_requirements", period) + # § 5219-S(6) also requires the qualifications of IRC + # 32(c)(1)(A)(ii)(III): the filer may not be a dependent of another + # taxpayer, and on a joint return neither spouse may be (Publication + # 596, Rule 12). + dependent_filer = tax_unit("head_or_spouse_is_dependent_elsewhere", period) return ( min_(phased_in, max_(0, maximum - reduction)) * investment_eligible * filer_has_ssn + * ~dependent_filer ) diff --git a/policyengine_us/variables/gov/states/me/tax/income/credits/me_relief_rebate.py b/policyengine_us/variables/gov/states/me/tax/income/credits/me_relief_rebate.py index 862fa986b4e..53f4d903eb5 100644 --- a/policyengine_us/variables/gov/states/me/tax/income/credits/me_relief_rebate.py +++ b/policyengine_us/variables/gov/states/me/tax/income/credits/me_relief_rebate.py @@ -12,5 +12,7 @@ class me_relief_rebate(Variable): def formula(tax_unit, period, parameters): p = parameters(period).gov.states.me.tax.income.credits.relief_rebate - head_spouse_count = tax_unit("head_spouse_count", period) - return head_spouse_count * p.amount + # P.L. 2021, c. 635, Part L-3 pays each eligible resident who "may not + # be claimed as a dependent on another taxpayer's return". + recipients = tax_unit("head_spouse_count_not_dependent_elsewhere", period) + return recipients * p.amount diff --git a/policyengine_us/variables/gov/states/me/tax/income/taxable_income/deductions/personal_exemption/me_personal_exemption_deduction.py b/policyengine_us/variables/gov/states/me/tax/income/taxable_income/deductions/personal_exemption/me_personal_exemption_deduction.py index 89a0ba79fbd..a5c856451f1 100644 --- a/policyengine_us/variables/gov/states/me/tax/income/taxable_income/deductions/personal_exemption/me_personal_exemption_deduction.py +++ b/policyengine_us/variables/gov/states/me/tax/income/taxable_income/deductions/personal_exemption/me_personal_exemption_deduction.py @@ -7,6 +7,13 @@ class me_personal_exemption_deduction(Variable): label = "Maine personal exemption deduction" unit = USD definition_period = YEAR + reference = ( + "https://www.mainelegislature.org/legis/statutes/36/title36sec5126-A.html", + # Form 1040ME instructions, line 13: a filer who may be claimed as a + # dependent has no exemption; on a joint return each spouse is + # counted separately. + "https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/25_1040me_gen_instr_w_cover_pg.pdf#page=4", + ) defined_for = StateCode.ME def formula(tax_unit, period, parameters): @@ -26,8 +33,11 @@ def formula(tax_unit, period, parameters): phaseout_width = p.phaseout.width[filing_status] # Line 4 phaseout_percent = min_(1, excess / phaseout_width) # Line 5 - # Get their Maine personal exemptions (line 6). - exemptions = tax_unit("head_spouse_count", period) + # Get their Maine personal exemptions (line 6, from Form 1040ME line + # 13). A filer who may be claimed as a dependent on another person's + # return gets no exemption: a joint return counts 1 when only one + # spouse may be claimed and 0 when both may. + exemptions = tax_unit("head_spouse_count_not_dependent_elsewhere", period) max_amount = exemptions * p.amount # Calculate the phaseout amount (line 7). diff --git a/policyengine_us/variables/gov/states/or/tax/income/credits/exemption/or_disabled_child_dependent_exemptions.py b/policyengine_us/variables/gov/states/or/tax/income/credits/exemption/or_disabled_child_dependent_exemptions.py index c6e42f61536..b547b12994b 100644 --- a/policyengine_us/variables/gov/states/or/tax/income/credits/exemption/or_disabled_child_dependent_exemptions.py +++ b/policyengine_us/variables/gov/states/or/tax/income/credits/exemption/or_disabled_child_dependent_exemptions.py @@ -22,4 +22,9 @@ def formula(tax_unit, period, parameters): federal_agi = tax_unit("adjusted_gross_income", period) p = parameters(period).gov.states["or"].tax.income.credits.exemption qualifies = federal_agi <= p.income_limit.disabled_child_dependent - return qualifies * tax_unit.sum(eitc_qualifying_child & disabled) + # ORS 316.099 requires "a dependent of the taxpayer"; under IRC + # 152(b)(1) a return on which the filer (or, if joint, either spouse) + # can be claimed as a dependent has no dependents. + dependent_filer = tax_unit("head_or_spouse_is_dependent_elsewhere", period) + count = tax_unit.sum(eitc_qualifying_child & disabled) + return qualifies * where(dependent_filer, 0, count) diff --git a/policyengine_us/variables/gov/states/or/tax/income/credits/or_ctc.py b/policyengine_us/variables/gov/states/or/tax/income/credits/or_ctc.py index 4d68e9d8682..7c419b92f0e 100644 --- a/policyengine_us/variables/gov/states/or/tax/income/credits/or_ctc.py +++ b/policyengine_us/variables/gov/states/or/tax/income/credits/or_ctc.py @@ -22,7 +22,12 @@ def formula(tax_unit, period, parameters): dependent = person("is_tax_unit_dependent", period) # Get the number of qualifying dependents in the tax unit. age_eligible = age < p.ineligible_age - eligible = age_eligible & dependent + # HB 3235 (2023) section 2 counts dependents as defined in IRC 152(a), + # disregarding only 152(b)(3), so IRC 152(b)(1) applies: a return on + # which the filer (or, if joint, either spouse) can be claimed as a + # dependent has no dependents. + dependent_filer = tax_unit("head_or_spouse_is_dependent_elsewhere", period) + eligible = age_eligible & dependent & ~dependent_filer count_eligible = tax_unit.sum(eligible) # Cap the number of qualifying dependents. capped_count_eligible = min_(count_eligible, p.child_limit) diff --git a/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_has_qualified_individual_eligible.py b/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_has_qualified_individual_eligible.py index 25cee2d8d8f..b11f0baf92c 100644 --- a/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_has_qualified_individual_eligible.py +++ b/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_has_qualified_individual_eligible.py @@ -16,12 +16,24 @@ class or_wfhdc_has_qualified_individual_eligible(Variable): def formula(tax_unit, period, parameters): p = parameters(period).gov.states["or"].tax.income.credits.wfhdc - # Check if the household has a child or disabled member other than the household head. - # Note that a disabled spouse is a qualifying individual. + # ORS 315.264 takes the qualifying individuals of IRC 21(b)(1): a + # child dependent (a return on which a filer can be claimed has no + # dependents, IRC 152(b)(1)); a disabled dependent, determined without + # regard to 152(b)(1); and a disabled spouse. Schedule OR-WFHDC: + # "the word 'you' also refers to your spouse". person = tax_unit.members age = person("age", period) disabled = person("is_disabled", period) + dependent = person("is_tax_unit_dependent", period) + spouse = person("is_tax_unit_spouse", period) head = person("is_tax_unit_head", period) - qualifying_individuals = (age <= p.child_age_limit) | (disabled & ~head) + joint = tax_unit("tax_unit_married", period) + dependent_filer = tax_unit("head_or_spouse_is_dependent_elsewhere", period) + child = dependent & (age <= p.child_age_limit) & ~dependent_filer + disabled_dependent = dependent & disabled + # On a joint return either spouse can be the other's qualifying + # individual. + disabled_spouse = disabled & (spouse | head) & joint + qualifying_individuals = child | disabled_dependent | disabled_spouse return tax_unit.any(qualifying_individuals) From 6cbe804fc4742380109d714b7d9a1497698b3c1d Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 10 Oct 2026 09:40:49 -0400 Subject: [PATCH 2/7] Address the Oregon, Maine and Hawaii claimable-filer review - Fix person/tax-unit array mixing in or_ctc, the Oregon working family qualifying-individual test and hi_cdcc_eligible (they failed for more than one tax unit). - Oregon working family credit: a person-level or_wfhdc_qualifying_individual; the column no longer follows a child who is not a qualifying individual. - Hawaii child care credit: HRS 235-55.6(b)(1)(B) has no exception to IRC 152(b)(1), so a return with a claimable filer has no dependent qualifying individual; the qualifying individuals now also drive the expenses, the expense limit and the income floor. - Citation anchors: 1040ME instructions page 5, Oregon instructions page 1, HRS 235 pages 46-47. - Tests: Oregon label-free disabled spouse (one existing expectation encoded the head-only rule), column, and Hawaii dependent and expense cases; the property test adds incapacity cases and the Hawaii credit amount. Co-Authored-By: Claude Opus 5.5 --- changelog.d/claimable-filer-or-me-hi.fixed.md | 2 +- ...est_claimable_filer_or_me_hi_invariants.py | 64 ++++++++- .../hi/tax/income/credits/cdcc/hi_cdcc.yaml | 124 ++++++++++++++++++ .../income/credits/cdcc/hi_cdcc_eligible.yaml | 102 +++++++++++++- .../wfhdc/or_wfhdc_eligibility_category.yaml | 91 +++++++++++++ ...hdc_has_qualified_individual_eligible.yaml | 94 ++++++++++++- .../hi_cdcc_min_head_spouse_earned.py | 2 +- .../hi_dependent_care_benefits.py | 14 +- .../income/credits/cdcc/hi_cdcc_eligible.py | 20 +-- .../cdcc/hi_cdcc_qualifying_individual.py | 33 +++++ .../cdcc/hi_cdcc_qualifying_individuals.py | 21 +++ .../me_personal_exemption_deduction.py | 2 +- .../states/or/tax/income/credits/or_ctc.py | 4 +- .../wfhdc/or_wfhdc_eligibility_category.py | 10 ++ ...wfhdc_has_qualified_individual_eligible.py | 26 +--- .../wfhdc/or_wfhdc_qualifying_individual.py | 35 +++++ 16 files changed, 589 insertions(+), 55 deletions(-) create mode 100644 policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_qualifying_individual.py create mode 100644 policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_qualifying_individuals.py create mode 100644 policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_qualifying_individual.py diff --git a/changelog.d/claimable-filer-or-me-hi.fixed.md b/changelog.d/claimable-filer-or-me-hi.fixed.md index c8d4e7be4f0..31eea968923 100644 --- a/changelog.d/claimable-filer-or-me-hi.fixed.md +++ b/changelog.d/claimable-filer-or-me-hi.fixed.md @@ -1 +1 @@ -Apply Oregon, Maine and Hawaii rules for a filer who can be claimed as a dependent: Maine's personal exemption counts only filers who may not be claimed (1040ME line 13), and Maine's dependent exemption credit, expanded childless EITC and 2021 relief rebate, Oregon's Kids Credit, disabled child exemption and working family household and dependent care credit child, and Hawaii's age-65 exemption and child care credit follow the dependent taxpayer rules; Oregon's working family credit now counts a disabled spouse under either head/spouse label. +Apply Oregon, Maine and Hawaii rules for a filer who can be claimed as a dependent: Maine's personal exemption counts only filers who may not be claimed (1040ME line 13), and Maine's dependent exemption credit, expanded childless EITC and 2021 relief rebate, Oregon's Kids Credit, disabled child exemption and working family household and dependent care credit child (and that credit's column), and Hawaii's age-65 exemption and child care credit qualifying individuals and expenses follow the dependent taxpayer rules; Oregon's working family credit now counts a disabled spouse under either head/spouse label. diff --git a/policyengine_us/tests/core/test_claimable_filer_or_me_hi_invariants.py b/policyengine_us/tests/core/test_claimable_filer_or_me_hi_invariants.py index 5d5d9403d00..06010cc136e 100644 --- a/policyengine_us/tests/core/test_claimable_filer_or_me_hi_invariants.py +++ b/policyengine_us/tests/core/test_claimable_filer_or_me_hi_invariants.py @@ -1,11 +1,19 @@ """Oregon, Maine and Hawaii rules for a filer who can be claimed as a dependent. -Exemptions and dependent-based credits leave out a claimable filer and, where -the law needs a dependent, a return on which a filer can be claimed. +Each state denies such a filer their own exemption, and several credits need +dependents that a return with a claimable filer cannot have (IRC 152(b)(1)). -For couples drawn by Hypothesis and a seeded population in OR, ME, HI, with -either, both or neither spouse claimed, each output is the same under either -head/spouse labelling, and marking another filer as claimed never raises it. +For couples with either, both or neither spouse claimed: + +1. Swap invariance: each output is the same under either head/spouse + labelling (Hypothesis batches, the seeded population and the crafted + incapacity cases). +2. Monotonicity: marking another filer as claimed never raises an output + (seeded population and crafted cases only). + +The crafted cases add adults and a dependent who are incapable of self-care, +with care expenses, which the generated population never has. The contributed +reforms and the Oregon credit's column are covered by YAML cases only. """ import pytest @@ -38,9 +46,49 @@ "hi_regular_exemptions", "hi_disabled_exemptions", "hi_cdcc_eligible", + "hi_cdcc_qualifying_individuals", + "hi_cdcc", ] +def _incapacity_cases(): + # Both spouses and an adult dependent incapable of self-care, with care + # expenses, and a young child with childcare expenses. + earner = { + "age": 45, + "employment_income": 10_000.0, + "is_disabled": True, + "is_incapable_of_self_care": True, + "pre_subsidy_care_expenses": 2_000.0, + } + other = { + "age": 44, + "employment_income": 3_000.0, + "is_disabled": True, + "is_incapable_of_self_care": True, + "pre_subsidy_care_expenses": 1_000.0, + } + relative = { + "age": 30, + "is_disabled": True, + "is_incapable_of_self_care": True, + "pre_subsidy_care_expenses": 1_500.0, + } + child = {"age": 4, "pre_subsidy_childcare_expenses": 3_000.0} + return [ + { + "state": state, + "adults": couple, + "dependents": others, + "claimed": claimed, + } + for state in ("OR", "HI") + for couple in ([earner, other], [earner, {"age": 44}]) + for others in ([], [child], [child, relative]) + for claimed in [(True, False), (False, True), (True, True)] + ] + + @st.composite def couples(draw): return { @@ -64,6 +112,10 @@ def test_or_me_hi_claimable_filer_rules_are_label_free(year, units): @pytest.mark.parametrize("year", YEARS) def test_or_me_hi_claimable_filer_rules_seeded_population(year): - units = _seeded_couples(STATES, per_state=3) + _crafted_cases(STATES) + units = ( + _seeded_couples(STATES, per_state=3) + + _crafted_cases(STATES) + + _incapacity_cases() + ) check_swap(units, year, OUTPUTS) check_monotone(units, year, OUTPUTS) diff --git a/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/credits/cdcc/hi_cdcc.yaml b/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/credits/cdcc/hi_cdcc.yaml index 674c70353aa..21929094047 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/credits/cdcc/hi_cdcc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/credits/cdcc/hi_cdcc.yaml @@ -130,3 +130,127 @@ output: # Line 11 cap is $7,500, so line 22 = 10_000 - 4_000 = 6_000; 6_000 * 22%. hi_cdcc: 1_320 + +# Both spouses are incapable of self-care and one can be claimed as a dependent. +# Only that spouse is a qualifying individual (of the spouse who cannot be +# claimed), so only care expenses for that spouse count (HRS 235-55.6(b)(2)). +- name: 2025 care expenses of the spouse who is not a qualifying individual do not count (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 45 + is_incapable_of_self_care: true + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 45 + employment_income: 10000 + is_incapable_of_self_care: true + pre_subsidy_care_expenses: 2000 + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + households: + household: + members: [person_a, person_b] + state_code: HI + output: + hi_cdcc_qualifying_individuals: 1 + hi_dependent_care_benefits: 0 + hi_cdcc: 0 + +- name: 2025 care expenses of the spouse who is not a qualifying individual do not count (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 45 + employment_income: 10000 + is_incapable_of_self_care: true + pre_subsidy_care_expenses: 2000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 45 + is_incapable_of_self_care: true + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_b, person_a] + filing_status: JOINT + households: + household: + members: [person_b, person_a] + state_code: HI + output: + hi_cdcc_qualifying_individuals: 1 + hi_dependent_care_benefits: 0 + hi_cdcc: 0 + +- name: 2025 care expenses of the claimable incapacitated spouse count (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 45 + is_incapable_of_self_care: true + pre_subsidy_care_expenses: 2000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 45 + employment_income: 10000 + is_incapable_of_self_care: true + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + households: + household: + members: [person_a, person_b] + state_code: HI + output: + # 25% x min(2,000 expenses, $10,000 limit, 10,000 earned) + hi_cdcc_qualifying_individuals: 1 + hi_dependent_care_benefits: 2000 + hi_cdcc: 500 + +- name: 2025 care expenses of the claimable incapacitated spouse count (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 45 + employment_income: 10000 + is_incapable_of_self_care: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 45 + is_incapable_of_self_care: true + pre_subsidy_care_expenses: 2000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_b, person_a] + filing_status: JOINT + households: + household: + members: [person_b, person_a] + state_code: HI + output: + hi_cdcc_qualifying_individuals: 1 + hi_dependent_care_benefits: 2000 + hi_cdcc: 500 diff --git a/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_eligible.yaml index 1cbda454e24..47cf3753a67 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_eligible.yaml @@ -45,7 +45,6 @@ output: hi_cdcc_eligible: true - - name: 2025 single filer who can be claimed as a dependent cannot claim the credit period: 2025 input: @@ -250,3 +249,104 @@ state_code: HI output: hi_cdcc_eligible: false + +# HRS 235-55.6(b)(1)(B): "A dependent of the taxpayer who is physically or +# mentally incapable of caring for oneself", with no exception to IRC 152(b)(1), +# so a return on which a filer can be claimed has no dependent qualifying +# individual. +- name: 2025 incapacitated dependent of a joint return with one claimable spouse is not a qualifying individual (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 45 + employment_income: 10000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 45 + employment_income: 10000 + is_tax_unit_head: false + is_tax_unit_spouse: true + relative: + age: 40 + is_incapable_of_self_care: true + is_tax_unit_head: false + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a, person_b, relative] + filing_status: JOINT + households: + household: + members: [person_a, person_b, relative] + state_code: HI + output: + count_cdcc_eligible: 1 + hi_cdcc_qualifying_individuals: 0 + hi_cdcc_eligible: false + +- name: 2025 incapacitated dependent of a joint return with one claimable spouse is not a qualifying individual (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 45 + employment_income: 10000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 45 + employment_income: 10000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + relative: + age: 40 + is_incapable_of_self_care: true + is_tax_unit_head: false + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_b, person_a, relative] + filing_status: JOINT + households: + household: + members: [person_b, person_a, relative] + state_code: HI + output: + count_cdcc_eligible: 1 + hi_cdcc_qualifying_individuals: 0 + hi_cdcc_eligible: false + +- name: 2025 incapacitated dependent of a joint return with neither spouse claimable is a qualifying individual + period: 2025 + input: + people: + person_a: + age: 45 + employment_income: 10000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 45 + employment_income: 10000 + is_tax_unit_head: false + is_tax_unit_spouse: true + relative: + age: 40 + is_incapable_of_self_care: true + is_tax_unit_head: false + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a, person_b, relative] + filing_status: JOINT + households: + household: + members: [person_a, person_b, relative] + state_code: HI + output: + hi_cdcc_qualifying_individuals: 1 + hi_cdcc_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_eligibility_category.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_eligibility_category.yaml index 825becfa5d0..05bbf445b69 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_eligibility_category.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_eligibility_category.yaml @@ -87,3 +87,94 @@ state_code: OR output: or_wfhdc_eligibility_category: ["NONE"] + +# ORS 315.264(2): the column follows the youngest qualifying individual. The +# child of a return on which a filer can be claimed is not one. +- name: 2025 child of a joint return with one claimable spouse does not set the column (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 40 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 40 + is_disabled: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 2 + is_tax_unit_head: false + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + or_wfhdc_eligible: true + households: + household: + members: [person_a, person_b, child] + state_code: OR + output: + or_wfhdc_eligibility_category: ["DISABLED_ADULTS"] + +- name: 2025 child of a joint return with one claimable spouse does not set the column (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 40 + is_disabled: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 40 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 2 + is_tax_unit_head: false + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + or_wfhdc_eligible: true + households: + household: + members: [person_b, person_a, child] + state_code: OR + output: + or_wfhdc_eligibility_category: ["DISABLED_ADULTS"] + +- name: 2025 the same joint return with neither spouse claimable uses the child's column + period: 2025 + input: + people: + person_a: + age: 40 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 40 + is_disabled: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 2 + is_tax_unit_head: false + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + or_wfhdc_eligible: true + households: + household: + members: [person_a, person_b, child] + state_code: OR + output: + or_wfhdc_eligibility_category: ["YOUNGEST"] diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_has_qualified_individual_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_has_qualified_individual_eligible.yaml index 84e96057cbb..3a75495a6cd 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_has_qualified_individual_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_has_qualified_individual_eligible.yaml @@ -64,7 +64,7 @@ output: or_wfhdc_has_qualified_individual_eligible: true -- name: Household with disabled head member is not eligible +- name: Disabled spouse labelled head is a qualified individual, as under the other labelling period: 2021 input: people: @@ -84,8 +84,35 @@ members: [person1, person2] state_code: OR output: - or_wfhdc_has_qualified_individual_eligible: false + # person2 is the spouse. A disabled spouse is the other spouse's + # qualifying individual (IRC 21(b)(1)(C)) whichever spouse is labelled + # head; Schedule OR-WFHDC: "the word 'you' also refers to your spouse". + # Before, this couple was eligible only with the labels exchanged (the + # case above). + or_wfhdc_has_qualified_individual_eligible: true +- name: Single disabled head with no qualifying member is not eligible + period: 2021 + input: + people: + person1: + age: 40 + is_disabled: true + is_tax_unit_head: true + person2: + age: 15 + is_disabled: false + is_tax_unit_head: false + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OR + output: + # A filer is not their own qualifying individual. + or_wfhdc_has_qualified_individual_eligible: false - name: 2025 child of a joint return with one claimable spouse is not a qualified individual (the claimable spouse is the head) period: 2025 @@ -161,7 +188,7 @@ output: or_wfhdc_has_qualified_individual_eligible: true -- name: 2025 incapacitated spouse who can be claimed is still a qualified individual (the claimable spouse is the head) +- name: 2025 disabled spouse who can be claimed is still a qualified individual (the claimable spouse is the head) period: 2025 input: people: @@ -187,7 +214,7 @@ # IRC 21(b)(1)(C): a disabled spouse, whichever spouse is labelled head. or_wfhdc_has_qualified_individual_eligible: true -- name: 2025 incapacitated spouse who can be claimed is still a qualified individual (the claimable spouse is the spouse) +- name: 2025 disabled spouse who can be claimed is still a qualified individual (the claimable spouse is the spouse) period: 2025 input: people: @@ -211,3 +238,62 @@ state_code: OR output: or_wfhdc_has_qualified_individual_eligible: true + +- name: 2025 disabled dependent of a joint return with one claimable spouse is still a qualified individual (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 40 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 40 + is_tax_unit_head: false + is_tax_unit_spouse: true + relative: + age: 30 + is_disabled: true + is_tax_unit_head: false + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a, person_b, relative] + filing_status: JOINT + households: + household: + members: [person_a, person_b, relative] + state_code: OR + output: + # IRC 21(b)(1)(B) determines dependency without regard to 152(b)(1). + or_wfhdc_has_qualified_individual_eligible: true + +- name: 2025 disabled dependent of a joint return with one claimable spouse is still a qualified individual (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 40 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 40 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + relative: + age: 30 + is_disabled: true + is_tax_unit_head: false + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_b, person_a, relative] + filing_status: JOINT + households: + household: + members: [person_b, person_a, relative] + state_code: OR + output: + or_wfhdc_has_qualified_individual_eligible: true diff --git a/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/dependent_care_benefit/hi_cdcc_min_head_spouse_earned.py b/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/dependent_care_benefit/hi_cdcc_min_head_spouse_earned.py index 7cb91da915a..99be8188bfc 100644 --- a/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/dependent_care_benefit/hi_cdcc_min_head_spouse_earned.py +++ b/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/dependent_care_benefit/hi_cdcc_min_head_spouse_earned.py @@ -22,7 +22,7 @@ def formula(tax_unit, period, parameters): earnings = person("earned_income", period) # Head or spouse are eligible for an income floor if disabled or a student # Start with case with only one floor-eligible spouse. - qualified_children = person.tax_unit("count_cdcc_eligible", period) + qualified_children = person.tax_unit("hi_cdcc_qualifying_individuals", period) # Floor depends on number of eligible dependents floor = p.disabled_student_income_floor.calc(qualified_children) floor_eligible = person("hi_cdcc_income_floor_eligible", period) diff --git a/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/dependent_care_benefit/hi_dependent_care_benefits.py b/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/dependent_care_benefit/hi_dependent_care_benefits.py index 8cdafe72ed2..37e776f5eb5 100644 --- a/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/dependent_care_benefit/hi_dependent_care_benefits.py +++ b/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/dependent_care_benefit/hi_dependent_care_benefits.py @@ -28,10 +28,16 @@ def formula(tax_unit, period, parameters): # line 6: qualified expenses cover care for any qualifying # individual under HRS 235-55.6(b)(1), including a dependent or # spouse incapable of self-care, so adult care expenses count. - childcare_expenses = tax_unit("tax_unit_childcare_expenses", period) + # A return on which a filer can be claimed as a dependent has no + # dependent qualifying individual (hi_cdcc_qualifying_individual), so + # its childcare expenses do not count. + dependent_filer = tax_unit("head_or_spouse_is_dependent_elsewhere", period) + childcare_expenses = where( + dependent_filer, 0, tax_unit("tax_unit_childcare_expenses", period) + ) person = tax_unit.members care_expenses = person("care_expenses", period) - qualifying_person = person("is_cdcc_eligible", period) + qualifying_person = person("hi_cdcc_qualifying_individual", period) qualifying_care_expenses = tax_unit.sum(care_expenses * qualifying_person) qualified_expense_amount = childcare_expenses + qualifying_care_expenses # line 7 = min(line 5, line 6) = min(line 2, line 6): @@ -60,7 +66,9 @@ def formula(tax_unit, period, parameters): # line 15 excluded_benefit = 0 since we ignore line 12 # line 16 Taxable Benefit is ignored, since we never use it # line 17: - expenses_amount = p.expense_floor.calc(tax_unit("count_cdcc_eligible", period)) + expenses_amount = p.expense_floor.calc( + tax_unit("hi_cdcc_qualifying_individuals", period) + ) # line 18 = line 14 + line 15 = line 14 # line 19 = line 17 - line 18 = line 17 - line 14 net_expenses = max_(0, expenses_amount - deductible_benefit) diff --git a/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_eligible.py b/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_eligible.py index dabb23bd89b..06192837dbc 100644 --- a/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_eligible.py +++ b/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_eligible.py @@ -9,29 +9,23 @@ class hi_cdcc_eligible(Variable): definition_period = YEAR reference = ( "https://law.justia.com/codes/hawaii/title-14/chapter-235/section-235-55-6/", - "https://files.hawaii.gov/tax/legal/hrs/hrs_235.pdf#page=47", + # PDF pages 46-47 + "https://files.hawaii.gov/tax/legal/hrs/hrs_235.pdf#page=46", ) def formula(tax_unit, period, parameters): # HRS §235-55.6(a)(1) allows the credit to a taxpayer who "is not # claimed or is not otherwise eligible to be claimed as a dependent". # On a joint return a spouse who cannot be claimed may claim it for - # the qualifying individuals, including an incapacitated spouse who - # can be claimed; an incapacitated filer is not the qualifying - # individual of a spouse who can be claimed. - person = tax_unit.members - filer = person("is_tax_unit_head_or_spouse", period) - claimed = person("claimed_as_dependent_on_another_return", period) - claimed_filers = tax_unit.sum(filer & claimed) - other_filer_claimed = (claimed_filers - (filer & claimed)) > 0 - recipient = person("is_cdcc_eligible", period) & ~(filer & other_filer_claimed) + # an incapacitated spouse who can be claimed. + has_qualifying_individual = ( + tax_unit("hi_cdcc_qualifying_individuals", period) > 0 + ) every_filer_dependent = tax_unit("every_filer_is_dependent_elsewhere", period) # HRS §235-55.6(e)(2): a married taxpayer may claim the credit only # on a joint return, unless (e)(4) treats them as unmarried — the # same special rules as IRC §21(e)(2) and (4). filing_status_eligible = tax_unit("cdcc_filing_status_eligible", period) return ( - (tax_unit.sum(recipient) > 0) - & filing_status_eligible - & ~every_filer_dependent + has_qualifying_individual & filing_status_eligible & ~every_filer_dependent ) diff --git a/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_qualifying_individual.py b/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_qualifying_individual.py new file mode 100644 index 00000000000..2280f48c16e --- /dev/null +++ b/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_qualifying_individual.py @@ -0,0 +1,33 @@ +from policyengine_us.model_api import * + + +class hi_cdcc_qualifying_individual(Variable): + value_type = bool + entity = Person + label = "Qualifying individual for the Hawaii child and dependent care credit" + defined_for = StateCode.HI + definition_period = YEAR + # PDF pages 46-47: HRS 235-55.6(a)(1) and (b)(1). + reference = "https://files.hawaii.gov/tax/legal/hrs/hrs_235.pdf#page=46" + + def formula(person, period, parameters): + # HRS 235-55.6(b)(1): (A) "A dependent of the taxpayer who is under + # the age of thirteen", (B) "A dependent of the taxpayer who is + # physically or mentally incapable of caring for oneself", or (C) the + # incapacitated spouse. Unlike IRC 21(b)(1)(B), (B) does not disregard + # IRC 152(b)(1), so a return on which a filer can be claimed as a + # dependent has no dependent qualifying individual. + federal = person("is_cdcc_eligible", period) + filer = person("is_tax_unit_head_or_spouse", period) + claimed = person("claimed_as_dependent_on_another_return", period) + dependent_filer = person.tax_unit( + "head_or_spouse_is_dependent_elsewhere", period + ) + # HRS 235-55.6(a)(1) allows the credit to a taxpayer who "is not + # claimed or is not otherwise eligible to be claimed as a dependent", + # so an incapacitated filer is the qualifying individual only of a + # spouse who cannot be claimed. + claimed_filers = person.tax_unit.sum(filer & claimed) + other_filer_claimed = (claimed_filers - (filer & claimed)) > 0 + spouse_route = federal & filer & ~other_filer_claimed + return where(dependent_filer, spouse_route, federal) diff --git a/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_qualifying_individuals.py b/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_qualifying_individuals.py new file mode 100644 index 00000000000..a50177fdba4 --- /dev/null +++ b/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_qualifying_individuals.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class hi_cdcc_qualifying_individuals(Variable): + value_type = int + entity = TaxUnit + label = "Number of qualifying individuals for the Hawaii child and dependent care credit" + defined_for = StateCode.HI + definition_period = YEAR + # PDF pages 46-47: HRS 235-55.6(a)(1) and (b)(1). + reference = "https://files.hawaii.gov/tax/legal/hrs/hrs_235.pdf#page=46" + + def formula(tax_unit, period, parameters): + # Hawaii's count departs from the federal one only on a return with + # a filer who can be claimed as a dependent. + dependent_filer = tax_unit("head_or_spouse_is_dependent_elsewhere", period) + return where( + dependent_filer, + add(tax_unit, period, ["hi_cdcc_qualifying_individual"]), + tax_unit("count_cdcc_eligible", period), + ) diff --git a/policyengine_us/variables/gov/states/me/tax/income/taxable_income/deductions/personal_exemption/me_personal_exemption_deduction.py b/policyengine_us/variables/gov/states/me/tax/income/taxable_income/deductions/personal_exemption/me_personal_exemption_deduction.py index a5c856451f1..b817e4ccd6a 100644 --- a/policyengine_us/variables/gov/states/me/tax/income/taxable_income/deductions/personal_exemption/me_personal_exemption_deduction.py +++ b/policyengine_us/variables/gov/states/me/tax/income/taxable_income/deductions/personal_exemption/me_personal_exemption_deduction.py @@ -12,7 +12,7 @@ class me_personal_exemption_deduction(Variable): # Form 1040ME instructions, line 13: a filer who may be claimed as a # dependent has no exemption; on a joint return each spouse is # counted separately. - "https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/25_1040me_gen_instr_w_cover_pg.pdf#page=4", + "https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/25_1040me_gen_instr_w_cover_pg.pdf#page=5", ) defined_for = StateCode.ME diff --git a/policyengine_us/variables/gov/states/or/tax/income/credits/or_ctc.py b/policyengine_us/variables/gov/states/or/tax/income/credits/or_ctc.py index 7c419b92f0e..dc22df14448 100644 --- a/policyengine_us/variables/gov/states/or/tax/income/credits/or_ctc.py +++ b/policyengine_us/variables/gov/states/or/tax/income/credits/or_ctc.py @@ -26,7 +26,9 @@ def formula(tax_unit, period, parameters): # disregarding only 152(b)(3), so IRC 152(b)(1) applies: a return on # which the filer (or, if joint, either spouse) can be claimed as a # dependent has no dependents. - dependent_filer = tax_unit("head_or_spouse_is_dependent_elsewhere", period) + dependent_filer = person.tax_unit( + "head_or_spouse_is_dependent_elsewhere", period + ) eligible = age_eligible & dependent & ~dependent_filer count_eligible = tax_unit.sum(eligible) # Cap the number of qualifying dependents. diff --git a/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_eligibility_category.py b/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_eligibility_category.py index c621ba2da1a..89026e112e7 100644 --- a/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_eligibility_category.py +++ b/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_eligibility_category.py @@ -29,6 +29,16 @@ def formula(tax_unit, period, parameters): # Get the age of the youngest qualifying child. person = tax_unit.members age = person("age", period) + # ORS 315.264(2) uses the youngest qualifying individual. A child of + # a return on which a filer can be claimed as a dependent is not one, + # so that child does not set the column. + p_wfhdc = parameters(period).gov.states["or"].tax.income.credits.wfhdc + excluded_child = ( + person("is_tax_unit_dependent", period) + & (age <= p_wfhdc.child_age_limit) + & ~person("or_wfhdc_qualifying_individual", period) + ) + age = where(excluded_child, np.inf, age) min_age = tax_unit.min(age) # Determine if the youngest qualifying individual is disabled. diff --git a/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_has_qualified_individual_eligible.py b/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_has_qualified_individual_eligible.py index b11f0baf92c..a66b7b7c66c 100644 --- a/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_has_qualified_individual_eligible.py +++ b/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_has_qualified_individual_eligible.py @@ -8,32 +8,10 @@ class or_wfhdc_has_qualified_individual_eligible(Variable): documentation = "Oregon Working Family Household and Dependent Care Credit household eligibility" definition_period = YEAR reference = ( - "https://www.oregon.gov/dor/forms/FormsPubs/schedule-or-wfhdc-inst_101-195-1_2022.pdf#pahe=1", + "https://www.oregon.gov/dor/forms/FormsPubs/schedule-or-wfhdc-inst_101-195-1_2022.pdf#page=1", "https://law.justia.com/codes/oregon/2021/volume-08/chapter-315/section-315-264/", ) defined_for = StateCode.OR def formula(tax_unit, period, parameters): - p = parameters(period).gov.states["or"].tax.income.credits.wfhdc - - # ORS 315.264 takes the qualifying individuals of IRC 21(b)(1): a - # child dependent (a return on which a filer can be claimed has no - # dependents, IRC 152(b)(1)); a disabled dependent, determined without - # regard to 152(b)(1); and a disabled spouse. Schedule OR-WFHDC: - # "the word 'you' also refers to your spouse". - person = tax_unit.members - age = person("age", period) - disabled = person("is_disabled", period) - dependent = person("is_tax_unit_dependent", period) - spouse = person("is_tax_unit_spouse", period) - head = person("is_tax_unit_head", period) - joint = tax_unit("tax_unit_married", period) - dependent_filer = tax_unit("head_or_spouse_is_dependent_elsewhere", period) - child = dependent & (age <= p.child_age_limit) & ~dependent_filer - disabled_dependent = dependent & disabled - # On a joint return either spouse can be the other's qualifying - # individual. - disabled_spouse = disabled & (spouse | head) & joint - qualifying_individuals = child | disabled_dependent | disabled_spouse - - return tax_unit.any(qualifying_individuals) + return add(tax_unit, period, ["or_wfhdc_qualifying_individual"]) > 0 diff --git a/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_qualifying_individual.py b/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_qualifying_individual.py new file mode 100644 index 00000000000..d28792125b3 --- /dev/null +++ b/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_qualifying_individual.py @@ -0,0 +1,35 @@ +from policyengine_us.model_api import * + + +class or_wfhdc_qualifying_individual(Variable): + value_type = bool + entity = Person + label = "Qualifying individual for the Oregon Working Family Household and Dependent Care Credit" + definition_period = YEAR + reference = ( + "https://www.oregon.gov/dor/forms/FormsPubs/schedule-or-wfhdc-inst_101-195-1_2025.pdf#page=2", + "https://law.justia.com/codes/oregon/2021/volume-08/chapter-315/section-315-264/", + "https://www.law.cornell.edu/uscode/text/26/21#b_1", + ) + defined_for = StateCode.OR + + def formula(person, period, parameters): + p = parameters(period).gov.states["or"].tax.income.credits.wfhdc + # ORS 315.264 takes the qualifying individuals of IRC 21(b)(1): a + # child dependent (a return on which a filer can be claimed has no + # dependents, IRC 152(b)(1)); a disabled dependent, determined without + # regard to 152(b)(1); and a disabled spouse. Schedule OR-WFHDC: + # "the word 'you' also refers to your spouse", so on a joint return + # either spouse can be the other's qualifying individual. + age = person("age", period) + disabled = person("is_disabled", period) + dependent = person("is_tax_unit_dependent", period) + filer = person("is_tax_unit_head_or_spouse", period) + married = person.tax_unit("tax_unit_married", period) + dependent_filer = person.tax_unit( + "head_or_spouse_is_dependent_elsewhere", period + ) + child = dependent & (age <= p.child_age_limit) & ~dependent_filer + disabled_dependent = dependent & disabled + disabled_spouse = filer & disabled & married + return child | disabled_dependent | disabled_spouse From b4f3dde94bd1b625096e5b1885d12886c3d865b7 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 10 Oct 2026 09:50:53 -0400 Subject: [PATCH 3/7] Depart from the head and spouse count only when a filer can be claimed Maine's personal exemption and relief rebate and the Oregon dependent exemption reform keep reading head_spouse_count (which follows filing status and may be supplied) unless a filer can be claimed as a dependent. Co-Authored-By: Claude Opus 5.5 --- .../or_dependent_exemption_credit_reform.py | 7 +++++-- .../gov/states/me/tax/income/credits/me_relief_rebate.py | 7 ++++++- .../personal_exemption/me_personal_exemption_deduction.py | 7 ++++++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/policyengine_us/reforms/states/oregon/dependent_exemption_credit/or_dependent_exemption_credit_reform.py b/policyengine_us/reforms/states/oregon/dependent_exemption_credit/or_dependent_exemption_credit_reform.py index 24e87d3fa3c..92c23ced692 100644 --- a/policyengine_us/reforms/states/oregon/dependent_exemption_credit/or_dependent_exemption_credit_reform.py +++ b/policyengine_us/reforms/states/oregon/dependent_exemption_credit/or_dependent_exemption_credit_reform.py @@ -97,8 +97,11 @@ def formula(tax_unit, period, parameters): # Count the filers' own exemptions: none for a filer whom another # taxpayer can claim (ORS 316.085(1)(b)). - head_spouse_count = tax_unit( - "head_spouse_count_not_dependent_elsewhere", period + dependent_filer = tax_unit("head_or_spouse_is_dependent_elsewhere", period) + head_spouse_count = where( + dependent_filer, + tax_unit("head_spouse_count_not_dependent_elsewhere", period), + tax_unit("head_spouse_count", period), ) # Add older dependents (those excluded from dependent credit by age limit) diff --git a/policyengine_us/variables/gov/states/me/tax/income/credits/me_relief_rebate.py b/policyengine_us/variables/gov/states/me/tax/income/credits/me_relief_rebate.py index 53f4d903eb5..884df34848c 100644 --- a/policyengine_us/variables/gov/states/me/tax/income/credits/me_relief_rebate.py +++ b/policyengine_us/variables/gov/states/me/tax/income/credits/me_relief_rebate.py @@ -14,5 +14,10 @@ def formula(tax_unit, period, parameters): p = parameters(period).gov.states.me.tax.income.credits.relief_rebate # P.L. 2021, c. 635, Part L-3 pays each eligible resident who "may not # be claimed as a dependent on another taxpayer's return". - recipients = tax_unit("head_spouse_count_not_dependent_elsewhere", period) + dependent_filer = tax_unit("head_or_spouse_is_dependent_elsewhere", period) + recipients = where( + dependent_filer, + tax_unit("head_spouse_count_not_dependent_elsewhere", period), + tax_unit("head_spouse_count", period), + ) return recipients * p.amount diff --git a/policyengine_us/variables/gov/states/me/tax/income/taxable_income/deductions/personal_exemption/me_personal_exemption_deduction.py b/policyengine_us/variables/gov/states/me/tax/income/taxable_income/deductions/personal_exemption/me_personal_exemption_deduction.py index b817e4ccd6a..7d05bf996c6 100644 --- a/policyengine_us/variables/gov/states/me/tax/income/taxable_income/deductions/personal_exemption/me_personal_exemption_deduction.py +++ b/policyengine_us/variables/gov/states/me/tax/income/taxable_income/deductions/personal_exemption/me_personal_exemption_deduction.py @@ -37,7 +37,12 @@ def formula(tax_unit, period, parameters): # 13). A filer who may be claimed as a dependent on another person's # return gets no exemption: a joint return counts 1 when only one # spouse may be claimed and 0 when both may. - exemptions = tax_unit("head_spouse_count_not_dependent_elsewhere", period) + dependent_filer = tax_unit("head_or_spouse_is_dependent_elsewhere", period) + exemptions = where( + dependent_filer, + tax_unit("head_spouse_count_not_dependent_elsewhere", period), + tax_unit("head_spouse_count", period), + ) max_amount = exemptions * p.amount # Calculate the phaseout amount (line 7). From dddfbcb74e373d9075c7ecd3f16a1a2a4a55f957 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 10 Oct 2026 13:40:56 -0400 Subject: [PATCH 4/7] Read the split dependency inputs from #10024 in Oregon, Maine and Hawaii Dependent rules and Maine's childless EITC read the claimable-and-not-within-the-filing-exception helper; own exemptions, the Maine rebate and Hawaii's claimant test read claimability. Co-Authored-By: Claude Opus 5.5 --- .../hi_dependent_exemption_reform.py | 2 +- .../or_dependent_exemption_credit_reform.py | 4 +- .../income/credits/cdcc/hi_cdcc_eligible.yaml | 67 +++++++++++++++++++ ...hdc_has_qualified_individual_eligible.yaml | 60 +++++++++++++++++ .../hi_dependent_care_benefits.py | 4 +- .../cdcc/hi_cdcc_qualifying_individual.py | 19 +++--- .../exemptions/hi_disabled_exemptions.py | 2 +- .../exemptions/hi_regular_exemptions.py | 2 +- ...ependent_exemption_credit_amount_person.py | 2 +- .../eitc/me_pro_forma_childless_eitc.py | 4 +- .../or_disabled_child_dependent_exemptions.py | 4 +- .../states/or/tax/income/credits/or_ctc.py | 2 +- .../wfhdc/or_wfhdc_qualifying_individual.py | 2 +- 13 files changed, 154 insertions(+), 20 deletions(-) diff --git a/policyengine_us/reforms/states/hi/dependent_exemption/hi_dependent_exemption_reform.py b/policyengine_us/reforms/states/hi/dependent_exemption/hi_dependent_exemption_reform.py index 001bc329cc0..a547c8cc6a3 100644 --- a/policyengine_us/reforms/states/hi/dependent_exemption/hi_dependent_exemption_reform.py +++ b/policyengine_us/reforms/states/hi/dependent_exemption/hi_dependent_exemption_reform.py @@ -89,7 +89,7 @@ def formula(tax_unit, period, parameters): # exactly as the baseline computes it). person = tax_unit.members head_or_spouse = person("is_tax_unit_head_or_spouse", period) - claimed = person("claimed_as_dependent_on_another_return", period) + claimed = person("claimable_as_dependent_on_another_return", period) aged = person("age", period) >= p.aged_threshold aged_head_spouse_count = tax_unit.sum(aged & head_or_spouse & ~claimed) diff --git a/policyengine_us/reforms/states/oregon/dependent_exemption_credit/or_dependent_exemption_credit_reform.py b/policyengine_us/reforms/states/oregon/dependent_exemption_credit/or_dependent_exemption_credit_reform.py index 92c23ced692..1ff4effc4b0 100644 --- a/policyengine_us/reforms/states/oregon/dependent_exemption_credit/or_dependent_exemption_credit_reform.py +++ b/policyengine_us/reforms/states/oregon/dependent_exemption_credit/or_dependent_exemption_credit_reform.py @@ -18,7 +18,7 @@ def formula(tax_unit, period, parameters): # A return on which the filer (or, if joint, either spouse) can be # claimed as a dependent has no dependents (IRC 152(b)(1)). is_dependent = person("is_tax_unit_dependent", period) & ~person.tax_unit( - "head_or_spouse_is_dependent_elsewhere", period + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period ) # Apply age limit if in effect @@ -46,7 +46,7 @@ def formula(tax_unit, period, parameters): # A return on which the filer (or, if joint, either spouse) can be # claimed as a dependent has no dependents (IRC 152(b)(1)). is_dependent = person("is_tax_unit_dependent", period) & ~person.tax_unit( - "head_or_spouse_is_dependent_elsewhere", period + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period ) total_dependents = tax_unit.sum(is_dependent) eligible_dependents = tax_unit("or_eligible_dependents_count", period) diff --git a/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_eligible.yaml index 47cf3753a67..896e8717d67 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_eligible.yaml @@ -350,3 +350,70 @@ output: hi_cdcc_qualifying_individuals: 1 hi_cdcc_eligible: true + +# Publication 501, Dependent Taxpayer Test: a filer whose would-be claimant is not +# required to file and files no return or only for a refund can claim dependents. +# The spouse who cannot be claimed can then claim the credit for the child. +- name: 2025 joint return whose claimable spouse is within the filing exception has a qualifying child (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 30 + employment_income: 10000 + claimable_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 10000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + is_tax_unit_head: false + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: HI + output: + hi_cdcc_qualifying_individuals: 1 + hi_cdcc_eligible: true + +- name: 2025 joint return whose claimable spouse is within the filing exception has a qualifying child (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 30 + employment_income: 10000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 30 + employment_income: 10000 + claimable_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + is_tax_unit_head: false + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: HI + output: + hi_cdcc_qualifying_individuals: 1 + hi_cdcc_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_has_qualified_individual_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_has_qualified_individual_eligible.yaml index 3a75495a6cd..18bfad0703a 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_has_qualified_individual_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_has_qualified_individual_eligible.yaml @@ -297,3 +297,63 @@ state_code: OR output: or_wfhdc_has_qualified_individual_eligible: true + +# Publication 501, Dependent Taxpayer Test: a filer whose would-be claimant is not +# required to file and files no return or only for a refund can claim dependents. +- name: 2025 child of a joint return whose claimable spouse is within the filing exception is a qualified individual (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 30 + claimable_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + is_tax_unit_head: false + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: OR + output: + or_wfhdc_has_qualified_individual_eligible: true + +- name: 2025 child of a joint return whose claimable spouse is within the filing exception is a qualified individual (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 30 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 30 + claimable_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + is_tax_unit_head: false + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: OR + output: + or_wfhdc_has_qualified_individual_eligible: true diff --git a/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/dependent_care_benefit/hi_dependent_care_benefits.py b/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/dependent_care_benefit/hi_dependent_care_benefits.py index 37e776f5eb5..669fefd4739 100644 --- a/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/dependent_care_benefit/hi_dependent_care_benefits.py +++ b/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/dependent_care_benefit/hi_dependent_care_benefits.py @@ -31,7 +31,9 @@ def formula(tax_unit, period, parameters): # A return on which a filer can be claimed as a dependent has no # dependent qualifying individual (hi_cdcc_qualifying_individual), so # its childcare expenses do not count. - dependent_filer = tax_unit("head_or_spouse_is_dependent_elsewhere", period) + dependent_filer = tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) childcare_expenses = where( dependent_filer, 0, tax_unit("tax_unit_childcare_expenses", period) ) diff --git a/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_qualifying_individual.py b/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_qualifying_individual.py index 2280f48c16e..759a1aad1e9 100644 --- a/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_qualifying_individual.py +++ b/policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_qualifying_individual.py @@ -16,18 +16,19 @@ def formula(person, period, parameters): # physically or mentally incapable of caring for oneself", or (C) the # incapacitated spouse. Unlike IRC 21(b)(1)(B), (B) does not disregard # IRC 152(b)(1), so a return on which a filer can be claimed as a - # dependent has no dependent qualifying individual. + # dependent has no dependent qualifying individual (unless the + # would-be claimant meets the filing exception, Publication 501). federal = person("is_cdcc_eligible", period) filer = person("is_tax_unit_head_or_spouse", period) - claimed = person("claimed_as_dependent_on_another_return", period) - dependent_filer = person.tax_unit( - "head_or_spouse_is_dependent_elsewhere", period - ) + claimable = person("claimable_as_dependent_on_another_return", period) # HRS 235-55.6(a)(1) allows the credit to a taxpayer who "is not # claimed or is not otherwise eligible to be claimed as a dependent", # so an incapacitated filer is the qualifying individual only of a # spouse who cannot be claimed. - claimed_filers = person.tax_unit.sum(filer & claimed) - other_filer_claimed = (claimed_filers - (filer & claimed)) > 0 - spouse_route = federal & filer & ~other_filer_claimed - return where(dependent_filer, spouse_route, federal) + claimable_filers = person.tax_unit.sum(filer & claimable) + other_filer_claimable = (claimable_filers - (filer & claimable)) > 0 + qualifies = federal & ~(filer & other_filer_claimable) + no_dependents = person.tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + return where(no_dependents, qualifies & filer, qualifies) diff --git a/policyengine_us/variables/gov/states/hi/tax/income/exemptions/hi_disabled_exemptions.py b/policyengine_us/variables/gov/states/hi/tax/income/exemptions/hi_disabled_exemptions.py index 6be44bc760b..94bb6cd8139 100644 --- a/policyengine_us/variables/gov/states/hi/tax/income/exemptions/hi_disabled_exemptions.py +++ b/policyengine_us/variables/gov/states/hi/tax/income/exemptions/hi_disabled_exemptions.py @@ -34,7 +34,7 @@ def formula(tax_unit, period, parameters): # Aged individuals get an extra base exemption. Under HRS 235-54(a) # the regular and aged exemptions of a filer whom another taxpayer # can claim are zero. - claimed = person("claimed_as_dependent_on_another_return", period) + claimed = person("claimable_as_dependent_on_another_return", period) head_or_spouse_amount = p.base * (1 + aged) * head_or_spouse * ~claimed conditional_head_or_spouse_amount = max_( disabled_exemption, head_or_spouse_amount diff --git a/policyengine_us/variables/gov/states/hi/tax/income/exemptions/hi_regular_exemptions.py b/policyengine_us/variables/gov/states/hi/tax/income/exemptions/hi_regular_exemptions.py index 0126dfe5d62..8dd7dba3403 100644 --- a/policyengine_us/variables/gov/states/hi/tax/income/exemptions/hi_regular_exemptions.py +++ b/policyengine_us/variables/gov/states/hi/tax/income/exemptions/hi_regular_exemptions.py @@ -26,7 +26,7 @@ def formula(tax_unit, period, parameters): # exemption. person = tax_unit.members head_or_spouse = person("is_tax_unit_head_or_spouse", period) - claimed = person("claimed_as_dependent_on_another_return", period) + claimed = person("claimable_as_dependent_on_another_return", period) aged = person("age", period) >= p.aged_threshold aged_head_spouse_count = tax_unit.sum(aged & head_or_spouse & ~claimed) total_exemption_count_including_aged = exemptions_count + aged_head_spouse_count diff --git a/policyengine_us/variables/gov/states/me/tax/income/credits/dependent_exemption/me_dependent_exemption_credit_amount_person.py b/policyengine_us/variables/gov/states/me/tax/income/credits/dependent_exemption/me_dependent_exemption_credit_amount_person.py index 885ba7e12bf..2c9b973e63a 100644 --- a/policyengine_us/variables/gov/states/me/tax/income/credits/dependent_exemption/me_dependent_exemption_credit_amount_person.py +++ b/policyengine_us/variables/gov/states/me/tax/income/credits/dependent_exemption/me_dependent_exemption_credit_amount_person.py @@ -20,7 +20,7 @@ def formula(person, period, parameters): # joint, either spouse) can be claimed as a dependent has no # dependents (IRC 152(b)(1)). dependent_filer = person.tax_unit( - "head_or_spouse_is_dependent_elsewhere", period + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period ) dependent = dependent & ~dependent_filer p = parameters(period).gov.states.me.tax.income.credits.dependent_exemption diff --git a/policyengine_us/variables/gov/states/me/tax/income/credits/eitc/me_pro_forma_childless_eitc.py b/policyengine_us/variables/gov/states/me/tax/income/credits/eitc/me_pro_forma_childless_eitc.py index 7123d651793..077ee7e7f97 100644 --- a/policyengine_us/variables/gov/states/me/tax/income/credits/eitc/me_pro_forma_childless_eitc.py +++ b/policyengine_us/variables/gov/states/me/tax/income/credits/eitc/me_pro_forma_childless_eitc.py @@ -33,7 +33,9 @@ def formula(tax_unit, period, parameters): # 32(c)(1)(A)(ii)(III): the filer may not be a dependent of another # taxpayer, and on a joint return neither spouse may be (Publication # 596, Rule 12). - dependent_filer = tax_unit("head_or_spouse_is_dependent_elsewhere", period) + dependent_filer = tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) return ( min_(phased_in, max_(0, maximum - reduction)) * investment_eligible diff --git a/policyengine_us/variables/gov/states/or/tax/income/credits/exemption/or_disabled_child_dependent_exemptions.py b/policyengine_us/variables/gov/states/or/tax/income/credits/exemption/or_disabled_child_dependent_exemptions.py index b547b12994b..0900745eccd 100644 --- a/policyengine_us/variables/gov/states/or/tax/income/credits/exemption/or_disabled_child_dependent_exemptions.py +++ b/policyengine_us/variables/gov/states/or/tax/income/credits/exemption/or_disabled_child_dependent_exemptions.py @@ -25,6 +25,8 @@ def formula(tax_unit, period, parameters): # ORS 316.099 requires "a dependent of the taxpayer"; under IRC # 152(b)(1) a return on which the filer (or, if joint, either spouse) # can be claimed as a dependent has no dependents. - dependent_filer = tax_unit("head_or_spouse_is_dependent_elsewhere", period) + dependent_filer = tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) count = tax_unit.sum(eitc_qualifying_child & disabled) return qualifies * where(dependent_filer, 0, count) diff --git a/policyengine_us/variables/gov/states/or/tax/income/credits/or_ctc.py b/policyengine_us/variables/gov/states/or/tax/income/credits/or_ctc.py index dc22df14448..1b71434a4a9 100644 --- a/policyengine_us/variables/gov/states/or/tax/income/credits/or_ctc.py +++ b/policyengine_us/variables/gov/states/or/tax/income/credits/or_ctc.py @@ -27,7 +27,7 @@ def formula(tax_unit, period, parameters): # which the filer (or, if joint, either spouse) can be claimed as a # dependent has no dependents. dependent_filer = person.tax_unit( - "head_or_spouse_is_dependent_elsewhere", period + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period ) eligible = age_eligible & dependent & ~dependent_filer count_eligible = tax_unit.sum(eligible) diff --git a/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_qualifying_individual.py b/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_qualifying_individual.py index d28792125b3..554b7c65637 100644 --- a/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_qualifying_individual.py +++ b/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_qualifying_individual.py @@ -27,7 +27,7 @@ def formula(person, period, parameters): filer = person("is_tax_unit_head_or_spouse", period) married = person.tax_unit("tax_unit_married", period) dependent_filer = person.tax_unit( - "head_or_spouse_is_dependent_elsewhere", period + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period ) child = dependent & (age <= p.child_age_limit) & ~dependent_filer disabled_dependent = dependent & disabled From cdd12e84b33f0b5bd5c87893c85931c06a205d80 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 10 Oct 2026 15:25:31 -0400 Subject: [PATCH 5/7] Address the second Oregon, Maine and Hawaii claimable-filer review - Oregon working family credit: the expenses read the federal qualifying childcare, so childcare for a child who is not a qualifying individual no longer counts. - References: the Oregon instructions open at page 1 (pages 1-2); Maine's relief rebate cites P.L. 2021, c. 635, Part L-3. - Tests: the Oregon expenses under both labellings, and the Oregon and Hawaii dependent exemption reforms with a claimable filer. Co-Authored-By: Claude Opus 5.5 --- changelog.d/claimable-filer-or-me-hi.fixed.md | 2 +- .../wfhdc/or_cdcc_relevent_expenses.yaml | 101 ++++++++++++++++++ .../hi/dependent_exemption_reform_test.yaml | 37 +++++++ ...ependent_exemption_credit_reform_test.yaml | 26 +++++ .../me/tax/income/credits/me_relief_rebate.py | 6 +- .../wfhdc/or_cdcc_relevant_expenses.py | 6 +- .../wfhdc/or_wfhdc_qualifying_individual.py | 3 +- 7 files changed, 176 insertions(+), 5 deletions(-) diff --git a/changelog.d/claimable-filer-or-me-hi.fixed.md b/changelog.d/claimable-filer-or-me-hi.fixed.md index 31eea968923..b75a26865ca 100644 --- a/changelog.d/claimable-filer-or-me-hi.fixed.md +++ b/changelog.d/claimable-filer-or-me-hi.fixed.md @@ -1 +1 @@ -Apply Oregon, Maine and Hawaii rules for a filer who can be claimed as a dependent: Maine's personal exemption counts only filers who may not be claimed (1040ME line 13), and Maine's dependent exemption credit, expanded childless EITC and 2021 relief rebate, Oregon's Kids Credit, disabled child exemption and working family household and dependent care credit child (and that credit's column), and Hawaii's age-65 exemption and child care credit qualifying individuals and expenses follow the dependent taxpayer rules; Oregon's working family credit now counts a disabled spouse under either head/spouse label. +Apply Oregon, Maine and Hawaii rules for a filer who can be claimed as a dependent: Maine's personal exemption counts only filers who may not be claimed (1040ME line 13), and Maine's dependent exemption credit, expanded childless EITC and 2021 relief rebate, Oregon's Kids Credit, disabled child exemption and working family household and dependent care credit child (with its expenses and column), and Hawaii's age-65 exemption and child care credit qualifying individuals and expenses follow the dependent taxpayer rules; Oregon's working family credit now counts a disabled spouse under either head/spouse label. diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_cdcc_relevent_expenses.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_cdcc_relevent_expenses.yaml index 2feb37c0d3d..f81273154f8 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_cdcc_relevent_expenses.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_cdcc_relevent_expenses.yaml @@ -38,3 +38,104 @@ state_code: OR output: or_cdcc_relevant_expenses: 5_000 # min(5000, 12000, 30000) + +# ORS 315.264(1)(a) covers expenses for qualifying individuals. The child of a +# return on which a filer can be claimed as a dependent is not one; the +# incapacitated spouse is, but has no care expenses here. +- name: 2025 childcare for the child of a joint return with one claimable spouse does not count (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 40 + employment_income: 5000 + claimable_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 40 + employment_income: 5000 + is_disabled: true + is_incapable_of_self_care: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 10 + is_tax_unit_head: false + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + tax_unit_childcare_expenses: 1000 + households: + household: + members: [person_a, person_b, child] + state_code: OR + output: + or_cdcc_relevant_expenses: 0 + +- name: 2025 childcare for the child of a joint return with one claimable spouse does not count (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 40 + employment_income: 5000 + is_disabled: true + is_incapable_of_self_care: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 40 + employment_income: 5000 + claimable_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 10 + is_tax_unit_head: false + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + tax_unit_childcare_expenses: 1000 + households: + household: + members: [person_b, person_a, child] + state_code: OR + output: + or_cdcc_relevant_expenses: 0 + +- name: 2025 the same joint return with neither spouse claimable counts the childcare + period: 2025 + input: + people: + person_a: + age: 40 + employment_income: 5000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 40 + employment_income: 5000 + is_disabled: true + is_incapable_of_self_care: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 10 + is_tax_unit_head: false + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + tax_unit_childcare_expenses: 1000 + households: + household: + members: [person_a, person_b, child] + state_code: OR + output: + or_cdcc_relevant_expenses: 1000 diff --git a/policyengine_us/tests/policy/contrib/states/hi/dependent_exemption_reform_test.yaml b/policyengine_us/tests/policy/contrib/states/hi/dependent_exemption_reform_test.yaml index 398865a7a4d..728c5e1c43a 100644 --- a/policyengine_us/tests/policy/contrib/states/hi/dependent_exemption_reform_test.yaml +++ b/policyengine_us/tests/policy/contrib/states/hi/dependent_exemption_reform_test.yaml @@ -204,3 +204,40 @@ tax_units: {tax_unit: {members: [person_b, person_a, child1], filing_status: JOINT}} households: {household: {members: [person_b, person_a, child1], state_name: HI}} output: {hi_regular_exemptions: 1_144} + +# HRS 235-54(a): the regular and age-65 exemptions of a filer who can be claimed +# as a dependent are zero, as in the baseline. +- name: HI dependent exemption reform - claimable filer aged 70 has no age exemption + period: 2025 + reforms: policyengine_us.reforms.states.hi.dependent_exemption.hi_dependent_exemption_reform.hi_dependent_exemption_reform + input: + gov.contrib.states.hi.dependent_exemption.in_effect: true + people: + filer: {age: 70, claimable_as_dependent_on_another_return: true} + tax_units: {tax_unit: {members: [filer], filing_status: SINGLE}} + households: {household: {members: [filer], state_name: HI}} + output: {hi_regular_exemptions: 0} + +- name: HI dependent exemption reform - joint return keeps the other spouse's age exemption (the claimable spouse is the head) + period: 2025 + reforms: policyengine_us.reforms.states.hi.dependent_exemption.hi_dependent_exemption_reform.hi_dependent_exemption_reform + input: + gov.contrib.states.hi.dependent_exemption.in_effect: true + people: + person_a: {age: 70, claimable_as_dependent_on_another_return: true, is_tax_unit_head: true, is_tax_unit_spouse: false} + person_b: {age: 68, is_tax_unit_head: false, is_tax_unit_spouse: true} + tax_units: {tax_unit: {members: [person_a, person_b], filing_status: JOINT}} + households: {household: {members: [person_a, person_b], state_name: HI}} + output: {hi_regular_exemptions: 2_288} # the other spouse's regular and age exemptions + +- name: HI dependent exemption reform - joint return keeps the other spouse's age exemption (the claimable spouse is the spouse) + period: 2025 + reforms: policyengine_us.reforms.states.hi.dependent_exemption.hi_dependent_exemption_reform.hi_dependent_exemption_reform + input: + gov.contrib.states.hi.dependent_exemption.in_effect: true + people: + person_b: {age: 68, is_tax_unit_head: true, is_tax_unit_spouse: false} + person_a: {age: 70, claimable_as_dependent_on_another_return: true, is_tax_unit_head: false, is_tax_unit_spouse: true} + tax_units: {tax_unit: {members: [person_b, person_a], filing_status: JOINT}} + households: {household: {members: [person_b, person_a], state_name: HI}} + output: {hi_regular_exemptions: 2_288} diff --git a/policyengine_us/tests/policy/contrib/states/or/dependent_exemption_credit_reform_test.yaml b/policyengine_us/tests/policy/contrib/states/or/dependent_exemption_credit_reform_test.yaml index cbb0c20e7e5..591e440ba00 100644 --- a/policyengine_us/tests/policy/contrib/states/or/dependent_exemption_credit_reform_test.yaml +++ b/policyengine_us/tests/policy/contrib/states/or/dependent_exemption_credit_reform_test.yaml @@ -163,3 +163,29 @@ or_dependent_exemption_credit: 0 or_exemption_credit: 0 +# ORS 316.085(1)(b): no exemption credit for a filer whom another taxpayer can +# claim, and such a return has no dependents (IRC 152(b)(1)), as in the baseline. +- name: OR dependent exemption credit reform - claimable single filer with a child gets no credit + period: 2025 + absolute_error_margin: 0.5 + reforms: policyengine_us.reforms.states.oregon.dependent_exemption_credit.or_dependent_exemption_credit_reform.or_dependent_exemption_credit_reform + input: + gov.contrib.states.or.dependent_exemption_credit.in_effect: true + people: + parent: + age: 40 + employment_income: 30_000 + claimable_as_dependent_on_another_return: true + child: + age: 10 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [parent, child] + filing_status: SINGLE + households: + household: + members: [parent, child] + state_name: OR + output: + or_exemption_credit: 0 diff --git a/policyengine_us/variables/gov/states/me/tax/income/credits/me_relief_rebate.py b/policyengine_us/variables/gov/states/me/tax/income/credits/me_relief_rebate.py index 884df34848c..9aa02115b7f 100644 --- a/policyengine_us/variables/gov/states/me/tax/income/credits/me_relief_rebate.py +++ b/policyengine_us/variables/gov/states/me/tax/income/credits/me_relief_rebate.py @@ -8,7 +8,11 @@ class me_relief_rebate(Variable): defined_for = "me_relief_rebate_eligible" unit = USD definition_period = YEAR - reference = "https://www.maine.gov/governor/mills/relief-checks" + reference = ( + "https://www.maine.gov/governor/mills/relief-checks", + # P.L. 2021, c. 635, Part L, section L-3. + "https://www.legislature.maine.gov/legis/bills/getPDF.asp?item=3&paper=HP1482&snum=130#page=176", + ) def formula(tax_unit, period, parameters): p = parameters(period).gov.states.me.tax.income.credits.relief_rebate diff --git a/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_cdcc_relevant_expenses.py b/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_cdcc_relevant_expenses.py index 341ddea712a..100aa4ec39d 100644 --- a/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_cdcc_relevant_expenses.py +++ b/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_cdcc_relevant_expenses.py @@ -16,8 +16,10 @@ def formula(tax_unit, period, parameters): # ORS 315.264(1)(a) covers expenses of a type allowable under IRC # §21: childcare plus care for a disabled adult qualifying - # individual (care_expenses). - childcare = tax_unit("tax_unit_childcare_expenses", period) + # individual (care_expenses). The federal rule leaves out childcare + # for a child who is not a qualifying individual because a filer can + # be claimed as a dependent. + childcare = tax_unit("cdcc_qualifying_childcare_expenses", period) adult_care = add(tax_unit, period, ["care_expenses"]) expenses = childcare + adult_care # First, cap based on the number of eligible care receivers diff --git a/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_qualifying_individual.py b/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_qualifying_individual.py index 554b7c65637..7418c73caa4 100644 --- a/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_qualifying_individual.py +++ b/policyengine_us/variables/gov/states/or/tax/income/credits/wfhdc/or_wfhdc_qualifying_individual.py @@ -7,7 +7,8 @@ class or_wfhdc_qualifying_individual(Variable): label = "Qualifying individual for the Oregon Working Family Household and Dependent Care Credit" definition_period = YEAR reference = ( - "https://www.oregon.gov/dor/forms/FormsPubs/schedule-or-wfhdc-inst_101-195-1_2025.pdf#page=2", + # PDF pages 1-2 + "https://www.oregon.gov/dor/forms/FormsPubs/schedule-or-wfhdc-inst_101-195-1_2025.pdf#page=1", "https://law.justia.com/codes/oregon/2021/volume-08/chapter-315/section-315-264/", "https://www.law.cornell.edu/uscode/text/26/21#b_1", ) From a1d0de7ecb4d8c3da8d159f63a833b670cc4f7f7 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 10 Oct 2026 15:52:45 -0400 Subject: [PATCH 6/7] Test Oregon's expenses for an incapacitated teenager on a return with a claimable spouse The federal qualifying-childcare rule now keeps childcare when any child under 18 is still a qualifying individual. Co-Authored-By: Claude Opus 5.5 --- .../wfhdc/or_cdcc_relevent_expenses.yaml | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_cdcc_relevent_expenses.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_cdcc_relevent_expenses.yaml index f81273154f8..0c68d86ebfd 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_cdcc_relevent_expenses.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/wfhdc/or_cdcc_relevent_expenses.yaml @@ -139,3 +139,72 @@ state_code: OR output: or_cdcc_relevant_expenses: 1000 + +# A dependent incapable of self-care is a qualifying individual at any age, also +# when a filer can be claimed (IRC 21(b)(1)(B)), so the childcare of an +# incapacitated 14-year-old counts. +- name: 2025 childcare for the incapacitated teenager of a joint return with one claimable spouse counts (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 40 + employment_income: 5000 + claimable_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 40 + employment_income: 5000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 14 + is_disabled: true + is_incapable_of_self_care: true + is_tax_unit_head: false + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + tax_unit_childcare_expenses: 1000 + households: + household: + members: [person_a, person_b, child] + state_code: OR + output: + or_cdcc_relevant_expenses: 1000 + +- name: 2025 childcare for the incapacitated teenager of a joint return with one claimable spouse counts (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 40 + employment_income: 5000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 40 + employment_income: 5000 + claimable_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 14 + is_disabled: true + is_incapable_of_self_care: true + is_tax_unit_head: false + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + tax_unit_childcare_expenses: 1000 + households: + household: + members: [person_b, person_a, child] + state_code: OR + output: + or_cdcc_relevant_expenses: 1000 From f020367295360157efbd3df07498919fb74a3f7e Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 10 Oct 2026 16:16:42 -0400 Subject: [PATCH 7/7] Give Oregon's higher EITC rate only for a legal dependent under three ORS 315.266 gives 12 percent to a taxpayer with a dependent under three and 9 percent otherwise. A return on which a filer can be claimed as a dependent (outside the claimant filing exception) has no dependents, so it keeps the ordinary rate on its federal credit. Co-Authored-By: Claude Opus 5.5 --- changelog.d/claimable-filer-or-me-hi.fixed.md | 2 +- .../states/or/tax/income/credits/or_eitc.yaml | 133 ++++++++++++++++++ .../states/or/tax/income/credits/or_eitc.py | 17 ++- 3 files changed, 149 insertions(+), 3 deletions(-) diff --git a/changelog.d/claimable-filer-or-me-hi.fixed.md b/changelog.d/claimable-filer-or-me-hi.fixed.md index b75a26865ca..16c0f4aa91e 100644 --- a/changelog.d/claimable-filer-or-me-hi.fixed.md +++ b/changelog.d/claimable-filer-or-me-hi.fixed.md @@ -1 +1 @@ -Apply Oregon, Maine and Hawaii rules for a filer who can be claimed as a dependent: Maine's personal exemption counts only filers who may not be claimed (1040ME line 13), and Maine's dependent exemption credit, expanded childless EITC and 2021 relief rebate, Oregon's Kids Credit, disabled child exemption and working family household and dependent care credit child (with its expenses and column), and Hawaii's age-65 exemption and child care credit qualifying individuals and expenses follow the dependent taxpayer rules; Oregon's working family credit now counts a disabled spouse under either head/spouse label. +Apply Oregon, Maine and Hawaii rules for a filer who can be claimed as a dependent: Maine's personal exemption counts only filers who may not be claimed (1040ME line 13), and Maine's dependent exemption credit, expanded childless EITC and 2021 relief rebate, Oregon's Kids Credit, disabled child exemption, higher EITC rate for a dependent under three and working family household and dependent care credit child (with its expenses and column), and Hawaii's age-65 exemption and child care credit qualifying individuals and expenses follow the dependent taxpayer rules; Oregon's working family credit now counts a disabled spouse under either head/spouse label. diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/or_eitc.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/or_eitc.yaml index 8e488160f3a..475df7dab97 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/or_eitc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/or/tax/income/credits/or_eitc.yaml @@ -153,3 +153,136 @@ eitc: 0 output: or_eitc: 0 + +# ORS 315.266: the 12 percent rate needs "a dependent under the age of three". A +# return on which a filer can be claimed as a dependent has no dependents (IRC +# 152(b)(1)), so it gets 9 percent of its federal credit. +- name: 2025 claimable filer with a child under 3 gets the 9% match + period: 2025 + input: + people: + parent: + age: 30 + claimable_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 2 + is_tax_unit_head: false + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [parent, child] + eitc: 100 + households: + household: + members: [parent, child] + state_code: OR + output: + or_eitc: 9 + +- name: 2025 joint return with one claimable spouse and a child under 3 gets the 9% match (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 30 + claimable_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 2 + is_tax_unit_head: false + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + eitc: 100 + households: + household: + members: [person_a, person_b, child] + state_code: OR + output: + or_eitc: 9 + +- name: 2025 joint return with one claimable spouse and a child under 3 gets the 9% match (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 30 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 30 + claimable_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 2 + is_tax_unit_head: false + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + eitc: 100 + households: + household: + members: [person_b, person_a, child] + state_code: OR + output: + or_eitc: 9 + +- name: 2025 claimable filer within the filing exception with a child under 3 gets the 12% match + period: 2025 + input: + people: + parent: + age: 30 + claimable_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 2 + is_tax_unit_head: false + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [parent, child] + eitc: 100 + households: + household: + members: [parent, child] + state_code: OR + output: + or_eitc: 12 + +- name: 2025 filer who cannot be claimed with a child under 3 gets the 12% match + period: 2025 + input: + people: + parent: + age: 30 + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 2 + is_tax_unit_head: false + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [parent, child] + eitc: 100 + households: + household: + members: [parent, child] + state_code: OR + output: + or_eitc: 12 diff --git a/policyengine_us/variables/gov/states/or/tax/income/credits/or_eitc.py b/policyengine_us/variables/gov/states/or/tax/income/credits/or_eitc.py index d568b8b0cfd..1d92afeab91 100644 --- a/policyengine_us/variables/gov/states/or/tax/income/credits/or_eitc.py +++ b/policyengine_us/variables/gov/states/or/tax/income/credits/or_eitc.py @@ -9,6 +9,7 @@ class or_eitc(Variable): definition_period = YEAR reference = ( "https://www.oregon.gov/dor/forms/FormsPubs/form-or-40-inst_101-040-1_2021.pdf#page=18", + "https://www.oregon.gov/dor/forms/FormsPubs/form-or-40-inst_101-040-1_2025.pdf#page=22", "https://www.oregonlegislature.gov/bills_laws/ors/ors315.html", # Subsection 315.266 ) defined_for = StateCode.OR @@ -19,8 +20,20 @@ def formula(tax_unit, period, parameters): # Check if the tax unit has a young child to qualify for a higher rate. person = tax_unit.members p = parameters(period).gov.states["or"].tax.income.credits.eitc - # Check if any person in the simulation in a young child. - young_child = person("age", period) < p.old_child_age + # ORS 315.266 gives the higher rate to a taxpayer "with a dependent + # under the age of three" (Form OR-40 instructions: 9 percent with "no + # dependents"). A return on which a filer can be claimed as a + # dependent has no dependents (IRC 152(b)(1)), unless the would-be + # claimant meets the filing exception; it keeps the ordinary rate on + # its federal credit. + dependent_filer = person.tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + young_child = ( + (person("age", period) < p.old_child_age) + & person("is_tax_unit_dependent", period) + & ~dependent_filer + ) # Re-aggregate to the tax unit level. has_young_child = tax_unit.any(young_child) # Multiply by the relevant factor.