diff --git a/changelog.d/in-tanf-maximum-benefit.fixed.md b/changelog.d/in-tanf-maximum-benefit.fixed.md new file mode 100644 index 00000000000..31181cd37fc --- /dev/null +++ b/changelog.d/in-tanf-maximum-benefit.fixed.md @@ -0,0 +1 @@ +Correct Indiana TANF benefit payments to use the IC 12-14-2-5 maximum benefit and add the post-2025 gross/net income eligibility screens. diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/additional_member_amount.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/additional_member_amount.yaml new file mode 100644 index 00000000000..81642fe44ea --- /dev/null +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/additional_member_amount.yaml @@ -0,0 +1,17 @@ +description: Indiana provides this additional amount for each assistance unit member above the maximum benefit table size under the Temporary Assistance for Needy Families program. + +values: + 1997-10-01: 0 + 2025-07-01: 104 + +metadata: + unit: currency-USD + period: month + label: Indiana TANF maximum benefit additional member amount + reference: + - title: IC 12-14-2-5 (amount of assistance; payment made; maximum amounts) + href: https://iga.in.gov/laws/2025/ic/titles/12/#12-14-2-5 + - title: FSSA DFR - About TANF + href: https://www.in.gov/fssa/dfr/tanf-cash-assistance/about-tanf/ + - title: FSSA SNAP/TANF Program Policy Manual, Section 3050.10.00 (maximum benefits effective 7/1/2025) + href: https://www.in.gov/fssa/dfr/files/3000.pdf#page=7 diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/amount.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/amount.yaml new file mode 100644 index 00000000000..a501c092b3c --- /dev/null +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/amount.yaml @@ -0,0 +1,60 @@ +description: Indiana provides this amount as the maximum benefit under the Temporary Assistance for Needy Families program. + +1: + 1997-10-01: 139 + 2023-07-01: 155 + 2025-07-01: 248 +2: + 1997-10-01: 229 + 2023-07-01: 255 + 2025-07-01: 409 +3: + 1997-10-01: 288 + 2023-07-01: 320 + 2025-07-01: 513 +4: + 1997-10-01: 346 + 2023-07-01: 385 + 2025-07-01: 617 +5: + 1997-10-01: 405 + 2023-07-01: 450 + 2025-07-01: 721 +6: + 1997-10-01: 463 + 2023-07-01: 515 + 2025-07-01: 825 +7: + 1997-10-01: 522 + 2023-07-01: 580 + 2025-07-01: 929 +8: + 1997-10-01: 580 + 2023-07-01: 645 + 2025-07-01: 1_033 +9: + 1997-10-01: 639 + 2023-07-01: 710 + 2025-07-01: 1_137 +10: + 1997-10-01: 697 + 2023-07-01: 775 + 2025-07-01: 1_241 + +metadata: + unit: currency-USD + period: month + breakdown: + - range(1, 11) + breakdown_labels: + - Assistance unit size + label: Indiana TANF maximum benefit amount + reference: + - title: IC 12-14-2-5 (amount of assistance; payment made; maximum amounts) + href: https://iga.in.gov/laws/2025/ic/titles/12/#12-14-2-5 + - title: 470 IAC 10.3-4-3(a)(1) (corroborates pre-2024 amounts equal to standard of need) + href: https://iar.iga.in.gov/code/2026/470/10.3#470-10.3-4-3 + - title: FSSA SNAP/TANF Program Policy Manual, Section 3050.10.00 (maximum benefits effective 7/1/2025) + href: https://www.in.gov/fssa/dfr/files/3000.pdf#page=7 + - title: CBPP TANF benefit levels (corroborates 2023-07-01 increase) + href: https://www.cbpp.org/research/income-security/continued-increases-in-tanf-benefit-levels-are-critical-to-helping diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/max_table_size.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/max_table_size.yaml new file mode 100644 index 00000000000..3e825112811 --- /dev/null +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/max_table_size.yaml @@ -0,0 +1,14 @@ +description: Indiana sets this as the largest assistance unit size in the maximum benefit table under the Temporary Assistance for Needy Families program. + +values: + 1997-10-01: 10 + +metadata: + unit: person + period: year + label: Indiana TANF maximum benefit table size + reference: + - title: IC 12-14-2-5 (amount of assistance; payment made; maximum amounts) + href: https://iga.in.gov/laws/2025/ic/titles/12/#12-14-2-5 + - title: 470 IAC 10.3-4-3(a)(1) + href: https://iar.iga.in.gov/code/2026/470/10.3#470-10.3-4-3 diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/fpg.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/fpg.yaml new file mode 100644 index 00000000000..6227e21bfd6 --- /dev/null +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/fpg.yaml @@ -0,0 +1,48 @@ +description: Indiana uses these annual federal poverty guideline amounts to calculate monthly income standards under the Temporary Assistance for Needy Families program. + +first_person: + 1992-10-01: 6_810 + 2011-10-01: 10_890 + 2015-10-01: 11_770 + 2016-10-01: 11_880 + 2017-10-01: 12_060 + 2018-10-01: 12_140 + 2019-10-01: 12_490 + 2020-10-01: 12_760 + 2021-10-01: 12_880 + 2022-10-01: 13_590 + 2023-10-01: 14_580 + 2024-10-01: 15_060 + 2025-07-01: 15_650 + 2026-03-01: 15_960 +additional_person: + 1992-10-01: 2_380 + 2011-10-01: 3_820 + 2015-10-01: 4_160 + 2016-10-01: 4_160 + 2017-10-01: 4_180 + 2018-10-01: 4_320 + 2019-10-01: 4_420 + 2020-10-01: 4_480 + 2021-10-01: 4_540 + 2022-10-01: 4_720 + 2023-10-01: 5_140 + 2024-10-01: 5_380 + 2025-07-01: 5_500 + 2026-03-01: 5_680 + +metadata: + unit: currency-USD + period: year + label: Indiana TANF federal poverty guideline + breakdown: + - [first_person, additional_person] + reference: + - title: FSSA DFR Chapter 3000, Section 3010.15.00 (cash assistance gross income standards effective 3/1/2026) + href: https://www.in.gov/fssa/dfr/files/3000.pdf#page=4 + - title: FSSA DFR Chapter 3000, Section 3010.15.05 (cash assistance 100% FPG standards effective 3/1/2026) + href: https://www.in.gov/fssa/dfr/files/3000.pdf#page=5 + - title: Indiana FSSA TANF cash assistance income guidelines (standards preceding the 3/1/2026 update) + href: https://www.in.gov/fssa/dfr/tanf-cash-assistance/about-tanf/ + - title: HHS poverty guidelines + href: https://aspe.hhs.gov/topics/poverty-economic-mobility/poverty-guidelines diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/initial/gross_income/fpg_rate.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/initial/gross_income/fpg_rate.yaml new file mode 100644 index 00000000000..af7c2c4119d --- /dev/null +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/initial/gross_income/fpg_rate.yaml @@ -0,0 +1,16 @@ +description: Indiana limits initial applicants' gross income to this share of the federal poverty guideline under the Temporary Assistance for Needy Families program. + +values: + 1997-10-01: .inf # No gross income screen before 2025-07-01 (standard of need governs) + 2025-07-01: 0.35 + 2027-07-01: 0.5 + +metadata: + unit: /1 + period: month + label: Indiana TANF initial eligibility gross income FPG rate + reference: + - title: IC 12-14-1-1.7(b)-(c) (35% FPL through June 30, 2027; 50% FPL after) + href: https://iga.in.gov/laws/2025/ic/titles/12/#12-14-1-1.7 + - title: FSSA DFR Chapter 3000, Section 3010.15.00 (gross income standard) + href: https://www.in.gov/fssa/dfr/files/3000.pdf#page=4 diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/initial/net_income/maximum_grant_rate.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/initial/net_income/maximum_grant_rate.yaml new file mode 100644 index 00000000000..212e7685308 --- /dev/null +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/initial/net_income/maximum_grant_rate.yaml @@ -0,0 +1,13 @@ +description: Indiana limits initial applicants' countable net income to this share of the maximum benefit under the Temporary Assistance for Needy Families program. + +values: + 1997-10-01: 0 # Standard of need governs initial net income before 2025-07-01 + 2025-07-01: 1 + +metadata: + unit: /1 + period: month + label: Indiana TANF initial eligibility net income maximum benefit rate + reference: + - title: FSSA DFR Chapter 3000, Section 3010.15.00 (net income standard equal to the maximum grant) + href: https://www.in.gov/fssa/dfr/files/3000.pdf#page=4 diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/benefit/in_tanf_maximum_benefit.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/benefit/in_tanf_maximum_benefit.yaml new file mode 100644 index 00000000000..bc0fd69fb30 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/benefit/in_tanf_maximum_benefit.yaml @@ -0,0 +1,79 @@ +# Tests for in_tanf_maximum_benefit (amount of assistance, IC 12-14-2-5) +# Maximum benefit by assistance unit size across the 2023 and 2025 increases. + +- name: Family of 2 pre-2023 amount + period: 2022-01 + absolute_error_margin: 0.1 + input: + spm_unit_size: 2 + state_code: IN + output: + in_tanf_maximum_benefit: 229 + +- name: Family of 2 January 2024 amount + period: 2024-01 + absolute_error_margin: 0.1 + input: + spm_unit_size: 2 + state_code: IN + output: + in_tanf_maximum_benefit: 255 + # 2023-07-01 amount + +- name: Family of 2 January 2025 still pre-July-2025 amount + period: 2025-01 + absolute_error_margin: 0.1 + input: + spm_unit_size: 2 + state_code: IN + output: + in_tanf_maximum_benefit: 255 + # 2023-07-01 amount; the 2025-07-01 increase is not yet effective + +- name: Family of 2 January 2026 amount + period: 2026-01 + absolute_error_margin: 0.1 + input: + spm_unit_size: 2 + state_code: IN + output: + in_tanf_maximum_benefit: 409 + +- name: Family of 3 January 2026 amount + period: 2026-01 + absolute_error_margin: 0.1 + input: + spm_unit_size: 3 + state_code: IN + output: + in_tanf_maximum_benefit: 513 + +- name: Family of 10 January 2026 amount + period: 2026-01 + absolute_error_margin: 0.1 + input: + spm_unit_size: 10 + state_code: IN + output: + in_tanf_maximum_benefit: 1_241 + +- name: Family of 11 January 2026 adds one additional member increment + period: 2026-01 + absolute_error_margin: 0.1 + input: + spm_unit_size: 11 + state_code: IN + output: + in_tanf_maximum_benefit: 1_345 + # Size-10 amount ($1,241) + $104 for the 11th member + +- name: Family of 11 January 2024 has no additional member increment + period: 2024-01 + absolute_error_margin: 0.1 + input: + spm_unit_size: 11 + state_code: IN + output: + in_tanf_maximum_benefit: 775 + # Before 2025-07-01 the additional member amount is $0, so size 11 is + # capped at the size-10 standard-of-need amount ($775) diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/edge_cases.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/edge_cases.yaml index 5e216aaa486..2ce04de13a3 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/edge_cases.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/edge_cases.yaml @@ -138,7 +138,7 @@ period: 2024-01 input: in_tanf_eligible: true - in_tanf_payment_standard: 320 + in_tanf_maximum_benefit: 320 in_tanf_countable_income_for_payment: 319 state_code: IN output: @@ -164,4 +164,4 @@ state_code: IN output: in_tanf: 255 - # Capped at payment standard for family of 2 ($255), not inflated + # Capped at the maximum benefit for family of 2 ($255), not inflated diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.yaml index 84703243a4a..9be35ececf5 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.yaml @@ -164,3 +164,201 @@ in_tanf_countable_income_for_eligibility: 586.7 in_tanf_countable_income_eligible: true # Countable ($586.70) < 100% FPL for 3 (~$1,988/mo) -> eligible + +# Post-2025 initial eligibility (IC 12-14-1-1.7; FSSA 3010.15.00). +# Initial applicants must have countable net income below the maximum grant +# and gross income below 35% FPG (50% from 2027-07-01). For Indiana the +# net (maximum grant) standard binds before the looser 35% FPG gross screen. + +- name: Applicant family of 3 just below the maximum grant net standard in 2026 + period: 2026-01 + input: + people: + person1: + age: 30 + tanf_gross_unearned_income: 512 + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + is_tanf_enrolled: false + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + in_tanf_countable_income_for_eligibility: 512 + in_tanf_countable_income_eligible: true + # Net ($512) < maximum grant ($513); gross ($512) < gross standard ($778) -> eligible + +- name: Applicant family of 3 at the maximum grant net standard in 2026 + period: 2026-01 + input: + people: + person1: + age: 30 + tanf_gross_unearned_income: 513 + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + is_tanf_enrolled: false + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + in_tanf_countable_income_for_eligibility: 513 + in_tanf_countable_income_eligible: false + # Net ($513) >= maximum grant ($513) -> not eligible (strict less-than) + +- name: Applicant family of 3 below the maximum grant net standard in 2028 + period: 2028-01 + input: + people: + person1: + age: 30 + tanf_gross_unearned_income: 500 + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + is_tanf_enrolled: false + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + in_tanf_countable_income_eligible: true + # Net ($500) < maximum grant ($513); gross ($500) < 50% FPG -> eligible + +- name: Applicant family of 3 high earner fails both 2026 screens + period: 2026-01 + input: + people: + person1: + age: 30 + tanf_gross_earned_income: 3_000 + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + is_tanf_enrolled: false + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + in_tanf_countable_income_eligible: false + # Net ($2,910 = $3,000 - $90) >= maximum grant and gross ($3,000) > 35% FPG + +- name: Enrolled family of 3 below 100% FPG in 2026 remains eligible + period: 2026-01 + input: + people: + person1: + age: 30 + tanf_gross_unearned_income: 2_000 + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + is_tanf_enrolled: true + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + in_tanf_countable_income_eligible: true + # Enrolled: countable ($2,000) < 100% FPG for 3 ($2,220.83) -> eligible + +- name: Enrolled family of 3 above 100% FPG in 2026 loses eligibility + period: 2026-01 + input: + people: + person1: + age: 30 + tanf_gross_unearned_income: 2_300 + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + is_tanf_enrolled: true + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + in_tanf_countable_income_eligible: false + # Enrolled: countable ($2,300) >= 100% FPG for 3 ($2,220.83) -> not eligible + +- name: Applicant family of 3 passes the post-March-2026 gross standard + period: 2027-01 + input: + people: + person1: + age: 30 + tanf_gross_earned_income: 260 + person2: + age: 28 + tanf_gross_earned_income: 260 + person3: + age: 26 + tanf_gross_earned_income: 260 + spm_units: + spm_unit: + members: [person1, person2, person3] + is_tanf_enrolled: false + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + in_tanf_gross_income: 780 + in_tanf_countable_income_for_eligibility: 510 + in_tanf_initial_gross_income_standard: 797 + in_tanf_countable_income_eligible: true + # Gross ($780) < published standard ($797); net ($510) < maximum grant ($513). + +- name: Applicant family of 3 at the post-March-2026 gross standard is not eligible + period: 2027-01 + input: + in_tanf_countable_income_for_eligibility: 510 + in_tanf_gross_income: 797 + spm_unit_size: 3 + is_tanf_enrolled: false + state_code: IN + output: + in_tanf_initial_gross_income_standard: 797 + in_tanf_countable_income_eligible: false + # Gross income must be strictly below the standard. + +- name: Enrolled family of 3 at the post-March-2026 FPG standard is not eligible + period: 2027-01 + input: + in_tanf_countable_income_for_eligibility: 2_277 + spm_unit_size: 3 + is_tanf_enrolled: true + state_code: IN + output: + in_tanf_fpg: 2_277 + in_tanf_countable_income_eligible: false + # Continuing net income must be strictly below the published standard. diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_fpg.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_fpg.yaml new file mode 100644 index 00000000000..27d087d6904 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_fpg.yaml @@ -0,0 +1,15 @@ +- name: Family of 3 uses the 2025 FPG standard through February 2026 + period: 2026-01 + input: + spm_unit_size: 3 + state_code: IN + output: + in_tanf_fpg: 2_221 + +- name: Family of 3 uses the post-March-2026 FPG standard + period: 2027-01 + input: + spm_unit_size: 3 + state_code: IN + output: + in_tanf_fpg: 2_277 diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_initial_gross_income_standard.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_initial_gross_income_standard.yaml new file mode 100644 index 00000000000..e2c19e4c112 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_initial_gross_income_standard.yaml @@ -0,0 +1,15 @@ +- name: Family of 3 uses the 2025 gross income standard through February 2026 + period: 2026-01 + input: + spm_unit_size: 3 + state_code: IN + output: + in_tanf_initial_gross_income_standard: 778 + +- name: Family of 3 uses the post-March-2026 gross income standard + period: 2027-01 + input: + spm_unit_size: 3 + state_code: IN + output: + in_tanf_initial_gross_income_standard: 797 diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_payment_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_payment_eligible.yaml index 939290a0d4f..aa50241766c 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_payment_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_payment_eligible.yaml @@ -1,6 +1,6 @@ # Tests for in_tanf_payment_eligible # Uses payment disregards: 75% earned income (only 25% counts) -# Compares to payment standard +# Compares to the maximum benefit (IC 12-14-2-5) - name: Family of 3 with zero countable income - eligible period: 2024-01 @@ -10,9 +10,9 @@ state_code: IN output: in_tanf_payment_eligible: true - # Countable income ($0) < standard of need ($320) → eligible + # Countable income ($0) < maximum benefit ($320) → eligible -- name: Family of 3 with income below standard of need - eligible +- name: Family of 3 with income below maximum benefit - eligible period: 2024-01 input: spm_unit_size: 3 @@ -20,9 +20,9 @@ state_code: IN output: in_tanf_payment_eligible: true - # Countable income ($300) < standard of need ($320) → eligible + # Countable income ($300) < maximum benefit ($320) → eligible -- name: Family of 3 with income at standard of need - not eligible +- name: Family of 3 with income at maximum benefit - not eligible period: 2024-01 input: spm_unit_size: 3 @@ -30,9 +30,9 @@ state_code: IN output: in_tanf_payment_eligible: false - # Countable income ($320) >= standard of need ($320) → not eligible + # Countable income ($320) >= maximum benefit ($320) → not eligible -- name: Family of 3 with income above standard of need - not eligible +- name: Family of 3 with income above maximum benefit - not eligible period: 2024-01 input: spm_unit_size: 3 @@ -40,9 +40,9 @@ state_code: IN output: in_tanf_payment_eligible: false - # Countable income ($400) > standard of need ($320) → not eligible + # Countable income ($400) > maximum benefit ($320) → not eligible -- name: Family of 1 below standard of need - eligible +- name: Family of 1 below maximum benefit - eligible period: 2024-01 input: spm_unit_size: 1 @@ -50,9 +50,9 @@ state_code: IN output: in_tanf_payment_eligible: true - # Countable income ($150) < standard of need ($155) → eligible + # Countable income ($150) < maximum benefit ($155) → eligible -- name: Family of 2 below standard of need - eligible +- name: Family of 2 below maximum benefit - eligible period: 2024-01 input: spm_unit_size: 2 @@ -60,4 +60,25 @@ state_code: IN output: in_tanf_payment_eligible: true - # Countable income ($250) < standard of need ($255) → eligible + # Countable income ($250) < maximum benefit ($255) → eligible + +- name: Family of 3 with income above old standard of need now eligible in 2026 + period: 2026-01 + input: + spm_unit_size: 3 + in_tanf_countable_income_for_payment: 400 + state_code: IN + output: + in_tanf_payment_eligible: true + # Countable income ($400) < 2025-07-01 maximum benefit ($513) → eligible, + # whereas $400 exceeded the standard of need ($320) + +- name: Family of 3 with income at increased maximum benefit - not eligible + period: 2026-01 + input: + spm_unit_size: 3 + in_tanf_countable_income_for_payment: 513 + state_code: IN + output: + in_tanf_payment_eligible: false + # Countable income ($513) >= maximum benefit ($513) → not eligible diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/in_tanf.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/in_tanf.yaml index 49adcce45bd..e3a91897ddd 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/in_tanf.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/in_tanf.yaml @@ -1,8 +1,8 @@ - name: Family of 3 with no income receives maximum benefit - period: 2024-01 + period: 2026-01 input: in_tanf_eligible: true - in_tanf_payment_standard: 513 + in_tanf_maximum_benefit: 513 in_tanf_countable_income_for_payment: 0 state_code: IN output: @@ -10,10 +10,10 @@ # Max benefit ($513) - countable income ($0) = $513 - name: Family of 3 with countable income receives reduced benefit - period: 2024-01 + period: 2026-01 input: in_tanf_eligible: true - in_tanf_payment_standard: 513 + in_tanf_maximum_benefit: 513 in_tanf_countable_income_for_payment: 200 state_code: IN output: @@ -21,10 +21,10 @@ # Max benefit ($513) - countable income ($200) = $313 - name: Family of 2 with partial income - period: 2024-01 + period: 2026-01 input: in_tanf_eligible: true - in_tanf_payment_standard: 409 + in_tanf_maximum_benefit: 409 in_tanf_countable_income_for_payment: 100 state_code: IN output: @@ -32,33 +32,97 @@ # Max benefit ($409) - countable income ($100) = $309 - name: Ineligible family receives no benefit - period: 2024-01 + period: 2026-01 input: in_tanf_eligible: false - in_tanf_payment_standard: 513 + in_tanf_maximum_benefit: 513 in_tanf_countable_income_for_payment: 100 state_code: IN output: in_tanf: 0 -- name: Family with countable income equal to payment standard - period: 2024-01 +- name: Family with countable income equal to maximum benefit + period: 2026-01 input: in_tanf_eligible: true - in_tanf_payment_standard: 513 + in_tanf_maximum_benefit: 513 in_tanf_countable_income_for_payment: 513 state_code: IN output: in_tanf: 0 # Max benefit ($513) - countable income ($513) = $0 -- name: Family with countable income exceeding payment standard - period: 2024-01 +- name: Family with countable income exceeding maximum benefit + period: 2026-01 input: in_tanf_eligible: true - in_tanf_payment_standard: 513 + in_tanf_maximum_benefit: 513 in_tanf_countable_income_for_payment: 600 state_code: IN output: in_tanf: 0 # max(513 - 600, 0) = 0 + +- name: Family of two, adult and child, no income, no SSI, January 2026. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 0 + ssi: 0 + person2: + age: 5 + employment_income: 0 + ssi: 0 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: IN + output: + in_tanf: 409 + # 2025-07-01 maximum benefit for a family of 2 (IC 12-14-2-5) + +- name: Family of two, no income, January 2024 pays the 2023 amount. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: IN + output: + in_tanf: 255 + # The 2023-07-01 maximum benefit is $255 for a family of 2. + +- name: Family of two, no income, January 2025 still pays the prior amount. + period: 2025-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: IN + output: + in_tanf: 255 + # The $409 maximum benefit is not effective until 2025-07-01. diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/income/in_tanf_gross_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/income/in_tanf_gross_income.yaml new file mode 100644 index 00000000000..6f6d0f1d630 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/income/in_tanf_gross_income.yaml @@ -0,0 +1,94 @@ +# Tests for in_tanf_gross_income +# Sum of gross earned and gross unearned income (no disregards), used by the +# post-2025 initial gross income screen. + +- name: No income + period: 2024-01 + input: + people: + person1: + tanf_gross_earned_income: 0 + tanf_gross_unearned_income: 0 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: IN + output: + in_tanf_gross_income: 0 + +- name: Earned income only + period: 2024-01 + input: + people: + person1: + tanf_gross_earned_income: 400 + tanf_gross_unearned_income: 0 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: IN + output: + in_tanf_gross_income: 400 + # Gross income has no disregards applied + +- name: Unearned income only + period: 2024-01 + input: + people: + person1: + tanf_gross_earned_income: 0 + tanf_gross_unearned_income: 300 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: IN + output: + in_tanf_gross_income: 300 + +- name: Both earned and unearned income + period: 2024-01 + input: + people: + person1: + tanf_gross_earned_income: 500 + tanf_gross_unearned_income: 200 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: IN + output: + in_tanf_gross_income: 700 + # $500 earned + $200 unearned = $700 + +- name: Multiple people in unit + period: 2024-01 + input: + people: + person1: + tanf_gross_earned_income: 200 + person2: + tanf_gross_unearned_income: 100 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + in_tanf_gross_income: 300 + # $200 (person1 earned) + $100 (person2 unearned) = $300 diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/integration.yaml index 7757ddda307..030b9df5f52 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/integration.yaml @@ -366,3 +366,68 @@ in_tanf_eligible: true in_tanf: 145 # $320 - $175 = $145 + +- name: Case 11, family of 3 no income receives 2025-07-01 maximum benefit in 2026. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + is_tanf_enrolled: false + spm_unit_cash_assets: 500 + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + spm_unit_size: 3 + in_tanf_payment_standard: 320 + # Standard of need (eligibility table) is unchanged + in_tanf_maximum_benefit: 513 + # Family of 3 maximum benefit (IC 12-14-2-5, effective 2025-07-01) + in_tanf_countable_income_for_payment: 0 + in_tanf_countable_income_eligible: true + in_tanf_payment_eligible: true + in_tanf_eligible: true + in_tanf: 513 + # Maximum benefit ($513) - countable income ($0) = $513 + +- name: Case 12, applicant income above old standard of need now receives a benefit in 2026. + period: 2026-01 + input: + people: + person1: + age: 30 + tanf_gross_unearned_income: 400 + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + is_tanf_enrolled: false + spm_unit_cash_assets: 500 + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + spm_unit_size: 3 + in_tanf_maximum_benefit: 513 + in_tanf_countable_income_for_payment: 400 + in_tanf_countable_income_for_eligibility: 400 + in_tanf_countable_income_eligible: true + # Net ($400) < maximum grant ($513); gross ($400) < 35% FPG -> eligible + in_tanf_payment_eligible: true + # $400 < maximum benefit ($513); above the old standard of need ($320) + in_tanf_eligible: true + in_tanf: 113 + # Maximum benefit ($513) - countable income ($400) = $113 diff --git a/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.py b/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.py index 88ffa64028b..7e0f4afb870 100644 --- a/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.py +++ b/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.py @@ -9,21 +9,36 @@ class in_tanf_countable_income_eligible(Variable): reference = ( "https://iar.iga.in.gov/code/2026/470/10.3#470-10.3-4-1", "https://iga.in.gov/laws/2025/ic/titles/12/#12-14-1-1.7", + "https://www.in.gov/fssa/dfr/files/3000.pdf#page=4", + "https://www.in.gov/fssa/dfr/files/3000.pdf#page=5", ) defined_for = StateCode.IN def formula(spm_unit, period, parameters): - # Initial: standard of need; Continuing: FPL * rate - p = parameters(period).gov.states["in"].fssa.tanf + p = parameters(period).gov.states["in"].fssa.tanf.eligibility countable = spm_unit("in_tanf_countable_income_for_eligibility", period) - is_enrolled = spm_unit("is_tanf_enrolled", period) + fpg = spm_unit("in_tanf_fpg", period) - fpg = spm_unit("tanf_fpg", period) - continuing_threshold = fpg * p.eligibility.continuing.fpg_rate + # Continuing/enrolled recipients: countable net income below 100% FPG + # (470 IAC 10.3-4-1; FSSA 3010.15.05). + continuing_eligible = countable < fpg * p.continuing.fpg_rate - threshold = where( - is_enrolled, - continuing_threshold, - spm_unit("in_tanf_payment_standard", period), + # Initial applicants. The net income standard is the standard of need + # before 2025-07-01 (maximum grant rate of 0) and the maximum grant + # from 2025-07-01 (FSSA 3010.15.00). From 2025-07-01 there is also a + # gross income screen at 35% FPG, rising to 50% after June 30, 2027 + # (IC 12-14-1-1.7); before then the screen is inactive. + standard_of_need = spm_unit("in_tanf_payment_standard", period) + maximum_grant = spm_unit("in_tanf_maximum_benefit", period) + grant_rate = p.initial.net_income.maximum_grant_rate + net_threshold = where( + grant_rate > 0, maximum_grant * grant_rate, standard_of_need + ) + gross_income = spm_unit("in_tanf_gross_income", period) + gross_threshold = spm_unit("in_tanf_initial_gross_income_standard", period) + initial_eligible = (countable < net_threshold) & ( + gross_income < gross_threshold ) - return countable < threshold + + is_enrolled = spm_unit("is_tanf_enrolled", period) + return where(is_enrolled, continuing_eligible, initial_eligible) diff --git a/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_fpg.py b/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_fpg.py new file mode 100644 index 00000000000..d8461de9178 --- /dev/null +++ b/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_fpg.py @@ -0,0 +1,19 @@ +import numpy as np + +from policyengine_us.model_api import * + + +class in_tanf_fpg(Variable): + value_type = float + entity = SPMUnit + label = "Indiana TANF federal poverty guideline" + unit = USD + definition_period = MONTH + reference = "https://www.in.gov/fssa/dfr/files/3000.pdf#page=5" + defined_for = StateCode.IN + + def formula(spm_unit, period, parameters): + size = spm_unit("spm_unit_size", period.this_year) + p = parameters(period).gov.states["in"].fssa.tanf.eligibility.fpg + annual_fpg = p.first_person + p.additional_person * (size - 1) + return np.ceil(annual_fpg / MONTHS_IN_YEAR) diff --git a/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_initial_gross_income_standard.py b/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_initial_gross_income_standard.py new file mode 100644 index 00000000000..f8dd1f7cd40 --- /dev/null +++ b/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_initial_gross_income_standard.py @@ -0,0 +1,21 @@ +import numpy as np + +from policyengine_us.model_api import * + + +class in_tanf_initial_gross_income_standard(Variable): + value_type = float + entity = SPMUnit + label = "Indiana TANF initial applicant gross income standard" + unit = USD + definition_period = MONTH + reference = ( + "https://iga.in.gov/laws/2025/ic/titles/12/#12-14-1-1.7", + "https://www.in.gov/fssa/dfr/files/3000.pdf#page=4", + ) + defined_for = StateCode.IN + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states["in"].fssa.tanf.eligibility + fpg = spm_unit("in_tanf_fpg", period) + return np.ceil(fpg * p.initial.gross_income.fpg_rate) diff --git a/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_payment_eligible.py b/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_payment_eligible.py index 273a61a33c5..e18c2de0162 100644 --- a/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_payment_eligible.py +++ b/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_payment_eligible.py @@ -7,12 +7,12 @@ class in_tanf_payment_eligible(Variable): label = "Indiana TANF payment eligible" definition_period = MONTH reference = ( - "https://iar.iga.in.gov/code/2026/470/10.3#470-10.3-4-3", "https://iga.in.gov/laws/2025/ic/titles/12/#12-14-2-5", + "https://www.in.gov/fssa/dfr/files/3000.pdf#page=7", ) defined_for = StateCode.IN def formula(spm_unit, period, parameters): countable = spm_unit("in_tanf_countable_income_for_payment", period) - payment_standard = spm_unit("in_tanf_payment_standard", period) - return countable < payment_standard + maximum_benefit = spm_unit("in_tanf_maximum_benefit", period) + return countable < maximum_benefit diff --git a/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf.py b/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf.py index 55df3dda1f9..15692230c87 100644 --- a/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf.py +++ b/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf.py @@ -14,7 +14,9 @@ class in_tanf(Variable): defined_for = "in_tanf_eligible" def formula(spm_unit, period, parameters): - payment_standard = spm_unit("in_tanf_payment_standard", period) + maximum_benefit = spm_unit("in_tanf_maximum_benefit", period) countable_income = spm_unit("in_tanf_countable_income_for_payment", period) - benefit = max_(payment_standard - countable_income, 0) - return min_(benefit, payment_standard) + benefit = max_(maximum_benefit - countable_income, 0) + # Cap at the maximum benefit so negative countable income cannot + # inflate the grant above the maximum. + return min_(benefit, maximum_benefit) diff --git a/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf_maximum_benefit.py b/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf_maximum_benefit.py new file mode 100644 index 00000000000..d0ef2f0e2c4 --- /dev/null +++ b/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf_maximum_benefit.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class in_tanf_maximum_benefit(Variable): + value_type = float + entity = SPMUnit + label = "Indiana TANF maximum benefit amount" + unit = USD + definition_period = MONTH + reference = ( + "https://iga.in.gov/laws/2025/ic/titles/12/#12-14-2-5", + "https://www.in.gov/fssa/dfr/files/3000.pdf#page=7", + ) + defined_for = StateCode.IN + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states["in"].fssa.tanf.amount_of_assistance + size = spm_unit("spm_unit_size", period.this_year) + capped_size = min_(size, p.max_table_size) + additional_members = max_(size - p.max_table_size, 0) + return p.amount[capped_size] + additional_members * p.additional_member_amount diff --git a/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf_payment_standard.py b/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf_payment_standard.py index 61f745d799d..0d54def2b36 100644 --- a/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf_payment_standard.py +++ b/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf_payment_standard.py @@ -15,5 +15,6 @@ class in_tanf_payment_standard(Variable): def formula(spm_unit, period, parameters): p = parameters(period).gov.states["in"].fssa.tanf.standard_of_need - capped_size = min_(spm_unit("spm_unit_size", period), p.max_unit_size) + size = spm_unit("spm_unit_size", period.this_year) + capped_size = min_(size, p.max_unit_size) return p.amount[capped_size] diff --git a/policyengine_us/variables/gov/states/in/fssa/tanf/income/in_tanf_gross_income.py b/policyengine_us/variables/gov/states/in/fssa/tanf/income/in_tanf_gross_income.py new file mode 100644 index 00000000000..282d3e4e129 --- /dev/null +++ b/policyengine_us/variables/gov/states/in/fssa/tanf/income/in_tanf_gross_income.py @@ -0,0 +1,13 @@ +from policyengine_us.model_api import * + + +class in_tanf_gross_income(Variable): + value_type = float + entity = SPMUnit + label = "Indiana TANF gross income" + unit = USD + definition_period = MONTH + reference = "https://iga.in.gov/laws/2025/ic/titles/12/#12-14-1-1.7" + defined_for = StateCode.IN + + adds = ["tanf_gross_earned_income", "tanf_gross_unearned_income"]