diff --git a/changelog.d/backdate-federal-tanf-income-sources.changed.md b/changelog.d/backdate-federal-tanf-income-sources.changed.md new file mode 100644 index 00000000000..c27fd47b2d6 --- /dev/null +++ b/changelog.d/backdate-federal-tanf-income-sources.changed.md @@ -0,0 +1 @@ +Backdate federal TANF earned and unearned income source parameters to 1997-07-01. diff --git a/changelog.d/backdate-in-tanf.added.md b/changelog.d/backdate-in-tanf.added.md new file mode 100644 index 00000000000..6289b704d6f --- /dev/null +++ b/changelog.d/backdate-in-tanf.added.md @@ -0,0 +1 @@ +Backdate Indiana TANF parameters to 1997 program inception. Differentiate applicant vs. recipient income deductions with 4-month earned income disregard limit. diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/continuing/fpg_rate.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/continuing/fpg_rate.yaml index d567c1b88c6..2c6d1d3aeaf 100644 --- a/policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/continuing/fpg_rate.yaml +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/continuing/fpg_rate.yaml @@ -1,12 +1,14 @@ description: Indiana uses this multiplier of the federal poverty guideline for continuing eligibility under the Temporary Assistance for Needy Families program. values: - 2023-07-01: 1 + 1997-10-01: 1 metadata: unit: /1 period: month label: Indiana TANF continuing eligibility FPG rate reference: - - title: 470 IAC 10.3-4-1 + - title: 470 IAC 10.3-4-1 (net income at or below 100% FPG) href: https://iar.iga.in.gov/code/2026/470/10.3#470-10.3-4-1 + - title: FSSA DFR Chapter 3000, Section 3010.15.05 (100% FPG continuing eligibility) + href: https://www.in.gov/fssa/dfr/files/3000.pdf#page=5 diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/income/deductions/benefit/earned_income_disregard/rate.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/income/deductions/benefit/earned_income_disregard/rate.yaml index 46cd8cb4c89..3cc6ecdef90 100644 --- a/policyengine_us/parameters/gov/states/in/fssa/tanf/income/deductions/benefit/earned_income_disregard/rate.yaml +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/income/deductions/benefit/earned_income_disregard/rate.yaml @@ -1,7 +1,7 @@ description: Indiana excludes this share of earned income when calculating benefits under the Temporary Assistance for Needy Families program. values: - 2023-07-01: 0.75 + 1997-10-01: 0.75 metadata: unit: /1 @@ -10,3 +10,5 @@ metadata: reference: - title: 470 IAC 10.3-4-4(d)(1) href: https://iar.iga.in.gov/code/2026/470/10.3#470-10.3-4-4 + - title: FSSA DFR Chapter 3400, Section 3450.35.05 (75% earned income disregard) + href: https://www.in.gov/fssa/dfr/files/3400.pdf#page=41 diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/income/deductions/eligibility/earned_income_disregard/months.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/income/deductions/eligibility/earned_income_disregard/months.yaml new file mode 100644 index 00000000000..7f2dd6b73ba --- /dev/null +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/income/deductions/eligibility/earned_income_disregard/months.yaml @@ -0,0 +1,14 @@ +description: Indiana applies the earned income disregard for this number of months under the Temporary Assistance for Needy Families program. + +values: + 1997-10-01: 4 + +metadata: + unit: month + period: month + label: Indiana TANF eligibility earned income disregard months + reference: + - title: 470 IAC 10.3-4-4(c)(2) + href: https://iar.iga.in.gov/code/2026/470/10.3#470-10.3-4-4 + - title: FSSA DFR Chapter 3400, Section 3450.25.00 ($30 and 1/3 disregard) + href: https://www.in.gov/fssa/dfr/files/3400.pdf#page=38 diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/income/deductions/eligibility/earned_income_disregard/rate.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/income/deductions/eligibility/earned_income_disregard/rate.yaml index ed09c6ed7da..626c7bc21ef 100644 --- a/policyengine_us/parameters/gov/states/in/fssa/tanf/income/deductions/eligibility/earned_income_disregard/rate.yaml +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/income/deductions/eligibility/earned_income_disregard/rate.yaml @@ -1,7 +1,7 @@ description: Indiana excludes this share of earned income when determining eligibility under the Temporary Assistance for Needy Families program. values: - 2023-07-01: 0.33 + 1997-10-01: 0.33 metadata: unit: /1 @@ -10,3 +10,5 @@ metadata: reference: - title: 470 IAC 10.3-4-4(c)(2) href: https://iar.iga.in.gov/code/2026/470/10.3#470-10.3-4-4 + - title: FSSA DFR Chapter 3400, Section 3450.25.00 ($30 and 1/3 disregard) + href: https://www.in.gov/fssa/dfr/files/3400.pdf#page=38 diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/income/deductions/eligibility/flat_disregard/amount.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/income/deductions/eligibility/flat_disregard/amount.yaml index 202290bbaca..bb5114e7789 100644 --- a/policyengine_us/parameters/gov/states/in/fssa/tanf/income/deductions/eligibility/flat_disregard/amount.yaml +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/income/deductions/eligibility/flat_disregard/amount.yaml @@ -1,7 +1,7 @@ description: Indiana deducts this amount from earned income when determining eligibility under the Temporary Assistance for Needy Families program. values: - 2023-07-01: 30 + 1997-10-01: 30 metadata: unit: currency-USD @@ -10,3 +10,5 @@ metadata: reference: - title: 470 IAC 10.3-4-4(c)(2) href: https://iar.iga.in.gov/code/2026/470/10.3#470-10.3-4-4 + - title: FSSA DFR Chapter 3400, Section 3450.25.00 ($30 and 1/3 disregard) + href: https://www.in.gov/fssa/dfr/files/3400.pdf#page=38 diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/income/deductions/work_expense/amount.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/income/deductions/work_expense/amount.yaml index a917a2db707..b3478490ccc 100644 --- a/policyengine_us/parameters/gov/states/in/fssa/tanf/income/deductions/work_expense/amount.yaml +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/income/deductions/work_expense/amount.yaml @@ -1,7 +1,7 @@ description: Indiana deducts this amount from gross earned income as work-related expenses under the Temporary Assistance for Needy Families program. values: - 2023-07-01: 90 + 1997-10-01: 90 metadata: unit: currency-USD @@ -10,3 +10,5 @@ metadata: reference: - title: 470 IAC 10.3-4-4(c)(1) href: https://iar.iga.in.gov/code/2026/470/10.3#470-10.3-4-4 + - title: FSSA DFR Chapter 3400, Section 3450.20.00 ($90 work expense disregard) + href: https://www.in.gov/fssa/dfr/files/3400.pdf#page=38 diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/resources/limit/at_application/amount.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/resources/limit/at_application/amount.yaml index 72170a781a0..5d3c0ee30a5 100644 --- a/policyengine_us/parameters/gov/states/in/fssa/tanf/resources/limit/at_application/amount.yaml +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/resources/limit/at_application/amount.yaml @@ -1,12 +1,14 @@ description: Indiana limits resources to this amount when applying for the Temporary Assistance for Needy Families program. values: - 2023-07-01: 1_000 + 1997-10-01: 1_000 metadata: unit: currency-USD period: month label: Indiana TANF resource limit at application amount reference: - - title: 470 IAC 10.3-4-2 + - title: 470 IAC 10.3-4-2(1) href: https://iar.iga.in.gov/code/2026/470/10.3#470-10.3-4-2 + - title: FSSA DFR Chapter 3000, Section 3005.10.00 (resource limits) + href: https://www.in.gov/fssa/dfr/files/3000.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/resources/limit/while_receiving/amount.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/resources/limit/while_receiving/amount.yaml index 72a58354fe9..2040275ab2a 100644 --- a/policyengine_us/parameters/gov/states/in/fssa/tanf/resources/limit/while_receiving/amount.yaml +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/resources/limit/while_receiving/amount.yaml @@ -1,12 +1,17 @@ description: Indiana limits resources to this amount while receiving the Temporary Assistance for Needy Families program. values: - 2023-07-01: 10_000 + 1997-10-01: 1_500 + 2022-07-01: 10_000 metadata: unit: currency-USD period: month label: Indiana TANF resource limit while receiving amount reference: - - title: IC 12-14-1-1(b) + - title: IC 12-14-1-1(b), as amended by P.L.83-2022, SEC.2 href: https://iga.in.gov/laws/2025/ic/titles/12/#12-14-1-1 + - title: FSSA DFR Chapter 3000, Section 3005.10.00 (resource limits effective 7/1/2022) + href: https://www.in.gov/fssa/dfr/files/3000.pdf#page=2 + - title: Urban Institute Welfare Rules Database, Table L8 ($1,500 recipient limit as of July 1998) + href: https://wrd.urban.org/sites/default/files/documents/2023-09/311111-The-Welfare-Rules-Databook-State-Policies-as-of-July--.PDF#page=160 diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/resources/vehicle_exemption/amount.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/resources/vehicle_exemption/amount.yaml index d455bcbcd2d..58b483fcd3d 100644 --- a/policyengine_us/parameters/gov/states/in/fssa/tanf/resources/vehicle_exemption/amount.yaml +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/resources/vehicle_exemption/amount.yaml @@ -1,7 +1,10 @@ description: Indiana excludes this amount of vehicle equity from countable resources under the Temporary Assistance for Needy Families program. values: - 2023-07-01: 20_000 + 1997-10-01: 1_000 + 1999-07-01: 5_000 + 2021-07-01: 10_000 + 2022-07-01: 20_000 metadata: unit: currency-USD @@ -10,3 +13,7 @@ metadata: reference: - title: IC 12-14-2-1(b)(2) href: https://iga.in.gov/laws/2025/ic/titles/12/#12-14-2-1 + - title: FSSA DFR Chapter 2600, Section 2615.60.15 ($10,000 until 6/30/2022, $20,000 effective 7/1/2022) + href: https://www.in.gov/fssa/dfr/files/2600.pdf#page=30 + - title: Urban Institute Welfare Rules Database, Table L9 ($1,000 at inception, $5,000 from July 1999, $10,000 from July 2021) + href: https://wrd.urban.org/welfare-rules-databook diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/standard_of_need/amount.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/standard_of_need/amount.yaml index 41e71620a2b..bfab15af01f 100644 --- a/policyengine_us/parameters/gov/states/in/fssa/tanf/standard_of_need/amount.yaml +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/standard_of_need/amount.yaml @@ -1,24 +1,34 @@ description: Indiana provides this amount as the standard of need under the Temporary Assistance for Needy Families program. 1: + 1997-10-01: 139 2023-07-01: 155 2: + 1997-10-01: 229 2023-07-01: 255 3: + 1997-10-01: 288 2023-07-01: 320 4: + 1997-10-01: 346 2023-07-01: 385 5: + 1997-10-01: 405 2023-07-01: 450 6: + 1997-10-01: 463 2023-07-01: 515 7: + 1997-10-01: 522 2023-07-01: 580 8: + 1997-10-01: 580 2023-07-01: 645 9: + 1997-10-01: 639 2023-07-01: 710 10: + 1997-10-01: 697 2023-07-01: 775 metadata: @@ -27,10 +37,12 @@ metadata: breakdown: - range(1, 11) breakdown_labels: - - Household size + - Assistance unit size label: Indiana TANF standard of need amount reference: - 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 - - title: IC 12-14-2-5 + - title: IC 12-14-2-5 (amount of assistance; standard of need) href: https://iga.in.gov/laws/2025/ic/titles/12/#12-14-2-5 + - title: Indiana DCS Unlicensed Relative Placements, Table 3 (corroborates pre-2023 standard of need values) + href: https://www.in.gov/dcs/files/16.2%20Assistance%20for%20Unlicensed%20Relative%20Placements.pdf#page=7 diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/standard_of_need/max_unit_size.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/standard_of_need/max_unit_size.yaml index ba29895fdb6..267136bd61e 100644 --- a/policyengine_us/parameters/gov/states/in/fssa/tanf/standard_of_need/max_unit_size.yaml +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/standard_of_need/max_unit_size.yaml @@ -1,12 +1,12 @@ description: Indiana sets this as the maximum unit size for standard of need lookup under the Temporary Assistance for Needy Families program. values: - 2023-07-01: 10 + 1997-10-01: 10 metadata: unit: person period: year label: Indiana TANF standard of need max unit size reference: - - title: 470 IAC 10.3-4-3 + - 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/tests/policy/baseline/gov/states/in/fssa/tanf/benefit/in_tanf_payment_standard.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/benefit/in_tanf_payment_standard.yaml index 93c2c7a849f..05a56b20385 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/benefit/in_tanf_payment_standard.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/benefit/in_tanf_payment_standard.yaml @@ -49,6 +49,30 @@ output: in_tanf_payment_standard: 515 +- name: Payment standard for family of 7 + period: 2024-01 + input: + spm_unit_size: 7 + state_code: IN + output: + in_tanf_payment_standard: 580 + +- name: Payment standard for family of 8 + period: 2024-01 + input: + spm_unit_size: 8 + state_code: IN + output: + in_tanf_payment_standard: 645 + +- name: Payment standard for family of 9 + period: 2024-01 + input: + spm_unit_size: 9 + state_code: IN + output: + in_tanf_payment_standard: 710 + - name: Payment standard for family of 10 period: 2024-01 input: diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/benefit/in_tanf_payment_standard_historical.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/benefit/in_tanf_payment_standard_historical.yaml new file mode 100644 index 00000000000..eeea1318130 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/benefit/in_tanf_payment_standard_historical.yaml @@ -0,0 +1,108 @@ +# Historical payment standard tests (pre-SEA 265 era) +# Benefits were frozen at 1988 AFDC levels from 1997-10-01 through 2023-06-30 + +- name: Pre-reform payment standard for family of 1 + period: 2020-01 + input: + spm_unit_size: 1 + state_code: IN + output: + in_tanf_payment_standard: 139 + +- name: Pre-reform payment standard for family of 2 + period: 2020-01 + input: + spm_unit_size: 2 + state_code: IN + output: + in_tanf_payment_standard: 229 + +- name: Pre-reform payment standard for family of 3 + period: 2020-01 + input: + spm_unit_size: 3 + state_code: IN + output: + in_tanf_payment_standard: 288 + +- name: Pre-reform payment standard for family of 4 + period: 2020-01 + input: + spm_unit_size: 4 + state_code: IN + output: + in_tanf_payment_standard: 346 + +- name: Pre-reform payment standard for family of 5 + period: 2020-01 + input: + spm_unit_size: 5 + state_code: IN + output: + in_tanf_payment_standard: 405 + +- name: Pre-reform payment standard for family of 6 + period: 2020-01 + input: + spm_unit_size: 6 + state_code: IN + output: + in_tanf_payment_standard: 463 + +- name: Pre-reform payment standard for family of 7 + period: 2020-01 + input: + spm_unit_size: 7 + state_code: IN + output: + in_tanf_payment_standard: 522 + +- name: Pre-reform payment standard for family of 8 + period: 2020-01 + input: + spm_unit_size: 8 + state_code: IN + output: + in_tanf_payment_standard: 580 + +- name: Pre-reform payment standard for family of 9 + period: 2020-01 + input: + spm_unit_size: 9 + state_code: IN + output: + in_tanf_payment_standard: 639 + +- name: Pre-reform payment standard for family of 10 + period: 2020-01 + input: + spm_unit_size: 10 + state_code: IN + output: + in_tanf_payment_standard: 697 + +# Transition boundary tests + +- name: Pre-reform January 2023 still uses old values + period: 2023-01 + input: + spm_unit_size: 3 + state_code: IN + output: + in_tanf_payment_standard: 288 + +- name: Post-reform January 2024 uses new values + period: 2024-01 + input: + spm_unit_size: 3 + state_code: IN + output: + in_tanf_payment_standard: 320 + +- name: Pre-reform era at program inception (1998) + period: 1998-01 + input: + spm_unit_size: 3 + state_code: IN + output: + in_tanf_payment_standard: 288 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 new file mode 100644 index 00000000000..d3a36661274 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/edge_cases.yaml @@ -0,0 +1,145 @@ +# Indiana TANF edge case tests + +# Edge case: Earner at exactly $90 (work expense disregard boundary) +- name: Earner at exactly $90 - all income disregarded for eligibility + period: 2024-01 + input: + people: + person1: + tanf_gross_earned_income: 90 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: IN + output: + in_tanf_countable_earned_income_for_eligibility: [0, 0] + # Applicant (not enrolled): $90 - $90 = $0 + in_tanf_countable_earned_income: [22.5, 22.5] + # $90 * 0.25 = $22.50 + +# Edge case: Earner at exactly $120 ($90 + $30 disregard boundary) +- name: Earner at exactly $120 - flat disregard exactly zeros remainder + period: 2024-01 + input: + people: + person1: + tanf_gross_earned_income: 120 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: IN + output: + in_tanf_countable_earned_income_for_eligibility: [0, 0] + # $120 - $90 = $30; $30 - $30 = $0; $0 * 0.67 = $0 + +# Edge case: Family of 8 (max pre-reform) vs family of 9 +- name: Family of 8 gets size-8 standard pre-reform + period: 2020-01 + input: + spm_unit_size: 8 + state_code: IN + output: + in_tanf_payment_standard: 580 + +- name: Family of 9 gets size-9 standard pre-reform + period: 2020-01 + input: + spm_unit_size: 9 + state_code: IN + output: + in_tanf_payment_standard: 639 + +# Edge case: Family of 10 post-reform gets size-10 value +- name: Family of 10 gets size-10 standard post-reform + period: 2024-01 + input: + spm_unit_size: 10 + state_code: IN + output: + in_tanf_payment_standard: 775 + +# Edge case: Family of 12 capped at max unit size post-reform +- name: Family of 12 capped at size-10 post-reform + period: 2024-01 + input: + spm_unit_size: 12 + state_code: IN + output: + in_tanf_payment_standard: 775 + +# Edge case: Income just below eligibility threshold +- name: Income just below standard of need threshold + period: 2024-01 + input: + in_tanf_countable_income_for_eligibility: 319 + in_tanf_payment_standard: 320 + is_tanf_enrolled: false + state_code: IN + output: + in_tanf_countable_income_eligible: true + # $319 < $320 = true + +# Edge case: Income at exactly the threshold +- name: Income at exactly standard of need threshold + period: 2024-01 + input: + in_tanf_countable_income_for_eligibility: 320 + in_tanf_payment_standard: 320 + is_tanf_enrolled: false + state_code: IN + output: + in_tanf_countable_income_eligible: false + # $320 < $320 = false (strict less-than) + +# Edge case: Resources at exactly the application limit +- name: Resources at exactly $1,000 application limit + period: 2024-01 + input: + state_code: IN + in_tanf_countable_resources: 1_000 + is_tanf_enrolled: false + output: + in_tanf_resources_eligible: true + # $1,000 <= $1,000 = true + +# Edge case: Resources $1 over application limit +- name: Resources $1 over application limit + period: 2024-01 + input: + state_code: IN + in_tanf_countable_resources: 1_001 + is_tanf_enrolled: false + output: + in_tanf_resources_eligible: false + +# Edge case: Resources at exactly enrolled limit +- name: Resources at exactly $10,000 enrolled limit + period: 2024-01 + input: + state_code: IN + in_tanf_countable_resources: 10_000 + is_tanf_enrolled: true + output: + in_tanf_resources_eligible: true + +# Edge case: Benefit equals exactly $1 (near-zero benefit) +- name: Benefit of exactly $1 + period: 2024-01 + input: + in_tanf_eligible: true + in_tanf_payment_standard: 320 + in_tanf_countable_income_for_payment: 319 + state_code: IN + output: + in_tanf: 1 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 8b51f3580fb..1981c761495 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 @@ -1,5 +1,5 @@ # Tests for in_tanf_countable_income_eligible -# Uses eligibility disregards: $90/earner, $30/unit, 1/3 of remainder +# Uses eligibility disregards: $90/earner, $30/earner, 1/3 of remainder # Compares to standard of need (initial) or FPL (continuing) - name: Family of 3 with zero income - eligible @@ -39,6 +39,7 @@ spm_units: spm_unit: members: [person1, person2, person3] + is_tanf_enrolled: true households: household: members: [person1, person2, person3] @@ -46,13 +47,13 @@ output: in_tanf_countable_earned_income_for_eligibility: [120.6, 120.6, 120.6] # $300 - $90 (work expense) = $210 - # $210 - $30 (unit disregard) = $180 + # $210 - $30 (flat disregard) = $180 # $180 * (1 - 0.33) = $120.60 in_tanf_countable_income_for_eligibility: [120.6, 120.6, 120.6] in_tanf_countable_income_eligible: [true, true, true] - # Countable ($120.60) < standard of need ($320) → eligible + # Enrolled: countable ($120.60) < 100% FPL for 3 → eligible -- name: Family of 3 with moderate earned income - not eligible +- name: Applicant family of 3 with moderate earned income - not eligible period: 2024-01 input: people: @@ -66,18 +67,17 @@ 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_earned_income_for_eligibility: [321.6, 321.6, 321.6] - # $600 - $90 = $510 - # $510 - $30 = $480 - # $480 * 0.67 = $321.60 - in_tanf_countable_income_for_eligibility: [321.6, 321.6, 321.6] + in_tanf_countable_earned_income_for_eligibility: [510, 510, 510] + # Applicant: $600 - $90 = $510 ($90 work expense only) + in_tanf_countable_income_for_eligibility: [510, 510, 510] in_tanf_countable_income_eligible: [false, false, false] - # Countable ($321.60) >= standard of need ($320) → not eligible + # Applicant threshold = standard of need ($320); $510 >= $320 → not eligible - name: Family of 2 with earned income at threshold - not eligible period: 2024-01 @@ -91,6 +91,7 @@ spm_units: spm_unit: members: [person1, person2] + is_tanf_enrolled: true households: household: members: [person1, person2] @@ -102,7 +103,7 @@ # $380 * 0.67 = $254.60 in_tanf_countable_income_for_eligibility: [254.6, 254.6] in_tanf_countable_income_eligible: [true, true] - # Countable ($254.60) < standard of need ($255) → eligible + # Enrolled: countable ($254.60) < 100% FPL for 2 → eligible - name: Two earners - each gets $90 disregard period: 2024-01 @@ -119,20 +120,18 @@ 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_earned_income_for_eligibility: [127.3, 127.3, 127.3] - # Person1: $200 - $90 = $110 - # Person2: $200 - $90 = $110 - # Unit total: $220 - # $220 - $30 = $190 - # $190 * 0.67 = $127.30 - in_tanf_countable_income_for_eligibility: [127.3, 127.3, 127.3] + in_tanf_countable_earned_income_for_eligibility: [107.2, 107.2, 107.2] + # Per earner: ($200-$90-$30)*0.67 = $80*0.67 = $53.60 + # Unit total: $53.60 + $53.60 = $107.20 + in_tanf_countable_income_for_eligibility: [107.2, 107.2, 107.2] in_tanf_countable_income_eligible: [true, true, true] - # Countable ($127.30) < standard of need ($320) → eligible + # Enrolled: countable ($107.20) < 100% FPL for 3 → eligible - name: Continuing eligibility uses FPL threshold period: 2024-01 diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/income/in_tanf_countable_earned_income_for_eligibility.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/income/in_tanf_countable_earned_income_for_eligibility.yaml index df24ab0de97..5e48502169a 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/income/in_tanf_countable_earned_income_for_eligibility.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/income/in_tanf_countable_earned_income_for_eligibility.yaml @@ -1,58 +1,62 @@ # Tests for in_tanf_countable_earned_income_for_eligibility -# Applies: $90/earner (per person), then $30 + 1/3 per unit +# Enrolled (months 1-4): $90/earner + $30 flat + 1/3 disregard +# Enrolled (months 5-12): $90/earner + $30 flat only +# Applicant (not enrolled): $90/earner only -- name: Family of 3 with 1 earner - gets $90 work expense disregard +# --- Continuing recipients (enrolled, January = month 1, phase 1) --- + +- name: Case 1, enrolled family of 3 with 1 earner. period: 2024-01 + absolute_error_margin: 0.1 input: people: - parent1: + person1: tanf_gross_earned_income: 400 - parent2: + person2: tanf_gross_earned_income: 0 - child: + person3: age: 10 spm_units: spm_unit: - members: [parent1, parent2, child] + members: [person1, person2, person3] + is_tanf_enrolled: true households: household: - members: [parent1, parent2, child] + members: [person1, person2, person3] state_code: IN output: in_tanf_countable_earned_income_for_eligibility: [187.6, 187.6, 187.6] - # 1 earner: $400 - $90 = $310 - # Unit total: $310 + # $400 - $90 = $310 # $310 - $30 = $280 # $280 * 0.67 = $187.60 -- name: Family of 3 with 2 earners - each gets $90 (total $180 disregard) +- name: Case 2, enrolled family of 3 with 2 earners. period: 2024-01 + absolute_error_margin: 0.1 input: people: - parent1: + person1: tanf_gross_earned_income: 200 - parent2: + person2: tanf_gross_earned_income: 200 - child: + person3: age: 10 spm_units: spm_unit: - members: [parent1, parent2, child] + members: [person1, person2, person3] + is_tanf_enrolled: true households: household: - members: [parent1, parent2, child] + members: [person1, person2, person3] state_code: IN output: - in_tanf_countable_earned_income_for_eligibility: [127.3, 127.3, 127.3] - # Parent1: $200 - $90 = $110 - # Parent2: $200 - $90 = $110 - # Unit total: $220 (vs $310 if only 1 earner had $400) - # $220 - $30 = $190 - # $190 * 0.67 = $127.30 - # Key: 2 earners = $180 disregard, 1 earner = $90 disregard + in_tanf_countable_earned_income_for_eligibility: [107.2, 107.2, 107.2] + # Per earner: ($200-$90-$30)*0.67 = $80*0.67 = $53.60 + # Unit total: $53.60 + $53.60 = $107.20 -- name: Single earner with low income +- name: Case 3, enrolled single earner with low income. period: 2024-01 + absolute_error_margin: 0.1 input: people: person1: @@ -62,6 +66,7 @@ spm_units: spm_unit: members: [person1, person2] + is_tanf_enrolled: true households: household: members: [person1, person2] @@ -72,8 +77,9 @@ # $210 - $30 = $180 # $180 * 0.67 = $120.60 -- name: Earner below work expense disregard +- name: Case 4, enrolled earner below work expense disregard. period: 2024-01 + absolute_error_margin: 0.1 input: people: person1: @@ -83,6 +89,7 @@ spm_units: spm_unit: members: [person1, person2] + is_tanf_enrolled: true households: household: members: [person1, person2] @@ -90,11 +97,10 @@ output: in_tanf_countable_earned_income_for_eligibility: [0, 0] # $50 - $90 = max(0, -40) = $0 - # $0 - $30 = max(0, -30) = $0 - # $0 * 0.67 = $0 -- name: Zero income +- name: Case 5, enrolled with zero income. period: 2024-01 + absolute_error_margin: 0.1 input: people: person1: @@ -104,9 +110,153 @@ spm_units: spm_unit: members: [person1, person2] + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: IN + output: + in_tanf_countable_earned_income_for_eligibility: [0, 0] + +# --- Per-earner deductions (all three disregards apply per individual) --- + +- name: Case 5b, enrolled 2 earners vs 1 earner with same total. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + tanf_gross_earned_income: 200 + person2: + tanf_gross_earned_income: 200 + person3: + age: 10 + 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_earned_income_for_eligibility: [107.2, 107.2, 107.2] + # Per earner: ($200-$90-$30)*0.67 = $80*0.67 = $53.60 + # Unit total: $53.60 + $53.60 = $107.20 + # Compare Case 1 (1 earner at $400): ($400-$90-$30)*0.67 = $187.60 + # 2 earners get more deductions ($90+$30 each = $240 total vs $120 for 1 earner) + +# --- Applicants (not enrolled, $90 work expense only) --- + +- name: Case 6, applicant with 1 earner. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + tanf_gross_earned_income: 400 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: false + households: + household: + members: [person1, person2] + state_code: IN + output: + in_tanf_countable_earned_income_for_eligibility: [310, 310] + # $400 - $90 = $310 (no $30 or 1/3 for applicants) + +- name: Case 7, applicant with low income. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + tanf_gross_earned_income: 300 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: false + households: + household: + members: [person1, person2] + state_code: IN + output: + in_tanf_countable_earned_income_for_eligibility: [210, 210] + # $300 - $90 = $210 + +- name: Case 8, applicant below work expense. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + tanf_gross_earned_income: 50 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: false households: household: members: [person1, person2] state_code: IN output: in_tanf_countable_earned_income_for_eligibility: [0, 0] + # $50 - $90 = max(0, -40) = $0 + +# --- YEAR period (exercises both calendar month paths) --- + +- name: Case 9, enrolled over full year. + period: 2024 + absolute_error_margin: 0.1 + input: + people: + person1: + tanf_gross_earned_income: 4_800 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: IN + output: + in_tanf_countable_earned_income_for_eligibility: [2_990.4, 2_990.4] + # Monthly gross: $4,800 / 12 = $400 + # $400 - $90 = $310, then $310 - $30 = $280 + # Months 1-4 (phase 1): $280 * 0.67 = $187.60 x 4 = $750.40 + # Months 5-12 (phase 2): $280 x 8 = $2,240.00 + # Annual total: $750.40 + $2,240.00 = $2,990.40 + +- name: Case 10, applicant over full year. + period: 2024 + absolute_error_margin: 0.1 + input: + people: + person1: + tanf_gross_earned_income: 4_800 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: false + households: + household: + members: [person1, person2] + state_code: IN + output: + in_tanf_countable_earned_income_for_eligibility: [3_720, 3_720] + # Monthly gross: $4,800 / 12 = $400 + # All 12 months: $400 - $90 = $310 + # Annual total: $310 x 12 = $3,720 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 fa34c564035..d10029f4651 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 @@ -49,6 +49,7 @@ spm_units: spm_unit: members: [person1, person2] + is_tanf_enrolled: true spm_unit_cash_assets: 800 households: household: @@ -63,7 +64,7 @@ # $200 × 0.25 (75% disregard) = $50 in_tanf_countable_income_for_payment: [50, 50] in_tanf_countable_income_eligible: [true, true] - # Countable for elig ($53.60) < standard of need ($255) → eligible + # Enrolled: countable for elig ($53.60) < 100% FPL for 2 → eligible in_tanf_payment_eligible: [true, true] # Countable for benefit ($50) < standard of need ($255) → eligible in_tanf_payment_standard: [255, 255] @@ -85,6 +86,7 @@ spm_units: spm_unit: members: [person1, person2] + is_tanf_enrolled: true spm_unit_cash_assets: 700 households: household: @@ -101,7 +103,7 @@ in_tanf_countable_income_for_payment: [175, 175] # $75 (earned) + $100 (unearned) = $175 in_tanf_countable_income_eligible: [true, true] - # Countable for elig ($220.60) < standard of need ($255) → eligible + # Enrolled: countable for elig ($220.60) < 100% FPL for 2 → eligible in_tanf_payment_eligible: [true, true] # Countable for benefit ($175) < standard of need ($255) → eligible in_tanf_payment_standard: [255, 255] @@ -109,7 +111,7 @@ in_tanf: [80, 80] # Max benefit ($255) - countable income ($175) = $80 -- name: Case 4 - High earner exceeds eligibility threshold +- name: Case 4 - Applicant high earner exceeds eligibility threshold period: 2024-01 input: people: @@ -123,6 +125,7 @@ spm_units: spm_unit: members: [person1, person2, person3] + is_tanf_enrolled: false spm_unit_cash_assets: 900 households: household: @@ -130,14 +133,14 @@ state_code: IN output: spm_unit_size: [3, 3, 3] - in_tanf_countable_earned_income_for_eligibility: [321.6, 321.6, 321.6] - # $600 - $90 = $510 → $510 - $30 = $480 → $480 * 0.67 = $321.60 - in_tanf_countable_income_for_eligibility: [321.6, 321.6, 321.6] + in_tanf_countable_earned_income_for_eligibility: [510, 510, 510] + # Applicant: $600 - $90 = $510 ($90 work expense only) + in_tanf_countable_income_for_eligibility: [510, 510, 510] in_tanf_countable_earned_income: [150, 150, 150] # $600 × 0.25 = $150 in_tanf_countable_income_for_payment: [150, 150, 150] in_tanf_countable_income_eligible: [false, false, false] - # Countable for elig ($321.60) >= standard of need ($320) → NOT eligible + # Applicant threshold = standard of need ($320); $510 >= $320 → NOT eligible in_tanf_payment_eligible: [true, true, true] # Countable for benefit ($150) < standard of need ($320) → eligible in_tanf_payment_standard: [320, 320, 320] @@ -161,6 +164,7 @@ spm_units: spm_unit: members: [person1, person2, person3, person4] + is_tanf_enrolled: true spm_unit_cash_assets: 1_500 households: household: @@ -175,7 +179,7 @@ # $300 × 0.25 = $75 in_tanf_countable_income_for_payment: [75, 75, 75, 75] in_tanf_countable_income_eligible: [true, true, true, true] - # Countable for elig ($120.60) < standard of need ($385) → eligible + # Enrolled: countable for elig ($120.60) < 100% FPL for 4 → eligible in_tanf_payment_eligible: [true, true, true, true] # Countable for benefit ($75) < standard of need ($385) → eligible in_tanf_payment_standard: [385, 385, 385, 385] @@ -199,6 +203,7 @@ spm_units: spm_unit: members: [person1, person2, person3] + is_tanf_enrolled: true spm_unit_cash_assets: 500 households: household: @@ -206,16 +211,15 @@ state_code: IN output: spm_unit_size: [3, 3, 3] - in_tanf_countable_earned_income_for_eligibility: [127.3, 127.3, 127.3] - # Person1: $200 - $90 = $110 - # Person2: $200 - $90 = $110 - # Unit total: $220 - $30 = $190 → $190 * 0.67 = $127.30 - in_tanf_countable_income_for_eligibility: [127.3, 127.3, 127.3] + in_tanf_countable_earned_income_for_eligibility: [107.2, 107.2, 107.2] + # Per earner: ($200-$90-$30)*0.67 = $80*0.67 = $53.60 + # Unit total: $53.60 + $53.60 = $107.20 + in_tanf_countable_income_for_eligibility: [107.2, 107.2, 107.2] in_tanf_countable_earned_income: [100, 100, 100] # ($200 + $200) × 0.25 = $100 in_tanf_countable_income_for_payment: [100, 100, 100] in_tanf_countable_income_eligible: [true, true, true] - # Countable for elig ($127.30) < standard of need ($320) → eligible + # Countable for elig ($107.20) < FPG for 3 → eligible in_tanf_payment_eligible: [true, true, true] # Countable for benefit ($100) < standard of need ($320) → eligible in_tanf_payment_standard: [320, 320, 320] @@ -247,3 +251,114 @@ in_tanf_eligible: false # Single adult with no children → not demographically eligible in_tanf: 0 + +- name: Case 8, enrolled family with 2018 historical parameters. + period: 2018 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + tanf_gross_earned_income: 3_600 + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + is_tanf_enrolled: true + spm_unit_cash_assets: 500 + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + in_tanf_countable_earned_income_for_eligibility: [1_922.4, 1_922.4, 1_922.4] + # Monthly gross: $3,600 / 12 = $300 + # Months 1-4 (phase 1): ($300-$90-$30)*0.67 = $120.60 x 4 = $482.40 + # Months 5-12 (phase 2): $300-$90-$30 = $180 x 8 = $1,440 + # Annual: $482.40 + $1,440 = $1,922.40 + in_tanf_countable_income_for_eligibility: [1_922.4, 1_922.4, 1_922.4] + in_tanf_countable_earned_income: [900, 900, 900] + # $300 x 0.25 = $75/month x 12 = $900 + in_tanf_countable_income_for_payment: [900, 900, 900] + in_tanf_payment_standard: [3_456, 3_456, 3_456] + # Family of 3, 2018 (pre-2023): $288/month x 12 = $3,456 + in_tanf: [2_556, 2_556, 2_556] + # ($288 - $75) x 12 = $213 x 12 = $2,556 + +- name: Case 9, applicant with earned income. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 28 + tanf_gross_earned_income: 200 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: false + spm_unit_cash_assets: 800 + households: + household: + members: [person1, person2] + state_code: IN + output: + spm_unit_size: [2, 2] + in_tanf_countable_earned_income_for_eligibility: [110, 110] + # Applicant: $200 - $90 = $110 ($90 work expense only) + in_tanf_countable_income_for_eligibility: [110, 110] + in_tanf_countable_earned_income: [50, 50] + # $200 x 0.25 = $50 + in_tanf_countable_income_for_payment: [50, 50] + in_tanf_countable_income_eligible: [true, true] + # Applicant threshold = standard of need ($255); $110 < $255 → eligible + in_tanf_payment_eligible: [true, true] + in_tanf_payment_standard: [255, 255] + in_tanf_eligible: [true, true] + in_tanf: [205, 205] + # $255 - $50 = $205 + +- name: Case 10, applicant with mixed income near threshold. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 35 + tanf_gross_earned_income: 300 + person2: + age: 12 + tanf_gross_unearned_income: 100 + 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, 3, 3] + in_tanf_countable_earned_income_for_eligibility: [210, 210, 210] + # Applicant: $300 - $90 = $210 ($90 work expense only) + in_tanf_countable_income_for_eligibility: [310, 310, 310] + # $210 (earned) + $100 (unearned) = $310 + in_tanf_countable_earned_income: [75, 75, 75] + # $300 x 0.25 = $75 + in_tanf_countable_income_for_payment: [175, 175, 175] + # $75 + $100 = $175 + in_tanf_countable_income_eligible: [true, true, true] + # Applicant threshold = standard of need ($320); $310 < $320 → eligible + in_tanf_payment_eligible: [true, true, true] + in_tanf_payment_standard: [320, 320, 320] + in_tanf_eligible: [true, true, true] + in_tanf: [145, 145, 145] + # $320 - $175 = $145 diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/integration_historical.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/integration_historical.yaml new file mode 100644 index 00000000000..e25d5ec2b0c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/integration_historical.yaml @@ -0,0 +1,108 @@ +# Historical integration tests (pre-SEA 265 era) +# Tests the full benefit calculation pipeline with 1997-2023 parameter values + +- name: Pre-reform family of 3 with no income receives $288 + period: 2020-01 + input: + people: + person1: + age: 30 + tanf_gross_earned_income: 0 + tanf_gross_unearned_income: 0 + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_cash_assets: 500 + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + in_tanf_payment_standard: [288, 288, 288] + in_tanf_countable_income_for_payment: [0, 0, 0] + in_tanf_countable_income_eligible: [true, true, true] + in_tanf_payment_eligible: [true, true, true] + in_tanf: [288, 288, 288] + +- name: Pre-reform family of 3 with earned income + period: 2020-01 + input: + people: + person1: + age: 28 + tanf_gross_earned_income: 200 + person2: + age: 5 + person3: + age: 3 + spm_units: + spm_unit: + members: [person1, person2, person3] + is_tanf_enrolled: true + spm_unit_cash_assets: 800 + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + in_tanf_payment_standard: [288, 288, 288] + in_tanf_countable_earned_income: [50, 50, 50] + # $200 * 0.25 = $50 + in_tanf_countable_income_for_payment: [50, 50, 50] + in_tanf_countable_earned_income_for_eligibility: [53.6, 53.6, 53.6] + # $200 - $90 = $110 -> $110 - $30 = $80 -> $80 * 0.67 = $53.60 + in_tanf_countable_income_for_eligibility: [53.6, 53.6, 53.6] + in_tanf_countable_income_eligible: [true, true, true] + in_tanf_payment_eligible: [true, true, true] + in_tanf: [238, 238, 238] + # $288 - $50 = $238 + +- name: Pre-reform January 2023 family of 3 gets old benefit + period: 2023-01 + input: + people: + person1: + age: 30 + tanf_gross_earned_income: 0 + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_cash_assets: 500 + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + in_tanf_payment_standard: [288, 288, 288] + in_tanf: [288, 288, 288] + +- name: Post-reform January 2024 family of 3 gets new benefit + period: 2024-01 + input: + people: + person1: + age: 30 + tanf_gross_earned_income: 0 + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_cash_assets: 500 + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + in_tanf_payment_standard: [320, 320, 320] + in_tanf: [320, 320, 320] diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/resources/in_tanf_resources_eligible_historical.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/resources/in_tanf_resources_eligible_historical.yaml new file mode 100644 index 00000000000..48605cc4970 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/resources/in_tanf_resources_eligible_historical.yaml @@ -0,0 +1,58 @@ +# Historical resource eligibility tests (pre-SEA 265) +# While-receiving limit was $1,500 before July 2023, changed to $10,000 + +- name: Pre-reform enrolled family at $1,400 passes (under $1,500 limit) + period: 2020-01 + input: + state_code: IN + in_tanf_countable_resources: 1_400 + is_tanf_enrolled: true + output: + in_tanf_resources_eligible: true + +- name: Pre-reform enrolled family at $1,500 passes (at $1,500 limit) + period: 2020-01 + input: + state_code: IN + in_tanf_countable_resources: 1_500 + is_tanf_enrolled: true + output: + in_tanf_resources_eligible: true + +- name: Pre-reform enrolled family at $1,501 fails (over $1,500 limit) + period: 2020-01 + input: + state_code: IN + in_tanf_countable_resources: 1_501 + is_tanf_enrolled: true + output: + in_tanf_resources_eligible: false + +- name: Pre-reform applicant at $999 passes (under $1,000 limit) + period: 2020-01 + input: + state_code: IN + in_tanf_countable_resources: 999 + is_tanf_enrolled: false + output: + in_tanf_resources_eligible: true + +# Transition boundary tests + +- name: Pre-reform 2021 enrolled at $5,000 fails (old $1,500 limit) + period: 2021-01 + input: + state_code: IN + in_tanf_countable_resources: 5_000 + is_tanf_enrolled: true + output: + in_tanf_resources_eligible: false + +- name: Post-reform 2024 enrolled at $5,000 passes (new $10,000 limit) + period: 2024-01 + input: + state_code: IN + in_tanf_countable_resources: 5_000 + is_tanf_enrolled: true + output: + in_tanf_resources_eligible: true diff --git a/policyengine_us/variables/gov/states/in/fssa/tanf/income/in_tanf_countable_earned_income_for_eligibility.py b/policyengine_us/variables/gov/states/in/fssa/tanf/income/in_tanf_countable_earned_income_for_eligibility.py index f6a7d0beac4..95304a7552f 100644 --- a/policyengine_us/variables/gov/states/in/fssa/tanf/income/in_tanf_countable_earned_income_for_eligibility.py +++ b/policyengine_us/variables/gov/states/in/fssa/tanf/income/in_tanf_countable_earned_income_for_eligibility.py @@ -16,18 +16,37 @@ class in_tanf_countable_earned_income_for_eligibility(Variable): defined_for = StateCode.IN def formula(spm_unit, period, parameters): - # NOTE: The $30 and 1/3 disregard only applies for the first 4 months - # of continuing eligibility. This simplified implementation always - # applies the $30 and 1/3 disregard. + # NOTE: Uses calendar month as proxy for benefit duration. + # Actual policy tracks cumulative months since enrollment. + # All deductions ($90 work expense, $30 flat, 1/3 disregard) + # are applied per earner per 470 IAC 10.3-4-4(c). p = parameters(period).gov.states["in"].fssa.tanf.income.deductions person = spm_unit.members gross_earned = person("tanf_gross_earned_income", period) - # $90 per earner, then $30 + 1/3 per unit (470 IAC 10.3-4-4(c)) - after_work_expense = spm_unit.sum( - max_(gross_earned - p.work_expense.amount, 0) - ) + # (c)(1): $90 per earner + after_work_expense = max_(gross_earned - p.work_expense.amount, 0) + + is_enrolled = person.spm_unit("is_tanf_enrolled", period) + month = period.start.month + + # (c)(2): $30 per earner (enrolled, months 1-12) after_flat = max_( after_work_expense - p.eligibility.flat_disregard.amount, 0 ) - return after_flat * (1 - p.eligibility.earned_income_disregard.rate) + + # (c)(3): 1/3 per earner (enrolled, months 1-4 only) + in_one_third_phase = ( + month <= p.eligibility.earned_income_disregard.months + ) + with_one_third = after_flat * ( + 1 - p.eligibility.earned_income_disregard.rate + ) + enrolled_countable = where( + in_one_third_phase, with_one_third, after_flat + ) + + # Sum per-earner results to unit level + return spm_unit.sum( + where(is_enrolled, enrolled_countable, after_work_expense) + )