diff --git a/changelog.d/ne-liheap.added.md b/changelog.d/ne-liheap.added.md new file mode 100644 index 00000000000..d18e3e338cc --- /dev/null +++ b/changelog.d/ne-liheap.added.md @@ -0,0 +1 @@ +Add partial Nebraska LIHEAP regular heating assistance verified for FY2026, with single-family and multifamily schedules and assumed economic vulnerability for separately billed or rent-included heating. diff --git a/policyengine_us/parameters/gov/states/ne/dhhs/liheap/earned_income_disregard.yaml b/policyengine_us/parameters/gov/states/ne/dhhs/liheap/earned_income_disregard.yaml new file mode 100644 index 00000000000..ccaea440e6a --- /dev/null +++ b/policyengine_us/parameters/gov/states/ne/dhhs/liheap/earned_income_disregard.yaml @@ -0,0 +1,10 @@ +description: Nebraska excludes this share of gross countable earned income when determining regular heating payments under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 0.2 +metadata: + unit: /1 + period: year + label: Nebraska LIHEAP earned income disregard + reference: + - title: Nebraska LIHEAP Guidance Document effective October 1, 2025 + href: https://dhhs.ne.gov/Documents/Low%20Income%20Home%20Energy%20Assistance%20Program%20%28LIHEAP%29%20Guidance%20Document%202026.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/ne/dhhs/liheap/earned_income_sources.yaml b/policyengine_us/parameters/gov/states/ne/dhhs/liheap/earned_income_sources.yaml new file mode 100644 index 00000000000..9c6c0ae3fb2 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ne/dhhs/liheap/earned_income_sources.yaml @@ -0,0 +1,19 @@ +description: Nebraska counts these earned income sources under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: + - employment_income + # 475 NAC 3-002.04(B)(i), in the text in effect for FY2026, counts each + # source of self-employment. The existing net business and farm inputs are + # read without another business expense deduction. + - self_employment_income + - sstb_self_employment_income + - farm_operations_income +metadata: + unit: list + period: year + label: Nebraska LIHEAP earned income sources + reference: + - title: 475 NAC 3-002.04(B)(i), text in effect for FY2026, page 44 (each source of self-employment) + href: https://rules.nebraska.gov/api/fileStorage/GetAsByteArray/historical-chapter-pdfs/475%20NAC%203%20(09-17-2024)-202607280000.pdf#page=44 + - title: Nebraska FY2026 state plan, Section 1.9, page 7 + href: https://liheapch.acf.gov/docs/2026/state-plans/NE_Plan_2026.pdf#page=7 diff --git a/policyengine_us/parameters/gov/states/ne/dhhs/liheap/fpg_year_lag.yaml b/policyengine_us/parameters/gov/states/ne/dhhs/liheap/fpg_year_lag.yaml new file mode 100644 index 00000000000..6427304d368 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ne/dhhs/liheap/fpg_year_lag.yaml @@ -0,0 +1,12 @@ +description: Nebraska uses federal poverty guidelines from this many years before the modeled heating-season ending year under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 1 +metadata: + unit: year + period: year + label: Nebraska LIHEAP federal poverty guideline year lag + reference: + - title: Nebraska LIHEAP Guidance Document effective October 1, 2025 (the one-person limit of $23,475 is 150% of the 2025 guideline) + href: https://dhhs.ne.gov/Documents/Low%20Income%20Home%20Energy%20Assistance%20Program%20%28LIHEAP%29%20Guidance%20Document%202026.pdf#page=1 + - title: Annual Update of the HHS Poverty Guidelines, Federal Register, January 17, 2025, page 1 ($15,650 for one person, $5,500 for each additional person) + href: https://www.govinfo.gov/content/pkg/FR-2025-01-17/pdf/2025-01377.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ne/dhhs/liheap/income_limit.yaml b/policyengine_us/parameters/gov/states/ne/dhhs/liheap/income_limit.yaml new file mode 100644 index 00000000000..eeba15cffa5 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ne/dhhs/liheap/income_limit.yaml @@ -0,0 +1,12 @@ +description: Nebraska limits gross countable income to this share of the federal poverty guidelines under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 1.5 +metadata: + unit: /1 + period: year + label: Nebraska LIHEAP income limit + reference: + - title: Nebraska LIHEAP Guidance Document effective October 1, 2025, pages 1-2 (income limits; "at or below 150% of the federal poverty level") + href: https://dhhs.ne.gov/Documents/Low%20Income%20Home%20Energy%20Assistance%20Program%20%28LIHEAP%29%20Guidance%20Document%202026.pdf#page=1 + - title: 476 NAC 2-002.01 Income Guidelines (total annual income "may not exceed 150% of the federal poverty level") + href: https://rules.nebraska.gov/api/fileStorage/GetAsByteArray/chapter-pdfs/476%20NAC%202%20(06-26-2022).pdf/1747#page=1 diff --git a/policyengine_us/parameters/gov/states/ne/dhhs/liheap/payment/multifamily.yaml b/policyengine_us/parameters/gov/states/ne/dhhs/liheap/payment/multifamily.yaml new file mode 100644 index 00000000000..4c9ecab658e --- /dev/null +++ b/policyengine_us/parameters/gov/states/ne/dhhs/liheap/payment/multifamily.yaml @@ -0,0 +1,27 @@ +description: Nebraska provides these regular multi-family heating payments for all fuel types by countable income as a share of the federal poverty guideline under the Low Income Home Energy Assistance Program. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 380 + - threshold: + 2025-10-01: 0.7 + amount: + 2025-10-01: 300 + - threshold: + 2025-10-01: 1 + amount: + 2025-10-01: 220 + - threshold: + 2025-10-01: 1.3 + amount: + 2025-10-01: 154 +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + period: year + label: Nebraska LIHEAP multi-family heating payment + reference: + - title: Nebraska LIHEAP Guidance Document effective October 1, 2025, Heating Payment Computation + href: https://dhhs.ne.gov/Documents/Low%20Income%20Home%20Energy%20Assistance%20Program%20%28LIHEAP%29%20Guidance%20Document%202026.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/ne/dhhs/liheap/payment/oil.yaml b/policyengine_us/parameters/gov/states/ne/dhhs/liheap/payment/oil.yaml new file mode 100644 index 00000000000..b636a0b0db5 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ne/dhhs/liheap/payment/oil.yaml @@ -0,0 +1,27 @@ +description: Nebraska provides these regular single-family heating payments for fuel oil and kerosene by countable income as a share of the federal poverty guideline under the Low Income Home Energy Assistance Program. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 1_050 + - threshold: + 2025-10-01: 0.7 + amount: + 2025-10-01: 650 + - threshold: + 2025-10-01: 1 + amount: + 2025-10-01: 350 + - threshold: + 2025-10-01: 1.3 + amount: + 2025-10-01: 175 +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + period: year + label: Nebraska LIHEAP fuel oil and kerosene heating payment + reference: + - title: Nebraska LIHEAP Guidance Document effective October 1, 2025, Heating Payment Computation + href: https://dhhs.ne.gov/Documents/Low%20Income%20Home%20Energy%20Assistance%20Program%20%28LIHEAP%29%20Guidance%20Document%202026.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/ne/dhhs/liheap/payment/propane.yaml b/policyengine_us/parameters/gov/states/ne/dhhs/liheap/payment/propane.yaml new file mode 100644 index 00000000000..8c3863a5dc5 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ne/dhhs/liheap/payment/propane.yaml @@ -0,0 +1,27 @@ +description: Nebraska provides these regular single-family heating payments for propane by countable income as a share of the federal poverty guideline under the Low Income Home Energy Assistance Program. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 850 + - threshold: + 2025-10-01: 0.7 + amount: + 2025-10-01: 580 + - threshold: + 2025-10-01: 1 + amount: + 2025-10-01: 330 + - threshold: + 2025-10-01: 1.3 + amount: + 2025-10-01: 165 +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + period: year + label: Nebraska LIHEAP propane heating payment + reference: + - title: Nebraska LIHEAP Guidance Document effective October 1, 2025, Heating Payment Computation + href: https://dhhs.ne.gov/Documents/Low%20Income%20Home%20Energy%20Assistance%20Program%20%28LIHEAP%29%20Guidance%20Document%202026.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/ne/dhhs/liheap/payment/utility.yaml b/policyengine_us/parameters/gov/states/ne/dhhs/liheap/payment/utility.yaml new file mode 100644 index 00000000000..d96598d1d9e --- /dev/null +++ b/policyengine_us/parameters/gov/states/ne/dhhs/liheap/payment/utility.yaml @@ -0,0 +1,27 @@ +description: Nebraska provides these regular single-family heating payments for natural gas, electricity, coal, and corn by countable income as a share of the federal poverty guideline under the Low Income Home Energy Assistance Program. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 700 + - threshold: + 2025-10-01: 0.7 + amount: + 2025-10-01: 550 + - threshold: + 2025-10-01: 1 + amount: + 2025-10-01: 400 + - threshold: + 2025-10-01: 1.3 + amount: + 2025-10-01: 280 +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + period: year + label: Nebraska LIHEAP natural gas, electricity, coal, and corn heating payment + reference: + - title: Nebraska LIHEAP Guidance Document effective October 1, 2025, Heating Payment Computation + href: https://dhhs.ne.gov/Documents/Low%20Income%20Home%20Energy%20Assistance%20Program%20%28LIHEAP%29%20Guidance%20Document%202026.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/ne/dhhs/liheap/payment/wood.yaml b/policyengine_us/parameters/gov/states/ne/dhhs/liheap/payment/wood.yaml new file mode 100644 index 00000000000..6641910bbc2 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ne/dhhs/liheap/payment/wood.yaml @@ -0,0 +1,27 @@ +description: Nebraska provides these regular single-family heating payments for wood by countable income as a share of the federal poverty guideline under the Low Income Home Energy Assistance Program. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 800 + - threshold: + 2025-10-01: 0.7 + amount: + 2025-10-01: 600 + - threshold: + 2025-10-01: 1 + amount: + 2025-10-01: 350 + - threshold: + 2025-10-01: 1.3 + amount: + 2025-10-01: 175 +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + period: year + label: Nebraska LIHEAP wood heating payment + reference: + - title: Nebraska LIHEAP Guidance Document effective October 1, 2025, Heating Payment Computation + href: https://dhhs.ne.gov/Documents/Low%20Income%20Home%20Energy%20Assistance%20Program%20%28LIHEAP%29%20Guidance%20Document%202026.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/ne/dhhs/liheap/payment_size_limit.yaml b/policyengine_us/parameters/gov/states/ne/dhhs/liheap/payment_size_limit.yaml new file mode 100644 index 00000000000..c4fea5d14ee --- /dev/null +++ b/policyengine_us/parameters/gov/states/ne/dhhs/liheap/payment_size_limit.yaml @@ -0,0 +1,10 @@ +description: Nebraska limits household size to this number when determining regular heating payment income bands under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 6 +metadata: + unit: person + period: year + label: Nebraska LIHEAP payment band household size limit + reference: + - title: Nebraska LIHEAP Guidance Document effective October 1, 2025 + href: https://dhhs.ne.gov/Documents/Low%20Income%20Home%20Energy%20Assistance%20Program%20%28LIHEAP%29%20Guidance%20Document%202026.pdf#page=2 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index f1829ab2688..d1e5f8d3f60 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -802,7 +802,7 @@ programs: category: Benefits agency: HHS status: partial - coverage: OR, DC, Riverside County, MA, IL, KS, TX + coverage: OR, DC, Riverside County, MA, IL, KS, NE, TX state_implementations: - state: OR status: in_progress @@ -831,6 +831,14 @@ programs: parameter_prefix: gov.states.ks.dcf.liheap verified_years: "2025-2026" notes: FY2025-FY2026 regular heating only. The FY2026 $130 minimum comes from the plan's estimated benefit levels; crisis, cooling and weatherization assistance are out of scope. + - state: NE + status: partial + name: Nebraska LIHEAP + full_name: Nebraska Low Income Home Energy Assistance Program + variable: ne_liheap + parameter_prefix: gov.states.ne.dhhs.liheap + verified_years: "2026" + notes: FY2026 regular heating only, with the single-family and multifamily schedules and the earned-income disregard. Crisis, cooling and weatherization assistance are out of scope. - state: TX status: partial name: Texas CEAP diff --git a/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/integration.yaml new file mode 100644 index 00000000000..747e23eff7e --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/integration.yaml @@ -0,0 +1,362 @@ +# Source: Nebraska FY2026 LIHEAP Guidance, income guidelines and heating payment table (pages 1-2). +# https://dhhs.ne.gov/Documents/Low%20Income%20Home%20Energy%20Assistance%20Program%20%28LIHEAP%29%20Guidance%20Document%202026.pdf#page=1 + +- name: Case 1, wages receive the earned disregard only after gross eligibility. + period: 2026 + input: + people: + person1: + age: 35 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + employment_income: 18_000 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + tanf: 0 + households: + household: + members: [person1] + state_code: NE + output: + ne_liheap_household_size: 1 + ne_liheap_earned_income: 18_000 + ne_liheap_gross_income: 18_000 + ne_liheap_fpg: 15_650 + ne_liheap_income_eligible: true + ne_liheap_eligible: true + ne_liheap: 550 +- name: Case 2, unearned income does not receive the earned disregard. + period: 2026 + input: + people: + person1: + age: 35 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + social_security_retirement: 18_000 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + tanf: 0 + households: + household: + members: [person1] + state_code: NE + output: + ne_liheap_earned_income: 0 + ne_liheap_gross_income: 18_000 + ne_liheap_income_eligible: true + ne_liheap: 400 +- name: Case 3, business losses do not offset wages in the documented net-income approximation. + period: 2026 + input: + people: + person1: + age: 35 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + employment_income: 10_000 + self_employment_income: -5_000 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + tanf: 0 + households: + household: + members: [person1] + state_code: NE + output: + ne_liheap_earned_income: 10_000 + ne_liheap_gross_income: 10_000 + ne_liheap: 700 +- name: Case 4, existing net business income is counted without another business deduction. + period: 2026 + input: + people: + person1: + age: 35 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + self_employment_income: 18_000 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + tanf: 0 + households: + household: + members: [person1] + state_code: NE + output: + ne_liheap_earned_income: 18_000 + ne_liheap_gross_income: 18_000 + ne_liheap: 550 +- name: Case 5, student child earnings are excluded until age eighteen. + period: 2026 + input: + people: + person1: + age: 17 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + is_in_k12_school: true + employment_income: 30_000 + person2: + age: 18 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + is_in_k12_school: true + employment_income: 10_000 + spm_units: + spm_unit: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + tanf: 0 + households: + household: + members: [person1, person2] + state_code: NE + output: + ne_liheap_household_size: 2 + ne_liheap_earned_income: 10_000 + ne_liheap_gross_income: 10_000 + ne_liheap_fpg: 21_150 + ne_liheap: 700 +- name: Case 6, ineligible immigrant is excluded from size and their income is prorated. + period: 2026 + input: + people: + person1: + age: 35 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + employment_income: 10_000 + person2: + age: 35 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + immigration_status: UNDOCUMENTED + employment_income: 10_000 + interest_income: 1_000 + spm_units: + spm_unit: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + tanf: 0 + households: + household: + members: [person1, person2] + state_code: NE + output: + ne_liheap_household_size: 1 + ne_liheap_earned_income: 15_000 + ne_liheap_gross_income: 15_500 + ne_liheap_fpg: 15_650 + ne_liheap_income_eligible: true + ne_liheap: 550 + +- name: Case 7, multifamily heat in rent receives the full scheduled benefit with zero separate expense. + period: 2026 + input: + people: + person1: + age: 35 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + employment_income: 18_000 + spm_units: + spm_unit: + members: [person1] + ne_liheap_dwelling_type: MULTI_FAMILY + heat_expense_included_in_rent: true + heating_type: UNSPECIFIED + tanf: 0 + households: + household: + members: [person1] + state_code: NE + output: + ne_liheap_household_size: 1 + ne_liheap_earned_income: 18_000 + ne_liheap_gross_income: 18_000 + ne_liheap_fpg: 15_650 + ne_liheap_income_eligible: true + heating_expense: 0 + ne_liheap_eligible: true + # Income after the 20% disregard is $14,400: multifamily Tier 2. + ne_liheap: 300 + +- name: Case 8, specified service trade self-employment income above the limit is ineligible. + # 475 NAC 3-002.04(B)(i) (text in effect for FY2026), incorporated by + # 476 NAC 2-002.01, counts each source of self-employment. A self-employed + # bookkeeper reports net income in sstb_self_employment_income. + # https://rules.nebraska.gov/api/fileStorage/GetAsByteArray/historical-chapter-pdfs/475%20NAC%203%20(09-17-2024)-202607280000.pdf#page=44 + period: 2026 + input: + people: + person1: + age: 42 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + sstb_self_employment_income: 40_000 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + tanf: 0 + households: + household: + members: [person1] + state_code: NE + output: + ne_liheap_household_size: 1 + ne_liheap_earned_income: 40_000 + ne_liheap_gross_income: 40_000 + ne_liheap_fpg: 15_650 + # 40,000 exceeds 150% of 15,650 = 23,475. The 20% earned-income + # disregard applies to the payment tier only, not to this gross test. + ne_liheap_income_eligible: false + ne_liheap_eligible: false + ne_liheap: 0 + +- name: Case 9, housing-assisted renter with heat in rent and no heating bill is ineligible. + # FY2026 state plan section 2.3 (page 9): "For subsidized housing, the + # household must be responsible for a portion of the heating payment to be + # eligible for heating." + # https://liheapch.acf.gov/docs/2026/state-plans/NE_Plan_2026.pdf#page=9 + period: 2026 + input: + people: + person1: + age: 31 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + employment_income: 22_000 + person2: + age: 5 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + spm_units: + spm_unit: + members: [person1, person2] + receives_housing_assistance: true + ne_liheap_dwelling_type: MULTI_FAMILY + heat_expense_included_in_rent: true + heating_type: UNSPECIFIED + tanf: 0 + households: + household: + members: [person1, person2] + state_code: NE + output: + ne_liheap_household_size: 2 + ne_liheap_earned_income: 22_000 + ne_liheap_gross_income: 22_000 + # 2025 guideline for two: 15,650 + 5,500 = 21,150; limit 31,725. + ne_liheap_fpg: 21_150 + ne_liheap_income_eligible: true + heating_expense: 0 + # No housing assistance would pay the multifamily Tier 2 amount of 300: + # 22,000 - 0.2 * 22,000 = 17,600; 17,600 / 21,150 = 0.832. + ne_liheap_eligible: false + ne_liheap: 0 + +- name: Case 10, public housing tenant who pays part of the heating cost receives the multifamily payment. + period: 2026 + input: + people: + person1: + age: 71 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + social_security_retirement: 13_200 + spm_units: + spm_unit: + members: [person1] + ne_liheap_dwelling_type: MULTI_FAMILY + heat_expense_included_in_rent: true + heating_type: NATURAL_GAS + gas_expense: 420 + tanf: 0 + households: + household: + members: [person1] + state_code: NE + is_in_public_housing: true + output: + ne_liheap_household_size: 1 + ne_liheap_earned_income: 0 + # $1,100 a month of Social Security: 1,100 * 12 = 13,200. + ne_liheap_gross_income: 13_200 + ne_liheap_fpg: 15_650 + ne_liheap_income_eligible: true + # A $35 monthly gas charge on top of rent: 35 * 12 = 420. + heating_expense: 420 + ne_liheap_eligible: true + # No earned income to disregard: 13,200 / 15,650 = 0.843, multifamily Tier 2. + ne_liheap: 300 + +- name: Case 11, market-rate single-family renter with heat in rent and a zero gas bill receives the single-family payment. + # Plan section 2.3 (page 9) also says renters with utilities included in + # rent must be responsible for a portion of the heating; the model treats + # market-rate heat-in-rent renters as responsible. 476 NAC 3-002.02 lets + # the Department pay such a household directly, and plan sections 1.1 + # (page 5) and 9.1 (page 25) list them among households paid directly. + # https://liheapch.acf.gov/docs/2026/state-plans/NE_Plan_2026.pdf#page=9 + # https://rules.nebraska.gov/api/fileStorage/GetAsByteArray/chapter-pdfs/476%20NAC%203%20(12-26-2020).pdf/1748#page=1 + period: 2026 + input: + people: + person1: + age: 34 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + employment_income: 18_000 + spm_units: + spm_unit: + members: [person1] + ne_liheap_dwelling_type: SINGLE_FAMILY + heat_expense_included_in_rent: true + heating_type: NATURAL_GAS + gas_expense: 0 + tanf: 0 + households: + household: + members: [person1] + state_code: NE + output: + ne_liheap_household_size: 1 + ne_liheap_earned_income: 18_000 + ne_liheap_gross_income: 18_000 + ne_liheap_fpg: 15_650 + ne_liheap_income_eligible: true + heating_expense: 0 + ne_liheap_eligible: true + # 18,000 - 0.2 * 18,000 = 14,400; 14,400 / 15,650 = 0.920: single-family + # natural gas Tier 2. + ne_liheap: 550 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/ne_liheap.yaml b/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/ne_liheap.yaml new file mode 100644 index 00000000000..b24fc258de6 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/ne_liheap.yaml @@ -0,0 +1,406 @@ +# Source: Nebraska FY2026 LIHEAP Guidance, income guidelines and heating payment table (pages 1-2). +# https://dhhs.ne.gov/Documents/Low%20Income%20Home%20Energy%20Assistance%20Program%20%28LIHEAP%29%20Guidance%20Document%202026.pdf#page=1 + +- name: Case 1, fuel oil single-family schedule at 0 FPG. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 0 + ne_liheap_earned_income: 0 + heating_type: FUEL_OIL + output: + ne_liheap: 1_050 +- name: Case 2, fuel oil single-family schedule at 1 FPG. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 15_650 + ne_liheap_earned_income: 0 + heating_type: FUEL_OIL + output: + ne_liheap: 650 +- name: Case 3, fuel oil single-family schedule at 1.3 FPG. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 20_345 + ne_liheap_earned_income: 0 + heating_type: FUEL_OIL + output: + ne_liheap: 350 +- name: Case 4, fuel oil single-family schedule at 1.5 FPG. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 23_475 + ne_liheap_earned_income: 0 + heating_type: FUEL_OIL + output: + ne_liheap: 175 +- name: Case 5, wood single-family schedule at 0 FPG. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 0 + ne_liheap_earned_income: 0 + heating_type: WOOD + output: + ne_liheap: 800 +- name: Case 6, wood single-family schedule at 1 FPG. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 15_650 + ne_liheap_earned_income: 0 + heating_type: WOOD + output: + ne_liheap: 600 +- name: Case 7, wood single-family schedule at 1.3 FPG. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 20_345 + ne_liheap_earned_income: 0 + heating_type: WOOD + output: + ne_liheap: 350 +- name: Case 8, wood single-family schedule at 1.5 FPG. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 23_475 + ne_liheap_earned_income: 0 + heating_type: WOOD + output: + ne_liheap: 175 +- name: Case 9, propane single-family schedule at 0 FPG. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 0 + ne_liheap_earned_income: 0 + heating_type: PROPANE + output: + ne_liheap: 850 +- name: Case 10, propane single-family schedule at 1 FPG. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 15_650 + ne_liheap_earned_income: 0 + heating_type: PROPANE + output: + ne_liheap: 580 +- name: Case 11, propane single-family schedule at 1.3 FPG. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 20_345 + ne_liheap_earned_income: 0 + heating_type: PROPANE + output: + ne_liheap: 330 +- name: Case 12, propane single-family schedule at 1.5 FPG. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 23_475 + ne_liheap_earned_income: 0 + heating_type: PROPANE + output: + ne_liheap: 165 +- name: Case 13, natural gas single-family schedule at 0 FPG. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 0 + ne_liheap_earned_income: 0 + heating_type: NATURAL_GAS + output: + ne_liheap: 700 +- name: Case 14, natural gas single-family schedule at 1 FPG. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 15_650 + ne_liheap_earned_income: 0 + heating_type: NATURAL_GAS + output: + ne_liheap: 550 +- name: Case 15, natural gas single-family schedule at 1.3 FPG. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 20_345 + ne_liheap_earned_income: 0 + heating_type: NATURAL_GAS + output: + ne_liheap: 400 +- name: Case 16, natural gas single-family schedule at 1.5 FPG. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 23_475 + ne_liheap_earned_income: 0 + heating_type: NATURAL_GAS + output: + ne_liheap: 280 +- name: Case 17, countable income of 10955 respects the closed upper tier boundary. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 10_955 + ne_liheap_earned_income: 0 + heating_type: NATURAL_GAS + output: + ne_liheap: 700 +- name: Case 18, countable income of 10955.01 falls into the next tier. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 10_955.01 + ne_liheap_earned_income: 0 + heating_type: NATURAL_GAS + output: + ne_liheap: 550 +- name: Case 19, countable income of 15650.01 falls into the next tier. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 15_650.01 + ne_liheap_earned_income: 0 + heating_type: NATURAL_GAS + output: + ne_liheap: 400 +- name: Case 20, countable income of 20345.01 falls into the next tier. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 20_345.01 + ne_liheap_earned_income: 0 + heating_type: NATURAL_GAS + output: + ne_liheap: 280 +- name: Case 21, negative countable income is paid at the lowest tier. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: -100 + ne_liheap_earned_income: 0 + heating_type: NATURAL_GAS + output: + ne_liheap: 700 +- name: Case 22, kerosene fuel mapping. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 0 + ne_liheap_earned_income: 0 + heating_type: KEROSENE + output: + ne_liheap: 1_050 +- name: Case 23, electricity fuel mapping. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 0 + ne_liheap_earned_income: 0 + heating_type: ELECTRICITY + output: + ne_liheap: 700 +- name: Case 24, coal fuel mapping. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 0 + ne_liheap_earned_income: 0 + heating_type: COAL + output: + ne_liheap: 700 +- name: Case 25, other fuel mapping. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 0 + ne_liheap_earned_income: 0 + heating_type: OTHER + output: + ne_liheap: 0 +- name: Case 26, solar fuel mapping. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 0 + ne_liheap_earned_income: 0 + heating_type: SOLAR + output: + ne_liheap: 0 +- name: Case 27, unspecified fuel mapping. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 0 + ne_liheap_earned_income: 0 + heating_type: UNSPECIFIED + output: + ne_liheap: 0 +- name: Case 28, none fuel mapping. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 0 + ne_liheap_earned_income: 0 + heating_type: NONE + output: + ne_liheap: 0 +- name: Case 29, seventh person increases eligibility but not payment bands. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 7 + ne_liheap_gross_income: 31_000 + ne_liheap_earned_income: 0 + heating_type: PROPANE + output: + ne_liheap: 580 +- name: Case 30, earned disregard lowers the payment tier only. + period: 2026 + input: + state_code: NE + ne_liheap_eligible: true + ne_liheap_household_size: 1 + ne_liheap_gross_income: 17_000 + ne_liheap_earned_income: 17_000 + heating_type: NATURAL_GAS + output: + # 17,000 - 0.2 * 17,000 = 13,600; 13,600 / 15,650 = 0.869 -> Tier 2 (550). + # Without the disregard, 17,000 / 15,650 = 1.086 would be Tier 3 (400). + ne_liheap: 550 + +- name: Case 31, multifamily dwelling payments at each closed income boundary. + # FY2026 heating table, multifamily all-fuel column: $380/$300/$220/$154. + period: 2026 + input: + state_code: [NE, NE, NE, NE, NE, NE, NE, NE] + ne_liheap_eligible: [true, true, true, true, true, true, true, true] + ne_liheap_household_size: [1, 1, 1, 1, 1, 1, 1, 1] + ne_liheap_gross_income: [0, 10_955, 10_955.01, 15_650, 15_650.01, 20_345, 20_345.01, 23_475] + ne_liheap_earned_income: [0, 0, 0, 0, 0, 0, 0, 0] + ne_liheap_dwelling_type: [MULTI_FAMILY, MULTI_FAMILY, MULTI_FAMILY, MULTI_FAMILY, + MULTI_FAMILY, MULTI_FAMILY, MULTI_FAMILY, MULTI_FAMILY] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, + NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS] + output: + ne_liheap: [380, 380, 300, 300, 220, 220, 154, 154] + +- name: Case 32, dwelling type selects multifamily payments for every fuel. + # Multifamily has one all-fuel column; single-family has fuel-specific columns. + period: 2026 + input: + state_code: [NE, NE, NE, NE, NE, NE] + ne_liheap_eligible: [true, true, true, true, true, true] + ne_liheap_household_size: [1, 1, 1, 1, 1, 1] + ne_liheap_gross_income: [0, 0, 0, 0, 0, 0] + ne_liheap_earned_income: [0, 0, 0, 0, 0, 0] + ne_liheap_dwelling_type: [SINGLE_FAMILY, MULTI_FAMILY, SINGLE_FAMILY, + MULTI_FAMILY, MULTI_FAMILY, MULTI_FAMILY] + heating_type: [FUEL_OIL, FUEL_OIL, WOOD, WOOD, OTHER, SOLAR] + output: + ne_liheap: [1_050, 380, 800, 380, 380, 380] + +- name: Case 33, heat-in-rent renter with unspecified fuel and the default dwelling type is eligible but paid zero. + # Documented limitation: an unspecified single-family fuel has no payment + # column and no fallback fuel. Reporting MULTI_FAMILY selects the all-fuel + # column instead (integration Case 7). + period: 2026 + input: + state_code: NE + age: 29 + employment_income: 18_000 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + tanf: 0 + heat_expense_included_in_rent: true + heating_type: UNSPECIFIED + output: + heating_expense: 0 + ne_liheap_dwelling_type: SINGLE_FAMILY + # 18,000 is under the one-person limit of 150% * 15,650 = 23,475. + ne_liheap_income_eligible: true + ne_liheap_eligible: true + ne_liheap: 0 + +- name: Case 34, seven-person payment bands use the six-person guideline at each closed boundary. + # Guidance p. 2 footnote for household sizes of 6 or more: $30,205 or less is + # Tier 1; $30,205.01 through $43,150 Tier 2; $43,150.01 through $56,095 Tier 3; + # above that Tier 4. These are 70%, 100% and 130% of the six-person 2025 + # guideline of 43,150. A five-person cap would put 30,205 in Tier 2 + # (30,205 / 37,650 = 0.802), so this pins the cap at six. + period: 2026 + input: + state_code: [NE, NE, NE, NE, NE, NE] + ne_liheap_eligible: [true, true, true, true, true, true] + ne_liheap_household_size: [7, 7, 7, 7, 7, 7] + ne_liheap_gross_income: [30_205, 30_205.01, 43_150, 43_150.01, 56_095, 56_095.01] + ne_liheap_earned_income: [0, 0, 0, 0, 0, 0] + heating_type: [PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE] + output: + ne_liheap: [850, 580, 580, 330, 330, 165] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/ne_liheap_earned_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/ne_liheap_earned_income.yaml new file mode 100644 index 00000000000..412bb55704d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/ne_liheap_earned_income.yaml @@ -0,0 +1,48 @@ +# Source: 475 NAC 3-002.04(B)(i), incorporated by 476 NAC 2-002.01, counts +# each source of self-employment of the household. +# Text in effect 2024-09-17 to 2026-07-28; the current text renumbers it. +# https://rules.nebraska.gov/api/fileStorage/GetAsByteArray/historical-chapter-pdfs/475%20NAC%203%20(09-17-2024)-202607280000.pdf#page=44 + +- name: Case 1, specified service trade self-employment income counts as earned income. + period: 2026 + input: + state_code: NE + age: 42 + sstb_self_employment_income: 40_000 + output: + ne_liheap_earned_income: 40_000 + +- name: Case 2, a loss in one self-employment source does not offset wages or another business. + period: 2026 + input: + state_code: NE + age: 42 + employment_income: 12_000 + self_employment_income: 6_000 + sstb_self_employment_income: -4_000 + output: + # Each source is floored at zero: 12,000 + 6,000 + max(-4,000, 0) = 18,000. + ne_liheap_earned_income: 18_000 + +- name: Case 3, farm profits affect eligibility and payment while unsupported farm-loss offsets are excluded. + # 475 NAC 3-002.04(B): count farm profits with other self-employment. + # The special loss offset requires gross-receipts and tax-return evidence. + period: 2026 + input: + state_code: [NE, NE, NE] + age: [40, 40, 40] + employment_income: [0, 0, 12_000] + farm_operations_income: [18_000, 60_000, -5_000] + ssi: [0, 0, 0] + social_security: [0, 0, 0] + tanf: [0, 0, 0] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS] + gas_expense: [1_000, 1_000, 1_000] + output: + ne_liheap_earned_income: [18_000, 60_000, 12_000] + ne_liheap_gross_income: [18_000, 60_000, 12_000] + # One-person limit: 15,650 * 1.5 = 23,475. + ne_liheap_income_eligible: [true, false, true] + # After the 20% earned disregard: 14,400 and 9,600 fall in utility + # payment bands 2 and 1, respectively; 60,000 fails gross eligibility. + ne_liheap: [550, 0, 700] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/ne_liheap_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/ne_liheap_eligible.yaml new file mode 100644 index 00000000000..e7aae52ed96 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/ne_liheap_eligible.yaml @@ -0,0 +1,124 @@ +# Source: 476 NAC 1-004.09 (household, including energy paid through rent) and +# 2-002 (eligibility); FY2026 state plan section 2.3 (renters in subsidized +# housing and renters with utilities included in rent), page 9. +# https://rules.nebraska.gov/api/fileStorage/GetAsByteArray/chapter-pdfs/476%20NAC%201%20(12-26-2020).pdf/1746#page=1 +# https://rules.nebraska.gov/api/fileStorage/GetAsByteArray/chapter-pdfs/476%20NAC%202%20(06-26-2022).pdf/1747#page=1 +# https://liheapch.acf.gov/docs/2026/state-plans/NE_Plan_2026.pdf#page=9 + +- name: Case 1, direct heating bill establishes energy responsibility. + period: 2026 + input: + state_code: NE + ne_liheap_income_eligible: true + heating_type: NATURAL_GAS + gas_expense: 100 + output: + ne_liheap_eligible: true +- name: Case 2, heat in rent qualifies with zero separate heating expense under the vulnerability assumption. + period: 2026 + input: + state_code: NE + ne_liheap_income_eligible: true + heat_expense_included_in_rent: true + heating_type: UNSPECIFIED + output: + heating_expense: 0 + ne_liheap_eligible: true +- name: Case 3, heat in rent does not bypass the income test. + period: 2026 + input: + state_code: NE + ne_liheap_income_eligible: false + heat_expense_included_in_rent: true + heating_type: UNSPECIFIED + output: + heating_expense: 0 + ne_liheap_eligible: false +- name: Case 4, another state receives no Nebraska benefit. + period: 2026 + input: + state_code: KS + ne_liheap_income_eligible: true + heating_type: NATURAL_GAS + gas_expense: 100 + output: + ne_liheap_eligible: false + ne_liheap: 0 + +- name: Case 5, no reported heating responsibility remains ineligible. + period: 2026 + input: + state_code: NE + ne_liheap_income_eligible: true + heat_expense_included_in_rent: false + heating_type: UNSPECIFIED + output: + heating_expense: 0 + ne_liheap_eligible: false + ne_liheap: 0 + +# Cases 6-9: FY2026 state plan section 2.3 (page 9): "For subsidized housing, +# the household must be responsible for a portion of the heating payment to be +# eligible for heating" and "For renters with utilities included in the rent, +# the household must be responsible for a portion of the heating." Market-rate +# renters with heat included in rent are treated as responsible under the +# documented modeling assumption; 476 NAC 3-002.02 lets the Department pay a +# household directly if utilities are included in rent, and plan sections 1.1 +# (page 5) and 9.1 (page 25) list such households among those paid directly. +# https://liheapch.acf.gov/docs/2026/state-plans/NE_Plan_2026.pdf#page=9 +# https://rules.nebraska.gov/api/fileStorage/GetAsByteArray/chapter-pdfs/476%20NAC%203%20(12-26-2020).pdf/1748#page=1 +- name: Case 6, housing-assisted renter with heat in rent and no heating bill is ineligible. + period: 2026 + input: + state_code: NE + ne_liheap_income_eligible: true + receives_housing_assistance: true + heat_expense_included_in_rent: true + heating_type: NATURAL_GAS + gas_expense: 0 + output: + # The matching gas bill is zero, so no portion of the heating is paid. + heating_expense: 0 + ne_liheap_eligible: false + ne_liheap: 0 + +- name: Case 7, public housing tenant with heat in rent and no heating bill is ineligible. + period: 2026 + input: + state_code: NE + ne_liheap_income_eligible: true + is_in_public_housing: true + heat_expense_included_in_rent: true + heating_type: UNSPECIFIED + output: + # An unspecified fuel has no matching bill. + heating_expense: 0 + ne_liheap_eligible: false + ne_liheap: 0 + +- name: Case 8, housing-assisted renter who pays part of the heating cost is eligible. + period: 2026 + input: + state_code: NE + ne_liheap_income_eligible: true + receives_housing_assistance: true + heat_expense_included_in_rent: true + heating_type: NATURAL_GAS + gas_expense: 420 + output: + # A $35 monthly gas charge on top of rent: 35 * 12 = 420. + heating_expense: 420 + ne_liheap_eligible: true + +- name: Case 9, market-rate renter with heat in rent and no heating bill stays eligible. + period: 2026 + input: + state_code: NE + ne_liheap_income_eligible: true + receives_housing_assistance: false + is_in_public_housing: false + heat_expense_included_in_rent: true + heating_type: UNSPECIFIED + output: + heating_expense: 0 + ne_liheap_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/ne_liheap_fpg.yaml b/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/ne_liheap_fpg.yaml new file mode 100644 index 00000000000..bcb0e4cdb69 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/ne_liheap_fpg.yaml @@ -0,0 +1,98 @@ +# Source: Nebraska FY2026 LIHEAP Guidance, income guidelines and heating payment table (pages 1-2). +# https://dhhs.ne.gov/Documents/Low%20Income%20Home%20Energy%20Assistance%20Program%20%28LIHEAP%29%20Guidance%20Document%202026.pdf#page=1 + +- name: Case 1, FY2026 guideline for 1 member uses 2025 federal amounts. + period: 2026 + input: + state_code: NE + ne_liheap_household_size: 1 + output: + ne_liheap_fpg: 15_650 +- name: Case 2, FY2026 guideline for 2 members uses 2025 federal amounts. + period: 2026 + input: + state_code: NE + ne_liheap_household_size: 2 + output: + ne_liheap_fpg: 21_150 +- name: Case 3, FY2026 guideline for 3 members uses 2025 federal amounts. + period: 2026 + input: + state_code: NE + ne_liheap_household_size: 3 + output: + ne_liheap_fpg: 26_650 +- name: Case 4, FY2026 guideline for 4 members uses 2025 federal amounts. + period: 2026 + input: + state_code: NE + ne_liheap_household_size: 4 + output: + ne_liheap_fpg: 32_150 +- name: Case 5, FY2026 guideline for 5 members uses 2025 federal amounts. + period: 2026 + input: + state_code: NE + ne_liheap_household_size: 5 + output: + ne_liheap_fpg: 37_650 +- name: Case 6, FY2026 guideline for 6 members uses 2025 federal amounts. + period: 2026 + input: + state_code: NE + ne_liheap_household_size: 6 + output: + ne_liheap_fpg: 43_150 +- name: Case 7, FY2026 guideline for 7 members uses 2025 federal amounts. + period: 2026 + input: + state_code: NE + ne_liheap_household_size: 7 + output: + ne_liheap_fpg: 48_650 +- name: Case 8, FY2026 guideline for 8 members uses 2025 federal amounts. + period: 2026 + input: + state_code: NE + ne_liheap_household_size: 8 + output: + ne_liheap_fpg: 54_150 +- name: Case 9, FY2026 guideline for 9 members uses 2025 federal amounts. + period: 2026 + input: + state_code: NE + ne_liheap_household_size: 9 + output: + ne_liheap_fpg: 59_650 +- name: Case 10, FY2026 guideline for 10 members uses 2025 federal amounts. + period: 2026 + input: + state_code: NE + ne_liheap_household_size: 10 + output: + ne_liheap_fpg: 65_150 +- name: Case 11, no eligible members yields no guideline. + period: 2026 + input: + state_code: NE + ne_liheap_household_size: 0 + output: + ne_liheap_fpg: 0 + ne_liheap_income_eligible: false +# Backfilling checks the model convention, not verified historical Nebraska policy. +# The state schedule is backfilled, but the guideline uses the requested year - 1. +- name: Case 12, parameter backfill uses the 2021 guideline for a 2022 estimate. + period: 2022 + input: + state_code: NE + age: 40 + employment_income: 0 + ssi: 0 + social_security: 0 + heating_type: NATURAL_GAS + gas_expense: 1_000 + output: + ne_liheap: 700 + ne_liheap_household_size: 1 + ne_liheap_fpg: 12_880 + ne_liheap_income_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/ne_liheap_gross_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/ne_liheap_gross_income.yaml new file mode 100644 index 00000000000..bac8c185191 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/ne_liheap_gross_income.yaml @@ -0,0 +1,117 @@ +# Source: 475 NAC 3-002.06(A)-(B), incorporated by 476 NAC 2-002.01. An excluded +# member's countable income is divided evenly among all household members and +# the eligible members' shares are counted: eligible members / all members. +# https://rules.nebraska.gov/api/fileStorage/GetAsByteArray/historical-chapter-pdfs/475%20NAC%203%20(09-17-2024)-202607280000.pdf#page=47 + +- name: Case 1, excluded member income is prorated by eligible members over all members. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 34 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + employment_income: 14_000 + person2: + age: 36 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + immigration_status: UNDOCUMENTED + employment_income: 21_000 + interest_income: 300 + person3: + age: 6 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + spm_units: + spm_unit: + members: [person1, person2, person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + tanf: 0 + households: + household: + members: [person1, person2, person3] + state_code: NE + output: + # Two eligible members of three: the excluded member's share is 2/3, + # which differs from excluded / all = 1/3 and 1 / all = 1/3. + ne_liheap_household_size: 2 + # 14,000 + 21,000 * 2 / 3 = 28,000 (a 1/3 share would give 21,000). + ne_liheap_earned_income: 28_000 + # 28,000 + 300 * 2 / 3 = 28,200. + ne_liheap_gross_income: 28_200 + # 2025 guideline for two: 15,650 + 5,500 = 21,150; limit 31,725. + ne_liheap_fpg: 21_150 + ne_liheap_income_eligible: true + ne_liheap_eligible: true + # 28,200 - 0.2 * 28,000 = 22,600; 22,600 / 21,150 = 1.069, + # natural gas Tier 3. + ne_liheap: 400 + +- name: Case 2, unit-level TANF is counted in full alongside prorated member income. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 37 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + immigration_status: UNDOCUMENTED + employment_income: 15_000 + person2: + age: 35 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + immigration_status: UNDOCUMENTED + employment_income: 5_000 + child_support_received: 3_000 + person3: + age: 11 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + person4: + age: 8 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + person5: + age: 4 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + heating_type: PROPANE + bottled_gas_expense: 1_500 + # Child-only grant of $300 a month: 300 * 12 = 3,600. + tanf: 3_600 + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: NE + output: + # Three eligible children of five members: share 3/5, which differs + # from excluded / all = 2/5 and 1 / all = 1/5. + ne_liheap_household_size: 3 + # (15,000 + 5,000) * 3 / 5 = 12,000. + ne_liheap_earned_income: 12_000 + # 12,000 + 3,000 * 3 / 5 + 3,600 = 17,400. TANF is not prorated + # (3,600 * 3 / 5 = 2,160 would give 15,960). + ne_liheap_gross_income: 17_400 + # 2025 guideline for three: 15,650 + 2 * 5,500 = 26,650; limit 39,975. + ne_liheap_fpg: 26_650 + ne_liheap_income_eligible: true + ne_liheap_eligible: true + # 17,400 - 0.2 * 12,000 = 15,000; 15,000 / 26,650 = 0.563, + # propane Tier 1. + ne_liheap: 850 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/ne_liheap_household_size.yaml b/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/ne_liheap_household_size.yaml new file mode 100644 index 00000000000..bbbe2a5b37b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/ne_liheap_household_size.yaml @@ -0,0 +1,197 @@ +# Source: 476 NAC 2-002.02 and 2-002.03 (members excluded for citizenship, +# residency or disqualification) and 475 NAC 3-002.06 (excluded members' +# income proration), text in effect for FY2026. +# https://rules.nebraska.gov/api/fileStorage/GetAsByteArray/chapter-pdfs/476%20NAC%202%20(06-26-2022).pdf/1747#page=1 +# https://rules.nebraska.gov/api/fileStorage/GetAsByteArray/historical-chapter-pdfs/475%20NAC%203%20(09-17-2024)-202607280000.pdf#page=47 + +- name: Case 1, mixed households keep Nebraska eligibility and payments separate. + period: 2026 + input: + people: + person1: + age: 35 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + employment_income: 18_000 + person2: + age: 35 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + immigration_status: UNDOCUMENTED + person3: + age: 35 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + spm_units: + spm1: + members: + - person1 + tanf: 0 + heating_type: PROPANE + bottled_gas_expense: 1_000 + spm2: + members: + - person2 + tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 1_000 + spm3: + members: + - person3 + tanf: 0 + heating_type: WOOD + wood_expense: 1_000 + households: + household1: + members: + - person1 + state_code: NE + household2: + members: + - person2 + state_code: NE + household3: + members: + - person3 + state_code: KS + output: + ne_liheap_household_size: + - 1 + - 0 + - 0 + ne_liheap_eligible: + - true + - false + - false + ne_liheap: + - 580 + - 0 + - 0 + +- name: Case 2, refugee and asylee members are excluded in FY2026 while lawful permanent residents count. + # 476 NAC 2-002.02 and DHHS OBBBA FAQ Q12: LIHEAP follows the SNAP + # citizenship rules, which no longer cover refugee or asylee status alone. + # https://dhhs.ne.gov/Documents/OBBB-SNAP-Changes-FAQ.pdf#page=3 + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 36 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + immigration_status: REFUGEE + employment_income: 31_200 + person2: + age: 33 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + immigration_status: REFUGEE + person3: + age: 2 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + person4: + age: 29 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + immigration_status: ASYLEE + employment_income: 24_000 + person5: + age: 45 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + immigration_status: LEGAL_PERMANENT_RESIDENT + employment_income: 24_000 + person6: + age: 43 + ssi: 0 + ne_aabd: 0 + general_assistance: 0 + immigration_status: LEGAL_PERMANENT_RESIDENT + spm_units: + spm1: + members: + - person1 + - person2 + - person3 + tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 1_200 + spm2: + members: + - person4 + tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 900 + spm3: + members: + - person5 + - person6 + tanf: 0 + heating_type: PROPANE + bottled_gas_expense: 1_500 + households: + household1: + members: + - person1 + - person2 + - person3 + state_code: NE + household2: + members: + - person4 + state_code: NE + household3: + members: + - person5 + - person6 + state_code: NE + output: + # Refugee parents with a citizen child: 1. Asylee alone: 0. + # Lawful permanent resident couple: 2. + ne_liheap_household_size: + - 1 + - 0 + - 2 + # Unit 1: full-time at the $15 minimum wage, 2,080 * 15 = 31,200, prorated + # by one eligible member of three: 31,200 / 3 = 10,400. + # Unit 2: no eligible member, so the share is 0 / 1. + ne_liheap_earned_income: + - 10_400 + - 0 + - 24_000 + ne_liheap_gross_income: + - 10_400 + - 0 + - 24_000 + # 2025 guideline: 15,650 for one; none without an eligible member; + # 15,650 + 5,500 = 21,150 for two. + ne_liheap_fpg: + - 15_650 + - 0 + - 21_150 + ne_liheap_income_eligible: + - true + - false + - true + ne_liheap_eligible: + - true + - false + - true + # Unit 1: 10,400 - 0.2 * 10,400 = 8,320; 8,320 / 15,650 = 0.532, + # natural gas Tier 1. + # Unit 3: 24,000 - 0.2 * 24,000 = 19,200; 19,200 / 21,150 = 0.908, + # propane Tier 2. + ne_liheap: + - 700 + - 0 + - 580 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/ne_liheap_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/ne_liheap_income_eligible.yaml new file mode 100644 index 00000000000..71063f42881 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ne/dhhs/liheap/ne_liheap_income_eligible.yaml @@ -0,0 +1,41 @@ +# Source: Nebraska FY2026 LIHEAP Guidance, income guidelines and heating payment table (pages 1-2). +# https://dhhs.ne.gov/Documents/Low%20Income%20Home%20Energy%20Assistance%20Program%20%28LIHEAP%29%20Guidance%20Document%202026.pdf#page=1 + +- name: Case 1, gross income exactly at the FY2026 one-person limit. + period: 2026 + input: + state_code: NE + ne_liheap_household_size: 1 + ne_liheap_gross_income: 23_475 + output: + ne_liheap_fpg: 15_650 + ne_liheap_income_eligible: true + +- name: Case 2, earned-income disregard cannot establish income eligibility. + period: 2026 + input: + state_code: NE + ne_liheap_household_size: 1 + ne_liheap_gross_income: 23_476 + ne_liheap_earned_income: 23_476 + output: + ne_liheap_income_eligible: false + +- name: Case 3, ninth member increases the income limit without monthly rounding. + period: 2026 + input: + state_code: NE + ne_liheap_household_size: 9 + ne_liheap_gross_income: 89_475 + output: + ne_liheap_fpg: 59_650 + ne_liheap_income_eligible: true + +- name: Case 4, ninth member income limit is exceeded. + period: 2026 + input: + state_code: NE + ne_liheap_household_size: 9 + ne_liheap_gross_income: 89_476 + output: + ne_liheap_income_eligible: false diff --git a/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap.py b/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap.py new file mode 100644 index 00000000000..347b097900a --- /dev/null +++ b/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap.py @@ -0,0 +1,70 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.hhs.tax_unit_fpg import fpg + + +class ne_liheap(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Nebraska LIHEAP regular heating assistance" + documentation = ( + "Verified for FY2026. Earlier years use model parameter backfilling " + "and are unverified historical estimates. Later years carry the " + "FY2026 amounts forward until a new schedule is added." + ) + defined_for = "ne_liheap_eligible" + reference = "https://dhhs.ne.gov/Documents/Low%20Income%20Home%20Energy%20Assistance%20Program%20%28LIHEAP%29%20Guidance%20Document%202026.pdf#page=2" + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ne.dhhs.liheap + gross = spm_unit("ne_liheap_gross_income", period) + earned = spm_unit("ne_liheap_earned_income", period) + income = max_(gross - earned * p.earned_income_disregard, 0) + size = spm_unit("ne_liheap_household_size", period) + state_group = spm_unit.household("state_group_str", period) + # The payment bands stop growing at six people; eligibility does not. + # The Guidance footnote states the size-6+ tier cutoffs in "gross + # countable income", while the same page bases every payment on + # "income after the disregard is applied" with no size exception; the + # disregard is applied at every size here. + payment_fpg = fpg( + clip(size, 1, p.payment_size_limit), + state_group, + period, + parameters, + year_lag=p.fpg_year_lag, + ) + income_ratio = income / payment_fpg + fuel = spm_unit("heating_type", period) + types = fuel.possible_values + dwelling = spm_unit("ne_liheap_dwelling_type", period) + multifamily = dwelling == dwelling.possible_values.MULTI_FAMILY + # Corn shares the natural gas/electricity/coal payment column. No + # separate schedule is needed, but the fuel enum cannot isolate corn + # from OTHER. The multifamily column covers all fuel types. + # Limitation: an eligible single-family household whose heating_type + # is UNSPECIFIED, OTHER, SOLAR or NONE is paid $0; there is no + # fallback fuel. This includes a heat-in-rent renter who leaves + # heating_type at its UNSPECIFIED default and omits the dwelling + # type, which defaults to single-family. + # No FY2026 supplemental heating amount has been verified. + return select( + [ + multifamily, + (fuel == types.FUEL_OIL) | (fuel == types.KEROSENE), + fuel == types.WOOD, + fuel == types.PROPANE, + (fuel == types.NATURAL_GAS) + | (fuel == types.ELECTRICITY) + | (fuel == types.COAL), + ], + [ + p.payment.multifamily.calc(income_ratio, right=True), + p.payment.oil.calc(income_ratio, right=True), + p.payment.wood.calc(income_ratio, right=True), + p.payment.propane.calc(income_ratio, right=True), + p.payment.utility.calc(income_ratio, right=True), + ], + default=0, + ) diff --git a/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap_dwelling_type.py b/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap_dwelling_type.py new file mode 100644 index 00000000000..364f4c5c012 --- /dev/null +++ b/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap_dwelling_type.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class NELIHEAPDwellingType(Enum): + MULTI_FAMILY = "Multi-family arrangement" + SINGLE_FAMILY = "Single-family arrangement" + + +class ne_liheap_dwelling_type(Variable): + value_type = Enum + entity = SPMUnit + possible_values = NELIHEAPDwellingType + default_value = NELIHEAPDwellingType.SINGLE_FAMILY + definition_period = YEAR + label = "Dwelling type for Nebraska LIHEAP" + documentation = ( + "Under 476 NAC 1-004.11 and 1-004.16, multi-family means more than one " + "household occupies a structure, including apartments with separate " + "energy bills and communal arrangements with shared bills. Single-family " + "means one household occupies the structure. If omitted, the model " + "assumes single-family; report the type to apply the correct schedule." + ) + reference = "https://rules.nebraska.gov/api/fileStorage/GetAsByteArray/chapter-pdfs/476%20NAC%201%20(12-26-2020).pdf/1746#page=2" diff --git a/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap_earned_income.py b/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap_earned_income.py new file mode 100644 index 00000000000..8cdf5cf319b --- /dev/null +++ b/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap_earned_income.py @@ -0,0 +1,39 @@ +from policyengine_us.model_api import * + + +class ne_liheap_earned_income(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Nebraska LIHEAP gross countable earned income" + defined_for = StateCode.NE + reference = ( + "https://liheapch.acf.gov/docs/2026/state-plans/NE_Plan_2026.pdf#page=7", + # 475 NAC 3-002.04(B)(i) (page 44) and 3-002.06 (pages 47-48). + "https://rules.nebraska.gov/api/fileStorage/GetAsByteArray/historical-chapter-pdfs/475%20NAC%203%20(09-17-2024)-202607280000.pdf#page=44", + ) + + def formula(spm_unit, period, parameters): + person = spm_unit.members + countable = person("snap_countable_earner", period.first_month) + included = person("is_snap_immigration_status_eligible", period.first_month) + size = spm_unit("ne_liheap_household_size", period) + # 475 NAC 3-002.06(A)-(B), incorporated by 476 NAC 2-002.01: + # prorate excluded members' countable income across all members and + # retain the eligible members' shares. Eligible members count in full. + fraction = size / max_(spm_unit("spm_unit_size", period), 1) + share = where(included, 1, spm_unit.project(fraction)) + # 475 NAC 3-002.04(B)(i), in the text in effect for FY2026 (the current + # text renumbers it), counts each source of self-employment, so + # existing net business and farm inputs are read, each floored at zero, + # without another business expense deduction. The special farm-loss + # offset requires tax-return evidence and at least $1,000 of gross farm + # income, which existing inputs cannot establish. That offset, Nebraska's + # tax-return/49%-ledger distinction, and capital gains from business + # assets are not modeled here. + p = parameters(period).gov.states.ne.dhhs.liheap + earned = 0 + for source in p.earned_income_sources: + earned = earned + max_(person(source, period), 0) + return spm_unit.sum(earned * countable * share) diff --git a/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap_eligible.py b/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap_eligible.py new file mode 100644 index 00000000000..47c4f2d8336 --- /dev/null +++ b/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap_eligible.py @@ -0,0 +1,44 @@ +from policyengine_us.model_api import * + + +class ne_liheap_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = YEAR + label = "Nebraska LIHEAP regular heating assistance eligibility" + defined_for = StateCode.NE + reference = ( + "https://rules.nebraska.gov/api/fileStorage/GetAsByteArray/chapter-pdfs/476%20NAC%201%20(12-26-2020).pdf/1746#page=1", + "https://rules.nebraska.gov/api/fileStorage/GetAsByteArray/chapter-pdfs/476%20NAC%202%20(06-26-2022).pdf/1747#page=1", + # 476 NAC 3-002.02. + "https://rules.nebraska.gov/api/fileStorage/GetAsByteArray/chapter-pdfs/476%20NAC%203%20(12-26-2020).pdf/1748#page=1", + # Sections 1.1 (page 5), 2.3 (page 9) and 9.1 (page 25). + "https://liheapch.acf.gov/docs/2026/state-plans/NE_Plan_2026.pdf#page=9", + ) + + def formula(spm_unit, period, parameters): + income_eligible = spm_unit("ne_liheap_income_eligible", period) + # 476 NAC 1-004.09 includes energy paid through rent. FY2026 plan + # section 2.3 (page 9) says "For subsidized housing, the household must + # be responsible for a portion of the heating payment to be eligible + # for heating" and "For renters with utilities included in the rent, + # the household must be responsible for a portion of the heating." + # Modeling assumption: economic vulnerability under 1-004.06 and + # 2-002(A) is assumed, rather than separately verified. Market-rate + # renters with heating paid through rent are treated as responsible + # even when the separately reported expense is zero: 476 NAC 3-002.02 + # lets the Department pay a household directly "if utilities are + # included in rent", and plan sections 1.1 (page 5) and 9.1 (page 25) + # list households whose utilities are included in rent among those + # paid directly. Households receiving housing assistance or living in + # public housing need a positive heating expense. + # Administrative disqualifications remain unmodeled. + # Not the repo variable has_heating_expense, which is false whenever + # heat is included in rent. + pays_heating_bill = spm_unit("heating_expense", period) > 0 + heat_in_rent = spm_unit("heat_expense_included_in_rent", period) + housing_assisted = spm_unit("receives_housing_assistance", period) + public_housing = spm_unit.household("is_in_public_housing", period) + subsidized = housing_assisted | public_housing + responsible = pays_heating_bill | (heat_in_rent & ~subsidized) + return income_eligible & responsible diff --git a/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap_fpg.py b/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap_fpg.py new file mode 100644 index 00000000000..f9a45ebecdb --- /dev/null +++ b/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap_fpg.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.hhs.tax_unit_fpg import fpg + + +class ne_liheap_fpg(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Nebraska LIHEAP annual federal poverty guideline" + defined_for = StateCode.NE + reference = "https://dhhs.ne.gov/Documents/Low%20Income%20Home%20Energy%20Assistance%20Program%20%28LIHEAP%29%20Guidance%20Document%202026.pdf#page=1" + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ne.dhhs.liheap + size = spm_unit("ne_liheap_household_size", period) + state_group = spm_unit.household("state_group_str", period) + # The annual period represents the heating season ending in that year. + # Household composition is current; only the federal guideline is lagged. + amount = fpg( + max_(size, 1), state_group, period, parameters, year_lag=p.fpg_year_lag + ) + return where(size > 0, amount, 0) diff --git a/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap_gross_income.py b/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap_gross_income.py new file mode 100644 index 00000000000..0bdfb007f69 --- /dev/null +++ b/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap_gross_income.py @@ -0,0 +1,32 @@ +from policyengine_us.model_api import * + + +class ne_liheap_gross_income(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Nebraska LIHEAP gross countable household income" + defined_for = StateCode.NE + reference = ( + "https://liheapch.acf.gov/docs/2026/state-plans/NE_Plan_2026.pdf#page=7", + # 475 NAC 3-002.06 (pages 47-48). + "https://rules.nebraska.gov/api/fileStorage/GetAsByteArray/historical-chapter-pdfs/475%20NAC%203%20(09-17-2024)-202607280000.pdf#page=47", + ) + + def formula(spm_unit, period, parameters): + # 476 NAC 2-002.01 incorporates SNAP's income treatment, but not + # SNAP's net-income deductions or student/work eligibility tests. + p = parameters(period).gov.usda.snap.income.sources + person = spm_unit.members + included = person("is_snap_immigration_status_eligible", period.first_month) + size = spm_unit("ne_liheap_household_size", period) + # The same 475 NAC 3-002.06(A)-(B) proration applies to unearned income. + fraction = size / max_(spm_unit("spm_unit_size", period), 1) + share = where(included, 1, spm_unit.project(fraction)) + unearned = max_(add(person, period, p.unearned), 0) + unit_unearned = add(spm_unit, period, p.unearned_spm_unit) + earned = spm_unit("ne_liheap_earned_income", period) + # Annual inputs approximate the agency's anticipated income at the + # application date. Existing SNAP source omissions also apply here. + return earned + spm_unit.sum(unearned * share) + max_(unit_unearned, 0) diff --git a/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap_household_size.py b/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap_household_size.py new file mode 100644 index 00000000000..6e50e7deac8 --- /dev/null +++ b/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap_household_size.py @@ -0,0 +1,26 @@ +from policyengine_us.model_api import * + + +class ne_liheap_household_size(Variable): + value_type = int + entity = SPMUnit + definition_period = YEAR + label = "Nebraska LIHEAP eligible household size" + defined_for = StateCode.NE + reference = ( + "https://rules.nebraska.gov/api/fileStorage/GetAsByteArray/chapter-pdfs/476%20NAC%202%20(06-26-2022).pdf/1747#page=1", + "https://dhhs.ne.gov/Documents/OBBB-SNAP-Changes-FAQ.pdf#page=3", + ) + + def formula(spm_unit, period, parameters): + # 476 NAC 2-002.02 incorporates SNAP citizenship/alien-status rules; + # DHHS's OBBBA FAQ, Q12, expressly applies those changes to LIHEAP. + # This is the immigration-status test, not SNAP work/student eligibility. + # The shared variable applies the SNAP qualified-alien waiting period + # and its exceptions; COFA status and case-specific recertification + # timing remain gaps. + # SPM units approximate energy-purchasing units (476 NAC 1-004.09). + # LIHEAP-specific program violations and residency fraud are unmodeled. + return add( + spm_unit, period.first_month, ["is_snap_immigration_status_eligible"] + ) diff --git a/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap_income_eligible.py b/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap_income_eligible.py new file mode 100644 index 00000000000..cccfba53120 --- /dev/null +++ b/policyengine_us/variables/gov/states/ne/dhhs/liheap/ne_liheap_income_eligible.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class ne_liheap_income_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = YEAR + label = "Nebraska LIHEAP income eligibility" + defined_for = StateCode.NE + reference = ( + # Pages 1-2: income limits and the heating payment table. + "https://dhhs.ne.gov/Documents/Low%20Income%20Home%20Energy%20Assistance%20Program%20%28LIHEAP%29%20Guidance%20Document%202026.pdf#page=1", + "https://rules.nebraska.gov/api/fileStorage/GetAsByteArray/chapter-pdfs/476%20NAC%202%20(06-26-2022).pdf/1747#page=1", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ne.dhhs.liheap + income = spm_unit("ne_liheap_gross_income", period) + fpg = spm_unit("ne_liheap_fpg", period) + return (fpg > 0) & (income <= fpg * p.income_limit)