diff --git a/changelog.d/claimable-filer-co-ct-il-in.fixed.md b/changelog.d/claimable-filer-co-ct-il-in.fixed.md new file mode 100644 index 00000000000..80d95a252f6 --- /dev/null +++ b/changelog.d/claimable-filer-co-ct-il-in.fixed.md @@ -0,0 +1 @@ +Apply Colorado, Connecticut, Illinois and Indiana rules for a filer who can be claimed as a dependent: no dependent-based credits, exemptions or deductions on such a return, and no childless EITC through the state ITIN and age extensions. diff --git a/policyengine_us/reforms/states/il/dependent_exemption/il_dependent_exemption_reform.py b/policyengine_us/reforms/states/il/dependent_exemption/il_dependent_exemption_reform.py index 9b2ee01bfe6..2facb1eb9f1 100644 --- a/policyengine_us/reforms/states/il/dependent_exemption/il_dependent_exemption_reform.py +++ b/policyengine_us/reforms/states/il/dependent_exemption/il_dependent_exemption_reform.py @@ -14,7 +14,13 @@ class il_dependent_exemption(Variable): def formula(tax_unit, period, parameters): p = parameters(period).gov.contrib.states.il.dependent_exemption 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)), as in + # the baseline formula. + filer_is_dependent = person.tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + is_dependent = person("is_tax_unit_dependent", period) & ~filer_is_dependent # Age gate: when in effect, restrict the exemption to dependents # under the chosen age; otherwise every dependent qualifies, # matching the baseline tax_unit_dependents count. diff --git a/policyengine_us/reforms/states/in/dependent_exemption/in_dependent_exemption_reform.py b/policyengine_us/reforms/states/in/dependent_exemption/in_dependent_exemption_reform.py index d0443121227..d147d578605 100644 --- a/policyengine_us/reforms/states/in/dependent_exemption/in_dependent_exemption_reform.py +++ b/policyengine_us/reforms/states/in/dependent_exemption/in_dependent_exemption_reform.py @@ -15,7 +15,13 @@ def formula(tax_unit, period, parameters): person = tax_unit.members age = person("age", period) - is_dependent = person("is_tax_unit_dependent", period) + # A return on which the filer (or, if joint, either spouse) can be + # claimed as a dependent has no dependents (IRC 152(b)(1)), as in + # the baseline formula. + filer_is_dependent = person.tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + is_dependent = person("is_tax_unit_dependent", period) & ~filer_is_dependent # Apply age limit if in effect if p.age_limit.in_effect: @@ -49,7 +55,12 @@ class in_older_dependents_count(Variable): def formula(tax_unit, period, parameters): person = tax_unit.members - is_dependent = person("is_tax_unit_dependent", period) + # Dependents barred by a claimable filer are not moved into the + # personal portion either. + filer_is_dependent = person.tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + is_dependent = person("is_tax_unit_dependent", period) & ~filer_is_dependent total_dependents = tax_unit.sum(is_dependent) eligible_dependent_exemptions = tax_unit( "in_eligible_dependents_count", period diff --git a/policyengine_us/tests/core/test_claimable_filer_co_ct_il_in_invariants.py b/policyengine_us/tests/core/test_claimable_filer_co_ct_il_in_invariants.py new file mode 100644 index 00000000000..3a3c7a9c6bf --- /dev/null +++ b/policyengine_us/tests/core/test_claimable_filer_co_ct_il_in_invariants.py @@ -0,0 +1,114 @@ +"""Colorado, Connecticut, Illinois and Indiana rules for a filer who can be +claimed as a dependent. + +A return on which the filer, or on a joint return either spouse, can be claimed +as a dependent has no dependents (IRC 152(b)(1)), so it gets no state +dependent exemption or child-based deduction and no Colorado child credit, and +a childless filer who can be claimed gets no state EITC through the ITIN or age +extensions (IRC 32(c)(1)(A)(ii)(III)). Indiana keeps each filer's own $1,000 +exemption; Illinois' child tax credit follows the IRC 152 qualifying child. + +For couples drawn by Hypothesis and a seeded population in these states, with +either, both or neither spouse claimed: + +1. Swap invariance: each output is the same under either head/spouse + labelling. +2. Monotonicity: marking another filer as claimed never raises the outputs in + MONOTONE (amounts not capped by a tax liability that the claim can raise). +3. Identities: a return with a claimable filer has no Illinois dependent + exemption, Colorado child tax credit or Indiana additional exemption, and + its Indiana base exemptions are $1,000 per filer. + +Hypothesis batches check 1 and 3; the seeded population checks 1, 2 and 3. +""" + +import numpy as np +import pytest +from hypothesis import HealthCheck, given, settings +from hypothesis import strategies as st + +from policyengine_us.tests.core.test_claimable_filer_federal_invariants import ( + check_monotone, + check_swap, +) +from policyengine_us.tests.core.test_dependent_elsewhere_head_spouse_swap_invariance import ( + CLAIM_PATTERNS, + _calc, + _crafted_cases, + _seeded_couples, + adults, + dependents, +) + +STATES = ["CO", "CT", "IL", "IN"] +YEARS = [2021, 2023, 2025, 2026] +MONOTONE = [ + "co_eitc", + "co_ctc", + "co_low_income_cdcc", + "ct_property_tax_credit_eligible", + "ct_child_tax_rebate", + "il_dependent_exemption", + "il_eitc", + "il_ctc", + "il_income_tax_rebate", + "il_income_tax_rebate_eligible", + "in_base_exemptions", + "in_additional_exemptions", + "in_adoption_exemption", +] +OUTPUTS = MONOTONE + ["co_refundable_credits"] + + +@st.composite +def couples(draw): + return { + "state": draw(st.sampled_from(STATES)), + "adults": [draw(adults()), draw(adults())], + "dependents": draw(st.lists(dependents(), max_size=2)), + "claimed": draw(st.sampled_from(CLAIM_PATTERNS)), + } + + +def _identities(units): + states = np.array([unit["state"] for unit in units]) + + def check(sim, year): + claimed_filer = _calc(sim, "head_or_spouse_is_dependent_elsewhere", year) > 0 + # Each unit is simulated as consecutive copies (labellings or claim + # patterns), in the order of the units. + state = np.repeat(states, len(claimed_filer) // len(units)) + for name in ( + "il_dependent_exemption", + "co_ctc", + "in_additional_exemptions", + ): + assert not _calc(sim, name, year)[claimed_filer].any(), ( + f"{name} in {year} is positive on a return with a claimable filer" + ) + filers = _calc(sim, "tax_unit_size", year) - _calc( + sim, "tax_unit_dependents", year + ) + base = _calc(sim, "in_base_exemptions", year) + mask = claimed_filer & (state == "IN") + np.testing.assert_array_equal(base[mask], 1_000 * filers[mask]) + + return check + + +@settings( + max_examples=2, + deadline=None, + derandomize=True, + suppress_health_check=[HealthCheck.too_slow, HealthCheck.data_too_large], +) +@given(st.sampled_from(YEARS), st.lists(couples(), min_size=6, max_size=12)) +def test_co_ct_il_in_claimable_filer_rules_are_label_free(year, units): + check_swap(units, year, OUTPUTS, _identities(units)) + + +@pytest.mark.parametrize("year", YEARS) +def test_co_ct_il_in_claimable_filer_rules_seeded_population(year): + units = _seeded_couples(STATES, per_state=3) + _crafted_cases(STATES) + check_swap(units, year, OUTPUTS, _identities(units)) + check_monotone(units, year, MONOTONE, _identities(units)) diff --git a/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/co_cdcc.yaml b/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/co_cdcc.yaml index be550a08624..c13776db9b1 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/co_cdcc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/co_cdcc.yaml @@ -173,3 +173,146 @@ state_code: CO output: co_cdcc: 0 + + +- name: 2025 single filer who can be claimed as a dependent, no Colorado child care credit for a child under 13 + period: 2025 + input: + people: + filer: + age: 30 + employment_income: 50_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + child: + age: 2 + tax_units: + tax_unit: + members: [filer, child] + tax_unit_childcare_expenses: 1_000 + households: + household: + members: [filer, child] + state_code: CO + output: + # Already zero through the federal child care credit, which no + # longer counts a child under 13 on such a return. + co_cdcc: 0 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, no Colorado child care credit for a child under 13 (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 30 + employment_income: 25_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 30 + employment_income: 25_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 2 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + tax_unit_childcare_expenses: 1_000 + households: + household: + members: [person_a, person_b, child] + state_code: CO + output: + co_cdcc: 0 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, no Colorado child care credit for a child under 13 (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 30 + employment_income: 25_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 30 + employment_income: 25_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 2 + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + tax_unit_childcare_expenses: 1_000 + households: + household: + members: [person_b, person_a, child] + state_code: CO + output: + co_cdcc: 0 + +- name: 2025 joint return with both spouses claimable as dependents, no Colorado child care credit for a child under 13 + period: 2025 + input: + people: + person_a: + age: 30 + employment_income: 25_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 30 + employment_income: 25_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 2 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + tax_unit_childcare_expenses: 1_000 + households: + household: + members: [person_a, person_b, child] + state_code: CO + output: + co_cdcc: 0 + +- name: 2025 joint return with neither spouse claimable, no Colorado child care credit for a child under 13 + period: 2025 + input: + people: + person_a: + age: 30 + employment_income: 25_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 25_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 2 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + tax_unit_childcare_expenses: 1_000 + households: + household: + members: [person_a, person_b, child] + state_code: CO + output: + # Federal 20% x 1,000 = 200; Colorado 50% match = 100. + co_cdcc: 100 diff --git a/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc.yaml b/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc.yaml index 39d720d75f6..c2ba33c9285 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc.yaml @@ -219,3 +219,205 @@ members: [head, spouse, child_1] output: co_low_income_cdcc: 0 + + +- name: 2025 single filer who can be claimed as a dependent, no Colorado low-income child care credit + period: 2025 + input: + people: + filer: + age: 25 + employment_income: 10_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + child: + age: 3 + tax_units: + tax_unit: + members: [filer, child] + tax_unit_childcare_expenses: 1_000 + households: + household: + members: [filer, child] + state_code: CO + output: + # Only the federal liability condition is waived; the child must + # still be the taxpayer's dependent under 13 (IRC 152(b)(1)). + co_low_income_cdcc: 0 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, no Colorado low-income child care credit (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 25 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 25 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 3 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + tax_unit_childcare_expenses: 1_000 + households: + household: + members: [person_a, person_b, child] + state_code: CO + output: + co_low_income_cdcc: 0 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, no Colorado low-income child care credit (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 25 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 25 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 3 + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + tax_unit_childcare_expenses: 1_000 + households: + household: + members: [person_b, person_a, child] + state_code: CO + output: + co_low_income_cdcc: 0 + +- name: 2025 joint return with both spouses claimable as dependents, no Colorado low-income child care credit + period: 2025 + input: + people: + person_a: + age: 25 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 25 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 3 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + tax_unit_childcare_expenses: 1_000 + households: + household: + members: [person_a, person_b, child] + state_code: CO + output: + co_low_income_cdcc: 0 + +- name: 2025 joint return with neither spouse claimable, no Colorado low-income child care credit + period: 2025 + input: + people: + person_a: + age: 25 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 25 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 3 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + tax_unit_childcare_expenses: 1_000 + households: + household: + members: [person_a, person_b, child] + state_code: CO + output: + # No federal liability at AGI 10,000: + # min(0.25 x min(1,000, 5,000), 500) = 250. + co_low_income_cdcc: 250 + +- name: 2025 two returns in one household, only the return whose filer can be claimed loses the low-income child care credit + period: 2025 + input: + people: + parent_claimed: + age: 20 + employment_income: 5_000 + claimed_as_dependent_on_another_return: true + child_a: + age: 3 + parent: + age: 30 + employment_income: 5_000 + child_b: + age: 3 + tax_units: + claimed_return: + members: [parent_claimed, child_a] + tax_unit_childcare_expenses: 1_000 + other_return: + members: [parent, child_b] + tax_unit_childcare_expenses: 1_000 + households: + household: + members: [parent_claimed, child_a, parent, child_b] + state_code: CO + output: + # min(0.25 x min(1,000, 5,000), 500) = 250 for the return without a + # claimable filer. + co_low_income_cdcc: [0, 250] + + +- name: 2025 single filer who can be claimed as a dependent gets the low-income child care credit for a child incapable of self-care + period: 2025 + input: + people: + filer: + age: 25 + employment_income: 10_000 + is_tax_unit_head: true + claimed_as_dependent_on_another_return: true + child: + age: 10 + is_incapable_of_self_care: true + tax_units: + tax_unit: + members: [filer, child] + tax_unit_childcare_expenses: 1_000 + households: + household: + members: [filer, child] + state_code: CO + output: + # IRC 21(b)(1)(B) keeps a dependent incapable of self-care + # regardless of IRC 152(b)(1), so the federal credit would be + # allowed: min(0.25 x min(1,000, 10,000), 500) = 250. + co_low_income_cdcc: 250 diff --git a/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/ctc/co_ctc.yaml b/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/ctc/co_ctc.yaml index 341508134b7..81c2c1a3baf 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/ctc/co_ctc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/ctc/co_ctc.yaml @@ -431,3 +431,310 @@ age: 5 output: co_ctc: 600 + + +- name: 2025 single filer who can be claimed as a dependent, no Colorado child tax credit + period: 2025 + input: + people: + filer: + age: 25 + employment_income: 10_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + child: + age: 3 + tax_units: + tax_unit: + members: [filer, child] + households: + household: + members: [filer, child] + state_code: CO + output: + # The child must meet the federal child tax credit's requirements, + # so be the taxpayer's dependent; a return with a claimable filer has + # no dependents (IRC 152(b)(1)). + co_ctc: 0 + co_ctc_eligible_children_count: 0 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, no Colorado child tax credit (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 25 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 25 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 3 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: CO + output: + co_ctc: 0 + co_ctc_eligible_children_count: 0 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, no Colorado child tax credit (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 25 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 25 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 3 + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: CO + output: + co_ctc: 0 + co_ctc_eligible_children_count: 0 + +- name: 2025 joint return with both spouses claimable as dependents, no Colorado child tax credit + period: 2025 + input: + people: + person_a: + age: 25 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 25 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 3 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: CO + output: + co_ctc: 0 + co_ctc_eligible_children_count: 0 + +- name: 2025 joint return with neither spouse claimable, no Colorado child tax credit + period: 2025 + input: + people: + person_a: + age: 25 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 25 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 3 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: CO + output: + # Joint AGI 10,000 is below 36,000: 1,200 per child under 6. + co_ctc: 1_200 + co_ctc_eligible_children_count: 1 + +- name: 2023 single filer who can be claimed as a dependent, no Colorado share of the federal child tax credit + period: 2023 + input: + people: + filer: + age: 25 + employment_income: 10_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + child: + age: 3 + tax_units: + tax_unit: + members: [filer, child] + households: + household: + members: [filer, child] + state_code: CO + output: + co_federal_ctc_maximum: 0 + co_ctc: 0 + +- name: 2023 joint return with one spouse who can be claimed as a dependent, no Colorado share of the federal child tax credit (the claimable spouse is the head) + period: 2023 + input: + people: + person_a: + age: 25 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 25 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 3 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: CO + output: + co_federal_ctc_maximum: 0 + co_ctc: 0 + +- name: 2023 joint return with one spouse who can be claimed as a dependent, no Colorado share of the federal child tax credit (the claimable spouse is the spouse) + period: 2023 + input: + people: + person_b: + age: 25 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 25 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 3 + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: CO + output: + co_federal_ctc_maximum: 0 + co_ctc: 0 + +- name: 2023 joint return with both spouses claimable as dependents, no Colorado share of the federal child tax credit + period: 2023 + input: + people: + person_a: + age: 25 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 25 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 3 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: CO + output: + co_federal_ctc_maximum: 0 + co_ctc: 0 + +- name: 2023 joint return with neither spouse claimable, no Colorado share of the federal child tax credit + period: 2023 + input: + people: + person_a: + age: 25 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 25 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 3 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: CO + output: + # The 2023 credit is a share of the federal credit: + # 2,000 for a child under 6. + co_federal_ctc_maximum: 2_000 + + +- name: 2025 single filer who can be claimed keeps the Colorado child tax credit when the would-be claimant meets the filing exception + period: 2025 + input: + people: + filer: + age: 25 + is_tax_unit_head: true + employment_income: 10_000 + claimable_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + child: + age: 3 + tax_units: + tax_unit: + members: [filer, child] + households: + household: + members: [filer, child] + state_code: CO + output: + co_ctc: 1_200 diff --git a/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/eitc/co_eitc.yaml b/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/eitc/co_eitc.yaml index 024f0913570..082e624cd85 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/eitc/co_eitc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/eitc/co_eitc.yaml @@ -397,3 +397,205 @@ # credit is the childless 7.65% x 10,000 capped at 649; 50% x 649. eitc_child_count: 0 co_eitc: 324.5 + + +- name: 2025 single filer who can be claimed as a dependent, no Colorado EITC without a qualifying child + period: 2025 + absolute_error_margin: 0.01 + input: + people: + filer: + age: 30 + employment_income: 10_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [filer] + spm_units: + spm_unit: + members: [filer] + households: + household: + members: [filer] + state_code: CO + output: + # The ITIN and under-25 routes waive identification and age rules + # only; IRC 32(c)(1)(A)(ii)(III) still bars a childless filer who can + # be claimed, and on a joint return either spouse (Publication 596). + co_eitc: 0 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, no Colorado EITC without a qualifying child (the claimable spouse is the head) + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + spm_units: + spm_unit: + members: [person_a, person_b] + households: + household: + members: [person_a, person_b] + state_code: CO + output: + co_eitc: 0 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, no Colorado EITC without a qualifying child (the claimable spouse is the spouse) + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [person_b, person_a] + filing_status: JOINT + spm_units: + spm_unit: + members: [person_b, person_a] + households: + household: + members: [person_b, person_a] + state_code: CO + output: + co_eitc: 0 + +- name: 2025 joint return with both spouses claimable as dependents, no Colorado EITC without a qualifying child + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + spm_units: + spm_unit: + members: [person_a, person_b] + households: + household: + members: [person_a, person_b] + state_code: CO + output: + co_eitc: 0 + +- name: 2025 joint return with neither spouse claimable, no Colorado EITC without a qualifying child + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + spm_units: + spm_unit: + members: [person_a, person_b] + households: + household: + members: [person_a, person_b] + state_code: CO + output: + # min(0.0765 x 10,000, 649) x 50% = 324.5 + co_eitc: 324.5 + +- name: 2025 single filer aged 19 who can be claimed as a dependent gets no Colorado EITC through the under-25 route + period: 2025 + absolute_error_margin: 0.01 + input: + people: + filer: + age: 19 + employment_income: 10_000 + is_tax_unit_head: true + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [filer] + filing_status: SINGLE + spm_units: + spm_unit: + members: [filer] + households: + household: + members: [filer] + state_code: CO + output: + # Without the claim this filer gets 324.5 (649 x 50%). + co_eitc: 0 + +- name: 2025 single filer who can be claimed as a dependent keeps the Colorado EITC for a qualifying child + period: 2025 + absolute_error_margin: 0.01 + input: + people: + filer: + age: 20 + employment_income: 10_000 + is_tax_unit_head: true + claimed_as_dependent_on_another_return: true + child: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [filer, child] + spm_units: + spm_unit: + members: [filer, child] + households: + household: + members: [filer, child] + state_code: CO + output: + # The dependency bar applies only without a qualifying child: + # 0.34 x 10,000 = 3,400 federal EITC x 50% = 1,700. + co_eitc: 1_700 diff --git a/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/family_affordability/co_family_affordability_credit.yaml b/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/family_affordability/co_family_affordability_credit.yaml index 5d6b0e59273..366bc4b0dae 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/family_affordability/co_family_affordability_credit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/family_affordability/co_family_affordability_credit.yaml @@ -118,3 +118,141 @@ output: co_family_affordability_credit: [0, 0, 0] co_refundable_credits: 0 + + +- name: 2025 single filer who can be claimed as a dependent, no Colorado family affordability credit + period: 2025 + input: + people: + filer: + age: 25 + employment_income: 10_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + child: + age: 3 + tax_units: + tax_unit: + members: [filer, child] + households: + household: + members: [filer, child] + state_code: CO + output: + # The child must be the taxpayer's dependent (IRC 152(b)(1)). + co_family_affordability_credit: [0, 0] + +- name: 2025 joint return with one spouse who can be claimed as a dependent, no Colorado family affordability credit (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 25 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 25 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 3 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: CO + output: + co_family_affordability_credit: [0, 0, 0] + +- name: 2025 joint return with one spouse who can be claimed as a dependent, no Colorado family affordability credit (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 25 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 25 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 3 + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: CO + output: + co_family_affordability_credit: [0, 0, 0] + +- name: 2025 joint return with both spouses claimable as dependents, no Colorado family affordability credit + period: 2025 + input: + people: + person_a: + age: 25 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 25 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 3 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: CO + output: + co_family_affordability_credit: [0, 0, 0] + +- name: 2025 joint return with neither spouse claimable, no Colorado family affordability credit + period: 2025 + input: + people: + person_a: + age: 25 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 25 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 3 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: CO + output: + # AGI 10,000 is below the 25,000 joint reduction + # threshold; child under 6: 3,273. + co_family_affordability_credit: [0, 0, 3_273] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ct/tax/income/credits/eitc/ct_eitc.yaml b/policyengine_us/tests/policy/baseline/gov/states/ct/tax/income/credits/eitc/ct_eitc.yaml index 73ed1c6c2d9..84dc1b0279d 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ct/tax/income/credits/eitc/ct_eitc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ct/tax/income/credits/eitc/ct_eitc.yaml @@ -125,3 +125,150 @@ ct_eitc: 0 # Regression test: federal EITC and a qualifying child are computed from # household inputs, but the CT bonus should not survive a zero CT match. + + +- name: 2025 single filer who can be claimed as a dependent, no Connecticut EITC without a qualifying child + period: 2025 + absolute_error_margin: 0.01 + input: + people: + filer: + age: 30 + employment_income: 1_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [filer] + spm_units: + spm_unit: + members: [filer] + households: + household: + members: [filer] + state_code: CT + output: + # Already zero through the federal EITC (IRC 32(c)(1)(A)(ii)(III)). + ct_eitc: 0 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, no Connecticut EITC without a qualifying child (the claimable spouse is the head) + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person_a: + age: 30 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + 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 + spm_units: + spm_unit: + members: [person_a, person_b] + households: + household: + members: [person_a, person_b] + state_code: CT + output: + ct_eitc: 0 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, no Connecticut EITC without a qualifying child (the claimable spouse is the spouse) + period: 2025 + absolute_error_margin: 0.01 + 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 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [person_b, person_a] + filing_status: JOINT + spm_units: + spm_unit: + members: [person_b, person_a] + households: + household: + members: [person_b, person_a] + state_code: CT + output: + ct_eitc: 0 + +- name: 2025 joint return with both spouses claimable as dependents, no Connecticut EITC without a qualifying child + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person_a: + age: 30 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 30 + employment_income: 500 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + spm_units: + spm_unit: + members: [person_a, person_b] + households: + household: + members: [person_a, person_b] + state_code: CT + output: + ct_eitc: 0 + +- name: 2025 joint return with neither spouse claimable, no Connecticut EITC without a qualifying child + period: 2025 + absolute_error_margin: 0.01 + 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 + spm_units: + spm_unit: + members: [person_a, person_b] + households: + household: + members: [person_a, person_b] + state_code: CT + output: + # 0.0765 x 1,000 = 76.50 x 40% = 30.60 + ct_eitc: 30.6 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ct/tax/income/credits/property_tax/ct_property_tax_credit_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ct/tax/income/credits/property_tax/ct_property_tax_credit_eligible.yaml index 755030c8593..3c0c242295c 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ct/tax/income/credits/property_tax/ct_property_tax_credit_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ct/tax/income/credits/property_tax/ct_property_tax_credit_eligible.yaml @@ -51,3 +51,176 @@ greater_age_head_spouse: 64 output: ct_property_tax_credit_eligible: true + + +- name: 2021 single filer who can be claimed as a dependent, no 2021 property tax credit through the dependent route + period: 2021 + input: + people: + filer: + age: 30 + employment_income: 10_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + child: + age: 5 + tax_units: + tax_unit: + members: [filer, child] + households: + household: + members: [filer, child] + state_code: CT + output: + # C.G.S. 12-704c(b)(2): under 65, only by validly claiming + # a dependent; a return with a claimable filer has none. + ct_property_tax_credit_eligible: false + +- name: 2021 joint return with one spouse who can be claimed as a dependent, no 2021 property tax credit through the dependent route (the claimable spouse is the head) + period: 2021 + input: + people: + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: CT + output: + ct_property_tax_credit_eligible: false + +- name: 2021 joint return with one spouse who can be claimed as a dependent, no 2021 property tax credit through the dependent route (the claimable spouse is the spouse) + period: 2021 + input: + people: + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: CT + output: + ct_property_tax_credit_eligible: false + +- name: 2021 joint return with both spouses claimable as dependents, no 2021 property tax credit through the dependent route + period: 2021 + input: + people: + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: CT + output: + ct_property_tax_credit_eligible: false + +- name: 2021 joint return with neither spouse claimable, no 2021 property tax credit through the dependent route + period: 2021 + input: + people: + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: CT + output: + ct_property_tax_credit_eligible: true + +- name: 2021 single filer aged 65 who can be claimed as a dependent qualifies for the property tax credit by age + period: 2021 + input: + people: + filer: + age: 65 + is_tax_unit_head: true + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [filer] + households: + household: + members: [filer] + state_code: CT + output: + ct_property_tax_credit_eligible: true + +- name: 2022 single filer who can be claimed as a dependent qualifies for the property tax credit with no age or dependent test + period: 2022 + input: + people: + filer: + age: 30 + is_tax_unit_head: true + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [filer] + households: + household: + members: [filer] + state_code: CT + output: + ct_property_tax_credit_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/ct/tax/income/rebate/ct_child_tax_rebate.yaml b/policyengine_us/tests/policy/baseline/gov/states/ct/tax/income/rebate/ct_child_tax_rebate.yaml index 048f7b445ec..02df6b2f094 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ct/tax/income/rebate/ct_child_tax_rebate.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ct/tax/income/rebate/ct_child_tax_rebate.yaml @@ -814,3 +814,140 @@ # HoH threshold 160,000 -> excess 0 -> no reduction -> 750. Pins the child cap. ct_child_tax_rebate: 750 absolute_error_margin: 0.01 + + +- name: 2021 single filer who can be claimed as a dependent, no 2022 child tax rebate + period: 2021 + input: + people: + filer: + age: 30 + employment_income: 10_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + child: + age: 4 + tax_units: + tax_unit: + members: [filer, child] + households: + household: + members: [filer, child] + state_code: CT + output: + # The child must be validly claimed on the 2021 federal return; + # a return with a claimable filer has no dependents. + ct_child_tax_rebate: 0 + +- name: 2021 joint return with one spouse who can be claimed as a dependent, no 2022 child tax rebate (the claimable spouse is the head) + period: 2021 + input: + people: + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: CT + output: + ct_child_tax_rebate: 0 + +- name: 2021 joint return with one spouse who can be claimed as a dependent, no 2022 child tax rebate (the claimable spouse is the spouse) + period: 2021 + input: + people: + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 4 + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: CT + output: + ct_child_tax_rebate: 0 + +- name: 2021 joint return with both spouses claimable as dependents, no 2022 child tax rebate + period: 2021 + input: + people: + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 4 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: CT + output: + ct_child_tax_rebate: 0 + +- name: 2021 joint return with neither spouse claimable, no 2022 child tax rebate + period: 2021 + input: + people: + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 4 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: CT + output: + ct_child_tax_rebate: 250 diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_ctc.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_ctc.yaml index cdc19f1a707..67aba750cbd 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_ctc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_ctc.yaml @@ -130,3 +130,166 @@ # A dependent who is not a 152(c) qualifying child (e.g. qualifying relative) # does not generate the IL CTC. il_ctc: 0 + + +- name: 2025 single filer who can be claimed as a dependent, Illinois child tax credit kept for the filer's own qualifying child + period: 2025 + absolute_error_margin: 0.01 + input: + people: + filer: + age: 20 + employment_income: 1_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + child: + age: 5 + tax_units: + tax_unit: + members: [filer, child] + spm_units: + spm_unit: + members: [filer, child] + households: + household: + members: [filer, child] + state_code: IL + output: + # 35 ILCS 5/244(d) uses the IRC 152 qualifying child, not an + # allowable dependent; the filer keeps the EITC for that child + # (0.34 x 1,000 x 20% = 68), so the credit is 40% x 68 = 27.20. + il_eitc: 68 + il_ctc: 27.2 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, Illinois child tax credit kept for the filer's own qualifying child (the claimable spouse is the head) + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person_a: + age: 20 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 20 + employment_income: 500 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + spm_units: + spm_unit: + members: [person_a, person_b, child] + households: + household: + members: [person_a, person_b, child] + state_code: IL + output: + il_eitc: 68 + il_ctc: 27.2 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, Illinois child tax credit kept for the filer's own qualifying child (the claimable spouse is the spouse) + period: 2025 + absolute_error_margin: 0.01 + 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 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + spm_units: + spm_unit: + members: [person_b, person_a, child] + households: + household: + members: [person_b, person_a, child] + state_code: IL + output: + il_eitc: 68 + il_ctc: 27.2 + +- name: 2025 joint return with both spouses claimable as dependents, Illinois child tax credit kept for the filer's own qualifying child + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person_a: + age: 20 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 20 + employment_income: 500 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + spm_units: + spm_unit: + members: [person_a, person_b, child] + households: + household: + members: [person_a, person_b, child] + state_code: IL + output: + il_eitc: 68 + il_ctc: 27.2 + +- name: 2025 joint return with neither spouse claimable, Illinois child tax credit kept for the filer's own qualifying child + period: 2025 + absolute_error_margin: 0.01 + 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: 5 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + spm_units: + spm_unit: + members: [person_a, person_b, child] + households: + household: + members: [person_a, person_b, child] + state_code: IL + output: + il_eitc: 68 + il_ctc: 27.2 diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_eitc.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_eitc.yaml index d43f6df3d5d..5c0663457e8 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_eitc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_eitc.yaml @@ -209,3 +209,176 @@ # A parent fails the IRC 152(c)(2) relationship test: 20% x the childless # federal-like credit of 649. il_eitc: 129.8 + + +- name: 2025 single filer who can be claimed as a dependent, no Illinois EITC without a qualifying child + period: 2025 + absolute_error_margin: 0.01 + input: + people: + filer: + age: 30 + employment_income: 1_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [filer] + spm_units: + spm_unit: + members: [filer] + households: + household: + members: [filer] + state_code: IL + output: + # The age and ITIN extensions keep the IRC 32(c)(1)(A)(ii)(III) + # bar on a childless filer who can be claimed. + il_eitc: 0 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, no Illinois EITC without a qualifying child (the claimable spouse is the head) + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person_a: + age: 30 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + 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 + spm_units: + spm_unit: + members: [person_a, person_b] + households: + household: + members: [person_a, person_b] + state_code: IL + output: + il_eitc: 0 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, no Illinois EITC without a qualifying child (the claimable spouse is the spouse) + period: 2025 + absolute_error_margin: 0.01 + 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 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [person_b, person_a] + filing_status: JOINT + spm_units: + spm_unit: + members: [person_b, person_a] + households: + household: + members: [person_b, person_a] + state_code: IL + output: + il_eitc: 0 + +- name: 2025 joint return with both spouses claimable as dependents, no Illinois EITC without a qualifying child + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person_a: + age: 30 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 30 + employment_income: 500 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + spm_units: + spm_unit: + members: [person_a, person_b] + households: + household: + members: [person_a, person_b] + state_code: IL + output: + il_eitc: 0 + +- name: 2025 joint return with neither spouse claimable, no Illinois EITC without a qualifying child + period: 2025 + absolute_error_margin: 0.01 + 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 + spm_units: + spm_unit: + members: [person_a, person_b] + households: + household: + members: [person_a, person_b] + state_code: IL + output: + # 0.0765 x 1,000 = 76.50 x 20% = 15.30 + il_eitc: 15.3 + +- name: 2025 single filer aged 19 who can be claimed as a dependent gets no Illinois EITC through the under-25 extension + period: 2025 + absolute_error_margin: 0.01 + input: + people: + filer: + age: 19 + employment_income: 1_000 + is_tax_unit_head: true + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [filer] + filing_status: SINGLE + spm_units: + spm_unit: + members: [filer] + households: + household: + members: [filer] + state_code: IL + output: + # Without the claim this filer gets 15.30. + il_eitc: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_income_tax_rebate.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_income_tax_rebate.yaml index f91a886d3c9..fde0290271e 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_income_tax_rebate.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_income_tax_rebate.yaml @@ -77,3 +77,163 @@ tax_unit_dependents: 2 output: il_income_tax_rebate: 300 + + +- name: 2021 single filer who can be claimed as a dependent, 2022 Illinois income tax rebate only through a spouse who is not claimed, with no dependent amount + period: 2021 + input: + people: + filer: + age: 30 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + child: + age: 5 + tax_units: + tax_unit: + members: [filer, child] + households: + household: + members: [filer, child] + state_code: IL + output: + # Section 212.1(a): a taxpayer claimed as a dependent on another + # return is ineligible, so the other spouse keeps the $100 joint + # amount; the return claims no dependent (IRC 152(b)(1)). + il_income_tax_rebate_eligible: false + il_income_tax_rebate: 0 + +- name: 2021 joint return with one spouse who can be claimed as a dependent, 2022 Illinois income tax rebate only through a spouse who is not claimed, with no dependent amount (the claimable spouse is the head) + period: 2021 + input: + people: + person_a: + age: 30 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 30 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: IL + output: + il_income_tax_rebate_eligible: true + il_income_tax_rebate: 100 + +- name: 2021 joint return with one spouse who can be claimed as a dependent, 2022 Illinois income tax rebate only through a spouse who is not claimed, with no dependent amount (the claimable spouse is the spouse) + period: 2021 + input: + people: + person_b: + age: 30 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 30 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: IL + output: + il_income_tax_rebate_eligible: true + il_income_tax_rebate: 100 + +- name: 2021 joint return with both spouses claimable as dependents, 2022 Illinois income tax rebate only through a spouse who is not claimed, with no dependent amount + period: 2021 + input: + people: + person_a: + age: 30 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 30 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: IL + output: + il_income_tax_rebate_eligible: false + il_income_tax_rebate: 0 + +- name: 2021 joint return with neither spouse claimable, 2022 Illinois income tax rebate only through a spouse who is not claimed, with no dependent amount + period: 2021 + 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: 5 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: IL + output: + # 100 joint + 100 for the child + il_income_tax_rebate_eligible: true + il_income_tax_rebate: 200 + + +- name: 2021 single filer who can be claimed as a dependent but is not claimed keeps the 2022 rebate, with no dependent amount + period: 2021 + input: + people: + filer: + age: 30 + is_tax_unit_head: true + claimable_as_dependent_on_another_return: true + claimed_as_dependent_on_another_return: false + child: + age: 5 + tax_units: + tax_unit: + members: [filer, child] + households: + household: + members: [filer, child] + state_code: IL + output: + # Section 212.1(a) bars a taxpayer actually claimed; the + # return still claims no dependent (IRC 152(b)(1)). + il_income_tax_rebate_eligible: true + il_income_tax_rebate: 50 diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/exemptions/il_dependent_exemption.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/exemptions/il_dependent_exemption.yaml index 97d7f756f80..2c9e2ed68d4 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/exemptions/il_dependent_exemption.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/il/tax/income/exemptions/il_dependent_exemption.yaml @@ -21,3 +21,164 @@ state_code: IL output: il_dependent_exemption: 4_850 + + +- name: 2025 single filer who can be claimed as a dependent, no Illinois dependent exemption + period: 2025 + input: + people: + filer: + age: 30 + employment_income: 10_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + child: + age: 5 + tax_units: + tax_unit: + members: [filer, child] + households: + household: + members: [filer, child] + state_code: IL + output: + # 35 ILCS 5/204(c) counts exemptions allowable under IRC 151; + # a return with a claimable filer has no dependents. + il_dependent_exemption: 0 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, no Illinois dependent exemption (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: IL + output: + il_dependent_exemption: 0 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, no Illinois dependent exemption (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: IL + output: + il_dependent_exemption: 0 + +- name: 2025 joint return with both spouses claimable as dependents, no Illinois dependent exemption + period: 2025 + input: + people: + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: IL + output: + il_dependent_exemption: 0 + +- name: 2025 joint return with neither spouse claimable, no Illinois dependent exemption + period: 2025 + input: + people: + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: IL + output: + il_dependent_exemption: 2_850 + + +- name: 2025 single filer who can be claimed keeps the dependent exemption when the would-be claimant meets the filing exception + period: 2025 + input: + people: + filer: + age: 30 + is_tax_unit_head: true + employment_income: 10_000 + claimable_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + child: + age: 5 + tax_units: + tax_unit: + members: [filer, child] + households: + household: + members: [filer, child] + state_code: IL + output: + # Publication 501, Dependent Taxpayer Test exception. + il_dependent_exemption: 2_850 diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/exemptions/in_additional_exemptions.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/exemptions/in_additional_exemptions.yaml index f2e8c148095..9cf38c1f71a 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/exemptions/in_additional_exemptions.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/exemptions/in_additional_exemptions.yaml @@ -13,3 +13,143 @@ in_qualifying_child_count: 0 output: in_additional_exemptions: 0 + + +- name: 2025 single filer who can be claimed as a dependent, no additional exemption for a dependent child + period: 2025 + input: + people: + filer: + age: 30 + employment_income: 10_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + child: + age: 5 + tax_units: + tax_unit: + members: [filer, child] + households: + household: + members: [filer, child] + state_code: IN + output: + in_additional_exemptions: 0 + in_qualifying_child_count: 0 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, no additional exemption for a dependent child (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: IN + output: + in_additional_exemptions: 0 + in_qualifying_child_count: 0 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, no additional exemption for a dependent child (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: IN + output: + in_additional_exemptions: 0 + in_qualifying_child_count: 0 + +- name: 2025 joint return with both spouses claimable as dependents, no additional exemption for a dependent child + period: 2025 + input: + people: + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: IN + output: + in_additional_exemptions: 0 + in_qualifying_child_count: 0 + +- name: 2025 joint return with neither spouse claimable, no additional exemption for a dependent child + period: 2025 + input: + people: + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: IN + output: + in_additional_exemptions: 1_500 + in_qualifying_child_count: 1 diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/exemptions/in_base_exemptions.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/exemptions/in_base_exemptions.yaml index 074154a62e4..f55833eaddd 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/exemptions/in_base_exemptions.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/exemptions/in_base_exemptions.yaml @@ -13,3 +13,164 @@ tax_unit_size: 3 output: in_base_exemptions: 3_000 + + +- name: 2025 single filer who can be claimed as a dependent, the filers keep their own exemptions but claim no dependent + period: 2025 + input: + people: + filer: + age: 30 + employment_income: 10_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + child: + age: 5 + tax_units: + tax_unit: + members: [filer, child] + households: + household: + members: [filer, child] + state_code: IN + output: + # Information Bulletin 117: the own exemption stays "even if the + # individual can be claimed as a dependent"; IRC 152(b)(1) removes + # the dependents. + in_base_exemptions: 1_000 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, the filers keep their own exemptions but claim no dependent (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: IN + output: + in_base_exemptions: 2_000 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, the filers keep their own exemptions but claim no dependent (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: IN + output: + in_base_exemptions: 2_000 + +- name: 2025 joint return with both spouses claimable as dependents, the filers keep their own exemptions but claim no dependent + period: 2025 + input: + people: + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: IN + output: + in_base_exemptions: 2_000 + +- name: 2025 joint return with neither spouse claimable, the filers keep their own exemptions but claim no dependent + period: 2025 + input: + people: + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 5 + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: IN + output: + in_base_exemptions: 3_000 + + +- name: 2025 single filer who can be claimed keeps the dependent's exemption when the would-be claimant meets the filing exception + period: 2025 + input: + people: + filer: + age: 30 + is_tax_unit_head: true + employment_income: 10_000 + claimable_as_dependent_on_another_return: true + dependent_claimant_filing_exception: true + child: + age: 5 + tax_units: + tax_unit: + members: [filer, child] + households: + household: + members: [filer, child] + state_code: IN + output: + in_base_exemptions: 2_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/in_eitc.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/in_eitc.yaml index 0ff01cd9ce9..3195b85ca99 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/in_eitc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/in_eitc.yaml @@ -116,3 +116,150 @@ household: {members: [parent], state_fips: 18} output: in_eitc: 61.20 + + +- name: 2025 single filer who can be claimed as a dependent, no Indiana EITC without a qualifying child + period: 2025 + absolute_error_margin: 0.01 + input: + people: + filer: + age: 30 + employment_income: 1_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [filer] + spm_units: + spm_unit: + members: [filer] + households: + household: + members: [filer] + state_code: IN + output: + # Already zero through the federal EITC (IRC 32(c)(1)(A)(ii)(III)). + in_eitc: 0 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, no Indiana EITC without a qualifying child (the claimable spouse is the head) + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person_a: + age: 30 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + 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 + spm_units: + spm_unit: + members: [person_a, person_b] + households: + household: + members: [person_a, person_b] + state_code: IN + output: + in_eitc: 0 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, no Indiana EITC without a qualifying child (the claimable spouse is the spouse) + period: 2025 + absolute_error_margin: 0.01 + 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 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [person_b, person_a] + filing_status: JOINT + spm_units: + spm_unit: + members: [person_b, person_a] + households: + household: + members: [person_b, person_a] + state_code: IN + output: + in_eitc: 0 + +- name: 2025 joint return with both spouses claimable as dependents, no Indiana EITC without a qualifying child + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person_a: + age: 30 + employment_income: 500 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 30 + employment_income: 500 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + tax_units: + tax_unit: + members: [person_a, person_b] + filing_status: JOINT + spm_units: + spm_unit: + members: [person_a, person_b] + households: + household: + members: [person_a, person_b] + state_code: IN + output: + in_eitc: 0 + +- name: 2025 joint return with neither spouse claimable, no Indiana EITC without a qualifying child + period: 2025 + absolute_error_margin: 0.01 + 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 + spm_units: + spm_unit: + members: [person_a, person_b] + households: + household: + members: [person_a, person_b] + state_code: IN + output: + # 0.0765 x 1,000 = 76.50 x 10% = 7.65 + in_eitc: 7.65 diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/in_nonpublic_school_deduction.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/in_nonpublic_school_deduction.yaml index a3c37577fc5..b13db9774a7 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/in_nonpublic_school_deduction.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/tax/income/in_nonpublic_school_deduction.yaml @@ -29,3 +29,145 @@ state_code: IN output: in_nonpublic_school_deduction: 1_000 + + +- name: 2025 single filer who can be claimed as a dependent, no nonpublic school deduction + period: 2025 + input: + people: + filer: + age: 30 + employment_income: 10_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + child: + age: 10 + is_in_k12_nonpublic_school: true + tax_units: + tax_unit: + members: [filer, child] + households: + household: + members: [filer, child] + state_code: IN + output: + # Information Bulletin 107: the child must be the taxpayer's IRC + # 152 dependent; a return with a claimable filer has none. + in_nonpublic_school_deduction: 0 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, no nonpublic school deduction (the claimable spouse is the head) + period: 2025 + input: + people: + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 10 + is_in_k12_nonpublic_school: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: IN + output: + in_nonpublic_school_deduction: 0 + +- name: 2025 joint return with one spouse who can be claimed as a dependent, no nonpublic school deduction (the claimable spouse is the spouse) + period: 2025 + input: + people: + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 10 + is_in_k12_nonpublic_school: true + tax_units: + tax_unit: + members: [person_b, person_a, child] + filing_status: JOINT + households: + household: + members: [person_b, person_a, child] + state_code: IN + output: + in_nonpublic_school_deduction: 0 + +- name: 2025 joint return with both spouses claimable as dependents, no nonpublic school deduction + period: 2025 + input: + people: + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + claimed_as_dependent_on_another_return: true + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + claimed_as_dependent_on_another_return: true + child: + age: 10 + is_in_k12_nonpublic_school: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: IN + output: + in_nonpublic_school_deduction: 0 + +- name: 2025 joint return with neither spouse claimable, no nonpublic school deduction + period: 2025 + input: + people: + person_a: + age: 30 + employment_income: 5_000 + is_tax_unit_head: true + is_tax_unit_spouse: false + person_b: + age: 30 + employment_income: 5_000 + is_tax_unit_head: false + is_tax_unit_spouse: true + child: + age: 10 + is_in_k12_nonpublic_school: true + tax_units: + tax_unit: + members: [person_a, person_b, child] + filing_status: JOINT + households: + household: + members: [person_a, person_b, child] + state_code: IN + output: + in_nonpublic_school_deduction: 1_000 diff --git a/policyengine_us/tests/policy/contrib/states/il/dependent_exemption_reform_test.yaml b/policyengine_us/tests/policy/contrib/states/il/dependent_exemption_reform_test.yaml index b10de6f49ee..9470e2b4ed5 100644 --- a/policyengine_us/tests/policy/contrib/states/il/dependent_exemption_reform_test.yaml +++ b/policyengine_us/tests/policy/contrib/states/il/dependent_exemption_reform_test.yaml @@ -71,3 +71,59 @@ households: {household: {members: [parent, child1], state_name: IL}} # Dependent one year under the limit (12 < 13) receives the exemption. output: {il_dependent_exemption: 2_850} + +- name: IL dependent exemption reform at its defaults keeps no dependent exemption for a single filer who can be claimed + period: 2025 + reforms: policyengine_us.reforms.states.il.dependent_exemption.il_dependent_exemption_reform.il_dependent_exemption_reform + input: + gov.contrib.states.il.dependent_exemption.in_effect: true + people: + filer: {age: 20, employment_income: 10_000, claimed_as_dependent_on_another_return: true} + child: {age: 5, is_tax_unit_dependent: true} + tax_units: {tax_unit: {members: [filer, child]}} + households: {household: {members: [filer, child], state_code: IL}} + # 35 ILCS 5/204(c) and IRC 152(b)(1), as in the baseline formula. + output: + il_dependent_exemption: 0 + +- name: IL dependent exemption reform at its defaults, joint return with one claimable spouse (the claimable spouse is the head) + period: 2025 + reforms: policyengine_us.reforms.states.il.dependent_exemption.il_dependent_exemption_reform.il_dependent_exemption_reform + input: + gov.contrib.states.il.dependent_exemption.in_effect: true + people: + person_a: {age: 20, employment_income: 5_000, is_tax_unit_head: true, is_tax_unit_spouse: false, claimed_as_dependent_on_another_return: true} + person_b: {age: 20, employment_income: 5_000, 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: IL}} + output: + il_dependent_exemption: 0 + +- name: IL dependent exemption reform at its defaults, joint return with one claimable spouse (the claimable spouse is the spouse) + period: 2025 + reforms: policyengine_us.reforms.states.il.dependent_exemption.il_dependent_exemption_reform.il_dependent_exemption_reform + input: + gov.contrib.states.il.dependent_exemption.in_effect: true + people: + person_b: {age: 20, employment_income: 5_000, is_tax_unit_head: true, is_tax_unit_spouse: false} + person_a: {age: 20, employment_income: 5_000, is_tax_unit_head: false, is_tax_unit_spouse: true, claimed_as_dependent_on_another_return: 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: IL}} + output: + il_dependent_exemption: 0 + +- name: IL dependent exemption reform at its defaults matches the baseline when nobody can be claimed + period: 2025 + reforms: policyengine_us.reforms.states.il.dependent_exemption.il_dependent_exemption_reform.il_dependent_exemption_reform + input: + gov.contrib.states.il.dependent_exemption.in_effect: true + people: + person_a: {age: 20, employment_income: 5_000, is_tax_unit_head: true, is_tax_unit_spouse: false} + person_b: {age: 20, employment_income: 5_000, 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: IL}} + output: + il_dependent_exemption: 2_850 diff --git a/policyengine_us/tests/policy/contrib/states/in/dependent_exemption_reform_test.yaml b/policyengine_us/tests/policy/contrib/states/in/dependent_exemption_reform_test.yaml index 1fed91484c0..9b0a5c95cea 100644 --- a/policyengine_us/tests/policy/contrib/states/in/dependent_exemption_reform_test.yaml +++ b/policyengine_us/tests/policy/contrib/states/in/dependent_exemption_reform_test.yaml @@ -251,3 +251,59 @@ # rate this raises IN income tax by $60, from 1,620.00 to 1,680.00. output: in_income_tax: 1680.00 + +- name: IN dependent exemption reform at its defaults keeps the filer's own exemption but no dependent for a single filer who can be claimed + period: 2025 + reforms: policyengine_us.reforms.states.in.dependent_exemption.in_dependent_exemption_reform.in_dependent_exemption_reform + input: + gov.contrib.states.in.dependent_exemption.in_effect: true + people: + filer: {age: 20, employment_income: 10_000, claimed_as_dependent_on_another_return: true} + child: {age: 5, is_tax_unit_dependent: true} + tax_units: {tax_unit: {members: [filer, child]}} + households: {household: {members: [filer, child], state_code: IN}} + # Bulletin 117: the own $1,000 stays; IRC 152(b)(1) removes the child. + output: + in_base_exemptions: 1_000 + +- name: IN dependent exemption reform at its defaults, joint return with one claimable spouse (the claimable spouse is the head) + period: 2025 + reforms: policyengine_us.reforms.states.in.dependent_exemption.in_dependent_exemption_reform.in_dependent_exemption_reform + input: + gov.contrib.states.in.dependent_exemption.in_effect: true + people: + person_a: {age: 20, employment_income: 5_000, is_tax_unit_head: true, is_tax_unit_spouse: false, claimed_as_dependent_on_another_return: true} + person_b: {age: 20, employment_income: 5_000, 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: IN}} + output: + in_base_exemptions: 2_000 + +- name: IN dependent exemption reform at its defaults, joint return with one claimable spouse (the claimable spouse is the spouse) + period: 2025 + reforms: policyengine_us.reforms.states.in.dependent_exemption.in_dependent_exemption_reform.in_dependent_exemption_reform + input: + gov.contrib.states.in.dependent_exemption.in_effect: true + people: + person_b: {age: 20, employment_income: 5_000, is_tax_unit_head: true, is_tax_unit_spouse: false} + person_a: {age: 20, employment_income: 5_000, is_tax_unit_head: false, is_tax_unit_spouse: true, claimed_as_dependent_on_another_return: 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: IN}} + output: + in_base_exemptions: 2_000 + +- name: IN dependent exemption reform at its defaults matches the baseline when nobody can be claimed + period: 2025 + reforms: policyengine_us.reforms.states.in.dependent_exemption.in_dependent_exemption_reform.in_dependent_exemption_reform + input: + gov.contrib.states.in.dependent_exemption.in_effect: true + people: + person_a: {age: 20, employment_income: 5_000, is_tax_unit_head: true, is_tax_unit_spouse: false} + person_b: {age: 20, employment_income: 5_000, 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: IN}} + output: + in_base_exemptions: 3_000 diff --git a/policyengine_us/variables/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc.py b/policyengine_us/variables/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc.py index 28cd8c3c9f0..92042437e55 100644 --- a/policyengine_us/variables/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc.py +++ b/policyengine_us/variables/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc.py @@ -9,6 +9,11 @@ class co_low_income_cdcc(Variable): reference = ( "https://law.justia.com/codes/colorado/title-39/specific-taxes/income-tax/article-22/part-1/section-39-22-119-5/", "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=46", + # Income Tax Topics: Low-income Child Care Expenses Credit (January + # 2026): the taxpayer "would have been allowed to claim a federal child + # care credit if they had a federal income tax liability". + "https://tax.colorado.gov/sites/tax/files/documents/ITT_Low-Income_Child_Care_Expenses_Credit_Jan_2026.pdf#page=1", + "https://www.law.cornell.edu/uscode/text/26/21#b_1", ) definition_period = YEAR defined_for = "co_low_income_cdcc_eligible" @@ -19,7 +24,16 @@ def formula(tax_unit, period, parameters): # estimate care expenses for just children care_expenses = tax_unit("tax_unit_childcare_expenses", period) age = tax_unit.members("age", period) - eligible_kid = age < p.cdcc.low_income.child_age_threshold + # C.R.S. 39-22-119.5(3)(a)(III)-(IV): care for the taxpayer's dependent + # under 13 for whom the federal IRC 21 credit would be allowed with + # enough tax liability. An ordinary child is not an IRC 21(b)(1)(A) + # qualifying individual when the filer (or, if joint, either spouse) + # can be claimed as a dependent (IRC 152(b)(1)); a child incapable of + # self-care still is under IRC 21(b)(1)(B). + qualifying_individual = tax_unit.members("is_cdcc_eligible", period) + eligible_kid = ( + age < p.cdcc.low_income.child_age_threshold + ) & qualifying_individual eligible_kids = tax_unit.sum(eligible_kid) # tax_unit_childcare_expenses spreads the SPM unit's childcare # expenses evenly across children, so apportion the under-age share diff --git a/policyengine_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc_eligible_child.py b/policyengine_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc_eligible_child.py index 021dc059fd9..3baac4688c3 100644 --- a/policyengine_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc_eligible_child.py +++ b/policyengine_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc_eligible_child.py @@ -7,8 +7,22 @@ class co_ctc_eligible_child(Variable): label = "Colorado child tax credit eligible child" definition_period = YEAR reference = ( - "https://leg.colorado.gov/sites/default/files/2023a_1112_signed.pdf#page=2", + "https://leg.colorado.gov/sites/default/files/2023a_1112_signed.pdf#page=4", + # Income Tax Topics: Child Tax Credit (January 2026): "the child + # generally must meet the requirements for the federal child tax + # credit". + "https://tax.colorado.gov/sites/tax/files/documents/ITT_Child_Tax_Credit_Jan_2026.pdf#page=2", + "https://www.law.cornell.edu/uscode/text/26/152#b_1", ) defined_for = StateCode.CO - adds = "gov.states.co.tax.income.credits.ctc.eligible_child" + def formula(person, period, parameters): + p = parameters(period).gov.states.co.tax.income.credits.ctc + child = add(person, period, p.eligible_child) > 0 + # The child must be one the taxpayer claims as a dependent. A return on + # which the filer (or, if joint, either spouse) can be claimed as a + # dependent has no dependents (IRC 152(b)(1)). + filer_is_dependent = person.tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + return child & ~filer_is_dependent diff --git a/policyengine_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc_qualifying_child.py b/policyengine_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc_qualifying_child.py index 2772b536c39..0f11084cdaa 100644 --- a/policyengine_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc_qualifying_child.py +++ b/policyengine_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc_qualifying_child.py @@ -9,6 +9,7 @@ class co_ctc_qualifying_child(Variable): reference = ( # C.R.S. 39-22-129(2)(a) and (3.5)(a) - House Bill 23-1112. "https://leg.colorado.gov/sites/default/files/2023a_1112_signed.pdf#page=5", + "https://www.law.cornell.edu/uscode/text/26/152#b_1", ) defined_for = StateCode.CO @@ -16,4 +17,11 @@ def formula(person, period, parameters): age = person("age", period) p = parameters(period).gov.states.co.tax.income.credits.ctc is_dependent = person("is_tax_unit_dependent", period) - return is_dependent & (age < p.age_threshold) + # The 2022-2023 credit is a share of the federal child tax credit, + # which is allowed only for the taxpayer's dependents. A return on + # which the filer (or, if joint, either spouse) can be claimed as a + # dependent has no dependents (IRC 152(b)(1)). + filer_is_dependent = person.tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + return is_dependent & (age < p.age_threshold) & ~filer_is_dependent diff --git a/policyengine_us/variables/gov/states/co/tax/income/credits/eitc/co_eitc.py b/policyengine_us/variables/gov/states/co/tax/income/credits/eitc/co_eitc.py index c941c366164..ceab7aad7c3 100644 --- a/policyengine_us/variables/gov/states/co/tax/income/credits/eitc/co_eitc.py +++ b/policyengine_us/variables/gov/states/co/tax/income/credits/eitc/co_eitc.py @@ -14,8 +14,12 @@ class co_eitc(Variable): "https://leg.colorado.gov/sites/default/files/te19_colorado_earned_income_tax_credit.pdf", # C.R.S. 39-22-123.5 pays a percentage of the federal IRC 32 credit. "https://leg.colorado.gov/sites/default/files/images/olls/crs2023-title-39.pdf", - # IRC 32(c)(3)(A) applies the IRC 152(c) qualifying-child definition. - "https://www.law.cornell.edu/uscode/text/26/32#c_3_A", + # IRC 32(c)(3)(A) applies the IRC 152(c) qualifying-child definition; + # under 32(c)(1)(A)(ii)(III) a filer without a qualifying child must + # not be a dependent of another taxpayer. + "https://www.law.cornell.edu/uscode/text/26/32#c_1_A_ii", + # Publication 596: on a joint return, neither spouse may be claimable. + "https://www.irs.gov/pub/irs-prior/p596--2025.pdf#page=18", ) defined_for = StateCode.CO @@ -48,12 +52,20 @@ def formula(tax_unit, period, parameters): & (age >= federal_childless_age_floor) & (age <= federal_eitc_parameters.eligibility.age.max) ) + # The state routes waive only the identification and age rules. A + # filer without a qualifying child still must not be a dependent of + # another taxpayer (IRC 32(c)(1)(A)(ii)(III)); on a joint return + # neither spouse may be (Publication 596). + filer_is_dependent = tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) itin_eitc = calculate_eitc_like_amount( tax_unit, period, parameters, child_count_with_tin, - (child_count_with_tin > 0) | childless_filer_age_eligible, + (child_count_with_tin > 0) + | (childless_filer_age_eligible & ~filer_is_dependent), filer_has_tin, ) @@ -76,8 +88,9 @@ def formula(tax_unit, period, parameters): & homeless_or_foster ) ) - under_25_demographic_eligible = tax_unit.any( - is_head_or_spouse & under_25_age_eligible + under_25_demographic_eligible = ( + tax_unit.any(is_head_or_spouse & under_25_age_eligible) + & ~filer_is_dependent ) under_25_eitc = calculate_eitc_like_amount( tax_unit, diff --git a/policyengine_us/variables/gov/states/co/tax/income/credits/family_affordability/co_family_affordability_credit.py b/policyengine_us/variables/gov/states/co/tax/income/credits/family_affordability/co_family_affordability_credit.py index 16340c00e57..7e3dd2a4b82 100644 --- a/policyengine_us/variables/gov/states/co/tax/income/credits/family_affordability/co_family_affordability_credit.py +++ b/policyengine_us/variables/gov/states/co/tax/income/credits/family_affordability/co_family_affordability_credit.py @@ -9,12 +9,26 @@ class co_family_affordability_credit(Variable): label = "Colorado Family Affordability Credit" unit = USD definition_period = YEAR - reference = "https://leg.colorado.gov/bills/hb24-1311" + reference = ( + "https://leg.colorado.gov/bills/hb24-1311", + # Income Tax Topics: Family Affordability Tax Credit (January 2026). + "https://tax.colorado.gov/sites/tax/files/documents/ITT_Family_Affordability_Tax_Credit_Jan_2026.pdf#page=1", + "https://www.law.cornell.edu/uscode/text/26/152#b_1", + ) defined_for = StateCode.CO def formula(person, period, parameters): age = person("age", period) - dependent = person("is_qualifying_child_dependent", period) + # The child must meet the federal child tax credit's dependent + # requirement; a return on which the filer (or, if joint, either + # spouse) can be claimed as a dependent has no dependents (IRC + # 152(b)(1)). + filer_is_dependent = person.tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + dependent = ( + person("is_qualifying_child_dependent", period) & ~filer_is_dependent + ) p = parameters(period).gov.states.co.tax.income.credits.family_affordability base_amount = p.amount * dependent agi = person.tax_unit("adjusted_gross_income", period) diff --git a/policyengine_us/variables/gov/states/ct/tax/income/credits/property_tax/ct_property_tax_credit_eligible.py b/policyengine_us/variables/gov/states/ct/tax/income/credits/property_tax/ct_property_tax_credit_eligible.py index 381d18e95c1..953d2ffbef7 100644 --- a/policyengine_us/variables/gov/states/ct/tax/income/credits/property_tax/ct_property_tax_credit_eligible.py +++ b/policyengine_us/variables/gov/states/ct/tax/income/credits/property_tax/ct_property_tax_credit_eligible.py @@ -7,13 +7,25 @@ class ct_property_tax_credit_eligible(Variable): label = "Eligible for the Connecticut Property Tax Credit" definition_period = YEAR defined_for = StateCode.CT - # (b)(2) - reference = "https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-704c" + reference = ( + # (b)(2) + "https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-704c", + "https://www.law.cornell.edu/uscode/text/26/152#b_1", + ) def formula(tax_unit, period, parameters): p = parameters(period).gov.states.ct.tax.income.credits.property_tax age_eligible = tax_unit("greater_age_head_spouse", period) >= p.age_threshold - p = parameters(period).gov.states.ct.tax.income.credits.property_tax - dependents_present = tax_unit("tax_unit_dependents", period) > 0 + # Through 2021, a filer under the age threshold qualifies only by + # "validly claiming one or more dependents". A return on which the + # filer (or, if joint, either spouse) can be claimed as a dependent + # has no dependents (IRC 152(b)(1)). From 2022 the age threshold is 0, + # so every filer is age eligible. + filer_is_dependent = tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + dependents_present = (tax_unit("tax_unit_dependents", period) > 0) & ~( + filer_is_dependent + ) return dependents_present | age_eligible diff --git a/policyengine_us/variables/gov/states/ct/tax/income/rebate/ct_child_tax_rebate.py b/policyengine_us/variables/gov/states/ct/tax/income/rebate/ct_child_tax_rebate.py index b9c8ceefdcf..ac2f1ef6faa 100644 --- a/policyengine_us/variables/gov/states/ct/tax/income/rebate/ct_child_tax_rebate.py +++ b/policyengine_us/variables/gov/states/ct/tax/income/rebate/ct_child_tax_rebate.py @@ -15,6 +15,7 @@ class ct_child_tax_rebate(Variable): reference = ( "https://cga.ct.gov/2022/ACT/PA/PDF/2022PA-00118-R00HB-05506-PA.PDF#page=548", "https://portal.ct.gov/-/media/drs/publications/tssb/2022/tssb-2022-5.pdf#page=1", + "https://www.law.cornell.edu/uscode/text/26/152#b_1", ) def formula(tax_unit, period, parameters): @@ -35,7 +36,13 @@ def formula(tax_unit, period, parameters): # Sec. 411(b)(1)'s requirement that the child be validly claimed as a # dependent on the 2021 federal return. dependent = person("is_tax_unit_dependent", period) - eligible_child = (age <= p.age_limit) & dependent + # A return on which the filer (or, if joint, either spouse) can be + # claimed as a dependent has no dependents (IRC 152(b)(1)), so it + # validly claims no child. + filer_is_dependent = person.tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + eligible_child = (age <= p.age_limit) & dependent & ~filer_is_dependent count_children = tax_unit.sum(eligible_child) capped_children = min_(count_children, p.child_cap) total_rebate = capped_children * p.amount diff --git a/policyengine_us/variables/gov/states/il/tax/income/credits/il_ctc.py b/policyengine_us/variables/gov/states/il/tax/income/credits/il_ctc.py index 358f5628b8c..73ba205f48b 100644 --- a/policyengine_us/variables/gov/states/il/tax/income/credits/il_ctc.py +++ b/policyengine_us/variables/gov/states/il/tax/income/credits/il_ctc.py @@ -7,15 +7,23 @@ class il_ctc(Variable): label = "Illinois Child Tax Credit" unit = USD definition_period = YEAR - reference = "https://www.ilga.gov/Documents/legislation/103/HB/10300HB4917.htm" + reference = ( + # 35 ILCS 5/244(a), (d): a taxpayer with a "qualifying child" (IRC 152 + # meaning) under 12 gets a share of the Section 212 credit. + "https://www.ilga.gov/Documents/legislation/ilcs/documents/003500050K244.htm", + # 2026 Schedule IL-E/EITC draft instructions: "at least one qualifying + # child that is under the age of 12". + "https://tax.illinois.gov/content/dam/soi/en/web/tax/taxprofessionals/draft-forms/documents/iit-draft-forms/2026-iit-vendor-forms-and-instructions/2026-sch-il-e-eitc-instr-vendor.pdf#page=2", + ) defined_for = StateCode.IL def formula(tax_unit, period, parameters): p = parameters(period).gov.states.il.tax.income.credits.ctc person = tax_unit.members age = person("age", period) - # 35 ILCS 5/212.3 incorporates IRC §32 EITC qualifying-child rules, - # which tie to IRC §152(c) (excluding §152(d) qualifying relatives). + # 35 ILCS 5/244(d) gives "qualifying child" its IRC 152 meaning, not + # an allowable dependent, so a filer who can be claimed as a dependent + # elsewhere still counts their own qualifying child. qualifying_child = person("is_qualifying_child_dependent", period) eligible_child = qualifying_child & (age < p.age_limit) eligible_child_present = tax_unit.any(eligible_child) diff --git a/policyengine_us/variables/gov/states/il/tax/income/credits/il_eitc.py b/policyengine_us/variables/gov/states/il/tax/income/credits/il_eitc.py index 6b35fa1328e..6e92f3e30a0 100644 --- a/policyengine_us/variables/gov/states/il/tax/income/credits/il_eitc.py +++ b/policyengine_us/variables/gov/states/il/tax/income/credits/il_eitc.py @@ -14,8 +14,12 @@ class il_eitc(Variable): "https://tax.illinois.gov/programs/eitc.html", # 35 ILCS 5/212 bases the IL EIC on the federal IRC 32 credit. "https://www.ilga.gov/legislation/ilcs/fulltext.asp?DocName=003500050K212", - # IRC 32(c)(3)(A) applies the IRC 152(c) qualifying-child definition. - "https://www.law.cornell.edu/uscode/text/26/32#c_3_A", + # IRC 32(c)(3)(A) applies the IRC 152(c) qualifying-child definition; + # under 32(c)(1)(A)(ii)(III) a filer without a qualifying child must + # not be a dependent of another taxpayer. + "https://www.law.cornell.edu/uscode/text/26/32#c_1_A_ii", + # Publication 596: on a joint return, neither spouse may be claimable. + "https://www.irs.gov/pub/irs-prior/p596--2025.pdf#page=18", ) defined_for = StateCode.IL @@ -30,8 +34,16 @@ def formula(tax_unit, period, parameters): child_count = tax_unit.sum(qualifying_child) filer_has_tin = tax_unit.sum(is_head_or_spouse & ~has_tin) == 0 p = parameters(period).gov.states.il.tax.income.credits.eitc - demographic_eligible = (child_count > 0) | tax_unit.any( - is_head_or_spouse & (age >= p.childless_min_age) + # The state extension waives only the identification and age rules. A + # filer without a qualifying child still must not be a dependent of + # another taxpayer (IRC 32(c)(1)(A)(ii)(III)); on a joint return + # neither spouse may be (Publication 596). + filer_is_dependent = tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + demographic_eligible = (child_count > 0) | ( + tax_unit.any(is_head_or_spouse & (age >= p.childless_min_age)) + & ~filer_is_dependent ) state_eitc = calculate_eitc_like_amount( tax_unit, diff --git a/policyengine_us/variables/gov/states/il/tax/income/credits/il_income_tax_rebate.py b/policyengine_us/variables/gov/states/il/tax/income/credits/il_income_tax_rebate.py index 3b30f6639ec..782d21d7744 100644 --- a/policyengine_us/variables/gov/states/il/tax/income/credits/il_income_tax_rebate.py +++ b/policyengine_us/variables/gov/states/il/tax/income/credits/il_income_tax_rebate.py @@ -22,7 +22,15 @@ def formula(tax_unit, period, parameters): p.amount.joint.calc(scale_agi), p.amount.other.calc(scale_agi), ) - dependent_count = tax_unit("tax_unit_dependents", period) + # $100 for each person claimed as a dependent on the 2021 federal + # return, which has none when a filer (or, if joint, either spouse) + # can be claimed (IRC 152(b)(1)). + 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) + ) capped_dependents = min_(dependent_count, p.max_dependents) dependent_amount = capped_dependents * p.amount.dependent return base_amount + dependent_amount diff --git a/policyengine_us/variables/gov/states/il/tax/income/credits/il_income_tax_rebate_eligible.py b/policyengine_us/variables/gov/states/il/tax/income/credits/il_income_tax_rebate_eligible.py index 4c0819be174..cd4db7aa8e3 100644 --- a/policyengine_us/variables/gov/states/il/tax/income/credits/il_income_tax_rebate_eligible.py +++ b/policyengine_us/variables/gov/states/il/tax/income/credits/il_income_tax_rebate_eligible.py @@ -19,4 +19,12 @@ def formula(tax_unit, period, parameters): p.amount.joint.thresholds[1], p.amount.other.thresholds[1], ) - return federal_agi < income_threshold + # Section 212.1(a): a taxpayer "who is claimed as a dependent on + # another individual's return for that year, is ineligible". The + # exclusion turns on an actual claim and is per taxpayer, so a joint + # return qualifies while either spouse is not claimed. + person = tax_unit.members + filer = person("is_tax_unit_head_or_spouse", period) + claimed = person("claimed_as_dependent_on_another_return", period) + has_eligible_filer = tax_unit.any(filer & ~claimed) + return (federal_agi < income_threshold) & has_eligible_filer diff --git a/policyengine_us/variables/gov/states/il/tax/income/exemptions/il_dependent_exemption.py b/policyengine_us/variables/gov/states/il/tax/income/exemptions/il_dependent_exemption.py index 7e6634f23ef..5adfd415287 100644 --- a/policyengine_us/variables/gov/states/il/tax/income/exemptions/il_dependent_exemption.py +++ b/policyengine_us/variables/gov/states/il/tax/income/exemptions/il_dependent_exemption.py @@ -8,8 +8,19 @@ class il_dependent_exemption(Variable): unit = USD definition_period = YEAR defined_for = StateCode.IL + reference = ( + # 35 ILCS 5/204(c): an exemption for each exemption "allowable" under + # IRC 151. + "https://www.ilga.gov/Documents/legislation/ilcs/documents/003500050K204.htm", + "https://www.law.cornell.edu/uscode/text/26/152#b_1", + ) def formula(tax_unit, period, parameters): amount = parameters(period).gov.states.il.tax.income.exemption.dependent - - return amount * tax_unit("tax_unit_dependents", 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)). + filer_is_dependent = tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + dependents = tax_unit("tax_unit_dependents", period) + return amount * where(filer_is_dependent, 0, dependents) diff --git a/policyengine_us/variables/gov/states/in/tax/income/deductions/in_nonpublic_school_deduction.py b/policyengine_us/variables/gov/states/in/tax/income/deductions/in_nonpublic_school_deduction.py index 1792573136e..bf2867eea51 100644 --- a/policyengine_us/variables/gov/states/in/tax/income/deductions/in_nonpublic_school_deduction.py +++ b/policyengine_us/variables/gov/states/in/tax/income/deductions/in_nonpublic_school_deduction.py @@ -8,15 +8,23 @@ class in_nonpublic_school_deduction(Variable): definition_period = YEAR unit = USD reference = ( - "http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-2-22" # (d)(1) + "http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-2-22", # (d)(1) + # Information Bulletin 107: the child must qualify as the taxpayer's + # dependent under IRC 152. + "https://www.in.gov/dor/files/ib107.pdf#page=1", + "https://www.law.cornell.edu/uscode/text/26/152#b_1", ) defined_for = StateCode.IN def formula(tax_unit, period, parameters): p = parameters(period).gov.states["in"].tax.income.deductions.nonpublic_school + # Law specifies dependent children who attended a nonpublic school in + # Indiana for 180 days or more and for whom non-reimbursed education + # expenditures were made; using a national var here to save mem. A + # return on which the filer (or, if joint, either spouse) can be + # claimed as a dependent has no dependents (IRC 152(b)(1)). children = add(tax_unit, period, ["is_in_k12_nonpublic_school"]) - # Law specifices dependent children who attended a nonpublic school in Indiana - # for 180 days or more and for whom non-reimbursed education expenditures were made; - # using a national var here to save mem - - return children * p.amount + filer_is_dependent = tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + return where(filer_is_dependent, 0, children) * p.amount diff --git a/policyengine_us/variables/gov/states/in/tax/income/exemptions/in_base_exemptions.py b/policyengine_us/variables/gov/states/in/tax/income/exemptions/in_base_exemptions.py index b6d0e72c547..08809c12cc3 100644 --- a/policyengine_us/variables/gov/states/in/tax/income/exemptions/in_base_exemptions.py +++ b/policyengine_us/variables/gov/states/in/tax/income/exemptions/in_base_exemptions.py @@ -8,10 +8,25 @@ class in_base_exemptions(Variable): unit = USD definition_period = YEAR reference = ( - "http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-1-3.5" # (a)(3)-(4) + "http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-1-3.5", # (a)(3)-(4) + # Information Bulletin 117: the filer's own exemption is allowed "even + # if the individual can be claimed as a dependent", while dependents + # follow federal rules. + "https://www.in.gov/dor/files/ib117.pdf#page=2", + "https://www.law.cornell.edu/uscode/text/26/152#b_1", ) defined_for = StateCode.IN def formula(tax_unit, period, parameters): p = parameters(period).gov.states["in"].tax.income.exemptions - return tax_unit("tax_unit_size", period) * p.base.amount + size = tax_unit("tax_unit_size", period) + dependents = tax_unit("tax_unit_dependents", period) + # Each filer keeps the $1,000 exemption even when another taxpayer can + # claim them, but a return on which the filer (or, if joint, either + # spouse) can be claimed as a dependent has no dependents (IRC + # 152(b)(1)). + filer_is_dependent = tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + exemptions = where(filer_is_dependent, size - dependents, size) + return exemptions * p.base.amount diff --git a/policyengine_us/variables/gov/states/in/tax/income/exemptions/in_is_qualifying_dependent_child.py b/policyengine_us/variables/gov/states/in/tax/income/exemptions/in_is_qualifying_dependent_child.py index 77457b04214..464d71d2d42 100644 --- a/policyengine_us/variables/gov/states/in/tax/income/exemptions/in_is_qualifying_dependent_child.py +++ b/policyengine_us/variables/gov/states/in/tax/income/exemptions/in_is_qualifying_dependent_child.py @@ -7,7 +7,9 @@ class in_is_qualifying_dependent_child(Variable): label = "Indiana additional exemption qualifying dependent child" definition_period = YEAR reference = ( - "http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-1-3.5" # (5)(B)(i) + "http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-1-3.5", # (5)(B)(i) + "https://www.in.gov/dor/files/ib117.pdf#page=2", + "https://www.law.cornell.edu/uscode/text/26/152#b_1", ) defined_for = StateCode.IN @@ -22,4 +24,9 @@ def formula(person, period, parameters): ) max_age = where(student, max_ages.student, max_ages.non_student) age_qualifies = age <= max_age - return dependent & age_qualifies + # A return on which the filer (or, if joint, either spouse) can be + # claimed as a dependent has no dependents (IRC 152(b)(1)). + filer_is_dependent = person.tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + return dependent & age_qualifies & ~filer_is_dependent