diff --git a/changelog.d/ctc-qualifying-children-filer-id.fixed.md b/changelog.d/ctc-qualifying-children-filer-id.fixed.md new file mode 100644 index 00000000000..47f9538645b --- /dev/null +++ b/changelog.d/ctc-qualifying-children-filer-id.fixed.md @@ -0,0 +1 @@ +Exclude children whose filer fails the Child Tax Credit identification requirements from ctc_qualifying_children: from 2025 the filer social security number rule (IRC 24(h)(7)(A)(i)), and in every year the taxpayer identification number rule (IRC 24(e)(2)). This removes the children of ITIN filers from the North Carolina child deduction from 2025, and removes the children of filers with no TIN from the North Carolina child deduction and credit for children (2015-2017), the Utah child tax credit, the Maine fairness credits, and the New York Empire State child credit $100 minimum under its pre-2025 and post-2027 rules. The Idaho Child Tax Credit and the CARES recovery rebate keep counting these children under the IRC 24(c) definition, and the Utah child tax credit and Maine fairness credits keep counting the children of ITIN filers, who get the credit for other dependents. diff --git a/policyengine_us/reforms/congress/afa/afa_other_dependent_credit.py b/policyengine_us/reforms/congress/afa/afa_other_dependent_credit.py index 3b4e3719db4..fcc0247149b 100644 --- a/policyengine_us/reforms/congress/afa/afa_other_dependent_credit.py +++ b/policyengine_us/reforms/congress/afa/afa_other_dependent_credit.py @@ -148,7 +148,13 @@ def formula(tax_unit, period, parameters): if ctc.refundable.fully_refundable: reduction = tax_unit("ctc_lower_phase_out", period) p = parameters(period).gov.contrib.congress.afa.ctc.phase_out - qualifying_children = tax_unit("ctc_qualifying_children", period) + # Proposed section 24A has no filer SSN rule, so the floor + # counts children without the federal filer test. + qualifying_children = add( + tax_unit, + period, + ["ctc_qualifying_child_ignoring_filer_identification"], + ) lower_floor = p.lower_floor * qualifying_children capped_credit = min_(lower_floor, maximum_amount) reduced_max_amount_lower = max_( @@ -186,7 +192,14 @@ def formula(tax_unit, period, parameters): ) reduction = tax_unit("ctc_lower_phase_out", period) p = parameters(period).gov.contrib.congress.afa.ctc.phase_out - qualifying_children = tax_unit("ctc_qualifying_children", period) + # Proposed section 24A has no filer SSN rule (only a timely + # taxpayer TIN, 24A(e)(2)), so the floor counts children without + # the federal filer test. + qualifying_children = add( + tax_unit, + period, + ["ctc_qualifying_child_ignoring_filer_identification"], + ) lower_floor = p.lower_floor * qualifying_children reduced_max_amount_lower = max_(lower_floor, maximum_amount - reduction) higher_reduction = tax_unit("ctc_higher_phase_out", period) diff --git a/policyengine_us/reforms/congress/hawley/awra/american_worker_rebate_act.py b/policyengine_us/reforms/congress/hawley/awra/american_worker_rebate_act.py index 8218bba43c5..691268a715d 100644 --- a/policyengine_us/reforms/congress/hawley/awra/american_worker_rebate_act.py +++ b/policyengine_us/reforms/congress/hawley/awra/american_worker_rebate_act.py @@ -84,7 +84,12 @@ class american_worker_tax_rebate_child_amount(Variable): "The tax rebate amount for children, under the American Worker Rebate Act." ) definition_period = YEAR - defined_for = "ctc_qualifying_child" + # The bill counts "qualifying children (within the meaning of section + # 24(c))", so the CTC filer identification requirements do not apply; + # american_worker_tax_rebate_eligible applies the bill's own rules. + # The variable also applies the CTC child social security number rule + # and the IRC 152(b)(1) dependent-filer rule. + defined_for = "ctc_qualifying_child_ignoring_filer_identification" adds = ["gov.contrib.congress.hawley.awra.amount.non_joint"] diff --git a/policyengine_us/reforms/congress/romney/family_security_act_2024/ctc/family_security_act_2024_ctc.py b/policyengine_us/reforms/congress/romney/family_security_act_2024/ctc/family_security_act_2024_ctc.py index 35d1afb7d85..e4befb61ce5 100644 --- a/policyengine_us/reforms/congress/romney/family_security_act_2024/ctc/family_security_act_2024_ctc.py +++ b/policyengine_us/reforms/congress/romney/family_security_act_2024/ctc/family_security_act_2024_ctc.py @@ -84,17 +84,10 @@ class ctc_child_individual_maximum(Variable): def formula(person, period, parameters): age = person("age", period) qualifying_child = person("ctc_qualifying_child", period) - filer_meets_child_ctc_id_requirements = person.tax_unit( - "filer_meets_child_ctc_identification_requirements", period - ) p = parameters( period ).gov.contrib.congress.romney.family_security_act_2_0.ctc - return ( - qualifying_child - * filer_meets_child_ctc_id_requirements - * p.base.calc(age) - ) + return qualifying_child * p.base.calc(age) class ctc_qualifying_children(Variable): value_type = int diff --git a/policyengine_us/reforms/ctc/ctc_additional_bracket.py b/policyengine_us/reforms/ctc/ctc_additional_bracket.py index d83b1b35152..660a5d46fe8 100644 --- a/policyengine_us/reforms/ctc/ctc_additional_bracket.py +++ b/policyengine_us/reforms/ctc/ctc_additional_bracket.py @@ -15,15 +15,8 @@ class ctc_child_individual_maximum(Variable): def formula(person, period, parameters): age = person("age", period) qualifying_child = person("ctc_qualifying_child", period) - filer_meets_child_ctc_id_requirements = person.tax_unit( - "filer_meets_child_ctc_identification_requirements", period - ) p = parameters(period).gov.contrib.ctc.additional_bracket.amount - return ( - qualifying_child - * filer_meets_child_ctc_id_requirements - * p.base.calc(age) - ) + return qualifying_child * p.base.calc(age) class ctc_refundable_maximum(Variable): value_type = float diff --git a/policyengine_us/reforms/ctc/ctc_older_child_supplement.py b/policyengine_us/reforms/ctc/ctc_older_child_supplement.py index e11ba0bf70b..767939a7440 100644 --- a/policyengine_us/reforms/ctc/ctc_older_child_supplement.py +++ b/policyengine_us/reforms/ctc/ctc_older_child_supplement.py @@ -19,19 +19,12 @@ class ctc_child_individual_maximum(Variable): def formula(person, period, parameters): age = person("age", period) qualifying_child = person("ctc_qualifying_child", period) - filer_meets_child_ctc_id_requirements = person.tax_unit( - "filer_meets_child_ctc_identification_requirements", period - ) base_amount = parameters(period).gov.irs.credits.ctc.amount.base base_amount = base_amount.calc(age) oldest_child = person("child_index", period) == 1 p_ref = parameters(period).gov.contrib.ctc.oldest_child_supplement oldest_child_supplement = oldest_child * p_ref.amount - return ( - qualifying_child - * filer_meets_child_ctc_id_requirements - * (base_amount + oldest_child_supplement) - ) + return qualifying_child * (base_amount + oldest_child_supplement) class reform(Reform): def apply(self): diff --git a/policyengine_us/reforms/refundable_credit_conversion/refundable_credit_conversion.py b/policyengine_us/reforms/refundable_credit_conversion/refundable_credit_conversion.py index 3b4a422fc4c..3b9a255cff1 100644 --- a/policyengine_us/reforms/refundable_credit_conversion/refundable_credit_conversion.py +++ b/policyengine_us/reforms/refundable_credit_conversion/refundable_credit_conversion.py @@ -54,10 +54,12 @@ def formula(tax_unit, period, parameters): else: taxpayer_amount = 0 - # Reuses the baseline `ctc_qualifying_children` variable so - # the same eligibility rules as the federal CTC apply (per - # IRC §24(c)). Hoisted so the per-other-dependent branch can - # reuse the same count. + # Reuses the baseline `ctc_qualifying_children` variable, the + # children for whom the federal CTC is allowed (IRC §24(c), (e) + # and (h)(7)); a child whose filer fails the filer + # identification test counts as an other dependent below. + # Hoisted so the per-other-dependent branch can reuse the same + # count. ctc_count = tax_unit("ctc_qualifying_children", period) if p.credit.use_ctc_dependent_credit: ctc_dependent_amount = ctc_count * p.credit.per_ctc_dependent diff --git a/policyengine_us/reforms/states/id/ctc/id_ctc_reform.py b/policyengine_us/reforms/states/id/ctc/id_ctc_reform.py index 771d5c45848..73b1a724d20 100644 --- a/policyengine_us/reforms/states/id/ctc/id_ctc_reform.py +++ b/policyengine_us/reforms/states/id/ctc/id_ctc_reform.py @@ -36,7 +36,7 @@ class id_refundable_ctc(Variable): def formula(tax_unit, period, parameters): p = parameters(period).gov.contrib.states.id.ctc # Potential is the revived (nonrefundable) Idaho CTC worksheet - # amount, ctc_qualifying_children * amount. + # amount, id_ctc_qualifying_children * amount. potential = tax_unit("id_ctc", period) ordered_credits = parameters( period @@ -50,7 +50,7 @@ def formula(tax_unit, period, parameters): ) non_refundable = min_(potential, credit_limit) unused_credit = max_(potential - non_refundable, 0) - eligible_children = tax_unit("ctc_qualifying_children", period) + eligible_children = tax_unit("id_ctc_qualifying_children", period) refund_limit = p.refundable.amount * eligible_children refundable_credit = min_(unused_credit, refund_limit) # Only pay the refundable portion when the refundable option is on; diff --git a/policyengine_us/reforms/states/il/sb3567/il_sb3567_reform.py b/policyengine_us/reforms/states/il/sb3567/il_sb3567_reform.py index f7b604b894c..182b8652a6d 100644 --- a/policyengine_us/reforms/states/il/sb3567/il_sb3567_reform.py +++ b/policyengine_us/reforms/states/il/sb3567/il_sb3567_reform.py @@ -30,7 +30,12 @@ def formula(tax_unit, period, parameters): person = tax_unit.members age = person("age", period) age_eligible_child = age < ctc.age_limit - federal_ctc_eligible_child = person("ctc_qualifying_child", period) + # The Illinois credit builds on the Illinois EITC, which does not + # require the filer's social security number, so the federal CTC + # filer identification requirements are not applied here. + federal_ctc_eligible_child = person( + "ctc_qualifying_child_ignoring_filer_identification", period + ) eligible_child = age_eligible_child & federal_ctc_eligible_child eligible_child_present = tax_unit.any(eligible_child) diff --git a/policyengine_us/reforms/states/mt/ctc/mt_ctc.py b/policyengine_us/reforms/states/mt/ctc/mt_ctc.py index 6f4f1ccddb1..5f0dc7798f0 100644 --- a/policyengine_us/reforms/states/mt/ctc/mt_ctc.py +++ b/policyengine_us/reforms/states/mt/ctc/mt_ctc.py @@ -13,6 +13,37 @@ def create_mt_ctc() -> Reform: - Phase-out by filing status (same as newborn credit) """ + class mt_ctc_qualifying_child(Variable): + value_type = bool + entity = Person + label = "Montana Child Tax Credit qualifying child" + definition_period = YEAR + defined_for = StateCode.MT + + def formula(person, period, parameters): + # Children who qualify for a federal section 24 credit (0-16), + # plus 17-year-old dependents. As in HB268, a child whose filer + # fails the federal filer SSN rule gets the credit for other + # dependents (IRC 24(h)(4)(C)), so both groups need only a filer + # SSN or ITIN (IRC 24(e)(2)). + age = person("age", period) + is_ctc_child = person( + "ctc_qualifying_child_ignoring_filer_identification", period + ) + is_17_dependent = (age == 17) & person("is_tax_unit_dependent", period) + filer_has_tin = person.tax_unit( + "filer_meets_ctc_identification_requirements", period + ) + return (is_ctc_child | is_17_dependent) & filer_has_tin + + class mt_ctc_qualifying_children(Variable): + value_type = int + entity = TaxUnit + label = "Montana Child Tax Credit qualifying children" + definition_period = YEAR + defined_for = StateCode.MT + adds = ["mt_ctc_qualifying_child"] + class mt_ctc(Variable): value_type = float entity = Person @@ -25,10 +56,7 @@ def formula(person, period, parameters): eligible = person.tax_unit("mt_ctc_eligible", period) p = parameters(period).gov.contrib.states.mt.ctc age = person("age", period) - # Include ctc_qualifying_child (0-16) plus 17-year-old dependents - is_ctc_child = person("ctc_qualifying_child", period) - is_17_dependent = (age == 17) & person("is_tax_unit_dependent", period) - is_qualifying = is_ctc_child | is_17_dependent + is_qualifying = person("mt_ctc_qualifying_child", period) # Calculate credit amount based on age brackets child_credit = p.amount.calc(age) * is_qualifying credit_amount = person.tax_unit.sum(child_credit) @@ -55,13 +83,7 @@ class mt_ctc_eligible(Variable): def formula(tax_unit, period, parameters): p = parameters(period).gov.contrib.states.mt.ctc # Must have at least one qualifying child (0-17) - has_ctc_child = tax_unit("ctc_qualifying_children", period) > 0 - person = tax_unit.members - age = person("age", period) - has_17_dependent = tax_unit.any( - (age == 17) & person("is_tax_unit_dependent", period) - ) - has_qualifying_child = has_ctc_child | has_17_dependent + has_qualifying_child = tax_unit("mt_ctc_qualifying_children", period) > 0 # Earned income requirement is optional earned_income_required = p.earned_income_requirement.in_effect earned_income = tax_unit("tax_unit_earned_income", period) @@ -83,6 +105,8 @@ def modify_parameters(parameters): class reform(Reform): def apply(self): + self.update_variable(mt_ctc_qualifying_child) + self.update_variable(mt_ctc_qualifying_children) self.update_variable(mt_ctc) self.update_variable(mt_ctc_eligible) self.modify_parameters(modify_parameters) diff --git a/policyengine_us/reforms/states/mt/hb268/mt_hb268.py b/policyengine_us/reforms/states/mt/hb268/mt_hb268.py index 23555da0bd7..2649b1a9bdb 100644 --- a/policyengine_us/reforms/states/mt/hb268/mt_hb268.py +++ b/policyengine_us/reforms/states/mt/hb268/mt_hb268.py @@ -4,6 +4,38 @@ def create_mt_hb268() -> Reform: + class mt_hb268_qualifying_child(Variable): + value_type = bool + entity = Person + label = "Montana HB268 qualifying child" + definition_period = YEAR + reference = ( + "https://leg.mt.gov/bills/2023/billpdf/HB0268.pdf", + "https://www.law.cornell.edu/uscode/text/26/24#h_4_C", + ) + defined_for = StateCode.MT + + def formula(person, period, parameters): + # HB 268 Section 1(1) requires a taxpayer "permitted a child tax + # credit under section 24 of the Internal Revenue Code". A child + # whose filer fails the federal filer SSN rule of IRC 24(h)(7) + # gets the credit for other dependents under IRC 24(h)(4)(C), so + # the child counts if the filer has an SSN or ITIN (IRC 24(e)(2)). + child = person("ctc_qualifying_child_ignoring_filer_identification", period) + filer_has_tin = person.tax_unit( + "filer_meets_ctc_identification_requirements", period + ) + return child & filer_has_tin + + class mt_hb268_qualifying_children(Variable): + value_type = int + entity = TaxUnit + label = "Montana HB268 qualifying children" + definition_period = YEAR + reference = "https://leg.mt.gov/bills/2023/billpdf/HB0268.pdf" + defined_for = StateCode.MT + adds = ["mt_hb268_qualifying_child"] + class mt_hb268(Variable): value_type = float entity = Person @@ -17,7 +49,7 @@ def formula(person, period, parameters): eligible = person.tax_unit("mt_hb268_eligible", period) p = parameters(period).gov.contrib.states.mt.hb268 # Only count qualifying children - is_qualifying = person("ctc_qualifying_child", period) + is_qualifying = person("mt_hb268_qualifying_child", period) age = person("age", period) child_credit = p.amount.calc(age) * is_qualifying credit_amount = person.tax_unit.sum(child_credit) @@ -43,7 +75,7 @@ def formula(tax_unit, period, parameters): p = parameters(period).gov.contrib.states.mt.hb268.income_limit # Per HB 268 Section 1(1), taxpayer must be "permitted a child # tax credit under section 24 of the Internal Revenue Code" - federal_ctc_eligible = tax_unit("ctc_qualifying_children", period) > 0 + federal_ctc_eligible = tax_unit("mt_hb268_qualifying_children", period) > 0 agi = tax_unit("adjusted_gross_income", period) agi_eligible = agi <= p.agi # CTC limited to filers with investment income below a certain threshold @@ -71,6 +103,8 @@ def modify_parameters(parameters): class reform(Reform): def apply(self): + self.update_variable(mt_hb268_qualifying_child) + self.update_variable(mt_hb268_qualifying_children) self.update_variable(mt_hb268) self.update_variable(mt_hb268_eligible) self.modify_parameters(modify_parameters) diff --git a/policyengine_us/reforms/states/ny/a04038/ny_a04038_enhanced_escc_infants.py b/policyengine_us/reforms/states/ny/a04038/ny_a04038_enhanced_escc_infants.py index ddfbad0a880..22429e9865a 100644 --- a/policyengine_us/reforms/states/ny/a04038/ny_a04038_enhanced_escc_infants.py +++ b/policyengine_us/reforms/states/ny/a04038/ny_a04038_enhanced_escc_infants.py @@ -32,9 +32,10 @@ def formula(tax_unit, period, parameters): person = tax_unit.members age = person("age", period) - # Post-2024 CTC rules (2025-2027) - qualifies_for_federal_ctc = person("ctc_qualifying_child", period) - qualifies = qualifies_for_federal_ctc & (age >= p.minimum_age) + # Post-2024 CTC rules (2025-2027). Use the baseline NY qualifying + # child (ny_ctc_post_2024_base), which allows ITIN holders and + # does not apply the federal filer SSN requirement. + qualifies = person("ny_escc_qualifying_child", period) # Calculate base credit amount by age credit_by_age = p.post_2024.amount.calc(age) diff --git a/policyengine_us/reforms/states/ut/ctc/ut_ctc_reform.py b/policyengine_us/reforms/states/ut/ctc/ut_ctc_reform.py index 1e76c9ae286..f0cd16a01b2 100644 --- a/policyengine_us/reforms/states/ut/ctc/ut_ctc_reform.py +++ b/policyengine_us/reforms/states/ut/ctc/ut_ctc_reform.py @@ -17,7 +17,14 @@ class ut_ctc_eligible_children(Variable): def formula(tax_unit, period, parameters): p = parameters(period).gov.states.ut.tax.income.credits.ctc person = tax_unit.members - ctc_eligible_child = person("ctc_qualifying_child", period) + # Same child test as the baseline ut_ctc_potential: any section + # 24 credit, including the credit for other dependents + # (IRC 24(h)(4)(C)), with a filer SSN or ITIN (IRC 24(e)(2)). + child = person("ctc_qualifying_child_ignoring_filer_identification", period) + filer_has_tin = person.tax_unit( + "filer_meets_ctc_identification_requirements", period + ) + ctc_eligible_child = child & filer_has_tin age = person("age", period) ut_child_age_eligible = p.child_age_threshold.calc(age) return tax_unit.sum(ctc_eligible_child & ut_child_age_eligible) diff --git a/policyengine_us/tests/policy/baseline/gov/irs/credits/ctc/maximum/ctc_qualifying_child.yaml b/policyengine_us/tests/policy/baseline/gov/irs/credits/ctc/maximum/ctc_qualifying_child.yaml index fc96d52a969..ace90b325ce 100644 --- a/policyengine_us/tests/policy/baseline/gov/irs/credits/ctc/maximum/ctc_qualifying_child.yaml +++ b/policyengine_us/tests/policy/baseline/gov/irs/credits/ctc/maximum/ctc_qualifying_child.yaml @@ -243,3 +243,133 @@ state_code: TX output: ctc_qualifying_child: [false, false, true] + +# IRC 24(h)(7)(A)(i): from 2025, no credit with respect to any qualifying child +# unless the return includes the taxpayer's SSN (on a joint return, at least one +# spouse's). The child is not counted, and gets the credit for other dependents +# instead (IRC 24(h)(4)(C)). Issue #9403. +- name: 2026 filer without an SSN has no CTC-qualifying child + period: 2026 + input: + people: + parent: + age: 35 + employment_income: 40_000 + ssn_card_type: NONE + child: + age: 8 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: TX + output: + ctc_qualifying_child: [false, false] + ctc_qualifying_child_ignoring_filer_identification: [false, true] + ctc_qualifying_children: 0 + ctc_child_individual_maximum: [0, 0] + ctc_adult_individual_maximum: [0, 500] + +- name: 2026 joint return where only one spouse has an SSN keeps the CTC-qualifying child + period: 2026 + input: + people: + head: + age: 35 + ssn_card_type: OTHER_NON_CITIZEN + spouse: + age: 35 + ssn_card_type: CITIZEN + child: + age: 8 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [head, spouse, child] + filing_status: JOINT + households: + household: + members: [head, spouse, child] + state_code: TX + output: + ctc_qualifying_child: [false, false, true] + ctc_qualifying_children: 1 + +- name: 2024 filer without an SSN keeps the CTC-qualifying child + # The filer SSN rule starts in 2025; before then the filer needs only a TIN. + period: 2024 + input: + people: + parent: + age: 35 + ssn_card_type: OTHER_NON_CITIZEN + child: + age: 8 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: TX + output: + ctc_qualifying_child: [false, true] + ctc_qualifying_children: 1 + +- name: 2024 filer without any TIN has no CTC-qualifying child + # IRC 24(e)(2): no credit unless the taxpayer has an identification number. + period: 2024 + input: + people: + parent: + age: 35 + ssn_card_type: NONE + has_tin: false + child: + age: 8 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: TX + output: + ctc_qualifying_child: [false, false] + ctc_qualifying_child_ignoring_filer_identification: [false, true] + ctc_qualifying_children: 0 + +- name: 2025 filer with an ITIN gets the credit for other dependents and no Worksheet B + # 2025 Schedule 8812 instructions: Credit Limit Worksheet B applies only if + # "Line 4 of Schedule 8812 is more than zero". + period: 2025 + input: + people: + parent: + age: 35 + employment_income: 40_000 + ssn_card_type: OTHER_NON_CITIZEN + child: + age: 8 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: TX + output: + ctc_qualifying_children: 0 + ctc_adult_individual_maximum: [0, 500] + ctc_credit_limit_worksheet_b_applies: false diff --git a/policyengine_us/tests/policy/baseline/gov/irs/credits/ctc/maximum/ctc_qualifying_child_ignoring_filer_identification.yaml b/policyengine_us/tests/policy/baseline/gov/irs/credits/ctc/maximum/ctc_qualifying_child_ignoring_filer_identification.yaml new file mode 100644 index 00000000000..e586250570d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/irs/credits/ctc/maximum/ctc_qualifying_child_ignoring_filer_identification.yaml @@ -0,0 +1,81 @@ +- name: Child of a filer without an SSN meets the qualifying child tests in 2026 + period: 2026 + input: + people: + parent: + age: 35 + ssn_card_type: NONE + child: + age: 8 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: TX + output: + ctc_qualifying_child_ignoring_filer_identification: [false, true] + +- name: Child aged 17 does not meet the qualifying child tests in 2026 + period: 2026 + input: + people: + parent: + age: 45 + ssn_card_type: NONE + child: + age: 17 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: TX + output: + ctc_qualifying_child_ignoring_filer_identification: [false, false] + +- name: Child without an SSN does not meet the qualifying child tests in 2026 + period: 2026 + input: + people: + parent: + age: 35 + child: + age: 8 + is_tax_unit_dependent: true + ssn_card_type: OTHER_NON_CITIZEN + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: TX + output: + ctc_qualifying_child_ignoring_filer_identification: [false, false] + +- name: Child of a filer who can be claimed as a dependent does not meet the qualifying child tests in 2026 + # IRC 24(a), 152(b)(1); Publication 501, Dependent Taxpayer Test. + period: 2026 + input: + people: + parent: + age: 20 + claimed_as_dependent_on_another_return: true + child: + age: 5 + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: TX + output: + ctc_qualifying_child_ignoring_filer_identification: [false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/irs/credits/recovery_rebate_credit/rrc_cares_qualifying_children_with_valid_ssn.yaml b/policyengine_us/tests/policy/baseline/gov/irs/credits/recovery_rebate_credit/rrc_cares_qualifying_children_with_valid_ssn.yaml new file mode 100644 index 00000000000..66820300c69 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/irs/credits/recovery_rebate_credit/rrc_cares_qualifying_children_with_valid_ssn.yaml @@ -0,0 +1,30 @@ +# IRC 6428(a)(2) counts each "qualifying child (within the meaning of section +# 24(c))", so the Child Tax Credit filer identification requirements do not apply +# (issue #9403). The rebate's own identification rules are in IRC 6428(g). +- name: CARES - Child of a joint return where one spouse has no TIN still counts + period: 2020 + input: + people: + head: + age: 35 + ssn_card_type: CITIZEN + spouse: + age: 35 + ssn_card_type: NONE + has_tin: false + child: + age: 8 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [head, spouse, child] + filing_status: JOINT + households: + household: + members: [head, spouse, child] + state_code: TX + output: + ctc_qualifying_children: 0 + rrc_cares_qualifying_children_with_valid_ssn: 1 + rrc_cares: 1_700 # 1_200 for the spouse with an SSN + 500 for the child diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/credits/id_ctc.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/credits/id_ctc.yaml index 9b0596d7c1d..89046ef1c12 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/credits/id_ctc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/credits/id_ctc.yaml @@ -1,7 +1,7 @@ - name: One child period: 2022 input: - ctc_qualifying_children: 1 + id_ctc_qualifying_children: 1 state_code: ID output: id_ctc: 205 @@ -9,7 +9,7 @@ - name: Family with 2 children period: 2018 input: - ctc_qualifying_children: 2 + id_ctc_qualifying_children: 2 state_code: ID output: id_ctc: 410 @@ -17,7 +17,7 @@ - name: No children period: 2022 input: - ctc_qualifying_children: 0 + id_ctc_qualifying_children: 0 state_code: ID output: id_ctc: 0 @@ -29,7 +29,7 @@ # $205 per qualifying child period: 2025 input: - ctc_qualifying_children: 1 + id_ctc_qualifying_children: 1 state_code: ID output: id_ctc: 205 @@ -38,7 +38,7 @@ # 3 children * $205 = $615 period: 2025 input: - ctc_qualifying_children: 3 + id_ctc_qualifying_children: 3 state_code: ID output: id_ctc: 615 @@ -46,7 +46,7 @@ - name: No children in 2025 period: 2025 input: - ctc_qualifying_children: 0 + id_ctc_qualifying_children: 0 state_code: ID output: id_ctc: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/credits/id_ctc_qualifying_children.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/credits/id_ctc_qualifying_children.yaml new file mode 100644 index 00000000000..a033d726e8f --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/credits/id_ctc_qualifying_children.yaml @@ -0,0 +1,69 @@ +# Idaho Code 63-3029L(1) gives "qualifying child" the meaning in IRC 24(c) and does +# not require the federal credit to be allowed, so a child whose filer fails the +# federal filer identification requirements still counts (issue #9403). +- name: Idaho counts the child of a filer without an SSN in 2025 + period: 2025 + input: + people: + parent: + age: 35 + employment_income: 40_000 + ssn_card_type: NONE + child: + age: 8 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: ID + output: + ctc_qualifying_children: 0 + id_ctc_qualifying_children: 1 + id_ctc: 205 + +- name: Idaho counts the child of a filer with an SSN in 2025 + period: 2025 + input: + people: + parent: + age: 35 + employment_income: 40_000 + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: ID + output: + ctc_qualifying_children: 1 + id_ctc_qualifying_children: 1 + id_ctc: 205 + +- name: Idaho does not count a child aged 17 in 2021 + # The 2021 federal expansion to age 17 is in IRC 24(i)(1), not 24(c). + period: 2021 + input: + people: + parent: + age: 45 + child: + age: 17 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: ID + output: + ctc_qualifying_children: 1 + id_ctc_qualifying_children: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/fairness/me_fairness_credit_qualifying_children.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/fairness/me_fairness_credit_qualifying_children.yaml new file mode 100644 index 00000000000..e9507a009cf --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/fairness/me_fairness_credit_qualifying_children.yaml @@ -0,0 +1,88 @@ +# 36 MRSA 5213-A(1)(A-1)(2) and 5219-KK(1)(A-1)(2)-(3) count each "qualifying child +# or dependent" for whom the filer can claim the federal credit under section 24, +# which includes the credit for other dependents. A child whose filer fails the +# Child Tax Credit SSN rule gets that credit (IRC 24(h)(4)(C)) if the filer has an +# SSN or ITIN, so the child still counts (issue #9403). +- name: Maine counts the child of a joint return where neither spouse has an SSN in 2025 + period: 2025 + input: + people: + head: + age: 35 + ssn_card_type: OTHER_NON_CITIZEN + spouse: + age: 35 + ssn_card_type: OTHER_NON_CITIZEN + child: + age: 8 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [head, spouse, child] + filing_status: JOINT + me_sales_and_property_tax_fairness_credit_income: 10_000 + households: + household: + members: [head, spouse, child] + state_code: ME + output: + ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 1 + me_sales_tax_fairness_credit: 250 + +- name: Maine does not count the child of a joint return where neither spouse has any TIN in 2025 + # No section 24 credit is allowed without a taxpayer identification number. + period: 2025 + input: + people: + head: + age: 35 + ssn_card_type: NONE + has_tin: false + spouse: + age: 35 + ssn_card_type: NONE + has_tin: false + child: + age: 8 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [head, spouse, child] + filing_status: JOINT + me_sales_and_property_tax_fairness_credit_income: 10_000 + households: + household: + members: [head, spouse, child] + state_code: ME + output: + ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 + me_sales_tax_fairness_credit: 215 + +- name: Maine counts the child of a joint return with SSNs in 2025 + period: 2025 + input: + people: + head: + age: 35 + spouse: + age: 35 + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, spouse, child] + filing_status: JOINT + me_sales_and_property_tax_fairness_credit_income: 10_000 + households: + household: + members: [head, spouse, child] + state_code: ME + output: + ctc_qualifying_children: 1 + me_fairness_credit_qualifying_children: 1 + me_sales_tax_fairness_credit: 250 diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_base_cap.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_base_cap.yaml index b8e5decd973..958676687d9 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_base_cap.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_base_cap.yaml @@ -4,7 +4,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 0 me_property_tax_fairness_credit_countable_rent_property_tax: 1_000 age_head: 66 @@ -18,7 +18,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 3 + me_fairness_credit_qualifying_children: 3 me_sales_and_property_tax_fairness_credit_income: 100_000 me_property_tax_fairness_credit_countable_rent_property_tax: 3_000 age_head: 66 @@ -32,7 +32,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 3 + me_fairness_credit_qualifying_children: 3 me_sales_and_property_tax_fairness_credit_income: 10_000 me_property_tax_fairness_credit_countable_rent_property_tax: 3_000 age_head: 66 @@ -46,7 +46,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 51_000 me_property_tax_fairness_credit_countable_rent_property_tax: 7_000 age_head: 66 @@ -60,7 +60,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 0 me_property_tax_fairness_credit_countable_rent_property_tax: 2_000 age_head: 64 @@ -74,7 +74,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 0 me_property_tax_fairness_credit_countable_rent_property_tax: 2_000 age_head: 64 @@ -88,7 +88,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 0 me_property_tax_fairness_credit_countable_rent_property_tax: 3_000 age_head: 65 @@ -106,7 +106,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 60_000 me_property_tax_fairness_credit_countable_rent_property_tax: 5_000 age_head: 66 @@ -124,7 +124,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 60_000 me_property_tax_fairness_credit_countable_rent_property_tax: 5_000 age_head: 65 @@ -138,7 +138,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 60_000 me_property_tax_fairness_credit_countable_rent_property_tax: 5_000 age_head: 64 @@ -152,7 +152,7 @@ input: state_code: ME filing_status: JOINT - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 60_000 me_property_tax_fairness_credit_countable_rent_property_tax: 5_000 age_head: 60 @@ -172,7 +172,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 60_000 me_property_tax_fairness_credit_countable_rent_property_tax: 5_000 age_head: 66 diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_benefit_base.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_benefit_base.yaml index 0f05822f6e1..1b3c06d0827 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_benefit_base.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_benefit_base.yaml @@ -3,7 +3,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 output: me_property_tax_fairness_credit_benefit_base: 2_100 @@ -13,7 +13,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 3 + me_fairness_credit_qualifying_children: 3 output: me_property_tax_fairness_credit_benefit_base: 2_200 @@ -23,7 +23,7 @@ input: state_code: ME filing_status: JOINT - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 output: me_property_tax_fairness_credit_benefit_base: 2_750 @@ -33,7 +33,7 @@ input: state_code: ME filing_status: JOINT - ctc_qualifying_children: 1 + me_fairness_credit_qualifying_children: 1 output: me_property_tax_fairness_credit_benefit_base: 3_450 @@ -43,7 +43,7 @@ input: state_code: ME filing_status: HEAD_OF_HOUSEHOLD - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 output: me_property_tax_fairness_credit_benefit_base: 3_000 @@ -54,7 +54,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 output: me_property_tax_fairness_credit_benefit_base: 2_550 @@ -63,7 +63,7 @@ input: state_code: ME filing_status: JOINT - ctc_qualifying_children: 2 + me_fairness_credit_qualifying_children: 2 output: me_property_tax_fairness_credit_benefit_base: 4_050 @@ -72,7 +72,7 @@ input: state_code: ME filing_status: HEAD_OF_HOUSEHOLD - ctc_qualifying_children: 1 + me_fairness_credit_qualifying_children: 1 output: me_property_tax_fairness_credit_benefit_base: 3_300 diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_eligible.yaml index f32dbd63d7d..137b96af466 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/property_tax_fairness_credit/me_property_tax_fairness_credit_eligible.yaml @@ -4,7 +4,7 @@ state_code: ME me_sales_and_property_tax_fairness_credit_income: 0 filing_status: SEPARATE - ctc_qualifying_children: 2 + me_fairness_credit_qualifying_children: 2 output: me_property_tax_fairness_credit_eligible: false @@ -13,7 +13,7 @@ input: state_code: ME filing_status: SINGLE - ctc_qualifying_children: 4 + me_fairness_credit_qualifying_children: 4 output: me_property_tax_fairness_credit_eligible: true @@ -22,6 +22,6 @@ input: state_code: ME filing_status: HEAD_OF_HOUSEHOLD - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 output: me_property_tax_fairness_credit_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/sales_tax_fairness_credit/me_sales_tax_fairness_credit.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/sales_tax_fairness_credit/me_sales_tax_fairness_credit.yaml index dcfd7467a15..b871586dbdd 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/sales_tax_fairness_credit/me_sales_tax_fairness_credit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/sales_tax_fairness_credit/me_sales_tax_fairness_credit.yaml @@ -2,7 +2,7 @@ period: 2022 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 1 + me_fairness_credit_qualifying_children: 1 filing_status: SEPARATE me_sales_and_property_tax_fairness_credit_income: 0 output: @@ -12,7 +12,7 @@ period: 2022 input: me_sales_tax_fairness_credit_eligible: false - ctc_qualifying_children: 1 + me_fairness_credit_qualifying_children: 1 filing_status: SINGLE me_sales_and_property_tax_fairness_credit_income: 0 output: @@ -22,7 +22,7 @@ period: 2022 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 filing_status: JOINT me_sales_and_property_tax_fairness_credit_income: 0 output: @@ -32,7 +32,7 @@ period: 2022 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 4 + me_fairness_credit_qualifying_children: 4 filing_status: JOINT me_sales_and_property_tax_fairness_credit_income: 0 output: @@ -42,7 +42,7 @@ period: 2022 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 4 + me_fairness_credit_qualifying_children: 4 filing_status: JOINT me_sales_and_property_tax_fairness_credit_income: 51_700 output: @@ -52,7 +52,7 @@ period: 2022 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 3 + me_fairness_credit_qualifying_children: 3 filing_status: SINGLE me_sales_and_property_tax_fairness_credit_income: 25_350 output: @@ -62,7 +62,7 @@ period: 2022 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 3 + me_fairness_credit_qualifying_children: 3 filing_status: SINGLE me_sales_and_property_tax_fairness_credit_income: 50_000 output: @@ -72,7 +72,7 @@ period: 2025 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 2 + me_fairness_credit_qualifying_children: 2 filing_status: JOINT me_sales_and_property_tax_fairness_credit_income: 52_630 output: @@ -85,7 +85,7 @@ period: 2025 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 filing_status: JOINT me_sales_and_property_tax_fairness_credit_income: 0 output: @@ -95,7 +95,7 @@ period: 2025 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 filing_status: HEAD_OF_HOUSEHOLD me_sales_and_property_tax_fairness_credit_income: 0 output: @@ -105,7 +105,7 @@ period: 2025 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 filing_status: SURVIVING_SPOUSE me_sales_and_property_tax_fairness_credit_income: 0 output: @@ -115,7 +115,7 @@ period: 2025 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 1 + me_fairness_credit_qualifying_children: 1 filing_status: JOINT me_sales_and_property_tax_fairness_credit_income: 0 output: @@ -125,7 +125,7 @@ period: 2025 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 filing_status: SINGLE me_sales_and_property_tax_fairness_credit_income: 0 output: @@ -138,7 +138,7 @@ period: 2024 input: me_sales_tax_fairness_credit_eligible: true - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 filing_status: JOINT me_sales_and_property_tax_fairness_credit_income: 0 output: diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/integration.yaml index b0f8b96acc2..c72d4c3b14f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/tax/income/integration.yaml @@ -57,7 +57,7 @@ input: state_code: ME filing_status: JOINT - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 0 me_property_tax_fairness_credit_countable_rent_property_tax: 3_000 age_head: 64 @@ -71,7 +71,7 @@ input: state_code: ME filing_status: JOINT - ctc_qualifying_children: 0 + me_fairness_credit_qualifying_children: 0 me_sales_and_property_tax_fairness_credit_income: 0 me_property_tax_fairness_credit_countable_rent_property_tax: 3_000 age_head: 60 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_child_deduction.yaml b/policyengine_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_child_deduction.yaml index f7491264cb2..392db18f429 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_child_deduction.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_child_deduction.yaml @@ -58,13 +58,14 @@ output: nc_child_deduction: 2_000 * 1 -# Regression guard for the #6374 NC resolution: NC is a static IRC-conformity state -# (conformed to the Code as of Jan 1, 2023, N.C. Gen. Stat. 105-228.90(b)(1b)), so it -# does NOT import the OBBBA (July 2025) filer-SSN gate on section 24. An ITIN filer -# whose qualifying child has a valid SSN still receives the NC child deduction, because -# nc_child_deduction keys on ctc_qualifying_children (child-SSN gate only), not the -# federal filer-SSN gate. Fails if a filer-SSN gate is ever propagated into the NC count. -- name: NC child deduction counts an SSN-holding child of an ITIN filer in 2025 +# G.S. 105-153.5(a1) allows the deduction for each qualifying child "for whom the +# taxpayer is allowed the federal tax credit" under section 24 of the Code. S.L. +# 2026-31, Section 12.(a), moved the Code date in G.S. 105-228.90(b)(7) from +# January 1, 2023 to July 5, 2025, which includes the One Big Beautiful Bill Act's +# filer social security number rule in IRC 24(h)(7)(A)(i). An ITIN filer whose child +# has a valid SSN is not allowed the federal credit for that child from 2025, so the +# NC child deduction is zero (issue #9403). +- name: NC child deduction excludes the SSN-holding child of an ITIN filer in 2025 period: 2025 input: people: @@ -84,6 +85,59 @@ household: members: [parent, child] state_code: NC + output: + ctc_qualifying_children: 0 + nc_child_deduction: 0 + +- name: NC child deduction counts the SSN-holding child of an ITIN filer in 2024 + # The filer social security number rule starts in 2025. + period: 2024 + input: + people: + parent: + age: 40 + ssn_card_type: OTHER_NON_CITIZEN + child: + age: 5 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [parent, child] + filing_status: HEAD_OF_HOUSEHOLD + adjusted_gross_income: 25_000 + households: + household: + members: [parent, child] + state_code: NC + output: + ctc_qualifying_children: 1 + nc_child_deduction: 3_000 + +- name: NC child deduction counts the child of a joint return where one spouse has an SSN in 2025 + # IRC 24(h)(7)(A)(i): on a joint return, the SSN of at least one spouse. + period: 2025 + input: + people: + head: + age: 40 + ssn_card_type: OTHER_NON_CITIZEN + spouse: + age: 40 + ssn_card_type: CITIZEN + child: + age: 5 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [head, spouse, child] + filing_status: JOINT + adjusted_gross_income: 35_000 + households: + household: + members: [head, spouse, child] + state_code: NC output: ctc_qualifying_children: 1 nc_child_deduction: 3_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/credits/ny_ctc_pre_2024.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/credits/ny_ctc_pre_2024.yaml index 03b750ec757..fc5b0be20ef 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/credits/ny_ctc_pre_2024.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/tax/income/credits/ny_ctc_pre_2024.yaml @@ -220,3 +220,49 @@ # taxes, so the refundable part is zero, and the credit is 33% of the # $2,992 of tax the nonrefundable part is limited to (Sol review r4). ny_ctc_pre_2024: 987.36 + +# Tax Law 606(c-1) uses section 24 as it existed before Public Law 115-97, which +# requires the filer's identification number (IRC 24(e)), and the IT-213 +# instructions require "a valid Social Security number (SSN) or IRS individual +# taxpayer identification number (ITIN)" for the filer (issue #9403). +- name: Case 5, parent with an ITIN and a four-year-old child gets the credit in 2023 + period: 2023 + input: + people: + parent: + age: 30 + employment_income: 25_000 + ssn_card_type: NONE + child: + age: 4 + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: NY + output: + ny_ctc_pre_2024: 330 + +- name: Case 6, parent without any TIN and a four-year-old child gets no credit in 2023 + period: 2023 + input: + people: + parent: + age: 30 + employment_income: 25_000 + ssn_card_type: NONE + has_tin: false + child: + age: 4 + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: NY + output: + ny_ctc_pre_2024_eligible: false + ny_ctc_pre_2024: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ut/tax/income/credits/ut_ctc.yaml b/policyengine_us/tests/policy/baseline/gov/states/ut/tax/income/credits/ut_ctc.yaml index 38aabc2b227..2effb474100 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ut/tax/income/credits/ut_ctc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ut/tax/income/credits/ut_ctc.yaml @@ -4,11 +4,11 @@ people: person1: age: 45 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_exempt_interest_income: 0 person2: age: 2 - ctc_qualifying_child: true + ctc_qualifying_child_ignoring_filer_identification: true tax_units: tax_unit: members: @@ -31,11 +31,11 @@ people: person1: age: 45 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_exempt_interest_income: 0 person2: age: 0 - ctc_qualifying_child: true + ctc_qualifying_child_ignoring_filer_identification: true tax_units: tax_unit: members: @@ -58,11 +58,11 @@ people: person1: age: 45 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_exempt_interest_income: 0 person2: age: 3 - ctc_qualifying_child: true + ctc_qualifying_child_ignoring_filer_identification: true tax_units: tax_unit: members: @@ -85,11 +85,11 @@ people: person1: age: 45 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_exempt_interest_income: 0 person2: age: 3 - ctc_qualifying_child: true + ctc_qualifying_child_ignoring_filer_identification: true tax_units: tax_unit: members: @@ -112,14 +112,14 @@ people: person1: age: 45 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_exempt_interest_income: 0 person2: age: 3 - ctc_qualifying_child: true + ctc_qualifying_child_ignoring_filer_identification: true person3: age: 2 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_units: tax_unit: members: @@ -144,14 +144,14 @@ people: person1: age: 45 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_exempt_interest_income: 0 person2: age: 3 - ctc_qualifying_child: true + ctc_qualifying_child_ignoring_filer_identification: true person3: age: 2 - ctc_qualifying_child: true + ctc_qualifying_child_ignoring_filer_identification: true tax_units: tax_unit: members: @@ -176,14 +176,14 @@ people: person1: age: 45 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_exempt_interest_income: 1000 person2: age: 3 - ctc_qualifying_child: true + ctc_qualifying_child_ignoring_filer_identification: true person3: age: 2 - ctc_qualifying_child: true + ctc_qualifying_child_ignoring_filer_identification: true tax_units: tax_unit: members: @@ -208,11 +208,11 @@ people: person1: age: 45 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_exempt_interest_income: 0 person2: age: 0 - ctc_qualifying_child: true + ctc_qualifying_child_ignoring_filer_identification: true tax_units: tax_unit: members: @@ -235,11 +235,11 @@ people: person1: age: 45 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_exempt_interest_income: 0 person2: age: 5 - ctc_qualifying_child: true + ctc_qualifying_child_ignoring_filer_identification: true tax_units: tax_unit: members: @@ -262,11 +262,11 @@ people: person1: age: 45 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_exempt_interest_income: 0 person2: age: 6 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_units: tax_unit: members: @@ -289,15 +289,15 @@ people: person1: age: 40 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_exempt_interest_income: 0 person2: age: 38 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_exempt_interest_income: 0 person3: age: 3 - ctc_qualifying_child: true + ctc_qualifying_child_ignoring_filer_identification: true tax_units: tax_unit: members: @@ -322,11 +322,11 @@ people: person1: age: 35 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_exempt_interest_income: 0 person2: age: 4 - ctc_qualifying_child: true + ctc_qualifying_child_ignoring_filer_identification: true tax_units: tax_unit: members: @@ -349,11 +349,11 @@ people: person1: age: 35 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_exempt_interest_income: 0 person2: age: 3 - ctc_qualifying_child: true + ctc_qualifying_child_ignoring_filer_identification: true tax_units: tax_unit: members: @@ -376,11 +376,11 @@ people: person1: age: 35 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_exempt_interest_income: 0 person2: age: 2 - ctc_qualifying_child: true + ctc_qualifying_child_ignoring_filer_identification: true tax_units: tax_unit: members: @@ -397,3 +397,97 @@ state_code: UT output: ut_ctc: 500 +# Utah Code 59-10-1047(1)(e) counts a child "with respect to whom the claimant is +# allowed to claim a tax credit under Section 24". From 2025 a filer without an +# SSN cannot claim the federal child tax credit (IRC 24(h)(7)(A)(i)), but IRC +# 24(h)(4)(C) gives the credit for other dependents for that child, so the child +# still counts if the filer has an SSN or ITIN. A filer without any TIN gets no +# section 24 credit (IRC 24(e)(2)) (issue #9403). +- name: Head of household with an ITIN and 1 child gets the Utah CTC in 2026 + period: 2026 + input: + people: + person1: + age: 35 + ssn_card_type: OTHER_NON_CITIZEN + tax_exempt_interest_income: 0 + person2: + age: 3 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: + - person1 + - person2 + ut_total_income: 1000 + filing_status: HEAD_OF_HOUSEHOLD + ut_income_tax_before_non_refundable_credits: 1000000 + households: + household: + members: + - person1 + - person2 + state_code: UT + output: + ctc_qualifying_children: 0 + ut_ctc: 1_000 +- name: Head of household without any TIN and 1 child gets no Utah CTC in 2026 + period: 2026 + input: + people: + person1: + age: 35 + ssn_card_type: NONE + has_tin: false + tax_exempt_interest_income: 0 + person2: + age: 3 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: + - person1 + - person2 + ut_total_income: 1000 + filing_status: HEAD_OF_HOUSEHOLD + ut_income_tax_before_non_refundable_credits: 1000000 + households: + household: + members: + - person1 + - person2 + state_code: UT + output: + ctc_qualifying_children: 0 + ut_ctc: 0 +- name: Head of household with an SSN and 1 child gets the Utah CTC in 2026 + period: 2026 + input: + people: + person1: + age: 35 + ssn_card_type: CITIZEN + tax_exempt_interest_income: 0 + person2: + age: 3 + is_tax_unit_dependent: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: + - person1 + - person2 + ut_total_income: 1000 + filing_status: HEAD_OF_HOUSEHOLD + ut_income_tax_before_non_refundable_credits: 1000000 + households: + household: + members: + - person1 + - person2 + state_code: UT + output: + ctc_qualifying_children: 1 + ut_ctc: 1_000 diff --git a/policyengine_us/tests/policy/contrib/congress/afa/afa_other_dependent_credit.yaml b/policyengine_us/tests/policy/contrib/congress/afa/afa_other_dependent_credit.yaml index 32f9bb5f625..2729984aff8 100644 --- a/policyengine_us/tests/policy/contrib/congress/afa/afa_other_dependent_credit.yaml +++ b/policyengine_us/tests/policy/contrib/congress/afa/afa_other_dependent_credit.yaml @@ -165,6 +165,53 @@ ctc_refundable_maximum: 3_600 ctc: 2_000 +- name: Integration test - CTC partially phased out, head with an ITIN + # Proposed section 24A has no filer SSN rule (24A(e)(2) asks only for a timely + # taxpayer TIN), so the $2,000-per-child floor still applies (issue #9403). + period: 2025 + reforms: policyengine_us.reforms.congress.afa.afa_other_dependent_credit.afa_other_dependent_credit + input: + gov.contrib.congress.afa.in_effect: true + people: + head: + age: 30 + is_tax_unit_dependent: false + employment_income: 300_000 + ssn_card_type: NONE + has_itin: true + person2: + age: 16 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, person2] + output: + ctc_qualifying_children: 0 + refundable_ctc: 2_000 + ctc: 2_000 + +- name: Integration test - CTC at $150,000, head with an ITIN + period: 2025 + reforms: policyengine_us.reforms.congress.afa.afa_other_dependent_credit.afa_other_dependent_credit + input: + gov.contrib.congress.afa.in_effect: true + people: + head: + age: 30 + is_tax_unit_dependent: false + employment_income: 150_000 + ssn_card_type: NONE + has_itin: true + person2: + age: 16 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, person2] + output: + refundable_ctc: 2_000 + ctc: 2_000 + - name: Integration test - CTC partially phased out, 2 kids period: 2025 reforms: policyengine_us.reforms.congress.afa.afa_other_dependent_credit.afa_other_dependent_credit diff --git a/policyengine_us/tests/policy/contrib/refundable_credit_conversion/dependent_definition.yaml b/policyengine_us/tests/policy/contrib/refundable_credit_conversion/dependent_definition.yaml index 19174c7bdf4..4563c1fee62 100644 --- a/policyengine_us/tests/policy/contrib/refundable_credit_conversion/dependent_definition.yaml +++ b/policyengine_us/tests/policy/contrib/refundable_credit_conversion/dependent_definition.yaml @@ -128,6 +128,10 @@ people: filer: age: 38 + # The filer meets the CTC filer SSN requirement, so the child is + # CTC-qualifying (an input set only on the child would default the + # filer to false). + meets_ctc_identification_requirements: true child: age: 5 meets_eitc_identification_requirements: false diff --git a/policyengine_us/tests/policy/contrib/states/id/ctc/id_ctc_reform.yaml b/policyengine_us/tests/policy/contrib/states/id/ctc/id_ctc_reform.yaml index e191a130705..3a23b9ced25 100644 --- a/policyengine_us/tests/policy/contrib/states/id/ctc/id_ctc_reform.yaml +++ b/policyengine_us/tests/policy/contrib/states/id/ctc/id_ctc_reform.yaml @@ -9,7 +9,7 @@ absolute_error_margin: 0.01 input: state_code: ID - ctc_qualifying_children: 2 + id_ctc_qualifying_children: 2 id_income_tax_before_non_refundable_credits: 1_000 output: # id_ctc still computes 2 * 205 = 410 as a worksheet amount, but it is not @@ -23,7 +23,7 @@ input: gov.contrib.states.id.ctc.in_effect: true state_code: ID - ctc_qualifying_children: 2 + id_ctc_qualifying_children: 2 id_income_tax_before_non_refundable_credits: 1_000 output: # Revived list is [id_ctc]; applied = min(410, 1000) = 410. Refundable off. @@ -38,7 +38,7 @@ gov.contrib.states.id.ctc.in_effect: true gov.contrib.states.id.ctc.refundable.in_effect: true state_code: ID - ctc_qualifying_children: 2 + id_ctc_qualifying_children: 2 id_income_tax_before_non_refundable_credits: 0 output: # potential 410, nonrefundable 0 (no liability), unused 410, @@ -54,7 +54,7 @@ gov.contrib.states.id.ctc.refundable.in_effect: true gov.contrib.states.id.ctc.refundable.amount: 100 state_code: ID - ctc_qualifying_children: 2 + id_ctc_qualifying_children: 2 id_income_tax_before_non_refundable_credits: 0 output: # refund = min(410 unused, 100 * 2) = 200. @@ -68,7 +68,7 @@ gov.contrib.states.id.ctc.in_effect: true gov.states.id.tax.income.credits.ctc.amount: 300 state_code: ID - ctc_qualifying_children: 2 + id_ctc_qualifying_children: 2 id_income_tax_before_non_refundable_credits: 1_000 output: id_ctc: 600 diff --git a/policyengine_us/tests/policy/contrib/states/il/sb3567/il_sb3567.yaml b/policyengine_us/tests/policy/contrib/states/il/sb3567/il_sb3567.yaml index d7d2e2ed494..281cceff2be 100644 --- a/policyengine_us/tests/policy/contrib/states/il/sb3567/il_sb3567.yaml +++ b/policyengine_us/tests/policy/contrib/states/il/sb3567/il_sb3567.yaml @@ -13,7 +13,6 @@ age: 30 child: age: 8 - ctc_qualifying_child: true is_qualifying_child_dependent: true is_tax_unit_dependent: true meets_eitc_identification_requirements: true @@ -32,6 +31,37 @@ output: il_ctc: 346.24 +- name: SB3567 boosts an ITIN filer to the maximum one-child credit in 2025 + # The Illinois EITC accepts ITIN filers, so the federal CTC filer SSN rule + # does not remove the child (issue #9403). + period: 2025 + absolute_error_margin: 0.01 + reforms: policyengine_us.reforms.states.il.sb3567.il_sb3567 + input: + gov.contrib.states.il.sb3567.in_effect: true + people: + filer: + age: 30 + ssn_card_type: OTHER_NON_CITIZEN + child: + age: 8 + is_qualifying_child_dependent: true + is_tax_unit_dependent: true + meets_eitc_identification_requirements: true + tax_units: + tax_unit: + members: [filer, child] + adjusted_gross_income: 12_000 + il_income_tax_before_non_refundable_credits: 1_000 + il_eitc: 200 + households: + household: + members: [filer, child] + state_code: IL + output: + ctc_qualifying_children: 0 + il_ctc: 346.24 + - name: SB3567 preserves the 2024 flat-credit formula period: 2024 absolute_error_margin: 0.01 @@ -43,7 +73,6 @@ age: 30 child: age: 8 - ctc_qualifying_child: true is_tax_unit_dependent: true tax_units: tax_unit: @@ -72,25 +101,21 @@ age: 32 child1: age: 9 - ctc_qualifying_child: true is_qualifying_child_dependent: true is_tax_unit_dependent: true meets_eitc_identification_requirements: true child2: age: 7 - ctc_qualifying_child: true is_qualifying_child_dependent: true is_tax_unit_dependent: true meets_eitc_identification_requirements: true child3: age: 5 - ctc_qualifying_child: true is_qualifying_child_dependent: true is_tax_unit_dependent: true meets_eitc_identification_requirements: true child4: age: 3 - ctc_qualifying_child: true is_qualifying_child_dependent: true is_tax_unit_dependent: true meets_eitc_identification_requirements: true @@ -120,7 +145,6 @@ age: 33 child: age: 6 - ctc_qualifying_child: true is_qualifying_child_dependent: true is_tax_unit_dependent: true meets_eitc_identification_requirements: true @@ -150,7 +174,6 @@ age: 34 child: age: 4 - ctc_qualifying_child: true is_qualifying_child_dependent: true is_tax_unit_dependent: true meets_eitc_identification_requirements: true @@ -179,7 +202,6 @@ age: 35 child: age: 12 - ctc_qualifying_child: true is_tax_unit_dependent: true tax_units: tax_unit: @@ -209,7 +231,6 @@ age: 36 child: age: 5 - ctc_qualifying_child: true is_qualifying_child_dependent: true is_tax_unit_dependent: true meets_eitc_identification_requirements: true @@ -249,7 +270,6 @@ age: 30 child: age: 8 - ctc_qualifying_child: true is_tax_unit_dependent: true tax_units: tax_unit: @@ -281,7 +301,6 @@ age: 30 child: age: 8 - ctc_qualifying_child: true is_qualifying_child_dependent: true is_tax_unit_dependent: true meets_eitc_identification_requirements: true @@ -310,13 +329,11 @@ age: 31 child1: age: 7 - ctc_qualifying_child: true is_qualifying_child_dependent: true is_tax_unit_dependent: true meets_eitc_identification_requirements: true child2: age: 5 - ctc_qualifying_child: true is_qualifying_child_dependent: true is_tax_unit_dependent: true meets_eitc_identification_requirements: true @@ -346,13 +363,11 @@ age: 32 child1: age: 6 - ctc_qualifying_child: true is_qualifying_child_dependent: true is_tax_unit_dependent: true meets_eitc_identification_requirements: true child2: age: 4 - ctc_qualifying_child: true is_qualifying_child_dependent: true is_tax_unit_dependent: true meets_eitc_identification_requirements: true @@ -382,13 +397,11 @@ age: 32 child1: age: 6 - ctc_qualifying_child: true is_qualifying_child_dependent: true is_tax_unit_dependent: true meets_eitc_identification_requirements: true child2: age: 4 - ctc_qualifying_child: true is_qualifying_child_dependent: true is_tax_unit_dependent: true meets_eitc_identification_requirements: true @@ -417,7 +430,6 @@ age: 30 child: age: 8 - ctc_qualifying_child: true is_qualifying_child_dependent: true is_tax_unit_dependent: true meets_eitc_identification_requirements: true @@ -447,7 +459,6 @@ age: 30 child: age: 8 - ctc_qualifying_child: true is_qualifying_child_dependent: true is_tax_unit_dependent: true meets_eitc_identification_requirements: true @@ -479,7 +490,6 @@ age: 30 child: age: 8 - ctc_qualifying_child: true is_qualifying_child_dependent: true is_tax_unit_dependent: true meets_eitc_identification_requirements: true @@ -532,13 +542,11 @@ age: 28 child1: age: 7 - ctc_qualifying_child: true is_qualifying_child_dependent: true is_tax_unit_dependent: true meets_eitc_identification_requirements: true child2: age: 5 - ctc_qualifying_child: true is_qualifying_child_dependent: true is_tax_unit_dependent: true meets_eitc_identification_requirements: true diff --git a/policyengine_us/tests/policy/contrib/states/mt/ctc/mt_ctc.yaml b/policyengine_us/tests/policy/contrib/states/mt/ctc/mt_ctc.yaml index 47dd1760ea8..eb350755f35 100644 --- a/policyengine_us/tests/policy/contrib/states/mt/ctc/mt_ctc.yaml +++ b/policyengine_us/tests/policy/contrib/states/mt/ctc/mt_ctc.yaml @@ -103,7 +103,7 @@ gov.contrib.states.mt.ctc.earned_income_requirement.in_effect: true tax_unit_earned_income: 1 adjusted_gross_income: 1 - ctc_qualifying_children: 1 + mt_ctc_qualifying_children: 1 state_code: MT output: mt_ctc_eligible: true @@ -116,7 +116,7 @@ gov.contrib.states.mt.ctc.earned_income_requirement.in_effect: true tax_unit_earned_income: 0 adjusted_gross_income: 50_000 - ctc_qualifying_children: 1 + mt_ctc_qualifying_children: 1 state_code: MT output: mt_ctc_eligible: false @@ -129,7 +129,7 @@ gov.contrib.states.mt.ctc.earned_income_requirement.in_effect: false tax_unit_earned_income: 0 adjusted_gross_income: 50_000 - ctc_qualifying_children: 1 + mt_ctc_qualifying_children: 1 state_code: MT output: mt_ctc_eligible: true @@ -290,7 +290,7 @@ gov.contrib.states.mt.ctc.in_effect: true tax_unit_earned_income: 50_000 adjusted_gross_income: 50_000 - ctc_qualifying_children: 0 + mt_ctc_qualifying_children: 0 state_code: MT output: mt_ctc_eligible: false diff --git a/policyengine_us/tests/policy/contrib/states/mt/hb268/mt_hb268.yaml b/policyengine_us/tests/policy/contrib/states/mt/hb268/mt_hb268.yaml index 281da967a72..da5b9fe131c 100644 --- a/policyengine_us/tests/policy/contrib/states/mt/hb268/mt_hb268.yaml +++ b/policyengine_us/tests/policy/contrib/states/mt/hb268/mt_hb268.yaml @@ -84,7 +84,7 @@ tax_unit_earned_income: 66_298 adjusted_gross_income: 55_999 eitc_relevant_investment_income: 10_299 - ctc_qualifying_children: 1 + mt_hb268_qualifying_children: 1 state_code: MT output: mt_hb268_eligible: true @@ -97,7 +97,7 @@ tax_unit_earned_income: 66_300 adjusted_gross_income: 56_001 eitc_relevant_investment_income: 10_299 - ctc_qualifying_children: 1 + mt_hb268_qualifying_children: 1 state_code: MT output: mt_hb268_eligible: false @@ -110,7 +110,7 @@ tax_unit_earned_income: 66_300 adjusted_gross_income: 56_000 eitc_relevant_investment_income: 10_300 - ctc_qualifying_children: 1 + mt_hb268_qualifying_children: 1 state_code: MT output: mt_hb268_eligible: false @@ -123,7 +123,7 @@ tax_unit_earned_income: 0 adjusted_gross_income: 0 eitc_relevant_investment_income: 0 - ctc_qualifying_children: 1 + mt_hb268_qualifying_children: 1 state_code: MT output: mt_hb268_eligible: false @@ -136,7 +136,7 @@ tax_unit_earned_income: 50_000 adjusted_gross_income: 50_000 eitc_relevant_investment_income: 0 - ctc_qualifying_children: 0 + mt_hb268_qualifying_children: 0 state_code: MT output: mt_hb268_eligible: false @@ -149,7 +149,7 @@ tax_unit_earned_income: 56_000 adjusted_gross_income: 56_000 eitc_relevant_investment_income: 0 - ctc_qualifying_children: 1 + mt_hb268_qualifying_children: 1 state_code: MT output: mt_hb268_eligible: true @@ -162,7 +162,7 @@ tax_unit_earned_income: 1 adjusted_gross_income: 1 eitc_relevant_investment_income: 0 - ctc_qualifying_children: 1 + mt_hb268_qualifying_children: 1 state_code: MT output: mt_hb268_eligible: true @@ -326,3 +326,55 @@ output: mt_hb268_eligible: true mt_hb268: [1_200, 0] + +# HB 268 Section 1(1) requires a taxpayer "permitted a child tax credit under +# section 24". A child whose filer fails the federal filer SSN rule gets the +# credit for other dependents (IRC 24(h)(4)(C)), so the child still counts if the +# filer has an SSN or ITIN (issue #9403). +- name: Filer with an ITIN keeps the qualifying child in 2025 + period: 2025 + reforms: policyengine_us.reforms.states.mt.hb268.mt_hb268.mt_hb268 + input: + gov.contrib.states.mt.hb268.in_effect: true + people: + head: + age: 34 + ssn_card_type: OTHER_NON_CITIZEN + dep1: + age: 3 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, dep1] + households: + household: + members: [head, dep1] + state_code: MT + output: + ctc_qualifying_children: 0 + mt_hb268_qualifying_child: [false, true] + mt_hb268_qualifying_children: 1 + +- name: Filer without any TIN has no qualifying child in 2025 + period: 2025 + reforms: policyengine_us.reforms.states.mt.hb268.mt_hb268.mt_hb268 + input: + gov.contrib.states.mt.hb268.in_effect: true + people: + head: + age: 34 + ssn_card_type: NONE + has_tin: false + dep1: + age: 3 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, dep1] + households: + household: + members: [head, dep1] + state_code: MT + output: + mt_hb268_qualifying_children: 0 + mt_hb268_eligible: false diff --git a/policyengine_us/tests/policy/contrib/states/ny/a04038/ny_a04038_enhanced_escc_infants.yaml b/policyengine_us/tests/policy/contrib/states/ny/a04038/ny_a04038_enhanced_escc_infants.yaml index 1a8d6c471e4..1796e6e6c9e 100644 --- a/policyengine_us/tests/policy/contrib/states/ny/a04038/ny_a04038_enhanced_escc_infants.yaml +++ b/policyengine_us/tests/policy/contrib/states/ny/a04038/ny_a04038_enhanced_escc_infants.yaml @@ -28,6 +28,34 @@ ny_ctc_post_2024_base: 2_000 # Child age 1 gets standard credit (no doubling) +# The baseline NY child test (ny_escc_qualifying_child) accepts an ITIN, so the +# reform does too (issue #9403). +- name: Infant with an ITIN of a filer with an ITIN gets doubled credit + period: 2026 + reforms: policyengine_us.reforms.states.ny.a04038.ny_a04038_enhanced_escc_infants.ny_a04038_enhanced_escc_infants + input: + gov.contrib.states.ny.a04038.in_effect: true + people: + person1: + age: 35 + is_tax_unit_head: true + employment_income: 50_000 + ssn_card_type: OTHER_NON_CITIZEN + infant: + age: 0 + is_tax_unit_dependent: true + ssn_card_type: OTHER_NON_CITIZEN + tax_units: + tax_unit: + members: [person1, infant] + households: + household: + members: [person1, infant] + state_code: NY + output: + ctc_qualifying_children: 0 + ny_ctc_post_2024_base: 2_000 + - name: Child age 1 gets standard credit period: 2026 reforms: policyengine_us.reforms.states.ny.a04038.ny_a04038_enhanced_escc_infants.ny_a04038_enhanced_escc_infants diff --git a/policyengine_us/tests/policy/contrib/states/test_id_ga_ctc_reform_activation.py b/policyengine_us/tests/policy/contrib/states/test_id_ga_ctc_reform_activation.py index 91f4d035358..e981168299f 100644 --- a/policyengine_us/tests/policy/contrib/states/test_id_ga_ctc_reform_activation.py +++ b/policyengine_us/tests/policy/contrib/states/test_id_ga_ctc_reform_activation.py @@ -78,11 +78,17 @@ def modify(parameters): "parent": {"age": {"2026": 30, "2028": 30}}, "child1": { "age": {"2026": 2, "2028": 4}, - "ctc_qualifying_child": {"2026": True, "2028": True}, + "ctc_qualifying_child_ignoring_filer_identification": { + "2026": True, + "2028": True, + }, }, "child2": { "age": {"2026": 4, "2028": 6}, - "ctc_qualifying_child": {"2026": True, "2028": True}, + "ctc_qualifying_child_ignoring_filer_identification": { + "2026": True, + "2028": True, + }, }, }, "tax_units": { diff --git a/policyengine_us/tests/policy/contrib/states/ut/ctc/ut_ctc_reform.yaml b/policyengine_us/tests/policy/contrib/states/ut/ctc/ut_ctc_reform.yaml index 3c74bb5e9ba..cd7a75cf279 100644 --- a/policyengine_us/tests/policy/contrib/states/ut/ctc/ut_ctc_reform.yaml +++ b/policyengine_us/tests/policy/contrib/states/ut/ctc/ut_ctc_reform.yaml @@ -7,11 +7,11 @@ people: person1: age: 35 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_exempt_interest_income: 0 person2: age: 3 - ctc_qualifying_child: true + ctc_qualifying_child_ignoring_filer_identification: true tax_units: tax_unit: members: [person1, person2] @@ -39,11 +39,11 @@ people: person1: age: 35 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_exempt_interest_income: 0 person2: age: 3 - ctc_qualifying_child: true + ctc_qualifying_child_ignoring_filer_identification: true tax_units: tax_unit: members: [person1, person2] @@ -67,11 +67,11 @@ people: person1: age: 35 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_exempt_interest_income: 0 person2: age: 4 - ctc_qualifying_child: true + ctc_qualifying_child_ignoring_filer_identification: true tax_units: tax_unit: members: [person1, person2] @@ -97,14 +97,14 @@ people: person1: age: 40 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_exempt_interest_income: 0 person2: age: 38 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false person3: age: 3 - ctc_qualifying_child: true + ctc_qualifying_child_ignoring_filer_identification: true tax_units: tax_unit: members: [person1, person2, person3] @@ -129,14 +129,14 @@ people: person1: age: 40 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_exempt_interest_income: 0 person2: age: 38 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false person3: age: 3 - ctc_qualifying_child: true + ctc_qualifying_child_ignoring_filer_identification: true tax_units: tax_unit: members: [person1, person2, person3] @@ -160,11 +160,11 @@ people: person1: age: 35 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_exempt_interest_income: 0 person2: age: 3 - ctc_qualifying_child: true + ctc_qualifying_child_ignoring_filer_identification: true tax_units: tax_unit: members: [person1, person2] @@ -188,11 +188,11 @@ people: person1: age: 35 - ctc_qualifying_child: false + ctc_qualifying_child_ignoring_filer_identification: false tax_exempt_interest_income: 0 person2: age: 3 - ctc_qualifying_child: true + ctc_qualifying_child_ignoring_filer_identification: true tax_units: tax_unit: members: [person1, person2] diff --git a/policyengine_us/variables/gov/irs/credits/ctc/maximum/ctc_qualifying_child.py b/policyengine_us/variables/gov/irs/credits/ctc/maximum/ctc_qualifying_child.py index f8906588f5d..018c86bce6c 100644 --- a/policyengine_us/variables/gov/irs/credits/ctc/maximum/ctc_qualifying_child.py +++ b/policyengine_us/variables/gov/irs/credits/ctc/maximum/ctc_qualifying_child.py @@ -5,31 +5,34 @@ class ctc_qualifying_child(Variable): value_type = bool entity = Person label = "CTC-qualifying child" - documentation = "Child qualifies for the Child Tax Credit" + documentation = ( + "Child qualifies for the Child Tax Credit, including the filer " + "identification requirements" + ) definition_period = YEAR defined_for = "is_tax_unit_dependent" reference = ( - # Subsections (a) and (c). "https://www.law.cornell.edu/uscode/text/26/24#c", - "https://www.law.cornell.edu/uscode/text/26/152#b_1", - # Publication 501, Dependent Taxpayer Test. - "https://www.irs.gov/pub/irs-prior/p501--2025.pdf#page=11", + "https://www.law.cornell.edu/uscode/text/26/24#e_2", + "https://www.law.cornell.edu/uscode/text/26/24#h_7", + # 2025 Instructions for Schedule 8812, SSN Required Before the Due + # Date of Your Return To Claim the CTC and ACTC. + "https://www.irs.gov/pub/irs-prior/i1040s8--2025.pdf#page=1", ) def formula(person, period, parameters): - age = person("age", period) - p = parameters(period).gov.irs.credits.ctc - age_limit = p.amount.base.thresholds[-1] - age_eligible = age < age_limit - meets_identification_requirements = person( - "meets_ctc_child_identification_requirements", period + qualifying_child = person( + "ctc_qualifying_child_ignoring_filer_identification", period ) - # IRC 24(a) allows the credit only for a qualifying child for whom the - # taxpayer is allowed a deduction under section 151. Under IRC - # 152(b)(1) a taxpayer who can be claimed as a dependent is treated as - # having no dependents, and on a joint return neither spouse may be - # claimable (Publication 501, Dependent Taxpayer Test). - filer_is_dependent = person.tax_unit( - "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + # IRC 24(h)(7)(A) allows no credit "with respect to any qualifying + # child" unless the return includes the taxpayer's social security + # number (on a joint return, at least one spouse's), and IRC 24(e)(2) + # allows no credit if the taxpayer's identification number was issued + # after the due date. A child whose filer fails these tests is not + # counted. After a paragraph (7) denial, IRC 24(h)(4)(C) moves the + # child to the credit for other dependents; a 24(e)(2) failure denies + # that credit too (see ctc_adult_individual_maximum). + filer_meets_identification_requirements = person.tax_unit( + "filer_meets_child_ctc_identification_requirements", period ) - return age_eligible & meets_identification_requirements & ~filer_is_dependent + return qualifying_child & filer_meets_identification_requirements diff --git a/policyengine_us/variables/gov/irs/credits/ctc/maximum/ctc_qualifying_child_ignoring_filer_identification.py b/policyengine_us/variables/gov/irs/credits/ctc/maximum/ctc_qualifying_child_ignoring_filer_identification.py new file mode 100644 index 00000000000..4b6916f0e5c --- /dev/null +++ b/policyengine_us/variables/gov/irs/credits/ctc/maximum/ctc_qualifying_child_ignoring_filer_identification.py @@ -0,0 +1,43 @@ +from policyengine_us.model_api import * + + +class ctc_qualifying_child_ignoring_filer_identification(Variable): + value_type = bool + entity = Person + label = "CTC-qualifying child, ignoring the filer identification requirements" + documentation = ( + "Child meets the Child Tax Credit child tests, whether or not the " + "filer meets the taxpayer identification requirements of IRC 24(e)(2) " + "and 24(h)(7)(A)(i). The tests are the IRC 24(c) age limit, the child " + "social security number rule of IRC 24(h)(7)(A)(ii), and the IRC " + "152(b)(1) rule that a filer who can be claimed as a dependent has no " + "dependents. ctc_qualifying_child adds the filer test." + ) + definition_period = YEAR + defined_for = "is_tax_unit_dependent" + reference = ( + # Subsections (a) and (c). + "https://www.law.cornell.edu/uscode/text/26/24#c", + "https://www.law.cornell.edu/uscode/text/26/24#h_7", + "https://www.law.cornell.edu/uscode/text/26/152#b_1", + # Publication 501, Dependent Taxpayer Test. + "https://www.irs.gov/pub/irs-prior/p501--2025.pdf#page=11", + ) + + def formula(person, period, parameters): + age = person("age", period) + p = parameters(period).gov.irs.credits.ctc + age_limit = p.amount.base.thresholds[-1] + age_eligible = age < age_limit + meets_identification_requirements = person( + "meets_ctc_child_identification_requirements", period + ) + # IRC 24(a) allows the credit only for a qualifying child for whom the + # taxpayer is allowed a deduction under section 151. Under IRC + # 152(b)(1) a taxpayer who can be claimed as a dependent is treated as + # having no dependents, and on a joint return neither spouse may be + # claimable (Publication 501, Dependent Taxpayer Test). + filer_is_dependent = person.tax_unit( + "head_or_spouse_is_dependent_elsewhere_without_filing_exception", period + ) + return age_eligible & meets_identification_requirements & ~filer_is_dependent diff --git a/policyengine_us/variables/gov/irs/credits/ctc/maximum/ctc_qualifying_children.py b/policyengine_us/variables/gov/irs/credits/ctc/maximum/ctc_qualifying_children.py index 457bf523b5f..fe7cadb70ef 100644 --- a/policyengine_us/variables/gov/irs/credits/ctc/maximum/ctc_qualifying_children.py +++ b/policyengine_us/variables/gov/irs/credits/ctc/maximum/ctc_qualifying_children.py @@ -5,8 +5,15 @@ class ctc_qualifying_children(Variable): value_type = int entity = TaxUnit label = "CTC-qualifying children" - documentation = "Count of children that qualify for the Child Tax Credit" + documentation = ( + "Count of children for whom the filer can claim the Child Tax Credit. " + "Children whose filer fails the identification requirements of IRC " + "24(e)(2) or 24(h)(7)(A)(i) are not counted." + ) definition_period = YEAR - reference = "https://www.law.cornell.edu/uscode/text/26/24#c" + reference = ( + "https://www.law.cornell.edu/uscode/text/26/24#c", + "https://www.law.cornell.edu/uscode/text/26/24#h_7", + ) adds = ["ctc_qualifying_child"] diff --git a/policyengine_us/variables/gov/irs/credits/ctc/maximum/individual/ctc_child_individual_maximum.py b/policyengine_us/variables/gov/irs/credits/ctc/maximum/individual/ctc_child_individual_maximum.py index cc983dcb5a6..4d7d52151b6 100644 --- a/policyengine_us/variables/gov/irs/credits/ctc/maximum/individual/ctc_child_individual_maximum.py +++ b/policyengine_us/variables/gov/irs/credits/ctc/maximum/individual/ctc_child_individual_maximum.py @@ -17,11 +17,7 @@ class ctc_child_individual_maximum(Variable): def formula(person, period, parameters): age = person("age", period) + # ctc_qualifying_child includes the filer identification requirements. qualifying_child = person("ctc_qualifying_child", period) - filer_meets_child_ctc_id_requirements = person.tax_unit( - "filer_meets_child_ctc_identification_requirements", period - ) p = parameters(period).gov.irs.credits.ctc.amount - return ( - qualifying_child * filer_meets_child_ctc_id_requirements * p.base.calc(age) - ) + return qualifying_child * p.base.calc(age) diff --git a/policyengine_us/variables/gov/irs/credits/recovery_rebate_credit/rrc_cares_qualifying_children_with_valid_ssn.py b/policyengine_us/variables/gov/irs/credits/recovery_rebate_credit/rrc_cares_qualifying_children_with_valid_ssn.py index ba96dc6121a..3988f9dc9d3 100644 --- a/policyengine_us/variables/gov/irs/credits/recovery_rebate_credit/rrc_cares_qualifying_children_with_valid_ssn.py +++ b/policyengine_us/variables/gov/irs/credits/recovery_rebate_credit/rrc_cares_qualifying_children_with_valid_ssn.py @@ -7,12 +7,20 @@ class rrc_cares_qualifying_children_with_valid_ssn(Variable): definition_period = YEAR label = "Count of CTC qualifying children with valid SSN for CARES RRC" reference = ( + "https://www.law.cornell.edu/uscode/text/26/6428#a_2", "https://www.law.cornell.edu/uscode/text/26/6428#g_1_C", "https://www.law.cornell.edu/uscode/text/26/6428A#g_3", ) def formula(tax_unit, period, parameters): person = tax_unit.members - is_ctc_qualifying_child = person("ctc_qualifying_child", period) + # IRC 6428(a)(2) counts each "qualifying child (within the meaning of + # section 24(c))", so the CTC filer identification requirements do not + # apply; IRC 6428(g) sets the rebate's own identification rules. The + # variable below also applies the CTC child social security number + # rule and the IRC 152(b)(1) dependent-filer rule. + is_ctc_qualifying_child = person( + "ctc_qualifying_child_ignoring_filer_identification", period + ) has_valid_ssn = person("meets_eitc_identification_requirements", period) return tax_unit.sum(is_ctc_qualifying_child & has_valid_ssn) diff --git a/policyengine_us/variables/gov/states/id/tax/income/credits/id_ctc.py b/policyengine_us/variables/gov/states/id/tax/income/credits/id_ctc.py index 032866e9861..a3d0be5cb82 100644 --- a/policyengine_us/variables/gov/states/id/tax/income/credits/id_ctc.py +++ b/policyengine_us/variables/gov/states/id/tax/income/credits/id_ctc.py @@ -14,18 +14,7 @@ class id_ctc(Variable): ) def formula(tax_unit, period, parameters): - # Get relevant parameter subtree. p = parameters(period).gov.states.id.tax.income.credits.ctc - # "the term "qualifying child" has the meaning as defined in section 24(c) of the Internal Revenue Code." - # IRC 24(c) defines eligible children under the federal CTC. Its age - # test is under 17; the 2021 federal expansion to age 17 is in IRC - # 24(i)(1), so Idaho does not count those children in 2021. - person = tax_unit.members - over_age = person("ctc_qualifying_child", period) & ( - person("age", period) >= p.ineligible_age - ) - eligible_children = tax_unit("ctc_qualifying_children", period) - tax_unit.sum( - over_age - ) + eligible_children = tax_unit("id_ctc_qualifying_children", period) # Multiply by the amount per child. return eligible_children * p.amount diff --git a/policyengine_us/variables/gov/states/id/tax/income/credits/id_ctc_qualifying_children.py b/policyengine_us/variables/gov/states/id/tax/income/credits/id_ctc_qualifying_children.py new file mode 100644 index 00000000000..9f3705ef731 --- /dev/null +++ b/policyengine_us/variables/gov/states/id/tax/income/credits/id_ctc_qualifying_children.py @@ -0,0 +1,35 @@ +from policyengine_us.model_api import * + + +class id_ctc_qualifying_children(Variable): + value_type = int + entity = TaxUnit + label = "Idaho Child Tax Credit qualifying children" + definition_period = YEAR + defined_for = StateCode.ID + reference = ( + "https://legislature.idaho.gov/statutesrules/idstat/Title63/T63CH30/SECT63-3029L/", + # 2025 Idaho Form 40 instructions, Line 24 Idaho Child Tax Credit + # Worksheet. + "https://tax.idaho.gov/wp-content/uploads/forms/EIN00046/EIN00046_03-02-2026.pdf#page=11", + ) + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.id.tax.income.credits.ctc + person = tax_unit.members + # Idaho Code 63-3029L(1): "the term "qualifying child" has the meaning + # as defined in section 24(c) of the Internal Revenue Code." Idaho + # does not require the federal credit to be allowed, so a child whose + # filer fails the federal identification requirements of IRC 24(e)(2) + # or 24(h)(7)(A)(i) still counts. The Form 40 instructions list only + # "Your qualifying child" and "Age 16 or under". The model still + # applies the federal child social security number rule (IRC + # 24(h)(7)(A)(ii)) and the IRC 152(b)(1) dependent-filer rule here. + qualifying_child = person( + "ctc_qualifying_child_ignoring_filer_identification", period + ) + # IRC 24(c) defines eligible children under the federal CTC. Its age + # test is under 17; the 2021 federal expansion to age 17 is in IRC + # 24(i)(1), so Idaho does not count those children in 2021. + age_eligible = person("age", period) < p.ineligible_age + return tax_unit.sum(qualifying_child & age_eligible) diff --git a/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/me_fairness_credit_qualifying_children.py b/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/me_fairness_credit_qualifying_children.py new file mode 100644 index 00000000000..630af3ede5e --- /dev/null +++ b/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/me_fairness_credit_qualifying_children.py @@ -0,0 +1,45 @@ +from policyengine_us.model_api import * + + +class me_fairness_credit_qualifying_children(Variable): + value_type = int + entity = TaxUnit + label = "Maine sales and property tax fairness credit qualifying children" + documentation = ( + "Number of qualifying children for whom the filer can claim a federal " + "credit under IRC section 24 (the Child Tax Credit or the credit for " + "other dependents), for the Maine sales tax and property tax fairness " + "credits." + ) + definition_period = YEAR + defined_for = StateCode.ME + reference = ( + # 36 MRSA 5213-A(1)(A-1)(2). + "https://legislature.maine.gov/statutes/36/title36sec5213-A.html", + # 36 MRSA 5219-KK(1)(A-1)(2) and (3). + "https://legislature.maine.gov/statutes/36/title36sec5219-KK.html", + # 2025 Instructions for Schedule 8812, TIN Required by Due Date of + # Your Return To Claim the ODC, and Credit for Other Dependents. + # PDF pages 1-2. + "https://www.irs.gov/pub/irs-prior/i1040s8--2025.pdf#page=1", + ) + + def formula(tax_unit, period, parameters): + person = tax_unit.members + # 36 MRSA 5213-A(1)(A-1)(2) and 5219-KK(1)(A-1)(2)-(3) count each + # "qualifying child or dependent" for whom the filer "can claim the + # federal child tax credit pursuant to the Code, Section 24". Section + # 24 includes the credit for other dependents of IRC 24(h)(4), and IRC + # 24(h)(4)(C) gives that credit for a child whose Child Tax Credit is + # denied by the social security number rule of IRC 24(h)(7). So a + # child whose filer fails the Child Tax Credit identification test + # still counts when the filer meets the taxpayer identification test + # for the credit for other dependents. Dependents who are not CTC + # qualifying children are not counted here. + qualifying_child = person( + "ctc_qualifying_child_ignoring_filer_identification", period + ) + filer_meets_identification_requirements = tax_unit( + "filer_meets_ctc_identification_requirements", period + ) + return tax_unit.sum(qualifying_child) * filer_meets_identification_requirements diff --git a/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/property_tax_fairness_credit/me_property_tax_fairness_credit_benefit_base.py b/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/property_tax_fairness_credit/me_property_tax_fairness_credit_benefit_base.py index 7798ad88eee..8280b0063c2 100644 --- a/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/property_tax_fairness_credit/me_property_tax_fairness_credit_benefit_base.py +++ b/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/property_tax_fairness_credit/me_property_tax_fairness_credit_benefit_base.py @@ -11,7 +11,7 @@ class me_property_tax_fairness_credit_benefit_base(Variable): def formula(tax_unit, period, parameters): p = parameters(period).gov.states.me.tax.income.credits.fairness.property_tax - dependents = tax_unit("ctc_qualifying_children", period) + dependents = tax_unit("me_fairness_credit_qualifying_children", period) filing_status = tax_unit("filing_status", period) filing_statuses = filing_status.possible_values single = filing_status == filing_statuses.SINGLE diff --git a/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/sales_tax_fairness_credit/me_sales_tax_fairness_credit.py b/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/sales_tax_fairness_credit/me_sales_tax_fairness_credit.py index c0aa36b4b3b..02a3d9c3ff3 100644 --- a/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/sales_tax_fairness_credit/me_sales_tax_fairness_credit.py +++ b/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/sales_tax_fairness_credit/me_sales_tax_fairness_credit.py @@ -14,7 +14,7 @@ class me_sales_tax_fairness_credit(Variable): def formula(tax_unit, period, parameters): p = parameters(period).gov.states.me.tax.income.credits.fairness.sales_tax - children = tax_unit("ctc_qualifying_children", period) + children = tax_unit("me_fairness_credit_qualifying_children", period) filing_status = tax_unit("filing_status", period) status = filing_status.possible_values base = p.amount.base[filing_status] diff --git a/policyengine_us/variables/gov/states/nc/tax/income/deductions/nc_child_deduction.py b/policyengine_us/variables/gov/states/nc/tax/income/deductions/nc_child_deduction.py index f6f8f50c5ed..c87a58b61e2 100644 --- a/policyengine_us/variables/gov/states/nc/tax/income/deductions/nc_child_deduction.py +++ b/policyengine_us/variables/gov/states/nc/tax/income/deductions/nc_child_deduction.py @@ -8,6 +8,11 @@ class nc_child_deduction(Variable): unit = USD definition_period = YEAR defined_for = StateCode.NC + reference = ( + "https://www.ncleg.gov/EnactedLegislation/Statutes/HTML/BySection/Chapter_105/GS_105-153.5.html", + # S.L. 2026-31, Section 12.(a), amending G.S. 105-228.90(b)(7). + "https://www.ncleg.gov/EnactedLegislation/SessionLaws/PDF/2025-2026/SL2026-31.pdf#page=42", + ) def formula(tax_unit, period, parameters): # calculate deduction amount per eligible child @@ -31,7 +36,13 @@ def formula(tax_unit, period, parameters): p.head_of_household.calc(federal_agi, right=True), ], ) - # calculate number of eligible children + # G.S. 105-153.5(a1) allows the deduction "for each qualifying child + # for whom the taxpayer is allowed the federal tax credit" under + # section 24 of the Code. S.L. 2026-31 moved the Code date in + # G.S. 105-228.90(b)(7) from January 1, 2023 to July 5, 2025, so the + # filer social security number rule that the One Big Beautiful Bill + # Act added to IRC 24(h)(7) applies; ctc_qualifying_children counts + # only children for whom the federal credit is allowed. children = tax_unit("ctc_qualifying_children", period) # calculate NC child deduction return amount * children diff --git a/policyengine_us/variables/gov/states/ny/tax/income/credits/ctc/ny_ctc_pre_2024_eligible.py b/policyengine_us/variables/gov/states/ny/tax/income/credits/ctc/ny_ctc_pre_2024_eligible.py index 6506de0a399..3381ec65067 100644 --- a/policyengine_us/variables/gov/states/ny/tax/income/credits/ctc/ny_ctc_pre_2024_eligible.py +++ b/policyengine_us/variables/gov/states/ny/tax/income/credits/ctc/ny_ctc_pre_2024_eligible.py @@ -11,7 +11,10 @@ class ny_ctc_pre_2024_eligible(Variable): label = "NY CTC pre-2024 eligibility" documentation = "Whether the tax unit is eligible for NY CTC under pre-2024 rules" definition_period = YEAR - reference = "https://www.nysenate.gov/legislation/laws/TAX/606" # (c-1) + reference = ( + "https://www.nysenate.gov/legislation/laws/TAX/606", # (c-1) + "https://www.tax.ny.gov/forms/html-instructions/2023/it/it213i-2023.htm", + ) defined_for = StateCode.NY def formula(tax_unit, period, parameters): @@ -24,7 +27,11 @@ def formula(tax_unit, period, parameters): person = tax_unit.members age = person("age", period) - # Check if we have qualifying children + # Check if we have qualifying children. ctc_qualifying_child includes + # the filer identification test, which under the pre-TCJA rules is an + # SSN or ITIN for each filer (IRC 24(e)); the IT-213 instructions + # likewise require "a valid Social Security number (SSN) or IRS + # individual taxpayer identification number (ITIN)" for the filer. if not p.pre_tcja: qualifies_for_federal_ctc = person("ctc_qualifying_child", period) else: diff --git a/policyengine_us/variables/gov/states/ut/tax/income/credits/child_tax_credit/ut_ctc_potential.py b/policyengine_us/variables/gov/states/ut/tax/income/credits/child_tax_credit/ut_ctc_potential.py index dd0e11dbdbb..a4674289814 100644 --- a/policyengine_us/variables/gov/states/ut/tax/income/credits/child_tax_credit/ut_ctc_potential.py +++ b/policyengine_us/variables/gov/states/ut/tax/income/credits/child_tax_credit/ut_ctc_potential.py @@ -7,13 +7,27 @@ class ut_ctc_potential(Variable): label = "Utah Child Tax Credit" unit = USD definition_period = YEAR - reference = "https://le.utah.gov/xcode/Title59/Chapter10/59-10-S1047.html" + reference = ( + "https://le.utah.gov/xcode/Title59/Chapter10/59-10-S1047.html", + "https://www.law.cornell.edu/uscode/text/26/24#h_4_C", + # 2025 TC-40 instructions, Child Tax Credit (code AT). + "https://files.tax.utah.gov/tax/forms/2025/tc-40inst.pdf#page=24", + ) defined_for = StateCode.UT def formula(tax_unit, period, parameters): p = parameters(period).gov.states.ut.tax.income.credits.ctc person = tax_unit.members - ctc_eligible_child = person("ctc_qualifying_child", period) + # Utah Code 59-10-1047(1)(e) counts a child "with respect to whom the + # claimant is allowed to claim a tax credit under Section 24". A child + # whose filer fails the federal filer SSN rule of IRC 24(h)(7) gets + # the credit for other dependents under IRC 24(h)(4)(C), so the child + # still counts if the filer has an SSN or ITIN (IRC 24(e)(2)). + child = person("ctc_qualifying_child_ignoring_filer_identification", period) + filer_has_tin = person.tax_unit( + "filer_meets_ctc_identification_requirements", period + ) + ctc_eligible_child = child & filer_has_tin age = person("age", period) ut_child_age_eligible = p.child_age_threshold.calc(age) eligible_child = ctc_eligible_child & ut_child_age_eligible