diff --git a/changelog.d/or-liheap.added.md b/changelog.d/or-liheap.added.md new file mode 100644 index 00000000000..5c24b2f7e7f --- /dev/null +++ b/changelog.d/or-liheap.added.md @@ -0,0 +1 @@ +Add Oregon LIHEAP regular heating assistance for program years 2025 to 2027. diff --git a/policyengine_us/parameters/gov/states/or/ohcs/liheap/eligibility/smi_rate.yaml b/policyengine_us/parameters/gov/states/or/ohcs/liheap/eligibility/smi_rate.yaml new file mode 100644 index 00000000000..43c90e95d04 --- /dev/null +++ b/policyengine_us/parameters/gov/states/or/ohcs/liheap/eligibility/smi_rate.yaml @@ -0,0 +1,14 @@ +description: Oregon limits countable income to this share of state median income under the Low Income Home Energy Assistance Program. +values: + 2024-10-01: 0.6 +metadata: + unit: /1 + period: year + label: Oregon LIHEAP SMI eligibility rate + reference: + - title: PY2025 Energy Assistance Intake Operations and Policy Manual + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=57 + - title: PY2026 Energy Assistance Intake Operations and Policy Manual + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=77 + - title: PY2027 Energy Assistance Intake Operations and Policy Manual + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=71 diff --git a/policyengine_us/parameters/gov/states/or/ohcs/liheap/income/earned_income_min_age.yaml b/policyengine_us/parameters/gov/states/or/ohcs/liheap/income/earned_income_min_age.yaml new file mode 100644 index 00000000000..9711b8f0cf8 --- /dev/null +++ b/policyengine_us/parameters/gov/states/or/ohcs/liheap/income/earned_income_min_age.yaml @@ -0,0 +1,14 @@ +description: Oregon excludes earnings of people below this age under the Low Income Home Energy Assistance Program. +values: + 2024-10-01: 18 +metadata: + unit: year + period: year + label: Oregon LIHEAP minimum age for counted earnings + reference: + - title: "PY2025 Energy Assistance Intake Operations and Policy Manual #page 33,41" + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=33 + - title: "PY2026 Energy Assistance Intake Operations and Policy Manual #page 41,53" + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=41 + - title: "PY2027 Energy Assistance Intake Operations and Policy Manual #page 42,54" + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=42 diff --git a/policyengine_us/parameters/gov/states/or/ohcs/liheap/income/interest_threshold.yaml b/policyengine_us/parameters/gov/states/or/ohcs/liheap/income/interest_threshold.yaml new file mode 100644 index 00000000000..ab475dc975e --- /dev/null +++ b/policyengine_us/parameters/gov/states/or/ohcs/liheap/income/interest_threshold.yaml @@ -0,0 +1,14 @@ +description: Oregon disregards annual withdrawn interest at or below this amount under the Low Income Home Energy Assistance Program. +values: + 2024-10-01: 200 +metadata: + unit: currency-USD + period: year + label: Oregon LIHEAP interest threshold + reference: + - title: "PY2025 Energy Assistance Intake Operations and Policy Manual #page 34,40" + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=34 + - title: "PY2026 Energy Assistance Intake Operations and Policy Manual #page 43,50" + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=43 + - title: "PY2027 Energy Assistance Intake Operations and Policy Manual #page 43,51" + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=43 diff --git a/policyengine_us/parameters/gov/states/or/ohcs/liheap/income/sources/earned.yaml b/policyengine_us/parameters/gov/states/or/ohcs/liheap/income/sources/earned.yaml new file mode 100644 index 00000000000..3df712f8d49 --- /dev/null +++ b/policyengine_us/parameters/gov/states/or/ohcs/liheap/income/sources/earned.yaml @@ -0,0 +1,21 @@ +description: Oregon counts these sources as earned income under the Low Income Home Energy Assistance Program. +# Existing net business inputs are used without a further self-employment +# expense deduction. +values: + 2024-10-01: + - employment_income + - self_employment_income + - sstb_self_employment_income + - partnership_s_corp_income + - farm_operations_income +metadata: + unit: list + period: year + label: Oregon LIHEAP earned income sources + reference: + - title: "PY2025 Energy Assistance Intake Operations and Policy Manual #page 29,32-33,36,41" + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=29 + - title: "PY2026 Energy Assistance Intake Operations and Policy Manual #page 35,39,41,45,53" + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=35 + - title: "PY2027 Energy Assistance Intake Operations and Policy Manual #page 36,40,42,46,54" + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=36 diff --git a/policyengine_us/parameters/gov/states/or/ohcs/liheap/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/or/ohcs/liheap/income/sources/unearned.yaml new file mode 100644 index 00000000000..18698f13f7f --- /dev/null +++ b/policyengine_us/parameters/gov/states/or/ohcs/liheap/income/sources/unearned.yaml @@ -0,0 +1,36 @@ +description: Oregon counts these person-level unearned income sources under the Low Income Home Energy Assistance Program. +# Person-level sources, each floored at zero per member. TANF, a unit-level +# amount, is added in the formula. +values: + 2024-10-01: + - rental_income + - farm_rent_income + - social_security + - railroad_benefits + - ssi + - unemployment_compensation + - workers_compensation + - veterans_benefits + - pension_income + # Retirement pay counts as a pension. military_retirement_pay includes + # survivor payments, so report a survivor annuity in only one of the two. + - military_retirement_pay + - survivor_benefits + - disability_benefits + - alimony_income + - child_support_received + - ordinary_dividend_income + - strike_benefits + - general_assistance + - estate_income +metadata: + unit: list + period: year + label: Oregon LIHEAP unearned income sources + reference: + - title: "PY2025 Energy Assistance Intake Operations and Policy Manual #page 31-41" + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=31 + - title: "PY2026 Energy Assistance Intake Operations and Policy Manual #page 37-52" + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=37 + - title: "PY2027 Energy Assistance Intake Operations and Policy Manual #page 38-53" + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=38 diff --git a/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/amount/electricity.yaml b/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/amount/electricity.yaml new file mode 100644 index 00000000000..6e61f0605db --- /dev/null +++ b/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/amount/electricity.yaml @@ -0,0 +1,197 @@ +description: Oregon provides this annual regular heating payment for electricity by region, household size and income band under the Low Income Home Energy Assistance Program. +1: + 1: + 1: + 2024-10-01: 380 + 2025-10-09: 465 + 2026-10-01: 475 + 2: + 2024-10-01: 295 + 2025-10-09: 360 + 2026-10-01: 370 + 3: + 2024-10-01: 250 + 2025-10-09: 300 + 2026-10-01: 310 + 4: + 2024-10-01: 250 + 2: + 1: + 2024-10-01: 595 + 2026-10-01: 600 + 2: + 2024-10-01: 465 + 3: + 2024-10-01: 385 + 2026-10-01: 390 + 4: + 2024-10-01: 280 + 2025-10-09: 275 + 2026-10-01: 280 + 3: + 1: + 2024-10-01: 610 + 2025-10-09: 650 + 2026-10-01: 655 + 2: + 2024-10-01: 475 + 2025-10-09: 505 + 2026-10-01: 510 + 3: + 2024-10-01: 395 + 2025-10-09: 420 + 2026-10-01: 425 + 4: + 2024-10-01: 285 + 2025-10-09: 300 + 2026-10-01: 305 + 4: + 1: + 2024-10-01: 675 + 2025-10-09: 690 + 2026-10-01: 695 + 2: + 2024-10-01: 525 + 2025-10-09: 540 + 3: + 2024-10-01: 440 + 2025-10-09: 450 + 4: + 2024-10-01: 315 + 2025-10-09: 320 + 5: + 1: + 2024-10-01: 710 + 2025-10-09: 725 + 2: + 2024-10-01: 555 + 2025-10-09: 565 + 3: + 2024-10-01: 460 + 2025-10-09: 470 + 4: + 2024-10-01: 330 + 2025-10-09: 340 + 6: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 595 + 2025-10-09: 590 + 3: + 2024-10-01: 495 + 2025-10-09: 490 + 4: + 2024-10-01: 355 + 2025-10-09: 350 +2: + 1: + 1: + 2024-10-01: 415 + 2025-10-09: 515 + 2026-10-01: 510 + 2: + 2024-10-01: 320 + 2025-10-09: 400 + 3: + 2024-10-01: 270 + 2025-10-09: 335 + 2026-10-01: 330 + 4: + 2024-10-01: 250 + 2: + 1: + 2024-10-01: 650 + 2025-10-09: 645 + 2026-10-01: 635 + 2: + 2024-10-01: 505 + 2026-10-01: 495 + 3: + 2024-10-01: 420 + 2026-10-01: 415 + 4: + 2024-10-01: 305 + 2025-10-09: 300 + 2026-10-01: 295 + 3: + 1: + 2024-10-01: 665 + 2025-10-09: 700 + 2026-10-01: 690 + 2: + 2024-10-01: 515 + 2025-10-09: 545 + 2026-10-01: 535 + 3: + 2024-10-01: 430 + 2025-10-09: 455 + 2026-10-01: 445 + 4: + 2024-10-01: 310 + 2025-10-09: 325 + 2026-10-01: 320 + 4: + 1: + 2024-10-01: 740 + 2026-10-01: 730 + 2: + 2024-10-01: 575 + 2025-10-09: 580 + 2026-10-01: 570 + 3: + 2024-10-01: 480 + 2026-10-01: 475 + 4: + 2024-10-01: 345 + 2026-10-01: 340 + 5: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 605 + 2026-10-01: 595 + 3: + 2024-10-01: 505 + 2026-10-01: 495 + 4: + 2024-10-01: 360 + 2026-10-01: 355 + 6: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 650 + 2025-10-09: 630 + 2026-10-01: 615 + 3: + 2024-10-01: 540 + 2025-10-09: 525 + 2026-10-01: 515 + 4: + 2024-10-01: 390 + 2025-10-09: 375 + 2026-10-01: 370 +metadata: + unit: currency-USD + period: year + label: Oregon LIHEAP electricity heating payment + breakdown: + - range(1, 3) + - range(1, 7) + - range(1, 5) + reference: + - title: PY2025 Energy Assistance Intake Operations and Policy Manual, Region 1 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=58 + - title: PY2025 Energy Assistance Intake Operations and Policy Manual, Region 2 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=59 + - title: PY2026 Energy Assistance Intake Operations and Policy Manual, corrected Region 1 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=78 + - title: PY2026 Energy Assistance Intake Operations and Policy Manual, corrected Region 2 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=80 + - title: OHCS 44-2025 temporary order correcting the PY2026 payment matrices, effective October 9, 2025 + href: https://secure.sos.state.or.us/oard/viewReceiptPDF.action?filingRsn=60695 + - title: PY2027 Energy Assistance Intake Operations and Policy Manual, Region 1 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=72 + - title: PY2027 Energy Assistance Intake Operations and Policy Manual, Region 2 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=74 diff --git a/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/amount/fuel_oil.yaml b/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/amount/fuel_oil.yaml new file mode 100644 index 00000000000..f20dd8ea19d --- /dev/null +++ b/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/amount/fuel_oil.yaml @@ -0,0 +1,160 @@ +description: Oregon provides this annual regular heating payment for fuel oil by region, household size and income band under the Low Income Home Energy Assistance Program. +1: + 1: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 2025-10-09: 675 + 3: + 2024-10-01: 680 + 2025-10-09: 560 + 4: + 2024-10-01: 490 + 2025-10-09: 405 + 2: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 3: + 2024-10-01: 750 + 2025-10-09: 640 + 4: + 2024-10-01: 750 + 2025-10-09: 460 + 3: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 3: + 2024-10-01: 750 + 2025-10-09: 675 + 4: + 2024-10-01: 750 + 2025-10-09: 485 + 4: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 3: + 2024-10-01: 750 + 2025-10-09: 700 + 4: + 2024-10-01: 750 + 2025-10-09: 505 + 5: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 3: + 2024-10-01: 750 + 2025-10-09: 720 + 4: + 2024-10-01: 750 + 2025-10-09: 520 + 6: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 3: + 2024-10-01: 750 + 2025-10-09: 740 + 4: + 2024-10-01: 750 + 2025-10-09: 535 +2: + 1: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 2025-10-09: 675 + 3: + 2024-10-01: 745 + 2025-10-09: 560 + 4: + 2024-10-01: 535 + 2025-10-09: 405 + 2: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 3: + 2024-10-01: 750 + 2025-10-09: 640 + 4: + 2024-10-01: 750 + 2025-10-09: 460 + 3: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 3: + 2024-10-01: 750 + 2025-10-09: 675 + 4: + 2024-10-01: 750 + 2025-10-09: 485 + 4: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 3: + 2024-10-01: 750 + 2025-10-09: 700 + 4: + 2024-10-01: 750 + 2025-10-09: 505 + 5: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 3: + 2024-10-01: 750 + 2025-10-09: 720 + 4: + 2024-10-01: 750 + 2025-10-09: 520 + 6: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 3: + 2024-10-01: 750 + 2025-10-09: 740 + 4: + 2024-10-01: 750 + 2025-10-09: 535 +metadata: + unit: currency-USD + period: year + label: Oregon LIHEAP fuel oil heating payment + breakdown: + - range(1, 3) + - range(1, 7) + - range(1, 5) + reference: + - title: PY2025 Energy Assistance Intake Operations and Policy Manual, Region 1 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=58 + - title: PY2025 Energy Assistance Intake Operations and Policy Manual, Region 2 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=59 + - title: PY2026 Energy Assistance Intake Operations and Policy Manual, corrected Region 1 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=78 + - title: PY2026 Energy Assistance Intake Operations and Policy Manual, corrected Region 2 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=80 + - title: OHCS 44-2025 temporary order correcting the PY2026 payment matrices, effective October 9, 2025 + href: https://secure.sos.state.or.us/oard/viewReceiptPDF.action?filingRsn=60695 + - title: PY2027 Energy Assistance Intake Operations and Policy Manual, Region 1 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=72 + - title: PY2027 Energy Assistance Intake Operations and Policy Manual, Region 2 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=74 diff --git a/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/amount/natural_gas.yaml b/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/amount/natural_gas.yaml new file mode 100644 index 00000000000..630391256fe --- /dev/null +++ b/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/amount/natural_gas.yaml @@ -0,0 +1,202 @@ +description: Oregon provides this annual regular heating payment for natural gas by region, household size and income band under the Low Income Home Energy Assistance Program. +1: + 1: + 1: + 2024-10-01: 500 + 2025-10-09: 670 + 2026-10-01: 660 + 2: + 2024-10-01: 390 + 2025-10-09: 520 + 2026-10-01: 515 + 3: + 2024-10-01: 325 + 2025-10-09: 435 + 2026-10-01: 430 + 4: + 2024-10-01: 250 + 2025-10-09: 310 + 2: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 615 + 2025-10-09: 605 + 2026-10-01: 600 + 3: + 2024-10-01: 510 + 2025-10-09: 505 + 2026-10-01: 500 + 4: + 2024-10-01: 365 + 2025-10-09: 360 + 3: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 625 + 2025-10-09: 640 + 2026-10-01: 635 + 3: + 2024-10-01: 520 + 2025-10-09: 535 + 2026-10-01: 530 + 4: + 2024-10-01: 375 + 2025-10-09: 385 + 2026-10-01: 380 + 4: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 695 + 2025-10-09: 670 + 2026-10-01: 665 + 3: + 2024-10-01: 580 + 2025-10-09: 555 + 4: + 2024-10-01: 415 + 2025-10-09: 400 + 5: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 730 + 2025-10-09: 690 + 3: + 2024-10-01: 610 + 2025-10-09: 575 + 4: + 2024-10-01: 435 + 2025-10-09: 415 + 2026-10-01: 410 + 6: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 2025-10-09: 710 + 3: + 2024-10-01: 650 + 2025-10-09: 590 + 4: + 2024-10-01: 470 + 2025-10-09: 425 +2: + 1: + 1: + 2024-10-01: 545 + 2025-10-09: 560 + 2026-10-01: 565 + 2: + 2024-10-01: 425 + 2025-10-09: 435 + 2026-10-01: 440 + 3: + 2024-10-01: 355 + 2025-10-09: 365 + 4: + 2024-10-01: 255 + 2025-10-09: 260 + 2026-10-01: 265 + 2: + 1: + 2024-10-01: 750 + 2025-10-09: 670 + 2026-10-01: 675 + 2: + 2024-10-01: 670 + 2025-10-09: 520 + 2026-10-01: 525 + 3: + 2024-10-01: 555 + 2025-10-09: 435 + 2026-10-01: 440 + 4: + 2024-10-01: 400 + 2025-10-09: 310 + 2026-10-01: 315 + 3: + 1: + 2024-10-01: 750 + 2025-10-09: 715 + 2026-10-01: 725 + 2: + 2024-10-01: 680 + 2025-10-09: 555 + 2026-10-01: 565 + 3: + 2024-10-01: 570 + 2025-10-09: 465 + 2026-10-01: 470 + 4: + 2024-10-01: 410 + 2025-10-09: 335 + 4: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 2025-10-09: 585 + 2026-10-01: 590 + 3: + 2024-10-01: 630 + 2025-10-09: 485 + 2026-10-01: 490 + 4: + 2024-10-01: 455 + 2025-10-09: 350 + 2026-10-01: 355 + 5: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 2025-10-09: 605 + 2026-10-01: 615 + 3: + 2024-10-01: 665 + 2025-10-09: 505 + 2026-10-01: 510 + 4: + 2024-10-01: 475 + 2025-10-09: 365 + 6: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 2025-10-09: 630 + 2026-10-01: 635 + 3: + 2024-10-01: 710 + 2025-10-09: 525 + 2026-10-01: 530 + 4: + 2024-10-01: 510 + 2025-10-09: 375 + 2026-10-01: 380 +metadata: + unit: currency-USD + period: year + label: Oregon LIHEAP natural gas heating payment + breakdown: + - range(1, 3) + - range(1, 7) + - range(1, 5) + reference: + - title: PY2025 Energy Assistance Intake Operations and Policy Manual, Region 1 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=58 + - title: PY2025 Energy Assistance Intake Operations and Policy Manual, Region 2 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=59 + - title: PY2026 Energy Assistance Intake Operations and Policy Manual, corrected Region 1 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=78 + - title: PY2026 Energy Assistance Intake Operations and Policy Manual, corrected Region 2 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=80 + - title: OHCS 44-2025 temporary order correcting the PY2026 payment matrices, effective October 9, 2025 + href: https://secure.sos.state.or.us/oard/viewReceiptPDF.action?filingRsn=60695 + - title: PY2027 Energy Assistance Intake Operations and Policy Manual, Region 1 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=72 + - title: PY2027 Energy Assistance Intake Operations and Policy Manual, Region 2 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=74 diff --git a/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/amount/propane.yaml b/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/amount/propane.yaml new file mode 100644 index 00000000000..9c40b63f18d --- /dev/null +++ b/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/amount/propane.yaml @@ -0,0 +1,168 @@ +description: Oregon provides this annual regular heating payment for propane by region, household size and income band under the Low Income Home Energy Assistance Program. +1: + 1: + 1: + 2024-10-01: 750 + 2025-10-09: 715 + 2: + 2024-10-01: 715 + 2025-10-09: 560 + 3: + 2024-10-01: 595 + 2025-10-09: 465 + 4: + 2024-10-01: 425 + 2025-10-09: 335 + 2: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 2025-10-09: 655 + 3: + 2024-10-01: 750 + 2025-10-09: 545 + 4: + 2024-10-01: 670 + 2025-10-09: 390 + 3: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 2025-10-09: 695 + 3: + 2024-10-01: 750 + 2025-10-09: 580 + 4: + 2024-10-01: 685 + 2025-10-09: 415 + 4: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 2025-10-09: 725 + 3: + 2024-10-01: 750 + 2025-10-09: 605 + 4: + 2024-10-01: 750 + 2025-10-09: 435 + 5: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 3: + 2024-10-01: 750 + 2025-10-09: 625 + 4: + 2024-10-01: 750 + 2025-10-09: 450 + 6: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 3: + 2024-10-01: 750 + 2025-10-09: 645 + 4: + 2024-10-01: 750 + 2025-10-09: 460 +2: + 1: + 1: + 2024-10-01: 750 + 2025-10-09: 715 + 2: + 2024-10-01: 750 + 2025-10-09: 560 + 3: + 2024-10-01: 650 + 2025-10-09: 465 + 4: + 2024-10-01: 465 + 2025-10-09: 335 + 2: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 2025-10-09: 655 + 3: + 2024-10-01: 750 + 2025-10-09: 545 + 4: + 2024-10-01: 730 + 2025-10-09: 390 + 3: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 2025-10-09: 695 + 3: + 2024-10-01: 750 + 2025-10-09: 580 + 4: + 2024-10-01: 745 + 2025-10-09: 415 + 4: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 2025-10-09: 725 + 3: + 2024-10-01: 750 + 2025-10-09: 605 + 4: + 2024-10-01: 750 + 2025-10-09: 435 + 5: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 3: + 2024-10-01: 750 + 2025-10-09: 625 + 4: + 2024-10-01: 750 + 2025-10-09: 450 + 6: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 3: + 2024-10-01: 750 + 2025-10-09: 645 + 4: + 2024-10-01: 750 + 2025-10-09: 460 +metadata: + unit: currency-USD + period: year + label: Oregon LIHEAP propane heating payment + breakdown: + - range(1, 3) + - range(1, 7) + - range(1, 5) + reference: + - title: PY2025 Energy Assistance Intake Operations and Policy Manual, Region 1 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=58 + - title: PY2025 Energy Assistance Intake Operations and Policy Manual, Region 2 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=59 + - title: PY2026 Energy Assistance Intake Operations and Policy Manual, corrected Region 1 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=78 + - title: PY2026 Energy Assistance Intake Operations and Policy Manual, corrected Region 2 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=80 + - title: OHCS 44-2025 temporary order correcting the PY2026 payment matrices, effective October 9, 2025 + href: https://secure.sos.state.or.us/oard/viewReceiptPDF.action?filingRsn=60695 + - title: PY2027 Energy Assistance Intake Operations and Policy Manual, Region 1 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=72 + - title: PY2027 Energy Assistance Intake Operations and Policy Manual, Region 2 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=74 diff --git a/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/amount/wood.yaml b/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/amount/wood.yaml new file mode 100644 index 00000000000..59de663e73c --- /dev/null +++ b/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/amount/wood.yaml @@ -0,0 +1,168 @@ +description: Oregon provides this annual regular heating payment for wood by region, household size and income band under the Low Income Home Energy Assistance Program. +1: + 1: + 1: + 2024-10-01: 750 + 2025-10-09: 715 + 2: + 2024-10-01: 685 + 2025-10-09: 560 + 3: + 2024-10-01: 570 + 2025-10-09: 465 + 4: + 2024-10-01: 410 + 2025-10-09: 350 + 2: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 2025-10-09: 655 + 3: + 2024-10-01: 750 + 2025-10-09: 545 + 4: + 2024-10-01: 645 + 2025-10-09: 390 + 3: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 2025-10-09: 695 + 3: + 2024-10-01: 750 + 2025-10-09: 580 + 4: + 2024-10-01: 660 + 2025-10-09: 415 + 4: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 2025-10-09: 725 + 3: + 2024-10-01: 750 + 2025-10-09: 605 + 4: + 2024-10-01: 730 + 2025-10-09: 435 + 5: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 3: + 2024-10-01: 750 + 2025-10-09: 625 + 4: + 2024-10-01: 750 + 2025-10-09: 450 + 6: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 3: + 2024-10-01: 750 + 2025-10-09: 645 + 4: + 2024-10-01: 750 + 2025-10-09: 460 +2: + 1: + 1: + 2024-10-01: 750 + 2025-10-09: 715 + 2: + 2024-10-01: 750 + 2025-10-09: 560 + 3: + 2024-10-01: 625 + 2025-10-09: 465 + 4: + 2024-10-01: 450 + 2025-10-09: 350 + 2: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 2025-10-09: 655 + 3: + 2024-10-01: 750 + 2025-10-09: 545 + 4: + 2024-10-01: 705 + 2025-10-09: 390 + 3: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 2025-10-09: 695 + 3: + 2024-10-01: 750 + 2025-10-09: 580 + 4: + 2024-10-01: 720 + 2025-10-09: 415 + 4: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 2025-10-09: 725 + 3: + 2024-10-01: 750 + 2025-10-09: 605 + 4: + 2024-10-01: 750 + 2025-10-09: 435 + 5: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 3: + 2024-10-01: 750 + 2025-10-09: 625 + 4: + 2024-10-01: 750 + 2025-10-09: 450 + 6: + 1: + 2024-10-01: 750 + 2: + 2024-10-01: 750 + 3: + 2024-10-01: 750 + 2025-10-09: 645 + 4: + 2024-10-01: 750 + 2025-10-09: 460 +metadata: + unit: currency-USD + period: year + label: Oregon LIHEAP wood heating payment + breakdown: + - range(1, 3) + - range(1, 7) + - range(1, 5) + reference: + - title: PY2025 Energy Assistance Intake Operations and Policy Manual, Region 1 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=58 + - title: PY2025 Energy Assistance Intake Operations and Policy Manual, Region 2 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=59 + - title: PY2026 Energy Assistance Intake Operations and Policy Manual, corrected Region 1 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=78 + - title: PY2026 Energy Assistance Intake Operations and Policy Manual, corrected Region 2 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=80 + - title: OHCS 44-2025 temporary order correcting the PY2026 payment matrices, effective October 9, 2025 + href: https://secure.sos.state.or.us/oard/viewReceiptPDF.action?filingRsn=60695 + - title: PY2027 Energy Assistance Intake Operations and Policy Manual, Region 1 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=72 + - title: PY2027 Energy Assistance Intake Operations and Policy Manual, Region 2 benefit matrix + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=74 diff --git a/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/income_band.yaml b/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/income_band.yaml new file mode 100644 index 00000000000..578cb5a9d40 --- /dev/null +++ b/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/income_band.yaml @@ -0,0 +1,170 @@ +# Printed bounds do not follow one reproducible rounding rule. The last band +# extends through the separate eligibility limit, including its $1 discrepancy. +description: Oregon divides countable income into payment bands with these inclusive annual upper bounds by household size under the Low Income Home Energy Assistance Program. +1: + 1: + 2024-10-01: 9_203 + 2025-10-09: 9_597 + 2026-10-01: 10_082 + 2: + 2024-10-01: 12_035 + 2025-10-09: 12_549 + 2026-10-01: 13_184 + 3: + 2024-10-01: 14_866 + 2025-10-09: 15_502 + 2026-10-01: 16_286 + 4: + 2024-10-01: 17_698 + 2025-10-09: 18_454 + 2026-10-01: 19_388 + 5: + 2024-10-01: 20_530 + 2025-10-09: 21_407 + 2026-10-01: 22_490 + 6: + 2024-10-01: 23_361 + 2025-10-09: 24_360 + 2026-10-01: 25_592 + 7: + 2024-10-01: 23_892 + 2025-10-09: 24_913 + 2026-10-01: 26_174 + 8: + 2024-10-01: 24_423 + 2025-10-09: 25_467 + 2026-10-01: 26_755 + 9: + 2024-10-01: 24_954 + 2025-10-09: 26_020 + 2026-10-01: 27_337 + 10: + 2024-10-01: 25_485 + 2025-10-09: 26_574 + 2026-10-01: 27_918 + 11: + 2024-10-01: 26_016 + 2025-10-09: 27_128 + 2026-10-01: 28_500 + 12: + 2024-10-01: 26_547 + 2025-10-09: 27_681 + 2026-10-01: 29_082 +2: + 1: + 2024-10-01: 18_406 + 2025-10-09: 19_193 + 2026-10-01: 20_163 + 2: + 2024-10-01: 24_069 + 2025-10-09: 25_098 + 2026-10-01: 26_367 + 3: + 2024-10-01: 29_732 + 2025-10-09: 31_003 + 2026-10-01: 32_571 + 4: + 2024-10-01: 35_395 + 2025-10-09: 36_908 + 2026-10-01: 38_775 + 5: + 2024-10-01: 41_059 + 2025-10-09: 42_814 + 2026-10-01: 44_979 + 6: + 2024-10-01: 46_722 + 2025-10-09: 48_719 + 2026-10-01: 51_183 + 7: + 2024-10-01: 47_784 + 2025-10-09: 49_826 + 2026-10-01: 52_347 + 8: + 2024-10-01: 48_845 + 2025-10-09: 50_933 + 2026-10-01: 53_510 + 9: + 2024-10-01: 49_907 + 2025-10-09: 52_040 + 2026-10-01: 54_673 + 10: + 2024-10-01: 50_969 + 2025-10-09: 53_148 + 2026-10-01: 55_836 + 11: + 2024-10-01: 52_031 + 2025-10-09: 54_255 + 2026-10-01: 57_000 + 12: + 2024-10-01: 53_093 + 2025-10-09: 55_362 + 2026-10-01: 58_163 +3: + 1: + 2024-10-01: 27_609 + 2025-10-09: 28_789 + 2026-10-01: 30_245 + 2: + 2024-10-01: 36_103 + 2025-10-09: 37_646 + 2026-10-01: 39_551 + 3: + 2024-10-01: 44_598 + 2025-10-09: 46_504 + 2026-10-01: 48_857 + 4: + 2024-10-01: 53_093 + 2025-10-09: 55_362 + 2026-10-01: 58_163 + 5: + 2024-10-01: 61_588 + 2025-10-09: 64_220 + 2026-10-01: 67_469 + 6: + 2024-10-01: 70_082 + 2025-10-09: 73_078 + 2026-10-01: 76_775 + 7: + 2024-10-01: 71_675 + 2025-10-09: 74_739 + 2026-10-01: 78_520 + 8: + 2024-10-01: 73_268 + 2025-10-09: 76_400 + 2026-10-01: 80_265 + 9: + 2024-10-01: 74_861 + 2025-10-09: 78_060 + 2026-10-01: 82_010 + 10: + 2024-10-01: 76_453 + 2025-10-09: 79_721 + 2026-10-01: 83_754 + 11: + 2024-10-01: 78_046 + 2025-10-09: 81_382 + 2026-10-01: 85_499 + 12: + 2024-10-01: 79_639 + 2025-10-09: 83_043 + 2026-10-01: 87_244 +metadata: + unit: currency-USD + period: year + label: Oregon LIHEAP annual income band upper bounds + breakdown: + - range(1, 4) + - range(1, 13) + reference: + - title: PY2025 Energy Assistance Intake Operations and Policy Manual, standard payment income bands + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=58 + - title: PY2026 Energy Assistance Intake Operations and Policy Manual, standard payment income bands, household sizes 1 to 7 + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=78 + - title: PY2026 Energy Assistance Intake Operations and Policy Manual, standard payment income bands, household sizes 7 to 12 + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=79 + - title: OHCS 44-2025 temporary order correcting the PY2026 payment matrices, effective October 9, 2025 + href: https://secure.sos.state.or.us/oard/viewReceiptPDF.action?filingRsn=60695 + - title: PY2027 Energy Assistance Intake Operations and Policy Manual, standard payment income bands, household sizes 1 to 9 + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=72 + - title: PY2027 Energy Assistance Intake Operations and Policy Manual, standard payment income bands, household sizes 9 to 12 + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=73 diff --git a/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/max_household_size.yaml b/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/max_household_size.yaml new file mode 100644 index 00000000000..121b160bd66 --- /dev/null +++ b/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/max_household_size.yaml @@ -0,0 +1,14 @@ +description: Oregon limits the published standard payment matrix to this household size under the Low Income Home Energy Assistance Program. +values: + 2024-10-01: 12 +metadata: + unit: person + period: year + label: Oregon LIHEAP largest published household size + reference: + - title: PY2025 Energy Assistance Intake Operations and Policy Manual + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=58 + - title: PY2026 Energy Assistance Intake Operations and Policy Manual + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=79 + - title: PY2027 Energy Assistance Intake Operations and Policy Manual + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=73 diff --git a/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/max_payment_size.yaml b/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/max_payment_size.yaml new file mode 100644 index 00000000000..21897cb64c3 --- /dev/null +++ b/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/max_payment_size.yaml @@ -0,0 +1,14 @@ +description: Oregon provides the same payment amounts to households at or above this size under the Low Income Home Energy Assistance Program. +values: + 2024-10-01: 6 +metadata: + unit: person + period: year + label: Oregon LIHEAP maximum payment size group + reference: + - title: "PY2025 Energy Assistance Intake Operations and Policy Manual #page 58-59" + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=58 + - title: "PY2026 Energy Assistance Intake Operations and Policy Manual #page 78-81" + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=78 + - title: "PY2027 Energy Assistance Intake Operations and Policy Manual #page 72-75" + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=72 diff --git a/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/regions/region_1.yaml b/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/regions/region_1.yaml new file mode 100644 index 00000000000..c8b459a4fc1 --- /dev/null +++ b/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/regions/region_1.yaml @@ -0,0 +1,32 @@ +description: Oregon includes these counties in payment region 1 under the Low Income Home Energy Assistance Program. +values: + 2024-10-01: + - BENTON_COUNTY_OR + - CLACKAMAS_COUNTY_OR + - CLATSOP_COUNTY_OR + - COLUMBIA_COUNTY_OR + - COOS_COUNTY_OR + - CURRY_COUNTY_OR + - DOUGLAS_COUNTY_OR + - JACKSON_COUNTY_OR + - JOSEPHINE_COUNTY_OR + - LANE_COUNTY_OR + - LINCOLN_COUNTY_OR + - LINN_COUNTY_OR + - MARION_COUNTY_OR + - MULTNOMAH_COUNTY_OR + - POLK_COUNTY_OR + - TILLAMOOK_COUNTY_OR + - WASHINGTON_COUNTY_OR + - YAMHILL_COUNTY_OR +metadata: + unit: list + period: year + label: Oregon LIHEAP region 1 counties + reference: + - title: PY2025 Energy Assistance Intake Operations and Policy Manual + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=58 + - title: PY2026 Energy Assistance Intake Operations and Policy Manual + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=78 + - title: PY2027 Energy Assistance Intake Operations and Policy Manual + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=72 diff --git a/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/regions/region_2.yaml b/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/regions/region_2.yaml new file mode 100644 index 00000000000..e47dbab23d9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/regions/region_2.yaml @@ -0,0 +1,32 @@ +description: Oregon includes these counties in payment region 2 under the Low Income Home Energy Assistance Program. +values: + 2024-10-01: + - BAKER_COUNTY_OR + - CROOK_COUNTY_OR + - DESCHUTES_COUNTY_OR + - GILLIAM_COUNTY_OR + - GRANT_COUNTY_OR + - HARNEY_COUNTY_OR + - HOOD_RIVER_COUNTY_OR + - JEFFERSON_COUNTY_OR + - KLAMATH_COUNTY_OR + - LAKE_COUNTY_OR + - MALHEUR_COUNTY_OR + - MORROW_COUNTY_OR + - SHERMAN_COUNTY_OR + - UMATILLA_COUNTY_OR + - UNION_COUNTY_OR + - WALLOWA_COUNTY_OR + - WASCO_COUNTY_OR + - WHEELER_COUNTY_OR +metadata: + unit: list + period: year + label: Oregon LIHEAP region 2 counties + reference: + - title: PY2025 Energy Assistance Intake Operations and Policy Manual + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=59 + - title: PY2026 Energy Assistance Intake Operations and Policy Manual + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=80 + - title: PY2027 Energy Assistance Intake Operations and Policy Manual + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=74 diff --git a/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/roomer_rate.yaml b/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/roomer_rate.yaml new file mode 100644 index 00000000000..082c8a2ae54 --- /dev/null +++ b/policyengine_us/parameters/gov/states/or/ohcs/liheap/payment/roomer_rate.yaml @@ -0,0 +1,14 @@ +description: Oregon provides this share of the standard payment to a roomer, boarder or owner who applies separately under the Low Income Home Energy Assistance Program. +values: + 2024-10-01: 0.5 +metadata: + unit: /1 + period: year + label: Oregon LIHEAP roomer and boarder payment share + reference: + - title: PY2025 Energy Assistance Intake Operations and Policy Manual + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=47 + - title: "PY2026 Energy Assistance Intake Operations and Policy Manual #page 61-62" + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=62 + - title: PY2027 Energy Assistance Intake Operations and Policy Manual + href: https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=59 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index ff794207755..2c54c8591f6 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -808,7 +808,7 @@ programs: category: Benefits agency: HHS status: partial - coverage: DC, Riverside County, MA, IL, IN, KS, KY, MD, MS, NC, NE, NJ, NY, TX + coverage: DC, Riverside County, MA, IL, IN, KS, KY, MD, MS, NC, NE, NJ, NY, OR, TX state_implementations: - state: DC status: complete @@ -900,6 +900,14 @@ programs: parameter_prefix: gov.states.ny.otda.heap verified_years: "2024-2026" notes: FY2024-FY2026 regular heating only, with the fuel base amounts, the Tier I and vulnerable supplements and the heat-included levels. Crisis, cooling, HERR and clean-and-tune assistance are out of scope. + - state: OR + status: partial + name: Oregon LIHEAP + full_name: Oregon Low Income Home Energy Assistance Program + variable: or_liheap + parameter_prefix: gov.states.or.ohcs.liheap + verified_years: "2025-2027" + notes: PY2025-PY2027 regular heating only, with the two county regions, five fuel columns and the roomer half payment. Crisis, cooling, Fuel Payment, equipment and OEAP assistance are out of scope. - state: TX status: partial name: Texas CEAP diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/ohcs/liheap/eligibility/or_liheap_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/ohcs/liheap/eligibility/or_liheap_eligible.yaml new file mode 100644 index 00000000000..d1b3ed8f290 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/or/ohcs/liheap/eligibility/or_liheap_eligible.yaml @@ -0,0 +1,45 @@ +# Page numbers in the comments are those of the FY2026 Oregon Energy Assistance +# Intake, Operations and Policy Manual (energy burden on page 61 and in the +# table on pages 93-94, income limits on page 77): +# https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=93 +# OAR 813-200-0020(1)(b) makes "a demonstrated energy burden" a condition of +# eligibility: +# https://www.law.cornell.edu/regulations/oregon/Or-Admin-Code-SS-813-200-0020 +- name: Case 1, energy burden with heat paid directly, heat included in rent, subsidized housing and public housing. + period: 2026 + input: + state_code: [OR, OR, OR, OR, OR, OR, OR] + age: [38, 38, 38, 38, 38, 38, 38] + # About 30 hours a week near the Portland-metro minimum wage ($16.80 an + # hour from July 2026). + employment_income: [26_000, 26_000, 26_000, 26_000, 26_000, 26_000, 26_000] + ssi: [0, 0, 0, 0, 0, 0, 0] + tanf: [0, 0, 0, 0, 0, 0, 0] + heating_type: [ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY] + # About $125 a month where the household pays its own electric bill. + pre_subsidy_electricity_expense: [0, 0, 0, 1_500, 1_500, 1_500, 0] + heat_expense_included_in_rent: [false, true, true, false, false, true, true] + receives_housing_assistance: [false, false, true, true, false, true, false] + is_in_public_housing: [false, false, false, false, false, false, true] + output: + # Wages of 26,000 are within the size 1 limit of $38,385 (page 77) for + # every household, so eligibility turns on the energy burden table + # (page 93) and OAR 813-200-0020(1)(b): + # 1. no heating bill and heat not in rent: no energy burden to + # demonstrate ("All households must demonstrate an energy burden", + # page 61), ineligible; + # 2. "Energy Costs included in rent (non-subsidized)": energy burden + # "Yes", eligible; + # 3. "Applicant lives in Subsidized Housing and heat is included in + # rent": energy burden "No", ineligible; + # 4. "Applicant lives in Subsidized Housing and pays a vendor directly + # for utility costs": energy burden "Yes", eligible; + # 5. "Applicant pays a vendor directly for utilities": energy burden + # "Yes", eligible; + # 6. subsidized housing with heat included in rent stays ineligible + # (page 61 and row 3 of page 93) even though the household pays a + # separate electric bill: the "pays a vendor directly" row is read + # as the heating bill, so a non-heating bill creates no energy burden; + # 7. public housing is subsidized housing, so heat included in rent is + # again "No", ineligible. + or_liheap_eligible: [false, true, false, true, true, false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/ohcs/liheap/eligibility/or_liheap_income_limit.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/ohcs/liheap/eligibility/or_liheap_income_limit.yaml new file mode 100644 index 00000000000..61a754aa0ac --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/or/ohcs/liheap/eligibility/or_liheap_income_limit.yaml @@ -0,0 +1,50 @@ +# Sources for the expected values in this file, "60% of State Median Income by +# Household Size", Annual Gross Income column, in the Oregon Energy Assistance +# Intake, Operations and Policy Manuals: +# FY2026, page 77: +# https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=77 +# PY2025, page 57: +# https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=57 +# PY2027, page 71: +# https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=71 +- name: Case 1, published FY2026 annual income limits for the odd household sizes 1 to 11. + period: 2026 + input: + state_code: [OR, OR, OR, OR, OR, OR] + spm_unit_size: [1, 3, 5, 7, 9, 11] + output: + # FY2026 page 77: size 1 $38,385, size 3 $62,006, size 5 $85,627, size 7 + # $99,652, size 9 $104,081, size 11 $108,510. + or_liheap_income_limit: [38_385, 62_006, 85_627, 99_652, 104_081, 108_510] + +- name: Case 2, published PY2025 annual income limits for the odd household sizes 1 to 11. + period: 2025 + input: + state_code: [OR, OR, OR, OR, OR, OR] + spm_unit_size: [1, 3, 5, 7, 9, 11] + output: + # PY2025 page 57: size 1 $36,811, size 3 $59,464, size 5 $82,117, size 7 + # $95,567, size 9 $99,814, size 11 $104,062. + or_liheap_income_limit: [36_811, 59_464, 82_117, 95_567, 99_814, 104_062] + +- name: Case 3, published PY2027 annual income limits at the sizes whose 60 percent product is a whole dollar. + period: 2027 + input: + state_code: [OR, OR, OR, OR, OR, OR] + spm_unit_size: [2, 3, 6, 8, 10, 12] + output: + # PY2027 page 71: size 2 $52,734, size 3 $65,142, size 6 $102,366, size 8 + # $107,019, size 10 $111,672, size 12 $116,325. The FY2027 four-person + # median is $129,250, so these products are exact dollars (129,250 x 0.68 + # x 0.6 = 52,734) and a float32 ceiling would add $1 to each. + or_liheap_income_limit: [52_734, 65_142, 102_366, 107_019, 111_672, 116_325] + +- name: Case 4, published FY2026 annual income limits for the even household sizes 2 to 12. + period: 2026 + input: + state_code: [OR, OR, OR, OR, OR, OR] + spm_unit_size: [2, 4, 6, 8, 10, 12] + output: + # FY2026 page 77: size 2 $50,196, size 4 $73,817, size 6 $97,438, size 8 + # $101,867, size 10 $106,296, size 12 $110,725. + or_liheap_income_limit: [50_196, 73_817, 97_438, 101_867, 106_296, 110_725] diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/ohcs/liheap/income/or_liheap_countable_earned_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/ohcs/liheap/income/or_liheap_countable_earned_income.yaml new file mode 100644 index 00000000000..362feb2b23c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/or/ohcs/liheap/income/or_liheap_countable_earned_income.yaml @@ -0,0 +1,60 @@ +# Page numbers in the comments are those of the FY2026 Oregon Energy Assistance +# Intake, Operations and Policy Manual (earned income on page 39, +# self-employment and other business income on page 45, earnings of minors +# and of high-school students on pages 41 and 53): +# https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=41 +- name: Case 1, earnings of a minor and of a high-school student are excluded, an 18-year-old out of school counts, and a business loss does not offset wages. + period: 2026 + input: + people: + person1: + age: 17 + employment_income: 1_000 + self_employment_income: 100 + person2: + age: 18 + is_in_secondary_school: true + employment_income: 2_000 + self_employment_income: 200 + person3: + age: 19 + employment_income: 3_000 + self_employment_income: 300 + sstb_self_employment_income: 400 + farm_operations_income: 500 + person4: + age: 40 + employment_income: 4_000 + self_employment_income: -5_000 + sstb_self_employment_income: 500 + farm_operations_income: 600 + person5: + age: 18 + # About 15 hours a week near the standard minimum wage ($15.55 an hour + # from July 2026), not enrolled in high school. + employment_income: 2_500 + partnership_s_corp_income: 700 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: OR + output: + # person1: "Income Earned by minors", household members under eighteen, + # is not counted (pages 41 and 53), 0. + # person2: income earned by household members eighteen and over who are + # enrolled in high school is not counted (pages 41 and 53), 0. + # person3: wages 3,000 (page 39) + self-employment income, "income from a + # business, less business expenses" (page 45), 300 + 400 + farm 500 = + # 4,200. + # person4: wages 4,000 (page 39) + specified-service self-employment 500 + + # farm 600 (page 45) = 5,100. The 5,000 business loss is floored at zero, + # a modeling convention: the manual does not say that a current-period + # loss offsets other earnings. + # person5: earnings of a member "eighteen (18) and over" count unless the + # member is enrolled in high school (pages 41 and 53): wages 2,500 (page + # 39) + partnership and S-corporation business income 700 (page 45) = + # 3,200. + or_liheap_countable_earned_income: [0, 0, 4_200, 5_100, 3_200] diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/ohcs/liheap/income/or_liheap_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/ohcs/liheap/income/or_liheap_countable_income.yaml new file mode 100644 index 00000000000..8a9c57b5d55 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/or/ohcs/liheap/income/or_liheap_countable_income.yaml @@ -0,0 +1,153 @@ +# Page numbers in the comments are those of the FY2026 Oregon Energy Assistance +# Intake, Operations and Policy Manual (income and income exclusion chart on +# pages 37-48, proof of income on pages 49-51, private disability insurance +# examples on pages 55-56): +# https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=50 +# General assistance is a checked source in section 1.9 of the FFY2026 state +# plan, page 6: +# https://liheapch.acf.gov/docs/2026/state-plans/OR_Plan_2026.pdf#page=6 +- name: Case 1, interest counts only above $200 and every listed unearned source counts. + period: 2026 + input: + state_code: [OR, OR] + or_liheap_countable_earned_income: [0, 0] + # The only difference between the two households: interest at the $200 + # threshold and one dollar over it. + interest_income: [200, 201] + ordinary_dividend_income: [100, 100] + rental_income: [300, 300] + social_security: [1_000, 1_000] + railroad_benefits: [120, 120] + tanf: [500, 500] + pension_income: [200, 200] + unemployment_compensation: [150, 150] + child_support_received: [250, 250] + workers_compensation: [100, 100] + disability_benefits: [75, 75] + veterans_benefits: [50, 50] + alimony_income: [25, 25] + strike_benefits: [10, 10] + ssi: [600, 600] + general_assistance: [80, 80] + estate_income: [40, 40] + military_retirement_pay: [90, 90] + output: + # Each source is marked "Considered Income? Yes" in the chart: dividends + # 100 (page 39) + rental income 300 (page 44) + Social Security 1,000 + # (page 46) + Railroad Retirement 120 (page 44) + TANF 500 (page 47) + + # pensions 200 (page 44) + unemployment insurance 150 (page 48) + child + # support 250 (page 38) + workers compensation 100 (page 49) + private + # disability insurance 75 (page 39) + veterans benefits 50 (page 48) + + # alimony 25 (page 37) + strike benefits 10 (page 47) + SSI 600 (page 47) + # + general assistance 80 (state plan section 1.9) + trust and estate + # income 40 (page 48) + military retirement pay 90, a retirement payment + # (page 44) = 3,690. + # Interest is counted "only if amount is over $200" (pages 43 and 50): + # $200 adds nothing, $201 is counted in full, 3,690 + 201 = 3,891. + or_liheap_countable_income: [3_690, 3_891] + +- name: Case 2, the manual's private disability insurance examples count the insurer's payment plus Social Security once. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [OR, OR] + or_liheap_countable_earned_income: [0, 0] + # Example A (page 55): net monthly insurer benefit $319.39 x 12 = 3,832.68. + # Example B (page 55): monthly benefit paid $709.33 x 12 = 8,511.96. + disability_benefits: [3_832.68, 8_511.96] + # Example A (page 55): Social Security $847.00 x 12 = 10,164. + # Example B (page 55): Social Security $825.00 + $414.00 = $1,239.00 x 12 + # = 14,868. + social_security: [10_164, 14_868] + ssi: [0, 0] + tanf: [0, 0] + output: + # Example A (page 55): "the maximum the client will ever receive from both + # sources is $1,166.39" a month, x 12 = 13,996.68. + # Example B (page 56): "$1,948.33 ($1,786.15 + $162.18)" a month, + # x 12 = 23,379.96. + or_liheap_countable_income: [13_996.68, 23_379.96] + +- name: Case 3, an Oregon TANF entitlement counts only when it is taken up. + period: 2026 + input: + state_code: [OR, OR] + age: [40, 40] + or_tanf: [1_200, 1_200] + takes_up_tanf_if_eligible: [false, true] + ssi: [0, 0] + output: + # TANF is "Considered Income? Yes" (page 47) and the proof of income is + # documentation "showing amount of assistance", so the model counts TANF + # actually received: the first household does not take up its $1,200 + # entitlement, 0; the second receives it, 1,200. + or_liheap_countable_income: [0, 1_200] + +- name: Case 4, rental and estate losses are floored at zero like business losses. + period: 2026 + input: + state_code: [OR, OR] + or_liheap_countable_earned_income: [45_000, 45_000] + rental_income: [-8_000, 2_000] + estate_income: [-1_000, 500] + ssi: [0, 0] + tanf: [0, 0] + output: + # Landlords complete the self-employment form (page 35) and a loss in one + # source does not offset other income, so the first household's $8,000 + # rental loss and $1,000 trust loss count as 0: 45,000. The second + # household counts both: 45,000 + rental 2,000 (page 44) + trust and + # estate income 500 (page 48) = 47,500. + or_liheap_countable_income: [45_000, 47_500] + +- name: Case 5, the $200 interest test applies to each member separately. + period: 2026 + input: + people: + person1: + age: 40 + interest_income: 150 + ssi: 0 + person2: + age: 38 + interest_income: 150 + ssi: 0 + spm_units: + spm_unit: + members: [person1, person2] + tanf: 0 + households: + household: + members: [person1, person2] + state_code: OR + output: + # Each member's $150 of interest is at or below $200 (pages 43 and 50), so + # neither is counted although the household's interest totals $300: a + # per-member reading, which the manual does not specify. + or_liheap_countable_income: 0 + +- name: Case 6, each member's rental loss is floored before the household sum. + period: 2026 + input: + people: + person1: + age: 40 + rental_income: 6_000 + ssi: 0 + person2: + age: 38 + rental_income: -6_000 + ssi: 0 + spm_units: + spm_unit: + members: [person1, person2] + tanf: 0 + households: + household: + members: [person1, person2] + state_code: OR + output: + # Each member's rental income is floored at zero before the household sum + # (page 35 sends landlords to the self-employment form), so the second + # member's $6,000 loss does not offset the first member's $6,000 of rent. + or_liheap_countable_income: 6_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/ohcs/liheap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/ohcs/liheap/integration.yaml new file mode 100644 index 00000000000..ffa79bfc7a3 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/or/ohcs/liheap/integration.yaml @@ -0,0 +1,119 @@ +# Page numbers in the comments are those of the PY2026 Energy Assistance Intake, +# Operations and Policy Manual (income limits on page 77, Region 1 matrix on +# pages 78-79, Region 2 matrix on pages 80-81): +# https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=77 +- name: Case 1, adult net earnings and child interest count but child wages do not. + period: 2026 + input: + people: + adult: + age: 40 + employment_income: 12_000 + self_employment_income: 2_400 + pension_income: 600 + ssi: 0 + general_assistance: 0 + child: + age: 17 + # About 15 hours a week near the standard minimum wage that applies in + # Deschutes County ($15.55 an hour from July 2026). + employment_income: 12_100 + interest_income: 201 + ssi: 0 + general_assistance: 0 + spm_units: + unit: + members: + - adult + - child + heating_type: ELECTRICITY + # About $150 a month for an electrically heated home. + pre_subsidy_electricity_expense: 1_800 + tanf: 0 + households: + home: + members: + - adult + - child + state_code: OR + county: DESCHUTES_COUNTY_OR + output: + # Adult: wages 12,000 (page 39) + net self-employment 2,400 (pages 35 + # and 45) = 14,400. + # Child: income earned by members under 18 is not counted (pages 41 + # and 53), so the 12,100 of wages counts as 0. + or_liheap_countable_earned_income: + - 14_400 + - 0 + # 14,400 + pension 600 (page 44) + interest 201, counted because it is + # over $200 a year (pages 43 and 50) = 15,201. + or_liheap_countable_income: 15_201 + # 60% of state median income, size 2: $50,196 (page 77). + or_liheap_income_limit: 50_196 + # Deschutes County is in the Region 2 list (page 80). + or_liheap_region: 2 + # Size 2, second row "$12,550 $25,098" (page 80). Counting the child's + # wages would give 27,301 and the third row instead. + or_liheap_income_band: 2 + # Pays its own electric heating bill and 15,201 is within $50,196. + or_liheap_eligible: true + # Region 2, size 2, "$12,550 $25,098", Electricity $505 (page 80). + or_liheap: 505 +- name: Case 2, adult secondary-school earnings are excluded for a nonsubsidized heat-in-rent household. + period: 2026 + input: + state_code: OR + county: MULTNOMAH_COUNTY_OR + age: 18 + is_in_secondary_school: true + # About 15 hours a week near the Portland-metro minimum wage ($16.80 an + # hour from July 2026). + employment_income: 13_100 + ssi: 0 + tanf: 0 + general_assistance: 0 + heat_expense_included_in_rent: true + heating_type: ELECTRICITY + output: + # Income earned by a member aged 18 or over who is enrolled in high + # school is not counted (pages 41 and 53); there is no other income. + or_liheap_countable_income: 0 + # 60% of state median income, size 1: $38,385 (page 77). + or_liheap_income_limit: 38_385 + # Size 1, first row "$0 $9,597" (page 78). Counting the 13,100 of wages + # would give the second row instead. + or_liheap_income_band: 1 + # Energy costs included in rent in non-subsidized housing are eligible + # (page 93) and 0 is within $38,385. + or_liheap_eligible: true + # Region 1 (Multnomah, page 78), size 1, "$0 $9,597", Electricity $465 + # (page 78). + or_liheap: 465 +- name: Case 3, public-housing household paying its own heat can receive a standard grant. + period: 2026 + input: + state_code: OR + county: MULTNOMAH_COUNTY_OR + age: 40 + pension_income: 12_000 + ssi: 0 + tanf: 0 + general_assistance: 0 + is_in_public_housing: true + heating_type: NATURAL_GAS + # About $80 a month for gas heat. + gas_expense: 960 + output: + # Pension 12,000 is counted (page 44); there is no other income. + or_liheap_countable_income: 12_000 + # Multnomah County is in the Region 1 list (page 78). + or_liheap_region: 1 + # Size 1, second row "$9,598 $19,193" (page 78). + or_liheap_income_band: 2 + # A subsidized-housing resident who pays a vendor directly for utilities + # is eligible (page 93); only subsidized housing with heat included in + # rent is excluded (page 61). 12,000 is within the size 1 limit of + # $38,385 (page 77). + or_liheap_eligible: true + # Region 1, size 1, "$9,598 $19,193", Natural Gas $520 (page 78). + or_liheap: 520 diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/ohcs/liheap/or_liheap.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/ohcs/liheap/or_liheap.yaml new file mode 100644 index 00000000000..61b113dc114 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/or/ohcs/liheap/or_liheap.yaml @@ -0,0 +1,600 @@ +# Page numbers in the comments are those of the FY2026 Oregon Energy Assistance +# Intake, Operations and Policy Manual (income limits on page 77, Region 1 +# matrix on pages 78-79, Region 2 matrix on pages 80-81, payment types on +# pages 61-62, energy burden table on pages 93-94); the manual is linked in +# the comment above Case 19. +# +# Cases 1 to 10 sweep the published payment matrices for the even household +# sizes 2, 4, 6, 8, 10 and 12; Cases 12 and 21 test the odd sizes 1, 3 and 5 +# at their printed band tops. Each size is tested at the first dollar of its four +# printed income rows, in this order: +# size 2: "$0", "$12,550", "$25,099", "$37,647" (pages 78 and 80) +# size 4: "$0", "$18,455", "$36,909", "$55,363" (pages 78 and 80) +# size 6: "$0", "$24,361", "$48,720", "$73,079" (pages 78 and 80) +# size 8: "$0", "$25,468", "$50,934", "$76,401" (pages 79 and 81) +# size 10: "$0", "$26,575", "$53,149", "$79,722" (pages 79 and 81) +# size 12: "$0", "$27,682", "$55,363", "$83,044" (pages 79 and 81) +# Multnomah County is in the Region 1 list (page 78) and Deschutes County in +# the Region 2 list (page 80). +- name: Case 1, Region 1 electricity payments for even household sizes at every income band. + period: 2026 + input: + state_code: [OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR] + county: [MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR] + spm_unit_size: [2, 2, 2, 2, 4, 4, 4, 4, 6, 6, 6, 6, 8, 8, 8, 8, 10, 10, 10, 10, 12, 12, 12, 12] + heating_type: [ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY] + # About $125 a month for electric heat. + pre_subsidy_electricity_expense: [1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500] + or_liheap_countable_income: [0, 12_550, 25_099, 37_647, 0, 18_455, 36_909, 55_363, 0, 24_361, 48_720, 73_079, 0, 25_468, 50_934, 76_401, 0, 26_575, 53_149, 79_722, 0, 27_682, 55_363, 83_044] + output: + # Region 1 matrix, Electricity column, four rows per size: + # size 2 (page 78): $595, $465, $385, $275 + # size 4 (page 78): $690, $540, $450, $320 + # size 6 (page 78): $750, $590, $490, $350 + # size 8 (page 79): $750, $590, $490, $350 + # size 10 (page 79): $750, $590, $490, $350 + # size 12 (page 79): $750, $590, $490, $350 + or_liheap: [595, 465, 385, 275, 690, 540, 450, 320, 750, 590, 490, 350, 750, 590, 490, 350, 750, 590, 490, 350, 750, 590, 490, 350] + +- name: Case 2, Region 1 heating oil payments for even household sizes at every income band. + period: 2026 + input: + state_code: [OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR] + county: [MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR] + spm_unit_size: [2, 2, 2, 2, 4, 4, 4, 4, 6, 6, 6, 6, 8, 8, 8, 8, 10, 10, 10, 10, 12, 12, 12, 12] + heating_type: [FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL] + # About 600 gallons of heating oil a year. + fuel_oil_expense: [2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400] + or_liheap_countable_income: [0, 12_550, 25_099, 37_647, 0, 18_455, 36_909, 55_363, 0, 24_361, 48_720, 73_079, 0, 25_468, 50_934, 76_401, 0, 26_575, 53_149, 79_722, 0, 27_682, 55_363, 83_044] + output: + # Region 1 matrix, Heating Oil column, four rows per size: + # size 2 (page 78): $750, $750, $640, $460 + # size 4 (page 78): $750, $750, $700, $505 + # size 6 (page 78): $750, $750, $740, $535 + # size 8 (page 79): $750, $750, $740, $535 + # size 10 (page 79): $750, $750, $740, $535 + # size 12 (page 79): $750, $750, $740, $535 + or_liheap: [750, 750, 640, 460, 750, 750, 700, 505, 750, 750, 740, 535, 750, 750, 740, 535, 750, 750, 740, 535, 750, 750, 740, 535] + +- name: Case 3, Region 1 propane payments for even household sizes at every income band. + period: 2026 + input: + state_code: [OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR] + county: [MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR] + spm_unit_size: [2, 2, 2, 2, 4, 4, 4, 4, 6, 6, 6, 6, 8, 8, 8, 8, 10, 10, 10, 10, 12, 12, 12, 12] + heating_type: [PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE] + # About $150 a month for propane heat. + bottled_gas_expense: [1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800] + or_liheap_countable_income: [0, 12_550, 25_099, 37_647, 0, 18_455, 36_909, 55_363, 0, 24_361, 48_720, 73_079, 0, 25_468, 50_934, 76_401, 0, 26_575, 53_149, 79_722, 0, 27_682, 55_363, 83_044] + output: + # Region 1 matrix, Liquid Gas (propane) column, four rows per size: + # size 2 (page 78): $750, $655, $545, $390 + # size 4 (page 78): $750, $725, $605, $435 + # size 6 (page 78): $750, $750, $645, $460 + # size 8 (page 79): $750, $750, $645, $460 + # size 10 (page 79): $750, $750, $645, $460 + # size 12 (page 79): $750, $750, $645, $460 + or_liheap: [750, 655, 545, 390, 750, 725, 605, 435, 750, 750, 645, 460, 750, 750, 645, 460, 750, 750, 645, 460, 750, 750, 645, 460] + +- name: Case 4, Region 1 natural gas payments for even household sizes at every income band. + period: 2026 + input: + state_code: [OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR] + county: [MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR] + spm_unit_size: [2, 2, 2, 2, 4, 4, 4, 4, 6, 6, 6, 6, 8, 8, 8, 8, 10, 10, 10, 10, 12, 12, 12, 12] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS] + # About $80 a month for gas heat. + gas_expense: [960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960] + or_liheap_countable_income: [0, 12_550, 25_099, 37_647, 0, 18_455, 36_909, 55_363, 0, 24_361, 48_720, 73_079, 0, 25_468, 50_934, 76_401, 0, 26_575, 53_149, 79_722, 0, 27_682, 55_363, 83_044] + output: + # Region 1 matrix, Natural Gas column, four rows per size: + # size 2 (page 78): $750, $605, $505, $360 + # size 4 (page 78): $750, $670, $555, $400 + # size 6 (page 78): $750, $710, $590, $425 + # size 8 (page 79): $750, $710, $590, $425 + # size 10 (page 79): $750, $710, $590, $425 + # size 12 (page 79): $750, $710, $590, $425 + or_liheap: [750, 605, 505, 360, 750, 670, 555, 400, 750, 710, 590, 425, 750, 710, 590, 425, 750, 710, 590, 425, 750, 710, 590, 425] + +- name: Case 5, Region 1 wood payments for even household sizes at every income band. + period: 2026 + input: + state_code: [OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR] + county: [MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR] + spm_unit_size: [2, 2, 2, 2, 4, 4, 4, 4, 6, 6, 6, 6, 8, 8, 8, 8, 10, 10, 10, 10, 12, 12, 12, 12] + heating_type: [WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD] + # About three cords of firewood a year. + wood_expense: [900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900] + or_liheap_countable_income: [0, 12_550, 25_099, 37_647, 0, 18_455, 36_909, 55_363, 0, 24_361, 48_720, 73_079, 0, 25_468, 50_934, 76_401, 0, 26_575, 53_149, 79_722, 0, 27_682, 55_363, 83_044] + output: + # Region 1 matrix, Wood/Pellets column, four rows per size: + # size 2 (page 78): $750, $655, $545, $390 + # size 4 (page 78): $750, $725, $605, $435 + # size 6 (page 78): $750, $750, $645, $460 + # size 8 (page 79): $750, $750, $645, $460 + # size 10 (page 79): $750, $750, $645, $460 + # size 12 (page 79): $750, $750, $645, $460 + or_liheap: [750, 655, 545, 390, 750, 725, 605, 435, 750, 750, 645, 460, 750, 750, 645, 460, 750, 750, 645, 460, 750, 750, 645, 460] + +- name: Case 6, Region 2 electricity payments for even household sizes at every income band. + period: 2026 + input: + state_code: [OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR] + county: [DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR] + spm_unit_size: [2, 2, 2, 2, 4, 4, 4, 4, 6, 6, 6, 6, 8, 8, 8, 8, 10, 10, 10, 10, 12, 12, 12, 12] + heating_type: [ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY] + # About $125 a month for electric heat. + pre_subsidy_electricity_expense: [1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500, 1_500] + or_liheap_countable_income: [0, 12_550, 25_099, 37_647, 0, 18_455, 36_909, 55_363, 0, 24_361, 48_720, 73_079, 0, 25_468, 50_934, 76_401, 0, 26_575, 53_149, 79_722, 0, 27_682, 55_363, 83_044] + output: + # Region 2 matrix, Electricity column, four rows per size: + # size 2 (page 80): $645, $505, $420, $300 + # size 4 (page 80): $740, $580, $480, $345 + # size 6 (page 80): $750, $630, $525, $375 + # size 8 (page 81): $750, $630, $525, $375 + # size 10 (page 81): $750, $630, $525, $375 + # size 12 (page 81): $750, $630, $525, $375 + or_liheap: [645, 505, 420, 300, 740, 580, 480, 345, 750, 630, 525, 375, 750, 630, 525, 375, 750, 630, 525, 375, 750, 630, 525, 375] + +- name: Case 7, Region 2 heating oil payments for even household sizes at every income band. + period: 2026 + input: + state_code: [OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR] + county: [DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR] + spm_unit_size: [2, 2, 2, 2, 4, 4, 4, 4, 6, 6, 6, 6, 8, 8, 8, 8, 10, 10, 10, 10, 12, 12, 12, 12] + heating_type: [FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL] + # About 600 gallons of heating oil a year. + fuel_oil_expense: [2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400, 2_400] + or_liheap_countable_income: [0, 12_550, 25_099, 37_647, 0, 18_455, 36_909, 55_363, 0, 24_361, 48_720, 73_079, 0, 25_468, 50_934, 76_401, 0, 26_575, 53_149, 79_722, 0, 27_682, 55_363, 83_044] + output: + # Region 2 matrix, Heating Oil column, four rows per size: + # size 2 (page 80): $750, $750, $640, $460 + # size 4 (page 80): $750, $750, $700, $505 + # size 6 (page 80): $750, $750, $740, $535 + # size 8 (page 81): $750, $750, $740, $535 + # size 10 (page 81): $750, $750, $740, $535 + # size 12 (page 81): $750, $750, $740, $535 + or_liheap: [750, 750, 640, 460, 750, 750, 700, 505, 750, 750, 740, 535, 750, 750, 740, 535, 750, 750, 740, 535, 750, 750, 740, 535] + +- name: Case 8, Region 2 propane payments for even household sizes at every income band. + period: 2026 + input: + state_code: [OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR] + county: [DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR] + spm_unit_size: [2, 2, 2, 2, 4, 4, 4, 4, 6, 6, 6, 6, 8, 8, 8, 8, 10, 10, 10, 10, 12, 12, 12, 12] + heating_type: [PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE] + # About $150 a month for propane heat. + bottled_gas_expense: [1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800, 1_800] + or_liheap_countable_income: [0, 12_550, 25_099, 37_647, 0, 18_455, 36_909, 55_363, 0, 24_361, 48_720, 73_079, 0, 25_468, 50_934, 76_401, 0, 26_575, 53_149, 79_722, 0, 27_682, 55_363, 83_044] + output: + # Region 2 matrix, Liquid Gas (propane) column, four rows per size: + # size 2 (page 80): $750, $655, $545, $390 + # size 4 (page 80): $750, $725, $605, $435 + # size 6 (page 80): $750, $750, $645, $460 + # size 8 (page 81): $750, $750, $645, $460 + # size 10 (page 81): $750, $750, $645, $460 + # size 12 (page 81): $750, $750, $645, $460 + or_liheap: [750, 655, 545, 390, 750, 725, 605, 435, 750, 750, 645, 460, 750, 750, 645, 460, 750, 750, 645, 460, 750, 750, 645, 460] + +- name: Case 9, Region 2 natural gas payments for even household sizes at every income band. + period: 2026 + input: + state_code: [OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR] + county: [DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR] + spm_unit_size: [2, 2, 2, 2, 4, 4, 4, 4, 6, 6, 6, 6, 8, 8, 8, 8, 10, 10, 10, 10, 12, 12, 12, 12] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS] + # About $80 a month for gas heat. + gas_expense: [960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960] + or_liheap_countable_income: [0, 12_550, 25_099, 37_647, 0, 18_455, 36_909, 55_363, 0, 24_361, 48_720, 73_079, 0, 25_468, 50_934, 76_401, 0, 26_575, 53_149, 79_722, 0, 27_682, 55_363, 83_044] + output: + # Region 2 matrix, Natural Gas column, four rows per size: + # size 2 (page 80): $670, $520, $435, $310 + # size 4 (page 80): $750, $585, $485, $350 + # size 6 (page 80): $750, $630, $525, $375 + # size 8 (page 81): $750, $630, $525, $375 + # size 10 (page 81): $750, $630, $525, $375 + # size 12 (page 81): $750, $630, $525, $375 + or_liheap: [670, 520, 435, 310, 750, 585, 485, 350, 750, 630, 525, 375, 750, 630, 525, 375, 750, 630, 525, 375, 750, 630, 525, 375] + +- name: Case 10, Region 2 wood payments for even household sizes at every income band. + period: 2026 + input: + state_code: [OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR] + county: [DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR] + spm_unit_size: [2, 2, 2, 2, 4, 4, 4, 4, 6, 6, 6, 6, 8, 8, 8, 8, 10, 10, 10, 10, 12, 12, 12, 12] + heating_type: [WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD, WOOD] + # About three cords of firewood a year. + wood_expense: [900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900] + or_liheap_countable_income: [0, 12_550, 25_099, 37_647, 0, 18_455, 36_909, 55_363, 0, 24_361, 48_720, 73_079, 0, 25_468, 50_934, 76_401, 0, 26_575, 53_149, 79_722, 0, 27_682, 55_363, 83_044] + output: + # Region 2 matrix, Wood/Pellets column, four rows per size: + # size 2 (page 80): $750, $655, $545, $390 + # size 4 (page 80): $750, $725, $605, $435 + # size 6 (page 80): $750, $750, $645, $460 + # size 8 (page 81): $750, $750, $645, $460 + # size 10 (page 81): $750, $750, $645, $460 + # size 12 (page 81): $750, $750, $645, $460 + or_liheap: [750, 655, 545, 390, 750, 725, 605, 435, 750, 750, 645, 460, 750, 750, 645, 460, 750, 750, 645, 460, 750, 750, 645, 460] + +- name: Case 11, the published income limit includes the dollar above the last matrix row. + period: 2026 + input: + state_code: [OR, OR, OR] + county: [MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR] + spm_unit_size: [2, 2, 2] + heating_type: [ELECTRICITY, ELECTRICITY, ELECTRICITY] + # About $125 a month for electric heat. + pre_subsidy_electricity_expense: [1_500, 1_500, 1_500] + # The last size 2 matrix row ends at $50,195 (page 78) while the size 2 + # income limit is $50,196 (page 77): the top of the row, the limit itself + # and one dollar above the limit. + or_liheap_countable_income: [50_195, 50_196, 50_197] + output: + # Size 2 limit $50,196 (page 77): $50,195 and $50,196 are within it, + # $50,197 is not. + or_liheap_eligible: [true, true, false] + # Region 1, size 2, "$37,647 $50,195", Electricity $275 (page 78). The + # eligible household at exactly $50,196 is paid from that same last row. + # The ineligible household receives $0. + or_liheap: [275, 275, 0] + +- name: Case 12, income bands include their printed tops and change at the next dollar. + period: 2026 + input: + state_code: [OR, OR, OR, OR, OR, OR, OR] + county: [MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS] + # About $80 a month for gas heat. + gas_expense: [960, 960, 960, 960, 960, 960, 960] + # Size 1 rows (page 78): "$0 $9,597", "$9,598 $19,193", "$19,194 $28,789", + # "$28,790 $38,385". Tested at $0, at each printed row top and at the + # first dollar of the following row. + or_liheap_countable_income: [0, 9_597, 9_598, 19_193, 19_194, 28_789, 28_790] + output: + # Region 1, size 1, Natural Gas column (page 78): $670 for "$0 $9,597", + # $520 for "$9,598 $19,193", $435 for "$19,194 $28,789" and $310 for + # "$28,790 $38,385". + or_liheap: [670, 670, 520, 520, 435, 435, 310] + +- name: Case 13, supported and unsupported heating fuels. + period: 2026 + input: + state_code: [OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR] + county: [DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR] + heating_type: [ELECTRICITY, FUEL_OIL, PROPANE, NATURAL_GAS, WOOD, KEROSENE, COAL, SOLAR, OTHER, UNSPECIFIED, NONE] + # Each household pays the bill of its own fuel. Kerosene is billed as + # heating oil and a grid-tied solar home pays an electricity bill. + pre_subsidy_electricity_expense: [1_500, 0, 0, 0, 0, 0, 0, 1_200, 0, 0, 0] + fuel_oil_expense: [0, 2_400, 0, 0, 0, 1_200, 0, 0, 0, 0, 0] + bottled_gas_expense: [0, 0, 1_800, 0, 0, 0, 0, 0, 0, 0, 0] + gas_expense: [0, 0, 0, 960, 0, 0, 0, 0, 0, 0, 0] + wood_expense: [0, 0, 0, 0, 900, 0, 0, 0, 0, 0, 0] + coal_expense: [0, 0, 0, 0, 0, 0, 800, 0, 0, 0, 0] + other_heating_fuel_expense: [0, 0, 0, 0, 0, 0, 0, 0, 1_000, 0, 0] + # The household that did not report its fuel has heat included in rent; + # the last household has no heating at all. + heat_expense_included_in_rent: [false, false, false, false, false, false, false, false, false, true, false] + or_liheap_countable_income: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + output: + # Paying a vendor directly or having energy costs included in + # non-subsidized rent is an energy burden (page 93), and $0 is within the + # size 1 limit of $38,385 (page 77). A home with no heating has no + # energy burden to demonstrate (page 61). + or_liheap_eligible: [true, true, true, true, true, true, true, true, true, true, false] + # Region 2, size 1, "$0 $9,597" (page 80): Electricity $515, Heating Oil + # $750, Liquid Gas $715, Natural Gas $560, Wood/Pellets $715. The program + # is fuel blind (page 5), so kerosene is paid from the Heating Oil column, + # $750, and a grid-tied solar home from the Electricity column, $515. Coal + # and other fuels have no matrix column, $0, a coverage gap rather than a + # denial. An unspecified fuel pays $0 even with heat included in rent + # because the amount depends on the fuel column; the UNSPECIFIED default + # is tracked in issue 9754. No heating, ineligible, $0. + or_liheap: [515, 750, 715, 560, 715, 750, 0, 515, 0, 0, 0] + +- name: Case 14, a roomer applying separately with heat in rent receives half the regular payment. + period: 2026 + input: + state_code: OR + county: MULTNOMAH_COUNTY_OR + age: 28 + # About 10 hours a week near the Portland-metro minimum wage ($16.80 an + # hour from July 2026). + employment_income: 8_600 + ssi: 0 + tanf: 0 + # The rented room is heated by the building's electric heat. + heating_type: ELECTRICITY + heat_expense_included_in_rent: true + or_liheap_dwelling_type: ROOMER_BOARDER_OWNER + output: + # Wages are the only income (page 39). + or_liheap_countable_income: 8_600 + # Size 1, first row "$0 $9,597" (page 78). + or_liheap_income_band: 1 + # Energy costs included in non-subsidized rent are an energy burden + # (page 93) and 8,600 is within the size 1 limit of $38,385 (page 77). + or_liheap_eligible: true + # Region 1, size 1, "$0 $9,597", Electricity $465 (page 78). A roomer or + # boarder who applies separately as an individual household receives + # "50% of a regular payment based on the Benefit Matrix" (pages 61-62): + # $465 x 0.5 = $232.50. + or_liheap: 232.5 + +- name: Case 15, an unknown county and a household above the published size range are unsupported. + period: 2026 + input: + state_code: [OR, OR] + county: [UNKNOWN, MULTNOMAH_COUNTY_OR] + spm_unit_size: [1, 13] + age: [40, 40] + employment_income: [30_000, 40_000] + ssi: [0, 0] + tanf: [0, 0] + heating_type: [ELECTRICITY, ELECTRICITY] + # About $125 a month for electric heat. + pre_subsidy_electricity_expense: [1_500, 1_500] + output: + # Both pay an electric heating bill (page 93). 30,000 is within the + # size 1 limit of $38,385 (page 77). 40,000 is far within the size 13 + # limit: page 77 gives $110,725 for size 12 plus an increment for each + # additional member (printed as $2,115, while the table's own steps above + # size 6 are $2,214), so the limit is about $112,900 either way. + or_liheap_eligible: [true, true] + # A county reported as UNKNOWN is in neither region list (pages 78 and + # 80), and the matrices end at size 12 (pages 79 and 81), so the model has + # no published amount to pay: $0 in both cases, a coverage gap rather than + # a denial. A household that omits the county input is Case 22. + or_liheap: [0, 0] + +- name: Case 16, a small gas bill does not cap the standard payment. + period: 2026 + input: + state_code: OR + county: MULTNOMAH_COUNTY_OR + age: 35 + # About 9 hours a week near the Portland-metro minimum wage ($16.80 an + # hour from July 2026). + employment_income: 8_000 + ssi: 0 + tanf: 0 + heating_type: NATURAL_GAS + # About $25 a month of gas in a small, well-insulated apartment. + gas_expense: 300 + output: + # Wages are the only income (page 39). + or_liheap_countable_income: 8_000 + # Size 1, first row "$0 $9,597" (page 78). + or_liheap_income_band: 1 + # Pays a vendor directly (page 93) and 8,000 is within the size 1 limit + # of $38,385 (page 77). + or_liheap_eligible: true + # Region 1, size 1, "$0 $9,597", Natural Gas $670 (page 78). The standard + # payment is "determined by the LIHEAP/OEAP Benefits Matrix" (page 61) + # and is not limited to the household's $300 bill. + or_liheap: 670 + +- name: Case 17, a Washington household receives no Oregon benefit. + period: 2026 + input: + state_code: WA + age: 40 + employment_income: 30_000 + ssi: 0 + tanf: 0 + heating_type: NATURAL_GAS + # About $80 a month for gas heat. + gas_expense: 960 + output: + # The manual governs the Oregon program administered by OHCS (page 1), so + # a household outside Oregon receives nothing and every Oregon variable + # keeps its default. + or_liheap: 0 + +- name: Case 18, one simulation with an Oregon household and a Washington household pays only the Oregon household. + period: 2026 + input: + people: + person1: + age: 30 + # Full-time work near the Portland-metro minimum wage ($16.80 an hour from July 2026). + employment_income: 34_500 + ssi: 0 + person2: + age: 45 + employment_income: 30_000 + ssi: 0 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + # About $80 a month for gas heat. + gas_expense: 960 + tanf: 0 + spm_unit2: + members: [person2] + heating_type: ELECTRICITY + # About $125 a month for electric heat. + pre_subsidy_electricity_expense: 1_500 + tanf: 0 + households: + household1: + members: [person1] + state_code: OR + county: MULTNOMAH_COUNTY_OR + household2: + members: [person2] + state_code: WA + output: + # Unit 1: wages are the only income and earned income is counted (page 39). + # Unit 2 is outside Oregon, so every Oregon variable keeps its default. + or_liheap_countable_income: [34_500, 0] + # Unit 1: size 1, fourth row "$28,790 $38,385" (page 78). + # Unit 2: default 0, which the payment lookup must tolerate. + or_liheap_income_band: [4, 0] + # Unit 1: pays a gas bill and 34,500 is within the size 1 limit of + # $38,385 (page 77). Unit 2: not an Oregon household. + or_liheap_eligible: [true, false] + # Unit 1: Region 1 (Multnomah, page 78), size 1, "$28,790 $38,385", + # Natural Gas $310 (page 78). Unit 2: no Oregon benefit. + or_liheap: [310, 0] + +# PY2026 manual, page 44: rental-property income and pensions paid to surviving +# dependents count separately from wages. Page 77 gives the $38,385 size-one limit. +# https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=44 +- name: Case 19, farm rental income puts a gas-heating household over the income limit. + period: 2026 + input: + state_code: OR + county: MULTNOMAH_COUNTY_OR + age: 45 + employment_income: 30_000 + farm_rent_income: 10_000 + rental_income: 0 + ssi: 0 + tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 1_200 + output: + # $30,000 wages + $10,000 farm rents exceeds $38,385. + or_liheap_countable_income: 40_000 + or_liheap_income_limit: 38_385 + or_liheap_eligible: false + or_liheap: 0 + +- name: Case 20, survivor pension income puts a gas-heating household over the income limit. + period: 2026 + input: + state_code: OR + county: MULTNOMAH_COUNTY_OR + age: 45 + employment_income: 30_000 + survivor_benefits: 10_000 + pension_income: 0 + ssi: 0 + tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 1_200 + output: + # $30,000 wages + $10,000 survivor pension exceeds $38,385. + or_liheap_countable_income: 40_000 + or_liheap_income_limit: 38_385 + or_liheap_eligible: false + or_liheap: 0 + +- name: Case 21, odd household sizes change band at the printed tops, and wood differs from propane only in the last size 1 row. + period: 2026 + input: + state_code: [OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR, OR] + county: [MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR] + spm_unit_size: [3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 1, 1] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, PROPANE, WOOD] + # About $80 a month for gas heat, $150 a month for propane heat and three + # cords of firewood a year. + gas_expense: [960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 0, 0] + bottled_gas_expense: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1_800, 0] + wood_expense: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 900] + # Size 3 rows (page 78): "$0 $15,502", "$15,503 $31,003", "$31,004 $46,504", + # "$46,505 $62,006"; size 5 rows (page 78): "$0 $21,407", "$21,408 $42,814", + # "$42,815 $64,220", "$64,221 $85,627". Each printed top and the next + # dollar, then size 1 at $30,000 in its last row "$28,790 $38,385". + or_liheap_countable_income: [15_502, 15_503, 31_003, 31_004, 46_504, 46_505, 21_407, 21_408, 42_814, 42_815, 64_220, 64_221, 30_000, 30_000] + output: + or_liheap_income_band: [1, 2, 2, 3, 3, 4, 1, 2, 2, 3, 3, 4, 4, 4] + # Region 1 Natural Gas column (page 78): size 3 $750, $640, $535, $385; + # size 5 $750, $690, $575, $415. Size 1, last row (page 78): Liquid Gas + # $335, Wood/Pellets $350. + or_liheap: [750, 640, 640, 535, 535, 385, 750, 690, 690, 575, 575, 415, 335, 350] + +- name: Case 22, a household without a county input is placed in Baker County and paid Region 2 rates. + period: 2026 + input: + state_code: [OR, OR] + spm_unit_size: [1, 1] + heating_type: [ELECTRICITY, NATURAL_GAS] + # About $125 a month for electric heat and $80 a month for gas heat. + pre_subsidy_electricity_expense: [1_500, 0] + gas_expense: [0, 960] + or_liheap_countable_income: [0, 0] + output: + # With no county input the model falls back to the first Oregon county in + # the enum, Baker County, which is in the Region 2 list (page 80). + or_liheap_region: [2, 2] + # Region 2, size 1, "$0 $9,597" (page 80): Electricity $515, Natural Gas + # $560. + or_liheap: [515, 560] + +# PY2025 manual (effective October 1, 2024), income limits on PDF page 57 and +# matrices on pages 58-59: +# https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=58 +- name: Case 23, program year 2025 pays the PY2025 matrix, whose heating oil column differs by region. + period: 2025 + input: + state_code: [OR, OR, OR, OR] + county: [MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, DESCHUTES_COUNTY_OR] + spm_unit_size: [1, 1, 1, 1] + heating_type: [ELECTRICITY, NATURAL_GAS, FUEL_OIL, FUEL_OIL] + # About $125 a month for electric heat, $80 a month for gas heat and 600 + # gallons of heating oil a year. + pre_subsidy_electricity_expense: [1_500, 0, 0, 0] + gas_expense: [0, 960, 0, 0] + fuel_oil_expense: [0, 0, 2_400, 2_400] + or_liheap_countable_income: [9_400, 0, 20_000, 20_000] + output: + # PY2025 size 1 limit $36,811 (page 57). + or_liheap_income_limit: [36_811, 36_811, 36_811, 36_811] + # PY2025 size 1 rows "$0 $9,203", "$9,204 $18,406", "$18,407 $27,609" + # (page 58). + or_liheap_income_band: [2, 1, 3, 3] + # Region 1 (page 58): Electricity $295 in the second row, Natural Gas $500 + # in the first row, Heating Oil $680 in the third row. Region 2 (page 59): + # Heating Oil $745 in the third row. + or_liheap: [295, 500, 680, 745] + +# PY2027 manual (effective October 1, 2026), income limits on PDF page 71 and +# matrices on pages 72-75: +# https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=72 +- name: Case 24, program year 2027 pays the PY2027 matrix with its new band tops. + period: 2027 + input: + state_code: [OR, OR, OR, OR] + county: [MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, MULTNOMAH_COUNTY_OR, DESCHUTES_COUNTY_OR] + spm_unit_size: [1, 1, 1, 1] + heating_type: [ELECTRICITY, ELECTRICITY, NATURAL_GAS, ELECTRICITY] + # About $125 a month for electric heat and $80 a month for gas heat. + pre_subsidy_electricity_expense: [1_500, 1_500, 0, 1_500] + gas_expense: [0, 0, 960, 0] + # The first PY2027 size 1 row ends at $10,082 (page 72). + or_liheap_countable_income: [10_000, 10_083, 0, 10_000] + output: + # PY2027 size 1 limit $40,326 (page 71). + or_liheap_income_limit: [40_326, 40_326, 40_326, 40_326] + # PY2027 size 1 rows "$0 $10,082", "$10,083 $20,163" (page 72). + or_liheap_income_band: [1, 2, 1, 1] + # Region 1 (page 72): Electricity $475 then $370, Natural Gas $660. + # Region 2 (page 74): Electricity $510. + or_liheap: [475, 370, 660, 510] + +- name: Case 25, program year 2027 pays the size 12 rows of the Region 2 matrix. + period: 2027 + input: + state_code: [OR, OR, OR, OR, OR, OR] + county: [DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR, DESCHUTES_COUNTY_OR] + spm_unit_size: [12, 12, 12, 12, 12, 12] + heating_type: [ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, NATURAL_GAS, FUEL_OIL] + # About $125 a month for electric heat, $80 a month for gas heat and 600 + # gallons of heating oil a year. + pre_subsidy_electricity_expense: [1_500, 1_500, 1_500, 1_500, 0, 0] + gas_expense: [0, 0, 0, 0, 960, 0] + fuel_oil_expense: [0, 0, 0, 0, 0, 2_400] + # PY2027 size 12 rows (page 75): "$0 $29,082", "$29,083 $58,163", + # "$58,164 $87,244", "$87,245 $116,325": the first dollar of each row, then + # the last row for gas and oil. + or_liheap_countable_income: [0, 29_083, 58_164, 87_245, 87_245, 87_245] + output: + # PY2027 size 12 limit $116,325 (page 71). + or_liheap_income_limit: [116_325, 116_325, 116_325, 116_325, 116_325, 116_325] + or_liheap_income_band: [1, 2, 3, 4, 4, 4] + # Region 2, size 12 (page 75): Electricity $750, $615, $515, $370; Natural + # Gas $380 and Heating Oil $535 in the last row. Sizes 7 to 12 print the + # size 6 amounts. + or_liheap: [750, 615, 515, 370, 380, 535] diff --git a/policyengine_us/variables/gov/states/or/ohcs/liheap/eligibility/or_liheap_eligible.py b/policyengine_us/variables/gov/states/or/ohcs/liheap/eligibility/or_liheap_eligible.py new file mode 100644 index 00000000000..0273768c7a3 --- /dev/null +++ b/policyengine_us/variables/gov/states/or/ohcs/liheap/eligibility/or_liheap_eligible.py @@ -0,0 +1,38 @@ +from policyengine_us.model_api import * + + +class or_liheap_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = YEAR + label = "Oregon LIHEAP regular heating eligibility" + defined_for = StateCode.OR + # Manual PDF pages 11, 30, 36, 61, 77, 93-94; OAR 813-200-0020(1)(b). + reference = ( + "https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=61", + "https://www.law.cornell.edu/regulations/oregon/Or-Admin-Code-SS-813-200-0020", + ) + documentation = ( + "SPM members approximate the economic household, with identity and SSN " + "verification assumed complete. The energy burden test follows OAR " + "813-200-0020(1)(b) and the manual's energy burden table: subsidized housing " + "with heat included in rent is excluded even when the household pays a " + "separate non-heating utility bill. The Oregon sources do not prescribe a " + "SNAP immigration test. No asset or categorical income test applies. " + "Institutional residence, tribal duplicate awards, documentation and " + "application timing are not modeled. A zero benefit above size 12 or for an " + "unknown county denotes unsupported schedule coverage, not a legal denial." + ) + + def formula(spm_unit, period, parameters): + heat_in_rent = spm_unit("heat_expense_included_in_rent", period) + subsidized = spm_unit( + "receives_housing_assistance", period + ) | spm_unit.household("is_in_public_housing", period) + heating_cost = spm_unit("has_heating_expense", period) | heat_in_rent + income = spm_unit("or_liheap_countable_income", period) + return ( + heating_cost + & ~(heat_in_rent & subsidized) + & (income <= spm_unit("or_liheap_income_limit", period)) + ) diff --git a/policyengine_us/variables/gov/states/or/ohcs/liheap/eligibility/or_liheap_income_limit.py b/policyengine_us/variables/gov/states/or/ohcs/liheap/eligibility/or_liheap_income_limit.py new file mode 100644 index 00000000000..f587bc50125 --- /dev/null +++ b/policyengine_us/variables/gov/states/or/ohcs/liheap/eligibility/or_liheap_income_limit.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class or_liheap_income_limit(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + label = "Oregon LIHEAP income limit" + unit = USD + defined_for = StateCode.OR + reference = ( + "https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=57", + "https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=77", + "https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=71", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states["or"].ohcs.liheap.eligibility + # Ceiling reproduces every published limit for program years 2025 to + # 2027; the manual does not prescribe a rounding rule. The product is + # rounded to cents in float64 first: float32 0.6 is slightly above 0.6, + # which lifts a whole-dollar product above the integer and would add $1. + # hhs_smi uses the requested year's SMI. + smi = spm_unit("hhs_smi", period).astype(np.float64) + return np.ceil(np.round(smi * p.smi_rate, 2)) diff --git a/policyengine_us/variables/gov/states/or/ohcs/liheap/income/or_liheap_countable_earned_income.py b/policyengine_us/variables/gov/states/or/ohcs/liheap/income/or_liheap_countable_earned_income.py new file mode 100644 index 00000000000..ee74591d645 --- /dev/null +++ b/policyengine_us/variables/gov/states/or/ohcs/liheap/income/or_liheap_countable_earned_income.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +class or_liheap_countable_earned_income(Variable): + value_type = float + entity = Person + definition_period = YEAR + label = "Oregon LIHEAP countable earned income" + unit = USD + defined_for = StateCode.OR + # PDF pages 35, 41, 45, 53. + reference = "https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=35" + documentation = ( + "Existing net self-employment inputs are used without an additional expense " + "deduction. Flooring each source at zero is a modeling convention; the manual " + "does not specify current-period loss offsets." + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states["or"].ohcs.liheap.income + earned = 0 + for source in p.sources.earned: + earned = earned + max_(person(source, period), 0) + counted = (person("age", period) >= p.earned_income_min_age) & ~person( + "is_in_secondary_school", period + ) + return where(counted, earned, 0) diff --git a/policyengine_us/variables/gov/states/or/ohcs/liheap/income/or_liheap_countable_income.py b/policyengine_us/variables/gov/states/or/ohcs/liheap/income/or_liheap_countable_income.py new file mode 100644 index 00000000000..d5797efd478 --- /dev/null +++ b/policyengine_us/variables/gov/states/or/ohcs/liheap/income/or_liheap_countable_income.py @@ -0,0 +1,50 @@ +from policyengine_us.model_api import * + + +class or_liheap_countable_income(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + label = "Oregon LIHEAP countable household income" + unit = USD + defined_for = StateCode.OR + # PDF pages 35-56. + reference = "https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=35" + documentation = ( + "Annual income approximates the allowed one-, three- or twelve-month " + "observation window. Interest is assumed withdrawn, and the $200 test is " + "applied to each member's interest, a reading the manual does not specify. " + "Each member's unearned sources are floored at zero like the earned sources, " + "so a rental or estate loss does not offset other income, another member's " + "included. Enter disability_benefits as the " + "private insurer's payment after any Social Security offset; Social Security " + "is counted separately, reproducing the manual's examples without deducting " + "the offset twice. Unsupported details include regular gifts, foster and " + "adoption payments, tribal receipts, work-study and caregiver payments within " + "the household. Military wages should be included in employment_income. Use a " + "direct countable-income override when these details matter." + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states["or"].ohcs.liheap.income + person = spm_unit.members + interest = person("interest_income", period) + counted_interest = spm_unit.sum( + where(interest > p.interest_threshold, interest, 0) + ) + # Landlords complete the self-employment form (page 35), so a loss in one + # source cannot offset another, as in the earned-income formula; each + # member's source is floored before the household sum. + unearned = 0 + for source in p.sources.unearned: + unearned = unearned + spm_unit.sum(max_(person(source, period), 0)) + # TANF counts receipt after take-up, not or_tanf entitlement. It is a + # unit-level amount, so it is added here rather than listed with the + # person-level sources. + tanf = max_(spm_unit("tanf", period), 0) + return ( + add(spm_unit, period, ["or_liheap_countable_earned_income"]) + + unearned + + tanf + + counted_interest + ) diff --git a/policyengine_us/variables/gov/states/or/ohcs/liheap/or_liheap.py b/policyengine_us/variables/gov/states/or/ohcs/liheap/or_liheap.py new file mode 100644 index 00000000000..191e8078b17 --- /dev/null +++ b/policyengine_us/variables/gov/states/or/ohcs/liheap/or_liheap.py @@ -0,0 +1,65 @@ +from policyengine_us.model_api import * + + +class or_liheap(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + label = "Oregon LIHEAP regular heating benefit" + unit = USD + defined_for = "or_liheap_eligible" + reference = ( + # PDF pages 47, 58-59. + "https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=58", + # PDF pages 61-62, 67, 78-81, 93-94. + "https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=61", + # PDF pages 59, 72-75. + "https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=72", + ) + documentation = ( + "Annual regular heating assistance, verified for program years 2025 to 2027. " + "Earlier years use parameter backfilling and are unverified historical " + "estimates. No actual-expense cap applies. Heat-in-rent households need the " + "building heating fuel; a fuel without a matrix column pays zero as a coverage " + "gap, not a denial. Discretionary bulk-fuel minimum-delivery payments and local " + "supplements are unsupported because the necessary award information is " + "absent. Cooling, crisis and equipment assistance are excluded." + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states["or"].ohcs.liheap.payment + region = max_(spm_unit("or_liheap_region", period), 1) + size = clip(spm_unit("spm_unit_size", period), 1, p.max_payment_size) + # Out-of-state units carry band 0; the floor keeps them on a valid key. + band = max_(spm_unit("or_liheap_income_band", period), 1) + fuel = spm_unit("heating_type", period) + types = fuel.possible_values + # Kerosene is billed as heating oil and a grid-tied solar home pays an + # electricity bill, the same pairing heating_expense uses. + amount = select( + [ + (fuel == types.ELECTRICITY) | (fuel == types.SOLAR), + (fuel == types.FUEL_OIL) | (fuel == types.KEROSENE), + fuel == types.PROPANE, + fuel == types.NATURAL_GAS, + fuel == types.WOOD, + ], + [ + p.amount.electricity[region][size][band], + p.amount.fuel_oil[region][size][band], + p.amount.propane[region][size][band], + p.amount.natural_gas[region][size][band], + p.amount.wood[region][size][band], + ], + # Coal, other and unspecified fuels have no matrix column; the + # unspecified default is tracked in #9754. + default=0, + ) + dwelling = spm_unit("or_liheap_dwelling_type", period) + separate = dwelling == dwelling.possible_values.ROOMER_BOARDER_OWNER + # Missing payment-table dimensions are coverage gaps, not eligibility + # restrictions. Keep them separate from the legal income/housing test. + supported = (spm_unit("or_liheap_region", period) > 0) & ( + spm_unit("spm_unit_size", period) <= p.max_household_size + ) + return where(supported, amount * where(separate, p.roomer_rate, 1), 0) diff --git a/policyengine_us/variables/gov/states/or/ohcs/liheap/or_liheap_dwelling_type.py b/policyengine_us/variables/gov/states/or/ohcs/liheap/or_liheap_dwelling_type.py new file mode 100644 index 00000000000..857de41c96c --- /dev/null +++ b/policyengine_us/variables/gov/states/or/ohcs/liheap/or_liheap_dwelling_type.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class ORLIHEAPDwellingType(Enum): + STANDARD = "Standard household" + ROOMER_BOARDER_OWNER = ( + "Roomer, boarder or owner applying separately from other residents" + ) + + +class or_liheap_dwelling_type(Variable): + value_type = Enum + possible_values = ORLIHEAPDwellingType + default_value = ORLIHEAPDwellingType.STANDARD + entity = SPMUnit + definition_period = YEAR + label = "Oregon LIHEAP dwelling arrangement" + # PDF pages 30, 61-62. + reference = "https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=30" + documentation = ( + "The half-payment arrangement applies when a roomer, boarder or owner applies " + "as a separate economic household and the other residents do not apply " + "together. It is not a reduction for all renters." + ) diff --git a/policyengine_us/variables/gov/states/or/ohcs/liheap/payment/or_liheap_income_band.py b/policyengine_us/variables/gov/states/or/ohcs/liheap/payment/or_liheap_income_band.py new file mode 100644 index 00000000000..5e48a025c64 --- /dev/null +++ b/policyengine_us/variables/gov/states/or/ohcs/liheap/payment/or_liheap_income_band.py @@ -0,0 +1,28 @@ +from policyengine_us.model_api import * + + +class or_liheap_income_band(Variable): + value_type = int + entity = SPMUnit + definition_period = YEAR + label = "Oregon LIHEAP payment income band" + defined_for = StateCode.OR + reference = ( + "https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=58", + "https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=78", + "https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=79", + "https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=72", + "https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=73", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states["or"].ohcs.liheap.payment + size = clip(spm_unit("spm_unit_size", period), 1, p.max_household_size) + income = spm_unit("or_liheap_countable_income", period) + # Keep the printed inclusive tops, including their $1 irregularities. + return ( + 1 + + (income > p.income_band["1"][size]) + + (income > p.income_band["2"][size]) + + (income > p.income_band["3"][size]) + ) diff --git a/policyengine_us/variables/gov/states/or/ohcs/liheap/payment/or_liheap_region.py b/policyengine_us/variables/gov/states/or/ohcs/liheap/payment/or_liheap_region.py new file mode 100644 index 00000000000..295b2db8b9e --- /dev/null +++ b/policyengine_us/variables/gov/states/or/ohcs/liheap/payment/or_liheap_region.py @@ -0,0 +1,31 @@ +from policyengine_us.model_api import * + + +class or_liheap_region(Variable): + value_type = int + entity = SPMUnit + definition_period = YEAR + label = "Oregon LIHEAP payment region" + defined_for = StateCode.OR + reference = ( + "https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=58", + "https://www.oregon.gov/ohcs/energy-weatherization/Documents/PY25%20EA%20Operations%20%20Policy%20Manual-%20FINAL%209-27-24.pdf#page=59", + "https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=78", + "https://www.oregon.gov/ohcs/energy-weatherization/Documents/2026%20Final%20Energy%20Assistance%20Intake%20Operations%20%26%20Policy%20Manual.pdf#page=80", + "https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=72", + "https://www.oregon.gov/ohcs/energy-weatherization/Documents/manuals/09-23-2027-PY-2027-EA-Operations-Policy-Manual.pdf#page=74", + ) + documentation = ( + "Zero denotes a county reported as UNKNOWN or an out-of-state household. A " + "missing county input falls back to the state's first county in the enum, " + "Baker County, which is in Region 2." + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states["or"].ohcs.liheap.payment.regions + county = spm_unit.household("county_str", period) + return select( + [np.isin(county, p.region_1), np.isin(county, p.region_2)], + [1, 2], + default=0, + )