diff --git a/changelog.d/nv-liheap-wave1d.added.md b/changelog.d/nv-liheap-wave1d.added.md new file mode 100644 index 00000000000..4458348972d --- /dev/null +++ b/changelog.d/nv-liheap-wave1d.added.md @@ -0,0 +1 @@ +Add Nevada LIHEAP Energy Assistance Program Fixed Annual Credit. diff --git a/policyengine_us/parameters/gov/states/nv/dwss/liheap/eligibility/five_year_bar/child_age_limit.yaml b/policyengine_us/parameters/gov/states/nv/dwss/liheap/eligibility/five_year_bar/child_age_limit.yaml new file mode 100644 index 00000000000..9d6ac073915 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nv/dwss/liheap/eligibility/five_year_bar/child_age_limit.yaml @@ -0,0 +1,13 @@ +description: Nevada excludes qualified non-citizens below this age threshold from the five-year bar under the Low Income Home Energy Assistance Program. +values: + 2025-07-01: 18 + +metadata: + unit: year + period: year + label: Nevada LIHEAP five-year bar child age limit + reference: + - title: Nevada SFY2026 Energy Assistance Program Manual, Section 302 C I + href: https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=22 + - title: Nevada SFY2027 Energy Assistance Program Manual, Section 302 C I + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=23 diff --git a/policyengine_us/parameters/gov/states/nv/dwss/liheap/eligibility/five_year_bar/exempt_statuses.yaml b/policyengine_us/parameters/gov/states/nv/dwss/liheap/eligibility/five_year_bar/exempt_statuses.yaml new file mode 100644 index 00000000000..d7b30733b7c --- /dev/null +++ b/policyengine_us/parameters/gov/states/nv/dwss/liheap/eligibility/five_year_bar/exempt_statuses.yaml @@ -0,0 +1,22 @@ +description: Nevada excludes these immigration statuses from the five-year bar on qualified non-citizens under the Low Income Home Energy Assistance Program. +# Section 302 C VI exempts refugees, asylees, non-citizens whose deportation is +# being withheld, Amerasians, Cuban and Haitian entrants and victims of a +# severe form of trafficking. Amerasians and trafficking victims have no +# immigration_status value. The federal Medicaid list holds the same four +# statuses, but this list is sourced to the Nevada manual and kept separate. +values: + 2025-07-01: + - REFUGEE + - ASYLEE + - DEPORTATION_WITHHELD + - CUBAN_HAITIAN_ENTRANT + +metadata: + unit: list + period: year + label: Nevada LIHEAP five-year bar exempt immigration statuses + reference: + - title: Nevada SFY2026 Energy Assistance Program Manual, Section 302 C VI + href: https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=23 + - title: Nevada SFY2027 Energy Assistance Program Manual, Section 302 C VI + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=23 diff --git a/policyengine_us/parameters/gov/states/nv/dwss/liheap/eligibility/five_year_bar/qualifying_quarters.yaml b/policyengine_us/parameters/gov/states/nv/dwss/liheap/eligibility/five_year_bar/qualifying_quarters.yaml new file mode 100644 index 00000000000..cf65559bbfa --- /dev/null +++ b/policyengine_us/parameters/gov/states/nv/dwss/liheap/eligibility/five_year_bar/qualifying_quarters.yaml @@ -0,0 +1,17 @@ +description: Nevada excludes lawful permanent residents with this threshold of qualifying quarters from the five-year bar under the Low Income Home Energy Assistance Program. +# Section 302 C VIII counts quarters worked by a parent while the person was a +# child and by a spouse during the marriage, and no quarter after December 31, +# 1996 in which the person received a federal means-tested public benefit. The +# snap_alien_qualifying_quarters input holds that 8 U.S.C. 1645 count. +values: + 2025-07-01: 40 + +metadata: + unit: quarters + period: year + label: Nevada LIHEAP five-year bar qualifying quarters threshold + reference: + - title: Nevada SFY2026 Energy Assistance Program Manual, Section 302 C VIII + href: https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=23 + - title: Nevada SFY2027 Energy Assistance Program Manual, Section 302 C VIII + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=23 diff --git a/policyengine_us/parameters/gov/states/nv/dwss/liheap/eligibility/five_year_bar/years.yaml b/policyengine_us/parameters/gov/states/nv/dwss/liheap/eligibility/five_year_bar/years.yaml new file mode 100644 index 00000000000..50e089232ca --- /dev/null +++ b/policyengine_us/parameters/gov/states/nv/dwss/liheap/eligibility/five_year_bar/years.yaml @@ -0,0 +1,17 @@ +description: Nevada sets the bar on qualified non-citizens to this threshold of years after entry under the Low Income Home Energy Assistance Program. +# Section 302 C makes qualified non-citizens who entered the United States after +# August 22, 1996 ineligible for the years beginning on the date of entry, +# unless an exemption applies. Section 302 A I applies the bar to lawful +# permanent residents. +values: + 2025-07-01: 5 + +metadata: + unit: year + period: year + label: Nevada LIHEAP five-year bar duration + reference: + - title: "Nevada SFY2026 Energy Assistance Program Manual, Sections 302 A I and 302 C #page 21-22" + href: https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=21 + - title: "Nevada SFY2027 Energy Assistance Program Manual, Sections 302 A I and 302 C #page 21,23" + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=21 diff --git a/policyengine_us/parameters/gov/states/nv/dwss/liheap/eligibility/fpg_rate.yaml b/policyengine_us/parameters/gov/states/nv/dwss/liheap/eligibility/fpg_rate.yaml new file mode 100644 index 00000000000..b86d68d4a5c --- /dev/null +++ b/policyengine_us/parameters/gov/states/nv/dwss/liheap/eligibility/fpg_rate.yaml @@ -0,0 +1,23 @@ +description: Nevada limits household income to this multiple of the federal poverty guideline under the Low Income Home Energy Assistance Program. +# Appendix A prints annual limits of $23,475 to $81,225 for household sizes +# 1-8 in SFY2026 (150% of the 2025 guideline) and $23,940 to $83,580 in +# SFY2027 (2026 guideline). The 110% floor of 42 U.S.C. 8624(b)(2)(B) lies +# below this limit for every size. +values: + 2025-07-01: 1.5 + +metadata: + unit: /1 + period: year + label: Nevada LIHEAP poverty guideline income limit rate + reference: + - title: NRS 702.260(3) + href: https://www.leg.state.nv.us/nrs/nrs-702.html#NRS702Sec260 + - title: "Nevada SFY2026 Energy Assistance Program Manual, Sections 701 and 802 and Appendix A #page 43,60,110" + href: https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=43 + - title: "Nevada SFY2027 Energy Assistance Program Manual, Sections 701 and 802 and Appendix A #page 43,60,110" + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=43 + - title: Nevada FY2026 LIHEAP State Plan, Section 2.1 + href: https://liheapch.acf.gov/docs/2026/state-plans/NV_Plan_2026.pdf#page=8 + - title: Nevada FY2027 LIHEAP State Plan, Section 2.1 + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/fy-2027-low-income-home-energy-assistance-program-liheap-state-plan.pdf#page=8 diff --git a/policyengine_us/parameters/gov/states/nv/dwss/liheap/eligibility/fpg_year_lag.yaml b/policyengine_us/parameters/gov/states/nv/dwss/liheap/eligibility/fpg_year_lag.yaml new file mode 100644 index 00000000000..5bb329dee45 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nv/dwss/liheap/eligibility/fpg_year_lag.yaml @@ -0,0 +1,20 @@ +description: Nevada uses the federal poverty guidelines from this many years before the model year for the income limit and the benefit cap income bands under the Low Income Home Energy Assistance Program. +# The program year is the state fiscal year (July-June). Model period 2026 +# (SFY2026) uses the 2025 guidelines ($15,650 plus $5,500 per added person) +# and 2027 (SFY2027) the 2026 guidelines ($15,960 plus $5,680), which +# reproduces both Appendix A income tables. HHS made the 2025 guidelines +# mandatory for LIHEAP from October 1, 2025. +values: + 2025-07-01: 1 + +metadata: + unit: year + period: year + label: Nevada LIHEAP poverty guideline year lag + reference: + - title: LIHEAP IM 2025-02, Attachment 2, poverty guidelines for mandatory use in FY26 + href: https://acf.gov/sites/default/files/documents/ocs/COMM_LIHEAP_IM2025-02_FPGSte-Table_Att2.pdf#page=1 + - title: Nevada SFY2026 Energy Assistance Program Manual, Appendix A + href: https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=110 + - title: Nevada SFY2027 Energy Assistance Program Manual, Appendix A + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=110 diff --git a/policyengine_us/parameters/gov/states/nv/dwss/liheap/income/child_age_limit.yaml b/policyengine_us/parameters/gov/states/nv/dwss/liheap/income/child_age_limit.yaml new file mode 100644 index 00000000000..162227c35d4 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nv/dwss/liheap/income/child_age_limit.yaml @@ -0,0 +1,18 @@ +description: Nevada excludes from eligibility income, but counts toward the Fixed Annual Credit, the earned income of school-attending household members younger than this age under the Low Income Home Energy Assistance Program. +# Section 707 N covers children under 18 who attend elementary or high school +# or GED classes at least half time, or are too young to attend school, and +# live with the applicant parent or legal guardian. is_in_k12_school stands +# in for school attendance, SPM membership for living with the parent, and +# children too young for school are assumed to have no earnings. +values: + 2025-07-01: 18 + +metadata: + unit: year + period: year + label: Nevada LIHEAP children's earned income age limit + reference: + - title: "Nevada SFY2026 Energy Assistance Program Manual, Sections 705 and 707 N #page 46,57" + href: https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=46 + - title: "Nevada SFY2027 Energy Assistance Program Manual, Sections 705 and 707 N #page 46,57" + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=46 diff --git a/policyengine_us/parameters/gov/states/nv/dwss/liheap/income/sources/earned.yaml b/policyengine_us/parameters/gov/states/nv/dwss/liheap/income/sources/earned.yaml new file mode 100644 index 00000000000..560036492f2 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nv/dwss/liheap/income/sources/earned.yaml @@ -0,0 +1,33 @@ +description: Nevada counts these sources as earned income of household members under the Low Income Home Energy Assistance Program. +# Gross wages, salaries, commissions, tips and military pay, and income from +# self-employment, a farm or a partnership. Section 707 K budgets +# self-employment on gross income; the model's net business inputs stand in, +# each floored at zero, so a loss in one source cannot offset another. The +# earnings of a school-attending member under the children's earned income +# age limit count toward the Fixed Annual Credit only. Travel and uniform +# reimbursements and an earned income tax credit paid with wages, deducted +# from gross earnings by Section 703 A, have no separate inputs. +values: + 2025-07-01: + - employment_income + # Military pay (Sections 703 A and 705), entered apart from + # employment_income; enter it in one of the two. + - military_basic_pay + - self_employment_income + - sstb_self_employment_income + - farm_operations_income + - partnership_s_corp_income + +metadata: + unit: list + period: year + label: Nevada LIHEAP earned income sources + reference: + - title: "Nevada SFY2026 Energy Assistance Program Manual, Sections 703 A, 705 and 707 K #page 43-44,46-48,55" + href: https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=43 + - title: "Nevada SFY2027 Energy Assistance Program Manual, Sections 703 A, 705 and 707 K #page 43-44,46-48,55" + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=43 + - title: "Nevada FY2026 LIHEAP State Plan, Section 1.9 #page 5-6" + href: https://liheapch.acf.gov/docs/2026/state-plans/NV_Plan_2026.pdf#page=5 + - title: "Nevada FY2027 LIHEAP State Plan, Section 1.9 #page 5-6" + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/fy-2027-low-income-home-energy-assistance-program-liheap-state-plan.pdf#page=5 diff --git a/policyengine_us/parameters/gov/states/nv/dwss/liheap/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/nv/dwss/liheap/income/sources/unearned.yaml new file mode 100644 index 00000000000..d6838f0c00f --- /dev/null +++ b/policyengine_us/parameters/gov/states/nv/dwss/liheap/income/sources/unearned.yaml @@ -0,0 +1,62 @@ +description: Nevada counts these sources as unearned income of all household members under the Low Income Home Energy Assistance Program. +values: + 2025-07-01: + - ssi + # Nevada's Optional State Supplementation, paid by SSA with SSI. + - nv_oss + # Pensions, annuities and retirement fund withdrawals. + - pension_income + - military_retirement_income + - retirement_distributions + - railroad_benefits + - survivor_benefits + - disability_benefits + - total_unemployment_compensation + - workers_compensation + - veterans_benefits + # Child support and alimony paid to a household member. + - child_support_received + - alimony_income + - interest_income + - ordinary_dividend_income + # Rental income, including money received from a roomer or boarder. + - rental_income + - farm_rent_income + # Cash contributions and recurring gifts. + - financial_assistance + # State, county, city or Native American public assistance. + - general_assistance + - strike_benefits + # Trust fund income. + - estate_income + # Gaming and lottery winnings. + - gambling_winnings + # Capital gains from the sale of property other than the primary home. + - capital_gains +# Each source is floored at zero. Social Security net of the Medicare Part B +# premium is counted in nv_liheap_countable_income; Section 703 B.I also +# deducts the Part D premium, which has no input. Social Security and +# veterans cost-of-living increases during the program year are not +# excluded. TANF counts toward the Fixed Annual Credit only +# (nv_liheap_fac_income). The earned income tax credit, SNAP, tax refunds, +# public housing assistance and the other Section 706 exempt income are +# excluded. educational_assistance is not counted: it cannot separate the +# Title IV aid that Section 707 F exempts or net the qualifying expenses that +# Section 705 deducts. Lump sums, inheritance, insurance payments, FEMA +# Disaster Unemployment Assistance and utility reimbursement payments have no +# inputs, nor do the Fixed Annual Credit-only reverse mortgage, AARP and +# Title V, Supported Living Arrangement, vendor payment and savings or credit +# draw income. +metadata: + unit: list + period: year + label: Nevada LIHEAP unearned income sources + reference: + - title: "Nevada SFY2026 Energy Assistance Program Manual, Sections 703 B, 705, 706 and 707 F #page 44,46-48,51-53" + href: https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=44 + - title: "Nevada SFY2027 Energy Assistance Program Manual, Sections 703 B, 705, 706 and 707 F #page 44,46-48,51-53" + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=44 + - title: Nevada FY2026 LIHEAP State Plan, Section 1.9 + href: https://liheapch.acf.gov/docs/2026/state-plans/NV_Plan_2026.pdf#page=6 + - title: Nevada FY2027 LIHEAP State Plan, Section 1.9 + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/fy-2027-low-income-home-energy-assistance-program-liheap-state-plan.pdf#page=6 diff --git a/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/burden_rate.yaml b/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/burden_rate.yaml new file mode 100644 index 00000000000..9ccaeae309f --- /dev/null +++ b/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/burden_rate.yaml @@ -0,0 +1,16 @@ +description: Nevada expects households to pay this share of their Fixed Annual Credit income toward primary heating and electric costs, the statewide median household energy burden, under the Low Income Home Energy Assistance Program. +values: + 2025-07-01: 0.0181 + 2026-07-01: 0.0148 + +metadata: + unit: /1 + period: year + label: Nevada LIHEAP median household energy burden rate + reference: + - title: NRS 702.260(7)(a) + href: https://www.leg.state.nv.us/nrs/nrs-702.html#NRS702Sec260 + - title: "Nevada SFY2026 Energy Assistance Program Manual, Section 803 II and V and Appendix A #page 60,110" + href: https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=60 + - title: "Nevada SFY2027 Energy Assistance Program Manual, Section 803 II and V and Appendix A #page 60,110" + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=60 diff --git a/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/cap/income_band.yaml b/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/cap/income_band.yaml new file mode 100644 index 00000000000..3f6e3ace137 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/cap/income_band.yaml @@ -0,0 +1,41 @@ +description: Nevada assigns this benefit cap income band from Fixed Annual Credit income as a share of the federal poverty guideline under the Low Income Home Energy Assistance Program. +# The cap tables print the bands as "<75%", ">75-100%", ">100-125%" and +# ">125-150%". Each band includes its top, so thresholds are keyed at the +# band tops and looked up with right=True. SFY2026 Appendix A's printed 125% +# column for sizes 4-8 does not equal 125% of the guideline (size 5: +# $53,937.50 against $47,062.50), so the bands use the rates; the SFY2027 +# column matches the rate. Fixed Annual Credit income above 150% of the +# guideline uses the last band. +brackets: + # At or below 75% of the guideline. + - threshold: + 2025-07-01: -.inf + amount: + 2025-07-01: 1 + # Above 75% through 100%. + - threshold: + 2025-07-01: 0.75 + amount: + 2025-07-01: 2 + # Above 100% through 125%. + - threshold: + 2025-07-01: 1 + amount: + 2025-07-01: 3 + # Above 125%. + - threshold: + 2025-07-01: 1.25 + amount: + 2025-07-01: 4 + +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: /1 + period: year + label: Nevada LIHEAP benefit cap income band + reference: + - title: "Nevada SFY2026 Energy Assistance Program Manual, Appendix A #page 110-111" + href: https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=110 + - title: "Nevada SFY2027 Energy Assistance Program Manual, Appendix A #page 110-111" + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=110 diff --git a/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/cap/max_household_size.yaml b/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/cap/max_household_size.yaml new file mode 100644 index 00000000000..92cc074eea9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/cap/max_household_size.yaml @@ -0,0 +1,14 @@ +description: Nevada prints benefit cap table rows through this household size, with larger households using the last row, under the Low Income Home Energy Assistance Program. +# The last row is printed as "8+". +values: + 2025-07-01: 8 + +metadata: + unit: person + period: year + label: Nevada LIHEAP benefit cap table maximum household size + reference: + - title: Nevada SFY2026 Energy Assistance Program Manual, Appendix A benefit cap tables + href: https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=111 + - title: Nevada SFY2027 Energy Assistance Program Manual, Appendix A benefit cap tables + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=111 diff --git a/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/cap/propane_and_oil.yaml b/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/cap/propane_and_oil.yaml new file mode 100644 index 00000000000..b90ee24c945 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/cap/propane_and_oil.yaml @@ -0,0 +1,98 @@ +description: Nevada caps the Fixed Annual Credit at this amount by household size and income band for households whose primary heating fuel is propane, fuel oil or kerosene under the Low Income Home Energy Assistance Program. +# "IF ENERGY SOURCE INCLUDES PROPANE AND OIL", the same in SFY2026 and +# SFY2027. Kerosene uses the oil table. Every cell is $200 above the +# standard table and is stored as published. The plans' $3,136 maximum +# benefit is the size 8+ band 1 cell plus the $100 targeted household +# supplement. +1: + 1: + 2025-07-01: 2_200 + 2: + 2025-07-01: 1_800 + 3: + 2025-07-01: 1_480 + 4: + 2025-07-01: 1_352 +2: + 1: + 2025-07-01: 2_306 + 2: + 2025-07-01: 1_884 + 3: + 2025-07-01: 1_548 + 4: + 2025-07-01: 1_413 +3: + 1: + 2025-07-01: 2_416 + 2: + 2025-07-01: 1_973 + 3: + 2025-07-01: 1_618 + 4: + 2025-07-01: 1_477 +4: + 1: + 2025-07-01: 2_533 + 2: + 2025-07-01: 2_066 + 3: + 2025-07-01: 1_693 + 4: + 2025-07-01: 1_544 +5: + 1: + 2025-07-01: 2_650 + 2: + 2025-07-01: 2_160 + 3: + 2025-07-01: 1_768 + 4: + 2025-07-01: 1_611 +6: + 1: + 2025-07-01: 2_772 + 2: + 2025-07-01: 2_258 + 3: + 2025-07-01: 1_846 + 4: + 2025-07-01: 1_682 +7: + 1: + 2025-07-01: 2_901 + 2: + 2025-07-01: 2_361 + 3: + 2025-07-01: 1_928 + 4: + 2025-07-01: 1_756 +8: + 1: + 2025-07-01: 3_036 + 2: + 2025-07-01: 2_469 + 3: + 2025-07-01: 2_015 + 4: + 2025-07-01: 1_833 + +metadata: + unit: currency-USD + period: year + label: Nevada LIHEAP propane and oil benefit cap + breakdown: + - range(1, 9) # household size + - range(1, 5) # income band + breakdown_labels: + - Household size + - Income band + reference: + - title: Nevada SFY2026 Energy Assistance Program Manual, Appendix A benefit cap tables + href: https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=111 + - title: Nevada SFY2027 Energy Assistance Program Manual, Appendix A benefit cap tables + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=111 + - title: Nevada FY2026 LIHEAP State Plan, Section 2.6 + href: https://liheapch.acf.gov/docs/2026/state-plans/NV_Plan_2026.pdf#page=9 + - title: Nevada FY2027 LIHEAP State Plan, Section 2.6 + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/fy-2027-low-income-home-energy-assistance-program-liheap-state-plan.pdf#page=9 diff --git a/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/cap/standard.yaml b/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/cap/standard.yaml new file mode 100644 index 00000000000..c0ddf353014 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/cap/standard.yaml @@ -0,0 +1,92 @@ +description: Nevada caps the Fixed Annual Credit at this amount by household size and income band for households whose primary heating fuel is not propane, fuel oil or kerosene under the Low Income Home Energy Assistance Program. +# "ALL ENERGY SOURCES (except propane and oil)", the same in SFY2026 and +# SFY2027. Income bands 1-4 are "<75%", ">75-100%", ">100-125%" and +# ">125-150%"; household size 8 covers the "8+" row. +1: + 1: + 2025-07-01: 2_000 + 2: + 2025-07-01: 1_600 + 3: + 2025-07-01: 1_280 + 4: + 2025-07-01: 1_152 +2: + 1: + 2025-07-01: 2_106 + 2: + 2025-07-01: 1_684 + 3: + 2025-07-01: 1_348 + 4: + 2025-07-01: 1_213 +3: + 1: + 2025-07-01: 2_216 + 2: + 2025-07-01: 1_773 + 3: + 2025-07-01: 1_418 + 4: + 2025-07-01: 1_277 +4: + 1: + 2025-07-01: 2_333 + 2: + 2025-07-01: 1_866 + 3: + 2025-07-01: 1_493 + 4: + 2025-07-01: 1_344 +5: + 1: + 2025-07-01: 2_450 + 2: + 2025-07-01: 1_960 + 3: + 2025-07-01: 1_568 + 4: + 2025-07-01: 1_411 +6: + 1: + 2025-07-01: 2_572 + 2: + 2025-07-01: 2_058 + 3: + 2025-07-01: 1_646 + 4: + 2025-07-01: 1_482 +7: + 1: + 2025-07-01: 2_701 + 2: + 2025-07-01: 2_161 + 3: + 2025-07-01: 1_728 + 4: + 2025-07-01: 1_556 +8: + 1: + 2025-07-01: 2_836 + 2: + 2025-07-01: 2_269 + 3: + 2025-07-01: 1_815 + 4: + 2025-07-01: 1_633 + +metadata: + unit: currency-USD + period: year + label: Nevada LIHEAP standard benefit cap + breakdown: + - range(1, 9) # household size + - range(1, 5) # income band + breakdown_labels: + - Household size + - Income band + reference: + - title: Nevada SFY2026 Energy Assistance Program Manual, Appendix A benefit cap tables + href: https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=111 + - title: Nevada SFY2027 Energy Assistance Program Manual, Appendix A benefit cap tables + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=111 diff --git a/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/cap/targeted_supplement.yaml b/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/cap/targeted_supplement.yaml new file mode 100644 index 00000000000..2499dbcbb62 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/cap/targeted_supplement.yaml @@ -0,0 +1,17 @@ +description: Nevada raises the benefit cap by this amount for targeted households with an elderly or disabled member or a child under six under the Low Income Home Energy Assistance Program. +values: + 2025-07-01: 100 + +metadata: + unit: currency-USD + period: year + label: Nevada LIHEAP targeted household benefit cap supplement + reference: + - title: "Nevada SFY2026 Energy Assistance Program Manual, Section 505 and Appendix A #page 35,111" + href: https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=35 + - title: "Nevada SFY2027 Energy Assistance Program Manual, Section 505 and Appendix A #page 35,111" + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=35 + - title: Nevada FY2026 LIHEAP State Plan, Section 2.4 + href: https://liheapch.acf.gov/docs/2026/state-plans/NV_Plan_2026.pdf#page=9 + - title: Nevada FY2027 LIHEAP State Plan, Section 2.4 + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/fy-2027-low-income-home-energy-assistance-program-liheap-state-plan.pdf#page=9 diff --git a/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/minimum.yaml b/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/minimum.yaml new file mode 100644 index 00000000000..6eb8e25fd3f --- /dev/null +++ b/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/minimum.yaml @@ -0,0 +1,20 @@ +description: Nevada pays at least this Fixed Annual Credit to eligible households, including those with a negative credit and those with all utilities included in unsubsidized rent, under the Low Income Home Energy Assistance Program. +# Section 803 V and both plans set a $360 minimum; the SFY2026 manual's +# sections 504 A, 505 D, F and G and 702 III print $240. The $360 amount is +# used, as printed throughout the SFY2027 manual. +values: + 2025-07-01: 360 + +metadata: + unit: currency-USD + period: year + label: Nevada LIHEAP minimum benefit + reference: + - title: "Nevada SFY2026 Energy Assistance Program Manual, Sections 504 A, 505 D, F and G, 702 III and 803 V #page 34,36-37,43,60-61" + href: https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=34 + - title: "Nevada SFY2027 Energy Assistance Program Manual, Sections 504 A, 702 III and 803 V #page 34,43,60-61" + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=34 + - title: Nevada FY2026 LIHEAP State Plan, Sections 2.5-2.6 + href: https://liheapch.acf.gov/docs/2026/state-plans/NV_Plan_2026.pdf#page=9 + - title: Nevada FY2027 LIHEAP State Plan, Sections 2.5-2.6 + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/fy-2027-low-income-home-energy-assistance-program-liheap-state-plan.pdf#page=9 diff --git a/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/targeted/elderly_age.yaml b/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/targeted/elderly_age.yaml new file mode 100644 index 00000000000..17d0e6aae29 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/targeted/elderly_age.yaml @@ -0,0 +1,18 @@ +description: Nevada treats household members at least this age as elderly for the targeted household benefit cap supplement under the Low Income Home Energy Assistance Program. +# "Elderly means a person age 60 or over." +values: + 2025-07-01: 60 + +metadata: + unit: year + period: year + label: Nevada LIHEAP targeted household elderly age + reference: + - title: "Nevada SFY2026 Energy Assistance Program Manual, Section 505 and Glossary #page 35,105" + href: https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=35 + - title: "Nevada SFY2027 Energy Assistance Program Manual, Section 505 and Glossary #page 35,104" + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=35 + - title: Nevada FY2026 LIHEAP State Plan, Section 2.3 + href: https://liheapch.acf.gov/docs/2026/state-plans/NV_Plan_2026.pdf#page=8 + - title: Nevada FY2027 LIHEAP State Plan, Section 2.4 + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/fy-2027-low-income-home-energy-assistance-program-liheap-state-plan.pdf#page=9 diff --git a/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/targeted/young_child_age_limit.yaml b/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/targeted/young_child_age_limit.yaml new file mode 100644 index 00000000000..3be06329b61 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nv/dwss/liheap/payment/targeted/young_child_age_limit.yaml @@ -0,0 +1,19 @@ +description: Nevada treats household members younger than this age as young children for the targeted household benefit cap supplement under the Low Income Home Energy Assistance Program. +# "Children under six (6) years of age"; the glossary defines a child as a +# household member less than six years of age. +values: + 2025-07-01: 6 + +metadata: + unit: year + period: year + label: Nevada LIHEAP targeted household young child age limit + reference: + - title: "Nevada SFY2026 Energy Assistance Program Manual, Section 505 and Glossary #page 35,104" + href: https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=35 + - title: "Nevada SFY2027 Energy Assistance Program Manual, Section 505 and Glossary #page 35,103" + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=35 + - title: Nevada FY2026 LIHEAP State Plan, Section 2.4 + href: https://liheapch.acf.gov/docs/2026/state-plans/NV_Plan_2026.pdf#page=9 + - title: Nevada FY2027 LIHEAP State Plan, Section 2.4 + href: https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/fy-2027-low-income-home-energy-assistance-program-liheap-state-plan.pdf#page=9 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 10440ecec1d..9930e6b8b2f 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -987,7 +987,7 @@ programs: category: Benefits agency: HHS status: partial - coverage: AK, AR, AL, AZ, DC, GA, Riverside County, MA, FL, IL, IA, IN, KS, KY, MD, MN, MS, NC, ND, NE, NH, NJ, NM, NY, OH, OK, OR, SD, RI, TN, TX, UT, VA, WA, WY + coverage: AK, AR, AL, AZ, DC, GA, Riverside County, MA, FL, IL, IA, IN, KS, KY, MD, MN, MS, NC, ND, NE, NH, NJ, NM, NV, NY, OH, OK, OR, SD, RI, TN, TX, UT, VA, WA, WY state_implementations: - state: AL status: partial @@ -1180,6 +1180,14 @@ programs: parameter_prefix: gov.states.nm.hca.liheap verified_years: "2026-2027" notes: FY2026-FY2027 annual benefit from the point system on the household's heating fuel or electric bill, with three income points up to 100% of the poverty guideline. Crisis assistance and weatherization are out of scope. + - state: NV + status: partial + name: Nevada LIHEAP + full_name: Nevada Energy Assistance Program + variable: nv_liheap + parameter_prefix: gov.states.nv.dwss.liheap + verified_years: "2026-2027" + notes: SFY2026-SFY2027 Fixed Annual Credit, Nevada's single regular benefit toward primary heating and electric costs, with the $360 minimum and the capped benefit tables. Crisis assistance and weatherization are out of scope. - state: NY status: partial name: New York HEAP diff --git a/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/liheap/eligibility/nv_liheap_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/liheap/eligibility/nv_liheap_eligible.yaml new file mode 100644 index 00000000000..fd6519bc7bb --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/liheap/eligibility/nv_liheap_eligible.yaml @@ -0,0 +1,284 @@ +# Countable annual gross income must not exceed 150% of the poverty guideline (NRS +# 702.260(3); EAP Manual 701, 802; SFY2026 size-one limit 23,475). The household needs a +# home heating source and responsibility for energy costs: a heating bill, or heat in the +# rent (803 V.3); households in subsidized or public housing with all utilities in the +# rent are ineligible unless they have an energy burden (501 I, 503). Household size +# counts citizens and qualified non-citizens outside the five-year bar only (302 C, +# 502 A.I). Wages of 18,720 are 30 hours a week at the Nevada minimum wage of 12.00; gas +# of 720 is 60 a month and electricity of 1,320 is 110 a month, within typical Nevada +# bills. + +- name: Case 1, income exactly at the size-one limit is eligible. + period: 2026 + input: + people: + person1: + age: 40 + # About 38 hours a week at 12.00. + employment_income: 23_475 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 720 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1] + state_code: NV + output: + # 23,475 <= 15,650 x 1.5 + nv_liheap_eligible: true + +- name: Case 2, income one dollar above the size-one limit is ineligible. + period: 2026 + input: + people: + person1: + age: 40 + employment_income: 23_476 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 720 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1] + state_code: NV + output: + nv_liheap_eligible: false + +- name: Case 3, a home with no heating is ineligible. + period: 2026 + input: + people: + person1: + age: 40 + employment_income: 18_720 + spm_units: + spm_unit: + members: [person1] + heating_type: NONE + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1] + state_code: NV + output: + nv_liheap_eligible: false + +- name: Case 4, an unspecified heating fuel without heat in rent is ineligible even with reported heating costs. + period: 2026 + input: + people: + person1: + age: 40 + employment_income: 18_720 + spm_units: + spm_unit: + members: [person1] + heating_type: UNSPECIFIED + heat_expense_included_in_rent: false + # The caller reports heating costs but not the fuel. + has_heating_expense: true + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1] + state_code: NV + output: + nv_liheap_eligible: false + +- name: Case 5, an unspecified heating fuel with heat included in unsubsidized rent is eligible. + period: 2026 + input: + people: + person1: + age: 40 + employment_income: 18_720 + spm_units: + spm_unit: + members: [person1] + heating_type: UNSPECIFIED + heat_expense_included_in_rent: true + receives_housing_assistance: false + pre_subsidy_electricity_expense: 0 + households: + household: + members: [person1] + state_code: NV + is_in_public_housing: false + output: + nv_liheap_eligible: true + +- name: Case 6, a gas-heated home with heat included in unsubsidized rent and no bills is eligible. + period: 2026 + input: + people: + person1: + age: 40 + employment_income: 18_720 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 0 + heat_expense_included_in_rent: true + receives_housing_assistance: false + pre_subsidy_electricity_expense: 0 + households: + household: + members: [person1] + state_code: NV + is_in_public_housing: false + output: + # All utilities in the landlord's name and the rent (803 V.3) + nv_liheap_eligible: true + +- name: Case 7, a household with rental assistance and all utilities in the rent is ineligible. + period: 2026 + input: + people: + person1: + age: 40 + employment_income: 18_720 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 0 + heat_expense_included_in_rent: true + receives_housing_assistance: true + pre_subsidy_electricity_expense: 0 + households: + household: + members: [person1] + state_code: NV + output: + # No energy burden (501 I) + nv_liheap_eligible: false + +- name: Case 8, a public housing household with all utilities in the rent is ineligible. + period: 2026 + input: + people: + person1: + age: 40 + employment_income: 18_720 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 0 + heat_expense_included_in_rent: true + receives_housing_assistance: false + pre_subsidy_electricity_expense: 0 + households: + household: + members: [person1] + state_code: NV + is_in_public_housing: true + output: + # No energy burden (503) + nv_liheap_eligible: false + +- name: Case 9, a household with rental assistance and heat in the rent that pays its own electricity bill is eligible. + period: 2026 + input: + people: + person1: + age: 40 + employment_income: 18_720 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 0 + heat_expense_included_in_rent: true + receives_housing_assistance: true + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1] + state_code: NV + output: + # Energy cost 0 + 1,320 > 0: an energy burden remains (501 I) + nv_liheap_eligible: true + +- name: Case 10, a gas-heated home with a zero gas bill and heat outside the rent is ineligible. + period: 2026 + input: + people: + person1: + age: 40 + employment_income: 18_720 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 0 + heat_expense_included_in_rent: false + households: + household: + members: [person1] + state_code: NV + output: + nv_liheap_eligible: false + +- name: Case 11, a household of only undocumented members with no income is ineligible. + period: 2026 + input: + people: + person1: + age: 40 + immigration_status: UNDOCUMENTED + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 720 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1] + state_code: NV + output: + # Size 0; zero income would otherwise pass the income test + nv_liheap_eligible: false + +- name: Case 12, a permanent resident parent within the five-year bar is not counted, so the size-one limit applies. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + immigration_status: LEGAL_PERMANENT_RESIDENT + years_since_us_entry: 2 + # Full time at the 12.00 Nevada minimum wage. + employment_income: 24_960 + person2: + age: 8 + spm_units: + spm_unit: + members: [person1, person2] + tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 600 + pre_subsidy_electricity_expense: 1_440 + households: + household: + members: [person1, person2] + state_code: NV + output: + # Manual 302 C: the parent entered two years ago with no exemption, so only the citizen + # child counts (502 A.I) while the parent's wages still count. + nv_liheap_household_size: 1 + # 15,650 x 1.5; the size-two limit of 31,725 would admit this household + nv_liheap_income_limit: 23_475 + nv_liheap_countable_income: 24_960 + # 24,960 > 23,475 + nv_liheap_eligible: false + nv_liheap: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/liheap/eligibility/nv_liheap_immigration_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/liheap/eligibility/nv_liheap_immigration_eligible.yaml new file mode 100644 index 00000000000..e227a47062e --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/liheap/eligibility/nv_liheap_immigration_eligible.yaml @@ -0,0 +1,45 @@ +# EAP Manual 302 A admits citizens and qualified non-citizens. 302 C bars a qualified +# non-citizen for five years after entry unless the person is under 18 (I), a refugee, +# asylee, non-citizen whose deportation is withheld or Cuban/Haitian entrant (VI), a +# veteran, active duty member or their spouse or dependent child (VII), or a permanent +# resident with 40 qualifying quarters (VIII). Each entry below is a separate one-person +# household. + +- name: Case 1, two years after entry only citizens and bar-exempt qualified statuses are eligible. + period: 2026 + input: + state_code: [NV, NV, NV, NV, NV, NV, NV, NV, NV, NV, NV] + age: [40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40] + immigration_status: [CITIZEN, LEGAL_PERMANENT_RESIDENT, REFUGEE, ASYLEE, DEPORTATION_WITHHELD, + CUBAN_HAITIAN_ENTRANT, CONDITIONAL_ENTRANT, PAROLED_ONE_YEAR, UNDOCUMENTED, DACA, TPS] + years_since_us_entry: [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] + output: + # Permanent residents, conditional entrants and parolees are barred (302 C); + # undocumented, DACA and TPS are not qualified statuses (302 A). + nv_liheap_immigration_eligible: [true, false, true, true, true, true, false, false, false, false, false] + +- name: Case 2, the bar ends five years after entry. + period: 2026 + input: + state_code: [NV, NV] + age: [40, 40] + immigration_status: [LEGAL_PERMANENT_RESIDENT, LEGAL_PERMANENT_RESIDENT] + years_since_us_entry: [4, 5] + output: + nv_liheap_immigration_eligible: [false, true] + +- name: Case 3, age, quarters and military exemptions apply within the bar. + period: 2026 + input: + state_code: [NV, NV, NV, NV, NV] + age: [17, 18, 40, 40, 40] + immigration_status: [LEGAL_PERMANENT_RESIDENT, LEGAL_PERMANENT_RESIDENT, LEGAL_PERMANENT_RESIDENT, + PAROLED_ONE_YEAR, LEGAL_PERMANENT_RESIDENT] + years_since_us_entry: [2, 2, 2, 2, 2] + snap_alien_qualifying_quarters: [0, 0, 40, 40, 0] + is_veteran: [false, false, false, false, true] + output: + # Under 18 (I) -> true; 18 -> false; permanent resident with 40 quarters (VIII) -> + # true; the quarters exemption covers permanent residents only -> false; veteran (VII) + # -> true. + nv_liheap_immigration_eligible: [true, false, true, false, true] diff --git a/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/liheap/eligibility/nv_liheap_income_limit.yaml b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/liheap/eligibility/nv_liheap_income_limit.yaml new file mode 100644 index 00000000000..3fd0f548d1d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/liheap/eligibility/nv_liheap_income_limit.yaml @@ -0,0 +1,135 @@ +# The income limit is 150% of the federal poverty guideline for the program year, +# annual and unrounded (NRS 702.260(3); EAP Manual 701 and Appendix A). SFY2026 uses +# the 2025 guidelines (15,650 + 5,500 per added person) and SFY2027 the 2026 +# guidelines (15,960 + 5,680); sizes above eight add the guideline increment. +# Household size counts citizens and qualified non-citizens outside the five-year bar +# only (Manual 302 C, 502 A.I, 802 I). +# Gas of 600 is 50 a month and electricity of 1,320 is 110 a month, within typical +# Nevada natural gas (40-90) and EIA residential electricity (100-130) monthly bills. + +- name: Case 1, an undocumented member is excluded from household size so the SFY2026 size-one limit applies. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + person2: + age: 42 + immigration_status: UNDOCUMENTED + spm_units: + spm_unit: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 600 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1, person2] + state_code: NV + output: + nv_liheap_household_size: 1 + # 15,650 x 1.5 + nv_liheap_income_limit: 23_475 + +- name: Case 2, a nine-person household adds the guideline increment for an SFY2026 limit of 89,475. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: {age: 40} + person2: {age: 38} + person3: {age: 17} + person4: {age: 16} + person5: {age: 14} + person6: {age: 12} + person7: {age: 10} + person8: {age: 8} + person9: {age: 6} + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9] + tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 600 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9] + state_code: NV + output: + nv_liheap_household_size: 9 + # (15,650 + 5,500 x 8) x 1.5 = 59,650 x 1.5; Appendix A adds 8,250 per person over eight + nv_liheap_income_limit: 89_475 + +- name: Case 3, a one-person household uses the SFY2027 limit of 23,940. + period: 2027 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 600 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1] + state_code: NV + output: + # 15,960 x 1.5 + nv_liheap_income_limit: 23_940 + +- name: Case 4, a nine-person household adds the guideline increment for an SFY2027 limit of 92,100. + period: 2027 + absolute_error_margin: 0.01 + input: + people: + person1: {age: 40} + person2: {age: 38} + person3: {age: 17} + person4: {age: 16} + person5: {age: 14} + person6: {age: 12} + person7: {age: 10} + person8: {age: 8} + person9: {age: 6} + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9] + tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 600 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9] + state_code: NV + output: + # (15,960 + 5,680 x 8) x 1.5 = 61,400 x 1.5; Appendix A adds 8,520 per person over eight + nv_liheap_income_limit: 92_100 + +- name: Case 5, a household of only undocumented members has size zero and no income limit. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + immigration_status: UNDOCUMENTED + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 600 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1] + state_code: NV + output: + nv_liheap_household_size: 0 + nv_liheap_income_limit: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/liheap/income/nv_liheap_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/liheap/income/nv_liheap_countable_income.yaml new file mode 100644 index 00000000000..52b288e2608 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/liheap/income/nv_liheap_countable_income.yaml @@ -0,0 +1,285 @@ +# Eligibility income is the household's countable annual gross income (EAP Manual 700-706, +# 802 II): gross earned income, Social Security and SSI with only the Medicare premiums +# deducted (703 B.I, 706), retirement-fund withdrawals, capital gains on property other +# than the home, gambling winnings, child support paid to a member and other unearned +# income. TANF and the earnings of children under 18 who attend school are FAC-only +# income, disregarded for eligibility (702 I note, 705, 707 N). An ineligible +# non-citizen's income counts in full (700 note, 502 A.I). Wages are at the Nevada +# minimum wage of 12.00 an hour (24,960 full time; 18,720 at 30 hours a week; 6,240 at +# 10 hours a week). Gas of 600 is 50 a month and electricity of 1,320 is 110 a month. + +- name: Case 1, a 17-year-old student's wages are excluded while an 18-year-old's wages count even in high school. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + employment_income: 24_960 + person2: + age: 17 + is_in_k12_school: true + employment_income: 6_240 + person3: + age: 18 + is_in_k12_school: true + employment_income: 6_240 + spm_units: + spm_unit: + members: [person1, person2, person3] + tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 600 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1, person2, person3] + state_code: NV + output: + # 24,960 + 6,240 (age 18 is not under 18); the 17-year-old student's 6,240 is excluded + nv_liheap_countable_income: 31_200 + +- name: Case 2, a 17-year-old who is not in school has wages counted. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 24_960 + person2: + age: 17 + is_in_k12_school: false + # 20 hours a week at 12.00. + employment_income: 12_480 + spm_units: + spm_unit: + members: [person1, person2] + tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 600 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1, person2] + state_code: NV + output: + # 24,960 + 12,480 + nv_liheap_countable_income: 37_440 + +- name: Case 3, Social Security counts net of the Medicare Part B premium and floors at zero for each person. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 67 + ssi: 0 + # Retirement benefit of 1,800 a month. + social_security: 21_600 + # 2026 standard Part B premium of 202.90 a month. + medicare_part_b_premium: 2_434.80 + person2: + age: 66 + ssi: 0 + # Small spousal benefit of 150 a month. + social_security: 1_800 + medicare_part_b_premium: 2_434.80 + spm_units: + spm_unit: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 600 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1, person2] + state_code: NV + output: + # (21,600 - 2,434.80) + max(1,800 - 2,434.80, 0) = 19,165.20 + 0 + nv_liheap_countable_income: 19_165.20 + +- name: Case 4, SSI is counted while a child-only TANF grant is excluded. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + is_disabled: true + # 2026 federal SSI benefit rate of 994 a month. + ssi: 11_928 + person2: + age: 8 + spm_units: + spm_unit: + members: [person1, person2] + # Nevada TANF one-person payment allowance of 254 a month for the child. + tanf: 3_048 + heating_type: NATURAL_GAS + gas_expense: 600 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1, person2] + state_code: NV + output: + # 994 x 12 = 11,928; TANF is FAC-only income (705) + nv_liheap_countable_income: 11_928 + +- name: Case 5, capital gains, gambling winnings, child support and retirement withdrawals are counted. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 18_720 + # Child support of 400 a month paid to the parent. + child_support_received: 4_800 + # Gain on the sale of a rental lot, not the home. + long_term_capital_gains: 2_000 + gambling_winnings: 1_200 + # Early withdrawal from an IRA. + taxable_ira_distributions: 3_000 + person2: + age: 8 + spm_units: + spm_unit: + members: [person1, person2] + tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 600 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1, person2] + state_code: NV + output: + # 18,720 + 4,800 + 2,000 + 1,200 + 3,000 + nv_liheap_countable_income: 29_720 + +- name: Case 6, a self-employment loss does not offset wages. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 18_720 + # Net loss from a side business. + self_employment_income: -3_000 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 600 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1] + state_code: NV + output: + # 18,720 + max(-3,000, 0) + nv_liheap_countable_income: 18_720 + +- name: Case 7, an undocumented member's wages count in full. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 18_720 + person2: + age: 42 + immigration_status: UNDOCUMENTED + employment_income: 24_960 + spm_units: + spm_unit: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 600 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1, person2] + state_code: NV + output: + # 18,720 + 24,960 (the member is excluded from size only) + nv_liheap_countable_income: 43_680 + +- name: Case 8, every listed earned and unearned source is counted. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + self_employment_income: 100 + sstb_self_employment_income: 200 + farm_operations_income: 300 + partnership_s_corp_income: 400 + military_basic_pay: 500 + person2: + age: 47 + pension_income: 600 + # Survivor Benefit Plan annuity, counted through military_retirement_income. + military_retirement_pay_survivors: 700 + railroad_benefits: 800 + survivor_benefits: 900 + disability_benefits: 1_000 + # Reported benefits, counted through total_unemployment_compensation. + unemployment_compensation: 1_100 + workers_compensation: 1_200 + veterans_benefits: 1_300 + general_assistance: 1_400 + strike_benefits: 1_500 + alimony_income: 1_600 + interest_income: 1_700 + ordinary_dividend_income: 1_800 + estate_income: 1_900 + financial_assistance: 2_000 + rental_income: 2_100 + farm_rent_income: 2_200 + spm_units: + spm_unit: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 600 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1, person2] + state_code: NV + output: + # Earned 100 + 200 + 300 + 400 + 500 = 1,500 + # Unearned 600 + 700 + ... + 2,200 = 17 x 1,400 = 23,800 + # Each amount is distinct, so dropping any source lowers the total. Neither member + # is aged, blind or disabled, so SSI and Nevada OSS are 0; no Social Security is entered. + # 1,500 + 23,800 + nv_liheap_countable_income: 25_300 + +- name: Case 9, a rental loss does not offset wages. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 18_720 + # Net loss of 200 a month on a rented-out unit. + rental_income: -2_400 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 600 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1] + state_code: NV + output: + # 18,720 + max(-2,400, 0); without the per-source floor, 18,720 - 2,400 = 16,320 + nv_liheap_countable_income: 18_720 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/liheap/income/nv_liheap_fac_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/liheap/income/nv_liheap_fac_income.yaml new file mode 100644 index 00000000000..7e1a4ae0d2a --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/liheap/income/nv_liheap_fac_income.yaml @@ -0,0 +1,64 @@ +# FAC income is the eligibility income plus income disregarded for eligibility but +# counted for the Fixed Annual Credit: TANF and the earned income of children under 18 +# who attend school (EAP Manual 702 II note, 705 "Eligibility No / FAC Yes", 707 N). +# Wages are at the Nevada minimum wage of 12.00 an hour (9,360 at 15 hours a week; +# 6,240 at 10 hours a week; 24,960 full time). Gas of 600 is 50 a month and +# electricity of 1,320 is 110 a month. + +- name: Case 1, a 17-year-old student's wages and TANF are added to eligibility income. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 9_360 + person2: + age: 17 + is_in_k12_school: true + employment_income: 6_240 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + # Nevada TANF three-person payment allowance of 386 a month. + tanf: 4_632 + heating_type: NATURAL_GAS + gas_expense: 600 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1, person2, person3] + state_code: NV + output: + nv_liheap_countable_income: 9_360 + # 9,360 + 6,240 + 4,632 + nv_liheap_fac_income: 20_232 + +- name: Case 2, wages of a 17-year-old who is not in school are counted once. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 24_960 + person2: + age: 17 + is_in_k12_school: false + employment_income: 12_480 + spm_units: + spm_unit: + members: [person1, person2] + tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 600 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1, person2] + state_code: NV + output: + # 24,960 + 12,480, already in eligibility income; nothing is added again + nv_liheap_fac_income: 37_440 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/liheap/nv_liheap.yaml b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/liheap/nv_liheap.yaml new file mode 100644 index 00000000000..56265312aa2 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/liheap/nv_liheap.yaml @@ -0,0 +1,719 @@ +# Fixed Annual Credit (EAP Manual 803 II-VI; NRS 702.260(7)): FAC = annual energy cost - +# median energy burden x FAC income, with burden 1.81% in SFY2026 and 1.48% in SFY2027 +# (Appendix A). A FAC below 360, including a negative FAC or heat in rent with no bill, +# pays 360 (803 V.1-3). The benefit is capped by the Appendix A table for household size +# (8+ row above eight) and FAC income as a share of the poverty guideline: up to 75%, +# up to 100%, up to 125%, and above; the propane and oil table applies to PROPANE, +# FUEL_OIL and KEROSENE heat, and targeted households add 100 (a counted member 60 or +# older, disabled, or under six; 505 and glossary). Plan range 360-3,136. SFY2026 uses +# the 2025 guideline (15,650 + 5,500 per added person), SFY2027 the 2026 guideline +# (15,960 + 5,680). Wages are at the Nevada minimum wage of 12.00 an hour (24,960 full +# time; 18,720 at 30 hours a week; 12,480 at 20; 9,360 at 15; 6,240 at 10). Gas of +# 600-1,080 is 50-90 a month, electricity of 1,200-1,560 is 100-130 a month (EIA +# Nevada average residential bill), and rural propane runs 1,500-2,500 a year. + +- name: Case 1, a gas-heated family receives a FAC between the minimum and the cap. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_960 + person2: + age: 8 + person3: + age: 10 + spm_units: + spm_unit: + members: [person1, person2, person3] + tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 600 + pre_subsidy_electricity_expense: 1_440 + households: + household: + members: [person1, person2, person3] + state_code: NV + output: + # 600 + 1,440 - 0.0181 x 24,960 = 2,040 - 451.776 = 1,588.224 + # 24,960 / 26,650 = 0.937 -> band 2; cap 1,773 + nv_liheap: 1_588.224 + +- name: Case 2, the burden applies to FAC income including TANF and a student's wages. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 9_360 + person2: + age: 17 + is_in_k12_school: true + employment_income: 6_240 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + # Nevada TANF three-person payment allowance of 386 a month. + tanf: 4_632 + heating_type: NATURAL_GAS + gas_expense: 600 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1, person2, person3] + state_code: NV + output: + # FAC income 9,360 + 6,240 + 4,632 = 20,232 + # 1,920 - 0.0181 x 20,232 = 1,920 - 366.1992 = 1,553.8008 + # 20,232 / 26,650 = 0.759 -> band 2; cap 1,773 + nv_liheap: 1_553.8008 + +- name: Case 3, a solar-heated home with a FAC below 360 receives the 360 minimum. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 18_720 + spm_units: + spm_unit: + members: [person1] + heating_type: SOLAR + # Net grid bill of 50 a month after the panels' output. + pre_subsidy_electricity_expense: 600 + households: + household: + members: [person1] + state_code: NV + output: + # 600 - 0.0181 x 18,720 = 600 - 338.832 = 261.168 < 360 + nv_liheap: 360 + +- name: Case 4, heat in unsubsidized rent with no bill gives a negative FAC and the 360 minimum. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 18_720 + spm_units: + spm_unit: + members: [person1] + heating_type: UNSPECIFIED + heat_expense_included_in_rent: true + receives_housing_assistance: false + pre_subsidy_electricity_expense: 0 + households: + household: + members: [person1] + state_code: NV + is_in_public_housing: false + output: + # 0 - 338.832 = -338.832 < 360 (803 V.2-3) + nv_liheap: 360 + +- name: Case 5, a propane-heated couple is capped by the propane and oil table. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + employment_income: 18_720 + person2: + age: 48 + spm_units: + spm_unit: + members: [person1, person2] + heating_type: PROPANE + bottled_gas_expense: 2_200 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1, person2] + state_code: NV + output: + # 2,200 + 1,320 - 338.832 = 3,181.168 + # 18,720 / 21,150 = 0.885 -> band 2; propane and oil cap 1,884 (standard 1,684) + nv_liheap: 1_884 + +- name: Case 6, a kerosene-heated home is capped by the propane and oil table. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + employment_income: 12_480 + spm_units: + spm_unit: + members: [person1] + heating_type: KEROSENE + # Kerosene is billed through the fuel oil expense. + fuel_oil_expense: 1_200 + pre_subsidy_electricity_expense: 1_200 + households: + household: + members: [person1] + state_code: NV + output: + # 1,200 + 1,200 - 0.0181 x 12,480 = 2,400 - 225.888 = 2,174.112 + # 12,480 / 15,650 = 0.797 -> band 2; propane and oil cap 1,800 (standard 1,600) + nv_liheap: 1_800 + +- name: Case 7, FAC income exactly at 75 percent of the guideline stays in band 1 and the standard cap binds. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + # 0.75 x 15,650. + employment_income: 11_737.50 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_080 + pre_subsidy_electricity_expense: 1_500 + households: + household: + members: [person1] + state_code: NV + output: + # 2,580 - 0.0181 x 11,737.50 = 2,580 - 212.44875 = 2,367.55125 + # 11,737.50 / 15,650 = 0.75 -> band 1; cap 2,000 + nv_liheap: 2_000 + +- name: Case 8, FAC income one dollar above 75 percent of the guideline moves to band 2. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 11_738.50 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_080 + pre_subsidy_electricity_expense: 1_500 + households: + household: + members: [person1] + state_code: NV + output: + # 2,580 - 212.46685 = 2,367.53315; 11,738.50 / 15,650 > 0.75 -> band 2; cap 1,600 + nv_liheap: 1_600 + +- name: Case 9, FAC income exactly at 125 percent of the guideline stays in band 3. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 24_960 + person2: + age: 38 + # Brings household wages to 1.25 x 37,650 = 47,062.50. + employment_income: 22_102.50 + person3: + age: 8 + person4: + age: 10 + person5: + age: 12 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 1_080 + pre_subsidy_electricity_expense: 1_560 + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: NV + output: + # 2,640 - 0.0181 x 47,062.50 = 2,640 - 851.83125 = 1,788.16875 + # 47,062.50 / 37,650 = 1.25 -> band 3; cap 1,568 + nv_liheap: 1_568 + +- name: Case 10, FAC income one dollar above 125 percent of the guideline moves to band 4. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 24_960 + person2: + age: 38 + employment_income: 22_103.50 + person3: + age: 8 + person4: + age: 10 + person5: + age: 12 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 1_080 + pre_subsidy_electricity_expense: 1_560 + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: NV + output: + # 2,640 - 851.84935 = 1,788.15065; 47,063.50 / 37,650 > 1.25 -> band 4; cap 1,411 + # (Appendix A's printed size-five 125% column of 53,937.50 is a misprint) + nv_liheap: 1_411 + +- name: Case 11, a household with zero income is in band 1. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 960 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1] + state_code: NV + output: + # 960 + 1,320 - 0 = 2,280; ratio 0 -> band 1; cap 2,000 + nv_liheap: 2_000 + +- name: Case 12, FAC income above 150 percent of the guideline from TANF uses the last band. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 55 + # Full time at 18.00 an hour. + employment_income: 37_440 + person2: + age: 8 + person3: + age: 10 + spm_units: + spm_unit: + members: [person1, person2, person3] + # Child-only grant for two grandchildren at the 320 two-person allowance. + tanf: 3_840 + heating_type: NATURAL_GAS + gas_expense: 900 + pre_subsidy_electricity_expense: 1_500 + households: + household: + members: [person1, person2, person3] + state_code: NV + output: + # Eligibility income 37,440 <= 39,975; FAC income 37,440 + 3,840 = 41,280 + # 2,400 - 0.0181 x 41,280 = 2,400 - 747.168 = 1,652.832 + # 41,280 / 26,650 = 1.549 -> band 4; cap 1,277 + nv_liheap: 1_277 + +- name: Case 13, a nine-person household uses its own guideline and the 8+ cap row. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 24_960 + person2: + age: 38 + employment_income: 18_720 + person3: {age: 17} + person4: {age: 15} + person5: {age: 13} + person6: {age: 11} + person7: {age: 9} + person8: {age: 7} + person9: {age: 6} + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9] + tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 1_320 + # A large household's bill of 200 a month. + pre_subsidy_electricity_expense: 2_400 + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9] + state_code: NV + output: + # 3,720 - 0.0181 x 43,680 = 3,720 - 790.608 = 2,929.392 + # 43,680 / 59,650 = 0.732 -> band 1 (the size-eight 54,150 would give band 2); 8+ cap 2,836 + nv_liheap: 2_836 + +- name: Case 14, a 60-year-old member makes the household targeted. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 60 + ssi: 0 + employment_income: 18_720 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_080 + pre_subsidy_electricity_expense: 1_500 + households: + household: + members: [person1] + state_code: NV + output: + # 2,580 - 338.832 = 2,241.168; 18,720 / 15,650 = 1.196 -> band 3; 1,280 + 100 + nv_liheap: 1_380 + +- name: Case 15, a five-year-old child makes the household targeted. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_720 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 1_080 + pre_subsidy_electricity_expense: 1_500 + households: + household: + members: [person1, person2] + state_code: NV + output: + # 2,580 - 338.832 = 2,241.168; 18,720 / 21,150 = 0.885 -> band 2; 1,684 + 100 + nv_liheap: 1_784 + +- name: Case 16, a 59-year-old and a six-year-old do not make the household targeted. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 59 + ssi: 0 + employment_income: 18_720 + person2: + age: 6 + spm_units: + spm_unit: + members: [person1, person2] + tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 1_080 + pre_subsidy_electricity_expense: 1_500 + households: + household: + members: [person1, person2] + state_code: NV + output: + # 2,241.168; band 2; cap 1,684 with no supplement + nv_liheap: 1_684 + +- name: Case 17, a disabled member makes the household targeted. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + is_disabled: true + ssi: 0 + # SSDI of 1,200 a month. + social_security: 14_400 + # 2026 standard Part B premium of 202.90 a month. + medicare_part_b_premium: 2_434.80 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_080 + pre_subsidy_electricity_expense: 1_500 + households: + household: + members: [person1] + state_code: NV + output: + # FAC income 14,400 - 2,434.80 = 11,965.20 + # 2,580 - 0.0181 x 11,965.20 = 2,580 - 216.57012 = 2,363.42988 + # 11,965.20 / 15,650 = 0.765 -> band 2; 1,600 + 100 + nv_liheap: 1_700 + +- name: Case 18, an undocumented 65-year-old adds no targeted supplement. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 18_720 + person2: + age: 65 + ssi: 0 + immigration_status: UNDOCUMENTED + spm_units: + spm_unit: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_080 + pre_subsidy_electricity_expense: 1_500 + households: + household: + members: [person1, person2] + state_code: NV + output: + # Size 1: 2,241.168; 18,720 / 15,650 = 1.196 -> band 3; cap 1,280 with no supplement + nv_liheap: 1_280 + +- name: Case 19, a large propane-heated household with a young child receives the 3,136 maximum. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 42 + employment_income: 24_960 + person2: + age: 40 + person3: {age: 16} + person4: {age: 14} + person5: {age: 12} + person6: {age: 9} + person7: {age: 7} + person8: {age: 4} + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8] + tanf: 0 + heating_type: PROPANE + bottled_gas_expense: 2_500 + # A large household's bill of 200 a month. + pre_subsidy_electricity_expense: 2_400 + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8] + state_code: NV + output: + # 4,900 - 451.776 = 4,448.224; 24,960 / 54,150 = 0.461 -> band 1 + # propane and oil 8+ cap 3,036 + 100 = 3,136 (plan maximum) + nv_liheap: 3_136 + +- name: Case 20, SFY2027 uses the 1.48 percent burden and the 2026 guideline. + period: 2027 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + # 1,800 a month. + employment_income: 21_600 + person2: + age: 8 + spm_units: + spm_unit: + members: [person1, person2] + tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 600 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1, person2] + state_code: NV + output: + # 1,920 - 0.0148 x 21,600 = 1,920 - 319.68 = 1,600.32 + # 21,600 / 21,640 = 0.998 -> band 2; cap 1,684 (the 2025 guideline 21,150 would give band 3, cap 1,348) + nv_liheap: 1_600.32 + +- name: Case 21, a fuel-oil-heated home is capped by the propane and oil table. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 18_720 + spm_units: + spm_unit: + members: [person1] + heating_type: FUEL_OIL + # Rural heating oil of 125 a month. + fuel_oil_expense: 1_500 + pre_subsidy_electricity_expense: 1_200 + households: + household: + members: [person1] + state_code: NV + output: + # 1,500 + 1,200 - 338.832 = 2,361.168 + # 18,720 / 15,650 = 1.196 -> band 3; propane and oil cap 1,480 (standard 1,280) + nv_liheap: 1_480 + +- name: Case 22, a blind SSI recipient without the disability flag makes the household targeted. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + is_blind: true + is_disabled: false + # 2026 federal SSI benefit rate of 994 a month. + ssi: 11_928 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_080 + pre_subsidy_electricity_expense: 1_500 + households: + household: + members: [person1] + state_code: NV + output: + # Nevada OSS, blind, independent living: 109.30 a month x 12 = 1,311.60 (no countable + # income to reduce it); countable and FAC income 11,928 + 1,311.60 = 13,239.60 + nv_liheap_countable_income: 13_239.6 + # SSI receipt meets the glossary's disabled definition (is_usda_disabled). + # 2,580 - 0.0181 x 13,239.60 = 2,580 - 239.63676 = 2,340.36324 + # 13,239.60 / 15,650 = 0.846 -> band 2; 1,600 + 100 + nv_liheap: 1_700 + +- name: Case 23, a single permanent resident within the five-year bar has no counted members and receives nothing. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + immigration_status: LEGAL_PERMANENT_RESIDENT + years_since_us_entry: 2 + employment_income: 18_720 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_080 + pre_subsidy_electricity_expense: 1_500 + households: + household: + members: [person1] + state_code: NV + output: + # Manual 302 C: entered two years ago, an adult, no exempt status, military + # connection or 40 quarters -> excluded from size (502 A.I) + nv_liheap_household_size: 0 + nv_liheap_eligible: false + # Without the bar: 2,241.168, band 3, cap 1,280 + nv_liheap: 0 + +- name: Case 24, a refugee within five years of entry is exempt from the bar and counted. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + immigration_status: REFUGEE + years_since_us_entry: 2 + employment_income: 18_720 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_080 + pre_subsidy_electricity_expense: 1_500 + households: + household: + members: [person1] + state_code: NV + output: + # Manual 302 C VI exempts refugees + nv_liheap_household_size: 1 + # 18,720 <= 23,475; 2,580 - 0.0181 x 18,720 = 2,580 - 338.832 = 2,241.168 + # 18,720 / 15,650 = 1.196 -> band 3; cap 1,280 with no supplement + nv_liheap: 1_280 + +- name: Case 25, a Nevada and an Arizona household in one simulation. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_960 + person2: + age: 8 + person3: + age: 10 + person4: + age: 30 + employment_income: 24_960 + person5: + age: 8 + person6: + age: 10 + tax_units: + tax_unit1: + members: [person1, person2, person3] + tax_unit2: + members: [person4, person5, person6] + spm_units: + spm_unit1: + members: [person1, person2, person3] + tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 600 + pre_subsidy_electricity_expense: 1_440 + spm_unit2: + members: [person4, person5, person6] + tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 600 + pre_subsidy_electricity_expense: 1_440 + households: + household1: + members: [person1, person2, person3] + state_code: NV + household2: + members: [person4, person5, person6] + state_code: AZ + output: + # The Arizona unit has no Nevada household members. + nv_liheap_household_size: [3, 0] + # Nevada, as Case 1: 600 + 1,440 - 0.0181 x 24,960 = 2,040 - 451.776 = 1,588.224 + # 24,960 / 26,650 = 0.937 -> band 2; cap 1,773 + # Arizona: the cap lookup clips size 0 to the size 1 row (guideline + # 15,650 - 5,500 = 10,150, income 0 -> band 1); the benefit is 0 outside Nevada + nv_liheap: [1_588.224, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/liheap/nv_liheap_energy_cost.yaml b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/liheap/nv_liheap_energy_cost.yaml new file mode 100644 index 00000000000..31d77382311 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nv/dwss/liheap/nv_liheap_energy_cost.yaml @@ -0,0 +1,66 @@ +# The FAC uses the household's annual dollar usage for its primary heating source and +# electricity (EAP Manual 803 III-IV; NRS 702.260(7)(a) natural gas and electricity). +# Electric and solar heat are already the electricity bill, so it is counted once. +# Annual bills stand in for the prior twelve months of vendor usage. Gas of 720 is 60 a +# month (typical Nevada bills run 40-90); electricity of 1,320-1,440 is 110-120 a month, +# within the EIA Nevada average residential bill. + +- name: Case 1, a gas-heated home adds its gas and electricity bills. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 720 + pre_subsidy_electricity_expense: 1_320 + households: + household: + members: [person1] + state_code: NV + output: + # 720 + 1,320 + nv_liheap_energy_cost: 2_040 + +- name: Case 2, an electrically heated home counts its electricity bill once. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + spm_units: + spm_unit: + members: [person1] + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 1_440 + households: + household: + members: [person1] + state_code: NV + output: + nv_liheap_energy_cost: 1_440 + +- name: Case 3, a solar-heated home counts its grid electricity bill once. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + spm_units: + spm_unit: + members: [person1] + heating_type: SOLAR + # Net grid bill of 50 a month after the panels' output. + pre_subsidy_electricity_expense: 600 + households: + household: + members: [person1] + state_code: NV + output: + nv_liheap_energy_cost: 600 diff --git a/policyengine_us/variables/gov/states/nv/dwss/liheap/eligibility/nv_liheap_eligible.py b/policyengine_us/variables/gov/states/nv/dwss/liheap/eligibility/nv_liheap_eligible.py new file mode 100644 index 00000000000..5053db5c415 --- /dev/null +++ b/policyengine_us/variables/gov/states/nv/dwss/liheap/eligibility/nv_liheap_eligible.py @@ -0,0 +1,52 @@ +from policyengine_us.model_api import * + + +class nv_liheap_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = YEAR + label = "Nevada LIHEAP Fixed Annual Credit eligibility" + defined_for = StateCode.NV + reference = ( + "https://www.leg.state.nv.us/nrs/nrs-702.html#NRS702Sec260", + # PDF pages 31, 34, 43, 60-61 + "https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=31", + # PDF pages 31, 34, 43, 60-61 + "https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=31", + # PDF pages 5, 8 + "https://liheapch.acf.gov/docs/2026/state-plans/NV_Plan_2026.pdf#page=5", + # PDF pages 5, 8 + "https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/fy-2027-low-income-home-energy-assistance-program-liheap-state-plan.pdf#page=5", + ) + + def formula(spm_unit, period, parameters): + size = spm_unit("nv_liheap_household_size", period) + income = spm_unit("nv_liheap_countable_income", period) + limit = spm_unit("nv_liheap_income_limit", period) + # Countable annual gross income must not exceed the limit. No + # household is categorically eligible and no asset test applies. The + # 150% limit exceeds the 110% floor of 42 U.S.C. 8624(b)(2)(B) for + # every size, so the floor never binds. + income_eligible = income <= limit + heat_in_rent = spm_unit("heat_expense_included_in_rent", period) + heating_type = spm_unit("heating_type", period) + types = heating_type.possible_values + # A home without heat has no heating cost. An unspecified fuel + # qualifies only when heat is included in the rent. + fuel_qualifies = (heating_type != types.NONE) & ( + heat_in_rent | (heating_type != types.UNSPECIFIED) + ) + # Heat included in unsubsidized rent qualifies even without a bill, + # and the minimum benefit then applies. Subsidized or public housing + # tenants whose heat is included in the rent qualify only with an + # energy burden, a separately billed energy cost. The Section 42-only + # housing exception, roomers and boarders, master meters and solar + # vendor credits have no inputs. + subsidized = spm_unit("receives_housing_assistance", period) | ( + spm_unit.household("is_in_public_housing", period) + ) + energy_burden = spm_unit("nv_liheap_energy_cost", period) > 0 + rent_responsible = ~subsidized | energy_burden + direct_responsible = spm_unit("has_heating_expense", period) + responsible = where(heat_in_rent, rent_responsible, direct_responsible) + return (size > 0) & income_eligible & fuel_qualifies & responsible diff --git a/policyengine_us/variables/gov/states/nv/dwss/liheap/eligibility/nv_liheap_immigration_eligible.py b/policyengine_us/variables/gov/states/nv/dwss/liheap/eligibility/nv_liheap_immigration_eligible.py new file mode 100644 index 00000000000..b29c5c45591 --- /dev/null +++ b/policyengine_us/variables/gov/states/nv/dwss/liheap/eligibility/nv_liheap_immigration_eligible.py @@ -0,0 +1,45 @@ +from policyengine_us.model_api import * + + +class nv_liheap_immigration_eligible(Variable): + value_type = bool + entity = Person + definition_period = YEAR + label = "Meets Nevada LIHEAP citizenship and immigration requirements" + defined_for = StateCode.NV + reference = ( + # PDF pages 21-23 + "https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=21", + # PDF pages 21-23 + "https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=21", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.nv.dwss.liheap.eligibility.five_year_bar + # Section 302 A admits citizens and qualified non-citizens. PRUCOL, + # COFA citizens, battered non-citizens and the other Section 302 A + # groups without an immigration_status value are not identified. + eligible_status = person("is_citizen_or_legal_immigrant", period) + # Section 302 C bars a qualified non-citizen for five years after + # entry unless an exemption applies. is_snap_alien_military_connected + # applies the same veteran, active duty, spouse and unmarried + # dependent child test (VII), and snap_alien_qualifying_quarters holds + # the quarters count (VIII). People lawfully residing here and 65 or + # older on August 22, 1996, tribal members, American Indians born in + # Canada, Hmong and Highland Laotians, Amerasians and trafficking + # victims have no input and are barred within five years of entry. + # years_since_us_entry is read as years since an entry after August + # 22, 1996. + status = person("immigration_status", period) + citizen = status == status.possible_values.CITIZEN + exempt_status = np.isin(status.decode_to_str(), p.exempt_statuses) + past_bar = person("years_since_us_entry", period) >= p.years + child = person("age", period) < p.child_age_limit + military = person("is_snap_alien_military_connected", period) + lpr = status == status.possible_values.LEGAL_PERMANENT_RESIDENT + quarters = person("snap_alien_qualifying_quarters", period) + lpr_with_quarters = lpr & (quarters >= p.qualifying_quarters) + not_barred = ( + citizen | exempt_status | past_bar | child | military | lpr_with_quarters + ) + return eligible_status & not_barred diff --git a/policyengine_us/variables/gov/states/nv/dwss/liheap/eligibility/nv_liheap_income_limit.py b/policyengine_us/variables/gov/states/nv/dwss/liheap/eligibility/nv_liheap_income_limit.py new file mode 100644 index 00000000000..c76c805b498 --- /dev/null +++ b/policyengine_us/variables/gov/states/nv/dwss/liheap/eligibility/nv_liheap_income_limit.py @@ -0,0 +1,29 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.hhs.tax_unit_fpg import fpg + + +class nv_liheap_income_limit(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Nevada LIHEAP income limit" + defined_for = StateCode.NV + reference = ( + "https://www.leg.state.nv.us/nrs/nrs-702.html#NRS702Sec260", + # PDF pages 43, 60, 110 + "https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=43", + # PDF pages 43, 60, 110 + "https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=43", + "https://liheapch.acf.gov/docs/2026/state-plans/NV_Plan_2026.pdf#page=8", + "https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/fy-2027-low-income-home-energy-assistance-program-liheap-state-plan.pdf#page=8", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.nv.dwss.liheap.eligibility + size = spm_unit("nv_liheap_household_size", period) + state_group = spm_unit.household("state_group_str", period) + guideline = fpg(size, state_group, period, parameters, year_lag=p.fpg_year_lag) + # Appendix A prints the annual limit unrounded (size 1: $23,475 in + # SFY2026, $23,940 in SFY2027). + return where(size > 0, guideline * p.fpg_rate, 0) diff --git a/policyengine_us/variables/gov/states/nv/dwss/liheap/income/nv_liheap_child_earned_income.py b/policyengine_us/variables/gov/states/nv/dwss/liheap/income/nv_liheap_child_earned_income.py new file mode 100644 index 00000000000..0f88415f20b --- /dev/null +++ b/policyengine_us/variables/gov/states/nv/dwss/liheap/income/nv_liheap_child_earned_income.py @@ -0,0 +1,30 @@ +from policyengine_us.model_api import * + + +class nv_liheap_child_earned_income(Variable): + value_type = float + entity = Person + definition_period = YEAR + unit = USD + label = "Nevada LIHEAP children's earned income" + documentation = ( + "Earned income of a school-attending household member under 18, " + "excluded from eligibility income and counted toward the Fixed " + "Annual Credit." + ) + defined_for = StateCode.NV + reference = ( + # PDF pages 46, 57 + "https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=46", + # PDF pages 46, 57 + "https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=46", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.nv.dwss.liheap.income + # Section 707 N applies to every child in the home, including one + # excluded from household size. + child = (person("age", period) < p.child_age_limit) & person( + "is_in_k12_school", period + ) + return where(child, person("nv_liheap_earned_income", period), 0) diff --git a/policyengine_us/variables/gov/states/nv/dwss/liheap/income/nv_liheap_countable_income.py b/policyengine_us/variables/gov/states/nv/dwss/liheap/income/nv_liheap_countable_income.py new file mode 100644 index 00000000000..b68ba674389 --- /dev/null +++ b/policyengine_us/variables/gov/states/nv/dwss/liheap/income/nv_liheap_countable_income.py @@ -0,0 +1,49 @@ +from policyengine_us.model_api import * + + +class nv_liheap_countable_income(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Nevada LIHEAP countable income" + documentation = ( + "Annual gross income used for the income eligibility test. TANF and " + "the earnings of school-attending children are excluded here and " + "counted in nv_liheap_fac_income." + ) + defined_for = StateCode.NV + reference = ( + # PDF pages 43-44, 46-48, 57, 60 + "https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=43", + # PDF pages 43-44, 46-48, 57, 60 + "https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=43", + # PDF pages 5-6 + "https://liheapch.acf.gov/docs/2026/state-plans/NV_Plan_2026.pdf#page=5", + # PDF pages 5-6 + "https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/fy-2027-low-income-home-energy-assistance-program-liheap-state-plan.pdf#page=5", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.nv.dwss.liheap.income + person = spm_unit.members + # The earnings of a member under 18 in school are excluded here and + # counted toward the Fixed Annual Credit. + earned = person("nv_liheap_earned_income", period) - person( + "nv_liheap_child_earned_income", period + ) + # Each unearned source is floored at zero. + unearned = 0 + for source in p.sources.unearned: + unearned = unearned + max_(person(source, period, options=[ADD]), 0) + # The only deductions from unearned income are the Medicare premiums + # taken from a Social Security check; only the Part B premium has an + # input. + social_security = max_( + person("social_security", period) + - person("medicare_part_b_premium", period), + 0, + ) + # Members excluded from household size keep their income, subject to + # the same children's earned income exclusion as other members. + return spm_unit.sum(earned + unearned + social_security) diff --git a/policyengine_us/variables/gov/states/nv/dwss/liheap/income/nv_liheap_earned_income.py b/policyengine_us/variables/gov/states/nv/dwss/liheap/income/nv_liheap_earned_income.py new file mode 100644 index 00000000000..bf4b68c1922 --- /dev/null +++ b/policyengine_us/variables/gov/states/nv/dwss/liheap/income/nv_liheap_earned_income.py @@ -0,0 +1,30 @@ +from policyengine_us.model_api import * + + +class nv_liheap_earned_income(Variable): + value_type = float + entity = Person + definition_period = YEAR + unit = USD + label = "Nevada LIHEAP earned income" + documentation = ( + "Annual gross earned income of a household member, before the " + "children's earned income exclusion from eligibility income." + ) + defined_for = StateCode.NV + reference = ( + # PDF pages 43-44, 46-48 + "https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=43", + # PDF pages 43-44, 46-48 + "https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=43", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.nv.dwss.liheap.income + # Annual inputs stand in for the 30-day income annualized under + # Section 804. Each source is floored at zero, so a loss in one + # source cannot offset another. + earned = 0 + for source in p.sources.earned: + earned = earned + max_(person(source, period), 0) + return earned diff --git a/policyengine_us/variables/gov/states/nv/dwss/liheap/income/nv_liheap_fac_income.py b/policyengine_us/variables/gov/states/nv/dwss/liheap/income/nv_liheap_fac_income.py new file mode 100644 index 00000000000..177f3ff82a5 --- /dev/null +++ b/policyengine_us/variables/gov/states/nv/dwss/liheap/income/nv_liheap_fac_income.py @@ -0,0 +1,33 @@ +from policyengine_us.model_api import * + + +class nv_liheap_fac_income(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Nevada LIHEAP Fixed Annual Credit income" + documentation = ( + "Annual gross income used for the Fixed Annual Credit and its benefit " + "cap band: eligibility income plus TANF and the earnings of " + "school-attending children." + ) + defined_for = StateCode.NV + reference = ( + # PDF pages 43, 46-47, 57, 60 + "https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=43", + # PDF pages 43, 46-47, 57, 60 + "https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=43", + ) + + def formula(spm_unit, period, parameters): + child_earnings = add(spm_unit, period, ["nv_liheap_child_earned_income"]) + eligibility_income = spm_unit("nv_liheap_countable_income", period) + # TANF is counted once at the SPM unit level through the + # take-up-gated tanf total. The other Fixed Annual Credit-only income + # types have no inputs. + # Section 707 M adds the two most recent quarters of earnings to + # unemployment benefits for the Fixed Annual Credit; quarterly + # earnings have no input. + tanf = spm_unit("tanf", period) + return eligibility_income + child_earnings + tanf diff --git a/policyengine_us/variables/gov/states/nv/dwss/liheap/nv_liheap.py b/policyengine_us/variables/gov/states/nv/dwss/liheap/nv_liheap.py new file mode 100644 index 00000000000..11513338058 --- /dev/null +++ b/policyengine_us/variables/gov/states/nv/dwss/liheap/nv_liheap.py @@ -0,0 +1,88 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.hhs.tax_unit_fpg import fpg + + +class nv_liheap(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Nevada LIHEAP Fixed Annual Credit" + documentation = ( + "Nevada's single regular benefit, the Fixed Annual Credit, paid " + "toward the household's primary heating and electric energy costs " + "over the state fiscal year (July-June): the annual energy cost less " + "the statewide median energy burden share of income, at least the " + "minimum payment and at most the capped benefit table amount. Model " + "period 2026 is SFY2026 and 2027 is SFY2027. Verified for SFY2026 and " + "SFY2027; earlier years are unverified estimates through parameter " + "backfilling. Crisis assistance (Fast Track), arrearage payments and " + "weatherization are out of scope." + ) + defined_for = "nv_liheap_eligible" + reference = ( + "https://www.leg.state.nv.us/nrs/nrs-702.html#NRS702Sec260", + # PDF pages 35, 60-61, 104-105, 110-111 + "https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=35", + # PDF pages 35, 60-61, 103-104, 110-111 + "https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=35", + "https://liheapch.acf.gov/docs/2026/state-plans/NV_Plan_2026.pdf#page=9", + "https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/fy-2027-low-income-home-energy-assistance-program-liheap-state-plan.pdf#page=9", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.nv.dwss.liheap + income = spm_unit("nv_liheap_fac_income", period) + energy_cost = spm_unit("nv_liheap_energy_cost", period) + # The credit is the energy cost less the expected payment at the + # median energy burden. A credit below the minimum, including a + # negative credit and utilities included in the rent with no bill, + # pays the minimum. + fac = energy_cost - income * p.payment.burden_rate + benefit = max_(fac, p.payment.minimum) + size = spm_unit("nv_liheap_household_size", period) + state_group = spm_unit.household("state_group_str", period) + guideline = fpg( + size, + state_group, + period, + parameters, + year_lag=p.eligibility.fpg_year_lag, + ) + p_cap = p.payment.cap + band = p_cap.income_band.calc(income / guideline, right=True).astype(int) + # Eligible households have at least one member; the lower bound only + # keeps the table lookup defined for other units. + table_size = clip(size, 1, p_cap.max_household_size) + heating_type = spm_unit("heating_type", period) + types = heating_type.possible_values + propane_or_oil = ( + (heating_type == types.PROPANE) + | (heating_type == types.FUEL_OIL) + | (heating_type == types.KEROSENE) + ) + table_cap = where( + propane_or_oil, + p_cap.propane_and_oil[table_size][band], + p_cap.standard[table_size][band], + ) + # A counted member who is elderly, disabled or a young child makes the + # household targeted. The glossary defines disabled by benefit + # receipt, as 7 CFR 271.2 does for SNAP: is_usda_disabled covers SSI, + # Social Security disability and the veterans' categories. Disability + # retirement, railroad, interim assistance and employer disability + # benefits count only when the disability is permanent under Social + # Security standards, which disability_benefits, railroad_benefits + # and workers_compensation cannot show, so is_disabled stands in. + p_targeted = p.payment.targeted + person = spm_unit.members + age = person("age", period) + disabled = person("is_disabled", period) | person("is_usda_disabled", period) + targeted_member = person("nv_liheap_immigration_eligible", period) & ( + (age >= p_targeted.elderly_age) + | disabled + | (age < p_targeted.young_child_age_limit) + ) + targeted = spm_unit.any(targeted_member) + cap = table_cap + targeted * p_cap.targeted_supplement + return min_(benefit, cap) diff --git a/policyengine_us/variables/gov/states/nv/dwss/liheap/nv_liheap_energy_cost.py b/policyengine_us/variables/gov/states/nv/dwss/liheap/nv_liheap_energy_cost.py new file mode 100644 index 00000000000..6bed98e9738 --- /dev/null +++ b/policyengine_us/variables/gov/states/nv/dwss/liheap/nv_liheap_energy_cost.py @@ -0,0 +1,39 @@ +from policyengine_us.model_api import * + + +class nv_liheap_energy_cost(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Nevada LIHEAP energy cost" + documentation = ( + "Annual primary heating and electric energy costs used for the Fixed " + "Annual Credit. Bills include vendor service fees, which Section 507 " + "leaves out of the energy cost and Appendix A deducts by vendor. No " + "input identifies the vendor, so a credit between the minimum and the " + "cap can exceed the program's amount by up to that fee." + ) + defined_for = StateCode.NV + reference = ( + "https://www.leg.state.nv.us/nrs/nrs-702.html#NRS702Sec260", + # PDF pages 37, 60, 112 + "https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=37", + # PDF pages 37, 60, 112 + "https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=37", + ) + + def formula(spm_unit, period, parameters): + # Annual bills, service fees included, stand in for the prior 12 + # months of vendor energy dollar usage. The primary heating bill and + # the electricity bill are included; heating_expense already reads the + # electricity bill when the home heats with electricity or solar, so + # it is not added again. + heating_type = spm_unit("heating_type", period) + types = heating_type.possible_values + electric_heat = (heating_type == types.ELECTRICITY) | ( + heating_type == types.SOLAR + ) + heating = spm_unit("heating_expense", period) + electricity = spm_unit("pre_subsidy_electricity_expense", period) + return heating + where(electric_heat, 0, electricity) diff --git a/policyengine_us/variables/gov/states/nv/dwss/liheap/nv_liheap_household_size.py b/policyengine_us/variables/gov/states/nv/dwss/liheap/nv_liheap_household_size.py new file mode 100644 index 00000000000..89b83184c87 --- /dev/null +++ b/policyengine_us/variables/gov/states/nv/dwss/liheap/nv_liheap_household_size.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class nv_liheap_household_size(Variable): + value_type = int + entity = SPMUnit + definition_period = YEAR + label = "Nevada LIHEAP household size" + defined_for = StateCode.NV + reference = ( + # PDF pages 32-33, 43, 60 + "https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=32", + # PDF pages 32-33, 43, 60 + "https://www.dss.nv.gov/contentassets/b3bcdb93ea2d4b3f8dc252451a34cbe4/2027-eap-state-manual--08.25.26-1.pdf#page=32", + ) + + # Citizens and qualified non-citizens who are not within the Section + # 302 C five-year bar count in household size. Ineligible non-citizens, + # including those within the bar, are excluded from size, but their + # income still counts in nv_liheap_countable_income, under the same rules + # as other members. SPM membership approximates the household; Social + # Security number noncompliance, program violation disqualifications, + # students living away, joint custody and roomers or boarders have no + # inputs. + adds = ["nv_liheap_immigration_eligible"] diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index 27c4fd91804..5e4066769ca 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -5609,6 +5609,69 @@ candidates: nm_additional_2021_income_rebate.py, nm_supplemental_2021_income_rebate.py, nm_deduction_for_certain_dependents_eligible.py, nm_cdcc_eligible.py, nm_medical_expense_credit.py). Ruled in October 2026 to follow the per-spouse gap-fill; verify which listed credits and rebates share that treatment.' +- id: us-nv:liheap-cap-band-125-percent-column + program: liheap + years: + from: 2026 + to: 2026 + type: state-fiscal + question: Do Nevada's SFY2026 benefit cap bands end at 125% of the poverty guideline, or at Appendix A's printed + 125% column, which differs from that rate for household sizes 4-8? + sources: + - kind: manual + citation: Nevada SFY2026 Energy Assistance Program Manual, Appendix A, FY 2026 income guidelines table, 125% Poverty + column + url: https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=110 + - kind: manual + citation: Nevada SFY2026 Energy Assistance Program Manual, Appendix A, FY 2026 benefit cap tables, >100-125% and + >125-150% bands + url: https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=111 + readings: + statute: No statute or regulation is supplied (NRS 702.260 sets no band); the cap tables key the bands to 75%, 100%, + 125% and 150% of poverty, and 125% of the $37,650 size-5 guideline is $47,062.50. + other: The income table prints $53,937.50 as the size-5 125% figure and $40,062.50 for size 4; the SFY2027 table + matches the rate. + example: A size-5 household with Fixed Annual Credit income of $50,000 is in the >125-150% band by the rate (cap + $1,411) and in the >100-125% band by the printed $53,937.50 (cap $1,568). + pe_us: + follows: gap-fill + code: [] + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10432 + state: unreviewed + note: 'PE-US keys the bands to the rates, which reproduce every SFY2027 row; confirm the SFY2026 column with the + state. Code not yet on main: gov.states.nv.dwss.liheap.payment.cap.income_band, nv_liheap.' +- id: us-nv:liheap-minimum-fixed-annual-credit + program: liheap + years: + from: 2026 + to: 2026 + type: state-fiscal + question: Is Nevada's SFY2026 minimum Fixed Annual Credit $240, as manual Sections 504 A, 505 and 702 III print, or + $360, as Section 803 V and the state plan set? + sources: + - kind: manual + citation: Nevada SFY2026 Energy Assistance Program Manual, Sections 504 A, 505 D, F and G, 702 III and 803 V, PDF + pages 34, 36-37, 43 and 60-61 + url: https://dss.nv.gov/uploadedFiles/dwssnvgov/content/Energy/FY%202026%20EAP%20Manual%2008.2025%20ADA.pdf#page=34 + - kind: plan + citation: Nevada FY2026 LIHEAP State Plan, Sections 2.5-2.6 + url: https://liheapch.acf.gov/docs/2026/state-plans/NV_Plan_2026.pdf#page=9 + readings: + statute: No statute or regulation is supplied (NRS 702.260 sets no minimum); Sections 504 A, 505 D, F and G and + 702 III print a $240 minimum payment. + other: Section 803 V pays $360 when the computed credit is less than $360, including a negative figure, and plan + 2.5 pays $360 for a credit of zero to $359; the SFY2027 manual prints $360 throughout. + example: A household with a negative computed Fixed Annual Credit receives $360 under Section 803 V and $240 under + Section 702 III. + pe_us: + follows: gap-fill + code: [] + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10432 + state: unreviewed + note: 'PE-US pays the $360 minimum in SFY2026, matching Section 803 V, both plans and the SFY2027 manual. Code not + yet on main: gov.states.nv.dwss.liheap.payment.minimum, nv_liheap.' - id: us-ny:college-tuition-credit-claimed-spouse program: income-tax years: