diff --git a/changelog.d/il-liheap-benefit-matrix.changed.md b/changelog.d/il-liheap-benefit-matrix.changed.md new file mode 100644 index 00000000000..55f55334fd1 --- /dev/null +++ b/changelog.d/il-liheap-benefit-matrix.changed.md @@ -0,0 +1 @@ +Replace Illinois LIHEAP simplified min/max payment model with full benefit matrix by fuel type, income bracket, and household size. \ No newline at end of file diff --git a/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/base_amount/max.yaml b/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/base_amount/max.yaml deleted file mode 100644 index a2bffd9afe1..00000000000 --- a/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/base_amount/max.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Illinois provides up to this amount of benefit to households under the Low Income Home Energy Assistance Program. -values: - 2024-10-01: 2_075 - -metadata: - period: year - unit: currency-USD - label: Illinois LIHEAP maximum benefit - reference: - - title: Illinois LIHEAP Profile - LIHEAP Clearinghouse - href: https://liheapch.acf.gov/profiles/Illinois.htm diff --git a/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/base_amount/min.yaml b/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/base_amount/min.yaml deleted file mode 100644 index 094adbefc70..00000000000 --- a/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/base_amount/min.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Illinois provides at this minimum Low Income Home Energy Assistance Program amount to eligible filers. -values: - 2024-10-01: 315 - -metadata: - period: year - unit: currency-USD - label: Illinois LIHEAP minimum benefit - reference: - - title: Illinois LIHEAP Profile - LIHEAP Clearinghouse - href: https://liheapch.acf.gov/profiles/Illinois.htm diff --git a/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/crisis_amount/max.yaml b/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/crisis_amount/max.yaml index 23619e977c1..2879f7ff478 100644 --- a/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/crisis_amount/max.yaml +++ b/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/crisis_amount/max.yaml @@ -1,11 +1,14 @@ -description: Illinois provides up to this winter crisis assistance amount for household under the Low Income Home Energy Assistance Program. +description: Illinois provides this amount as the maximum winter crisis assistance under the Low Income Home Energy Assistance Program. values: - 2023-10-01: 1_500 + 2023-10-01: 1_200 + 2024-10-01: 1_500 metadata: period: year unit: currency-USD label: Illinois LIHEAP maximum winter crisis assistance reference: - - title: Illinois LIHEAP Profile - LIHEAP Clearinghouse - href: https://liheapch.acf.gov/profiles/Illinois.htm + - title: Illinois LIHEAP FY2024 State Plan, Section 4.12 + href: https://liheapch.acf.gov/docs/2024/state-plans/IL_Plan_2024_rev1.pdf#page=28 + - title: Illinois LIHEAP FY2025 State Plan, Section 4.12 + href: https://dceo.illinois.gov/content/dam/soi/en/web/dceo/communityservices/utilitybillassistance/documents/py25-liheap-state-plan--submitted-detailed-model-plan-liheap-10.01.24.pdf#page=28 diff --git a/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/income_bracket.yaml b/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/income_bracket.yaml new file mode 100644 index 00000000000..af0086ea738 --- /dev/null +++ b/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/income_bracket.yaml @@ -0,0 +1,29 @@ +description: Illinois sets this income bracket under the Low Income Home Energy Assistance Program. + +brackets: + - threshold: + 2023-10-01: 0 + amount: + 2023-10-01: 1 + - threshold: + 2023-10-01: 0.51 + amount: + 2023-10-01: 2 + - threshold: + 2023-10-01: 1.01 + amount: + 2023-10-01: 3 + - threshold: + 2023-10-01: 1.51 + amount: + 2023-10-01: 4 + +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: /1 + period: year + label: Illinois LIHEAP income bracket + reference: + - title: Illinois LIHEAP FY2024 Benefit Matrix + href: https://liheapch.acf.gov/docs/2024/benefits-matricies/IL_BenefitMatrix_2024.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/matrix/all_electric.yaml b/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/matrix/all_electric.yaml new file mode 100644 index 00000000000..5e3011c9c3d --- /dev/null +++ b/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/matrix/all_electric.yaml @@ -0,0 +1,69 @@ +description: Illinois provides this amount to all-electric households under the Low Income Home Energy Assistance Program. + +# Income bracket 1 = 0-50% FPL +1: + 1: + 2023-10-01: 840 + 2: + 2023-10-01: 890 + 3: + 2023-10-01: 940 + 4: + 2023-10-01: 990 + 5: + 2023-10-01: 1_040 + 6: + 2023-10-01: 1_090 + +# Income bracket 2 = 51-100% FPL +2: + 1: + 2023-10-01: 530 + 2: + 2023-10-01: 560 + 3: + 2023-10-01: 620 + 4: + 2023-10-01: 680 + 5: + 2023-10-01: 720 + 6: + 2023-10-01: 770 + +# Income bracket 3 = 101-150% FPL +3: + 1: + 2023-10-01: 370 + 2: + 2023-10-01: 390 + 3: + 2023-10-01: 430 + 4: + 2023-10-01: 470 + 5: + 2023-10-01: 500 + 6: + 2023-10-01: 540 + +# Income bracket 4 = 151-200% FPL +4: + 1: + 2023-10-01: 300 + 2: + 2023-10-01: 320 + 3: + 2023-10-01: 350 + 4: + 2023-10-01: 380 + 5: + 2023-10-01: 400 + 6: + 2023-10-01: 440 + +metadata: + period: year + unit: currency-USD + label: Illinois LIHEAP all-electric payment + reference: + - title: Illinois LIHEAP FY2024 Benefit Matrix + href: https://liheapch.acf.gov/docs/2024/benefits-matricies/IL_BenefitMatrix_2024.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/matrix/cash.yaml b/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/matrix/cash.yaml new file mode 100644 index 00000000000..8c7b657308f --- /dev/null +++ b/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/matrix/cash.yaml @@ -0,0 +1,69 @@ +description: Illinois provides this amount as a cash payment to households with heat included in rent under the Low Income Home Energy Assistance Program. + +# Income bracket 1 = 0-50% FPL +1: + 1: + 2023-10-01: 630 + 2: + 2023-10-01: 680 + 3: + 2023-10-01: 730 + 4: + 2023-10-01: 780 + 5: + 2023-10-01: 830 + 6: + 2023-10-01: 880 + +# Income bracket 2 = 51-100% FPL +2: + 1: + 2023-10-01: 305 + 2: + 2023-10-01: 320 + 3: + 2023-10-01: 345 + 4: + 2023-10-01: 375 + 5: + 2023-10-01: 395 + 6: + 2023-10-01: 415 + +# Income bracket 3 = 101-150% FPL +3: + 1: + 2023-10-01: 210 + 2: + 2023-10-01: 225 + 3: + 2023-10-01: 240 + 4: + 2023-10-01: 260 + 5: + 2023-10-01: 275 + 6: + 2023-10-01: 285 + +# Income bracket 4 = 151-200% FPL +4: + 1: + 2023-10-01: 170 + 2: + 2023-10-01: 190 + 3: + 2023-10-01: 210 + 4: + 2023-10-01: 235 + 5: + 2023-10-01: 255 + 6: + 2023-10-01: 275 + +metadata: + period: year + unit: currency-USD + label: Illinois LIHEAP cash payment (heat in rent) + reference: + - title: Illinois LIHEAP FY2024 Benefit Matrix + href: https://liheapch.acf.gov/docs/2024/benefits-matricies/IL_BenefitMatrix_2024.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/matrix/nat_gas.yaml b/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/matrix/nat_gas.yaml new file mode 100644 index 00000000000..70994d50a64 --- /dev/null +++ b/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/matrix/nat_gas.yaml @@ -0,0 +1,69 @@ +description: Illinois provides this amount to natural gas households under the Low Income Home Energy Assistance Program. + +# Income bracket 1 = 0-50% FPL +1: + 1: + 2023-10-01: 1_260 + 2: + 2023-10-01: 1_360 + 3: + 2023-10-01: 1_460 + 4: + 2023-10-01: 1_560 + 5: + 2023-10-01: 1_660 + 6: + 2023-10-01: 1_760 + +# Income bracket 2 = 51-100% FPL +2: + 1: + 2023-10-01: 610 + 2: + 2023-10-01: 640 + 3: + 2023-10-01: 690 + 4: + 2023-10-01: 750 + 5: + 2023-10-01: 790 + 6: + 2023-10-01: 830 + +# Income bracket 3 = 101-150% FPL +3: + 1: + 2023-10-01: 420 + 2: + 2023-10-01: 450 + 3: + 2023-10-01: 480 + 4: + 2023-10-01: 520 + 5: + 2023-10-01: 550 + 6: + 2023-10-01: 570 + +# Income bracket 4 = 151-200% FPL +4: + 1: + 2023-10-01: 340 + 2: + 2023-10-01: 380 + 3: + 2023-10-01: 420 + 4: + 2023-10-01: 470 + 5: + 2023-10-01: 510 + 6: + 2023-10-01: 550 + +metadata: + period: year + unit: currency-USD + label: Illinois LIHEAP natural gas payment + reference: + - title: Illinois LIHEAP FY2024 Benefit Matrix + href: https://liheapch.acf.gov/docs/2024/benefits-matricies/IL_BenefitMatrix_2024.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/matrix/propane.yaml b/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/matrix/propane.yaml new file mode 100644 index 00000000000..5a98fb422aa --- /dev/null +++ b/policyengine_us/parameters/gov/states/il/dceo/liheap/payment/matrix/propane.yaml @@ -0,0 +1,69 @@ +description: Illinois provides this amount to propane and fuel oil households under the Low Income Home Energy Assistance Program. + +# Income bracket 1 = 0-50% FPL +1: + 1: + 2023-10-01: 1_520 + 2: + 2023-10-01: 1_620 + 3: + 2023-10-01: 1_720 + 4: + 2023-10-01: 1_820 + 5: + 2023-10-01: 1_920 + 6: + 2023-10-01: 2_020 + +# Income bracket 2 = 51-100% FPL +2: + 1: + 2023-10-01: 710 + 2: + 2023-10-01: 750 + 3: + 2023-10-01: 820 + 4: + 2023-10-01: 910 + 5: + 2023-10-01: 950 + 6: + 2023-10-01: 1_010 + +# Income bracket 3 = 101-150% FPL +3: + 1: + 2023-10-01: 490 + 2: + 2023-10-01: 520 + 3: + 2023-10-01: 570 + 4: + 2023-10-01: 630 + 5: + 2023-10-01: 660 + 6: + 2023-10-01: 700 + +# Income bracket 4 = 151-200% FPL +4: + 1: + 2023-10-01: 340 + 2: + 2023-10-01: 380 + 3: + 2023-10-01: 420 + 4: + 2023-10-01: 470 + 5: + 2023-10-01: 510 + 6: + 2023-10-01: 550 + +metadata: + period: year + unit: currency-USD + label: Illinois LIHEAP propane/fuel oil payment + reference: + - title: Illinois LIHEAP FY2024 Benefit Matrix + href: https://liheapch.acf.gov/docs/2024/benefits-matricies/IL_BenefitMatrix_2024.pdf#page=1 diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/dceo/liheap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/dceo/liheap/integration.yaml index 0164cdf9d7e..43bbfd9dd9d 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/il/dceo/liheap/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/il/dceo/liheap/integration.yaml @@ -1,149 +1,199 @@ -- name: Senior citizen with disability priority group +- name: Case 1, low income senior with gas expense infers nat gas. period: 2024 + absolute_error_margin: 0.01 input: people: - senior: + person1: age: 65 is_disabled: true social_security: 12_000 irs_gross_income: 12_000 rent: 6_000 - heating_expense_person: 800 - tax_units: - tax_unit: - members: [senior] spm_units: spm_unit: - members: [senior] + members: [person1] heat_expense_included_in_rent: false + gas_expense: 1_200 + electricity_expense: 300 households: household: - members: [senior] + members: [person1] state_code: IL output: il_liheap_income_eligible: true il_liheap_eligible: true - il_liheap_base_payment: 800 # Based on heating expenses - il_liheap: 800 # Base payment only (no crisis assistance) + il_liheap_fuel_type: NAT_GAS_OTHER + # 12,000 / ~15,060 FPG ≈ 80% → bracket 2, size 1, nat gas → $610 + # min(610, 1,500) = 610 + il_liheap_base_payment: 610 + il_liheap: 610 -- name: Family with young children priority group +- name: Case 2, family of 4 with metered gas infers nat gas. period: 2024 + absolute_error_margin: 0.01 input: people: - parent1: + person1: age: 30 employment_income: 25_000 irs_gross_income: 25_000 - rent: 12_000 - heating_expense_person: 900 # Half of family heating costs - parent2: + person2: age: 28 employment_income: 20_000 irs_gross_income: 20_000 - heating_expense_person: 900 # Half of family heating costs - child1: - age: 4 # Under 5 - priority group - heating_expense_person: 0 - child2: - age: 2 # Under 5 - priority group - heating_expense_person: 0 - tax_units: - tax_unit: - members: [parent1, parent2, child1, child2] + person3: + age: 4 + person4: + age: 2 spm_units: spm_unit: - members: [parent1, parent2, child1, child2] + members: [person1, person2, person3, person4] heat_expense_included_in_rent: false + metered_gas_expense: 1_200 + electricity_expense: 600 households: household: - members: [parent1, parent2, child1, child2] + members: [person1, person2, person3, person4] state_code: IL output: - il_liheap_income_eligible: true # 45k total income eligible + il_liheap_income_eligible: true il_liheap_eligible: true - il_liheap_base_payment: 1_800 # Based on heating expenses - il_liheap: 1_800 # Base payment only (no crisis assistance) + il_liheap_fuel_type: NAT_GAS_OTHER + # 45,000 / ~31,800 FPG ≈ 142% → bracket 3, size 4, nat gas → $520 + # min(520, 1,800) = 520 + il_liheap_base_payment: 520 + il_liheap: 520 -- name: Renter with heat included must meet rent threshold +- name: Case 3, renter with heat in rent meets rent threshold. period: 2024 + absolute_error_margin: 0.01 input: people: - renter: + person1: age: 35 employment_income: 24_000 irs_gross_income: 24_000 - rent: 8_000 # 33.3% of income - heating_expense_person: 1_200 # Irrelevant for heat included - tax_units: - tax_unit: - members: [renter] + rent: 8_000 spm_units: spm_unit: - members: [renter] + members: [person1] heat_expense_included_in_rent: true + gas_expense: 300 + electricity_expense: 200 households: household: - members: [renter] + members: [person1] state_code: IL output: - il_liheap_income_eligible: true # 24k < 60% of 50k (30k) + il_liheap_income_eligible: true il_liheap_eligible: true # Rent (8k) > 30% of income (7.2k) - il_liheap_base_payment: 315 # Fixed minimum for heat included - il_liheap: 315 # Base payment only (no crisis assistance) + il_liheap_fuel_type: CASH + # 24,000 / ~15,060 FPG ≈ 159% → bracket 4, size 1, cash → $170 + # Cash: no expense cap + il_liheap_base_payment: 170 + il_liheap: 170 -- name: Renter with heat included but low rent not eligible +- name: Case 4, renter with heat in rent fails rent threshold. period: 2024 input: people: - renter: + person1: age: 40 employment_income: 28_000 irs_gross_income: 28_000 - rent: 7_000 # 25% of income - heating_expense_person: 1_000 # Irrelevant for heat included - tax_units: - tax_unit: - members: [renter] + rent: 7_000 spm_units: spm_unit: - members: [renter] + members: [person1] heat_expense_included_in_rent: true + gas_expense: 300 + electricity_expense: 200 households: household: - members: [renter] + members: [person1] state_code: IL output: - il_liheap_income_eligible: true # 28k < 60% of 50k (30k) + il_liheap_income_eligible: true il_liheap_eligible: false # Rent (7k) <= 30% of income (8.4k) il_liheap: 0 -- name: High income household not eligible +- name: Case 5, high income household not eligible. period: 2024 input: people: - adult1: + person1: age: 45 employment_income: 50_000 irs_gross_income: 50_000 - rent: 24_000 - heating_expense_person: 1_250 # Half of family heating costs - adult2: + person2: age: 43 employment_income: 45_000 irs_gross_income: 45_000 - heating_expense_person: 1_250 # Half of family heating costs - tax_units: - tax_unit: - members: [adult1, adult2] spm_units: spm_unit: - members: [adult1, adult2] + members: [person1, person2] heat_expense_included_in_rent: false + gas_expense: 1_200 + electricity_expense: 300 households: household: - members: [adult1, adult2] + members: [person1, person2] state_code: IL output: - il_liheap_income_eligible: false # 95k > 60% of 70k (42k) and > 200% of 20.4k (40.8k) + il_liheap_income_eligible: false il_liheap_eligible: false il_liheap: 0 + +- name: Case 6, electricity only infers all electric. + period: 2024 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security: 5_000 + irs_gross_income: 5_000 + spm_units: + spm_unit: + members: [person1] + heat_expense_included_in_rent: false + electricity_expense: 1_200 + households: + household: + members: [person1] + state_code: IL + output: + il_liheap_income_eligible: true + il_liheap_eligible: true + il_liheap_fuel_type: ALL_ELECTRIC + # 5,000 / ~15,060 FPG ≈ 33% → bracket 1, size 1, all electric → $840 + # min(840, 1,200) = 840 + il_liheap_base_payment: 840 + il_liheap: 840 + +- name: Case 7, coal expense infers propane fuel oil. + period: 2024 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 55 + irs_gross_income: 8_000 + spm_units: + spm_unit: + members: [person1] + heat_expense_included_in_rent: false + coal_expense: 800 + electricity_expense: 400 + households: + household: + members: [person1] + state_code: IL + output: + il_liheap_income_eligible: true + il_liheap_eligible: true + il_liheap_fuel_type: PROPANE_FUEL_OIL + # 8,000 / ~15,060 FPG ≈ 53% → bracket 2, size 1, propane → $710 + # min(710, 1,200) = 710 + il_liheap_base_payment: 710 + il_liheap: 710 diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/dceo/liheap/payment/il_liheap_base_payment.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/dceo/liheap/payment/il_liheap_base_payment.yaml index 7792d8d8f0d..3e5424feaaf 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/il/dceo/liheap/payment/il_liheap_base_payment.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/il/dceo/liheap/payment/il_liheap_base_payment.yaml @@ -1,83 +1,209 @@ -- name: Heat not included in rent - benefit based on heating expenses +- name: Case 1, gas expense infers nat gas fuel type. period: 2024 + absolute_error_margin: 0.01 input: people: - person: + person1: age: 30 - heating_expense_person: 1_000 - tax_units: - tax_unit: - members: [person] + irs_gross_income: 0 spm_units: spm_unit: - members: [person] - heat_expense_included_in_rent: false + members: [person1] + gas_expense: 1_500 + electricity_expense: 500 households: household: - members: [person] + members: [person1] state_code: IL output: - il_liheap_base_payment: 1_000 # Heating expenses within range + # gas_expense > 0 → inferred NAT_GAS_OTHER + # Bracket 1 (0-50% FPL), size 1, nat gas → $1,260 + # min(1,260, 2,000) = 1,260 + il_liheap_fuel_type: NAT_GAS_OTHER + il_liheap_base_payment: 1_260 -- name: Heat not included in rent - expenses exceed maximum +- name: Case 2, electricity only infers all electric. period: 2024 + absolute_error_margin: 0.01 input: people: - person: + person1: age: 30 - heating_expense_person: 3_000 - tax_units: - tax_unit: - members: [person] + irs_gross_income: 10_000 spm_units: spm_unit: - members: [person] - heat_expense_included_in_rent: false + members: [person1] + electricity_expense: 1_000 households: household: - members: [person] + members: [person1] state_code: IL output: - il_liheap_base_payment: 2_075 # Capped at maximum + # No gas or fuel oil → inferred ALL_ELECTRIC + # Bracket 2, size 1, all electric → $530 + # min(530, 1,000) = 530 + il_liheap_fuel_type: ALL_ELECTRIC + il_liheap_base_payment: 530 -- name: Heat included in rent - minimum cash benefit +- name: Case 3, fuel oil expense infers propane. period: 2024 + absolute_error_margin: 0.01 input: people: - person: - age: 30 - heating_expense_person: 500 # Irrelevant when heat included - tax_units: - tax_unit: - members: [person] + person1: + age: 35 + irs_gross_income: 40_000 + person2: + age: 33 + person3: + age: 8 + person4: + age: 5 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + fuel_oil_expense: 400 + electricity_expense: 100 + households: + household: + members: [person1, person2, person3, person4] + state_code: IL + output: + # fuel_oil_expense > 0 → inferred PROPANE_FUEL_OIL + # Bracket 3, size 4, propane → $630 + # Expenses: 400 + 100 = 500 + # min(630, 500) = 500 (capped) + il_liheap_fuel_type: PROPANE_FUEL_OIL + il_liheap_base_payment: 500 + +- name: Case 4, heat in rent infers cash. + period: 2024 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + irs_gross_income: 25_000 + rent: 8_000 spm_units: spm_unit: - members: [person] + members: [person1] heat_expense_included_in_rent: true + gas_expense: 200 + electricity_expense: 100 + households: + household: + members: [person1] + state_code: IL + output: + # heat_in_rent → inferred CASH + # Bracket 4, size 1, cash → $170 (no expense cap for cash) + il_liheap_fuel_type: CASH + il_liheap_base_payment: 170 + +- name: Case 5, bottled gas infers nat gas. + period: 2024 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + irs_gross_income: 0 + spm_units: + spm_unit: + members: [person1] + bottled_gas_expense: 1_500 + electricity_expense: 500 + households: + household: + members: [person1] + state_code: IL + output: + # bottled_gas_expense > 0 → inferred NAT_GAS_OTHER + # Bracket 1, size 1, nat gas → $1,260 + # min(1,260, 2,000) = 1,260 + il_liheap_fuel_type: NAT_GAS_OTHER + il_liheap_base_payment: 1_260 + +- name: Case 6, coal expense infers propane fuel oil. + period: 2024 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + irs_gross_income: 0 + spm_units: + spm_unit: + members: [person1] + coal_expense: 1_000 + electricity_expense: 500 + households: + household: + members: [person1] + state_code: IL + output: + # coal_expense > 0 → inferred PROPANE_FUEL_OIL + # Bracket 1, size 1, propane → $1,520 + # min(1,520, 1,500) = 1,500 (capped) + il_liheap_fuel_type: PROPANE_FUEL_OIL + il_liheap_base_payment: 1_500 + +- name: Case 7, heating_cooling_expense counts toward cap. + period: 2024 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + irs_gross_income: 0 + spm_units: + spm_unit: + members: [person1] + electricity_expense: 50 + heating_cooling_expense: 100 households: household: - members: [person] + members: [person1] state_code: IL output: - il_liheap_base_payment: 315 # Fixed minimum for heat included in rent + # electricity only → inferred ALL_ELECTRIC + # Bracket 1, size 1, all electric → $840 + # Expenses: 50 + 100 = 150 + # min(840, 150) = 150 (capped) + il_liheap_fuel_type: ALL_ELECTRIC + il_liheap_base_payment: 150 -- name: Heat not included in rent - low heating expenses get actual amount +- name: Case 8, family of 6 nat gas bracket 1. period: 2024 + absolute_error_margin: 0.01 input: people: - person: + person1: age: 30 - heating_expense_person: 200 - tax_units: - tax_unit: - members: [person] + irs_gross_income: 5_000 + person2: + age: 28 + person3: + age: 10 + person4: + age: 8 + person5: + age: 5 + person6: + age: 3 spm_units: spm_unit: - members: [person] - heat_expense_included_in_rent: false + members: [person1, person2, person3, person4, person5, person6] + gas_expense: 1_500 + electricity_expense: 500 households: household: - members: [person] + members: [person1, person2, person3, person4, person5, person6] state_code: IL output: - il_liheap_base_payment: 200 # Gets actual heating expenses + # gas_expense > 0 → inferred NAT_GAS_OTHER + # Bracket 1, size 6, nat gas → $1,760 + # min(1,760, 2,000) = 1,760 + il_liheap_fuel_type: NAT_GAS_OTHER + il_liheap_base_payment: 1_760 diff --git a/policyengine_us/variables/gov/states/il/dceo/liheap/eligibility/il_liheap_eligible.py b/policyengine_us/variables/gov/states/il/dceo/liheap/eligibility/il_liheap_eligible.py index ac53cccd63e..d21e98f5b89 100644 --- a/policyengine_us/variables/gov/states/il/dceo/liheap/eligibility/il_liheap_eligible.py +++ b/policyengine_us/variables/gov/states/il/dceo/liheap/eligibility/il_liheap_eligible.py @@ -21,4 +21,7 @@ def formula(spm_unit, period, parameters): rent_threshold = income * p.rent_rate rent_threshold_met = rent > rent_threshold + # IL does not impose a state citizenship/immigration requirement + # Per IL LIHEAP FY2025 State Plan; Illinois Legal Aid Online: + # "You may qualify for LIHEAP regardless of immigrant status" return ~heat_in_rent | rent_threshold_met diff --git a/policyengine_us/variables/gov/states/il/dceo/liheap/il_liheap_fuel_type.py b/policyengine_us/variables/gov/states/il/dceo/liheap/il_liheap_fuel_type.py new file mode 100644 index 00000000000..b26023594cd --- /dev/null +++ b/policyengine_us/variables/gov/states/il/dceo/liheap/il_liheap_fuel_type.py @@ -0,0 +1,39 @@ +from policyengine_us.model_api import * + + +class ILLIHEAPFuelType(Enum): + ALL_ELECTRIC = "All Electric" + NAT_GAS_OTHER = "Natural Gas / Other" + PROPANE_FUEL_OIL = "Propane / Fuel Oil" + CASH = "Cash (heat included in rent)" + + +class il_liheap_fuel_type(Variable): + value_type = Enum + entity = SPMUnit + possible_values = ILLIHEAPFuelType + default_value = ILLIHEAPFuelType.ALL_ELECTRIC + definition_period = YEAR + label = "Household fuel type for IL LIHEAP" + defined_for = StateCode.IL + + def formula(spm_unit, period, parameters): + heat_in_rent = spm_unit("heat_expense_included_in_rent", period) + has_fuel_oil = add(spm_unit, period, ["fuel_oil_expense", "coal_expense"]) > 0 + has_gas = ( + add( + spm_unit, + period, + ["gas_expense", "bottled_gas_expense", "metered_gas_expense"], + ) + > 0 + ) + return select( + [heat_in_rent, has_fuel_oil, has_gas], + [ + ILLIHEAPFuelType.CASH, + ILLIHEAPFuelType.PROPANE_FUEL_OIL, + ILLIHEAPFuelType.NAT_GAS_OTHER, + ], + default=ILLIHEAPFuelType.ALL_ELECTRIC, + ) diff --git a/policyengine_us/variables/gov/states/il/dceo/liheap/il_liheap_income_bracket.py b/policyengine_us/variables/gov/states/il/dceo/liheap/il_liheap_income_bracket.py new file mode 100644 index 00000000000..99dbd52a88d --- /dev/null +++ b/policyengine_us/variables/gov/states/il/dceo/liheap/il_liheap_income_bracket.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class il_liheap_income_bracket(Variable): + value_type = int + entity = SPMUnit + label = "Income bracket for IL LIHEAP payment (1-4)" + definition_period = YEAR + defined_for = StateCode.IL + reference = "https://liheapch.acf.gov/docs/2024/benefits-matricies/IL_BenefitMatrix_2024.pdf#page=1" + + def formula(spm_unit, period, parameters): + income = add(spm_unit, period, ["irs_gross_income"]) + fpg = spm_unit("spm_unit_fpg", period) + income_as_fpg_share = where(fpg > 0, income / fpg, 0) + # Clamp negative income to bracket 1 (0-50% FPL). + pct_fpg = max_(income_as_fpg_share, 0) + p = parameters(period).gov.states.il.dceo.liheap.payment + return p.income_bracket.calc(pct_fpg) diff --git a/policyengine_us/variables/gov/states/il/dceo/liheap/payment/il_liheap_base_payment.py b/policyengine_us/variables/gov/states/il/dceo/liheap/payment/il_liheap_base_payment.py index ffe026a22f8..bcb16b73b35 100644 --- a/policyengine_us/variables/gov/states/il/dceo/liheap/payment/il_liheap_base_payment.py +++ b/policyengine_us/variables/gov/states/il/dceo/liheap/payment/il_liheap_base_payment.py @@ -8,21 +8,47 @@ class il_liheap_base_payment(Variable): unit = USD definition_period = YEAR defined_for = StateCode.IL - reference = "https://dceo.illinois.gov/communityservices/utilitybillassistance.html" + reference = "https://liheapch.acf.gov/docs/2024/benefits-matricies/IL_BenefitMatrix_2024.pdf" def formula(spm_unit, period, parameters): - p = parameters(period).gov.states.il.dceo.liheap.payment.base_amount + p = parameters(period).gov.states.il.dceo.liheap.payment.matrix + fuel_type = spm_unit("il_liheap_fuel_type", period) + income_bracket = spm_unit("il_liheap_income_bracket", period) + size = spm_unit("spm_unit_size", period) + capped_size = clip(size, 1, 6) - # Check if heat is included in rent - heat_in_rent = spm_unit("heat_expense_included_in_rent", period) - heating_expenses = add(spm_unit, period, ["heating_expense_person"]) - - # For renters with heat included in rent, provide minimum cash benefit - # For others, benefit based on actual heating expenses up to maximum - capped_heating_expenses = min_(heating_expenses, p.max) + is_electric = fuel_type == fuel_type.possible_values.ALL_ELECTRIC + is_gas = fuel_type == fuel_type.possible_values.NAT_GAS_OTHER + is_propane = fuel_type == fuel_type.possible_values.PROPANE_FUEL_OIL + is_cash = fuel_type == fuel_type.possible_values.CASH + matrix_amount = select( + [is_electric, is_gas, is_propane, is_cash], + [ + p.all_electric[income_bracket][capped_size], + p.nat_gas[income_bracket][capped_size], + p.propane[income_bracket][capped_size], + p.cash[income_bracket][capped_size], + ], + default=0, + ) + # Cap non-cash benefits at actual heating expenses. + # Cash (heat in rent) is a direct payment — no expense cap. + heating_expenses = add( + spm_unit, + period, + [ + "electricity_expense", + "gas_expense", + "fuel_oil_expense", + "heating_cooling_expense", + "bottled_gas_expense", + "metered_gas_expense", + "coal_expense", + ], + ) return where( - heat_in_rent, - p.min, # Fixed minimum for heat included in rent - capped_heating_expenses, # Based on actual expenses, up to maximum + is_cash, + matrix_amount, + min_(matrix_amount, heating_expenses), )