diff --git a/changelog.d/claimable-filer-ia-ks-ky-la-md.fixed.md b/changelog.d/claimable-filer-ia-ks-ky-la-md.fixed.md new file mode 100644 index 00000000000..d6d0a314c38 --- /dev/null +++ b/changelog.d/claimable-filer-ia-ks-ky-la-md.fixed.md @@ -0,0 +1 @@ +Apply Iowa, Kansas, Louisiana and Maryland rules for a filer who can be claimed as a dependent: no dependent exemptions or credits on a return with a claimable filer outside the claimant filing exception (Iowa dependent credit, Kansas dependent exemption and food sales tax credit child, Louisiana dependent exemption, Maryland dependent and aged-dependent exemptions and child tax credit). Iowa withholds the low-income exemption, the single-filer tax reduction and the alternate tax from a claimed dependent only when the claiming person's net income exceeds the Iowa Code 422.5 limit, using new claimant income and filing status inputs. Kansas counts each filer whom no one else may claim, plus allowable dependents, for its 2021-2023 exemptions, and each such filer plus dependent children under 18 for its food sales tax credit. Kansas also gives a 2021-2023 head of household one filer exemption rather than two, since K.S.A. 79-32,121 limited the extra allowance to tax year 1998. Maryland keeps every filer's own exemption under Tax-General 10-211(a)(1), including a filer who can be claimed. Its poverty line credit excludes only a filer actually claimed as an exemption on another Maryland return, through a new input that defaults to the federal claim, and keeps ordinary earned income; a Maryland filer who can be claimed gets no childless EITC. Also limit Maryland's aged dependent exemption by federal AGI under Tax-General 10-211(c), as for the personal exemption. diff --git a/policyengine_us/parameters/gov/states/ks/tax/income/credits/food_sales_tax/amount.yaml b/policyengine_us/parameters/gov/states/ks/tax/income/credits/food_sales_tax/amount.yaml index 5869559d8f2..4707a9afb94 100644 --- a/policyengine_us/parameters/gov/states/ks/tax/income/credits/food_sales_tax/amount.yaml +++ b/policyengine_us/parameters/gov/states/ks/tax/income/credits/food_sales_tax/amount.yaml @@ -1,4 +1,4 @@ -description: Kansas provides a food sales tax credit of this amount per qualifying exemption. +description: Kansas provides a food sales tax credit of this amount per exemption claimed on the federal return. values: 2015-01-01: 125 2025-01-01: 0 @@ -16,5 +16,7 @@ metadata: href: https://www.ksrevenue.gov/pdf/ip24.pdf#page=5 - title: HB 2106 (2022) - Food sales tax phase-out href: https://kslegislature.gov/li_2022/b2021_22/measures/hb2106/ + - title: 2022 HB 2106, section 4, amending K.S.A. 79-32,271 + href: https://kslegislature.gov/li_2022/b2021_22/measures/documents/hb2106_enrolled.pdf#page=2 - title: Kansas 2022 Statute Article 32 79-32,271(d) href: https://kslegislature.gov/b2023_24/laws/079_000_0000_chapter/079_032_0000_article/079_032_0271_section/079_032_0271_k/ diff --git a/policyengine_us/parameters/gov/states/ks/tax/income/exemptions/consolidated/amount.yaml b/policyengine_us/parameters/gov/states/ks/tax/income/exemptions/consolidated/amount.yaml index 9e705b204aa..a97931d3ebe 100644 --- a/policyengine_us/parameters/gov/states/ks/tax/income/exemptions/consolidated/amount.yaml +++ b/policyengine_us/parameters/gov/states/ks/tax/income/exemptions/consolidated/amount.yaml @@ -1,4 +1,4 @@ -description: Kansas provides this exemption for each person in a filing unit, pre 2024. +description: Kansas provides this exemption for each federal exemption to which a filer is entitled, before 2024. values: 2021-01-01: 2_250 @@ -22,3 +22,7 @@ metadata: # Legal code represents post 2024 structure - title: Kan. Stat. § 79-32,121 (a) href: https://ksrevisor.gov/statutes/chapters/ch79/079_032_0121.html + - title: K.S.A. 79-32,121(a), 2023 statutory edition + href: https://kslegislature.gov/li_2024s/b2023_24/statute/079_000_0000_chapter/079_032_0000_article/079_032_0121_section/079_032_0121_k/ + - title: 2022 HB 2239, section 40, reenacting K.S.A. 79-32,121(a) + href: https://www.kslegislature.gov/li_2022/b2021_22/measures/documents/hb2239_enrolled.pdf#page=38 diff --git a/policyengine_us/reforms/state_dependent_exemptions/repeal_state_dependent_exemptions.py b/policyengine_us/reforms/state_dependent_exemptions/repeal_state_dependent_exemptions.py index d9d35617cc0..862d1e6c8c7 100644 --- a/policyengine_us/reforms/state_dependent_exemptions/repeal_state_dependent_exemptions.py +++ b/policyengine_us/reforms/state_dependent_exemptions/repeal_state_dependent_exemptions.py @@ -367,11 +367,9 @@ def formula(tax_unit, period, parameters): head_of_household * p.by_filing_status.hoh_additional_amount ) return base_amount + veterans_exemption_amount + hoh_additional - filing_status = tax_unit("filing_status", period) - statuses = filing_status.possible_values - joint = filing_status == statuses.JOINT - hoh = filing_status == statuses.HEAD_OF_HOUSEHOLD - adults = where(joint | hoh, 2, 1) + # K.S.A. 79-32,121(a) with IRC 151(d)(2): each filer whom no one + # else may claim keeps an exemption, as in ks_count_exemptions. + adults = tax_unit("head_spouse_count_not_dependent_elsewhere", period) return adults * p.consolidated.amount + veterans_exemption_amount class ma_income_tax_exemption_threshold(Variable): diff --git a/policyengine_us/reforms/states/ia/dependent_credit/ia_dependent_credit_reform.py b/policyengine_us/reforms/states/ia/dependent_credit/ia_dependent_credit_reform.py index 446ae2e4c34..c3484976a33 100644 --- a/policyengine_us/reforms/states/ia/dependent_credit/ia_dependent_credit_reform.py +++ b/policyengine_us/reforms/states/ia/dependent_credit/ia_dependent_credit_reform.py @@ -38,7 +38,12 @@ def formula(tax_unit, period, parameters): # dependent is age-eligible, matching the baseline count. 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)), unless + # the would-be claimant meets the filing exception (Publication 501). + is_dependent = person("is_tax_unit_dependent", period) & ~person.tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) if c.age_limit.in_effect: eligible = is_dependent & (age < c.age_limit.threshold) else: diff --git a/policyengine_us/reforms/states/ks/dependent_exemption/ks_dependent_exemption_reform.py b/policyengine_us/reforms/states/ks/dependent_exemption/ks_dependent_exemption_reform.py index d3c89f7c568..18a04f4a64d 100644 --- a/policyengine_us/reforms/states/ks/dependent_exemption/ks_dependent_exemption_reform.py +++ b/policyengine_us/reforms/states/ks/dependent_exemption/ks_dependent_exemption_reform.py @@ -15,6 +15,12 @@ def formula(tax_unit, period, parameters): person = tax_unit.members age = person("age", 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)), unless + # the would-be claimant meets the filing exception (Publication 501). + no_dependents = tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) is_dependent = person("is_tax_unit_dependent", period) # Apply age limit if in effect. @@ -24,7 +30,7 @@ def formula(tax_unit, period, parameters): else: eligible_dependents = is_dependent - return tax_unit.sum(eligible_dependents) + return where(no_dependents, 0, tax_unit.sum(eligible_dependents)) class ks_dependent_exemption(Variable): value_type = float diff --git a/policyengine_us/reforms/states/md/dependent_exemption/md_dependent_exemption_reform.py b/policyengine_us/reforms/states/md/dependent_exemption/md_dependent_exemption_reform.py index 21357d4bff6..323615d4b82 100644 --- a/policyengine_us/reforms/states/md/dependent_exemption/md_dependent_exemption_reform.py +++ b/policyengine_us/reforms/states/md/dependent_exemption/md_dependent_exemption_reform.py @@ -14,7 +14,12 @@ def formula(tax_unit, period, parameters): p = parameters(period).gov.contrib.states.md.dependent_exemption 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)), unless + # the would-be claimant meets the filing exception (Publication 501). + is_dependent = person("is_tax_unit_dependent", period) & ~person.tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) if p.age_limit.in_effect: eligible = is_dependent & (age < p.age_limit.threshold) else: @@ -97,7 +102,12 @@ class md_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)), unless + # the would-be claimant meets the filing exception (Publication 501). + is_dependent = person("is_tax_unit_dependent", period) & ~person.tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) total_dependents = tax_unit.sum(is_dependent) eligible = tax_unit("md_eligible_dependents_count", period) return max_(0, total_dependents - eligible) diff --git a/policyengine_us/tests/core/test_claimable_filer_ia_ks_ky_la_md_invariants.py b/policyengine_us/tests/core/test_claimable_filer_ia_ks_ky_la_md_invariants.py new file mode 100644 index 00000000000..d539766eba7 --- /dev/null +++ b/policyengine_us/tests/core/test_claimable_filer_ia_ks_ky_la_md_invariants.py @@ -0,0 +1,248 @@ +"""Iowa, Kansas, Kentucky, Louisiana and Maryland rules for a filer who can be +claimed as a dependent. + +A return on which the filer (or, if joint, either spouse) can be claimed has no +dependents unless the would-be claimant meets the filing exception (IRC +152(b)(1), Publication 501), so these states' dependent exemptions and credits, +Kansas's food sales tax credit child route, Maryland's child tax credit and the +childless pro forma EITC follow that test. Kansas's 2021-2023 exemptions and +its food sales tax credit count each filer whom no one else may claim (IRC +151(d)(2)). Iowa's low-income exemption, tax reduction and alternate tax turn on +an actual claim and the claiming person's income, whose inputs default to no +disqualification; Maryland's poverty line credit turns on an actual claim on +another Maryland return, a separate input that defaults to the federal claim; +every Maryland filer keeps their own exemption (Tax-General 10-211(a)(1)). + +For couples drawn by Hypothesis (claimable, claimed and filing-exception +patterns) and a seeded population in these states: + +1. Swap invariance: each output is the same under either head/spouse + labelling. +2. Monotonicity: marking another filer as claimed never raises the amounts in + MONOTONE. This holds for the drawn inputs, which have no self-employment + losses: on separate Maryland returns a claimable spouse's loss no longer + offsets the other spouse's earnings, which is intended. +3. Identities: with a filer claimable outside the filing exception there is no + Louisiana dependent exemption, Maryland aged dependent exemption or child + tax credit, and no pro forma federal EITC without a child. Every filer + keeps a Maryland exemption, so Maryland's count covers both spouses and + the poverty line credit's poverty level is positive. +4. Differential: wherever the federal EITC's eligibility holds, Maryland's + pro forma federal EITC without the minimum age equals the federal credit + before take-up and filing. +5. Unchanged when nobody can be claimed: Maryland's exemption count is the tax + unit's size, the poverty line credit's poverty level is `tax_unit_fpg`, and + Louisiana's dependent exemption is $1,000 per dependent. +6. Filing exception scope: the exception never lowers the 152(b)(1) amounts in + EXCEPTION_RESTORES and does not change the claimability and actual-claim + rules in EXCEPTION_NEUTRAL. +""" + +import numpy as np +import pytest +from hypothesis import HealthCheck, given, settings +from hypothesis import strategies as st + +from policyengine_us import Simulation +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, + TOLERANCE, + _calc, + _crafted_cases, + _exception_variants, + _seeded_couples, + _situation, + adults, + dependents, +) + +STATES = ["IA", "KS", "KY", "LA", "MD"] +# 2022: Iowa's net-income path, Kansas's exemption count and Louisiana's +# exemptions; 2024: Iowa's consolidated path and Kansas's filing-status +# allowance; 2026: Louisiana's flat tax and Maryland's child tax credit +# phase-out. +YEARS = [2022, 2024, 2026] +MONOTONE = [ + "ia_exemption_credit", + "ks_exemptions", + "ks_fstc", + "la_dependents_exemption", + "md_personal_exemptions_count", + "md_total_personal_exemptions", + "md_aged_dependent_exemption", + "federal_eitc_without_age_minimum", + "md_ctc", +] +OUTPUTS = MONOTONE + [ + "ia_is_tax_exempt", + "ia_income_tax", + "ks_income_tax", + "ky_income_tax", + "la_income_tax", + "is_eligible_md_poverty_line_credit", + "md_poverty_line_credit", + "md_local_poverty_line_credit", + "md_income_tax", + "state_income_tax", +] +# 152(b)(1) amounts that the claimant filing exception restores. +EXCEPTION_RESTORES = [ + "ia_exemption_credit", + "ks_exemptions", + "ks_fstc", + "la_dependents_exemption", + "md_personal_exemptions_count", + "md_aged_dependent_exemption", + "federal_eitc_without_age_minimum", + "md_ctc", +] +# Rules on claimability or an actual claim, which the exception leaves alone. +EXCEPTION_NEUTRAL = [ + "ia_is_tax_exempt", +] + + +# Both spouses claimable outside the filing exception, with no dependents: +# the unit that had no Maryland exemption while the model denied a claimable +# filer's own. Every Hypothesis batch includes it, so identity 3 always sees +# it. +EVERY_FILER_CLAIMABLE = { + "state": "MD", + "adults": [ + {"age": 20, "employment_income": 4_000.0}, + {"age": 21, "employment_income": 4_000.0}, + ], + "dependents": [], + "claimed": (False, False), + "claimable": (True, True), + "exception": (False, False), +} + + +@st.composite +def couples(draw): + claimable = draw(st.sampled_from(CLAIM_PATTERNS)) + claimed = tuple(can_claim and draw(st.booleans()) for can_claim in claimable) + return { + "state": draw(st.sampled_from(STATES)), + "adults": [draw(adults()), draw(adults())], + "dependents": draw(st.lists(dependents(), max_size=2)), + "claimed": claimed, + "claimable": claimable, + "exception": (draw(st.booleans()), draw(st.booleans())), + } + + +def _identities(sim, year): + claimable = _calc(sim, "head_or_spouse_is_dependent_elsewhere", year) > 0 + no_dependents = ( + _calc( + sim, "head_or_spouse_is_dependent_elsewhere_without_filing_exception", year + ) + > 0 + ) + childless = _calc(sim, "eitc_child_count", year) == 0 + for name in ["la_dependents_exemption", "md_aged_dependent_exemption", "md_ctc"]: + assert not _calc(sim, name, year)[no_dependents].any(), name + pro_forma = _calc(sim, "federal_eitc_without_age_minimum", year) + assert not pro_forma[no_dependents & childless].any() + # Each tax unit has its own household, in the same order. + state = np.asarray(sim.calculate("state_code_str", year)) + md, la = state == "MD", state == "LA" + # Tax-General 10-211(a)(1): every filer keeps an exemption. + md_count = _calc(sim, "md_personal_exemptions_count", year) + assert (md_count[md] >= _calc(sim, "head_spouse_count", year)[md]).all() + assert (_calc(sim, "md_poverty_line_credit_income_level", year)[md] > 0).all() + # 5. Unchanged when nobody can be claimed. + nobody = ~claimable + np.testing.assert_array_equal( + _calc(sim, "md_personal_exemptions_count", year)[md & nobody], + _calc(sim, "tax_unit_size", year)[md & nobody], + ) + np.testing.assert_allclose( + _calc(sim, "md_poverty_line_credit_income_level", year)[md & nobody], + _calc(sim, "tax_unit_fpg", year)[md & nobody], + atol=TOLERANCE, + ) + np.testing.assert_allclose( + _calc(sim, "la_dependents_exemption", year)[la & nobody], + 1_000 * _calc(sim, "tax_unit_dependents", year)[la & nobody], + atol=TOLERANCE, + ) + # 4. Differential: the federal credit before take-up and filing. + federal_eligible = md & (_calc(sim, "eitc_eligible", year) > 0) + federal = np.minimum( + _calc(sim, "eitc_phased_in", year), + np.maximum( + 0, _calc(sim, "eitc_maximum", year) - _calc(sim, "eitc_reduction", year) + ), + ) + np.testing.assert_allclose( + pro_forma[federal_eligible], federal[federal_eligible], atol=TOLERANCE + ) + + +@settings( + max_examples=3, + 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_ia_ks_ky_la_md_claimable_filer_rules_are_label_free(year, units): + check_swap(units + [EVERY_FILER_CLAIMABLE], year, OUTPUTS, _identities) + + +@pytest.mark.parametrize("year", YEARS) +def test_ia_ks_ky_la_md_claimable_filer_rules_seeded_population(year): + units = _seeded_couples(STATES, per_state=3) + _crafted_cases(STATES) + # Guarantee an actual claim together with the claimant filing exception; + # the Kansas contrib YAML separately checks the consolidated-regime count. + units.append( + { + "state": "KS", + "adults": [ + {"age": 20, "employment_income": 500}, + {"age": 30, "employment_income": 500}, + ], + "dependents": [{"age": 5}], + "claimed": (True, False), + "exception": (True, False), + } + ) + check_swap(units, year, OUTPUTS, _identities) + check_monotone(units, year, MONOTONE, _identities) + + +@pytest.mark.parametrize("year", [2022, 2025]) +def test_ia_ks_ky_la_md_filing_exception_scope(year): + # Each unit runs four times with nobody actually claimed: claimable + # without the exception (both labellings), then with it. + units = [ + unit + for unit in _seeded_couples(STATES, per_state=3) + _crafted_cases(STATES) + if any(unit["claimed"]) + ] + sim = Simulation(situation=_situation(units, year, _exception_variants)) + for name in EXCEPTION_RESTORES + EXCEPTION_NEUTRAL: + copies = _calc(sim, name, year).reshape(-1, 4) + np.testing.assert_allclose( + copies[:, 0::2], copies[:, 1::2], atol=TOLERANCE, rtol=0 + ) + without, with_exception = copies[:, :2], copies[:, 2:] + if name in EXCEPTION_NEUTRAL: + np.testing.assert_allclose( + with_exception, + without, + atol=TOLERANCE, + rtol=0, + err_msg=f"The filing exception changes {name}", + ) + else: + assert not (with_exception < without - TOLERANCE).any(), ( + f"The filing exception lowers {name}" + ) diff --git a/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/alternate_tax/ia_alternate_tax_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/alternate_tax/ia_alternate_tax_eligible.yaml index 98310ca90f8..5d49aeed43d 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/alternate_tax/ia_alternate_tax_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/alternate_tax/ia_alternate_tax_eligible.yaml @@ -13,3 +13,62 @@ state_code: IA output: ia_alternate_tax_eligible: true + +# Iowa Code 422.5(2)(b): the alternate tax is part of the subsection whose +# benefit a claimed dependent loses when the claimant's net income exceeds the +# limit, including on a joint return with one claimed spouse. +- name: A claimed spouse with a high-income claimant prevents alternate tax + period: 2024 + input: + people: + filer: + age: 30 + spouse: + age: 30 + claimed_as_dependent_on_another_return: true + ia_dependent_claimant_net_income: 9_001 + ia_dependent_claimant_spouse_net_income: 0 + ia_dependent_claimant_filing_status: SINGLE + tax_units: + tax_unit: + members: [filer, spouse] + filing_status: JOINT + ia_modified_income: 20_000 + ia_regular_tax_consolidated: 500 + households: + household: + members: [filer, spouse] + state_code: IA + output: + # 9,001 > 9,000. Otherwise the alternate tax would be + # (20,000 - 13,500) * 0.057 = 370.50. + ia_alternate_tax_eligible: false + ia_income_tax_consolidated: 500 + +- name: Claimant income equal to its limit preserves alternate tax + period: 2024 + input: + people: + filer: + age: 30 + spouse: + age: 30 + claimed_as_dependent_on_another_return: true + ia_dependent_claimant_net_income: 9_000 + ia_dependent_claimant_spouse_net_income: 0 + ia_dependent_claimant_filing_status: SINGLE + tax_units: + tax_unit: + members: [filer, spouse] + filing_status: JOINT + ia_modified_income: 20_000 + ia_regular_tax_consolidated: 500 + households: + household: + members: [filer, spouse] + state_code: IA + output: + # min(500, (20,000 - 13,500) * 0.057) = 370.50. + ia_alternate_tax_eligible: true + ia_income_tax_consolidated: 370.5 + diff --git a/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/ia_cdcc.yaml b/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/ia_cdcc.yaml index 513aa8e048b..9267a71f5ce 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/ia_cdcc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/ia_cdcc.yaml @@ -165,3 +165,177 @@ ia_taxable_income: 13_166 cdcc_potential: 690 ia_cdcc: 517.5 + + +- name: 2024 single filer who can be claimed as a dependent gets no Iowa child care credit + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 10000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: IA + output: + # IRC 21(b)(1)(A) needs a dependent; IRC 152(b)(1) leaves none. + ia_cdcc: 0 + +- name: 2024 single filer who cannot be claimed gets the Iowa child care credit + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 10000 + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: IA + output: + # $1,000 x .35 = $350; Iowa taxable income $0 < $10,000: x .75 = $262.50. + ia_cdcc: 262.5 + +- name: 2024 joint return with one claimable spouse gets no Iowa child care credit (the claimable spouse is the head) + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 5000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 5000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: IA + output: + # Either spouse being claimable leaves the return no dependents. + ia_cdcc: 0 + +- name: 2024 joint return with one claimable spouse gets no Iowa child care credit (the claimable spouse is the spouse) + period: 2024 + input: + people: + person_b: + age: 30 + employment_income: 5000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 30 + employment_income: 5000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: IA + output: + ia_cdcc: 0 + +- name: 2024 joint return with both spouses claimable gets no Iowa child care credit + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 5000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 5000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: IA + output: + ia_cdcc: 0 + +- name: 2024 joint return with no claimable spouse gets the Iowa child care credit + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 5000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 5000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: IA + output: + # $1,000 x .35 = $350 federal; x .75 = $262.50. + ia_cdcc: 262.5 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/ia_eitc.yaml b/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/ia_eitc.yaml index 80b3282ee42..4fa50d7fe1f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/ia_eitc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/ia_eitc.yaml @@ -5,3 +5,153 @@ state_code: IA output: ia_eitc: 150 + + +- name: 2024 single filer who can be claimed as a dependent gets no Iowa EITC + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 1000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a] + filing_status: SINGLE + households: + household: + members: [person_a] + state_code: IA + output: + # IRC 32(c)(1)(A)(ii)(III): no childless federal EITC to match. + ia_eitc: 0 + +- name: 2024 single filer who cannot be claimed gets the Iowa EITC + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 1000 + is_tax_unit_head: true + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a] + filing_status: SINGLE + households: + household: + members: [person_a] + state_code: IA + output: + # $76.50 x .15 = $11.475. + ia_eitc: 11.475 + +- name: 2024 joint return with one claimable spouse gets no Iowa EITC (the claimable spouse is the head) + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 500 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + 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: IA + output: + # Pub. 596: "Someone can claim your spouse as a dependent" bars it. + ia_eitc: 0 + +- name: 2024 joint return with one claimable spouse gets no Iowa EITC (the claimable spouse is the spouse) + period: 2024 + input: + people: + person_b: + age: 30 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 30 + 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: IA + output: + ia_eitc: 0 + +- name: 2024 joint return with both spouses claimable gets no Iowa EITC + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 500 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + 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_a, person_b] + filing_status: JOINT + households: + household: + members: [person_a, person_b] + state_code: IA + output: + ia_eitc: 0 + +- name: 2024 joint return with no claimable spouse gets the Iowa EITC + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + 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: IA + output: + # $1,000 x .0765 = $76.50; x .15 = $11.475. + ia_eitc: 11.475 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/ia_exemption_credit.yaml b/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/ia_exemption_credit.yaml index 8bd9dfdc642..b8272632bc7 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/ia_exemption_credit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/ia_exemption_credit.yaml @@ -47,3 +47,226 @@ state_code: IA output: ia_exemption_credit: 180 # = 40*2 + 20*3 + 40*1 + + +- name: 2024 single filer who can be claimed as a dependent keeps the personal credit but gets no dependent credit + period: 2024 + input: + people: + person_a: + age: 30 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: IA + output: + # Iowa Code 422.12(2)(a): $40 personal credit, kept "even if you are + # claimed"; IRC 152(b)(1) leaves the return no dependents. + ia_exemption_credit: 40 + +- name: 2024 joint return with one claimable spouse keeps both personal credits but gets no dependent credit (the claimable spouse is the head) + period: 2024 + 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 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: IA + output: + # $80 for a joint return; no $40 dependent credit (IRC 152(b)(1)). + ia_exemption_credit: 80 + +- name: 2024 joint return with one claimable spouse keeps both personal credits but gets no dependent credit (the claimable spouse is the spouse) + period: 2024 + 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 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: IA + output: + ia_exemption_credit: 80 + +- name: 2024 joint return with both spouses claimable keeps both personal credits but gets no dependent credit + period: 2024 + 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 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: IA + output: + ia_exemption_credit: 80 + +- name: 2024 joint return with no claimable spouse gets the dependent credit + period: 2024 + input: + people: + person_a: + age: 30 + 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 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: IA + output: + # $80 + $40 for the child = $120. + ia_exemption_credit: 120 + + +- name: 2024 single filer whose claimant meets the filing exception gets the dependent credit + period: 2024 + 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 + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: IA + output: + # The would-be claimant meets the filing exception (Publication 501, + # Dependent Taxpayer Test), so the return keeps its dependents. + # $40 personal + $40 dependent. + ia_exemption_credit: 80 + +- name: 2024 joint return whose claimable spouse's claimant meets the filing exception gets the dependent credit (the claimable spouse is the head) + period: 2024 + 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: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: IA + output: + # The would-be claimant meets the filing exception (Publication 501, + # Dependent Taxpayer Test), so the return keeps its dependents. + # $80 + $40 = $120. + ia_exemption_credit: 120 + +- name: 2024 joint return whose claimable spouse's claimant meets the filing exception gets the dependent credit (the claimable spouse is the spouse) + period: 2024 + 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: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: IA + output: + ia_exemption_credit: 120 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/ia_income_tax_before_refundable_credits.yaml b/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/ia_income_tax_before_refundable_credits.yaml index 9418543b4e0..4602fdeade6 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/ia_income_tax_before_refundable_credits.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/ia_income_tax_before_refundable_credits.yaml @@ -41,3 +41,268 @@ state_code: IA output: ia_income_tax_before_refundable_credits: 40 + + +- name: 2022 claimed single filer with a high-income claimant gets no tax reduction + period: 2022 + input: + people: + person_a: + age: 30 + claimed_as_dependent_on_another_return: true + ia_dependent_claimant_net_income: 9_001 + ia_dependent_claimant_filing_status: SINGLE + is_tax_unit_head: true + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a] + filing_status: SINGLE + ia_income_tax_before_credits: 700 + ia_non_refundable_credits: 0 + ia_is_tax_exempt: false + ia_modified_income: 9500 + households: + household: + members: [person_a] + state_code: IA + output: + # Iowa Code 422.5(3) withholds the reduction because the claimant's + # 9,001 exceeds 9,000. + ia_income_tax_before_refundable_credits: 700 + +- name: 2022 claimed single filer with a low-income claimant has tax reduced to income above $9,000 + period: 2022 + input: + people: + person_a: + age: 30 + claimed_as_dependent_on_another_return: true + ia_dependent_claimant_net_income: 8_000 + ia_dependent_claimant_filing_status: SINGLE + is_tax_unit_head: true + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a] + filing_status: SINGLE + ia_income_tax_before_credits: 700 + ia_non_refundable_credits: 0 + ia_is_tax_exempt: false + ia_modified_income: 9500 + households: + household: + members: [person_a] + state_code: IA + output: + # Claimant 8,000 <= 9,000, so the reduction caps tax at + # 9,500 - 9,000 = 500. + ia_income_tax_before_refundable_credits: 500 + +- name: 2022 single filer who cannot be claimed has tax reduced to income above $9,000 + period: 2022 + input: + people: + person_a: + age: 30 + is_tax_unit_head: true + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a] + filing_status: SINGLE + ia_income_tax_before_credits: 700 + ia_non_refundable_credits: 0 + ia_is_tax_exempt: false + ia_modified_income: 9500 + households: + household: + members: [person_a] + state_code: IA + output: + # min($700, $9,500 - $9,000) = $500. + ia_income_tax_before_refundable_credits: 500 + +- name: 2022 joint return with one claimable spouse gets no tax reduction (the claimable spouse is the head) + period: 2022 + 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 + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + ia_income_tax_before_credits: 700 + ia_non_refundable_credits: 0 + ia_is_tax_exempt: false + ia_modified_income: 9500 + households: + household: + members: [person_a, person_b] + state_code: IA + output: + # The worksheet is for single filers only. + ia_income_tax_before_refundable_credits: 700 + +- name: 2022 joint return with one claimable spouse gets no tax reduction (the claimable spouse is the spouse) + period: 2022 + 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 + tax_units: + tax_unit: + members: [person_b, person_a] + filing_status: JOINT + ia_income_tax_before_credits: 700 + ia_non_refundable_credits: 0 + ia_is_tax_exempt: false + ia_modified_income: 9500 + households: + household: + members: [person_b, person_a] + state_code: IA + output: + ia_income_tax_before_refundable_credits: 700 + +- name: 2022 joint return with both spouses claimable gets no tax reduction + period: 2022 + 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 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + ia_income_tax_before_credits: 700 + ia_non_refundable_credits: 0 + ia_is_tax_exempt: false + ia_modified_income: 9500 + households: + household: + members: [person_a, person_b] + state_code: IA + output: + ia_income_tax_before_refundable_credits: 700 + +- name: 2022 joint return with no claimable spouse gets no tax reduction + period: 2022 + input: + people: + person_a: + age: 30 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + ia_income_tax_before_credits: 700 + ia_non_refundable_credits: 0 + ia_is_tax_exempt: false + ia_modified_income: 9500 + households: + household: + members: [person_a, person_b] + state_code: IA + output: + ia_income_tax_before_refundable_credits: 700 + + +- name: 2022 single filer who can be claimed but is not claimed has tax reduced to income above $9,000 + period: 2022 + input: + people: + person_a: + age: 30 + claimable_as_dependent_on_another_return: true + claimed_as_dependent_on_another_return: false + is_tax_unit_head: true + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a] + filing_status: SINGLE + ia_income_tax_before_credits: 700 + ia_non_refundable_credits: 0 + ia_is_tax_exempt: false + ia_modified_income: 9500 + households: + household: + members: [person_a] + state_code: IA + output: + # The filer can be claimed but nobody claims them; this rule turns on + # being claimed. + # min($700, $9,500 - $9,000) = $500. + ia_income_tax_before_refundable_credits: 500 + +- name: 2022 claimed filer with a low-income claimant is exempt from tax + period: 2022 + input: + state_code: IA + age: 24 + age_head: 24 + filing_status: SINGLE + is_tax_unit_head: true + claimed_as_dependent_on_another_return: true + ia_dependent_claimant_net_income: 8_000 + ia_dependent_claimant_spouse_net_income: 0 + ia_dependent_claimant_filing_status: SINGLE + ia_modified_income: 6_000 + ia_income_tax_before_credits: 100 + ia_non_refundable_credits: 0 + output: + # Claimant 8,000 <= 9,000 and filer 6,000 <= 9,000: exempt, so 0. + ia_is_tax_exempt: true + ia_income_tax_before_refundable_credits: 0 + +- name: 2022 high claimant income removes both the exemption and the tax-reduction cap + period: 2022 + input: + state_code: IA + age: 24 + age_head: 24 + filing_status: SINGLE + is_tax_unit_head: true + claimed_as_dependent_on_another_return: true + ia_dependent_claimant_net_income: 9_001 + ia_dependent_claimant_spouse_net_income: 0 + ia_dependent_claimant_filing_status: SINGLE + ia_modified_income: 6_000 + ia_income_tax_before_credits: 100 + ia_non_refundable_credits: 0 + output: + # 9,001 > 9,000 removes both benefits; the 100 of tax remains, and the + # single-filer reduction (6,000 - 9,000 < 0) must not erase it. + ia_is_tax_exempt: false + ia_income_tax_before_refundable_credits: 100 + diff --git a/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/ia_is_tax_exempt.yaml b/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/ia_is_tax_exempt.yaml index 0e8eacbec18..7956c1ece26 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/ia_is_tax_exempt.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ia/tax/income/ia_is_tax_exempt.yaml @@ -45,3 +45,300 @@ state_code: IA output: ia_is_tax_exempt: true + + +# Iowa Code 422.5(3)(a) (2021-2022) and 422.5(2)(a) (2023 onward): a person +# claimed as a dependent on another return loses the exemption only when the +# person claiming them has net income over the subsection's limit. The +# instructions' $5,000 test of the dependent's own income does not apply. +- name: 2022 claimed single filer keeps the exemption with a low-income claimant + period: 2022 + input: + state_code: IA + age: 24 + age_head: 24 + filing_status: SINGLE + is_tax_unit_head: true + claimed_as_dependent_on_another_return: true + ia_dependent_claimant_net_income: 8_000 + ia_dependent_claimant_spouse_net_income: 0 + ia_dependent_claimant_filing_status: SINGLE + ia_modified_income: 6_000 + output: + # Claimant 8,000 <= 9,000 and the filer's 6,000 <= 9,000. + ia_claimed_filer_income_disqualified: false + ia_is_tax_exempt: true + +- name: 2022 claimant income exactly at the statutory limit preserves the exemption + period: 2022 + input: + state_code: IA + age: 24 + age_head: 24 + filing_status: SINGLE + is_tax_unit_head: true + claimed_as_dependent_on_another_return: true + ia_dependent_claimant_net_income: 9_000 + ia_dependent_claimant_spouse_net_income: 0 + ia_dependent_claimant_filing_status: SINGLE + ia_modified_income: 6_000 + output: + # 9,000 does not exceed 9,000. + ia_claimed_filer_income_disqualified: false + ia_is_tax_exempt: true + +- name: 2022 claimant income over the statutory limit removes the exemption + period: 2022 + input: + state_code: IA + age: 24 + age_head: 24 + filing_status: SINGLE + is_tax_unit_head: true + claimed_as_dependent_on_another_return: true + ia_dependent_claimant_net_income: 9_001 + ia_dependent_claimant_spouse_net_income: 0 + ia_dependent_claimant_filing_status: SINGLE + ia_modified_income: 6_000 + output: + # 9,001 > 9,000. + ia_claimed_filer_income_disqualified: true + ia_is_tax_exempt: false + +- name: 2022 claimability alone does not test a claimant's income + period: 2022 + input: + state_code: IA + age: 24 + age_head: 24 + filing_status: SINGLE + is_tax_unit_head: true + claimable_as_dependent_on_another_return: true + claimed_as_dependent_on_another_return: false + ia_dependent_claimant_net_income: 50_000 + ia_dependent_claimant_filing_status: SINGLE + ia_modified_income: 6_000 + output: + ia_claimed_filer_income_disqualified: false + ia_is_tax_exempt: true + +- name: 2024 a head-of-household claimant uses the larger limit + period: 2024 + input: + state_code: IA + age: 24 + age_head: 24 + filing_status: SINGLE + is_tax_unit_head: true + claimed_as_dependent_on_another_return: true + ia_dependent_claimant_net_income: 13_000 + ia_dependent_claimant_spouse_net_income: 0 + ia_dependent_claimant_filing_status: HEAD_OF_HOUSEHOLD + ia_modified_income: 6_000 + output: + # 13,000 <= 13,500. + ia_claimed_filer_income_disqualified: false + ia_is_tax_exempt: true + +- name: 2024 a married claimant's combined income is tested against the larger limit + period: 2024 + input: + state_code: IA + age: 24 + age_head: 24 + filing_status: SINGLE + is_tax_unit_head: true + claimed_as_dependent_on_another_return: true + ia_dependent_claimant_net_income: 8_000 + ia_dependent_claimant_spouse_net_income: 6_000 + ia_dependent_claimant_filing_status: SEPARATE + ia_modified_income: 6_000 + output: + # Own 8,000 <= 9,000, but combined 14,000 > 13,500. + ia_claimed_filer_income_disqualified: true + ia_is_tax_exempt: false + +- name: 2024 an elderly return uses the elderly limits for the claimant test + period: 2024 + input: + state_code: IA + age: 66 + age_head: 66 + filing_status: SINGLE + is_tax_unit_head: true + claimed_as_dependent_on_another_return: true + ia_dependent_claimant_net_income: 20_000 + ia_dependent_claimant_spouse_net_income: 0 + ia_dependent_claimant_filing_status: SINGLE + ia_modified_income: 20_000 + output: + # Claimant 20,000 <= 24,000; the filer's 20,000 <= 24,000. + ia_claimed_filer_income_disqualified: false + ia_is_tax_exempt: true + +- name: 2022 joint return with one claimed spouse and a high-income claimant is not exempt (the claimed spouse is the head) + period: 2022 + input: + people: + person_a: + age: 30 + claimed_as_dependent_on_another_return: true + ia_dependent_claimant_net_income: 9_001 + ia_dependent_claimant_filing_status: SINGLE + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + ia_modified_income: 6_000 + households: + household: + members: [person_a, person_b] + state_code: IA + output: + ia_claimed_filer_income_disqualified: true + ia_is_tax_exempt: false + +- name: 2022 joint return with one claimed spouse and a high-income claimant is not exempt (the claimed spouse is the spouse) + period: 2022 + 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 + ia_dependent_claimant_net_income: 9_001 + ia_dependent_claimant_filing_status: SINGLE + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_b, person_a] + filing_status: JOINT + ia_modified_income: 6_000 + households: + household: + members: [person_b, person_a] + state_code: IA + output: + ia_claimed_filer_income_disqualified: true + ia_is_tax_exempt: false + +- name: 2022 joint return with one claimed spouse and a low-income claimant stays exempt + period: 2022 + input: + people: + person_a: + age: 30 + claimed_as_dependent_on_another_return: true + ia_dependent_claimant_net_income: 8_000 + ia_dependent_claimant_filing_status: SINGLE + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + ia_modified_income: 6_000 + households: + household: + members: [person_a, person_b] + state_code: IA + output: + # 6,000 <= 13,500 joint limit, and the claimant's 8,000 <= 9,000. + ia_claimed_filer_income_disqualified: false + ia_is_tax_exempt: true + +- name: 2022 single filer who can be claimed but is not claimed keeps the ordinary exemption + period: 2022 + input: + people: + person_a: + age: 30 + ia_net_income: 6000 + claimable_as_dependent_on_another_return: true + claimed_as_dependent_on_another_return: false + is_tax_unit_head: true + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a] + filing_status: SINGLE + households: + household: + members: [person_a] + state_code: IA + output: + # The filer can be claimed but nobody claims them; this rule turns on + # being claimed. + # $6,000 <= $9,000 single limit. + ia_is_tax_exempt: true + +- name: 2022 joint return with one spouse who can be claimed but is not claimed is exempt (the claimable spouse is the head) + period: 2022 + input: + people: + person_a: + age: 30 + ia_net_income: 3000 + claimable_as_dependent_on_another_return: true + claimed_as_dependent_on_another_return: false + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + ia_net_income: 3000 + 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: IA + output: + # The filer can be claimed but nobody claims them; this rule turns on + # being claimed. + # $3,000 + $3,000 = $6,000 <= $13,500. + ia_is_tax_exempt: true + +- name: 2022 joint return with one spouse who can be claimed but is not claimed is exempt (the claimable spouse is the spouse) + period: 2022 + input: + people: + person_b: + age: 30 + ia_net_income: 3000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 30 + ia_net_income: 3000 + claimable_as_dependent_on_another_return: true + claimed_as_dependent_on_another_return: false + 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: IA + output: + ia_is_tax_exempt: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/exemptions/ks_count_exemptions.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/exemptions/ks_count_exemptions.yaml new file mode 100644 index 00000000000..0022ddc8e11 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/exemptions/ks_count_exemptions.yaml @@ -0,0 +1,289 @@ + + +- name: 2022 single filer who can be claimed as a dependent has no Kansas exemptions + period: 2022 + input: + people: + person_a: + age: 20 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: KS + output: + # K.S.A. 79-32,121(a) with IRC 151(d)(2): a filer whom another taxpayer + # may claim has no exemption of their own. + ks_count_exemptions: 0 + ks_exemptions: 0 + +- name: 2022 joint return with one claimable spouse keeps the other spouse's Kansas exemption (the claimable spouse is the head) + period: 2022 + 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 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: KS + output: + # IRC 151(d)(2) applies to each spouse separately; no dependents. + ks_count_exemptions: 1 + ks_exemptions: 2250 + +- name: 2022 joint return with one claimable spouse keeps the other spouse's Kansas exemption (the claimable spouse is the spouse) + period: 2022 + input: + people: + person_b: + age: 20 + 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: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: KS + output: + ks_count_exemptions: 1 + ks_exemptions: 2250 + +- name: 2022 joint return with both spouses claimable has no Kansas exemptions + period: 2022 + 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: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: KS + output: + ks_count_exemptions: 0 + ks_exemptions: 0 + +- name: 2022 joint return with no claimable spouse has three Kansas exemptions + period: 2022 + input: + people: + person_a: + age: 20 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 20 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: KS + output: + # 2 + 1 child = 3 exemptions x $2,250 = $6,750. + ks_count_exemptions: 3 + ks_exemptions: 6750 + + +- name: 2022 single filer who can be claimed but is not claimed has no Kansas exemptions + period: 2022 + input: + people: + person_a: + age: 20 + claimable_as_dependent_on_another_return: true + claimed_as_dependent_on_another_return: false + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: KS + output: + # IRC 151(d)(2) turns on whether another taxpayer is allowed the + # deduction, not whether they take it; the child is not the filer's + # dependent (IRC 152(b)(1)). + ks_count_exemptions: 0 + ks_exemptions: 0 + +- name: 2022 joint return with one spouse who can be claimed but is not claimed keeps only the other spouse's exemption (the claimable spouse is the head) + period: 2022 + input: + people: + person_a: + age: 20 + claimable_as_dependent_on_another_return: true + claimed_as_dependent_on_another_return: false + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 20 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: KS + output: + # The claimable spouse has no exemption (IRC 151(d)(2)) and there are + # no dependents (IRC 152(b)(1)): 1 x $2,250 = $2,250. + ks_count_exemptions: 1 + ks_exemptions: 2250 + +- name: 2022 joint return with one spouse who can be claimed but is not claimed keeps only the other spouse's exemption (the claimable spouse is the spouse) + period: 2022 + input: + people: + person_b: + age: 20 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 20 + claimable_as_dependent_on_another_return: true + claimed_as_dependent_on_another_return: false + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: KS + output: + ks_count_exemptions: 1 + ks_exemptions: 2250 + +- name: A claimable but unclaimed 2021 filer has no personal exemption + period: 2021 + input: + state_code: KS + filing_status: SINGLE + age: 20 + claimable_as_dependent_on_another_return: true + claimed_as_dependent_on_another_return: false + output: + # 0 unclaimable filers + 0 dependents = 0; 0 x $2,250 = $0. + ks_count_exemptions: 0 + ks_exemptions: 0 + +- name: A claimed spouse does not remove the other spouse's exemption + period: 2023 + input: + people: + head: + age: 21 + claimable_as_dependent_on_another_return: false + spouse: + age: 20 + claimable_as_dependent_on_another_return: true + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [head, spouse] + filing_status: JOINT + households: + household: + members: [head, spouse] + state_code: KS + output: + # 1 unclaimable head + 0 for the claimable spouse = 1; 1 x $2,250. + ks_count_exemptions: 1 + ks_exemptions: 2_250 + +- name: A 2022 head of household receives no additional adult exemption + period: 2022 + input: + people: + head: + age: 35 + child: + age: 10 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, child] + filing_status: HEAD_OF_HOUSEHOLD + households: + household: + members: [head, child] + state_code: KS + output: + # 1 unclaimable filer + 1 dependent = 2; 2 x $2,250 = $4,500. + ks_count_exemptions: 2 + ks_exemptions: 4_500 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/exemptions/ks_exemptions.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/exemptions/ks_exemptions.yaml index 7dc4e135fd5..7b59e60b908 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/exemptions/ks_exemptions.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/exemptions/ks_exemptions.yaml @@ -51,3 +51,195 @@ state_code: KS output: ks_exemptions: 9_000 + + +- name: 2024 single filer who can be claimed as a dependent keeps the personal exemption allowance but no dependent exemption + period: 2024 + input: + people: + person_a: + age: 20 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: KS + output: + # K.S.A. 79-32,121b: $9,160; a claimable taxpayer "will qualify for the + # personal exemption allowance of $9,160" (KDOR FAQ). No $2,320 dependent + # exemption: "enter '0' in the number of dependents box". + ks_exemptions: 9160 + +- name: 2024 joint return with one claimable spouse keeps the joint allowance but no dependent exemption (the claimable spouse is the head) + period: 2024 + 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 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: KS + output: + # $18,320 joint allowance; no dependents under IRC 152(b)(1). + ks_exemptions: 18320 + +- name: 2024 joint return with one claimable spouse keeps the joint allowance but no dependent exemption (the claimable spouse is the spouse) + period: 2024 + input: + people: + person_b: + age: 20 + 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: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: KS + output: + ks_exemptions: 18320 + +- name: 2024 joint return with both spouses claimable keeps the joint allowance but no dependent exemption + period: 2024 + 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: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: KS + output: + ks_exemptions: 18320 + +- name: 2024 joint return with no claimable spouse gets the dependent exemption + period: 2024 + input: + people: + person_a: + age: 20 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 20 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: KS + output: + # $18,320 + $2,320 = $20,640. + ks_exemptions: 20640 + + +- name: 2024 single filer whose claimant meets the filing exception gets the dependent exemption + period: 2024 + input: + people: + person_a: + age: 20 + claimable_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: KS + output: + # The would-be claimant meets the filing exception (Publication 501, + # Dependent Taxpayer Test), so the return keeps its dependents. + # $9,160 + $2,320 = $11,480. + ks_exemptions: 11480 + +- name: 2024 actually claimed single filer whose claimant meets the filing exception keeps the dependent exemption + period: 2024 + input: + people: + parent: + age: 20 + claimed_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [parent, child] + filing_status: SINGLE + households: + household: + members: [parent, child] + state_name: KS + output: + # K.S.A. 79-32,121b federal entitlement preserves this dependent under + # the filing exception: $9,160 + $2,320 = $11,480. The K-40 instruction + # to enter zero dependents for actually claimed taxpayers gives $9,160. + ks_exemptions: 11_480 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_cdcc.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_cdcc.yaml index dc4acd6124d..127b7d1b954 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_cdcc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_cdcc.yaml @@ -67,3 +67,183 @@ # 2021 K-40 line 14: 3_500 federal credit * 25% = 875. # https://www.ksrevenue.gov/incomebook21.html ks_cdcc: 875 + + +- name: 2024 single filer who can be claimed as a dependent gets no Kansas child care credit + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 10000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + cdcc_credit_limit: 1000 + households: + household: + members: [person_a, child] + state_code: KS + output: + # IRC 21(b)(1)(A) needs a dependent; IRC 152(b)(1) leaves none. + ks_cdcc: 0 + +- name: 2024 single filer who cannot be claimed gets the Kansas child care credit + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 10000 + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + cdcc_credit_limit: 1000 + households: + household: + members: [person_a, child] + state_code: KS + output: + # $1,000 x .35 = $350 federal credit allowed; x .50 = $175. + ks_cdcc: 175 + +- name: 2024 joint return with one claimable spouse gets no Kansas child care credit (the claimable spouse is the head) + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 5000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 5000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + cdcc_credit_limit: 1000 + households: + household: + members: [person_a, person_b, child] + state_code: KS + output: + # Either spouse being claimable leaves the return no dependents. + ks_cdcc: 0 + +- name: 2024 joint return with one claimable spouse gets no Kansas child care credit (the claimable spouse is the spouse) + period: 2024 + input: + people: + person_b: + age: 30 + employment_income: 5000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 30 + employment_income: 5000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + cdcc_credit_limit: 1000 + households: + household: + members: [person_b, person_a, child] + state_code: KS + output: + ks_cdcc: 0 + +- name: 2024 joint return with both spouses claimable gets no Kansas child care credit + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 5000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 5000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + cdcc_credit_limit: 1000 + households: + household: + members: [person_a, person_b, child] + state_code: KS + output: + ks_cdcc: 0 + +- name: 2024 joint return with no claimable spouse gets the Kansas child care credit + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 5000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 5000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + cdcc_credit_limit: 1000 + households: + household: + members: [person_a, person_b, child] + state_code: KS + output: + # $350 x .50 = $175. + ks_cdcc: 175 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_fstc.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_fstc.yaml index a76454b38c9..9e825f0ae52 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_fstc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_fstc.yaml @@ -1,12 +1,25 @@ - name: KS food sales tax credit unit test 1 period: 2021 input: - age_head: 56 - blind_head: false - adjusted_gross_income: 30_000 - tax_unit_size: 3 - state_code: KS + people: + head: + age: 56 + child1: + age: 10 + is_tax_unit_dependent: true + child2: + age: 12 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, child1, child2] + adjusted_gross_income: 30_000 + households: + household: + members: [head, child1, child2] + state_code: KS output: + # 1 unclaimable filer + 2 dependent children under 18 = 3 exemptions. ks_fstc: 125 * 3 - name: KS food sales tax credit unit test 2 @@ -41,3 +54,651 @@ state_code: KS output: ks_fstc: 0 # income ineligible + + +- name: 2022 single filer who can be claimed as a dependent gets no food sales tax credit + period: 2022 + input: + people: + person_a: + age: 60 + employment_income: 1000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a] + filing_status: SINGLE + households: + household: + members: [person_a] + state_code: KS + output: + # K.S.A. 79-32,271(d) counts federal exemptions, and IRC 151(d)(2) allows + # none to a filer whom another taxpayer may claim: age 60 qualifies, but + # 0 exemptions x $125 = $0. + ks_fstc: 0 + +- name: 2022 single filer who cannot be claimed gets the food sales tax credit + period: 2022 + input: + people: + person_a: + age: 60 + employment_income: 1000 + is_tax_unit_head: true + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a] + filing_status: SINGLE + households: + household: + members: [person_a] + state_code: KS + output: + # Age 60 qualifies; AGI $1,000 <= $30,615; 1 x $125. + ks_fstc: 125 + +- name: 2022 joint return with one claimable spouse gets the food sales tax credit for the other spouse only (the claimable spouse is the head) + period: 2022 + input: + people: + person_a: + age: 60 + employment_income: 500 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + 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: KS + output: + # K.S.A. 79-32,271(d) counts federal exemptions: only the unclaimable + # spouse has one (IRC 151(d)(2)). 1 x $125. + ks_fstc: 125 + +- name: 2022 joint return with one claimable spouse gets the food sales tax credit for the other spouse only (the claimable spouse is the spouse) + period: 2022 + input: + people: + person_b: + age: 30 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 60 + 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: KS + output: + ks_fstc: 125 + +- name: 2022 joint return with both spouses claimable gets no food sales tax credit + period: 2022 + input: + people: + person_a: + age: 60 + employment_income: 500 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + 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_a, person_b] + filing_status: JOINT + households: + household: + members: [person_a, person_b] + state_code: KS + output: + ks_fstc: 0 + +- name: 2022 joint return with both spouses claimable gets no food sales tax credit (older spouse is the spouse) + period: 2022 + input: + people: + person_b: + age: 30 + employment_income: 500 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 60 + 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: KS + output: + ks_fstc: 0 + +- name: 2022 joint return with no claimable spouse gets the food sales tax credit for both spouses + period: 2022 + input: + people: + person_a: + age: 60 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + 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: KS + output: + # 2 x $125 = $250. + ks_fstc: 250 + +- name: 2022 joint return with no claimable spouse gets the food sales tax credit for both spouses (older spouse is the spouse) + period: 2022 + input: + people: + person_b: + age: 30 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 60 + employment_income: 500 + 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: KS + output: + # 2 x $125 = $250. + ks_fstc: 250 + +- name: 2024 single filer who can be claimed as a dependent gets no food sales tax credit + period: 2024 + input: + people: + person_a: + age: 60 + employment_income: 1000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a] + filing_status: SINGLE + households: + household: + members: [person_a] + state_code: KS + output: + # A claimable filer has no federal exemption (IRC 151(d)(2)); the + # Kansas filing-status allowance does not count. 0 x $125. + ks_fstc: 0 + +- name: 2024 joint return with one claimable spouse gets the food sales tax credit for the other spouse only (the claimable spouse is the head) + period: 2024 + input: + people: + person_a: + age: 60 + employment_income: 500 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + 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: KS + output: + # Only the unclaimable spouse has a federal exemption: 1 x $125. + ks_fstc: 125 + +- name: 2024 joint return with one claimable spouse gets the food sales tax credit for the other spouse only (the claimable spouse is the spouse) + period: 2024 + input: + people: + person_b: + age: 30 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 60 + 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: KS + output: + ks_fstc: 125 + +- name: 2024 joint return with both spouses claimable gets no food sales tax credit + period: 2024 + input: + people: + person_a: + age: 60 + employment_income: 500 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + 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_a, person_b] + filing_status: JOINT + households: + household: + members: [person_a, person_b] + state_code: KS + output: + ks_fstc: 0 + +- name: 2024 joint return with both spouses claimable gets no food sales tax credit (older spouse is the spouse) + period: 2024 + input: + people: + person_b: + age: 30 + employment_income: 500 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 60 + 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: KS + output: + ks_fstc: 0 + +- name: 2024 joint return with no claimable spouse gets the food sales tax credit for both spouses + period: 2024 + input: + people: + person_a: + age: 60 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + 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: KS + output: + ks_fstc: 250 + +- name: 2024 joint return with no claimable spouse gets the food sales tax credit for both spouses (older spouse is the spouse) + period: 2024 + input: + people: + person_b: + age: 30 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 60 + employment_income: 500 + 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: KS + output: + ks_fstc: 250 + +- name: 2024 single filer who can be claimed as a dependent with a child gets no food sales tax credit + period: 2024 + input: + people: + person_a: + age: 25 + employment_income: 1000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: KS + output: + # No child is claimed "as a personal exemption" (IRC 152(b)(1)) and no + # filer is 55 or older, so no route to the credit. + ks_fstc: 0 + +- name: 2024 single filer who cannot be claimed with a child gets the food sales tax credit + period: 2024 + input: + people: + person_a: + age: 25 + employment_income: 1000 + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: KS + output: + # Child under 18 qualifies; 2 exemptions x $125 = $250. + ks_fstc: 250 + +- name: 2024 joint return with one claimable spouse and a child gets no food sales tax credit (the claimable spouse is the head) + period: 2024 + input: + people: + person_a: + age: 25 + employment_income: 500 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 25 + employment_income: 500 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: KS + output: + # No dependent child and nobody 55 or older. + ks_fstc: 0 + +- name: 2024 joint return with one claimable spouse and a child gets no food sales tax credit (the claimable spouse is the spouse) + period: 2024 + input: + people: + person_b: + age: 25 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 25 + employment_income: 500 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: KS + output: + ks_fstc: 0 + +- name: 2024 joint return with both spouses claimable and a child gets no food sales tax credit + period: 2024 + input: + people: + person_a: + age: 25 + employment_income: 500 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 25 + employment_income: 500 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: KS + output: + ks_fstc: 0 + +- name: 2024 joint return with no claimable spouse and a child gets the food sales tax credit + period: 2024 + input: + people: + person_a: + age: 25 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 25 + employment_income: 500 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: KS + output: + # 3 exemptions x $125 = $375. + ks_fstc: 375 + +# K.S.A. 79-32,271(d), as reenacted by 2022 HB 2106 section 4: $125 for every +# exemption claimed on the federal return, counting each unclaimable filer +# and each dependent child under 18. +- name: The 2024 joint credit counts only the unclaimable spouse + period: 2024 + input: + people: + head: + age: 60 + claimable_as_dependent_on_another_return: false + spouse: + age: 20 + claimable_as_dependent_on_another_return: true + claimed_as_dependent_on_another_return: false + tax_units: + tax_unit: + members: [head, spouse] + filing_status: JOINT + adjusted_gross_income: 10_000 + households: + household: + members: [head, spouse] + state_code: KS + output: + # Age 60 qualifies and 10,000 <= the AGI limit. 1 unclaimable filer + 0 + # children = 1; 1 x $125. + ks_fstc: 125 + +- name: A claimable but unclaimed older filer receives no personal food credit + period: 2021 + input: + state_code: KS + age: 60 + filing_status: SINGLE + adjusted_gross_income: 1_000 + claimable_as_dependent_on_another_return: true + claimed_as_dependent_on_another_return: false + output: + # Age and income pass, but 0 federal exemptions x $125 = $0. + ks_fstc: 0 + +- name: An unclaimable head of household and one child count twice + period: 2024 + input: + people: + head: + age: 35 + claimable_as_dependent_on_another_return: false + child: + age: 10 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, child] + filing_status: HEAD_OF_HOUSEHOLD + adjusted_gross_income: 10_000 + households: + household: + members: [head, child] + state_code: KS + output: + # 1 unclaimable filer + 1 child under 18 = 2; 2 x $125, with no extra + # Kansas head-of-household exemption. + ks_fstc: 250 + +- name: 2024 claimable single filer whose claimant meets the filing exception gets the credit for the child + period: 2024 + input: + people: + person_a: + age: 25 + employment_income: 1_000 + claimable_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: KS + output: + # The would-be claimant meets the filing exception (Publication 501), so + # IRC 152(b)(1) leaves the child a dependent and opens the child route. + # The filer stays claimable, so no own exemption (IRC 151(d)(2)): + # 0 filers + 1 child under 18 = 1; 1 x $125. + ks_fstc: 125 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_fstc_sunset.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_fstc_sunset.yaml index b26a3189ce5..f0b6c3c6011 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_fstc_sunset.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_fstc_sunset.yaml @@ -105,13 +105,23 @@ - name: FSTC comparison 2024 vs 2025 - same eligible household period: 2024 input: - age_head: 60 - blind_head: false - adjusted_gross_income: 20_000 - tax_unit_size: 2 - state_code: KS + people: + head: + age: 60 + child: + age: 10 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, child] + adjusted_gross_income: 20_000 + households: + household: + members: [head, child] + state_code: KS output: - # 2024: 2 persons * $125 = $250 + # 2024: 1 unclaimable filer + 1 dependent child under 18 = 2 federal + # exemptions; 2 * $125 = $250. ks_fstc: 250 - name: FSTC sunset 2025 - large eligible family gets $0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_num_exemptions.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_num_exemptions.yaml index bc91516ba4e..099e5317006 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_num_exemptions.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_num_exemptions.yaml @@ -10,17 +10,47 @@ - name: Married with two dependents period: 2022 input: - filing_status: JOINT - tax_unit_dependents: 2 - state_code: KS + people: + head: + age: 40 + spouse: + age: 40 + child1: + age: 5 + is_tax_unit_dependent: true + child2: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, spouse, child1, child2] + filing_status: JOINT + households: + household: + members: [head, spouse, child1, child2] + state_code: KS output: + # 2 unclaimable filers + 2 dependents. ks_count_exemptions: 4 - name: Unmarried with one dependent period: 2022 input: - filing_status: HEAD_OF_HOUSEHOLD - tax_unit_dependents: 1 - state_code: KS + people: + head: + age: 40 + child: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, child] + filing_status: HEAD_OF_HOUSEHOLD + households: + household: + members: [head, child] + state_code: KS output: - ks_count_exemptions: 3 + # K.S.A. 79-32,121(a): 1 unclaimable filer + 1 dependent. The extra + # head-of-household allowance applied only in tax year 1998. + ks_count_exemptions: 2 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_total_eitc.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_total_eitc.yaml index 4c183dd7387..118273f9c57 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_total_eitc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_total_eitc.yaml @@ -5,3 +5,153 @@ state_code: KS output: ks_total_eitc: 0.17 * 1_000 + + +- name: 2024 single filer who can be claimed as a dependent gets no Kansas EITC + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 1000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a] + filing_status: SINGLE + households: + household: + members: [person_a] + state_code: KS + output: + # No childless federal EITC to match (IRC 32(c)(1)(A)(ii)(III)). + ks_total_eitc: 0 + +- name: 2024 single filer who cannot be claimed gets the Kansas EITC + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 1000 + is_tax_unit_head: true + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a] + filing_status: SINGLE + households: + household: + members: [person_a] + state_code: KS + output: + # $76.50 x .17 = $13.005. + ks_total_eitc: 13.005 + +- name: 2024 joint return with one claimable spouse gets no Kansas EITC (the claimable spouse is the head) + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 500 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + 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: KS + output: + # Either spouse being claimable bars the childless federal EITC. + ks_total_eitc: 0 + +- name: 2024 joint return with one claimable spouse gets no Kansas EITC (the claimable spouse is the spouse) + period: 2024 + input: + people: + person_b: + age: 30 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 30 + 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: KS + output: + ks_total_eitc: 0 + +- name: 2024 joint return with both spouses claimable gets no Kansas EITC + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 500 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + 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_a, person_b] + filing_status: JOINT + households: + household: + members: [person_a, person_b] + state_code: KS + output: + ks_total_eitc: 0 + +- name: 2024 joint return with no claimable spouse gets the Kansas EITC + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + 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: KS + output: + # $1,000 x .0765 = $76.50; x .17 = $13.005. + ks_total_eitc: 13.005 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/tax/income/credits/dependent_care_service/ky_cdcc_potential.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/tax/income/credits/dependent_care_service/ky_cdcc_potential.yaml new file mode 100644 index 00000000000..a04a25ce952 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/tax/income/credits/dependent_care_service/ky_cdcc_potential.yaml @@ -0,0 +1,180 @@ + + +- name: 2024 single filer who can be claimed as a dependent gets no Kentucky child care credit + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 10000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + cdcc_credit_limit: 1000 + households: + household: + members: [person_a, child] + state_code: KY + output: + # IRC 21(b)(1)(A) needs a dependent; IRC 152(b)(1) leaves none. + ky_cdcc_potential: 0 + +- name: 2024 single filer who cannot be claimed gets the Kentucky child care credit + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 10000 + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + cdcc_credit_limit: 1000 + households: + household: + members: [person_a, child] + state_code: KY + output: + # KRS 141.067: 20% x $350 federal credit = $70. + ky_cdcc_potential: 70 + +- name: 2024 joint return with one claimable spouse gets no Kentucky child care credit (the claimable spouse is the head) + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 5000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 5000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + cdcc_credit_limit: 1000 + households: + household: + members: [person_a, person_b, child] + state_code: KY + output: + # Either spouse being claimable leaves the return no dependents. + ky_cdcc_potential: 0 + +- name: 2024 joint return with one claimable spouse gets no Kentucky child care credit (the claimable spouse is the spouse) + period: 2024 + input: + people: + person_b: + age: 30 + employment_income: 5000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 30 + employment_income: 5000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + cdcc_credit_limit: 1000 + households: + household: + members: [person_b, person_a, child] + state_code: KY + output: + ky_cdcc_potential: 0 + +- name: 2024 joint return with both spouses claimable gets no Kentucky child care credit + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 5000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 5000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + cdcc_credit_limit: 1000 + households: + household: + members: [person_a, person_b, child] + state_code: KY + output: + ky_cdcc_potential: 0 + +- name: 2024 joint return with no claimable spouse gets the Kentucky child care credit + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 5000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 5000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + cdcc_credit_limit: 1000 + households: + household: + members: [person_a, person_b, child] + state_code: KY + output: + # $350 x .20 = $70. + ky_cdcc_potential: 70 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/tax/income/credits/cdcc/la_refundable_cdcc.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/tax/income/credits/cdcc/la_refundable_cdcc.yaml index 66f63494203..a5d7be724f1 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/la/tax/income/credits/cdcc/la_refundable_cdcc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/la/tax/income/credits/cdcc/la_refundable_cdcc.yaml @@ -24,3 +24,177 @@ state_code: LA output: la_refundable_cdcc: 250 + + +- name: 2024 single filer who can be claimed as a dependent gets no refundable child care credit + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 10000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: LA + output: + # IRC 21(b)(1)(A) needs a dependent; IRC 152(b)(1) leaves none. + la_refundable_cdcc: 0 + +- name: 2024 single filer who cannot be claimed gets the refundable child care credit + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 10000 + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: LA + output: + # $1,000 x .35 = $350; AGI $10,000 <= $25,000: x .50 = $175. + la_refundable_cdcc: 175 + +- name: 2024 joint return with one claimable spouse gets no refundable child care credit (the claimable spouse is the head) + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 5000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 5000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: LA + output: + # Either spouse being claimable leaves the return no dependents. + la_refundable_cdcc: 0 + +- name: 2024 joint return with one claimable spouse gets no refundable child care credit (the claimable spouse is the spouse) + period: 2024 + input: + people: + person_b: + age: 30 + employment_income: 5000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 30 + employment_income: 5000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: LA + output: + la_refundable_cdcc: 0 + +- name: 2024 joint return with both spouses claimable gets no refundable child care credit + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 5000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 5000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: LA + output: + la_refundable_cdcc: 0 + +- name: 2024 joint return with no claimable spouse gets the refundable child care credit + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 5000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 5000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: LA + output: + # $350 x .50 = $175. + la_refundable_cdcc: 175 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/tax/income/credits/la_eitc.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/tax/income/credits/la_eitc.yaml index cd194b78196..49cdeaae78a 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/la/tax/income/credits/la_eitc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/la/tax/income/credits/la_eitc.yaml @@ -13,3 +13,153 @@ state_code: LA output: la_eitc: 0 + + +- name: 2024 single filer who can be claimed as a dependent gets no Louisiana EITC + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 1000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a] + filing_status: SINGLE + households: + household: + members: [person_a] + state_code: LA + output: + # No childless federal EITC to match (IRC 32(c)(1)(A)(ii)(III)). + la_eitc: 0 + +- name: 2024 single filer who cannot be claimed gets the Louisiana EITC + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 1000 + is_tax_unit_head: true + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a] + filing_status: SINGLE + households: + household: + members: [person_a] + state_code: LA + output: + # $76.50 x .05 = $3.825. + la_eitc: 3.825 + +- name: 2024 joint return with one claimable spouse gets no Louisiana EITC (the claimable spouse is the head) + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 500 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + 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: LA + output: + # Either spouse being claimable bars the childless federal EITC. + la_eitc: 0 + +- name: 2024 joint return with one claimable spouse gets no Louisiana EITC (the claimable spouse is the spouse) + period: 2024 + input: + people: + person_b: + age: 30 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 30 + 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: LA + output: + la_eitc: 0 + +- name: 2024 joint return with both spouses claimable gets no Louisiana EITC + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 500 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + 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_a, person_b] + filing_status: JOINT + households: + household: + members: [person_a, person_b] + state_code: LA + output: + la_eitc: 0 + +- name: 2024 joint return with no claimable spouse gets the Louisiana EITC + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + 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: LA + output: + # $1,000 x .0765 = $76.50; x .05 = $3.825. + la_eitc: 3.825 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/tax/income/exemptions/personal/la_dependents_exemption.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/tax/income/exemptions/personal/la_dependents_exemption.yaml index ee9c6d9bb5c..f2b2136f23a 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/la/tax/income/exemptions/personal/la_dependents_exemption.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/la/tax/income/exemptions/personal/la_dependents_exemption.yaml @@ -21,3 +21,190 @@ tax_unit_dependents: 0 output: la_dependents_exemption: 0 + + +- name: 2024 single filer who can be claimed as a dependent gets no dependent exemption + period: 2024 + input: + people: + person_a: + age: 20 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: LA + output: + # Line 6C counts "the dependents claimed on your federal return" (2024 + # IT-540 instructions, p.3); IRC 152(b)(1) leaves none. + la_dependents_exemption: 0 + +- name: 2024 single filer who cannot be claimed gets the dependent exemption + period: 2024 + input: + people: + person_a: + age: 20 + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: LA + output: + # 1 dependent x $1,000. + la_dependents_exemption: 1000 + +- name: 2024 joint return with one claimable spouse gets no dependent exemption (the claimable spouse is the head) + period: 2024 + 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 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: LA + output: + # Either spouse being claimable leaves the federal return no dependents. + la_dependents_exemption: 0 + +- name: 2024 joint return with one claimable spouse gets no dependent exemption (the claimable spouse is the spouse) + period: 2024 + input: + people: + person_b: + age: 20 + 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 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: LA + output: + la_dependents_exemption: 0 + +- name: 2024 joint return with both spouses claimable gets no dependent exemption + period: 2024 + 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: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: LA + output: + la_dependents_exemption: 0 + +- name: 2024 joint return with no claimable spouse gets the dependent exemption + period: 2024 + input: + people: + person_a: + age: 20 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 20 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: LA + output: + # 1 dependent x $1,000. + la_dependents_exemption: 1000 + + +- name: 2024 single filer whose claimant meets the filing exception gets the dependent exemption + period: 2024 + input: + people: + person_a: + age: 20 + claimable_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: LA + output: + # The would-be claimant meets the filing exception (Publication 501, + # Dependent Taxpayer Test), so the return keeps its dependents. + # 1 dependent x $1,000. + la_dependents_exemption: 1000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/agi/subtractions/md_dependent_care_subtraction.yaml b/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/agi/subtractions/md_dependent_care_subtraction.yaml index 742374d8106..49aabbeb174 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/agi/subtractions/md_dependent_care_subtraction.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/agi/subtractions/md_dependent_care_subtraction.yaml @@ -74,3 +74,176 @@ cdcc: 2_750 # Form 502CR Part B: $2,750 x 32% x (1 - 17 x 1%) = $730.40. md_cdcc_potential: 730.4 + +- name: 2024 single filer who can be claimed as a dependent gets no dependent care subtraction + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 10000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: MD + output: + # Section 10-208(e) uses section 21's qualifying individuals; none here. + md_dependent_care_subtraction: 0 + +- name: 2024 single filer who cannot be claimed gets the dependent care subtraction + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 10000 + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: MD + output: + # min($3,000 x 1 qualifying child, $1,000 expenses) = $1,000. + md_dependent_care_subtraction: 1000 + +- name: 2024 joint return with one claimable spouse gets no dependent care subtraction (the claimable spouse is the head) + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 5000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 5000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: MD + output: + # Either spouse being claimable leaves the return no dependents. + md_dependent_care_subtraction: 0 + +- name: 2024 joint return with one claimable spouse gets no dependent care subtraction (the claimable spouse is the spouse) + period: 2024 + input: + people: + person_b: + age: 30 + employment_income: 5000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 30 + employment_income: 5000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: MD + output: + md_dependent_care_subtraction: 0 + +- name: 2024 joint return with both spouses claimable gets no dependent care subtraction + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 5000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 5000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: MD + output: + md_dependent_care_subtraction: 0 + +- name: 2024 joint return with no claimable spouse gets the dependent care subtraction + period: 2024 + input: + people: + person_a: + age: 30 + employment_income: 5000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 5000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + pre_subsidy_childcare_expenses: 1000 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: MD + output: + # min($3,000, $1,000) = $1,000. + md_dependent_care_subtraction: 1000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/credits/ctc/md_ctc.yaml b/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/credits/ctc/md_ctc.yaml index 3052884bccc..8e26048e921 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/credits/ctc/md_ctc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/credits/ctc/md_ctc.yaml @@ -550,3 +550,295 @@ md_ctc: 900 md_refundable_credits: 900 md_income_tax: -800 + + +- name: 2025 single filer who can be claimed as a dependent gets no child tax credit + period: 2025 + input: + people: + person_a: + age: 20 + employment_income: 1000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: MD + output: + # Section 10-751(a)(2)(i): a qualified child is "a dependent for purposes + # of section 152"; IRC 152(b)(1) leaves the return none. + md_ctc_eligible: false + md_ctc: 0 + +- name: 2025 single filer who cannot be claimed gets the child tax credit + period: 2025 + input: + people: + person_a: + age: 20 + employment_income: 1000 + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: MD + output: + # One child under 6, AGI $1,000 <= $15,000: $500. + md_ctc_eligible: true + md_ctc: 500 + +- name: 2025 joint return with one claimable spouse gets no child tax 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: 20 + employment_income: 500 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: MD + output: + # Either spouse being claimable leaves the return no dependents. + md_ctc_eligible: false + md_ctc: 0 + +- name: 2025 joint return with one claimable spouse gets no child tax credit (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 20 + 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 + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: MD + output: + md_ctc_eligible: false + md_ctc: 0 + +- name: 2025 joint return with both spouses claimable gets no child tax credit + 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: 20 + employment_income: 500 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: MD + output: + md_ctc_eligible: false + md_ctc: 0 + +- name: 2025 joint return with no claimable spouse gets the child tax credit + period: 2025 + input: + people: + person_a: + age: 20 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 20 + employment_income: 500 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: MD + output: + # One child under 6, AGI $1,000 <= $15,000: $500. + md_ctc_eligible: true + md_ctc: 500 + + +- name: 2025 single filer whose claimant meets the filing exception gets the child tax credit + period: 2025 + input: + people: + person_a: + age: 20 + employment_income: 1000 + claimable_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: MD + output: + # The would-be claimant meets the filing exception (Publication 501, + # Dependent Taxpayer Test), so the return keeps its dependents. + # One child under 6, AGI $1,000: $500. + md_ctc_eligible: true + md_ctc: 500 + +# Before 2025, md_ctc_eligible tests only AGI against the cap ($6,000 in +# 2021-2022, $15,000 in 2023-2024), so md_ctc's own 10-751(a)(2)(i) gate is +# the one that removes the child of a filer who can be claimed. +- name: 2024 single filer who can be claimed as a dependent gets no child tax credit although income-eligible + period: 2024 + input: + people: + person_a: + age: 23 + employment_income: 1_000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: MD + output: + # AGI 1,000 <= 15,000, so md_ctc_eligible holds. Section 10-751(a)(2)(i): + # a qualified child is "a dependent for purposes of section 152", and IRC + # 152(b)(1) leaves this return none. Without the gate: 1 x $500. + md_ctc_eligible: true + md_ctc: 0 + +- name: 2024 single filer whose claimant meets the filing exception gets the child tax credit + period: 2024 + input: + people: + person_a: + age: 23 + employment_income: 1_000 + claimable_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: MD + output: + # The would-be claimant meets the filing exception (Publication 501), so + # the child stays a dependent: one child under 6, AGI <= $15,000: $500. + md_ctc_eligible: true + md_ctc: 500 + +- name: 2022 single filer who can be claimed as a dependent gets no child tax credit for a disabled child + period: 2022 + input: + people: + person_a: + age: 23 + employment_income: 1_000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 4 + is_disabled: true + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: MD + output: + # 2022: a disabled child under 17 and AGI <= $6,000, so md_ctc_eligible + # holds; IRC 152(b)(1) leaves the return no qualified child, so no credit. + md_ctc_eligible: true + md_ctc: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/credits/eitc/federal_eitc_without_age_minimum.yaml b/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/credits/eitc/federal_eitc_without_age_minimum.yaml index 625f3439f17..8ee69fb8f2f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/credits/eitc/federal_eitc_without_age_minimum.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/credits/eitc/federal_eitc_without_age_minimum.yaml @@ -109,3 +109,187 @@ # phase-out start (Rev. Proc. 2024-40). eitc: 649 federal_eitc_without_age_minimum: 649 + + +- name: 2025 single filer who can be claimed as a dependent gets no pro forma federal EITC + period: 2025 + input: + people: + person_a: + age: 21 + employment_income: 1000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a] + filing_status: SINGLE + households: + household: + members: [person_a] + state_code: MD + output: + # Section 10-704 waives only "the minimum age requirement"; the filer must + # be "otherwise eligible" (2025 Resident Booklet, p.22), and IRC + # 32(c)(1)(A)(ii)(III) bars a childless filer who can be claimed. + federal_eitc_without_age_minimum: 0 + md_unmarried_childless_refundable_eitc: 0 + +- name: 2025 single filer who cannot be claimed gets the pro forma federal EITC despite the minimum age + period: 2025 + input: + people: + person_a: + age: 21 + employment_income: 1000 + is_tax_unit_head: true + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a] + filing_status: SINGLE + households: + household: + members: [person_a] + state_code: MD + output: + # Age 21 fails the federal minimum age, which Maryland waives: + # $1,000 x .0765 = $76.50; unmarried childless match 100%, no tax. + federal_eitc_without_age_minimum: 76.5 + md_unmarried_childless_refundable_eitc: 76.5 + +- name: 2025 joint return with one claimable spouse gets no pro forma federal EITC (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 21 + employment_income: 500 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 21 + 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: MD + output: + # Either spouse being claimable bars the childless federal EITC. + federal_eitc_without_age_minimum: 0 + md_married_or_has_child_refundable_eitc: 0 + +- name: 2025 joint return with one claimable spouse gets no pro forma federal EITC (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 21 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 21 + 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: MD + output: + federal_eitc_without_age_minimum: 0 + md_married_or_has_child_refundable_eitc: 0 + +- name: 2025 joint return with both spouses claimable gets no pro forma federal EITC + period: 2025 + input: + people: + person_a: + age: 21 + employment_income: 500 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 21 + 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_a, person_b] + filing_status: JOINT + households: + household: + members: [person_a, person_b] + state_code: MD + output: + federal_eitc_without_age_minimum: 0 + md_married_or_has_child_refundable_eitc: 0 + +- name: 2025 joint return with no claimable spouse gets the pro forma federal EITC despite the minimum age + period: 2025 + input: + people: + person_a: + age: 21 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 21 + 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: MD + output: + # $76.50; married refundable match .45 x $76.50 - $0 tax = $34.425. + federal_eitc_without_age_minimum: 76.5 + md_married_or_has_child_refundable_eitc: 34.425 + + +- name: 2025 single filer whose claimant meets the filing exception gets the pro forma federal EITC + period: 2025 + input: + people: + person_a: + age: 21 + employment_income: 1000 + claimable_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + is_tax_unit_head: true + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a] + filing_status: SINGLE + households: + household: + members: [person_a] + state_code: MD + output: + # Publication 596: the childless EITC is allowed when the would-be + # claimant meets the filing exception. $1,000 x .0765 = $76.50. + federal_eitc_without_age_minimum: 76.5 diff --git a/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/credits/poverty_line/is_eligible_md_poverty_line_credit.yaml b/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/credits/poverty_line/is_eligible_md_poverty_line_credit.yaml index ef74bd01c99..3d9d562bc61 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/credits/poverty_line/is_eligible_md_poverty_line_credit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/credits/poverty_line/is_eligible_md_poverty_line_credit.yaml @@ -49,3 +49,403 @@ md_income_tax_before_credits: 10 output: is_eligible_md_poverty_line_credit: false + +# Tax-General 10-709(a)(3)(iii): the exclusion takes an actual claim as an +# exemption on another Maryland return under 10-211; claimability alone does +# not exclude the filer. These three cases supply a poverty level of 15,650 and +# one exemption to isolate the (a)(3)(iii) test. +- name: Claimable but unclaimed Maryland filer passes the dependency exclusion + period: 2025 + input: + people: + filer: + age: 20 + is_tax_unit_head: true + claimable_as_dependent_on_another_return: true + claimed_as_dependent_on_another_return: false + md_claimed_as_exemption_on_another_return: false + tax_units: + tax_unit: + members: [filer] + filing_status: SINGLE + adjusted_gross_income: 10_000 + md_total_additions: 0 + eitc_earned_income: 10_000 + md_personal_exemptions_count: 1 + md_poverty_line_credit_income_level: 15_650 + md_income_tax_before_credits: 600 + md_married_or_has_child_non_refundable_eitc: 0 + households: + household: + members: [filer] + state_code: MD + output: + # 10,000 is below the supplied 15,650 level; the 0 EITC is below the 600 + # tax; no actual Maryland claim. min(600, 0.05 x 10,000) = 500. + is_eligible_md_poverty_line_credit: true + md_poverty_line_credit_potential: 500 + +- name: An actual Maryland exemption claim excludes the filer + period: 2025 + input: + people: + filer: + age: 20 + is_tax_unit_head: true + claimable_as_dependent_on_another_return: true + claimed_as_dependent_on_another_return: true + md_claimed_as_exemption_on_another_return: true + tax_units: + tax_unit: + members: [filer] + filing_status: SINGLE + adjusted_gross_income: 10_000 + md_total_additions: 0 + eitc_earned_income: 10_000 + md_personal_exemptions_count: 1 + md_poverty_line_credit_income_level: 15_650 + md_income_tax_before_credits: 600 + md_married_or_has_child_non_refundable_eitc: 0 + households: + household: + members: [filer] + state_code: MD + output: + # 10-709(a)(3)(iii) fails, so no credit although the supplied level and + # exemption meet the other conditions. + is_eligible_md_poverty_line_credit: false + md_poverty_line_credit_potential: 0 + +- name: A federal claim by a claimant who files no Maryland return does not exclude the filer + period: 2025 + input: + people: + filer: + age: 20 + is_tax_unit_head: true + claimable_as_dependent_on_another_return: true + claimed_as_dependent_on_another_return: true + md_claimed_as_exemption_on_another_return: false + tax_units: + tax_unit: + members: [filer] + filing_status: SINGLE + adjusted_gross_income: 10_000 + md_total_additions: 0 + eitc_earned_income: 10_000 + md_personal_exemptions_count: 1 + md_poverty_line_credit_income_level: 15_650 + md_income_tax_before_credits: 600 + md_married_or_has_child_non_refundable_eitc: 0 + households: + household: + members: [filer] + state_code: MD + output: + # The Maryland claim defaults to the federal claim; this input overrides + # it, so only (a)(3)(iii) is in play and nobody claims the filer on a + # Maryland return: min(600, 0.05 x 10,000) = 500. + is_eligible_md_poverty_line_credit: true + md_poverty_line_credit_potential: 500 + +# Tax-General 10-709(a)(2): the applicable poverty income level is the amount +# "that corresponds to the number of exemptions which the individual is allowed +# and claims under § 10-211(b)(1)". Under 10-211(a)(1) every filer has an +# exemption, whether or not someone else can claim them, so a claimable single +# filer's level is the one-person guideline. These cases compute the level +# rather than supplying it. +- name: 2025 claimable but unclaimed single filer at 12,000 gets the one-exemption level and the credit + period: 2025 + input: + people: + filer: + age: 20 + is_tax_unit_head: true + claimable_as_dependent_on_another_return: true + claimed_as_dependent_on_another_return: false + md_claimed_as_exemption_on_another_return: false + tax_units: + tax_unit: + members: [filer] + filing_status: SINGLE + adjusted_gross_income: 12_000 + md_total_additions: 0 + eitc_earned_income: 12_000 + md_income_tax_before_credits: 600 + md_married_or_has_child_non_refundable_eitc: 0 + households: + household: + members: [filer] + state_code: MD + output: + # The filer's own exemption: 1, so the 2025 contiguous guideline for one + # person, 15,650. 12,000 <= 15,650 for AGI and earnings; 0 EITC < 600 + # tax; no Maryland claim. min(600, 0.05 x 12,000) = 600. + md_personal_exemptions_count: 1 + md_poverty_line_credit_income_level: 15_650 + is_eligible_md_poverty_line_credit: true + md_poverty_line_credit_potential: 600 + +- name: 2025 claimable but unclaimed single filer at 10,000 gets the one-exemption level and the credit + period: 2025 + input: + people: + filer: + age: 20 + is_tax_unit_head: true + claimable_as_dependent_on_another_return: true + claimed_as_dependent_on_another_return: false + md_claimed_as_exemption_on_another_return: false + tax_units: + tax_unit: + members: [filer] + filing_status: SINGLE + adjusted_gross_income: 10_000 + md_total_additions: 0 + eitc_earned_income: 10_000 + md_income_tax_before_credits: 600 + md_married_or_has_child_non_refundable_eitc: 0 + households: + household: + members: [filer] + state_code: MD + output: + # 1 exemption, level 15,650; 10,000 <= 15,650; no Maryland claim. + # min(600, 0.05 x 10,000) = 500. The filing status 6 chart in the 2025 + # booklet would give no exemption and no credit. + md_personal_exemptions_count: 1 + md_poverty_line_credit_income_level: 15_650 + is_eligible_md_poverty_line_credit: true + md_poverty_line_credit_potential: 500 + +- name: 2025 claimable single filer claimed on another federal return is by default claimed in Maryland and gets no credit + period: 2025 + input: + people: + filer: + age: 20 + is_tax_unit_head: true + claimable_as_dependent_on_another_return: true + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [filer] + filing_status: SINGLE + adjusted_gross_income: 10_000 + md_total_additions: 0 + eitc_earned_income: 10_000 + md_income_tax_before_credits: 600 + md_married_or_has_child_non_refundable_eitc: 0 + households: + household: + members: [filer] + state_code: MD + output: + # No Maryland claim input, so it follows the federal claim: a Maryland + # claimant takes an exemption for each IRC 152 dependent (10-211(a)(3)). + # The level (15,650) and income tests pass, but (a)(3)(iii) fails. + md_personal_exemptions_count: 1 + md_poverty_line_credit_income_level: 15_650 + is_eligible_md_poverty_line_credit: false + md_poverty_line_credit_potential: 0 + +- name: 2025 claimable filer whose claimant meets the filing exception keeps both exemptions, the two-exemption level and the credit + period: 2025 + input: + people: + filer: + age: 23 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimable_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + md_claimed_as_exemption_on_another_return: false + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [filer, child] + filing_status: SINGLE + adjusted_gross_income: 10_000 + md_total_additions: 0 + eitc_earned_income: 10_000 + md_income_tax_before_credits: 600 + md_married_or_has_child_non_refundable_eitc: 0 + households: + household: + members: [filer, child] + state_code: MD + output: + # The filer's own exemption plus the child, whom the filing exception + # keeps: 2. 2025 contiguous guideline for 2 = 15,650 + 5,500 = 21,150. + # 10,000 <= 21,150 for AGI and earnings; 0 EITC < 600 tax; no Maryland + # claim. min(600, 0.05 x 10,000) = 500. + md_personal_exemptions_count: 2 + md_poverty_line_credit_income_level: 21_150 + is_eligible_md_poverty_line_credit: true + md_poverty_line_credit_potential: 500 + +- name: 2025 claimable filer with the filing exception is still excluded by an actual Maryland claim + period: 2025 + input: + people: + filer: + age: 23 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimable_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + md_claimed_as_exemption_on_another_return: true + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [filer, child] + filing_status: SINGLE + adjusted_gross_income: 10_000 + md_total_additions: 0 + eitc_earned_income: 10_000 + md_income_tax_before_credits: 600 + md_married_or_has_child_non_refundable_eitc: 0 + households: + household: + members: [filer, child] + state_code: MD + output: + # Same count (2) and level (21,150); (a)(3)(iii) alone removes the credit. + md_personal_exemptions_count: 2 + md_poverty_line_credit_income_level: 21_150 + is_eligible_md_poverty_line_credit: false + md_poverty_line_credit_potential: 0 + +- name: 2025 joint return with a claimable head uses the two-exemption level and qualifies at 18,000 + period: 2025 + input: + people: + a: + age: 30 + is_tax_unit_head: true + claimable_as_dependent_on_another_return: true + b: + age: 30 + is_tax_unit_spouse: true + employment_income: 18_000 + tax_units: + tax_unit: + members: [a, b] + filing_status: JOINT + md_income_tax_before_credits: 1_000 + md_married_or_has_child_non_refundable_eitc: 0 + households: + household: + members: [a, b] + state_code: MD + output: + # Tax-General 10-709(a)(2) with 10-211(a)(1): each spouse has their own + # exemption, so the two-person level of 21,150 applies. Income of 18,000 + # is below it; 0 EITC < 1,000 tax. min(1,000, 0.05 x 18,000) = 900. + md_personal_exemptions_count: 2 + md_poverty_line_credit_income_level: 21_150 + is_eligible_md_poverty_line_credit: true + md_poverty_line_credit_potential: 900 + +- name: 2025 joint return with a claimable spouse uses the two-exemption level and qualifies at 18,000 + period: 2025 + input: + people: + a: + age: 30 + is_tax_unit_head: true + employment_income: 18_000 + b: + age: 30 + is_tax_unit_spouse: true + claimable_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [a, b] + filing_status: JOINT + md_income_tax_before_credits: 1_000 + md_married_or_has_child_non_refundable_eitc: 0 + households: + household: + members: [a, b] + state_code: MD + output: + # The same return with the claimable filer labelled spouse: 2 + # exemptions, 21,150, and min(1,000, 0.05 x 18,000) = 900. + md_personal_exemptions_count: 2 + md_poverty_line_credit_income_level: 21_150 + is_eligible_md_poverty_line_credit: true + md_poverty_line_credit_potential: 900 + +- name: 2025 joint return with both spouses claimable and no filing exception gets the two-exemption level and the credit + period: 2025 + input: + people: + a: + age: 30 + is_tax_unit_head: true + claimable_as_dependent_on_another_return: true + employment_income: 500 + b: + age: 30 + is_tax_unit_spouse: true + claimable_as_dependent_on_another_return: true + employment_income: 500 + tax_units: + tax_unit: + members: [a, b] + filing_status: JOINT + md_income_tax_before_credits: 200 + md_married_or_has_child_non_refundable_eitc: 0 + households: + household: + members: [a, b] + state_code: MD + output: + # 2 own exemptions: 21,150. 1,000 of income is below it; nobody claims + # either filer on a Maryland return. min(200, 5% x 1,000) = 50. + md_personal_exemptions_count: 2 + md_poverty_line_credit_income_level: 21_150 + is_eligible_md_poverty_line_credit: true + md_poverty_line_credit_potential: 50 + +- name: 2025 joint return with both spouses claimable and the filing exception adds the child's exemption to the level + period: 2025 + input: + people: + a: + age: 30 + is_tax_unit_head: true + claimable_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + employment_income: 500 + b: + age: 30 + is_tax_unit_spouse: true + claimable_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + employment_income: 500 + c: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [a, b, c] + filing_status: JOINT + md_income_tax_before_credits: 200 + md_married_or_has_child_non_refundable_eitc: 0 + households: + household: + members: [a, b, c] + state_code: MD + output: + # 2 own + 1 child = 3 exemptions: 15,650 + 2 x 5,500 = 26,650. + # min(200, 5% x 1,000) = 50. + md_personal_exemptions_count: 3 + md_poverty_line_credit_income_level: 26_650 + is_eligible_md_poverty_line_credit: true + md_poverty_line_credit_potential: 50 diff --git a/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/credits/poverty_line/md_poverty_line_credit_earned_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/credits/poverty_line/md_poverty_line_credit_earned_income.yaml index 0bc6f5cda6e..c4f67106a66 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/credits/poverty_line/md_poverty_line_credit_earned_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/credits/poverty_line/md_poverty_line_credit_earned_income.yaml @@ -324,3 +324,81 @@ # TAXSIM: low-income credit 0.00. is_eligible_md_poverty_line_credit: false md_poverty_line_credit: 0 + + +# Round 2 cases for a joint return with one claimable spouse: pretax +# contributions reduce the IRC 32(c)(2) earnings the credit uses. + +- name: 2025 pretax contributions reduce poverty credit earnings when 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 + employment_income: 16_000 + pre_tax_contributions: 2_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + md_income_tax_before_credits: 1_000 + md_married_or_has_child_non_refundable_eitc: 0 + md_local_income_tax_before_credits: 1_000 + md_local_eitc: 0 + households: + household: + members: [person_a, person_b] + state_code: MD + county_str: BALTIMORE_CITY_MD + output: + # Tax-General 10-709 imports IRC 32(c)(2): taxable wages, not gross pay. + # $16,000 - $2,000 = $14,000. Each spouse's own exemption (Tax-General + # 10-211(a)(1)) gives a two-person $21,150 level, and $14,000 is below it. + # With tax limits held above the credit: 5% x $14,000 = $700 state; + # Baltimore City's 3.2% x $14,000 = $448 local. + eitc_earned_income: 14_000 + is_eligible_md_poverty_line_credit: true + md_poverty_line_credit_potential: 700 + md_local_poverty_line_credit: 448 + +- name: 2025 pretax contributions reduce poverty credit earnings when the claimable spouse is the spouse + period: 2025 + input: + people: + person_b: + age: 30 + employment_income: 16_000 + pre_tax_contributions: 2_000 + 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 + tax_units: + tax_unit: + members: [person_b, person_a] + filing_status: JOINT + md_income_tax_before_credits: 1_000 + md_married_or_has_child_non_refundable_eitc: 0 + md_local_income_tax_before_credits: 1_000 + md_local_eitc: 0 + households: + household: + members: [person_b, person_a] + state_code: MD + county_str: BALTIMORE_CITY_MD + output: + # Same taxable wages, level and credits with the filer labels swapped. + eitc_earned_income: 14_000 + is_eligible_md_poverty_line_credit: true + md_poverty_line_credit_potential: 700 + md_local_poverty_line_credit: 448 diff --git a/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/credits/poverty_line/md_poverty_line_credit_income_level.yaml b/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/credits/poverty_line/md_poverty_line_credit_income_level.yaml new file mode 100644 index 00000000000..bf6779f538c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/credits/poverty_line/md_poverty_line_credit_income_level.yaml @@ -0,0 +1,63 @@ +- name: Federal exemption repeal preserves Maryland poverty level with filing exception (claimable head) + period: 2025 + reforms: policyengine_us.reforms.treasury.repeal_dependent_exemptions.repeal_dependent_exemptions + input: + gov.contrib.treasury.repeal_dependent_exemptions: true + people: + claimable: + age: 23 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimable_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + independent: + age: 23 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: {age: 4, is_tax_unit_dependent: true} + tax_units: + tax_unit: + members: [claimable, independent, child] + filing_status: JOINT + households: + household: + members: [claimable, independent, child] + state_code: MD + output: + exemptions_count: 1 + md_personal_exemptions_count: 3 + # Tax-General 10-709(a)(2) uses the state exemptions under 10-211(b)(1): + # each spouse's own exemption under 10-211(a)(1), and the child, whom the + # claimant filing exception preserves. 2025 contiguous FPG for 3 = + # $15,650 + 2 x $5,500. + md_poverty_line_credit_income_level: 26_650 + +- name: Federal exemption repeal preserves Maryland poverty level with filing exception (claimable spouse) + period: 2025 + reforms: policyengine_us.reforms.treasury.repeal_dependent_exemptions.repeal_dependent_exemptions + input: + gov.contrib.treasury.repeal_dependent_exemptions: true + people: + independent: + age: 23 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimable: + age: 23 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimable_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + child: {age: 4, is_tax_unit_dependent: true} + tax_units: + tax_unit: + members: [independent, claimable, child] + filing_status: JOINT + households: + household: + members: [independent, claimable, child] + state_code: MD + output: + exemptions_count: 1 + md_personal_exemptions_count: 3 + md_poverty_line_credit_income_level: 26_650 diff --git a/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/exemptions/md_aged_dependent_exemption.yaml b/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/exemptions/md_aged_dependent_exemption.yaml index 1b9cbedfa42..fe2b7257d0a 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/exemptions/md_aged_dependent_exemption.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/exemptions/md_aged_dependent_exemption.yaml @@ -20,3 +20,270 @@ state_code: MD output: md_aged_dependent_exemption: 3_200 + + +- name: 2025 single filer who can be claimed as a dependent gets no aged dependent exemption + 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 + parent: + age: 66 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, parent] + filing_status: SINGLE + households: + household: + members: [person_a, parent] + state_code: MD + output: + # Section 10-211(b)(2) needs an IRC 152 dependent; IRC 152(b)(1) leaves none. + md_aged_dependent_exemption: 0 + +- name: 2025 joint return with one claimable spouse gets no aged dependent exemption (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 + parent: + age: 66 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, parent] + filing_status: JOINT + households: + household: + members: [person_a, person_b, parent] + state_code: MD + output: + # Either spouse being claimable leaves the return no dependents. + md_aged_dependent_exemption: 0 + +- name: 2025 joint return with one claimable spouse gets no aged dependent exemption (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 + parent: + age: 66 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_b, person_a, parent] + filing_status: JOINT + households: + household: + members: [person_b, person_a, parent] + state_code: MD + output: + md_aged_dependent_exemption: 0 + +- name: 2025 joint return with both spouses claimable gets no aged dependent exemption + 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 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + parent: + age: 66 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, parent] + filing_status: JOINT + households: + household: + members: [person_a, person_b, parent] + state_code: MD + output: + md_aged_dependent_exemption: 0 + +- name: 2025 joint return with no claimable spouse gets the aged dependent exemption + period: 2025 + input: + people: + person_a: + age: 30 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + is_tax_unit_head: false + is_tax_unit_spouse: true + parent: + age: 66 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, parent] + filing_status: JOINT + households: + household: + members: [person_a, person_b, parent] + state_code: MD + output: + # One dependent aged 65 or older: $3,200. + md_aged_dependent_exemption: 3200 + + +- name: 2025 aged dependent exemption is limited like the personal exemption at $110,000 of single AGI + period: 2025 + input: + people: + person_a: + age: 50 + employment_income: 110000 + is_tax_unit_head: true + is_tax_unit_spouse: false + parent: + age: 70 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, parent] + filing_status: SINGLE + households: + household: + members: [person_a, parent] + state_code: MD + output: + # Single AGI over $100,000 but not over $125,000: each exemption is $1,600 (10-211(c)(1)(i)). + # The chart's "reduction applies to the additional dependency exemptions as well". + md_aged_dependent_exemption: 1600 + +- name: 2025 aged dependent exemption is limited like the personal exemption at $130,000 of single AGI + period: 2025 + input: + people: + person_a: + age: 50 + employment_income: 130000 + is_tax_unit_head: true + is_tax_unit_spouse: false + parent: + age: 70 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, parent] + filing_status: SINGLE + households: + household: + members: [person_a, parent] + state_code: MD + output: + # Single AGI over $125,000 but not over $150,000: each exemption is $800 (10-211(c)(1)(ii)). + # The chart's "reduction applies to the additional dependency exemptions as well". + md_aged_dependent_exemption: 800 + +- name: 2025 aged dependent exemption is limited like the personal exemption at $160,000 of single AGI + period: 2025 + input: + people: + person_a: + age: 50 + employment_income: 160000 + is_tax_unit_head: true + is_tax_unit_spouse: false + parent: + age: 70 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, parent] + filing_status: SINGLE + households: + household: + members: [person_a, parent] + state_code: MD + output: + # Single AGI over $150,000: each exemption is $0 (10-211(c)(1)(iii)). + # The chart's "reduction applies to the additional dependency exemptions as well". + md_aged_dependent_exemption: 0 + +- name: 2025 aged dependent exemption is limited at $160,000 of joint AGI + period: 2025 + input: + people: + person_a: + age: 50 + employment_income: 80000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 50 + employment_income: 80000 + is_tax_unit_head: false + is_tax_unit_spouse: true + parent: + age: 70 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, parent] + filing_status: JOINT + households: + household: + members: [person_a, person_b, parent] + state_code: MD + output: + # Joint AGI over $150,000 but not over $175,000: $1,600 (10-211(c)(2)(i)). + md_aged_dependent_exemption: 1600 + +- name: 2025 claimable single filer whose claimant meets the filing exception gets the aged dependent exemption + 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 + parent: + age: 66 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, parent] + filing_status: SINGLE + households: + household: + members: [person_a, parent] + state_code: MD + output: + # The would-be claimant meets the filing exception (Publication 501), so + # IRC 152(b)(1) leaves the parent a dependent: one dependent aged 65 or + # older under Section 10-211(b)(2), $3,200. + md_aged_dependent_exemption: 3_200 diff --git a/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/exemptions/md_personal_exemptions_count.yaml b/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/exemptions/md_personal_exemptions_count.yaml new file mode 100644 index 00000000000..c9cd01a3912 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/exemptions/md_personal_exemptions_count.yaml @@ -0,0 +1,270 @@ + + +- name: 2025 single filer who can be claimed keeps their own exemption but no dependents + period: 2025 + input: + people: + person_a: + age: 23 + employment_income: 1000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: MD + output: + # Tax-General 10-211(a)(1) allows an exemption for "the taxpayer" with no + # dependency condition (2018 ch. 575); IRC 152(b)(1) leaves no + # dependents. The 2025 booklet's filing status 6 would give 0. + md_personal_exemptions_count: 1 + md_total_personal_exemptions: 3_200 + +- name: 2025 single filer whose claimant meets the filing exception has exemptions for the filer and the child + period: 2025 + input: + people: + person_a: + age: 23 + employment_income: 1000 + claimable_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: MD + output: + # 10-211(a)(1) gives the filer an exemption, and the filing exception + # keeps the dependent: 2 x $3,200. + md_personal_exemptions_count: 2 + md_total_personal_exemptions: 6_400 + +- name: 2025 joint return with one claimable spouse counts both spouses but no dependents (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 23 + employment_income: 1000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 23 + employment_income: 1000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: MD + output: + # Each spouse has their own exemption under 10-211(a)(1), on a joint or + # a separate Maryland return; the federal return has no dependents. + # 2 x $3,200. + md_personal_exemptions_count: 2 + md_total_personal_exemptions: 6_400 + +- name: 2025 joint return with one claimable spouse counts both spouses but no dependents (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 23 + employment_income: 1000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 23 + employment_income: 1000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: MD + output: + md_personal_exemptions_count: 2 + md_total_personal_exemptions: 6_400 + +- name: 2025 joint return whose claimable spouse's claimant meets the filing exception counts both spouses and the child (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 23 + employment_income: 1000 + 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: 23 + employment_income: 1000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: MD + output: + # The would-be claimant meets the filing exception (Publication 501, + # Dependent Taxpayer Test), so the return keeps its dependents. + # 2 own + 1 dependent = 3 x $3,200. + md_personal_exemptions_count: 3 + md_total_personal_exemptions: 9_600 + +- name: 2025 joint return whose claimable spouse's claimant meets the filing exception counts both spouses and the child (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 23 + employment_income: 1000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 23 + employment_income: 1000 + 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_dependent: true + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: MD + output: + md_personal_exemptions_count: 3 + md_total_personal_exemptions: 9_600 + +- name: 2025 joint return with both spouses claimable counts both spouses but no dependents + period: 2025 + input: + people: + person_a: + age: 23 + employment_income: 1000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 23 + employment_income: 1000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: MD + output: + # 2 own exemptions; no dependents (IRC 152(b)(1)). + md_personal_exemptions_count: 2 + md_total_personal_exemptions: 6_400 + +- name: 2025 joint return with no claimable spouse counts every member + period: 2025 + input: + people: + person_a: + age: 23 + employment_income: 1000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 23 + employment_income: 1000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: MD + output: + # 2 filers + 1 child. + md_personal_exemptions_count: 3 + +- name: 2022 single filer who can be claimed keeps their own exemption + period: 2022 + input: + people: + person_a: + age: 19 + employment_income: 4_000 + claimable_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + tax_units: + tax_unit: + members: [person_a] + filing_status: SINGLE + households: + household: + members: [person_a] + state_code: MD + output: + # 10-211(a)(1) as amended by 2018 ch. 575 applies from tax year 2018: + # 1 x $3,200 at AGI under $100,000. + md_personal_exemptions_count: 1 + md_total_personal_exemptions: 3_200 diff --git a/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/exemptions/md_total_personal_exemptions.yaml b/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/exemptions/md_total_personal_exemptions.yaml new file mode 100644 index 00000000000..08647b57135 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/md/tax/income/exemptions/md_total_personal_exemptions.yaml @@ -0,0 +1,199 @@ + + +- name: 2025 single filer who can be claimed as a dependent gets their own exemption but none for the child + period: 2025 + input: + people: + person_a: + age: 23 + employment_income: 1000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: MD + output: + # Tax-General 10-211(a)(1): an exemption for "the taxpayer", with no + # dependency condition since 2018 ch. 575; IRC 152(b)(1) leaves no + # dependents. 1 x $3,200. (The 2025 booklet's filing status 6 gives $0.) + md_total_personal_exemptions: 3_200 + +- name: 2025 single filer who cannot be claimed gets personal exemptions for the filer and the child + period: 2025 + input: + people: + person_a: + age: 23 + employment_income: 1000 + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, child] + filing_status: SINGLE + households: + household: + members: [person_a, child] + state_code: MD + output: + # 2 exemptions x $3,200 (AGI under $100,000). + md_total_personal_exemptions: 6400 + +- name: 2025 joint return with one claimable spouse gets both spouses' exemptions but none for the child (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 23 + employment_income: 1000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 23 + employment_income: 1000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: MD + output: + # Separate Maryland returns: "Each spouse must claim their own personal + # exemption" (10-211(a)(1) gives each one) and the spouses split the + # federal return's dependents (none). 2 x $3,200. + md_total_personal_exemptions: 6_400 + +- name: 2025 joint return with one claimable spouse gets both spouses' exemptions but none for the child (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 23 + employment_income: 1000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 23 + employment_income: 1000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: MD + output: + md_total_personal_exemptions: 6_400 + +- name: 2025 joint return with both spouses claimable gets both spouses' exemptions but none for the child + period: 2025 + input: + people: + person_a: + age: 23 + employment_income: 1000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 23 + employment_income: 1000 + claimed_as_dependent_on_another_return: true + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: MD + output: + # 2 own exemptions x $3,200; no dependents (IRC 152(b)(1)). + md_total_personal_exemptions: 6_400 + +- name: 2025 joint return with no claimable spouse gets exemptions for both spouses and the child + period: 2025 + input: + people: + person_a: + age: 23 + employment_income: 1000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 23 + employment_income: 1000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: MD + output: + # 3 exemptions x $3,200 = $9,600. + md_total_personal_exemptions: 9600 + +- name: Federal dependent exemption repeal preserves Maryland exemptions for an unclaimed family + period: 2025 + reforms: policyengine_us.reforms.treasury.repeal_dependent_exemptions.repeal_dependent_exemptions + input: + gov.contrib.treasury.repeal_dependent_exemptions: true + people: + head: {age: 35, is_tax_unit_head: true, is_tax_unit_spouse: false} + spouse: {age: 35, is_tax_unit_head: false, is_tax_unit_spouse: true} + child_a: {age: 4, is_tax_unit_dependent: true} + child_b: {age: 7, is_tax_unit_dependent: true} + tax_units: + tax_unit: + members: [head, spouse, child_a, child_b] + filing_status: JOINT + adjusted_gross_income: 50_000 + households: + household: + members: [head, spouse, child_a, child_b] + state_code: MD + output: + exemptions_count: 2 + md_personal_exemptions_count: 4 + # Tax-General 10-211(a)(3), (b)(1): Maryland's dependent exemptions + # survive the federal-only reform; 4 x $3,200 at joint AGI < $150,000. + md_total_personal_exemptions: 12_800 diff --git a/policyengine_us/tests/policy/contrib/state_dependent_exemptions/repeal_state_dependent_exemptions.yaml b/policyengine_us/tests/policy/contrib/state_dependent_exemptions/repeal_state_dependent_exemptions.yaml index a476fc6a3b3..d6009003126 100644 --- a/policyengine_us/tests/policy/contrib/state_dependent_exemptions/repeal_state_dependent_exemptions.yaml +++ b/policyengine_us/tests/policy/contrib/state_dependent_exemptions/repeal_state_dependent_exemptions.yaml @@ -535,3 +535,60 @@ households: {household: {members: [person_b, person_a], state_code: CA}} output: ca_exemptions: 153 + +- name: Joint filers with a claimable spouse in Maryland keep both spouses' exemptions (the claimable spouse is the head) + period: 2024 + reforms: policyengine_us.reforms.state_dependent_exemptions.repeal_state_dependent_exemptions.repeal_state_dependent_exemptions + input: + gov.contrib.repeal_state_dependent_exemptions.in_effect: true + people: + person_a: {age: 30, employment_income: 500, claimed_as_dependent_on_another_return: true, is_tax_unit_head: true, is_tax_unit_spouse: false} + person_b: {age: 30, employment_income: 500, is_tax_unit_head: false, is_tax_unit_spouse: true} + child: {age: 5, is_tax_unit_dependent: true} + tax_units: {tax_unit: {members: [person_a, person_b, child], filing_status: JOINT}} + households: {household: {members: [person_a, person_b, child], state_name: MD}} + # Tax-General 10-211(a)(1): each spouse keeps an own exemption, and the + # repeal drops the child: 2 x 3,200. + output: {md_total_personal_exemptions: 6_400} + +- name: Joint filers with a claimable spouse in Maryland keep both spouses' exemptions (the claimable spouse is the spouse) + period: 2024 + reforms: policyengine_us.reforms.state_dependent_exemptions.repeal_state_dependent_exemptions.repeal_state_dependent_exemptions + input: + gov.contrib.repeal_state_dependent_exemptions.in_effect: true + people: + person_b: {age: 30, employment_income: 500, is_tax_unit_head: true, is_tax_unit_spouse: false} + person_a: {age: 30, employment_income: 500, claimed_as_dependent_on_another_return: true, is_tax_unit_head: false, is_tax_unit_spouse: true} + child: {age: 5, is_tax_unit_dependent: true} + tax_units: {tax_unit: {members: [person_b, person_a, child], filing_status: JOINT}} + households: {household: {members: [person_b, person_a, child], state_name: MD}} + output: {md_total_personal_exemptions: 6_400} + + +- name: Joint filers with a claimable spouse in Kansas keep the other spouse's exemption in 2022 (the claimable spouse is the head) + period: 2022 + reforms: policyengine_us.reforms.state_dependent_exemptions.repeal_state_dependent_exemptions.repeal_state_dependent_exemptions + input: + gov.contrib.repeal_state_dependent_exemptions.in_effect: true + people: + person_a: {age: 30, employment_income: 500, claimed_as_dependent_on_another_return: true, is_tax_unit_head: true, is_tax_unit_spouse: false} + person_b: {age: 30, employment_income: 500, is_tax_unit_head: false, is_tax_unit_spouse: true} + child: {age: 5, is_tax_unit_dependent: true} + tax_units: {tax_unit: {members: [person_a, person_b, child], filing_status: JOINT}} + households: {household: {members: [person_a, person_b, child], state_name: KS}} + # K.S.A. 79-32,121(a) with IRC 151(d)(2): only the unclaimable spouse has + # an exemption, and the repeal drops the child: 1 x $2,250. + output: {ks_exemptions: 2_250} + +- name: Joint filers with a claimable spouse in Kansas keep the other spouse's exemption in 2022 (the claimable spouse is the spouse) + period: 2022 + reforms: policyengine_us.reforms.state_dependent_exemptions.repeal_state_dependent_exemptions.repeal_state_dependent_exemptions + input: + gov.contrib.repeal_state_dependent_exemptions.in_effect: true + people: + person_b: {age: 30, employment_income: 500, is_tax_unit_head: true, is_tax_unit_spouse: false} + person_a: {age: 30, employment_income: 500, claimed_as_dependent_on_another_return: true, is_tax_unit_head: false, is_tax_unit_spouse: true} + child: {age: 5, is_tax_unit_dependent: true} + tax_units: {tax_unit: {members: [person_b, person_a, child], filing_status: JOINT}} + households: {household: {members: [person_b, person_a, child], state_name: KS}} + output: {ks_exemptions: 2_250} diff --git a/policyengine_us/tests/policy/contrib/states/ia/dependent_credit_reform_test.yaml b/policyengine_us/tests/policy/contrib/states/ia/dependent_credit_reform_test.yaml index 11d65c9d7af..100022a0ac7 100644 --- a/policyengine_us/tests/policy/contrib/states/ia/dependent_credit_reform_test.yaml +++ b/policyengine_us/tests/policy/contrib/states/ia/dependent_credit_reform_test.yaml @@ -86,3 +86,49 @@ households: {household: {members: [parent, child1], state_name: IA}} # Dependent one year under the limit (12 < 13) is re-priced to the reform amount. output: {ia_exemption_credit: 140} # 40 personal + 100 young + + +- name: IA dependent credit reform - joint return with a claimable spouse has no dependent credit (the claimable spouse is the head) + period: 2025 + reforms: policyengine_us.reforms.states.ia.dependent_credit.ia_dependent_credit_reform.ia_dependent_credit_reform + input: + gov.contrib.states.ia.dependent_credit.in_effect: true + gov.contrib.states.ia.dependent_credit.amount: 100 + people: + person_a: {age: 30, employment_income: 500, claimed_as_dependent_on_another_return: true, is_tax_unit_head: true, is_tax_unit_spouse: false} + person_b: {age: 30, employment_income: 500, is_tax_unit_head: false, is_tax_unit_spouse: true} + child: {age: 5, is_tax_unit_dependent: true} + tax_units: {tax_unit: {members: [person_a, person_b, child], filing_status: JOINT}} + households: {household: {members: [person_a, person_b, child], state_name: IA}} + # IRC 152(b)(1): no dependents when either spouse can be claimed; 80 personal. + output: {ia_exemption_credit: 80} + +- name: IA dependent credit reform - joint return with a claimable spouse has no dependent credit (the claimable spouse is the spouse) + period: 2025 + reforms: policyengine_us.reforms.states.ia.dependent_credit.ia_dependent_credit_reform.ia_dependent_credit_reform + input: + gov.contrib.states.ia.dependent_credit.in_effect: true + gov.contrib.states.ia.dependent_credit.amount: 100 + people: + person_b: {age: 30, employment_income: 500, is_tax_unit_head: true, is_tax_unit_spouse: false} + person_a: {age: 30, employment_income: 500, claimed_as_dependent_on_another_return: true, is_tax_unit_head: false, is_tax_unit_spouse: true} + child: {age: 5, is_tax_unit_dependent: true} + tax_units: {tax_unit: {members: [person_b, person_a, child], filing_status: JOINT}} + households: {household: {members: [person_b, person_a, child], state_name: IA}} + output: {ia_exemption_credit: 80} + +- name: IA dependent credit reform - joint return whose claimable spouse's claimant meets the filing exception keeps the dependent credit + period: 2025 + reforms: policyengine_us.reforms.states.ia.dependent_credit.ia_dependent_credit_reform.ia_dependent_credit_reform + input: + gov.contrib.states.ia.dependent_credit.in_effect: true + gov.contrib.states.ia.dependent_credit.amount: 100 + people: + person_a: {age: 30, employment_income: 500, 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: 500, is_tax_unit_head: false, is_tax_unit_spouse: true} + child: {age: 5, is_tax_unit_dependent: true} + tax_units: {tax_unit: {members: [person_a, person_b, child], filing_status: JOINT}} + households: {household: {members: [person_a, person_b, child], state_name: IA}} + # The would-be claimant meets the filing exception (Publication 501), so IRC + # 152(b)(1) leaves the child a dependent: 80 personal + 1 x 100 reform amount. + output: {ia_exemption_credit: 180} diff --git a/policyengine_us/tests/policy/contrib/states/ks/dependent_exemption_reform_test.yaml b/policyengine_us/tests/policy/contrib/states/ks/dependent_exemption_reform_test.yaml index b4c9df30af0..e1acb8bdf68 100644 --- a/policyengine_us/tests/policy/contrib/states/ks/dependent_exemption_reform_test.yaml +++ b/policyengine_us/tests/policy/contrib/states/ks/dependent_exemption_reform_test.yaml @@ -105,3 +105,126 @@ # Dependent one year under the limit (17 < 18) gets the exemption. # 9,160 personal + 1 eligible dependent * 2,320 = 11,480. output: {ks_exemptions: 11_480} + + +- name: KS dependent exemption reform - joint return with a claimable spouse has no dependent exemption (the claimable spouse is the head) + period: 2025 + reforms: policyengine_us.reforms.states.ks.dependent_exemption.ks_dependent_exemption_reform.ks_dependent_exemption_reform + input: + gov.contrib.states.ks.dependent_exemption.in_effect: true + people: + person_a: {age: 30, employment_income: 500, claimed_as_dependent_on_another_return: true, is_tax_unit_head: true, is_tax_unit_spouse: false} + person_b: {age: 30, employment_income: 500, is_tax_unit_head: false, is_tax_unit_spouse: true} + child: {age: 5, is_tax_unit_dependent: true} + tax_units: {tax_unit: {members: [person_a, person_b, child], filing_status: JOINT}} + households: {household: {members: [person_a, person_b, child], state_name: KS}} + # Joint base 18,320; IRC 152(b)(1): no dependents when either spouse can be claimed. + output: {ks_exemptions: 18_320} + +- name: KS dependent exemption reform - joint return with a claimable spouse has no dependent exemption (the claimable spouse is the spouse) + period: 2025 + reforms: policyengine_us.reforms.states.ks.dependent_exemption.ks_dependent_exemption_reform.ks_dependent_exemption_reform + input: + gov.contrib.states.ks.dependent_exemption.in_effect: true + people: + person_b: {age: 30, employment_income: 500, is_tax_unit_head: true, is_tax_unit_spouse: false} + person_a: {age: 30, employment_income: 500, claimed_as_dependent_on_another_return: true, is_tax_unit_head: false, is_tax_unit_spouse: true} + child: {age: 5, is_tax_unit_dependent: true} + tax_units: {tax_unit: {members: [person_b, person_a, child], filing_status: JOINT}} + households: {household: {members: [person_b, person_a, child], state_name: KS}} + output: {ks_exemptions: 18_320} + +- name: KS dependent exemption reform - actually claimed filer with filing exception keeps only the repriced child exemption with amount zero + period: 2022 + reforms: policyengine_us.reforms.states.ks.dependent_exemption.ks_dependent_exemption_reform.ks_dependent_exemption_reform + input: + gov.contrib.states.ks.dependent_exemption.in_effect: true + gov.contrib.states.ks.dependent_exemption.amount: 0 + people: + parent: + age: 20 + claimed_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [parent, child] + filing_status: SINGLE + households: + household: + members: [parent, child] + state_name: KS + output: + # The claimed parent has no exemption of their own (IRC 151(d)(2)); the + # filing exception keeps the child (IRC 152(b)(1)). Count 0 + 1 = 1, all + # of it the repriced child: (1 - 1) * $2,250 + 1 * $0 = $0. + ks_exemptions: 0 + head_or_spouse_is_dependent_elsewhere_without_filing_exception: false + ks_count_exemptions: 1 + ks_eligible_dependents_count: 1 + +- name: KS dependent exemption reform - actually claimed filer with filing exception keeps only the repriced child exemption with amount 4,000 dollars + period: 2022 + reforms: policyengine_us.reforms.states.ks.dependent_exemption.ks_dependent_exemption_reform.ks_dependent_exemption_reform + input: + gov.contrib.states.ks.dependent_exemption.in_effect: true + gov.contrib.states.ks.dependent_exemption.amount: 4_000 + people: + parent: + age: 20 + claimed_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [parent, child] + filing_status: SINGLE + households: + household: + members: [parent, child] + state_name: KS + output: + # The claimed parent has no exemption of their own (IRC 151(d)(2)); the + # filing exception keeps the child. (1 - 1) * $2,250 + 1 * $4,000. + ks_exemptions: 4_000 + head_or_spouse_is_dependent_elsewhere_without_filing_exception: false + ks_count_exemptions: 1 + ks_eligible_dependents_count: 1 + +- name: KS dependent exemption reform - 2024 actually claimed filer with filing exception retains repriced child exemption + period: 2024 + reforms: policyengine_us.reforms.states.ks.dependent_exemption.ks_dependent_exemption_reform.ks_dependent_exemption_reform + input: + gov.contrib.states.ks.dependent_exemption.in_effect: true + gov.contrib.states.ks.dependent_exemption.amount: 4_000 + people: + parent: + age: 20 + claimed_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + is_tax_unit_head: true + is_tax_unit_spouse: false + child: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [parent, child] + filing_status: SINGLE + households: + household: + members: [parent, child] + state_name: KS + output: + # The 2024+ federal-entitlement reading retains the child despite the + # actual claim: $9,160 + $4,000 = $13,160 ($11,480 at the baseline rate). + ks_exemptions: 13_160 + ks_eligible_dependents_count: 1 diff --git a/policyengine_us/tests/policy/contrib/states/md/dependent_exemption_reform_test.yaml b/policyengine_us/tests/policy/contrib/states/md/dependent_exemption_reform_test.yaml index d7dd6d790a9..1ef8d0de3b1 100644 --- a/policyengine_us/tests/policy/contrib/states/md/dependent_exemption_reform_test.yaml +++ b/policyengine_us/tests/policy/contrib/states/md/dependent_exemption_reform_test.yaml @@ -156,3 +156,50 @@ # step-down is driven through the contrib schedule, not just a flat amount. output: {md_total_personal_exemptions: 2_400} + + +- name: MD dependent exemption reform - joint return with a claimable spouse keeps both spouses' exemptions but no dependent exemption (the claimable spouse is the head) + period: 2025 + reforms: policyengine_us.reforms.states.md.dependent_exemption.md_dependent_exemption_reform.md_dependent_exemption_reform + input: + gov.contrib.states.md.dependent_exemption.in_effect: true + people: + person_a: {age: 30, employment_income: 500, claimed_as_dependent_on_another_return: true, is_tax_unit_head: true, is_tax_unit_spouse: false} + person_b: {age: 30, employment_income: 500, is_tax_unit_head: false, is_tax_unit_spouse: true} + child: {age: 5, is_tax_unit_dependent: true} + tax_units: {tax_unit: {members: [person_a, person_b, child], filing_status: JOINT}} + households: {household: {members: [person_a, person_b, child], state_name: MD}} + # Tax-General 10-211(a)(1): each spouse keeps an own exemption; no dependents + # (IRC 152(b)(1)). 2 x 3,200. + output: {md_total_personal_exemptions: 6_400} + +- name: MD dependent exemption reform - joint return with a claimable spouse keeps both spouses' exemptions but no dependent exemption (the claimable spouse is the spouse) + period: 2025 + reforms: policyengine_us.reforms.states.md.dependent_exemption.md_dependent_exemption_reform.md_dependent_exemption_reform + input: + gov.contrib.states.md.dependent_exemption.in_effect: true + people: + person_b: {age: 30, employment_income: 500, is_tax_unit_head: true, is_tax_unit_spouse: false} + person_a: {age: 30, employment_income: 500, claimed_as_dependent_on_another_return: true, is_tax_unit_head: false, is_tax_unit_spouse: true} + child: {age: 5, is_tax_unit_dependent: true} + tax_units: {tax_unit: {members: [person_b, person_a, child], filing_status: JOINT}} + households: {household: {members: [person_b, person_a, child], state_name: MD}} + output: {md_total_personal_exemptions: 6_400} + +- name: MD dependent exemption reform - joint return whose claimable spouse's claimant meets the filing exception keeps the dependent exemption + period: 2025 + reforms: policyengine_us.reforms.states.md.dependent_exemption.md_dependent_exemption_reform.md_dependent_exemption_reform + input: + gov.contrib.states.md.dependent_exemption.in_effect: true + gov.contrib.states.md.dependent_exemption.amount: 1_000 + people: + person_a: {age: 30, employment_income: 500, 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: 500, is_tax_unit_head: false, is_tax_unit_spouse: true} + child: {age: 5, is_tax_unit_dependent: true} + tax_units: {tax_unit: {members: [person_a, person_b, child], filing_status: JOINT}} + households: {household: {members: [person_a, person_b, child], state_name: MD}} + # The would-be claimant meets the filing exception (Publication 501), so IRC + # 152(b)(1) leaves the child a dependent. Each spouse's own exemption under + # Tax-General 10-211(a)(1): 2 x 3,200 = 6,400, plus the flat 1 x 1,000 reform + # dependent amount = 7,400. + output: {md_total_personal_exemptions: 7_400} diff --git a/policyengine_us/variables/gov/states/ia/tax/income/credits/ia_exemption_credit.py b/policyengine_us/variables/gov/states/ia/tax/income/credits/ia_exemption_credit.py index b6dec677c45..bce803a3b6e 100644 --- a/policyengine_us/variables/gov/states/ia/tax/income/credits/ia_exemption_credit.py +++ b/policyengine_us/variables/gov/states/ia/tax/income/credits/ia_exemption_credit.py @@ -10,6 +10,10 @@ class ia_exemption_credit(Variable): reference = ( "https://revenue.iowa.gov/sites/default/files/2021-12/IA6251%2841131%29.pdf", "https://revenue.iowa.gov/sites/default/files/2023-01/IA6251%2841131%29.pdf", + # PDF pages 39-40 + "https://www.legis.iowa.gov/docs/code/2026/422.pdf#page=39", + # 2025 IA 1040 instructions, Personal and dependent credits. + "https://revenue.iowa.gov/media/4435/download?inline#page=8", ) defined_for = StateCode.IA @@ -19,7 +23,20 @@ def formula(tax_unit, period, parameters): filing_status = tax_unit("filing_status", period) hoh_status = filing_status.possible_values.HEAD_OF_HOUSEHOLD hoh_bonus = filing_status == hoh_status - dependent_count = tax_unit("tax_unit_dependents", period) + # Iowa Code 422.12(1)(a) gives "dependent" its Internal Revenue Code + # meaning, and the instructions count the dependents "you are + # claiming for federal income tax purposes". Under IRC 152(b)(1) a + # return on which the filer (or, if joint, either spouse) can be + # claimed has none, unless the would-be claimant meets the filing + # exception (Publication 501, Dependent Taxpayer Test). Each filer + # keeps the personal credit, which Iowa allows "even if you are + # claimed as a dependent". + filer_is_dependent = tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + dependent_count = where( + filer_is_dependent, 0, tax_unit("tax_unit_dependents", period) + ) # count extra adult exemptions based on being elderly and/or blind p = parameters(period).gov.states.ia.tax.income exemption = p.credits.exemption diff --git a/policyengine_us/variables/gov/states/ia/tax/income/ia_alternate_tax_eligible.py b/policyengine_us/variables/gov/states/ia/tax/income/ia_alternate_tax_eligible.py index 5ce2a8ce95e..59b5ded459f 100644 --- a/policyengine_us/variables/gov/states/ia/tax/income/ia_alternate_tax_eligible.py +++ b/policyengine_us/variables/gov/states/ia/tax/income/ia_alternate_tax_eligible.py @@ -11,9 +11,14 @@ class ia_alternate_tax_eligible(Variable): "https://revenue.iowa.gov/media/2650/download?inline#page=53", "https://revenue.iowa.gov/sites/default/files/2023-01/2022IA1040%2841001%29.pdf", "https://revenue.iowa.gov/media/2721/download?inline#page=53", + # PDF pages 1-2: 422.5(2)(b) alternate tax within the subsection whose + # benefit a claimed dependent loses when the claimant's income is high. + "https://www.legis.iowa.gov/docs/code/2024/422.5.pdf#page=1", ) defined_for = StateCode.IA def formula(tax_unit, period, parameters): filing_status = tax_unit("filing_status", period) - return filing_status != filing_status.possible_values.SINGLE + nonsingle = filing_status != filing_status.possible_values.SINGLE + disqualified = tax_unit("ia_claimed_filer_income_disqualified", period) + return nonsingle & ~disqualified diff --git a/policyengine_us/variables/gov/states/ia/tax/income/ia_claimed_filer_income_disqualified.py b/policyengine_us/variables/gov/states/ia/tax/income/ia_claimed_filer_income_disqualified.py new file mode 100644 index 00000000000..d8eeb43fc68 --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/tax/income/ia_claimed_filer_income_disqualified.py @@ -0,0 +1,66 @@ +from policyengine_us.model_api import * + + +class ia_claimed_filer_income_disqualified(Variable): + value_type = bool + entity = TaxUnit + label = ( + "Iowa low-income relief denied because a claiming person's income is too high" + ) + documentation = ( + "Iowa Code 422.5 denies the benefit of its low-income subsection " + "(the exemption, the single-filer tax reduction and the alternate " + "tax) to a person claimed as a dependent on another return when the " + "person claiming them has net income over the subsection's limit. " + "The test reads an actual claim, not claimability, and the claiming " + "person's income, not the dependent filer's." + ) + definition_period = YEAR + defined_for = StateCode.IA + reference = ( + # 2021-2022: 422.5(3)(a) and (3B); renumbered (2) and (3) from 2023. + "https://www.legis.iowa.gov/docs/code/2022/422.5.pdf#page=3", + # PDF pages 1-2 + "https://www.legis.iowa.gov/docs/code/2024/422.5.pdf#page=1", + ) + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.ia.tax.income.tax_exempt + # The active subsection is the elderly one when either filer of this + # return is 65 or older. + elderly = (tax_unit("age_head", period) >= p.elderly_age) | ( + tax_unit("age_spouse", period) >= p.elderly_age + ) + smaller_limit = where( + elderly, p.income_limit.single_elderly, p.income_limit.single_nonelderly + ) + larger_limit = where( + elderly, p.income_limit.other_elderly, p.income_limit.other_nonelderly + ) + person = tax_unit.members + filer = person("is_tax_unit_head_or_spouse", period) + claimed = person("claimed_as_dependent_on_another_return", period) + claimant_status = person("ia_dependent_claimant_filing_status", period) + statuses = claimant_status.possible_values + larger_status = ( + (claimant_status == statuses.JOINT) + | (claimant_status == statuses.HEAD_OF_HOUSEHOLD) + | (claimant_status == statuses.SURVIVING_SPOUSE) + ) + married = (claimant_status == statuses.JOINT) | ( + claimant_status == statuses.SEPARATE + ) + claimant_limit = where( + larger_status, + person.tax_unit.project(larger_limit), + person.tax_unit.project(smaller_limit), + ) + claimant_income = person("ia_dependent_claimant_net_income", period) + combined_income = claimant_income + person( + "ia_dependent_claimant_spouse_net_income", period + ) + # The statute denies relief only when income "exceeds" the limit. + over_limit = (claimant_income > claimant_limit) | ( + married & (combined_income > person.tax_unit.project(larger_limit)) + ) + return tax_unit.any(filer & claimed & over_limit) diff --git a/policyengine_us/variables/gov/states/ia/tax/income/ia_dependent_claimant_filing_status.py b/policyengine_us/variables/gov/states/ia/tax/income/ia_dependent_claimant_filing_status.py new file mode 100644 index 00000000000..9221c722620 --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/tax/income/ia_dependent_claimant_filing_status.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.household.demographic.tax_unit.filing_status import ( + FilingStatus, +) + + +class ia_dependent_claimant_filing_status(Variable): + value_type = Enum + entity = Person + possible_values = FilingStatus + default_value = FilingStatus.SINGLE + label = "Filing status of the person claiming this filer as a dependent" + documentation = ( + "Selects the Iowa Code 422.5 income limit that applies to the " + "claiming person: the larger one for a joint, head of household or " + "surviving spouse return, the smaller one otherwise." + ) + definition_period = YEAR + defined_for = StateCode.IA + reference = ( + "https://www.legis.iowa.gov/docs/code/2022/422.5.pdf#page=3", + # PDF pages 1-2 + "https://www.legis.iowa.gov/docs/code/2024/422.5.pdf#page=1", + ) diff --git a/policyengine_us/variables/gov/states/ia/tax/income/ia_dependent_claimant_net_income.py b/policyengine_us/variables/gov/states/ia/tax/income/ia_dependent_claimant_net_income.py new file mode 100644 index 00000000000..aedf53d751e --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/tax/income/ia_dependent_claimant_net_income.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class ia_dependent_claimant_net_income(Variable): + value_type = float + entity = Person + label = "Iowa net income of the person claiming this filer as a dependent" + unit = USD + documentation = ( + "For a filer claimed as a dependent on another return, the claiming " + "person's own net income from all sources under Iowa Code 422.5, " + "including its addbacks. Zero, so no disqualification, without an " + "input." + ) + definition_period = YEAR + defined_for = StateCode.IA + reference = ( + # Iowa Code 422.5(3)(a) (2022) and 422.5(2)(a) (2023 onward). + "https://www.legis.iowa.gov/docs/code/2022/422.5.pdf#page=3", + # PDF pages 1-2 + "https://www.legis.iowa.gov/docs/code/2024/422.5.pdf#page=1", + ) diff --git a/policyengine_us/variables/gov/states/ia/tax/income/ia_dependent_claimant_spouse_net_income.py b/policyengine_us/variables/gov/states/ia/tax/income/ia_dependent_claimant_spouse_net_income.py new file mode 100644 index 00000000000..35792c7cef5 --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/tax/income/ia_dependent_claimant_spouse_net_income.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class ia_dependent_claimant_spouse_net_income(Variable): + value_type = float + entity = Person + label = ( + "Iowa net income of the spouse of the person claiming this filer as a dependent" + ) + unit = USD + documentation = ( + "For a filer claimed as a dependent by a married person, the claiming " + "person's spouse's net income from all sources under Iowa Code " + "422.5, including its addbacks. Zero without an input." + ) + definition_period = YEAR + defined_for = StateCode.IA + reference = ( + "https://www.legis.iowa.gov/docs/code/2022/422.5.pdf#page=3", + # PDF pages 1-2 + "https://www.legis.iowa.gov/docs/code/2024/422.5.pdf#page=1", + ) diff --git a/policyengine_us/variables/gov/states/ia/tax/income/ia_is_tax_exempt.py b/policyengine_us/variables/gov/states/ia/tax/income/ia_is_tax_exempt.py index c6537563957..676f857564b 100644 --- a/policyengine_us/variables/gov/states/ia/tax/income/ia_is_tax_exempt.py +++ b/policyengine_us/variables/gov/states/ia/tax/income/ia_is_tax_exempt.py @@ -8,9 +8,16 @@ class ia_is_tax_exempt(Variable): definition_period = YEAR reference = ( "https://revenue.iowa.gov/sites/default/files/2022-01/IA1040%2841-001%29.pdf", - "https://revenue.iowa.gov/media/2650/download?inline#page=37", + "https://revenue.iowa.gov/media/2650/download?inline#page=38", "https://revenue.iowa.gov/sites/default/files/2023-01/2022IA1040%2841001%29.pdf", "https://revenue.iowa.gov/media/2721/download?inline#page=37", + "https://revenue.iowa.gov/media/2811/download?inline#page=12", + "https://revenue.iowa.gov/media/4152/download?inline#page=10", + "https://revenue.iowa.gov/media/4435/download?inline#page=11", + # PDF pages 7-8: Iowa Code 422.5(2)(a) and (3)(a). + "https://www.legis.iowa.gov/docs/code/2026/422.pdf#page=7", + # 422.5(3)(a) before the 2023 renumbering. + "https://www.legis.iowa.gov/docs/code/2022/422.5.pdf#page=3", ) defined_for = StateCode.IA @@ -27,4 +34,11 @@ def formula(tax_unit, period, parameters): where(is_elderly, pil.single_elderly, pil.single_nonelderly), where(is_elderly, pil.other_elderly, pil.other_nonelderly), ) - return tax_unit("ia_modified_income", period) <= modified_income_limit + exempt = tax_unit("ia_modified_income", period) <= modified_income_limit + # Iowa Code 422.5 denies the exemption to a claimed dependent only + # when the person claiming them has net income over the limit. The + # instructions instead test the dependent's own income against + # $5,000 and limit the exemption to filers not claimed on another + # Iowa return; the statute governs. + disqualified = tax_unit("ia_claimed_filer_income_disqualified", period) + return exempt & ~disqualified diff --git a/policyengine_us/variables/gov/states/ia/tax/income/ia_reduced_tax.py b/policyengine_us/variables/gov/states/ia/tax/income/ia_reduced_tax.py index 299b93cac67..e985326343b 100644 --- a/policyengine_us/variables/gov/states/ia/tax/income/ia_reduced_tax.py +++ b/policyengine_us/variables/gov/states/ia/tax/income/ia_reduced_tax.py @@ -12,6 +12,11 @@ class ia_reduced_tax(Variable): "https://revenue.iowa.gov/media/2650/download?inline#page=60", "https://revenue.iowa.gov/sites/default/files/2023-01/2022IA1040%2841001%29.pdf", "https://revenue.iowa.gov/media/2721/download?inline#page=60", + "https://revenue.iowa.gov/media/4152/download?inline#page=18", + "https://revenue.iowa.gov/media/4435/download?inline#page=18", + "https://www.legis.iowa.gov/docs/code/2022/422.5.pdf#page=3", + # PDF pages 1-2 + "https://www.legis.iowa.gov/docs/code/2024/422.5.pdf#page=1", ) defined_for = StateCode.IA @@ -24,8 +29,13 @@ def formula(tax_unit, period, parameters): is_elderly, p.threshold.elderly, p.threshold.nonelderly ) amount = max_(0, modified_income - modified_income_threshold) # Line 3 - # reduced tax available only to single tax units + # The reduction is for single tax units. Iowa Code 422.5 withholds it + # from a claimed dependent only when the claiming person's net income + # is over the limit; the worksheet's wider bar on any filer "claimed + # as a dependent on another person's Iowa return" gives way to it. + # Otherwise the cap is infinite, so it cannot erase tax. filing_status = tax_unit("filing_status", period) is_single = filing_status == filing_status.possible_values.SINGLE - return where(is_single, amount, np.inf) + disqualified = tax_unit("ia_claimed_filer_income_disqualified", period) + return where(is_single & ~disqualified, amount, np.inf) # see ia_income_tax_before_refundable_credits formula for variable use diff --git a/policyengine_us/variables/gov/states/ks/tax/income/credits/ks_fstc.py b/policyengine_us/variables/gov/states/ks/tax/income/credits/ks_fstc.py index 6e09ebf3fa8..a30f7fb7e7c 100644 --- a/policyengine_us/variables/gov/states/ks/tax/income/credits/ks_fstc.py +++ b/policyengine_us/variables/gov/states/ks/tax/income/credits/ks_fstc.py @@ -8,42 +8,55 @@ class ks_fstc(Variable): unit = USD definition_period = YEAR reference = ( - "https://www.ksrevenue.gov/pdf/ip21.pdf", - "https://www.ksrevenue.gov/pdf/ip22.pdf", + # K.S.A. 79-32,271(d): $125 "for every exemption claimed on the + # taxpayer's federal income tax return". + "https://kslegislature.gov/b2025_26/laws/079_000_0000_chapter/079_032_0000_article/079_032_0271_section/079_032_0271_k/", + "https://kslegislature.gov/li_2022/b2021_22/measures/documents/hb2106_enrolled.pdf#page=2", + "https://www.ksrevenue.gov/pdf/ip21.pdf#page=6", + "https://www.ksrevenue.gov/pdf/ip22.pdf#page=6", + "https://www.ksrevenue.gov/pdf/ip23.pdf#page=6", + "https://www.ksrevenue.gov/pdf/ip24.pdf#page=6", ) defined_for = StateCode.KS def formula(tax_unit, period, parameters): p = parameters(period).gov.states.ks.tax.income.credits - # determine if tax unit is eligible for credit + # K.S.A. 79-32,271(d) counts "every exemption claimed on the + # taxpayer's federal income tax return": each filer whom no other + # taxpayer may claim (IRC 151(d)(2)), plus dependent children under + # 18, since dependents 18 or older do not count. The K-40 instructions + # instead carry the Kansas exemption count (Line E), with its + # filing-status allowances from 2024; the statute governs. + filers = tax_unit("head_spouse_count_not_dependent_elsewhere", period) + # A return on which the filer (or, if joint, either spouse) can be + # claimed has no dependents (IRC 152(b)(1)), unless the would-be + # claimant meets the filing exception (Publication 501, Dependent + # Taxpayer Test). This limits only the children, not an unclaimable + # spouse's own exemption. + filer_is_dependent = tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) person = tax_unit.members - # ... any child dependents? - count_all_dependents = tax_unit("tax_unit_dependents", period) - child_age = p.food_sales_tax.child_age - is_child = person("age", period) < child_age + is_child = person("age", period) < p.food_sales_tax.child_age is_child_dependent = person("is_tax_unit_dependent", period) & is_child - count_child_dependents = tax_unit.sum(is_child_dependent) - has_eligible_child = count_child_dependents > 0 - # ... any elderly adults? + child_dependents = where( + filer_is_dependent, 0, tax_unit.sum(is_child_dependent) + ) + # Eligibility: a dependent child, an elderly filer, or a blind or + # disabled filer. min_adult_age = p.food_sales_tax.min_adult_age elderly_head = tax_unit("age_head", period) >= min_adult_age elderly_spouse = tax_unit("age_spouse", period) >= min_adult_age eligible_age = elderly_head | elderly_spouse - # ... any adult disabilities? eligible_blind_disabled = ( tax_unit("blind_head", period) | tax_unit("blind_spouse", period) | tax_unit("head_is_disabled", period) | tax_unit("spouse_is_disabled", period) ) - # ... any eligibility for credit? - eligible_unit = has_eligible_child | eligible_age | eligible_blind_disabled - # determine if income eligible for credit + eligible_unit = (child_dependents > 0) | eligible_age | eligible_blind_disabled fagi = tax_unit("adjusted_gross_income", period) eligible_income = fagi <= p.food_sales_tax.agi_limit - # compute credit amount eligible = eligible_unit & eligible_income - exemptions = tax_unit("tax_unit_size", period) - old_dependents = count_all_dependents - count_child_dependents - fstc_exemptions = max_(0, exemptions - old_dependents) - return eligible * fstc_exemptions * p.food_sales_tax.amount + exemptions = filers + child_dependents + return eligible * exemptions * p.food_sales_tax.amount diff --git a/policyengine_us/variables/gov/states/ks/tax/income/exemptions/ks_count_exemptions.py b/policyengine_us/variables/gov/states/ks/tax/income/exemptions/ks_count_exemptions.py index d69c01f2d84..e627eb55492 100644 --- a/policyengine_us/variables/gov/states/ks/tax/income/exemptions/ks_count_exemptions.py +++ b/policyengine_us/variables/gov/states/ks/tax/income/exemptions/ks_count_exemptions.py @@ -8,16 +8,34 @@ class ks_count_exemptions(Variable): unit = USD definition_period = YEAR reference = ( - "https://www.ksrevenue.gov/pdf/ip21.pdf", - "https://www.ksrevenue.gov/pdf/ip22.pdf", + # K.S.A. 79-32,121(a): $2,250 "for each exemption for which such + # individual is entitled to a deduction" federally. + "https://kslegislature.gov/li_2024s/b2023_24/statute/079_000_0000_chapter/079_032_0000_article/079_032_0121_section/079_032_0121_k/", + "https://www.kslegislature.gov/li_2022/b2021_22/measures/documents/hb2239_enrolled.pdf#page=38", + # IRC 151(d)(2): no personal exemption for an individual whom another + # taxpayer is allowed to claim. + "https://www.law.cornell.edu/uscode/text/26/151#d_2", + "https://www.ksrevenue.gov/pdf/ip21.pdf#page=6", + "https://www.ksrevenue.gov/pdf/ip22.pdf#page=6", + "https://www.ksrevenue.gov/pdf/ip23.pdf#page=6", ) defined_for = StateCode.KS def formula(tax_unit, period, parameters): - filing_status = tax_unit("filing_status", period) - statuses = filing_status.possible_values - joint = filing_status == statuses.JOINT - hoh = filing_status == statuses.HEAD_OF_HOUSEHOLD - adults = where(joint | hoh, 2, 1) - dependents = tax_unit("tax_unit_dependents", period) - return adults + dependents + # K.S.A. 79-32,121(a) counts the exemptions to which the filer is + # entitled federally. IRC 151(d)(2) denies a filer's own exemption + # when another taxpayer is allowed to claim them, whether or not they + # do, and applies to each spouse separately. The K-40 instructions + # instead zero the whole return when a filer is claimed; the statute + # governs. A head of household counts only the head: the extra + # allowance in 79-32,121 is limited to tax year 1998. + filers = tax_unit("head_spouse_count_not_dependent_elsewhere", period) + # Dependents are those "you claim as a dependent" federally; under IRC + # 152(b)(1) a return on which the filer (or, if joint, either spouse) + # can be claimed has none, unless the would-be claimant meets the + # filing exception (Publication 501, Dependent Taxpayer Test). + no_dependents = tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + dependents = where(no_dependents, 0, tax_unit("tax_unit_dependents", period)) + return filers + dependents diff --git a/policyengine_us/variables/gov/states/ks/tax/income/exemptions/ks_exemptions.py b/policyengine_us/variables/gov/states/ks/tax/income/exemptions/ks_exemptions.py index 3b43e3598f0..5b6fd4a9665 100644 --- a/policyengine_us/variables/gov/states/ks/tax/income/exemptions/ks_exemptions.py +++ b/policyengine_us/variables/gov/states/ks/tax/income/exemptions/ks_exemptions.py @@ -8,7 +8,10 @@ class ks_exemptions(Variable): unit = USD definition_period = YEAR reference = ( - "https://law.justia.com/codes/kansas/chapter-79/article-32/section-79-32-121/" + "https://law.justia.com/codes/kansas/chapter-79/article-32/section-79-32-121/", + "https://ksrevisor.gov/statutes/chapters/ch79/079_032_0121b.html", + "https://www.ksrevenue.gov/pdf/ip24.pdf#page=6", + "https://www.ksrevenue.gov/faqs-taxii.html", ) defined_for = StateCode.KS @@ -24,7 +27,21 @@ def formula(tax_unit, period, parameters): if p.by_filing_status.in_effect: filing_status = tax_unit("filing_status", period) base_amount = p.by_filing_status.amount[filing_status] - dependents = tax_unit("tax_unit_dependents", period) + # K.S.A. 79-32,121b allows the dependent amount for each dependent + # "for which such taxpayer is entitled to a deduction" federally; + # under IRC 152(b)(1) a return on which the filer (or, if joint, + # either spouse) can be claimed has none ("enter '0' in the number + # of dependents box"), unless the would-be claimant meets the + # filing exception (Publication 501, Dependent Taxpayer Test). The + # filing-status amount stays: a claimable taxpayer "will qualify + # for the personal exemption allowance" (Kansas Department of + # Revenue FAQ). + filer_is_dependent = tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + dependents = where( + filer_is_dependent, 0, tax_unit("tax_unit_dependents", period) + ) dependent_amount = p.by_filing_status.dependent * dependents head_of_household = ( filing_status == filing_status.possible_values.HEAD_OF_HOUSEHOLD diff --git a/policyengine_us/variables/gov/states/la/tax/income/exemptions/personal/la_dependents_exemption.py b/policyengine_us/variables/gov/states/la/tax/income/exemptions/personal/la_dependents_exemption.py index 49489ff2ad9..87e5c0b34b4 100644 --- a/policyengine_us/variables/gov/states/la/tax/income/exemptions/personal/la_dependents_exemption.py +++ b/policyengine_us/variables/gov/states/la/tax/income/exemptions/personal/la_dependents_exemption.py @@ -8,6 +8,9 @@ class la_dependents_exemption(Variable): reference = [ "https://dam.ldr.la.gov/taxforms/6935(11_02)F.pdf#page=1", "https://dam.ldr.la.gov/taxforms/IT540iWEB(2022)D1.pdf#page=2", + "https://dam.ldr.la.gov/taxforms/IT540i(2021)%20Instructions.pdf#page=3", + "https://dam.ldr.la.gov/taxforms/IT540i%20WEB(2023)%20INSTRUCTIONS.pdf#page=3", + "https://dam.ldr.la.gov/taxforms/IT540i%20WEB%20(2024)D18%20INSTRUCTIONS.pdf#page=3", ] # Even though the tax computation worksheet refers "dependent exemption" as credits, the instructions for # preparing tax form line 6a-6b specifies it as exemption. @@ -16,6 +19,17 @@ class la_dependents_exemption(Variable): defined_for = StateCode.LA def formula(tax_unit, period, parameters): - dependents = tax_unit("tax_unit_dependents", period) + # Line 6C counts "the dependents claimed on your federal return". Under + # IRC 152(b)(1) a federal return on which the filer (or, if joint, + # either spouse) can be claimed has none, unless the would-be claimant + # meets the filing exception (Publication 501, Dependent Taxpayer + # Test). The filer's own exemption (Line 6A) stays "even if someone + # else claimed you". + filer_is_dependent = tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + dependents = where( + filer_is_dependent, 0, tax_unit("tax_unit_dependents", period) + ) p = parameters(period).gov.states.la.tax.income.exemptions return dependents * p.dependent diff --git a/policyengine_us/variables/gov/states/md/tax/income/credits/ctc/md_ctc.py b/policyengine_us/variables/gov/states/md/tax/income/credits/ctc/md_ctc.py index 4fa63d7ab46..56591152927 100644 --- a/policyengine_us/variables/gov/states/md/tax/income/credits/ctc/md_ctc.py +++ b/policyengine_us/variables/gov/states/md/tax/income/credits/ctc/md_ctc.py @@ -18,7 +18,15 @@ class md_ctc(Variable): def formula_2020(tax_unit, period, parameters): p = parameters(period).gov.states.md.tax.income.credits.ctc person = tax_unit.members - dependent = person("is_tax_unit_dependent", period) + # § 10-751(a)(2)(i): a qualified child is "a dependent for purposes of + # § 152 of the Internal Revenue Code"; under IRC 152(b)(1) a return on + # which the filer (or, if joint, either spouse) can be claimed has + # none, unless the would-be claimant meets the filing exception + # (Publication 501, Dependent Taxpayer Test). + filer_is_dependent = person.tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + dependent = person("is_tax_unit_dependent", period) & ~filer_is_dependent disabled = person("is_disabled", period) age_limit = where(disabled, p.age_threshold.disabled, p.age_threshold.main) meets_age_limit = person("age", period) < age_limit diff --git a/policyengine_us/variables/gov/states/md/tax/income/credits/ctc/md_ctc_eligible.py b/policyengine_us/variables/gov/states/md/tax/income/credits/ctc/md_ctc_eligible.py index ed911d52e95..61309a347d8 100644 --- a/policyengine_us/variables/gov/states/md/tax/income/credits/ctc/md_ctc_eligible.py +++ b/policyengine_us/variables/gov/states/md/tax/income/credits/ctc/md_ctc_eligible.py @@ -18,7 +18,15 @@ def formula(tax_unit, period, parameters): # Check for qualifying children (used in both paths) person = tax_unit.members - dependent = person("is_tax_unit_dependent", period) + # § 10-751(a)(2)(i): a qualified child is "a dependent for purposes of + # § 152 of the Internal Revenue Code"; under IRC 152(b)(1) a return on + # which the filer (or, if joint, either spouse) can be claimed has + # none, unless the would-be claimant meets the filing exception + # (Publication 501, Dependent Taxpayer Test). + filer_is_dependent = person.tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + dependent = person("is_tax_unit_dependent", period) & ~filer_is_dependent disabled = person("is_disabled", period) age_limit = where(disabled, p.age_threshold.disabled, p.age_threshold.main) meets_age_limit = person("age", period) < age_limit diff --git a/policyengine_us/variables/gov/states/md/tax/income/credits/eitc/federal_eitc_without_age_minimum.py b/policyengine_us/variables/gov/states/md/tax/income/credits/eitc/federal_eitc_without_age_minimum.py index 3661cbc88dc..3a9b7a026a4 100644 --- a/policyengine_us/variables/gov/states/md/tax/income/credits/eitc/federal_eitc_without_age_minimum.py +++ b/policyengine_us/variables/gov/states/md/tax/income/credits/eitc/federal_eitc_without_age_minimum.py @@ -6,9 +6,13 @@ class federal_eitc_without_age_minimum(Variable): entity = TaxUnit label = "Federal EITC without age minimum" unit = USD - documentation = "The federal EITC with the minimum age condition ignored; the maximum age condition still applies." + documentation = "The federal EITC with the minimum age condition ignored; the maximum age condition and the bar on a childless filer who can be claimed as a dependent still apply." definition_period = YEAR - reference = "https://mgaleg.maryland.gov/mgawebsite/Laws/StatuteText?article=gtg§ion=10-704&enactments=false" + reference = ( + "https://mgaleg.maryland.gov/mgawebsite/Laws/StatuteText?article=gtg§ion=10-704&enactments=false", + "https://www.law.cornell.edu/uscode/text/26/32#c_1_A_ii", + "https://www.marylandcomptroller.gov/content/dam/mdcomp/tax/instructions/2025/resident-booklet.pdf#page=22", + ) defined_for = StateCode.MD def formula(tax_unit, period, parameters): @@ -24,7 +28,24 @@ def formula(tax_unit, period, parameters): max_age = parameters.gov.irs.credits.eitc.eligibility.age.max(period) is_filer_or_spouse = ~person("is_tax_unit_dependent", period) below_max_age = person("age", period) <= max_age - meets_max_age = has_child | tax_unit.any(below_max_age & is_filer_or_spouse) + # § 10-704(c)(3)(i) computes the credit of an individual without a + # qualifying child without "1. the minimum age requirement" or "2. + # the limitation under § 32(m)". This formula drops only the minimum + # age; filer_has_ssn below still applies § 32(m). The other § 32 + # rules stay, so a childless filer must still be "otherwise eligible + # for the federal credit": § 32(c)(1)(A)(ii)(III) bars a childless + # return on which the filer (or, if joint, either spouse) can be + # claimed as a dependent, unless the would-be claimant meets the + # filing exception (Publication 596). This reads the same helper as + # eitc_demographic_eligible. Unlike that formula from 2021, has_child + # counts only children with a valid identification number. + filer_is_dependent = tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + childless_eligible = ( + tax_unit.any(below_max_age & is_filer_or_spouse) & ~filer_is_dependent + ) + demographic_eligible = has_child | childless_eligible phased_in = tax_unit("eitc_phased_in", period) maximum = tax_unit("eitc_maximum", period) reduction = tax_unit("eitc_reduction", period) @@ -34,5 +55,5 @@ def formula(tax_unit, period, parameters): min_(phased_in, max_(0, maximum - reduction)) * investment_eligible * filer_has_ssn - * meets_max_age + * demographic_eligible ) diff --git a/policyengine_us/variables/gov/states/md/tax/income/credits/poverty_line/is_eligible_md_poverty_line_credit.py b/policyengine_us/variables/gov/states/md/tax/income/credits/poverty_line/is_eligible_md_poverty_line_credit.py index 1cadf64ba83..93ba91de328 100644 --- a/policyengine_us/variables/gov/states/md/tax/income/credits/poverty_line/is_eligible_md_poverty_line_credit.py +++ b/policyengine_us/variables/gov/states/md/tax/income/credits/poverty_line/is_eligible_md_poverty_line_credit.py @@ -12,6 +12,8 @@ class is_eligible_md_poverty_line_credit(Variable): "https://www.law.cornell.edu/uscode/text/26/32#c_2", "https://www.law.cornell.edu/cfr/text/26/1.32-2", "https://mgaleg.maryland.gov/mgawebsite/Laws/StatuteText?article=gtg§ion=10-107&enactments=false", + # PDF pages 12, 23: filing status 6 and the poverty level credit. + "https://www.marylandcomptroller.gov/content/dam/mdcomp/tax/instructions/2025/resident-booklet.pdf#page=12", ) defined_for = StateCode.MD @@ -27,7 +29,9 @@ def formula(tax_unit, period, parameters): "md_total_additions", ] agi_plus_md_additions = add(tax_unit, period, AGI_COMPONENTS) - fpg = tax_unit("tax_unit_fpg", period) + # (2) keys the applicable poverty income level to the exemptions the + # individual "is allowed and claims under § 10-211(b)(1)". + fpg = tax_unit("md_poverty_line_credit_income_level", period) agi_below_fpg = agi_plus_md_additions <= fpg # (ii) whose earned income as defined under § 32(c)(2) of the # Internal Revenue Code does not exceed the applicable poverty @@ -40,7 +44,16 @@ def formula(tax_unit, period, parameters): earnings_below_fpg = earnings <= fpg # (iii) who is not claimed as an exemption on another individual’s # tax return under § 10–211 of this title; - # SKIP - assumed throughout PolicyEngine-us. + # This takes an actual claim under § 10-211 on another Maryland + # return; being claimable is not enough. The instructions' filing + # status 6 chart also bars a claimable but unclaimed filer; the + # statute governs. Any filer's claim bars the return, since the + # eligible taxpayer is "an individual, or an individual and the + # individual's spouse if they file a joint income tax return". + person = tax_unit.members + filer = person("is_tax_unit_head_or_spouse", period) + md_claimed = person("md_claimed_as_exemption_on_another_return", period) + claimed_elsewhere = tax_unit.any(filer & md_claimed) # (iv) for whom the credit allowed under § 10–704(a)(1) of this # subtitle is less than the State income tax. # This appears to refer to the MD total EITC per @@ -50,4 +63,9 @@ def formula(tax_unit, period, parameters): md_eitc = tax_unit("md_married_or_has_child_non_refundable_eitc", period) md_income_tax_before_credits = tax_unit("md_income_tax_before_credits", period) eitc_less_than_income_tax = md_eitc < md_income_tax_before_credits - return agi_below_fpg & earnings_below_fpg & eitc_less_than_income_tax + return ( + agi_below_fpg + & earnings_below_fpg + & ~claimed_elsewhere + & eitc_less_than_income_tax + ) diff --git a/policyengine_us/variables/gov/states/md/tax/income/credits/poverty_line/md_claimed_as_exemption_on_another_return.py b/policyengine_us/variables/gov/states/md/tax/income/credits/poverty_line/md_claimed_as_exemption_on_another_return.py new file mode 100644 index 00000000000..29d52f4f63b --- /dev/null +++ b/policyengine_us/variables/gov/states/md/tax/income/credits/poverty_line/md_claimed_as_exemption_on_another_return.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class md_claimed_as_exemption_on_another_return(Variable): + value_type = bool + entity = Person + label = "Claimed as an exemption on another Maryland return" + documentation = ( + "Whether another individual actually claims this person as an " + "exemption on a Maryland return under Tax-General 10-211. Being " + "claimable is not enough. Defaults to an actual claim on another " + "federal return, since a Maryland claimant takes an exemption for " + "each IRC 152 dependent; set it to false when the claimant files no " + "Maryland return." + ) + definition_period = YEAR + defined_for = StateCode.MD + reference = ( + "https://mgaleg.maryland.gov/mgawebsite/Laws/StatuteText?article=gtg§ion=10-709&enactments=false", + "https://mgaleg.maryland.gov/mgawebsite/Laws/StatuteText?article=gtg§ion=10-211&enactments=false", + ) + + def formula(person, period, parameters): + return person("claimed_as_dependent_on_another_return", period) diff --git a/policyengine_us/variables/gov/states/md/tax/income/credits/poverty_line/md_poverty_line_credit_income_level.py b/policyengine_us/variables/gov/states/md/tax/income/credits/poverty_line/md_poverty_line_credit_income_level.py new file mode 100644 index 00000000000..0589f862bed --- /dev/null +++ b/policyengine_us/variables/gov/states/md/tax/income/credits/poverty_line/md_poverty_line_credit_income_level.py @@ -0,0 +1,33 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.hhs.tax_unit_fpg import fpg + + +class md_poverty_line_credit_income_level(Variable): + value_type = float + entity = TaxUnit + label = "Maryland poverty line credit applicable poverty income level" + unit = USD + definition_period = YEAR + defined_for = StateCode.MD + reference = ( + "https://mgaleg.maryland.gov/mgawebsite/Laws/StatuteText?article=gtg§ion=10-709&enactments=false", + "https://mgaleg.maryland.gov/mgawebsite/Laws/StatuteText?article=gtg§ion=10-211&enactments=false", + "https://www.marylandcomptroller.gov/content/dam/mdcomp/tax/instructions/2025/resident-booklet.pdf#page=23", + ) + + def formula(tax_unit, period, parameters): + # § 10-709(a)(2): the poverty income standard "that corresponds to the + # number of exemptions which the individual is allowed and claims + # under § 10-211(b)(1)". That is the tax unit's size unless a filer + # can be claimed as a dependent. Then each filer still counts, under + # § 10-211(a)(1), but dependents count only under the claimant filing + # exception (IRC 152(b)(1)). Every filer has an exemption, so the + # count is at least one. + filer_is_dependent = tax_unit("head_or_spouse_is_dependent_elsewhere", period) + exemptions = tax_unit("md_personal_exemptions_count", period) + state_group = tax_unit.household("state_group_str", period) + return where( + filer_is_dependent, + fpg(exemptions, state_group, period, parameters), + tax_unit("tax_unit_fpg", period), + ) diff --git a/policyengine_us/variables/gov/states/md/tax/income/exemptions/md_aged_dependent_exemption.py b/policyengine_us/variables/gov/states/md/tax/income/exemptions/md_aged_dependent_exemption.py index 84fa556f5f6..1141cc60539 100644 --- a/policyengine_us/variables/gov/states/md/tax/income/exemptions/md_aged_dependent_exemption.py +++ b/policyengine_us/variables/gov/states/md/tax/income/exemptions/md_aged_dependent_exemption.py @@ -7,7 +7,12 @@ class md_aged_dependent_exemption(Variable): label = "MD aged dependent exemption" unit = USD definition_period = YEAR - reference = "https://govt.westlaw.com/mdc/Document/NF59A76006EA511E8ABBEE50DE853DFF4?viewType=FullText&originationContext=documenttoc&transitionType=CategoryPageItem&contextData=(sc.Default)" + reference = ( + "https://govt.westlaw.com/mdc/Document/NF59A76006EA511E8ABBEE50DE853DFF4?viewType=FullText&originationContext=documenttoc&transitionType=CategoryPageItem&contextData=(sc.Default)", + "https://mgaleg.maryland.gov/mgawebsite/Laws/StatuteText?article=gtg§ion=10-211&enactments=false", + # Exemption amount chart (10A). + "https://www.marylandcomptroller.gov/content/dam/mdcomp/tax/instructions/2025/resident-booklet.pdf#page=12", + ) defined_for = StateCode.MD def formula(tax_unit, period, parameters): @@ -17,5 +22,19 @@ def formula(tax_unit, period, parameters): dependent = person("is_tax_unit_dependent", period) age = person("age", period) elderly = age >= p.age - aged_dependents = tax_unit.sum(dependent & elderly) - return aged_dependents * p.aged_dependent + # § 10-211(b)(2) counts dependents "as defined in § 152 of the Internal + # Revenue Code"; under IRC 152(b)(1) a return on which the filer (or, + # if joint, either spouse) can be claimed has none, unless the would-be + # claimant meets the filing exception (Publication 501). + filer_is_dependent = tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + aged_dependents = where( + filer_is_dependent, 0, tax_unit.sum(dependent & elderly) + ) + # § 10-211(c) limits "the amount allowed for each exemption under + # subsection (b)(1) or (2)" by federal AGI, the same limit as the + # personal exemption; the chart's "reduction applies to the additional + # dependency exemptions as well". + per_exemption = tax_unit("md_personal_exemption", period) + return aged_dependents * min_(p.aged_dependent, per_exemption) diff --git a/policyengine_us/variables/gov/states/md/tax/income/exemptions/md_personal_exemptions_count.py b/policyengine_us/variables/gov/states/md/tax/income/exemptions/md_personal_exemptions_count.py new file mode 100644 index 00000000000..8dcc75fb854 --- /dev/null +++ b/policyengine_us/variables/gov/states/md/tax/income/exemptions/md_personal_exemptions_count.py @@ -0,0 +1,46 @@ +from policyengine_us.model_api import * + + +class md_personal_exemptions_count(Variable): + value_type = int + entity = TaxUnit + label = "Maryland personal exemptions count" + documentation = ( + "Number of exemptions under Md. Code, Tax-General 10-211(a) and " + "(b)(1): one for each filer, including a filer who can be claimed as " + "a dependent on another return, plus one for each dependent unless a " + "filer can be claimed (outside the claimant filing exception)." + ) + definition_period = YEAR + defined_for = StateCode.MD + reference = ( + "https://mgaleg.maryland.gov/mgawebsite/Laws/StatuteText?article=gtg§ion=10-211&enactments=false", + # PDF pages 1-2: 2018 ch. 575 adds subsection (a) and strikes the + # § 151 reference from (b)(1). + "https://mgaleg.maryland.gov/2018RS/chapters_noln/Ch_575_sb0184E.pdf#page=1", + # PDF pages 12-13: filing status 6 and Instruction 8. + "https://www.marylandcomptroller.gov/content/dam/mdcomp/tax/instructions/2025/resident-booklet.pdf#page=12", + "https://www.irs.gov/pub/irs-prior/p501--2025.pdf#page=11", + ) + + def formula(tax_unit, period, parameters): + # § 10-211(a)(1) allows an exemption for "the taxpayer" with no + # dependency condition; the section imposes one only on a spouse + # claimed on a separate return, in (a)(2)(ii). Since 2018 ch. 575, + # (b)(1) allows $3,200 for each exemption under (a), no longer for + # each exemption deductible under IRC § 151, so the federal denial + # for a dependent (§ 151(d)(2)) no longer reaches Maryland. Each + # filer keeps their own exemption, also on a separate Maryland + # return. The 2025 booklet's filing status 6 gives a claimable filer + # none; the model follows the statute. + # § 10-211(a)(3) adds each dependent "as defined in § 152 of the + # Internal Revenue Code". Under IRC 152(b)(1) a return on which the + # filer (or, if joint, either spouse) can be claimed has none, unless + # the would-be claimant meets the filing exception (Publication 501, + # Dependent Taxpayer Test). On separate Maryland returns the spouses + # split "the overall number of dependents" of the federal return. + no_dependents = tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + dependents = tax_unit("tax_unit_dependents", period) + return tax_unit("tax_unit_size", period) - where(no_dependents, dependents, 0) diff --git a/policyengine_us/variables/gov/states/md/tax/income/exemptions/md_total_personal_exemptions.py b/policyengine_us/variables/gov/states/md/tax/income/exemptions/md_total_personal_exemptions.py index 8b3df55927b..e2cbb8214f7 100644 --- a/policyengine_us/variables/gov/states/md/tax/income/exemptions/md_total_personal_exemptions.py +++ b/policyengine_us/variables/gov/states/md/tax/income/exemptions/md_total_personal_exemptions.py @@ -8,9 +8,11 @@ class md_total_personal_exemptions(Variable): unit = USD definition_period = YEAR defined_for = StateCode.MD + reference = "https://mgaleg.maryland.gov/mgawebsite/Laws/StatuteText?article=gtg§ion=10-211&enactments=false" def formula(tax_unit, period, parameters): - # Get md_personal_exemption from tax_unit multiplied by tax_unit_size + # § 10-211(b)(1): the per-exemption amount for each exemption allowed + # under § 10-211(a). md_personal_exemption = tax_unit("md_personal_exemption", period) - tax_unit_size = tax_unit("tax_unit_size", period) - return md_personal_exemption * tax_unit_size + exemptions = tax_unit("md_personal_exemptions_count", period) + return md_personal_exemption * exemptions diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index 6427e4fd8e9..fc02269bb88 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -3192,8 +3192,7 @@ candidates: - id: us-ia:alternate-tax-claimed-spouse program: income-tax years: - from: 2024 - to: 2024 + from: 2021 type: tax question: Does the statutory dependent exclusion bar alternate tax on a joint return with a claimed spouse, or does the worksheet's omission permit it? @@ -3210,13 +3209,16 @@ candidates: example: A joint return with one claimed spouse, modified income $20,000 and ordinary tax $500 pays $500 versus min($500, ($20,000 − $13,500) × 5.7%) = $370.50. pe_us: - follows: conflicting-source - code: [] + follows: statute + code: + - policyengine_us/variables/gov/states/ia/tax/income/ia_alternate_tax_eligible.py + - policyengine_us/variables/gov/states/ia/tax/income/ia_claimed_filer_income_disqualified.py prs: - https://github.com/PolicyEngine/policyengine-us/pull/10045 state: ruled - note: Ruled statute-first in October 2026; the rule requires a model change after confirming that the exclusion - reaches alternate tax. + note: Ruled statute-first in October 2026. The bar sits in 422.5(3) and (3B) for 2021-2022 and in 422.5(2) and + (3) from 2023; ia_alternate_tax_eligible applies it in every year through ia_claimed_filer_income_disqualified, + which reads an actual claim and the claiming person's net income. The worksheet was read for 2024 only. - id: us-ia:itemized-limitation-2018-federal-suspension program: income-tax years: @@ -3321,13 +3323,18 @@ candidates: example: In 2022, a claimed single filer with $6,000 net income and a claimant with $8,000 income is exempt, with tax $0, versus not exempt. pe_us: - follows: conflicting-source - code: [] + follows: statute + code: + - policyengine_us/variables/gov/states/ia/tax/income/ia_is_tax_exempt.py + - policyengine_us/variables/gov/states/ia/tax/income/ia_reduced_tax.py + - policyengine_us/variables/gov/states/ia/tax/income/ia_claimed_filer_income_disqualified.py prs: - https://github.com/PolicyEngine/policyengine-us/pull/10045 state: ruled - note: 'Ruled statute-first in October 2026; the rule requires replacing the approximation using claimant inputs, - with annual verification because the supplied statutory URL is for 2026. Code not yet on main: ia_is_tax_exempt.' + note: Ruled statute-first in October 2026; verify each year's text, because the supplied statutory URL is for + 2026. ia_is_tax_exempt, and ia_reduced_tax for the single-filer tax reduction, apply the subsection's test + through ia_claimed_filer_income_disqualified, which reads an actual claim and the claiming person's net income + and filing status (inputs that default to no disqualification), with no Iowa-return restriction. - id: us-ia:rcf-maximum-per-diem-rate program: ssi-state-supplement years: @@ -3941,15 +3948,59 @@ candidates: example: A 2023 joint return with one claimed spouse receives $2,250 versus $0; a claimable but unclaimed single filer receives $0 versus $2,250. pe_us: - follows: unknown + follows: statute code: - policyengine_us/variables/gov/states/ks/tax/income/exemptions/ks_count_exemptions.py + - policyengine_us/reforms/state_dependent_exemptions/repeal_state_dependent_exemptions.py prs: - https://github.com/PolicyEngine/policyengine-us/pull/10045 state: ruled - note: 'Current behaviour unresolved: at this head ks_count_exemptions returns adults plus dependents and ks_exemptions - adds no dependency gate, so a joint return with one claimed spouse keeps two exemptions; check against the statute - and the K-40 rule before classifying.' + note: Ruled statute-first in October 2026. ks_count_exemptions counts each filer whom no other taxpayer may claim + (IRC 151(d)(2)), plus dependents only outside a claimable filer (IRC 152(b)(1), with the claimant filing + exception); the state dependent exemption repeal counts the same filers. The head-of-household count is a + separate item, us-ks:2021-2023-head-of-household-exemption. +- id: us-ks:2021-2023-head-of-household-exemption + program: income-tax + years: + from: 2021 + to: 2023 + type: tax + question: From 2021 to 2023, does a Kansas head of household get an extra $2,250 exemption, as the K-40 + instructions say, although K.S.A. 79-32,121 gave that allowance only for tax year 1998 and 2022 law removed + it? + sources: + - kind: statute + citation: K.S.A. 79-32,121 (2021 edition) + url: https://kslegislature.gov/li_2022/b2021_22/statute/079_000_0000_chapter/079_032_0000_article/079_032_0121_section/079_032_0121_k/ + - kind: statute + citation: 2022 HB 2239 § 40 (L. 2022, ch. 63, § 40); K.S.A. 79-32,121 (2023 edition) + url: https://www.kslegislature.gov/li_2022/b2021_22/measures/documents/hb2239_enrolled.pdf#page=38 + - kind: instructions + citation: K-40 instructions 2021-2023, p.6 + url: https://www.ksrevenue.gov/pdf/ip22.pdf#page=6 + - kind: form + citation: 2022 Form K-40, Exemptions and Dependents, instructions booklet p.17 + url: https://www.ksrevenue.gov/pdf/ip22.pdf#page=17 + readings: + statute: A head of household has one exemption for each federal exemption only; the extra $2,250 applied to + tax year 1998 alone, and the 2022 amendment deleted the sentence. + other: '"If your filing status is Head of Household, you are allowed an additional Kansas exemption; enter a + "1" in the box provided."' + example: A 2022 head of household with one child has 2 exemptions, $4,500, under the statute versus 3, $6,750, + under the instructions. + pe_us: + follows: statute + code: + - policyengine_us/variables/gov/states/ks/tax/income/exemptions/ks_count_exemptions.py + - policyengine_us/reforms/state_dependent_exemptions/repeal_state_dependent_exemptions.py + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10045 + state: ruled + note: Ruled statute-first in November 2026. + The 2021 edition allows the head-of-household exemption "for tax year 1998"; the 2023 edition has no such + sentence and cites L. 2022, ch. 63, § 40. The 2021, 2022 and 2023 instructions repeat the p.6 text, and the Form + K-40 in each booklet adds one exemption for a head of household (2021 p.17, 2023 p.19). The 2026-10-19 rule + follows the statute; main gave a head of household two filer exemptions. - id: us-ks:dependent-exemption-of-a-claimed-filer program: income-tax years: @@ -4001,13 +4052,16 @@ candidates: example: Before the liability cap, a 2024 joint return with one claimable spouse and no dependents receives $125 versus $250; a claimable single filer receives $0 versus $125. pe_us: - follows: conflicting-source - code: [] + follows: statute + code: + - policyengine_us/variables/gov/states/ks/tax/income/credits/ks_fstc.py prs: - https://github.com/PolicyEngine/policyengine-us/pull/10045 state: ruled - note: 'Ruled statute-first in October 2026; the rule requires replacing the Line E count with the statutory federal - count, subject to annual-source verification. Code not yet on main: ks_fstc.' + note: Ruled statute-first in October 2026; verify each year's instructions. ks_fstc gives $125 for each filer whom + no other taxpayer may claim (IRC 151(d)(2)) and each dependent child under 18, counting children only outside + a claimable filer (IRC 152(b)(1), with the claimant filing exception); the same child count opens the child + route. - id: us-ks:medicaid-parent-dependent-child-age program: medicaid years: @@ -4438,12 +4492,18 @@ candidates: example: The 2023 case gives $175 × 200% = $350 under the statute and $0 under the instructions. pe_us: follows: statute - code: [] + code: + - policyengine_us/variables/gov/states/la/tax/income/credits/school_readiness/la_school_readiness_tax_credit.py + - policyengine_us/variables/gov/states/la/tax/income/credits/school_readiness/la_school_readiness_credit_eligible_child.py + - policyengine_us/variables/gov/states/la/tax/income/credits/cdcc/la_refundable_cdcc.py prs: - https://github.com/PolicyEngine/policyengine-us/pull/10045 state: ruled - note: 'Ruled statute-first in October 2026; verify annual instructions because the supplied opposing instruction - is from 2023. Code not yet on main: la_refundable_cdcc.' + note: Ruled statute-first in October 2026; verify annual instructions because the supplied opposing instruction + is from 2023. The code on main already follows the statute. la_school_readiness_tax_credit multiplies + Louisiana's care credits, and la_refundable_cdcc matches the federal cdcc_potential, whose IRC 21(b)(1)(B) + route keeps an incapable child; the eligible-child test adds no qualified-dependent gate. No YAML case yet + pins the school readiness amount for this case. - id: us-la:snap-child-support-exclusion program: snap years: @@ -4733,8 +4793,7 @@ candidates: - id: us-md:dependent-exemption-chart-10a program: income-tax years: - from: 2025 - to: 2025 + from: 2021 type: tax question: Does a claimable filer retain an eligible dependent's exemption under the claimant filing exception, or does Chart 10A deny every exemption? @@ -4746,18 +4805,60 @@ candidates: citation: 2025 Maryland resident booklet, Chart 10A, p.12 url: https://www.marylandcomptroller.gov/content/dam/mdcomp/tax/instructions/2025/resident-booklet.pdf#page=12 readings: - statute: An actual IRC 152 dependent retains an exemption under the filing exception although the filer's own - exemption is denied. + statute: An actual IRC 152 dependent retains an exemption under the filing exception. other: The dependent-taxpayer Each Exemption column makes all exemptions $0. - example: The 2025 case with one eligible child gives 1 × $3,200 = $3,200 versus $0. + example: A 2025 single filer who can be claimed, whose claimant meets the filing exception, with one eligible + child has $3,200 for the child under the statute versus $0 under the chart. pe_us: follows: statute - code: [] + code: + - policyengine_us/variables/gov/states/md/tax/income/exemptions/md_personal_exemptions_count.py + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10045 + state: ruled + note: Ruled statute-first in October 2026. The filer's own exemption is a separate item, + us-md:dependent-taxpayer-own-exemption; with it the example return has 2 × $3,200 = $6,400. The code applies + the statute in every year; the booklet was read for 2025 only. +- id: us-md:dependent-taxpayer-own-exemption + program: income-tax + years: + from: 2021 + type: tax + question: Does a filer who can be claimed as a dependent on another return (filing status 6) get a Maryland + exemption for themself under Tax-General 10-211(a)(1), or none, as the resident booklet says? + sources: + - kind: statute + citation: Md. Code, Tax-General 10-211(a)(1), (b)(1) + url: https://mgaleg.maryland.gov/mgawebsite/Laws/StatuteText?article=gtg§ion=10-211&enactments=false + - kind: statute + citation: 2018 Md. Laws ch. 575 (SB 184), § 1, PDF pp.1-2 + url: https://mgaleg.maryland.gov/2018RS/chapters_noln/Ch_575_sb0184E.pdf#page=1 + - kind: instructions + citation: 2025 Maryland resident booklet, filing status 6 and Chart 10A, p.12 + url: https://www.marylandcomptroller.gov/content/dam/mdcomp/tax/instructions/2025/resident-booklet.pdf#page=12 + readings: + statute: Each filer has an exemption for "the taxpayer" under (a)(1), which has no dependency condition; (b)(1) + allows $3,200 "for each exemption that the individual may deduct under subsection (a)". + other: '"You do not get an exemption for yourself. Put a zero in Exemption Box A."' + example: A 2025 single filer who can be claimed but is not claimed on a Maryland return, with $10,000 of earned + income, $600 of State tax and no EITC, has one exemption ($3,200) and the one-person poverty level of $15,650, + so a $500 poverty line credit, versus no exemption and no credit. A joint return with one claimable spouse has + 2 × $3,200 = $6,400 versus $3,200. + pe_us: + follows: statute + code: + - policyengine_us/variables/gov/states/md/tax/income/exemptions/md_personal_exemptions_count.py + - policyengine_us/variables/gov/states/md/tax/income/credits/poverty_line/md_poverty_line_credit_income_level.py prs: - https://github.com/PolicyEngine/policyengine-us/pull/10045 state: ruled - note: 'Ruled statute-first in October 2026; verify whether the chart''s zero column applies to dependent exemptions - or only the filer''s own exemption. Code not yet on main: md_personal_exemptions_count.' + note: Ruled statute-first in November 2026. + Before 2018, (b)(1) allowed $3,200 "for each exemption that the individual may deduct in the taxable year to + determine federal taxable income under § 151", which brought in IRC 151(d)(2)'s denial for a dependent. Ch. + 575 struck that text, added the (a)(1)-(3) list and applies to tax years after December 31, 2017. The only + dependency condition in the section is (a)(2)(ii)'s, for a spouse on a separate return. COMAR 03.04.02.02B + assigns the dependent taxpayer filing status and says nothing about the exemption. Main counted the filer, as + the statute does. The booklet was read for 2025 only. - id: us-md:meap-garrett-oil-level-four program: liheap years: @@ -5013,8 +5114,7 @@ candidates: - id: us-md:poverty-credit-claimed-vs-claimable program: income-tax years: - from: 2025 - to: 2025 + from: 2021 type: tax question: Does the poverty line credit exclude only actually claimed dependents, or all claimable filers through the booklet's filing-status-6 rule? @@ -5028,21 +5128,24 @@ candidates: readings: statute: A claimable but unclaimed filer passes the exclusion. other: Filing status 6 excludes a claimable filer without an actual claim. - example: With $10,000 earned income, a claimable but unclaimed filer passes the statutory exclusion for an uncapped - $500 versus $0 under the instructions. + example: A 2025 claimable single filer whom no one claims on a Maryland return, with $10,000 of earned income, + $600 of State tax and no EITC, has the one-person $15,650 level and a $500 credit under the statute versus $0 + under the instructions. pe_us: - follows: conflicting-source - code: [] + follows: statute + code: + - policyengine_us/variables/gov/states/md/tax/income/credits/poverty_line/is_eligible_md_poverty_line_credit.py + - policyengine_us/variables/gov/states/md/tax/income/credits/poverty_line/md_claimed_as_exemption_on_another_return.py prs: - https://github.com/PolicyEngine/policyengine-us/pull/10045 state: ruled - note: 'Ruled statute-first in October 2026; the rule requires replacing claimability with the statutory actual-claim - exclusion. Code not yet on main: is_eligible_md_poverty_line_credit.' + note: Ruled statute-first in October 2026. The code applies the statute in every year. The claim on another + Maryland return is an input that defaults to the federal claim (claimed_as_dependent_on_another_return); set + it to false when the claimant files no Maryland return. The booklet was read for 2025 only. - id: us-md:poverty-threshold-exemption-count program: income-tax years: - from: 2025 - to: 2025 + from: 2021 type: tax question: Does the poverty line credit threshold use allowed-and-claimed exemptions or the worksheet's federal-return person count? @@ -5056,16 +5159,21 @@ candidates: readings: statute: Use the exemptions the filer is allowed and claims. other: Use the number of persons on the federal return. - example: The 2025 case uses one exemption and $15,650 under the statute versus two persons and $21,150 under the - worksheet. + example: A married filer who can be claimed and files a separate Maryland return, as filing status 6 requires, + has one exemption and a $15,650 level under the statute versus two persons on the joint federal return and + $21,150 under the worksheet. pe_us: follows: statute - code: [] + code: + - policyengine_us/variables/gov/states/md/tax/income/credits/poverty_line/md_poverty_line_credit_income_level.py + - policyengine_us/variables/gov/states/md/tax/income/exemptions/md_personal_exemptions_count.py prs: - https://github.com/PolicyEngine/policyengine-us/pull/10045 state: ruled - note: 'Ruled statute-first in October 2026; verify the worksheet''s person count against allowed-and-claimed exemptions. - Code not yet on main: md_poverty_line_credit_income_level.' + note: Ruled statute-first in October 2026. Since every filer keeps an exemption + (us-md:dependent-taxpayer-own-exemption), the statutory count equals the federal return's person count for every + unit the model builds; a joint return with one claimable spouse gets two and $21,150 either way. The readings + part only on separate Maryland returns, which the model does not compute. The booklet was read for 2025 only. - id: us-md:premium-assistance-200-fpl-endpoint program: premium-assistance years: