diff --git a/changelog.d/ks-liheap.added.md b/changelog.d/ks-liheap.added.md new file mode 100644 index 00000000000..9993101a793 --- /dev/null +++ b/changelog.d/ks-liheap.added.md @@ -0,0 +1 @@ +Kansas LIEAP (Low Income Energy Assistance Program) heating benefit: eligibility, countable income, and the FY2025-FY2026 benefit matrices. Self-employment income is approximated using existing net-income inputs without an additional expense deduction. diff --git a/policyengine_us/parameters/gov/states/ks/dcf/liheap/eligibility/fpg_rate.yaml b/policyengine_us/parameters/gov/states/ks/dcf/liheap/eligibility/fpg_rate.yaml new file mode 100644 index 00000000000..590c40d06f4 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ks/dcf/liheap/eligibility/fpg_rate.yaml @@ -0,0 +1,17 @@ +description: Kansas limits countable income to this multiple of the federal poverty guidelines under the Low Income Energy Assistance Program. +values: + 2024-10-01: 1.5 + +metadata: + unit: /1 + period: year + label: Kansas LIEAP federal poverty guideline rate + reference: + - title: KEESM 13360 Income Eligibility, October 2024 edition + href: https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13360.htm + - title: KEESM 13360 Income Eligibility, January 2026 edition + href: https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13360.htm + - title: Kansas LIHEAP FY2026 State Plan, Section 2.1 (eligibility threshold 150.00% of the HHS poverty guidelines) + href: https://liheapch.acf.gov/docs/2026/state-plans/KS_Plan_2026.pdf#page=8 + - title: Kansas LIHEAP FY2025 State Plan, Section 2.1 (eligibility threshold 150.00% of the HHS poverty guidelines) + href: https://liheapch.acf.gov/docs/2025/state-plans/KS_Plan_2025.pdf#page=8 diff --git a/policyengine_us/parameters/gov/states/ks/dcf/liheap/eligibility/fpg_year_lag.yaml b/policyengine_us/parameters/gov/states/ks/dcf/liheap/eligibility/fpg_year_lag.yaml new file mode 100644 index 00000000000..27e77cbfbd1 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ks/dcf/liheap/eligibility/fpg_year_lag.yaml @@ -0,0 +1,18 @@ +description: Kansas uses federal poverty guidelines from this many years before the modeled heating season for the income limit under the Low Income Energy Assistance Program. +# Verified for FY2025 and FY2026: their limits use the 2024 and 2025 +# guidelines, respectively. This is a relative year selection, not a fixed +# guideline year. Earlier and later Kansas policy remains unverified. +values: + 2024-10-01: 1 + +metadata: + unit: year + period: year + label: Kansas LIEAP federal poverty guideline year lag + reference: + - title: KEESM 13362 Income Guidelines, October 2024 edition + href: https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13360.htm + - title: KEESM 13362 Income Guidelines, January 2026 edition + href: https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13360.htm + - title: HHS poverty guidelines, 2024 and 2025 + href: https://aspe.hhs.gov/topics/poverty-economic-mobility/poverty-guidelines/prior-hhs-poverty-guidelines-federal-register-references diff --git a/policyengine_us/parameters/gov/states/ks/dcf/liheap/eligibility/max_table_size.yaml b/policyengine_us/parameters/gov/states/ks/dcf/liheap/eligibility/max_table_size.yaml new file mode 100644 index 00000000000..3748ff7ffb4 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ks/dcf/liheap/eligibility/max_table_size.yaml @@ -0,0 +1,13 @@ +description: Kansas sets income limits through this household size, with an increment for each additional person, under the Low Income Energy Assistance Program. +values: + 2024-10-01: 8 + +metadata: + unit: person + period: year + label: Kansas LIEAP maximum tabulated household size + reference: + - title: KEESM 13360-13362, October 2024 edition + href: https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13360.htm + - title: KEESM 13360-13362, January 2026 edition + href: https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13360.htm diff --git a/policyengine_us/parameters/gov/states/ks/dcf/liheap/eligibility/rounding_increment.yaml b/policyengine_us/parameters/gov/states/ks/dcf/liheap/eligibility/rounding_increment.yaml new file mode 100644 index 00000000000..330050af8d7 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ks/dcf/liheap/eligibility/rounding_increment.yaml @@ -0,0 +1,24 @@ +description: Kansas sets monthly income limits in increments of this amount under the Low Income Energy Assistance Program. +# Precision inferred from the published tables, not an express rounding rule: +# FY2025 retains cents and exactly matches 150% of the 2024 guidelines. +# FY2026 matches nearest-dollar rounding of 150% of the 2025 guidelines, +# including a separately rounded $688 increment for each person beyond eight. +# The July 2025 KEESM edition is the first to carry the FY2026 limits; the +# 2025-10-01 date matches the federal program year and the FY2026 matrix. +# Kansas LIEAP variables are annual and read the value in force on January 1, +# so any date from 2025-01-02 through 2026-01-01 gives the same result. +values: + 2024-10-01: 0.01 + 2025-10-01: 1 + +metadata: + unit: currency-USD + period: month + label: Kansas LIEAP monthly income limit rounding increment + reference: + - title: KEESM 13362 Income Guidelines, October 2024 edition + href: https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13360.htm + - title: KEESM 13362 Income Guidelines, July 2025 edition (first edition with the FY2026 limits of $1,956 to $6,769 and the $688 increment) + href: https://content.dcf.ks.gov/ees/KEESM/Robo07-25/Robo_07_01_25/keesm13360.htm + - title: KEESM 13362 Income Guidelines, January 2026 edition + href: https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13360.htm diff --git a/policyengine_us/parameters/gov/states/ks/dcf/liheap/income/earned_income_min_age.yaml b/policyengine_us/parameters/gov/states/ks/dcf/liheap/income/earned_income_min_age.yaml new file mode 100644 index 00000000000..389e078a72a --- /dev/null +++ b/policyengine_us/parameters/gov/states/ks/dcf/liheap/income/earned_income_min_age.yaml @@ -0,0 +1,21 @@ +description: Kansas excludes the earned income of household members below this age under the Low Income Energy Assistance Program. +values: + 2024-10-01: 18 + +metadata: + unit: year + period: year + label: Kansas LIEAP earned income minimum age + reference: + - title: Kansas LIHEAP FY2026 State Plan, Section 1.9 (earned income of a child under the age of 18 is not counted) + href: https://liheapch.acf.gov/docs/2026/state-plans/KS_Plan_2026.pdf#page=7 + - title: Kansas LIHEAP FY2025 State Plan, Section 1.9 (earned income of a child under the age of 18 is not counted) + href: https://liheapch.acf.gov/docs/2025/state-plans/KS_Plan_2025.pdf#page=6 + - title: KEESM 13361 Exempt Income, October 2024 edition (earned income of child household members under age 18 is exempt) + href: https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13360.htm + - title: KEESM 13361 Exempt Income, January 2026 edition (earned income of child household members under age 18 is exempt) + href: https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13360.htm + - title: KEESM 13320 Household Definition, October 2024 edition (a member who is or turns eighteen in the month of application has countable income) + href: https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13300.htm + - title: KEESM 13320 Household Definition, January 2026 edition (a member who is or turns eighteen in the month of application has countable income) + href: https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13300.htm diff --git a/policyengine_us/parameters/gov/states/ks/dcf/liheap/income/interest_income_min_age.yaml b/policyengine_us/parameters/gov/states/ks/dcf/liheap/income/interest_income_min_age.yaml new file mode 100644 index 00000000000..eefb8767ace --- /dev/null +++ b/policyengine_us/parameters/gov/states/ks/dcf/liheap/income/interest_income_min_age.yaml @@ -0,0 +1,13 @@ +description: Kansas excludes the interest income of household members below this age under the Low Income Energy Assistance Program. +values: + 2024-10-01: 18 + +metadata: + unit: year + period: year + label: Kansas LIEAP minimum age for countable interest + reference: + - title: KEESM 13361 Exempt Income, October 2024 edition (interest accrued from the interest-bearing accounts of children under 18 is exempt) + href: https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13360.htm + - title: KEESM 13361 Exempt Income, January 2026 edition (interest accrued from the interest-bearing accounts of children under 18 is exempt) + href: https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13360.htm diff --git a/policyengine_us/parameters/gov/states/ks/dcf/liheap/income/regular_interest_dividend_exemption.yaml b/policyengine_us/parameters/gov/states/ks/dcf/liheap/income/regular_interest_dividend_exemption.yaml new file mode 100644 index 00000000000..b18ca35570c --- /dev/null +++ b/policyengine_us/parameters/gov/states/ks/dcf/liheap/income/regular_interest_dividend_exemption.yaml @@ -0,0 +1,17 @@ +description: Kansas excludes recurring interest and dividends not exceeding this monthly amount under the Low Income Energy Assistance Program. +# Above this amount the full amount counts. +values: + 2024-10-01: 50 + 2025-10-01: 0 + +metadata: + unit: currency-USD + period: month + label: Kansas LIEAP recurring interest and dividend exemption + reference: + - title: KEESM 13361 Exempt Income, October 2024 edition (interest and dividend income not exceeding $50 per month is exempt; if in excess the full amount is counted) + href: https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13360.htm + - title: KEESM 13361 Exempt Income, July 2025 edition (first edition with the FY2026 rule; only irregular, unpredictable interest and dividends under $30 in a quarter are exempt) + href: https://content.dcf.ks.gov/ees/KEESM/Robo07-25/Robo_07_01_25/keesm13360.htm + - title: KEESM 13361 Exempt Income, January 2026 edition (only irregular, unpredictable interest and dividends under $30 in a quarter are exempt) + href: https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13360.htm diff --git a/policyengine_us/parameters/gov/states/ks/dcf/liheap/income/sources/earned.yaml b/policyengine_us/parameters/gov/states/ks/dcf/liheap/income/sources/earned.yaml new file mode 100644 index 00000000000..afc37e285d7 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ks/dcf/liheap/income/sources/earned.yaml @@ -0,0 +1,41 @@ +description: Kansas uses these earned income sources to approximate countable household earnings under the Low Income Energy Assistance Program. +# Existing net self-employment inputs are used without an additional expense +# deduction. They approximate KEESM 13360's gross-receipts calculation and do +# not reproduce its standard deduction or actual-cost election in every case. +values: + 2024-10-01: + - employment_income + - self_employment_income + - sstb_self_employment_income + - farm_operations_income + # KEESM 6300 treats profit from performing services, including managerial + # responsibilities, as earned income, and KEESM 6313 bars deducting a loss + # from other income, so pass-through business income is floored with the + # other business sources. + - partnership_s_corp_income + +metadata: + unit: list + period: year + label: Kansas LIEAP countable earned income sources + reference: + - title: KEESM 13360 Income Eligibility, October 2024 edition (countable income includes earnings by adults; self-employment income paragraph) + href: https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13360.htm + - title: KEESM 13360 Income Eligibility, January 2026 edition (countable income includes earnings by adults; self-employment income paragraph) + href: https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13360.htm + - title: KEESM 7122.1 Income Producing Cost Deduction, October 2024 edition (a loss from self-employment cannot be deducted from other income) + href: https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm7122.htm + - title: KEESM 7122.1 Income Producing Cost Deduction, January 2026 edition (a loss from self-employment cannot be deducted from other income) + href: https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm7122.htm + - title: Kansas LIHEAP FY2026 State Plan, Section 1.8-1.9, pages 5-6 (gross income; wages, self-employment income, contract income and commissions counted) + href: https://liheapch.acf.gov/docs/2026/state-plans/KS_Plan_2026.pdf#page=5 + - title: Kansas LIHEAP FY2025 State Plan, Section 1.8-1.9, pages 5-6 (gross income; wages, self-employment income, contract income and commissions counted) + href: https://liheapch.acf.gov/docs/2025/state-plans/KS_Plan_2025.pdf#page=5 + - title: KEESM 13320 Household Definition, October 2024 edition (income of all household members living together is used) + href: https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13300.htm + - title: KEESM 13320 Household Definition, January 2026 edition (income of all household members living together is used) + href: https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13300.htm + - title: KEESM 6313 Self-Employment, October 2024 edition (a loss from self-employment cannot be deducted from other income) + href: https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm6313.htm + - title: KEESM 6313 Self-Employment, January 2026 edition (a loss from self-employment cannot be deducted from other income) + href: https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm6313.htm diff --git a/policyengine_us/parameters/gov/states/ks/dcf/liheap/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/ks/dcf/liheap/income/sources/unearned.yaml new file mode 100644 index 00000000000..c31480fd362 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ks/dcf/liheap/income/sources/unearned.yaml @@ -0,0 +1,51 @@ +description: Kansas uses these unearned income sources to determine gross household income under the Low Income Energy Assistance Program. +values: + 2024-10-01: + - unemployment_compensation + - strike_benefits + # SSA benefits are counted gross, including the Medicare deduction. + - social_security + - ssi + - pension_income + - general_assistance + - ks_tanf + - rental_income + # KEESM 6313: income from rental property is unearned unless a household + # member actively manages it at least 20 hours a week. + - farm_rent_income + - alimony_income + - child_support_received + # Plan counts "insurance payments made directly to the insured". + - workers_compensation + # KEESM 13361 exempts only the incomes it lists; employer disability benefits are not among them. + - disability_benefits + - veterans_benefits + - ks_liheap_countable_interest_dividend_income + # KEESM 13360-13361 explicitly count interest except for specific + # exemptions; the plan's unchecked combined interest/dividend/royalty + # box is not a blanket exclusion. Other irregular receipts and source- + # specific exclusions require a direct countable-income input. + # Contract or mortgage payments, legal settlements and adoption support + # have no model input and also require a direct countable-income input. + +metadata: + unit: list + period: year + label: Kansas LIEAP countable unearned income sources + reference: + - title: Kansas LIHEAP FY2026 State Plan, Section 1.9 (countable income sources) + href: https://liheapch.acf.gov/docs/2026/state-plans/KS_Plan_2026.pdf#page=6 + - title: Kansas LIHEAP FY2025 State Plan, Section 1.9, pages 5-6 (countable income sources) + href: https://liheapch.acf.gov/docs/2025/state-plans/KS_Plan_2025.pdf#page=5 + - title: KEESM 13360-13361, October 2024 edition (countable income and specific exemptions) + href: https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13360.htm + - title: KEESM 13360-13361, January 2026 edition (countable income and specific exemptions) + href: https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13360.htm + - title: KEESM 13320 Household Definition, October 2024 edition (income of all household members living together is used) + href: https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13300.htm + - title: KEESM 13320 Household Definition, January 2026 edition (income of all household members living together is used) + href: https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13300.htm + - title: KEESM 6313 Self-Employment, October 2024 edition (rental property income is unearned unless actively managed 20 hours a week) + href: https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm6313.htm + - title: KEESM 6313 Self-Employment, January 2026 edition (rental property income is unearned unless actively managed 20 hours a week) + href: https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm6313.htm diff --git a/policyengine_us/parameters/gov/states/ks/dcf/liheap/payment/household_size_group.yaml b/policyengine_us/parameters/gov/states/ks/dcf/liheap/payment/household_size_group.yaml new file mode 100644 index 00000000000..9e6e167ea38 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ks/dcf/liheap/payment/household_size_group.yaml @@ -0,0 +1,28 @@ +description: Kansas sets this benefit matrix size group based on the number of countable household members under the Low Income Energy Assistance Program. +brackets: + # Household size 1-4. + - threshold: + 2024-10-01: 0 + amount: + 2024-10-01: 1 + # Household size 5 and over. + - threshold: + 2024-10-01: 5 + amount: + 2024-10-01: 2 + +metadata: + type: single_amount + threshold_unit: person + amount_unit: /1 + period: year + label: Kansas LIEAP household size group + reference: + - title: Kansas LIEAP FY2026 Benefit Matrix (Household Size 1-4 and Household Size 5 and Over columns) + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/KS_BenefitMatrix_2026.pdf#page=1 + - title: Kansas LIEAP FY2025 Benefit Matrix + href: https://liheapch.acf.gov/docs/2025/benefits-matricies/KS_BenefitMatrix_2025.pdf#page=1 + - title: KEESM 13330 Citizenship and Alienage Requirements, October 2024 edition (non-citizen members excluded from household size) + href: https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13300.htm + - title: KEESM 13330 Citizenship and Alienage Requirements, January 2026 edition (non-citizen members excluded from household size) + href: https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13300.htm diff --git a/policyengine_us/parameters/gov/states/ks/dcf/liheap/payment/income_band.yaml b/policyengine_us/parameters/gov/states/ks/dcf/liheap/payment/income_band.yaml new file mode 100644 index 00000000000..aecb4d8d2f3 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ks/dcf/liheap/payment/income_band.yaml @@ -0,0 +1,34 @@ +description: Kansas sets this benefit matrix income band based on one-month gross countable income under the Low Income Energy Assistance Program. +brackets: + - threshold: + 2024-10-01: 0 + amount: + 2024-10-01: 1 + - threshold: + 2024-10-01: 900 + amount: + 2024-10-01: 2 + - threshold: + 2024-10-01: 1_200 + amount: + 2024-10-01: 3 + - threshold: + 2024-10-01: 1_700 + amount: + 2024-10-01: 4 + +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + period: month + label: Kansas LIEAP one-month income band + reference: + - title: Kansas LIEAP FY2026 Benefit Matrix (one-month income rows 0-899, 900-1,199, 1,200-1,699, 1,700 and over) + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/KS_BenefitMatrix_2026.pdf#page=1 + - title: Kansas LIEAP FY2025 Benefit Matrix + href: https://liheapch.acf.gov/docs/2025/benefits-matricies/KS_BenefitMatrix_2025.pdf#page=1 + - title: KEESM 13230 Proof of Information Requirement, October 2024 edition (gross income of the month of application) + href: https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13200.htm + - title: KEESM 13230 Proof of Information Requirement, January 2026 edition (gross income of the month of application) + href: https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13200.htm diff --git a/policyengine_us/parameters/gov/states/ks/dcf/liheap/payment/matrix/electricity.yaml b/policyengine_us/parameters/gov/states/ks/dcf/liheap/payment/matrix/electricity.yaml new file mode 100644 index 00000000000..eb54672c321 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ks/dcf/liheap/payment/matrix/electricity.yaml @@ -0,0 +1,1202 @@ +description: Kansas provides this annual benefit to households heating primarily with electricity, by one-month income band, utility rate tier, dwelling type and household size group, under the Low Income Energy Assistance Program. + +# Income band 1: one-month income $0 to $899 +1: + A: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 848 + 2025-10-01: 639 + 2: + 2024-10-01: 970 + 2025-10-01: 731 + DUPLEX: + 1: + 2024-10-01: 636 + 2025-10-01: 479 + 2: + 2024-10-01: 728 + 2025-10-01: 548 + APARTMENT: + 1: + 2024-10-01: 424 + 2025-10-01: 320 + 2: + 2024-10-01: 485 + 2025-10-01: 366 + TRAILER_OTHER: + 1: + 2024-10-01: 212 + 2025-10-01: 160 + 2: + 2024-10-01: 243 + 2025-10-01: 183 + B: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_069 + 2025-10-01: 806 + 2: + 2024-10-01: 1_223 + 2025-10-01: 922 + DUPLEX: + 1: + 2024-10-01: 802 + 2025-10-01: 604 + 2: + 2024-10-01: 917 + 2025-10-01: 691 + APARTMENT: + 1: + 2024-10-01: 535 + 2025-10-01: 403 + 2: + 2024-10-01: 612 + 2025-10-01: 461 + TRAILER_OTHER: + 1: + 2024-10-01: 267 + 2025-10-01: 201 + 2: + 2024-10-01: 306 + 2025-10-01: 230 + C: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_207 + 2025-10-01: 910 + 2: + 2024-10-01: 1_381 + 2025-10-01: 1_040 + DUPLEX: + 1: + 2024-10-01: 905 + 2025-10-01: 682 + 2: + 2024-10-01: 1_036 + 2025-10-01: 780 + APARTMENT: + 1: + 2024-10-01: 604 + 2025-10-01: 455 + 2: + 2024-10-01: 691 + 2025-10-01: 520 + TRAILER_OTHER: + 1: + 2024-10-01: 302 + 2025-10-01: 227 + 2: + 2024-10-01: 345 + 2025-10-01: 260 + D: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_321 + 2025-10-01: 995 + 2: + 2024-10-01: 1_511 + 2025-10-01: 1_138 + DUPLEX: + 1: + 2024-10-01: 991 + 2025-10-01: 746 + 2: + 2024-10-01: 1_133 + 2025-10-01: 854 + APARTMENT: + 1: + 2024-10-01: 661 + 2025-10-01: 498 + 2: + 2024-10-01: 756 + 2025-10-01: 569 + TRAILER_OTHER: + 1: + 2024-10-01: 330 + 2025-10-01: 249 + 2: + 2024-10-01: 378 + 2025-10-01: 285 + E: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_384 + 2025-10-01: 1_043 + 2: + 2024-10-01: 1_584 + 2025-10-01: 1_193 + DUPLEX: + 1: + 2024-10-01: 1_038 + 2025-10-01: 782 + 2: + 2024-10-01: 1_188 + 2025-10-01: 895 + APARTMENT: + 1: + 2024-10-01: 692 + 2025-10-01: 522 + 2: + 2024-10-01: 792 + 2025-10-01: 596 + TRAILER_OTHER: + 1: + 2024-10-01: 346 + 2025-10-01: 261 + 2: + 2024-10-01: 396 + 2025-10-01: 298 + F: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_419 + 2025-10-01: 1_069 + 2: + 2024-10-01: 1_623 + 2025-10-01: 1_222 + DUPLEX: + 1: + 2024-10-01: 1_064 + 2025-10-01: 802 + 2: + 2024-10-01: 1_217 + 2025-10-01: 917 + APARTMENT: + 1: + 2024-10-01: 710 + 2025-10-01: 534 + 2: + 2024-10-01: 812 + 2025-10-01: 611 + TRAILER_OTHER: + 1: + 2024-10-01: 355 + 2025-10-01: 267 + 2: + 2024-10-01: 406 + 2025-10-01: 306 + G: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_462 + 2025-10-01: 1_102 + 2: + 2024-10-01: 1_673 + 2025-10-01: 1_261 + DUPLEX: + 1: + 2024-10-01: 1_097 + 2025-10-01: 826 + 2: + 2024-10-01: 1_255 + 2025-10-01: 946 + APARTMENT: + 1: + 2024-10-01: 731 + 2025-10-01: 551 + 2: + 2024-10-01: 837 + 2025-10-01: 630 + TRAILER_OTHER: + 1: + 2024-10-01: 366 + 2025-10-01: 275 + 2: + 2024-10-01: 418 + 2025-10-01: 315 + H: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_543 + 2025-10-01: 1_162 + 2: + 2024-10-01: 1_765 + 2025-10-01: 1_330 + DUPLEX: + 1: + 2024-10-01: 1_157 + 2025-10-01: 872 + 2: + 2024-10-01: 1_324 + 2025-10-01: 997 + APARTMENT: + 1: + 2024-10-01: 772 + 2025-10-01: 581 + 2: + 2024-10-01: 883 + 2025-10-01: 665 + TRAILER_OTHER: + 1: + 2024-10-01: 386 + 2025-10-01: 291 + 2: + 2024-10-01: 441 + 2025-10-01: 332 + I: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_633 + 2025-10-01: 1_230 + 2: + 2024-10-01: 1_868 + 2025-10-01: 1_407 + DUPLEX: + 1: + 2024-10-01: 1_225 + 2025-10-01: 923 + 2: + 2024-10-01: 1_401 + 2025-10-01: 1_055 + APARTMENT: + 1: + 2024-10-01: 817 + 2025-10-01: 615 + 2: + 2024-10-01: 934 + 2025-10-01: 704 + TRAILER_OTHER: + 1: + 2024-10-01: 408 + 2025-10-01: 308 + 2: + 2024-10-01: 467 + 2025-10-01: 352 + J: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_951 + 2025-10-01: 1_470 + 2: + 2024-10-01: 2_232 + 2025-10-01: 1_682 + DUPLEX: + 1: + 2024-10-01: 1_463 + 2025-10-01: 1_102 + 2: + 2024-10-01: 1_674 + 2025-10-01: 1_261 + APARTMENT: + 1: + 2024-10-01: 976 + 2025-10-01: 735 + 2: + 2024-10-01: 1_116 + 2025-10-01: 841 + TRAILER_OTHER: + 1: + 2024-10-01: 488 + 2025-10-01: 367 + 2: + 2024-10-01: 558 + 2025-10-01: 420 + +# Income band 2: one-month income $900 to $1,199 +2: + A: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 763 + 2025-10-01: 575 + 2: + 2024-10-01: 873 + 2025-10-01: 658 + DUPLEX: + 1: + 2024-10-01: 572 + 2025-10-01: 431 + 2: + 2024-10-01: 655 + 2025-10-01: 494 + APARTMENT: + 1: + 2024-10-01: 382 + 2025-10-01: 288 + 2: + 2024-10-01: 437 + 2025-10-01: 329 + TRAILER_OTHER: + 1: + 2024-10-01: 191 + 2025-10-01: 144 + 2: + 2024-10-01: 218 + 2025-10-01: 165 + B: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 962 + 2025-10-01: 725 + 2: + 2024-10-01: 1_101 + 2025-10-01: 829 + DUPLEX: + 1: + 2024-10-01: 722 + 2025-10-01: 544 + 2: + 2024-10-01: 826 + 2025-10-01: 622 + APARTMENT: + 1: + 2024-10-01: 481 + 2025-10-01: 363 + 2: + 2024-10-01: 550 + 2025-10-01: 415 + TRAILER_OTHER: + 1: + 2024-10-01: 241 + 2025-10-01: 181 + 2: + 2024-10-01: 275 + 2025-10-01: 207 + C: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_086 + 2025-10-01: 819 + 2: + 2024-10-01: 1_243 + 2025-10-01: 936 + DUPLEX: + 1: + 2024-10-01: 815 + 2025-10-01: 614 + 2: + 2024-10-01: 932 + 2025-10-01: 702 + APARTMENT: + 1: + 2024-10-01: 543 + 2025-10-01: 409 + 2: + 2024-10-01: 621 + 2025-10-01: 468 + TRAILER_OTHER: + 1: + 2024-10-01: 272 + 2025-10-01: 205 + 2: + 2024-10-01: 311 + 2025-10-01: 234 + D: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_189 + 2025-10-01: 896 + 2: + 2024-10-01: 1_360 + 2025-10-01: 1_025 + DUPLEX: + 1: + 2024-10-01: 892 + 2025-10-01: 672 + 2: + 2024-10-01: 1_020 + 2025-10-01: 768 + APARTMENT: + 1: + 2024-10-01: 594 + 2025-10-01: 448 + 2: + 2024-10-01: 680 + 2025-10-01: 512 + TRAILER_OTHER: + 1: + 2024-10-01: 297 + 2025-10-01: 224 + 2: + 2024-10-01: 340 + 2025-10-01: 256 + E: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_246 + 2025-10-01: 939 + 2: + 2024-10-01: 1_426 + 2025-10-01: 1_074 + DUPLEX: + 1: + 2024-10-01: 934 + 2025-10-01: 704 + 2: + 2024-10-01: 1_069 + 2025-10-01: 805 + APARTMENT: + 1: + 2024-10-01: 623 + 2025-10-01: 469 + 2: + 2024-10-01: 713 + 2025-10-01: 537 + TRAILER_OTHER: + 1: + 2024-10-01: 311 + 2025-10-01: 235 + 2: + 2024-10-01: 356 + 2025-10-01: 268 + F: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_277 + 2025-10-01: 962 + 2: + 2024-10-01: 1_461 + 2025-10-01: 1_100 + DUPLEX: + 1: + 2024-10-01: 958 + 2025-10-01: 721 + 2: + 2024-10-01: 1_096 + 2025-10-01: 825 + APARTMENT: + 1: + 2024-10-01: 639 + 2025-10-01: 481 + 2: + 2024-10-01: 730 + 2025-10-01: 550 + TRAILER_OTHER: + 1: + 2024-10-01: 319 + 2025-10-01: 240 + 2: + 2024-10-01: 365 + 2025-10-01: 275 + G: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_316 + 2025-10-01: 991 + 2: + 2024-10-01: 1_506 + 2025-10-01: 1_135 + DUPLEX: + 1: + 2024-10-01: 987 + 2025-10-01: 744 + 2: + 2024-10-01: 1_129 + 2025-10-01: 851 + APARTMENT: + 1: + 2024-10-01: 658 + 2025-10-01: 496 + 2: + 2024-10-01: 753 + 2025-10-01: 567 + TRAILER_OTHER: + 1: + 2024-10-01: 329 + 2025-10-01: 248 + 2: + 2024-10-01: 376 + 2025-10-01: 284 + H: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_389 + 2025-10-01: 1_046 + 2: + 2024-10-01: 1_589 + 2025-10-01: 1_197 + DUPLEX: + 1: + 2024-10-01: 1_042 + 2025-10-01: 785 + 2: + 2024-10-01: 1_191 + 2025-10-01: 897 + APARTMENT: + 1: + 2024-10-01: 694 + 2025-10-01: 523 + 2: + 2024-10-01: 794 + 2025-10-01: 598 + TRAILER_OTHER: + 1: + 2024-10-01: 347 + 2025-10-01: 262 + 2: + 2024-10-01: 397 + 2025-10-01: 299 + I: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_470 + 2025-10-01: 1_107 + 2: + 2024-10-01: 1_681 + 2025-10-01: 1_266 + DUPLEX: + 1: + 2024-10-01: 1_102 + 2025-10-01: 831 + 2: + 2024-10-01: 1_261 + 2025-10-01: 950 + APARTMENT: + 1: + 2024-10-01: 735 + 2025-10-01: 554 + 2: + 2024-10-01: 841 + 2025-10-01: 633 + TRAILER_OTHER: + 1: + 2024-10-01: 367 + 2025-10-01: 277 + 2: + 2024-10-01: 420 + 2025-10-01: 317 + J: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_756 + 2025-10-01: 1_323 + 2: + 2024-10-01: 2_009 + 2025-10-01: 1_513 + DUPLEX: + 1: + 2024-10-01: 1_317 + 2025-10-01: 992 + 2: + 2024-10-01: 1_507 + 2025-10-01: 1_135 + APARTMENT: + 1: + 2024-10-01: 878 + 2025-10-01: 661 + 2: + 2024-10-01: 1_004 + 2025-10-01: 757 + TRAILER_OTHER: + 1: + 2024-10-01: 439 + 2025-10-01: 331 + 2: + 2024-10-01: 502 + 2025-10-01: 378 + +# Income band 3: one-month income $1,200 to $1,699 +3: + A: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 678 + 2025-10-01: 511 + 2: + 2024-10-01: 776 + 2025-10-01: 585 + DUPLEX: + 1: + 2024-10-01: 509 + 2025-10-01: 384 + 2: + 2024-10-01: 582 + 2025-10-01: 439 + APARTMENT: + 1: + 2024-10-01: 339 + 2025-10-01: 256 + 2: + 2024-10-01: 388 + 2025-10-01: 292 + TRAILER_OTHER: + 1: + 2024-10-01: 170 + 2025-10-01: 128 + 2: + 2024-10-01: 194 + 2025-10-01: 146 + B: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 855 + 2025-10-01: 644 + 2: + 2024-10-01: 978 + 2025-10-01: 737 + DUPLEX: + 1: + 2024-10-01: 641 + 2025-10-01: 483 + 2: + 2024-10-01: 734 + 2025-10-01: 553 + APARTMENT: + 1: + 2024-10-01: 428 + 2025-10-01: 322 + 2: + 2024-10-01: 489 + 2025-10-01: 369 + TRAILER_OTHER: + 1: + 2024-10-01: 214 + 2025-10-01: 161 + 2: + 2024-10-01: 245 + 2025-10-01: 184 + C: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 966 + 2025-10-01: 728 + 2: + 2024-10-01: 1_105 + 2025-10-01: 832 + DUPLEX: + 1: + 2024-10-01: 724 + 2025-10-01: 546 + 2: + 2024-10-01: 829 + 2025-10-01: 624 + APARTMENT: + 1: + 2024-10-01: 483 + 2025-10-01: 364 + 2: + 2024-10-01: 552 + 2025-10-01: 416 + TRAILER_OTHER: + 1: + 2024-10-01: 241 + 2025-10-01: 182 + 2: + 2024-10-01: 276 + 2025-10-01: 208 + D: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_057 + 2025-10-01: 796 + 2: + 2024-10-01: 1_209 + 2025-10-01: 911 + DUPLEX: + 1: + 2024-10-01: 793 + 2025-10-01: 597 + 2: + 2024-10-01: 907 + 2025-10-01: 683 + APARTMENT: + 1: + 2024-10-01: 528 + 2025-10-01: 398 + 2: + 2024-10-01: 604 + 2025-10-01: 455 + TRAILER_OTHER: + 1: + 2024-10-01: 264 + 2025-10-01: 199 + 2: + 2024-10-01: 302 + 2025-10-01: 228 + E: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_107 + 2025-10-01: 835 + 2: + 2024-10-01: 1_267 + 2025-10-01: 954 + DUPLEX: + 1: + 2024-10-01: 830 + 2025-10-01: 626 + 2: + 2024-10-01: 950 + 2025-10-01: 716 + APARTMENT: + 1: + 2024-10-01: 554 + 2025-10-01: 417 + 2: + 2024-10-01: 634 + 2025-10-01: 477 + TRAILER_OTHER: + 1: + 2024-10-01: 277 + 2025-10-01: 209 + 2: + 2024-10-01: 317 + 2025-10-01: 239 + F: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_135 + 2025-10-01: 855 + 2: + 2024-10-01: 1_298 + 2025-10-01: 978 + DUPLEX: + 1: + 2024-10-01: 851 + 2025-10-01: 641 + 2: + 2024-10-01: 974 + 2025-10-01: 733 + APARTMENT: + 1: + 2024-10-01: 568 + 2025-10-01: 428 + 2: + 2024-10-01: 649 + 2025-10-01: 489 + TRAILER_OTHER: + 1: + 2024-10-01: 284 + 2025-10-01: 214 + 2: + 2024-10-01: 325 + 2025-10-01: 244 + G: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_170 + 2025-10-01: 881 + 2: + 2024-10-01: 1_338 + 2025-10-01: 1_009 + DUPLEX: + 1: + 2024-10-01: 877 + 2025-10-01: 661 + 2: + 2024-10-01: 1_004 + 2025-10-01: 756 + APARTMENT: + 1: + 2024-10-01: 585 + 2025-10-01: 441 + 2: + 2024-10-01: 669 + 2025-10-01: 504 + TRAILER_OTHER: + 1: + 2024-10-01: 292 + 2025-10-01: 220 + 2: + 2024-10-01: 335 + 2025-10-01: 252 + H: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_234 + 2025-10-01: 930 + 2: + 2024-10-01: 1_412 + 2025-10-01: 1_064 + DUPLEX: + 1: + 2024-10-01: 926 + 2025-10-01: 697 + 2: + 2024-10-01: 1_059 + 2025-10-01: 798 + APARTMENT: + 1: + 2024-10-01: 617 + 2025-10-01: 465 + 2: + 2024-10-01: 706 + 2025-10-01: 532 + TRAILER_OTHER: + 1: + 2024-10-01: 309 + 2025-10-01: 232 + 2: + 2024-10-01: 353 + 2025-10-01: 266 + I: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_306 + 2025-10-01: 984 + 2: + 2024-10-01: 1_494 + 2025-10-01: 1_126 + DUPLEX: + 1: + 2024-10-01: 980 + 2025-10-01: 738 + 2: + 2024-10-01: 1_121 + 2025-10-01: 844 + APARTMENT: + 1: + 2024-10-01: 653 + 2025-10-01: 492 + 2: + 2024-10-01: 747 + 2025-10-01: 563 + TRAILER_OTHER: + 1: + 2024-10-01: 327 + 2025-10-01: 246 + 2: + 2024-10-01: 374 + 2025-10-01: 281 + J: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_561 + 2025-10-01: 1_176 + 2: + 2024-10-01: 1_786 + 2025-10-01: 1_345 + DUPLEX: + 1: + 2024-10-01: 1_171 + 2025-10-01: 882 + 2: + 2024-10-01: 1_339 + 2025-10-01: 1_009 + APARTMENT: + 1: + 2024-10-01: 780 + 2025-10-01: 588 + 2: + 2024-10-01: 893 + 2025-10-01: 673 + TRAILER_OTHER: + 1: + 2024-10-01: 390 + 2025-10-01: 294 + 2: + 2024-10-01: 446 + 2025-10-01: 336 + +# Income band 4: one-month income $1,700 and over +4: + A: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 594 + 2025-10-01: 447 + 2: + 2024-10-01: 679 + 2025-10-01: 512 + DUPLEX: + 1: + 2024-10-01: 445 + 2025-10-01: 336 + 2: + 2024-10-01: 509 + 2025-10-01: 384 + APARTMENT: + 1: + 2024-10-01: 297 + 2025-10-01: 224 + 2: + 2024-10-01: 340 + 2025-10-01: 256 + TRAILER_OTHER: + 1: + 2024-10-01: 148 + 2025-10-01: 112 + 2: + 2024-10-01: 170 + 2025-10-01: 128 + B: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 748 + 2025-10-01: 564 + 2: + 2024-10-01: 856 + 2025-10-01: 645 + DUPLEX: + 1: + 2024-10-01: 561 + 2025-10-01: 423 + 2: + 2024-10-01: 642 + 2025-10-01: 484 + APARTMENT: + 1: + 2024-10-01: 374 + 2025-10-01: 282 + 2: + 2024-10-01: 428 + 2025-10-01: 323 + TRAILER_OTHER: + 1: + 2024-10-01: 187 + 2025-10-01: 141 + 2: + 2024-10-01: 214 + 2025-10-01: 161 + C: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 845 + 2025-10-01: 637 + 2: + 2024-10-01: 967 + 2025-10-01: 728 + DUPLEX: + 1: + 2024-10-01: 634 + 2025-10-01: 478 + 2: + 2024-10-01: 725 + 2025-10-01: 546 + APARTMENT: + 1: + 2024-10-01: 422 + 2025-10-01: 318 + 2: + 2024-10-01: 483 + 2025-10-01: 364 + TRAILER_OTHER: + 1: + 2024-10-01: 211 + 2025-10-01: 159 + 2: + 2024-10-01: 242 + 2025-10-01: 182 + D: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 925 + 2025-10-01: 697 + 2: + 2024-10-01: 1_058 + 2025-10-01: 797 + DUPLEX: + 1: + 2024-10-01: 694 + 2025-10-01: 522 + 2: + 2024-10-01: 793 + 2025-10-01: 598 + APARTMENT: + 1: + 2024-10-01: 462 + 2025-10-01: 348 + 2: + 2024-10-01: 529 + 2025-10-01: 398 + TRAILER_OTHER: + 1: + 2024-10-01: 231 + 2025-10-01: 174 + 2: + 2024-10-01: 264 + 2025-10-01: 199 + E: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 969 + 2025-10-01: 730 + 2: + 2024-10-01: 1_109 + 2025-10-01: 835 + DUPLEX: + 1: + 2024-10-01: 727 + 2025-10-01: 548 + 2: + 2024-10-01: 832 + 2025-10-01: 626 + APARTMENT: + 1: + 2024-10-01: 484 + 2025-10-01: 365 + 2: + 2024-10-01: 554 + 2025-10-01: 417 + TRAILER_OTHER: + 1: + 2024-10-01: 242 + 2025-10-01: 183 + 2: + 2024-10-01: 277 + 2025-10-01: 209 + F: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 993 + 2025-10-01: 748 + 2: + 2024-10-01: 1_136 + 2025-10-01: 856 + DUPLEX: + 1: + 2024-10-01: 745 + 2025-10-01: 561 + 2: + 2024-10-01: 852 + 2025-10-01: 642 + APARTMENT: + 1: + 2024-10-01: 497 + 2025-10-01: 374 + 2: + 2024-10-01: 568 + 2025-10-01: 428 + TRAILER_OTHER: + 1: + 2024-10-01: 248 + 2025-10-01: 187 + 2: + 2024-10-01: 284 + 2025-10-01: 214 + G: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_023 + 2025-10-01: 771 + 2: + 2024-10-01: 1_171 + 2025-10-01: 883 + DUPLEX: + 1: + 2024-10-01: 768 + 2025-10-01: 578 + 2: + 2024-10-01: 878 + 2025-10-01: 662 + APARTMENT: + 1: + 2024-10-01: 512 + 2025-10-01: 386 + 2: + 2024-10-01: 586 + 2025-10-01: 441 + TRAILER_OTHER: + 1: + 2024-10-01: 256 + 2025-10-01: 193 + 2: + 2024-10-01: 293 + 2025-10-01: 221 + H: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_080 + 2025-10-01: 814 + 2: + 2024-10-01: 1_236 + 2025-10-01: 931 + DUPLEX: + 1: + 2024-10-01: 810 + 2025-10-01: 610 + 2: + 2024-10-01: 927 + 2025-10-01: 698 + APARTMENT: + 1: + 2024-10-01: 540 + 2025-10-01: 407 + 2: + 2024-10-01: 618 + 2025-10-01: 465 + TRAILER_OTHER: + 1: + 2024-10-01: 270 + 2025-10-01: 203 + 2: + 2024-10-01: 309 + 2025-10-01: 233 + I: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_143 + 2025-10-01: 861 + 2: + 2024-10-01: 1_308 + 2025-10-01: 985 + DUPLEX: + 1: + 2024-10-01: 857 + 2025-10-01: 646 + 2: + 2024-10-01: 981 + 2025-10-01: 739 + APARTMENT: + 1: + 2024-10-01: 572 + 2025-10-01: 431 + 2: + 2024-10-01: 654 + 2025-10-01: 493 + TRAILER_OTHER: + 1: + 2024-10-01: 286 + 2025-10-01: 215 + 2: + 2024-10-01: 327 + 2025-10-01: 246 + J: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_366 + 2025-10-01: 1_029 + 2: + 2024-10-01: 1_562 + 2025-10-01: 1_177 + DUPLEX: + 1: + 2024-10-01: 1_024 + 2025-10-01: 772 + 2: + 2024-10-01: 1_172 + 2025-10-01: 883 + APARTMENT: + 1: + 2024-10-01: 683 + 2025-10-01: 514 + 2: + 2024-10-01: 781 + 2025-10-01: 589 + TRAILER_OTHER: + 1: + 2024-10-01: 341 + 2025-10-01: 257 + 2: + 2024-10-01: 391 + 2025-10-01: 294 + +metadata: + propagate_metadata_to_children: true + period: year + unit: currency-USD + label: Kansas LIEAP electricity benefit matrix + breakdown: + - range(1, 5) # one-month income band + - ks_liheap_utility_rate_tier + - ks_liheap_dwelling_type + - range(1, 3) # household size group (1 = size 1-4, 2 = size 5+) + breakdown_labels: + - One-month income band + - Utility rate tier + - Dwelling type + - Household size group + reference: + - title: Kansas LIEAP FY2026 Benefit Matrix, Electricity (Benefit Adjustment @ 80% table) + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/KS_BenefitMatrix_2026.pdf#page=2 + - title: Kansas LIEAP FY2025 Benefit Matrix, Electricity (Ben Adj 100.0%; pages 1-2) + href: https://liheapch.acf.gov/docs/2025/benefits-matricies/KS_BenefitMatrix_2025.pdf#page=1 + - title: Kansas LIHEAP FY2026 State Plan, Section 2.5, pages 8-9 (benefit variables) + href: https://liheapch.acf.gov/docs/2026/state-plans/KS_Plan_2026.pdf#page=8 + - title: Kansas LIHEAP FY2025 State Plan, Section 2.5, pages 8-9 (benefit variables) + href: https://liheapch.acf.gov/docs/2025/state-plans/KS_Plan_2025.pdf#page=8 + - title: KEESM 13410 Benefit Levels, October 2024 edition + href: https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13400.htm + - title: KEESM 13410 Benefit Levels, January 2026 edition + href: https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13400.htm diff --git a/policyengine_us/parameters/gov/states/ks/dcf/liheap/payment/matrix/natural_gas.yaml b/policyengine_us/parameters/gov/states/ks/dcf/liheap/payment/matrix/natural_gas.yaml new file mode 100644 index 00000000000..e199f466019 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ks/dcf/liheap/payment/matrix/natural_gas.yaml @@ -0,0 +1,1202 @@ +description: Kansas provides this annual benefit to households heating primarily with natural gas, by one-month income band, utility rate tier, dwelling type and household size group, under the Low Income Energy Assistance Program. + +# Income band 1: one-month income $0 to $899 +1: + A: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 640 + 2025-10-01: 482 + 2: + 2024-10-01: 732 + 2025-10-01: 551 + DUPLEX: + 1: + 2024-10-01: 480 + 2025-10-01: 362 + 2: + 2024-10-01: 549 + 2025-10-01: 413 + APARTMENT: + 1: + 2024-10-01: 320 + 2025-10-01: 241 + 2: + 2024-10-01: 366 + 2025-10-01: 276 + TRAILER_OTHER: + 1: + 2024-10-01: 160 + 2025-10-01: 121 + 2: + 2024-10-01: 183 + 2025-10-01: 138 + B: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 776 + 2025-10-01: 585 + 2: + 2024-10-01: 888 + 2025-10-01: 669 + DUPLEX: + 1: + 2024-10-01: 582 + 2025-10-01: 439 + 2: + 2024-10-01: 666 + 2025-10-01: 502 + APARTMENT: + 1: + 2024-10-01: 388 + 2025-10-01: 292 + 2: + 2024-10-01: 444 + 2025-10-01: 334 + TRAILER_OTHER: + 1: + 2024-10-01: 194 + 2025-10-01: 146 + 2: + 2024-10-01: 222 + 2025-10-01: 167 + C: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 880 + 2025-10-01: 662 + 2: + 2024-10-01: 1_006 + 2025-10-01: 758 + DUPLEX: + 1: + 2024-10-01: 660 + 2025-10-01: 497 + 2: + 2024-10-01: 755 + 2025-10-01: 569 + APARTMENT: + 1: + 2024-10-01: 440 + 2025-10-01: 331 + 2: + 2024-10-01: 503 + 2025-10-01: 379 + TRAILER_OTHER: + 1: + 2024-10-01: 220 + 2025-10-01: 166 + 2: + 2024-10-01: 252 + 2025-10-01: 190 + D: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 920 + 2025-10-01: 693 + 2: + 2024-10-01: 1_053 + 2025-10-01: 793 + DUPLEX: + 1: + 2024-10-01: 690 + 2025-10-01: 520 + 2: + 2024-10-01: 790 + 2025-10-01: 595 + APARTMENT: + 1: + 2024-10-01: 460 + 2025-10-01: 346 + 2: + 2024-10-01: 527 + 2025-10-01: 396 + TRAILER_OTHER: + 1: + 2024-10-01: 230 + 2025-10-01: 173 + 2: + 2024-10-01: 263 + 2025-10-01: 198 + E: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 941 + 2025-10-01: 709 + 2: + 2024-10-01: 1_076 + 2025-10-01: 810 + DUPLEX: + 1: + 2024-10-01: 706 + 2025-10-01: 532 + 2: + 2024-10-01: 807 + 2025-10-01: 608 + APARTMENT: + 1: + 2024-10-01: 471 + 2025-10-01: 354 + 2: + 2024-10-01: 538 + 2025-10-01: 405 + TRAILER_OTHER: + 1: + 2024-10-01: 235 + 2025-10-01: 177 + 2: + 2024-10-01: 269 + 2025-10-01: 203 + F: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 941 + 2025-10-01: 709 + 2: + 2024-10-01: 1_077 + 2025-10-01: 811 + DUPLEX: + 1: + 2024-10-01: 706 + 2025-10-01: 532 + 2: + 2024-10-01: 808 + 2025-10-01: 608 + APARTMENT: + 1: + 2024-10-01: 471 + 2025-10-01: 354 + 2: + 2024-10-01: 539 + 2025-10-01: 406 + TRAILER_OTHER: + 1: + 2024-10-01: 235 + 2025-10-01: 177 + 2: + 2024-10-01: 269 + 2025-10-01: 203 + G: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_006 + 2025-10-01: 758 + 2: + 2024-10-01: 1_151 + 2025-10-01: 867 + DUPLEX: + 1: + 2024-10-01: 755 + 2025-10-01: 568 + 2: + 2024-10-01: 863 + 2025-10-01: 650 + APARTMENT: + 1: + 2024-10-01: 503 + 2025-10-01: 379 + 2: + 2024-10-01: 576 + 2025-10-01: 434 + TRAILER_OTHER: + 1: + 2024-10-01: 252 + 2025-10-01: 189 + 2: + 2024-10-01: 288 + 2025-10-01: 217 + H: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_107 + 2025-10-01: 834 + 2: + 2024-10-01: 1_266 + 2025-10-01: 954 + DUPLEX: + 1: + 2024-10-01: 830 + 2025-10-01: 625 + 2: + 2024-10-01: 950 + 2025-10-01: 716 + APARTMENT: + 1: + 2024-10-01: 554 + 2025-10-01: 417 + 2: + 2024-10-01: 633 + 2025-10-01: 477 + TRAILER_OTHER: + 1: + 2024-10-01: 277 + 2025-10-01: 208 + 2: + 2024-10-01: 317 + 2025-10-01: 239 + I: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_222 + 2025-10-01: 921 + 2: + 2024-10-01: 1_398 + 2025-10-01: 1_053 + DUPLEX: + 1: + 2024-10-01: 917 + 2025-10-01: 691 + 2: + 2024-10-01: 1_049 + 2025-10-01: 790 + APARTMENT: + 1: + 2024-10-01: 611 + 2025-10-01: 460 + 2: + 2024-10-01: 699 + 2025-10-01: 526 + TRAILER_OTHER: + 1: + 2024-10-01: 306 + 2025-10-01: 230 + 2: + 2024-10-01: 350 + 2025-10-01: 263 + J: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_508 + 2025-10-01: 1_136 + 2: + 2024-10-01: 1_725 + 2025-10-01: 1_299 + DUPLEX: + 1: + 2024-10-01: 1_131 + 2025-10-01: 852 + 2: + 2024-10-01: 1_294 + 2025-10-01: 974 + APARTMENT: + 1: + 2024-10-01: 754 + 2025-10-01: 568 + 2: + 2024-10-01: 863 + 2025-10-01: 650 + TRAILER_OTHER: + 1: + 2024-10-01: 377 + 2025-10-01: 284 + 2: + 2024-10-01: 431 + 2025-10-01: 325 + +# Income band 2: one-month income $900 to $1,199 +2: + A: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 576 + 2025-10-01: 434 + 2: + 2024-10-01: 659 + 2025-10-01: 496 + DUPLEX: + 1: + 2024-10-01: 432 + 2025-10-01: 326 + 2: + 2024-10-01: 494 + 2025-10-01: 372 + APARTMENT: + 1: + 2024-10-01: 288 + 2025-10-01: 217 + 2: + 2024-10-01: 329 + 2025-10-01: 248 + TRAILER_OTHER: + 1: + 2024-10-01: 144 + 2025-10-01: 109 + 2: + 2024-10-01: 165 + 2025-10-01: 124 + B: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 698 + 2025-10-01: 526 + 2: + 2024-10-01: 799 + 2025-10-01: 602 + DUPLEX: + 1: + 2024-10-01: 524 + 2025-10-01: 395 + 2: + 2024-10-01: 599 + 2025-10-01: 451 + APARTMENT: + 1: + 2024-10-01: 349 + 2025-10-01: 263 + 2: + 2024-10-01: 400 + 2025-10-01: 301 + TRAILER_OTHER: + 1: + 2024-10-01: 175 + 2025-10-01: 132 + 2: + 2024-10-01: 200 + 2025-10-01: 150 + C: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 792 + 2025-10-01: 596 + 2: + 2024-10-01: 905 + 2025-10-01: 683 + DUPLEX: + 1: + 2024-10-01: 594 + 2025-10-01: 447 + 2: + 2024-10-01: 679 + 2025-10-01: 512 + APARTMENT: + 1: + 2024-10-01: 396 + 2025-10-01: 298 + 2: + 2024-10-01: 453 + 2025-10-01: 341 + TRAILER_OTHER: + 1: + 2024-10-01: 198 + 2025-10-01: 149 + 2: + 2024-10-01: 226 + 2025-10-01: 171 + D: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 828 + 2025-10-01: 624 + 2: + 2024-10-01: 948 + 2025-10-01: 714 + DUPLEX: + 1: + 2024-10-01: 621 + 2025-10-01: 468 + 2: + 2024-10-01: 711 + 2025-10-01: 535 + APARTMENT: + 1: + 2024-10-01: 414 + 2025-10-01: 312 + 2: + 2024-10-01: 474 + 2025-10-01: 357 + TRAILER_OTHER: + 1: + 2024-10-01: 207 + 2025-10-01: 156 + 2: + 2024-10-01: 237 + 2025-10-01: 178 + E: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 847 + 2025-10-01: 638 + 2: + 2024-10-01: 968 + 2025-10-01: 729 + DUPLEX: + 1: + 2024-10-01: 635 + 2025-10-01: 478 + 2: + 2024-10-01: 726 + 2025-10-01: 547 + APARTMENT: + 1: + 2024-10-01: 423 + 2025-10-01: 319 + 2: + 2024-10-01: 484 + 2025-10-01: 365 + TRAILER_OTHER: + 1: + 2024-10-01: 212 + 2025-10-01: 159 + 2: + 2024-10-01: 242 + 2025-10-01: 182 + F: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 847 + 2025-10-01: 638 + 2: + 2024-10-01: 969 + 2025-10-01: 730 + DUPLEX: + 1: + 2024-10-01: 635 + 2025-10-01: 478 + 2: + 2024-10-01: 727 + 2025-10-01: 548 + APARTMENT: + 1: + 2024-10-01: 423 + 2025-10-01: 319 + 2: + 2024-10-01: 485 + 2025-10-01: 365 + TRAILER_OTHER: + 1: + 2024-10-01: 212 + 2025-10-01: 159 + 2: + 2024-10-01: 242 + 2025-10-01: 183 + G: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 905 + 2025-10-01: 682 + 2: + 2024-10-01: 1_036 + 2025-10-01: 780 + DUPLEX: + 1: + 2024-10-01: 679 + 2025-10-01: 511 + 2: + 2024-10-01: 777 + 2025-10-01: 585 + APARTMENT: + 1: + 2024-10-01: 453 + 2025-10-01: 341 + 2: + 2024-10-01: 518 + 2025-10-01: 390 + TRAILER_OTHER: + 1: + 2024-10-01: 226 + 2025-10-01: 170 + 2: + 2024-10-01: 259 + 2025-10-01: 195 + H: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 996 + 2025-10-01: 750 + 2: + 2024-10-01: 1_139 + 2025-10-01: 859 + DUPLEX: + 1: + 2024-10-01: 747 + 2025-10-01: 563 + 2: + 2024-10-01: 855 + 2025-10-01: 644 + APARTMENT: + 1: + 2024-10-01: 498 + 2025-10-01: 375 + 2: + 2024-10-01: 570 + 2025-10-01: 429 + TRAILER_OTHER: + 1: + 2024-10-01: 249 + 2025-10-01: 188 + 2: + 2024-10-01: 285 + 2025-10-01: 215 + I: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_100 + 2025-10-01: 829 + 2: + 2024-10-01: 1_258 + 2025-10-01: 948 + DUPLEX: + 1: + 2024-10-01: 825 + 2025-10-01: 622 + 2: + 2024-10-01: 944 + 2025-10-01: 711 + APARTMENT: + 1: + 2024-10-01: 550 + 2025-10-01: 414 + 2: + 2024-10-01: 629 + 2025-10-01: 474 + TRAILER_OTHER: + 1: + 2024-10-01: 275 + 2025-10-01: 207 + 2: + 2024-10-01: 315 + 2025-10-01: 237 + J: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_357 + 2025-10-01: 1_022 + 2: + 2024-10-01: 1_553 + 2025-10-01: 1_169 + DUPLEX: + 1: + 2024-10-01: 1_018 + 2025-10-01: 767 + 2: + 2024-10-01: 1_164 + 2025-10-01: 877 + APARTMENT: + 1: + 2024-10-01: 679 + 2025-10-01: 511 + 2: + 2024-10-01: 776 + 2025-10-01: 585 + TRAILER_OTHER: + 1: + 2024-10-01: 339 + 2025-10-01: 256 + 2: + 2024-10-01: 388 + 2025-10-01: 292 + +# Income band 3: one-month income $1,200 to $1,699 +3: + A: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 512 + 2025-10-01: 386 + 2: + 2024-10-01: 586 + 2025-10-01: 441 + DUPLEX: + 1: + 2024-10-01: 384 + 2025-10-01: 289 + 2: + 2024-10-01: 439 + 2025-10-01: 331 + APARTMENT: + 1: + 2024-10-01: 256 + 2025-10-01: 193 + 2: + 2024-10-01: 293 + 2025-10-01: 220 + TRAILER_OTHER: + 1: + 2024-10-01: 128 + 2025-10-01: 96 + 2: + 2024-10-01: 146 + 2025-10-01: 110 + B: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 621 + 2025-10-01: 468 + 2: + 2024-10-01: 710 + 2025-10-01: 535 + DUPLEX: + 1: + 2024-10-01: 466 + 2025-10-01: 351 + 2: + 2024-10-01: 533 + 2025-10-01: 401 + APARTMENT: + 1: + 2024-10-01: 310 + 2025-10-01: 234 + 2: + 2024-10-01: 355 + 2025-10-01: 268 + TRAILER_OTHER: + 1: + 2024-10-01: 155 + 2025-10-01: 117 + 2: + 2024-10-01: 178 + 2025-10-01: 134 + C: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 704 + 2025-10-01: 530 + 2: + 2024-10-01: 805 + 2025-10-01: 607 + DUPLEX: + 1: + 2024-10-01: 528 + 2025-10-01: 397 + 2: + 2024-10-01: 604 + 2025-10-01: 455 + APARTMENT: + 1: + 2024-10-01: 352 + 2025-10-01: 265 + 2: + 2024-10-01: 402 + 2025-10-01: 303 + TRAILER_OTHER: + 1: + 2024-10-01: 176 + 2025-10-01: 132 + 2: + 2024-10-01: 201 + 2025-10-01: 152 + D: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 736 + 2025-10-01: 554 + 2: + 2024-10-01: 842 + 2025-10-01: 634 + DUPLEX: + 1: + 2024-10-01: 552 + 2025-10-01: 416 + 2: + 2024-10-01: 632 + 2025-10-01: 476 + APARTMENT: + 1: + 2024-10-01: 368 + 2025-10-01: 277 + 2: + 2024-10-01: 421 + 2025-10-01: 317 + TRAILER_OTHER: + 1: + 2024-10-01: 184 + 2025-10-01: 139 + 2: + 2024-10-01: 211 + 2025-10-01: 159 + E: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 753 + 2025-10-01: 567 + 2: + 2024-10-01: 861 + 2025-10-01: 648 + DUPLEX: + 1: + 2024-10-01: 565 + 2025-10-01: 425 + 2: + 2024-10-01: 646 + 2025-10-01: 486 + APARTMENT: + 1: + 2024-10-01: 376 + 2025-10-01: 284 + 2: + 2024-10-01: 430 + 2025-10-01: 324 + TRAILER_OTHER: + 1: + 2024-10-01: 188 + 2025-10-01: 142 + 2: + 2024-10-01: 215 + 2025-10-01: 162 + F: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 753 + 2025-10-01: 567 + 2: + 2024-10-01: 862 + 2025-10-01: 649 + DUPLEX: + 1: + 2024-10-01: 565 + 2025-10-01: 425 + 2: + 2024-10-01: 646 + 2025-10-01: 487 + APARTMENT: + 1: + 2024-10-01: 376 + 2025-10-01: 284 + 2: + 2024-10-01: 431 + 2025-10-01: 324 + TRAILER_OTHER: + 1: + 2024-10-01: 188 + 2025-10-01: 142 + 2: + 2024-10-01: 215 + 2025-10-01: 162 + G: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 805 + 2025-10-01: 606 + 2: + 2024-10-01: 921 + 2025-10-01: 694 + DUPLEX: + 1: + 2024-10-01: 604 + 2025-10-01: 455 + 2: + 2024-10-01: 691 + 2025-10-01: 520 + APARTMENT: + 1: + 2024-10-01: 402 + 2025-10-01: 303 + 2: + 2024-10-01: 460 + 2025-10-01: 347 + TRAILER_OTHER: + 1: + 2024-10-01: 201 + 2025-10-01: 152 + 2: + 2024-10-01: 230 + 2025-10-01: 173 + H: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 886 + 2025-10-01: 667 + 2: + 2024-10-01: 1_013 + 2025-10-01: 764 + DUPLEX: + 1: + 2024-10-01: 664 + 2025-10-01: 500 + 2: + 2024-10-01: 760 + 2025-10-01: 573 + APARTMENT: + 1: + 2024-10-01: 443 + 2025-10-01: 333 + 2: + 2024-10-01: 506 + 2025-10-01: 382 + TRAILER_OTHER: + 1: + 2024-10-01: 221 + 2025-10-01: 167 + 2: + 2024-10-01: 253 + 2025-10-01: 191 + I: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 978 + 2025-10-01: 737 + 2: + 2024-10-01: 1_118 + 2025-10-01: 842 + DUPLEX: + 1: + 2024-10-01: 733 + 2025-10-01: 552 + 2: + 2024-10-01: 839 + 2025-10-01: 632 + APARTMENT: + 1: + 2024-10-01: 489 + 2025-10-01: 368 + 2: + 2024-10-01: 559 + 2025-10-01: 421 + TRAILER_OTHER: + 1: + 2024-10-01: 244 + 2025-10-01: 184 + 2: + 2024-10-01: 280 + 2025-10-01: 211 + J: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_206 + 2025-10-01: 909 + 2: + 2024-10-01: 1_380 + 2025-10-01: 1_039 + DUPLEX: + 1: + 2024-10-01: 905 + 2025-10-01: 682 + 2: + 2024-10-01: 1_035 + 2025-10-01: 780 + APARTMENT: + 1: + 2024-10-01: 603 + 2025-10-01: 454 + 2: + 2024-10-01: 690 + 2025-10-01: 520 + TRAILER_OTHER: + 1: + 2024-10-01: 302 + 2025-10-01: 227 + 2: + 2024-10-01: 345 + 2025-10-01: 260 + +# Income band 4: one-month income $1,700 and over +4: + A: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 448 + 2025-10-01: 338 + 2: + 2024-10-01: 512 + 2025-10-01: 386 + DUPLEX: + 1: + 2024-10-01: 336 + 2025-10-01: 253 + 2: + 2024-10-01: 384 + 2025-10-01: 289 + APARTMENT: + 1: + 2024-10-01: 224 + 2025-10-01: 169 + 2: + 2024-10-01: 256 + 2025-10-01: 193 + TRAILER_OTHER: + 1: + 2024-10-01: 112 + 2025-10-01: 84 + 2: + 2024-10-01: 128 + 2025-10-01: 96 + B: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 543 + 2025-10-01: 409 + 2: + 2024-10-01: 622 + 2025-10-01: 468 + DUPLEX: + 1: + 2024-10-01: 407 + 2025-10-01: 307 + 2: + 2024-10-01: 466 + 2025-10-01: 351 + APARTMENT: + 1: + 2024-10-01: 272 + 2025-10-01: 205 + 2: + 2024-10-01: 311 + 2025-10-01: 234 + TRAILER_OTHER: + 1: + 2024-10-01: 136 + 2025-10-01: 102 + 2: + 2024-10-01: 155 + 2025-10-01: 117 + C: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 616 + 2025-10-01: 464 + 2: + 2024-10-01: 704 + 2025-10-01: 531 + DUPLEX: + 1: + 2024-10-01: 462 + 2025-10-01: 348 + 2: + 2024-10-01: 528 + 2025-10-01: 398 + APARTMENT: + 1: + 2024-10-01: 308 + 2025-10-01: 232 + 2: + 2024-10-01: 352 + 2025-10-01: 265 + TRAILER_OTHER: + 1: + 2024-10-01: 154 + 2025-10-01: 116 + 2: + 2024-10-01: 176 + 2025-10-01: 133 + D: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 644 + 2025-10-01: 485 + 2: + 2024-10-01: 737 + 2025-10-01: 555 + DUPLEX: + 1: + 2024-10-01: 483 + 2025-10-01: 364 + 2: + 2024-10-01: 553 + 2025-10-01: 416 + APARTMENT: + 1: + 2024-10-01: 322 + 2025-10-01: 242 + 2: + 2024-10-01: 369 + 2025-10-01: 277 + TRAILER_OTHER: + 1: + 2024-10-01: 161 + 2025-10-01: 121 + 2: + 2024-10-01: 184 + 2025-10-01: 139 + E: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 659 + 2025-10-01: 496 + 2: + 2024-10-01: 753 + 2025-10-01: 567 + DUPLEX: + 1: + 2024-10-01: 494 + 2025-10-01: 372 + 2: + 2024-10-01: 565 + 2025-10-01: 425 + APARTMENT: + 1: + 2024-10-01: 329 + 2025-10-01: 248 + 2: + 2024-10-01: 377 + 2025-10-01: 284 + TRAILER_OTHER: + 1: + 2024-10-01: 165 + 2025-10-01: 124 + 2: + 2024-10-01: 188 + 2025-10-01: 142 + F: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 659 + 2025-10-01: 496 + 2: + 2024-10-01: 754 + 2025-10-01: 568 + DUPLEX: + 1: + 2024-10-01: 494 + 2025-10-01: 372 + 2: + 2024-10-01: 565 + 2025-10-01: 426 + APARTMENT: + 1: + 2024-10-01: 329 + 2025-10-01: 248 + 2: + 2024-10-01: 377 + 2025-10-01: 284 + TRAILER_OTHER: + 1: + 2024-10-01: 165 + 2025-10-01: 124 + 2: + 2024-10-01: 188 + 2025-10-01: 142 + G: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 704 + 2025-10-01: 530 + 2: + 2024-10-01: 806 + 2025-10-01: 607 + DUPLEX: + 1: + 2024-10-01: 528 + 2025-10-01: 398 + 2: + 2024-10-01: 604 + 2025-10-01: 455 + APARTMENT: + 1: + 2024-10-01: 352 + 2025-10-01: 265 + 2: + 2024-10-01: 403 + 2025-10-01: 304 + TRAILER_OTHER: + 1: + 2024-10-01: 176 + 2025-10-01: 133 + 2: + 2024-10-01: 201 + 2025-10-01: 152 + H: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 775 + 2025-10-01: 584 + 2: + 2024-10-01: 886 + 2025-10-01: 668 + DUPLEX: + 1: + 2024-10-01: 581 + 2025-10-01: 438 + 2: + 2024-10-01: 665 + 2025-10-01: 501 + APARTMENT: + 1: + 2024-10-01: 387 + 2025-10-01: 292 + 2: + 2024-10-01: 443 + 2025-10-01: 334 + TRAILER_OTHER: + 1: + 2024-10-01: 194 + 2025-10-01: 146 + 2: + 2024-10-01: 222 + 2025-10-01: 167 + I: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 855 + 2025-10-01: 645 + 2: + 2024-10-01: 979 + 2025-10-01: 737 + DUPLEX: + 1: + 2024-10-01: 642 + 2025-10-01: 483 + 2: + 2024-10-01: 734 + 2025-10-01: 553 + APARTMENT: + 1: + 2024-10-01: 428 + 2025-10-01: 322 + 2: + 2024-10-01: 489 + 2025-10-01: 368 + TRAILER_OTHER: + 1: + 2024-10-01: 214 + 2025-10-01: 161 + 2: + 2024-10-01: 245 + 2025-10-01: 184 + J: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_056 + 2025-10-01: 795 + 2: + 2024-10-01: 1_208 + 2025-10-01: 909 + DUPLEX: + 1: + 2024-10-01: 792 + 2025-10-01: 596 + 2: + 2024-10-01: 906 + 2025-10-01: 682 + APARTMENT: + 1: + 2024-10-01: 528 + 2025-10-01: 398 + 2: + 2024-10-01: 604 + 2025-10-01: 455 + TRAILER_OTHER: + 1: + 2024-10-01: 264 + 2025-10-01: 199 + 2: + 2024-10-01: 302 + 2025-10-01: 227 + +metadata: + propagate_metadata_to_children: true + period: year + unit: currency-USD + label: Kansas LIEAP natural gas benefit matrix + breakdown: + - range(1, 5) # one-month income band + - ks_liheap_utility_rate_tier + - ks_liheap_dwelling_type + - range(1, 3) # household size group (1 = size 1-4, 2 = size 5+) + breakdown_labels: + - One-month income band + - Utility rate tier + - Dwelling type + - Household size group + reference: + - title: Kansas LIEAP FY2026 Benefit Matrix, Natural gas (Benefit Adjustment @ 80% table) + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/KS_BenefitMatrix_2026.pdf#page=1 + - title: Kansas LIEAP FY2025 Benefit Matrix, Natural gas (Ben Adj 100.0%) + href: https://liheapch.acf.gov/docs/2025/benefits-matricies/KS_BenefitMatrix_2025.pdf#page=1 + - title: Kansas LIHEAP FY2026 State Plan, Section 2.5, pages 8-9 (benefit variables) + href: https://liheapch.acf.gov/docs/2026/state-plans/KS_Plan_2026.pdf#page=8 + - title: Kansas LIHEAP FY2025 State Plan, Section 2.5, pages 8-9 (benefit variables) + href: https://liheapch.acf.gov/docs/2025/state-plans/KS_Plan_2025.pdf#page=8 + - title: KEESM 13410 Benefit Levels, October 2024 edition + href: https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13400.htm + - title: KEESM 13410 Benefit Levels, January 2026 edition + href: https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13400.htm diff --git a/policyengine_us/parameters/gov/states/ks/dcf/liheap/payment/matrix/other.yaml b/policyengine_us/parameters/gov/states/ks/dcf/liheap/payment/matrix/other.yaml new file mode 100644 index 00000000000..60d171fc3fa --- /dev/null +++ b/policyengine_us/parameters/gov/states/ks/dcf/liheap/payment/matrix/other.yaml @@ -0,0 +1,152 @@ +description: Kansas provides this annual benefit to households heating primarily with other fuels, by one-month income band, dwelling type and household size group, under the Low Income Energy Assistance Program. + +# Income band 1: one-month income $0 to $899 +1: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 848 + 2025-10-01: 639 + 2: + 2024-10-01: 970 + 2025-10-01: 731 + DUPLEX: + 1: + 2024-10-01: 636 + 2025-10-01: 479 + 2: + 2024-10-01: 728 + 2025-10-01: 548 + APARTMENT: + 1: + 2024-10-01: 424 + 2025-10-01: 319 + 2: + 2024-10-01: 485 + 2025-10-01: 365 + TRAILER_OTHER: + 1: + 2024-10-01: 212 + 2025-10-01: 160 + 2: + 2024-10-01: 243 + 2025-10-01: 183 + +# Income band 2: one-month income $900 to $1,199 +2: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 763 + 2025-10-01: 575 + 2: + 2024-10-01: 873 + 2025-10-01: 658 + DUPLEX: + 1: + 2024-10-01: 572 + 2025-10-01: 431 + 2: + 2024-10-01: 655 + 2025-10-01: 493 + APARTMENT: + 1: + 2024-10-01: 382 + 2025-10-01: 287 + 2: + 2024-10-01: 437 + 2025-10-01: 329 + TRAILER_OTHER: + 1: + 2024-10-01: 191 + 2025-10-01: 144 + 2: + 2024-10-01: 218 + 2025-10-01: 164 + +# Income band 3: one-month income $1,200 to $1,699 +3: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 678 + 2025-10-01: 511 + 2: + 2024-10-01: 776 + 2025-10-01: 585 + DUPLEX: + 1: + 2024-10-01: 509 + 2025-10-01: 383 + 2: + 2024-10-01: 582 + 2025-10-01: 439 + APARTMENT: + 1: + 2024-10-01: 339 + 2025-10-01: 256 + 2: + 2024-10-01: 388 + 2025-10-01: 292 + TRAILER_OTHER: + 1: + 2024-10-01: 170 + 2025-10-01: 128 + 2: + 2024-10-01: 194 + 2025-10-01: 146 + +# Income band 4: one-month income $1,700 and over +4: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 594 + 2025-10-01: 447 + 2: + 2024-10-01: 679 + 2025-10-01: 512 + DUPLEX: + 1: + 2024-10-01: 445 + 2025-10-01: 335 + 2: + 2024-10-01: 509 + 2025-10-01: 384 + APARTMENT: + 1: + 2024-10-01: 297 + 2025-10-01: 224 + 2: + 2024-10-01: 340 + 2025-10-01: 256 + TRAILER_OTHER: + 1: + 2024-10-01: 148 + 2025-10-01: 112 + 2: + 2024-10-01: 170 + 2025-10-01: 128 + +metadata: + propagate_metadata_to_children: true + period: year + unit: currency-USD + label: Kansas LIEAP other fuels benefit matrix + breakdown: + - range(1, 5) # one-month income band + - ks_liheap_dwelling_type + - range(1, 3) # household size group (1 = size 1-4, 2 = size 5+) + breakdown_labels: + - One-month income band + - Dwelling type + - Household size group + reference: + - title: Kansas LIEAP FY2026 Benefit Matrix, Other fuels (Benefit Adjustment @ 80% table) + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/KS_BenefitMatrix_2026.pdf#page=4 + - title: Kansas LIEAP FY2025 Benefit Matrix, Other fuels (Ben Adj 100.0%) + href: https://liheapch.acf.gov/docs/2025/benefits-matricies/KS_BenefitMatrix_2025.pdf#page=3 + - title: Kansas LIHEAP FY2026 State Plan, Section 2.5, pages 8-9 (benefit variables) + href: https://liheapch.acf.gov/docs/2026/state-plans/KS_Plan_2026.pdf#page=8 + - title: Kansas LIHEAP FY2025 State Plan, Section 2.5, pages 8-9 (benefit variables) + href: https://liheapch.acf.gov/docs/2025/state-plans/KS_Plan_2025.pdf#page=8 + - title: KEESM 13410 Benefit Levels, October 2024 edition + href: https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13400.htm + - title: KEESM 13410 Benefit Levels, January 2026 edition + href: https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13400.htm diff --git a/policyengine_us/parameters/gov/states/ks/dcf/liheap/payment/matrix/propane.yaml b/policyengine_us/parameters/gov/states/ks/dcf/liheap/payment/matrix/propane.yaml new file mode 100644 index 00000000000..a9ab2a86ff4 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ks/dcf/liheap/payment/matrix/propane.yaml @@ -0,0 +1,1202 @@ +description: Kansas provides this annual benefit to households heating primarily with propane, by one-month income band, utility rate tier, dwelling type and household size group, under the Low Income Energy Assistance Program. + +# Income band 1: one-month income $0 to $899 +1: + A: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 570 + 2025-10-01: 430 + 2: + 2024-10-01: 652 + 2025-10-01: 491 + DUPLEX: + 1: + 2024-10-01: 428 + 2025-10-01: 322 + 2: + 2024-10-01: 489 + 2025-10-01: 368 + APARTMENT: + 1: + 2024-10-01: 285 + 2025-10-01: 215 + 2: + 2024-10-01: 326 + 2025-10-01: 246 + TRAILER_OTHER: + 1: + 2024-10-01: 143 + 2025-10-01: 107 + 2: + 2024-10-01: 163 + 2025-10-01: 123 + B: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 639 + 2025-10-01: 482 + 2: + 2024-10-01: 731 + 2025-10-01: 550 + DUPLEX: + 1: + 2024-10-01: 479 + 2025-10-01: 361 + 2: + 2024-10-01: 548 + 2025-10-01: 413 + APARTMENT: + 1: + 2024-10-01: 320 + 2025-10-01: 241 + 2: + 2024-10-01: 366 + 2025-10-01: 275 + TRAILER_OTHER: + 1: + 2024-10-01: 160 + 2025-10-01: 120 + 2: + 2024-10-01: 183 + 2025-10-01: 138 + C: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 675 + 2025-10-01: 509 + 2: + 2024-10-01: 772 + 2025-10-01: 582 + DUPLEX: + 1: + 2024-10-01: 506 + 2025-10-01: 382 + 2: + 2024-10-01: 579 + 2025-10-01: 436 + APARTMENT: + 1: + 2024-10-01: 338 + 2025-10-01: 254 + 2: + 2024-10-01: 386 + 2025-10-01: 291 + TRAILER_OTHER: + 1: + 2024-10-01: 169 + 2025-10-01: 127 + 2: + 2024-10-01: 193 + 2025-10-01: 145 + D: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 712 + 2025-10-01: 537 + 2: + 2024-10-01: 815 + 2025-10-01: 614 + DUPLEX: + 1: + 2024-10-01: 534 + 2025-10-01: 403 + 2: + 2024-10-01: 611 + 2025-10-01: 460 + APARTMENT: + 1: + 2024-10-01: 356 + 2025-10-01: 268 + 2: + 2024-10-01: 408 + 2025-10-01: 307 + TRAILER_OTHER: + 1: + 2024-10-01: 178 + 2025-10-01: 134 + 2: + 2024-10-01: 204 + 2025-10-01: 153 + E: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 733 + 2025-10-01: 553 + 2: + 2024-10-01: 839 + 2025-10-01: 632 + DUPLEX: + 1: + 2024-10-01: 550 + 2025-10-01: 415 + 2: + 2024-10-01: 629 + 2025-10-01: 474 + APARTMENT: + 1: + 2024-10-01: 367 + 2025-10-01: 276 + 2: + 2024-10-01: 420 + 2025-10-01: 316 + TRAILER_OTHER: + 1: + 2024-10-01: 183 + 2025-10-01: 138 + 2: + 2024-10-01: 210 + 2025-10-01: 158 + F: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 751 + 2025-10-01: 566 + 2: + 2024-10-01: 859 + 2025-10-01: 647 + DUPLEX: + 1: + 2024-10-01: 563 + 2025-10-01: 424 + 2: + 2024-10-01: 644 + 2025-10-01: 485 + APARTMENT: + 1: + 2024-10-01: 376 + 2025-10-01: 283 + 2: + 2024-10-01: 430 + 2025-10-01: 324 + TRAILER_OTHER: + 1: + 2024-10-01: 188 + 2025-10-01: 141 + 2: + 2024-10-01: 215 + 2025-10-01: 162 + G: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 772 + 2025-10-01: 582 + 2: + 2024-10-01: 883 + 2025-10-01: 666 + DUPLEX: + 1: + 2024-10-01: 579 + 2025-10-01: 436 + 2: + 2024-10-01: 662 + 2025-10-01: 499 + APARTMENT: + 1: + 2024-10-01: 386 + 2025-10-01: 291 + 2: + 2024-10-01: 442 + 2025-10-01: 333 + TRAILER_OTHER: + 1: + 2024-10-01: 193 + 2025-10-01: 145 + 2: + 2024-10-01: 221 + 2025-10-01: 166 + H: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 812 + 2025-10-01: 612 + 2: + 2024-10-01: 929 + 2025-10-01: 700 + DUPLEX: + 1: + 2024-10-01: 609 + 2025-10-01: 459 + 2: + 2024-10-01: 697 + 2025-10-01: 525 + APARTMENT: + 1: + 2024-10-01: 406 + 2025-10-01: 306 + 2: + 2024-10-01: 465 + 2025-10-01: 350 + TRAILER_OTHER: + 1: + 2024-10-01: 203 + 2025-10-01: 153 + 2: + 2024-10-01: 232 + 2025-10-01: 175 + I: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 865 + 2025-10-01: 652 + 2: + 2024-10-01: 990 + 2025-10-01: 746 + DUPLEX: + 1: + 2024-10-01: 649 + 2025-10-01: 489 + 2: + 2024-10-01: 743 + 2025-10-01: 559 + APARTMENT: + 1: + 2024-10-01: 433 + 2025-10-01: 326 + 2: + 2024-10-01: 495 + 2025-10-01: 373 + TRAILER_OTHER: + 1: + 2024-10-01: 216 + 2025-10-01: 163 + 2: + 2024-10-01: 248 + 2025-10-01: 186 + J: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_286 + 2025-10-01: 969 + 2: + 2024-10-01: 1_472 + 2025-10-01: 1_109 + DUPLEX: + 1: + 2024-10-01: 965 + 2025-10-01: 727 + 2: + 2024-10-01: 1_104 + 2025-10-01: 832 + APARTMENT: + 1: + 2024-10-01: 643 + 2025-10-01: 484 + 2: + 2024-10-01: 736 + 2025-10-01: 554 + TRAILER_OTHER: + 1: + 2024-10-01: 322 + 2025-10-01: 242 + 2: + 2024-10-01: 368 + 2025-10-01: 277 + +# Income band 2: one-month income $900 to $1,199 +2: + A: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 513 + 2025-10-01: 387 + 2: + 2024-10-01: 587 + 2025-10-01: 442 + DUPLEX: + 1: + 2024-10-01: 385 + 2025-10-01: 290 + 2: + 2024-10-01: 440 + 2025-10-01: 332 + APARTMENT: + 1: + 2024-10-01: 257 + 2025-10-01: 193 + 2: + 2024-10-01: 293 + 2025-10-01: 221 + TRAILER_OTHER: + 1: + 2024-10-01: 128 + 2025-10-01: 97 + 2: + 2024-10-01: 147 + 2025-10-01: 111 + B: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 575 + 2025-10-01: 433 + 2: + 2024-10-01: 658 + 2025-10-01: 495 + DUPLEX: + 1: + 2024-10-01: 431 + 2025-10-01: 325 + 2: + 2024-10-01: 493 + 2025-10-01: 372 + APARTMENT: + 1: + 2024-10-01: 288 + 2025-10-01: 217 + 2: + 2024-10-01: 329 + 2025-10-01: 248 + TRAILER_OTHER: + 1: + 2024-10-01: 144 + 2025-10-01: 108 + 2: + 2024-10-01: 164 + 2025-10-01: 124 + C: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 608 + 2025-10-01: 458 + 2: + 2024-10-01: 695 + 2025-10-01: 523 + DUPLEX: + 1: + 2024-10-01: 456 + 2025-10-01: 343 + 2: + 2024-10-01: 521 + 2025-10-01: 393 + APARTMENT: + 1: + 2024-10-01: 304 + 2025-10-01: 229 + 2: + 2024-10-01: 347 + 2025-10-01: 262 + TRAILER_OTHER: + 1: + 2024-10-01: 152 + 2025-10-01: 114 + 2: + 2024-10-01: 174 + 2025-10-01: 131 + D: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 641 + 2025-10-01: 483 + 2: + 2024-10-01: 734 + 2025-10-01: 552 + DUPLEX: + 1: + 2024-10-01: 481 + 2025-10-01: 362 + 2: + 2024-10-01: 550 + 2025-10-01: 414 + APARTMENT: + 1: + 2024-10-01: 320 + 2025-10-01: 242 + 2: + 2024-10-01: 367 + 2025-10-01: 276 + TRAILER_OTHER: + 1: + 2024-10-01: 160 + 2025-10-01: 121 + 2: + 2024-10-01: 183 + 2025-10-01: 138 + E: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 660 + 2025-10-01: 498 + 2: + 2024-10-01: 755 + 2025-10-01: 569 + DUPLEX: + 1: + 2024-10-01: 495 + 2025-10-01: 373 + 2: + 2024-10-01: 566 + 2025-10-01: 427 + APARTMENT: + 1: + 2024-10-01: 330 + 2025-10-01: 249 + 2: + 2024-10-01: 378 + 2025-10-01: 284 + TRAILER_OTHER: + 1: + 2024-10-01: 165 + 2025-10-01: 124 + 2: + 2024-10-01: 189 + 2025-10-01: 142 + F: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 676 + 2025-10-01: 509 + 2: + 2024-10-01: 773 + 2025-10-01: 582 + DUPLEX: + 1: + 2024-10-01: 507 + 2025-10-01: 382 + 2: + 2024-10-01: 580 + 2025-10-01: 437 + APARTMENT: + 1: + 2024-10-01: 338 + 2025-10-01: 255 + 2: + 2024-10-01: 387 + 2025-10-01: 291 + TRAILER_OTHER: + 1: + 2024-10-01: 169 + 2025-10-01: 127 + 2: + 2024-10-01: 193 + 2025-10-01: 146 + G: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 695 + 2025-10-01: 523 + 2: + 2024-10-01: 795 + 2025-10-01: 599 + DUPLEX: + 1: + 2024-10-01: 521 + 2025-10-01: 393 + 2: + 2024-10-01: 596 + 2025-10-01: 449 + APARTMENT: + 1: + 2024-10-01: 347 + 2025-10-01: 262 + 2: + 2024-10-01: 397 + 2025-10-01: 300 + TRAILER_OTHER: + 1: + 2024-10-01: 174 + 2025-10-01: 131 + 2: + 2024-10-01: 199 + 2025-10-01: 150 + H: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 731 + 2025-10-01: 551 + 2: + 2024-10-01: 836 + 2025-10-01: 630 + DUPLEX: + 1: + 2024-10-01: 548 + 2025-10-01: 413 + 2: + 2024-10-01: 627 + 2025-10-01: 473 + APARTMENT: + 1: + 2024-10-01: 365 + 2025-10-01: 275 + 2: + 2024-10-01: 418 + 2025-10-01: 315 + TRAILER_OTHER: + 1: + 2024-10-01: 183 + 2025-10-01: 138 + 2: + 2024-10-01: 209 + 2025-10-01: 158 + I: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 779 + 2025-10-01: 587 + 2: + 2024-10-01: 891 + 2025-10-01: 671 + DUPLEX: + 1: + 2024-10-01: 584 + 2025-10-01: 440 + 2: + 2024-10-01: 668 + 2025-10-01: 503 + APARTMENT: + 1: + 2024-10-01: 389 + 2025-10-01: 293 + 2: + 2024-10-01: 446 + 2025-10-01: 336 + TRAILER_OTHER: + 1: + 2024-10-01: 195 + 2025-10-01: 147 + 2: + 2024-10-01: 223 + 2025-10-01: 168 + J: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_157 + 2025-10-01: 872 + 2: + 2024-10-01: 1_325 + 2025-10-01: 998 + DUPLEX: + 1: + 2024-10-01: 868 + 2025-10-01: 654 + 2: + 2024-10-01: 994 + 2025-10-01: 748 + APARTMENT: + 1: + 2024-10-01: 579 + 2025-10-01: 436 + 2: + 2024-10-01: 662 + 2025-10-01: 499 + TRAILER_OTHER: + 1: + 2024-10-01: 289 + 2025-10-01: 218 + 2: + 2024-10-01: 331 + 2025-10-01: 249 + +# Income band 3: one-month income $1,200 to $1,699 +3: + A: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 456 + 2025-10-01: 344 + 2: + 2024-10-01: 522 + 2025-10-01: 393 + DUPLEX: + 1: + 2024-10-01: 342 + 2025-10-01: 258 + 2: + 2024-10-01: 391 + 2025-10-01: 295 + APARTMENT: + 1: + 2024-10-01: 228 + 2025-10-01: 172 + 2: + 2024-10-01: 261 + 2025-10-01: 196 + TRAILER_OTHER: + 1: + 2024-10-01: 114 + 2025-10-01: 86 + 2: + 2024-10-01: 130 + 2025-10-01: 98 + B: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 511 + 2025-10-01: 385 + 2: + 2024-10-01: 585 + 2025-10-01: 440 + DUPLEX: + 1: + 2024-10-01: 383 + 2025-10-01: 289 + 2: + 2024-10-01: 439 + 2025-10-01: 330 + APARTMENT: + 1: + 2024-10-01: 256 + 2025-10-01: 193 + 2: + 2024-10-01: 292 + 2025-10-01: 220 + TRAILER_OTHER: + 1: + 2024-10-01: 128 + 2025-10-01: 96 + 2: + 2024-10-01: 146 + 2025-10-01: 110 + C: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 540 + 2025-10-01: 407 + 2: + 2024-10-01: 618 + 2025-10-01: 465 + DUPLEX: + 1: + 2024-10-01: 405 + 2025-10-01: 305 + 2: + 2024-10-01: 463 + 2025-10-01: 349 + APARTMENT: + 1: + 2024-10-01: 270 + 2025-10-01: 204 + 2: + 2024-10-01: 309 + 2025-10-01: 233 + TRAILER_OTHER: + 1: + 2024-10-01: 135 + 2025-10-01: 102 + 2: + 2024-10-01: 154 + 2025-10-01: 116 + D: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 570 + 2025-10-01: 429 + 2: + 2024-10-01: 652 + 2025-10-01: 491 + DUPLEX: + 1: + 2024-10-01: 427 + 2025-10-01: 322 + 2: + 2024-10-01: 489 + 2025-10-01: 368 + APARTMENT: + 1: + 2024-10-01: 285 + 2025-10-01: 215 + 2: + 2024-10-01: 326 + 2025-10-01: 245 + TRAILER_OTHER: + 1: + 2024-10-01: 142 + 2025-10-01: 107 + 2: + 2024-10-01: 163 + 2025-10-01: 123 + E: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 586 + 2025-10-01: 442 + 2: + 2024-10-01: 671 + 2025-10-01: 506 + DUPLEX: + 1: + 2024-10-01: 440 + 2025-10-01: 332 + 2: + 2024-10-01: 503 + 2025-10-01: 379 + APARTMENT: + 1: + 2024-10-01: 293 + 2025-10-01: 221 + 2: + 2024-10-01: 336 + 2025-10-01: 253 + TRAILER_OTHER: + 1: + 2024-10-01: 147 + 2025-10-01: 111 + 2: + 2024-10-01: 168 + 2025-10-01: 126 + F: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 601 + 2025-10-01: 452 + 2: + 2024-10-01: 687 + 2025-10-01: 518 + DUPLEX: + 1: + 2024-10-01: 451 + 2025-10-01: 339 + 2: + 2024-10-01: 515 + 2025-10-01: 388 + APARTMENT: + 1: + 2024-10-01: 300 + 2025-10-01: 226 + 2: + 2024-10-01: 344 + 2025-10-01: 259 + TRAILER_OTHER: + 1: + 2024-10-01: 150 + 2025-10-01: 113 + 2: + 2024-10-01: 172 + 2025-10-01: 129 + G: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 618 + 2025-10-01: 465 + 2: + 2024-10-01: 706 + 2025-10-01: 532 + DUPLEX: + 1: + 2024-10-01: 463 + 2025-10-01: 349 + 2: + 2024-10-01: 530 + 2025-10-01: 399 + APARTMENT: + 1: + 2024-10-01: 309 + 2025-10-01: 233 + 2: + 2024-10-01: 353 + 2025-10-01: 266 + TRAILER_OTHER: + 1: + 2024-10-01: 154 + 2025-10-01: 116 + 2: + 2024-10-01: 177 + 2025-10-01: 133 + H: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 650 + 2025-10-01: 490 + 2: + 2024-10-01: 743 + 2025-10-01: 560 + DUPLEX: + 1: + 2024-10-01: 487 + 2025-10-01: 367 + 2: + 2024-10-01: 557 + 2025-10-01: 420 + APARTMENT: + 1: + 2024-10-01: 325 + 2025-10-01: 245 + 2: + 2024-10-01: 372 + 2025-10-01: 280 + TRAILER_OTHER: + 1: + 2024-10-01: 162 + 2025-10-01: 122 + 2: + 2024-10-01: 186 + 2025-10-01: 140 + I: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 692 + 2025-10-01: 522 + 2: + 2024-10-01: 792 + 2025-10-01: 596 + DUPLEX: + 1: + 2024-10-01: 519 + 2025-10-01: 391 + 2: + 2024-10-01: 594 + 2025-10-01: 447 + APARTMENT: + 1: + 2024-10-01: 346 + 2025-10-01: 261 + 2: + 2024-10-01: 396 + 2025-10-01: 298 + TRAILER_OTHER: + 1: + 2024-10-01: 173 + 2025-10-01: 130 + 2: + 2024-10-01: 198 + 2025-10-01: 149 + J: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 1_029 + 2025-10-01: 775 + 2: + 2024-10-01: 1_178 + 2025-10-01: 887 + DUPLEX: + 1: + 2024-10-01: 772 + 2025-10-01: 581 + 2: + 2024-10-01: 883 + 2025-10-01: 665 + APARTMENT: + 1: + 2024-10-01: 514 + 2025-10-01: 388 + 2: + 2024-10-01: 589 + 2025-10-01: 444 + TRAILER_OTHER: + 1: + 2024-10-01: 257 + 2025-10-01: 194 + 2: + 2024-10-01: 294 + 2025-10-01: 222 + +# Income band 4: one-month income $1,700 and over +4: + A: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 399 + 2025-10-01: 301 + 2: + 2024-10-01: 456 + 2025-10-01: 344 + DUPLEX: + 1: + 2024-10-01: 299 + 2025-10-01: 226 + 2: + 2024-10-01: 342 + 2025-10-01: 258 + APARTMENT: + 1: + 2024-10-01: 200 + 2025-10-01: 150 + 2: + 2024-10-01: 228 + 2025-10-01: 172 + TRAILER_OTHER: + 1: + 2024-10-01: 100 + 2025-10-01: 75 + 2: + 2024-10-01: 114 + 2025-10-01: 86 + B: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 447 + 2025-10-01: 337 + 2: + 2024-10-01: 512 + 2025-10-01: 385 + DUPLEX: + 1: + 2024-10-01: 335 + 2025-10-01: 253 + 2: + 2024-10-01: 384 + 2025-10-01: 289 + APARTMENT: + 1: + 2024-10-01: 224 + 2025-10-01: 169 + 2: + 2024-10-01: 256 + 2025-10-01: 193 + TRAILER_OTHER: + 1: + 2024-10-01: 112 + 2025-10-01: 84 + 2: + 2024-10-01: 128 + 2025-10-01: 96 + C: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 473 + 2025-10-01: 356 + 2: + 2024-10-01: 540 + 2025-10-01: 407 + DUPLEX: + 1: + 2024-10-01: 354 + 2025-10-01: 267 + 2: + 2024-10-01: 405 + 2025-10-01: 305 + APARTMENT: + 1: + 2024-10-01: 236 + 2025-10-01: 178 + 2: + 2024-10-01: 270 + 2025-10-01: 204 + TRAILER_OTHER: + 1: + 2024-10-01: 118 + 2025-10-01: 89 + 2: + 2024-10-01: 135 + 2025-10-01: 102 + D: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 498 + 2025-10-01: 376 + 2: + 2024-10-01: 571 + 2025-10-01: 430 + DUPLEX: + 1: + 2024-10-01: 374 + 2025-10-01: 282 + 2: + 2024-10-01: 428 + 2025-10-01: 322 + APARTMENT: + 1: + 2024-10-01: 249 + 2025-10-01: 188 + 2: + 2024-10-01: 285 + 2025-10-01: 215 + TRAILER_OTHER: + 1: + 2024-10-01: 125 + 2025-10-01: 94 + 2: + 2024-10-01: 143 + 2025-10-01: 107 + E: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 513 + 2025-10-01: 387 + 2: + 2024-10-01: 587 + 2025-10-01: 442 + DUPLEX: + 1: + 2024-10-01: 385 + 2025-10-01: 290 + 2: + 2024-10-01: 440 + 2025-10-01: 332 + APARTMENT: + 1: + 2024-10-01: 257 + 2025-10-01: 193 + 2: + 2024-10-01: 294 + 2025-10-01: 221 + TRAILER_OTHER: + 1: + 2024-10-01: 128 + 2025-10-01: 97 + 2: + 2024-10-01: 147 + 2025-10-01: 111 + F: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 526 + 2025-10-01: 396 + 2: + 2024-10-01: 601 + 2025-10-01: 453 + DUPLEX: + 1: + 2024-10-01: 394 + 2025-10-01: 297 + 2: + 2024-10-01: 451 + 2025-10-01: 340 + APARTMENT: + 1: + 2024-10-01: 263 + 2025-10-01: 198 + 2: + 2024-10-01: 301 + 2025-10-01: 227 + TRAILER_OTHER: + 1: + 2024-10-01: 131 + 2025-10-01: 99 + 2: + 2024-10-01: 150 + 2025-10-01: 113 + G: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 540 + 2025-10-01: 407 + 2: + 2024-10-01: 618 + 2025-10-01: 466 + DUPLEX: + 1: + 2024-10-01: 405 + 2025-10-01: 305 + 2: + 2024-10-01: 464 + 2025-10-01: 349 + APARTMENT: + 1: + 2024-10-01: 270 + 2025-10-01: 204 + 2: + 2024-10-01: 309 + 2025-10-01: 233 + TRAILER_OTHER: + 1: + 2024-10-01: 135 + 2025-10-01: 102 + 2: + 2024-10-01: 155 + 2025-10-01: 116 + H: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 568 + 2025-10-01: 428 + 2: + 2024-10-01: 650 + 2025-10-01: 490 + DUPLEX: + 1: + 2024-10-01: 426 + 2025-10-01: 321 + 2: + 2024-10-01: 488 + 2025-10-01: 368 + APARTMENT: + 1: + 2024-10-01: 284 + 2025-10-01: 214 + 2: + 2024-10-01: 325 + 2025-10-01: 245 + TRAILER_OTHER: + 1: + 2024-10-01: 142 + 2025-10-01: 107 + 2: + 2024-10-01: 163 + 2025-10-01: 123 + I: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 606 + 2025-10-01: 456 + 2: + 2024-10-01: 693 + 2025-10-01: 522 + DUPLEX: + 1: + 2024-10-01: 454 + 2025-10-01: 342 + 2: + 2024-10-01: 520 + 2025-10-01: 391 + APARTMENT: + 1: + 2024-10-01: 303 + 2025-10-01: 228 + 2: + 2024-10-01: 347 + 2025-10-01: 261 + TRAILER_OTHER: + 1: + 2024-10-01: 151 + 2025-10-01: 114 + 2: + 2024-10-01: 173 + 2025-10-01: 130 + J: + HOUSE_MODULAR_MOBILE: + 1: + 2024-10-01: 900 + 2025-10-01: 678 + 2: + 2024-10-01: 1_030 + 2025-10-01: 776 + DUPLEX: + 1: + 2024-10-01: 675 + 2025-10-01: 509 + 2: + 2024-10-01: 773 + 2025-10-01: 582 + APARTMENT: + 1: + 2024-10-01: 450 + 2025-10-01: 339 + 2: + 2024-10-01: 515 + 2025-10-01: 388 + TRAILER_OTHER: + 1: + 2024-10-01: 225 + 2025-10-01: 170 + 2: + 2024-10-01: 258 + 2025-10-01: 194 + +metadata: + propagate_metadata_to_children: true + period: year + unit: currency-USD + label: Kansas LIEAP propane benefit matrix + breakdown: + - range(1, 5) # one-month income band + - ks_liheap_utility_rate_tier + - ks_liheap_dwelling_type + - range(1, 3) # household size group (1 = size 1-4, 2 = size 5+) + breakdown_labels: + - One-month income band + - Utility rate tier + - Dwelling type + - Household size group + reference: + - title: Kansas LIEAP FY2026 Benefit Matrix, Propane (Benefit Adjustment @ 80% table) + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/KS_BenefitMatrix_2026.pdf#page=3 + - title: Kansas LIEAP FY2025 Benefit Matrix, Propane (Ben Adj 100.0%; pages 2-3) + href: https://liheapch.acf.gov/docs/2025/benefits-matricies/KS_BenefitMatrix_2025.pdf#page=2 + - title: Kansas LIHEAP FY2026 State Plan, Section 2.5, pages 8-9 (benefit variables) + href: https://liheapch.acf.gov/docs/2026/state-plans/KS_Plan_2026.pdf#page=8 + - title: Kansas LIHEAP FY2025 State Plan, Section 2.5, pages 8-9 (benefit variables) + href: https://liheapch.acf.gov/docs/2025/state-plans/KS_Plan_2025.pdf#page=8 + - title: KEESM 13410 Benefit Levels, October 2024 edition + href: https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13400.htm + - title: KEESM 13410 Benefit Levels, January 2026 edition + href: https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13400.htm diff --git a/policyengine_us/parameters/gov/states/ks/dcf/liheap/payment/min_benefit.yaml b/policyengine_us/parameters/gov/states/ks/dcf/liheap/payment/min_benefit.yaml new file mode 100644 index 00000000000..28c8361371e --- /dev/null +++ b/policyengine_us/parameters/gov/states/ks/dcf/liheap/payment/min_benefit.yaml @@ -0,0 +1,26 @@ +description: Kansas provides at least this annual benefit to eligible households under the Low Income Energy Assistance Program. +# Plan Section 2.6 reports a minimum and maximum benefit of $100 and $2,232 +# for FY2025 and $130 and $4,301 for FY2026. The FY2025 figures equal the +# FY2025 matrix minimum and maximum. The FY2026 matrix's adjusted 80% column +# ("Benefit Adjustment @ 80%") ranges from $75 to $1,682. Applying the plan's +# $130 floor yields $130 to $1,682. Cells below a separately applied minimum +# do not by themselves establish a schedule error. The plan's estimated +# $4,301 maximum remains unexplained by either the adjusted matrix or its +# $2,102 unadjusted maximum. No adjustment is inferred from that difference. +# Each plan's maximum exceeds or equals every selected matrix cell, so a cap +# at that amount cannot bind. +values: + 2024-10-01: 100 + 2025-10-01: 130 + +metadata: + unit: currency-USD + period: year + label: Kansas LIEAP minimum benefit + reference: + - title: Kansas LIHEAP FY2026 State Plan, Section 2.6 (minimum benefit $130, maximum benefit $4,301) + href: https://liheapch.acf.gov/docs/2026/state-plans/KS_Plan_2026.pdf#page=9 + - title: Kansas LIHEAP FY2025 State Plan, Section 2.6 (minimum benefit $100, maximum benefit $2,232) + href: https://liheapch.acf.gov/docs/2025/state-plans/KS_Plan_2025.pdf#page=9 + - title: LIHEAP Clearinghouse Kansas state profile (heating $130 minimum, $4,301 maximum) + href: https://liheapch.acf.gov/profiles/Kansas.htm diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 81c10bc47b6..f1829ab2688 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -802,7 +802,7 @@ programs: category: Benefits agency: HHS status: partial - coverage: OR, DC, Riverside County, MA, IL, TX + coverage: OR, DC, Riverside County, MA, IL, KS, TX state_implementations: - state: OR status: in_progress @@ -823,6 +823,14 @@ programs: name: Illinois LIHEAP full_name: Illinois Low Income Home Energy Assistance Program variable: il_liheap + - state: KS + status: partial + name: Kansas LIEAP + full_name: Kansas Low Income Energy Assistance Program + variable: ks_liheap + parameter_prefix: gov.states.ks.dcf.liheap + verified_years: "2025-2026" + notes: FY2025-FY2026 regular heating only. The FY2026 $130 minimum comes from the plan's estimated benefit levels; crisis, cooling and weatherization assistance are out of scope. - state: TX status: partial name: Texas CEAP diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/eligibility/ks_liheap_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/eligibility/ks_liheap_eligible.yaml new file mode 100644 index 00000000000..c8f7afdc1a3 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/eligibility/ks_liheap_eligible.yaml @@ -0,0 +1,145 @@ +# Kansas LIEAP overall eligibility: Kansas residence (KEESM 13310), income +# (KEESM 13100), at least one citizen or qualified-alien member (KEESM 13330), +# energy vulnerability - responsible for the primary heating cost, so a home +# with no heating is not vulnerable (KEESM 13340), and not a renter in +# subsidized housing whose heating fuel costs are included in the rent +# (KEESM 13340; KS LIHEAP State Plan FY2026 2.3, #page=8). No asset test +# (plan 2.3). +# KEESM sections refer to the October 2024 and January 2026 editions: +# https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/ and +# https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/ (keesm
.htm). + +- name: Case 1, the same household in Missouri is not eligible. + period: 2026 + input: + people: + person1: + age: 40 + employment_income: 15_000 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + households: + household: + members: [person1] + state_code: MO + output: + ks_liheap_eligible: false + +- name: Case 2, household with no citizen or qualified member is not eligible. + period: 2026 + input: + people: + person1: + age: 30 + immigration_status: UNDOCUMENTED + employment_income: 12_000 + person2: + age: 28 + immigration_status: UNDOCUMENTED + spm_units: + spm_unit: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + households: + household: + members: [person1, person2] + state_code: KS + output: + ks_liheap_eligible: false + +- name: Case 3, mixed-status household with one citizen member is eligible. + period: 2026 + input: + people: + person1: + age: 30 + immigration_status: UNDOCUMENTED + employment_income: 12_000 + person2: + age: 4 + immigration_status: CITIZEN + spm_units: + spm_unit: + members: [person1, person2] + ks_tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 1_200 + households: + household: + members: [person1, person2] + state_code: KS + output: + # KEESM 13330: at least one citizen (the child); size 1 limit 23,472 > + # 12,000 (the parent's income counts). + ks_liheap_eligible: true + +- name: Case 4, subsidized-housing renter who pays heat separately is eligible. + period: 2026 + input: + people: + person1: + age: 40 + employment_income: 15_000 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + receives_housing_assistance: true + heat_expense_included_in_rent: false + households: + household: + members: [person1] + state_code: KS + output: + # KEESM 13340: pays heating costs directly to a utility -> vulnerable. + ks_liheap_eligible: true + +- name: Case 5, no asset test so large savings do not disqualify. + period: 2026 + input: + people: + person1: + age: 66 + social_security: 14_000 + spm_units: + spm_unit: + members: [person1] + spm_unit_cash_assets: 50_000 + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 1_200 + households: + household: + members: [person1] + state_code: KS + output: + # Plan 2.3: "Do you require an Assets test? No". + ks_liheap_eligible: true + +- name: Case 6, TANF receipt does not waive the household income limit. + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 32_000 + person2: + age: 6 + spm_units: + spm_unit: + members: [person1, person2] + heating_type: PROPANE + bottled_gas_expense: 1_200 + ks_tanf: 1_200 + households: + household: + members: [person1, person2] + state_code: KS + output: + # 2025 season size 2 limit: 1.5 x (15,060 + 5,380) = 30,660 < 33,200 + # gross; verified TANF income still enters the household test (KEESM 13360). + ks_liheap_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/eligibility/ks_liheap_energy_vulnerable.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/eligibility/ks_liheap_energy_vulnerable.yaml new file mode 100644 index 00000000000..379a0fe8b99 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/eligibility/ks_liheap_energy_vulnerable.yaml @@ -0,0 +1,86 @@ +# KEESM 13340, including facts that cannot be inferred from fuel bills. +# KEESM sections refer to the October 2024 and January 2026 editions: +# https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/ and +# https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/ (keesm
.htm). +- name: Case 1, purchased wood qualifies. + period: 2026 + input: + state_code: KS + age: 40 + ks_liheap_countable_income: 10_000 + heating_type: WOOD + wood_expense: 600 + output: + ks_liheap_energy_vulnerable: true + ks_liheap_eligible: true +- name: Case 2, an unknown heating fuel with no cost information does not establish vulnerability. + period: 2026 + input: + state_code: KS + age: 40 + ks_liheap_countable_income: 10_000 + heating_type: UNSPECIFIED + output: + ks_liheap_energy_vulnerable: false + ks_liheap_eligible: false +- name: Case 3, unsubsidized heat included in rent qualifies and is paid from the other-fuel table. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: KS + age: 40 + ks_liheap_countable_income: 10_000 + heat_expense_included_in_rent: true + heating_type: UNSPECIFIED + output: + ks_liheap_energy_vulnerable: true + ks_liheap_eligible: true + # An unspecified fuel uses the Other table: 10,000 / 12 = 833 -> 0-899; + # KS_BenefitMatrix_2026.pdf p.4 (80%) House, size 1-4 = 639; max(639, 130). + ks_liheap_fuel_category: OTHER + ks_liheap: 639 +- name: Case 4, subsidized heat included in rent does not qualify by default. + period: 2026 + input: + state_code: KS + age: 40 + ks_liheap_countable_income: 10_000 + heat_expense_included_in_rent: true + receives_housing_assistance: true + output: + ks_liheap_energy_vulnerable: false + ks_liheap_eligible: false +- name: Case 5, subsidized excess heating charges can establish vulnerability. + period: 2026 + input: + state_code: KS + age: 40 + ks_liheap_countable_income: 10_000 + heat_expense_included_in_rent: true + receives_housing_assistance: true + ks_liheap_energy_vulnerable: true + output: + ks_liheap_energy_vulnerable: true + ks_liheap_eligible: true +- name: Case 6, shared unmetered heat can be explicitly excluded. + period: 2026 + input: + state_code: KS + age: 40 + ks_liheap_countable_income: 10_000 + heat_expense_included_in_rent: true + ks_liheap_energy_vulnerable: false + output: + ks_liheap_energy_vulnerable: false + ks_liheap_eligible: false +- name: Case 7, a homeless household with qualifying prior-address heating debt can qualify. + period: 2026 + input: + state_code: KS + age: 40 + ks_liheap_countable_income: 10_000 + heating_type: NONE + ks_liheap_energy_vulnerable: true + output: + ks_liheap_energy_vulnerable: true + ks_liheap_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/eligibility/ks_liheap_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/eligibility/ks_liheap_income_eligible.yaml new file mode 100644 index 00000000000..be6489efd0f --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/eligibility/ks_liheap_income_eligible.yaml @@ -0,0 +1,99 @@ +# KEESM 13360-13362, October 2024 and January 2026 editions: +# https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13360.htm +# https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13360.htm +# Values annualize the published monthly limits; FY2026 includes rounding. +- name: Case 1, 2025 household size 1, income 0 dollar above the published limit. + period: 2025 + absolute_error_margin: 0.01 + input: + state_code: KS + ks_liheap_household_size: 1 + ks_liheap_countable_income: 22_590 + output: + ks_liheap_income_limit: 22_590 + ks_liheap_income_eligible: true + +- name: Case 2, 2025 household size 1, income 1 dollar above the published limit. + period: 2025 + absolute_error_margin: 0.01 + input: + state_code: KS + ks_liheap_household_size: 1 + ks_liheap_countable_income: 22_591 + output: + ks_liheap_income_limit: 22_590 + ks_liheap_income_eligible: false + +- name: Case 3, 2026 household size 1, income 0 dollar above the published limit. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: KS + ks_liheap_household_size: 1 + ks_liheap_countable_income: 23_472 + output: + ks_liheap_income_limit: 23_472 + ks_liheap_income_eligible: true + +- name: Case 4, 2026 household size 1, income 1 dollar above the published limit. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: KS + ks_liheap_household_size: 1 + ks_liheap_countable_income: 23_473 + output: + ks_liheap_income_limit: 23_472 + ks_liheap_income_eligible: false + +- name: Case 5, 2026 household size 9, income 0 dollar above the published limit. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: KS + ks_liheap_household_size: 9 + ks_liheap_countable_income: 89_484 + output: + ks_liheap_income_limit: 89_484 + ks_liheap_income_eligible: true + +- name: Case 6, 2026 household size 9, income 1 dollar above the published limit. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: KS + ks_liheap_household_size: 9 + ks_liheap_countable_income: 89_485 + output: + ks_liheap_income_limit: 89_484 + ks_liheap_income_eligible: false + +- name: Case 7, snap receipt does not waive the household income limit. + period: 2026 + input: + state_code: KS + ks_liheap_household_size: 2 + ks_liheap_countable_income: 40_000 + snap: 1_200 + output: + ks_liheap_income_eligible: false + +- name: Case 8, ssi receipt does not waive the household income limit. + period: 2026 + input: + state_code: KS + ks_liheap_household_size: 2 + ks_liheap_countable_income: 40_000 + ssi: 1_200 + output: + ks_liheap_income_eligible: false + +- name: Case 9, ks_tanf receipt does not waive the household income limit. + period: 2026 + input: + state_code: KS + ks_liheap_household_size: 2 + ks_liheap_countable_income: 40_000 + ks_tanf: 1_200 + output: + ks_liheap_income_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/eligibility/ks_liheap_income_limit.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/eligibility/ks_liheap_income_limit.yaml new file mode 100644 index 00000000000..004482bb5ba --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/eligibility/ks_liheap_income_limit.yaml @@ -0,0 +1,92 @@ +# KEESM 13362, October 2024 and January 2026 editions: +# https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13360.htm +# https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13360.htm +# Expected amounts below annualize the published monthly limits. Sizes 9 and +# 10 use the published additional-person increment; the final row is outside KS. +- name: Case 1, FY2025 published income limits retain cents for all household sizes. + period: 2025 + absolute_error_margin: 0.01 + input: + state_code: [KS, KS, KS, KS, KS, KS, KS, KS, KS, KS, MO] + ks_liheap_household_size: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1] + output: + ks_liheap_income_limit: [22_590, 30_660, 38_730, 46_800, 54_870, 62_940, 71_010, 79_080, 87_150, 95_220, 0] + +- name: Case 2, FY2026 published income limits round the base and additional-person increment separately. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [KS, KS, KS, KS, KS, KS, KS, KS, KS, KS, MO] + ks_liheap_household_size: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1] + output: + ks_liheap_income_limit: [23_472, 31_728, 39_972, 48_228, 56_472, 64_728, 72_972, 81_228, 89_484, 97_740, 0] + +# Hypothetical reforms ensure the calculation follows the policy parameters +# instead of retaining the baseline dollar amounts in another lookup table. +- name: Case 3, an income-limit rate reform changes the derived threshold. + period: 2026 + absolute_error_margin: 0.01 + input: + gov.states.ks.dcf.liheap.eligibility.fpg_rate: 2 + state_code: KS + ks_liheap_household_size: 1 + output: + # $15,650 * 2 / 12 = $2,608.333... -> $2,608 per month. + ks_liheap_income_limit: 31_296 + +- name: Case 4, a guideline-year lag reform selects an earlier poverty guideline. + period: 2026 + absolute_error_margin: 0.01 + input: + gov.states.ks.dcf.liheap.eligibility.fpg_year_lag: 2 + state_code: KS + ks_liheap_household_size: 1 + output: + # Two-year lag selects 2024: $15,060 * 1.5 / 12 = $1,882.50 -> $1,883. + ks_liheap_income_limit: 22_596 + +- name: Case 5, a cents-precision reform retains the exact FPG amount above eight people. + period: 2026 + absolute_error_margin: 0.01 + input: + gov.states.ks.dcf.liheap.eligibility.rounding_increment: 0.01 + state_code: KS + ks_liheap_household_size: 9 + output: + # ($15,650 + 8 * $5,500) * 1.5 = $89,475. + ks_liheap_income_limit: 89_475 + +- name: Case 6, the separately rounded additional-person rule uses the parameterized breakpoint. + period: 2026 + absolute_error_margin: 0.01 + input: + gov.states.ks.dcf.liheap.eligibility.max_table_size: 6 + state_code: KS + ks_liheap_household_size: 7 + output: + # Six-person $5,394 monthly limit plus rounded $688 increment. + ks_liheap_income_limit: 72_984 + +# These are regression checks on the fallback year selection, not verification +# of Kansas policy outside the supported FY2025-FY2026 seasons. The rate and +# rounding parameters still carry the earliest/latest available policy values. +- name: Case 7, historical fallback guideline year follows the modeled year. + period: 2022 + absolute_error_margin: 0.01 + input: + state_code: KS + ks_liheap_household_size: 1 + output: + # One-year lag: 2021 FPG of $12,880, using the fallback 150% rate. + ks_liheap_income_limit: 19_320 + +- name: Case 8, future fallback guideline year follows the modeled year. + period: 2027 + absolute_error_margin: 0.01 + input: + state_code: KS + ks_liheap_household_size: 1 + output: + # One-year lag: 2026 FPG of $15,960, using the fallback 150% rate. + # $15,960 * 1.5 / 12 = $1,995, so whole-dollar rounding is unchanged. + ks_liheap_income_limit: 23_940 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/income/ks_liheap_countable_earned_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/income/ks_liheap_countable_earned_income.yaml new file mode 100644 index 00000000000..d26339e589c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/income/ks_liheap_countable_earned_income.yaml @@ -0,0 +1,177 @@ +# Kansas LIEAP countable earned income per person (KS LIHEAP State Plan FY2026 +# 1.8-1.9, pages 5-7): gross wages and self-employment income are counted, +# except the earned income of a child under 18. KEESM 13320: a member who is +# or turns 18 in the application month has countable income. +# Modeling simplification: use existing net business income directly, without +# applying KEESM 13360's gross-receipts expense deduction a second time. +# KEESM sections refer to the October 2024 and January 2026 editions: +# https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/ and +# https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/ (keesm
.htm). + +- name: Case 1, adult wages are counted in full. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 24_000 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KS + output: + ks_liheap_countable_earned_income: 24_000 + +- name: Case 2, an 18-year-old's wages are counted. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + employment_income: 18_000 + person2: + age: 18 + employment_income: 5_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: KS + output: + ks_liheap_countable_earned_income: [18_000, 5_000] + ks_liheap_countable_income: 23_000 + +- name: Case 3, unearned income is not part of earned income. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security: 12_000 + pension_income: 6_000 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KS + output: + ks_liheap_countable_earned_income: 0 + +- name: Case 4, FY2025 reported net business income receives no additional deduction. + period: 2025 + absolute_error_margin: 0.01 + input: + state_code: KS + age: 40 + self_employment_income: 24_000 + output: + ks_liheap_countable_earned_income: 24_000 + +- name: Case 5, FY2026 includes regular, SSTB, and farm net income alongside wages. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: KS + age: 40 + employment_income: 12_000 + self_employment_income: 6_000 + sstb_self_employment_income: 3_000 + farm_operations_income: 5_000 + ks_tanf: 0 + output: + ks_liheap_countable_earned_income: 26_000 + ks_liheap_countable_income: 26_000 + +- name: Case 6, a farm loss does not offset wages or other positive business income. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: KS + age: 40 + employment_income: 12_000 + self_employment_income: 6_000 + sstb_self_employment_income: 4_000 + farm_operations_income: -15_000 + output: + ks_liheap_countable_earned_income: 22_000 + +- name: Case 7, an adult with only business losses has no countable earnings. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: KS + age: 40 + self_employment_income: -3_000 + sstb_self_employment_income: -2_000 + farm_operations_income: -1_000 + output: + ks_liheap_countable_earned_income: 0 + +- name: Case 8, child business income is excluded and adult losses do not affect other people. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 12_000 + self_employment_income: -4_000 + person2: + age: 17 + employment_income: 5_000 + self_employment_income: 4_000 + sstb_self_employment_income: 3_000 + farm_operations_income: 2_000 + person3: + age: 18 + self_employment_income: 6_000 + spm_units: + spm_unit: + members: [person1, person2, person3] + ks_tanf: 0 + households: + household: + members: [person1, person2, person3] + state_code: KS + output: + ks_liheap_countable_earned_income: [12_000, 0, 6_000] + ks_liheap_countable_income: 18_000 + +- name: Case 9, partnership and S corporation profit is counted and a loss does not offset wages. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + # 10 an hour, 40 hours a week: 10 * 2,080 = 20,800. + employment_income: 20_800 + partnership_s_corp_income: 9_000 + person2: + age: 43 + employment_income: 20_800 + partnership_s_corp_income: -4_000 + spm_units: + spm_unit: + members: [person1, person2] + ks_tanf: 0 + households: + household: + members: [person1, person2] + state_code: KS + output: + # KEESM 6313: a loss cannot be deducted from other income, so each source + # is floored at zero before the sources are added. + # person1: 20,800 + 9,000 = 29,800. person2: 20,800 + max(-4,000, 0) = 20,800. + ks_liheap_countable_earned_income: [29_800, 20_800] + ks_liheap_countable_income: 50_600 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/income/ks_liheap_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/income/ks_liheap_countable_income.yaml new file mode 100644 index 00000000000..9662fb1dd66 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/income/ks_liheap_countable_income.yaml @@ -0,0 +1,244 @@ +# Kansas LIEAP countable gross income (KS LIHEAP State Plan FY2026 sections +# 1.8-1.9, pages 5-7; KEESM 13320). Counted: wages, self-employment, +# unemployment insurance, SSA benefits, SSI, retirement/pension, TANF, child +# support, alimony, rental income, VA benefits and recurring adult interest. +# Earned income of children under 18 is excluded. Income of other +# household members counts, including non-qualified noncitizens (KEESM 13330). +# All amounts are annual (YEAR variable). +# KEESM sections refer to the October 2024 and January 2026 editions: +# https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/ and +# https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/ (keesm
.htm). + +- name: Case 1, recurring adult interest and dividends are counted. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 20_000 + interest_income: 3_000 + qualified_dividend_income: 2_000 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KS + output: + # 20,000 wages + 3,000 interest + 2,000 dividends (KEESM 13360). + ks_liheap_countable_income: 25_000 + +- name: Case 2, Social Security and SSI are counted. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security: 12_000 + ssi: 3_000 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KS + output: + # 12,000 SSA + 3,000 SSI = 15,000 (plan 1.8: SSA and SSI checked). + ks_liheap_countable_income: 15_000 + +- name: Case 3, unearned income of a child under 18 is still counted. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 38 + employment_income: 18_000 + person2: + age: 12 + social_security: 4_000 + employment_income: 1_000 + spm_units: + spm_unit: + members: [person1, person2] + ks_tanf: 0 + households: + household: + members: [person1, person2] + state_code: KS + output: + # Only the child's *earned* income is excluded (plan 1.9); the child's + # 4,000 SSA survivor benefit counts: 18,000 + 4,000 = 22,000. + ks_liheap_countable_income: 22_000 + +- name: Case 4, other checked income sources are summed. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + self_employment_income: 8_000 + unemployment_compensation: 6_000 + pension_income: 10_000 + child_support_received: 3_000 + alimony_income: 2_000 + rental_income: 4_000 + veterans_benefits: 5_000 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KS + output: + # 8,000 + 6,000 + 10,000 + 3,000 + 2,000 + 4,000 + 5,000 = 38,000 + # (plan 1.8 checked boxes: self-employment, UI, retirement, child support, + # alimony, rental income, VA benefits). + ks_liheap_countable_income: 38_000 + +- name: Case 5, TANF cash assistance is counted. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 3_000 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + ks_tanf: 2_400 + households: + household: + members: [person1, person2] + state_code: KS + output: + # 3,000 wages + 2,400 TANF (plan 1.8: TANF checked) = 5,400. + ks_liheap_countable_income: 5_400 + +- name: Case 6, income of a non-qualified noncitizen member is counted. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + immigration_status: CITIZEN + employment_income: 6_000 + person2: + age: 33 + immigration_status: UNDOCUMENTED + employment_income: 12_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: KS + output: + # KEESM 13330: income from non-qualified members is counted -> 18,000. + ks_liheap_countable_income: 18_000 + +- name: Case 7, countable earned income supplied by the caller is used as given. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + self_employment_income: 5_000 + # The caller supplies the countable earned income amount. + ks_liheap_countable_earned_income: 18_000 + spm_units: + spm_unit: + members: [person1] + ks_tanf: 0 + households: + household: + members: [person1] + state_code: KS + output: + # 18,000 supplied countable earned income + 0 unearned income = 18,000. + ks_liheap_countable_income: 18_000 + +- name: Case 8, employer disability benefits are counted as unearned income. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 52 + # Example amount: 1,200 a month of employer disability benefits. + disability_benefits: 14_400 + spm_units: + spm_unit: + members: [person1] + ks_tanf: 0 + households: + household: + members: [person1] + state_code: KS + output: + # disability_benefits is in the unearned source list: 1,200 x 12 = 14,400; + # every other listed source is 0. + ks_liheap_countable_unearned_income: 14_400 + # 0 earned income + 14,400 unearned income = 14,400. + ks_liheap_countable_income: 14_400 + +- name: Case 9, strike benefits, general assistance and workers' compensation are counted. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + # Example amounts: 100, 200 and 300 a month. + strike_benefits: 1_200 + general_assistance: 2_400 + workers_compensation: 3_600 + spm_units: + spm_unit: + members: [person1] + ks_tanf: 0 + households: + household: + members: [person1] + state_code: KS + output: + # All three are in the unearned source list: 1,200 + 2,400 + 3,600 = 7,200. + ks_liheap_countable_unearned_income: 7_200 + # 0 earned income + 7,200 unearned income = 7,200. + ks_liheap_countable_income: 7_200 + +- name: Case 10, farm rental income is counted as unearned income. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + # 600 a month from leased farmland. + farm_rent_income: 7_200 + spm_units: + spm_unit: + members: [person1] + ks_tanf: 0 + households: + household: + members: [person1] + state_code: KS + output: + # KEESM 6313: income from rental property is unearned unless a household + # member actively manages it at least 20 hours a week. + ks_liheap_countable_unearned_income: 7_200 + # 0 earned income + 7,200 unearned income = 7,200. + ks_liheap_countable_income: 7_200 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/income/ks_liheap_countable_interest_dividend_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/income/ks_liheap_countable_interest_dividend_income.yaml new file mode 100644 index 00000000000..f5b45a7e10f --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/income/ks_liheap_countable_interest_dividend_income.yaml @@ -0,0 +1,54 @@ +# KEESM 13361: child interest exclusion and year-specific interest exemptions. +# KEESM sections refer to the October 2024 and January 2026 editions: +# https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/ and +# https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/ (keesm
.htm). +- name: Case 1, FY2025 exactly at monthly exemption. + period: 2025 + absolute_error_margin: 0.01 + input: + state_code: KS + age: 40 + interest_income: 360 + qualified_dividend_income: 240 + output: + ks_liheap_countable_interest_dividend_income: 0 +- name: Case 2, FY2025 above exemption counts the full amount. + period: 2025 + absolute_error_margin: 0.01 + input: + state_code: KS + age: 40 + interest_income: 361 + qualified_dividend_income: 240 + output: + ks_liheap_countable_interest_dividend_income: 601 +- name: Case 3, FY2026 regular small interest has no blanket exemption. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: KS + age: 40 + interest_income: 120 + qualified_dividend_income: 0 + output: + ks_liheap_countable_interest_dividend_income: 120 +- name: Case 4, FY2026 interest of a 17-year-old is exempt but dividends count. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: KS + age: 17 + interest_income: 1_000 + qualified_dividend_income: 300 + output: + ks_liheap_countable_interest_dividend_income: 300 +- name: Case 5, FY2026 interest counts at age 18. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: KS + age: 18 + interest_income: 1_000 + qualified_dividend_income: 300 + output: + ks_liheap_countable_interest_dividend_income: 1_300 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/integration.yaml new file mode 100644 index 00000000000..1bc6748609d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/integration.yaml @@ -0,0 +1,483 @@ +# Kansas LIEAP end-to-end integration tests. +# Sources: KEESM 13100-13400 (eligibility, household, citizenship, energy +# vulnerability, benefit levels); KS LIHEAP State Plan FY2026 (income sources +# 1.8-1.9 pages 5-7, income verification 1.4 page 5, 150% FPG 2.1 and +# subsidized housing 2.3 page 8, $130 minimum 2.6 page 9); +# KS_BenefitMatrix_2026.pdf (FY2026 season, "Benefit Adjustment @ 80%" table); +# KS_BenefitMatrix_2025.pdf (FY2025 season, 100%). +# Annualized published monthly income limits (KEESM 13362): +# 2026: 23,472 (1) / 31,728 (2) / 48,228 (4) / 56,472 (5); +# 2025: 22,590 (1) / 46,800 (4). +# Monthly income band = annual countable income / 12: +# 1 = 0-899, 2 = 900-1,199, 3 = 1,200-1,699, 4 = 1,700+. +# KEESM sections refer to the October 2024 and January 2026 editions: +# https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/ and +# https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/ (keesm
.htm). + +- name: Case 1, single adult renting an apartment with natural gas heat. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 34 + employment_income: 22_000 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + ks_liheap_dwelling_type: APARTMENT + snap: 0 + ks_tanf: 0 + households: + household: + members: [person1] + state_code: KS + output: + ks_liheap_household_size: 1 + ks_liheap_household_size_group: 1 + ks_liheap_countable_income: 22_000 + # 22,000 <= 23,472 + ks_liheap_income_eligible: true + ks_liheap_eligible: true + # 22,000 / 12 = 1,833 -> 1,700 & over + ks_liheap_income_band: 4 + ks_liheap_fuel_category: NATURAL_GAS + # matrix p.1 (80%) 1,700 & over, tier E (default), Apt, size 1-4 = 248 + ks_liheap_matrix_amount: 248 + ks_liheap: 248 + +- name: Case 2, family of four in an all-electric house. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 30_000 + person2: + age: 38 + employment_income: 15_000 + person3: + age: 8 + person4: + age: 5 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 1_200 + ks_liheap_dwelling_type: HOUSE_MODULAR_MOBILE + ks_liheap_utility_rate_tier: E + snap: 0 + ks_tanf: 0 + households: + household: + members: [person1, person2, person3, person4] + state_code: KS + output: + ks_liheap_household_size: 4 + ks_liheap_household_size_group: 1 + ks_liheap_countable_income: 45_000 + # 45,000 <= 4,019 x 12 = 48,228 + ks_liheap_income_eligible: true + ks_liheap_eligible: true + # 45,000 / 12 = 3,750 -> 1,700 & over + ks_liheap_income_band: 4 + ks_liheap_fuel_category: ELECTRICITY + # matrix p.2 electricity (80%) 1,700 & over, tier E, House, size 1-4 = 730 + ks_liheap_matrix_amount: 730 + ks_liheap: 730 + +- name: Case 3, family of five in a propane-heated duplex on a tier C provider. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 36 + employment_income: 13_200 + person2: + age: 35 + person3: + age: 11 + person4: + age: 8 + person5: + age: 3 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + ks_tanf: 0 + heating_type: PROPANE + bottled_gas_expense: 1_200 + ks_liheap_dwelling_type: DUPLEX + ks_liheap_utility_rate_tier: C + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: KS + output: + ks_liheap_household_size: 5 + ks_liheap_household_size_group: 2 + ks_liheap_countable_income: 13_200 + # 13,200 <= 56,472 + ks_liheap_income_eligible: true + ks_liheap_eligible: true + # 13,200 / 12 = 1,100 -> 900-1,199 + ks_liheap_income_band: 2 + ks_liheap_fuel_category: PROPANE + # matrix p.3 propane (80%) 900-1,199, tier C, Duplex, size 5+ = 393 + ks_liheap_matrix_amount: 393 + ks_liheap: 393 + +- name: Case 4, mixed-status family of five with an undocumented earner. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 33 + immigration_status: CITIZEN + employment_income: 6_000 + person2: + age: 35 + immigration_status: UNDOCUMENTED + employment_income: 12_000 + person3: + age: 9 + immigration_status: CITIZEN + person4: + age: 6 + immigration_status: CITIZEN + person5: + age: 2 + immigration_status: CITIZEN + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + heating_type: NATURAL_GAS + gas_expense: 1_200 + ks_liheap_dwelling_type: HOUSE_MODULAR_MOBILE + ks_liheap_utility_rate_tier: E + snap: 0 + ks_tanf: 0 + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: KS + output: + # KEESM 13330: undocumented member excluded from size, income counted. + ks_liheap_household_size: 4 + ks_liheap_household_size_group: 1 + ks_liheap_countable_income: 18_000 + # 18,000 <= 48,228 (size 4) + ks_liheap_income_eligible: true + ks_liheap_eligible: true + # 18,000 / 12 = 1,500 -> 1,200-1,699 + ks_liheap_income_band: 3 + ks_liheap_fuel_category: NATURAL_GAS + # size 4 -> 1-4 column: matrix p.1 (80%) 1,200-1,699, tier E, House = 567 + # (the 5+ column would give 648) + ks_liheap_matrix_amount: 567 + ks_liheap: 567 + +- name: Case 5, retired couple over the income limit but one spouse receives SSI. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 72 + social_security: 20_000 + person2: + age: 70 + social_security: 15_000 + ssi: 1_200 + spm_units: + spm_unit: + members: [person1, person2] + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 1_200 + ks_liheap_dwelling_type: APARTMENT + ks_liheap_utility_rate_tier: E + households: + household: + members: [person1, person2] + state_code: KS + output: + ks_liheap_household_size: 2 + ks_liheap_household_size_group: 1 + # 20,000 + 15,000 + 1,200 SSI = 36,200 (SSA and SSI both counted) + ks_liheap_countable_income: 36_200 + # 36,200 > 2,644 x 12 = 31,728; SSI receipt does not waive the limit. + ks_liheap_income_eligible: false + ks_liheap_eligible: false + # 36,200 / 12 = 3,017 -> 1,700 & over + ks_liheap_income_band: 4 + ks_liheap_fuel_category: ELECTRICITY + # matrix p.2 electricity (80%) 1,700 & over, tier E, Apt, size 1-4 = 365 + ks_liheap_matrix_amount: 365 + ks_liheap: 0 + +- name: Case 6, family of four with natural gas in the FY2025 season. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 10_000 + person2: + age: 38 + person3: + age: 8 + person4: + age: 5 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + ks_tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 1_200 + ks_liheap_dwelling_type: HOUSE_MODULAR_MOBILE + ks_liheap_utility_rate_tier: E + households: + household: + members: [person1, person2, person3, person4] + state_code: KS + output: + ks_liheap_household_size: 4 + ks_liheap_household_size_group: 1 + ks_liheap_countable_income: 10_000 + # 10,000 <= 1.5 x (15,060 + 3 x 5,380) = 46,800 + ks_liheap_income_eligible: true + ks_liheap_eligible: true + # 10,000 / 12 = 833 -> 0-899 + ks_liheap_income_band: 1 + ks_liheap_fuel_category: NATURAL_GAS + # KS_BenefitMatrix_2025.pdf p.1 (100%) 0-899, tier E, House, size 1-4 = 941 + ks_liheap_matrix_amount: 941 + ks_liheap: 941 + +- name: Case 7, the same family of four in the FY2026 season gets the 80 percent value. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 10_000 + person2: + age: 38 + person3: + age: 8 + person4: + age: 5 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + ks_tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 1_200 + ks_liheap_dwelling_type: HOUSE_MODULAR_MOBILE + ks_liheap_utility_rate_tier: E + households: + household: + members: [person1, person2, person3, person4] + state_code: KS + output: + ks_liheap_household_size: 4 + ks_liheap_household_size_group: 1 + ks_liheap_countable_income: 10_000 + ks_liheap_income_eligible: true + ks_liheap_eligible: true + ks_liheap_income_band: 1 + ks_liheap_fuel_category: NATURAL_GAS + # matrix p.1 (80%) 0-899, tier E, House, size 1-4 = 709: 80% of the + # FY2026 unadjusted cell of 886 (886 x 0.8 = 708.8, rounded to 709) + ks_liheap_matrix_amount: 709 + ks_liheap: 709 + +- name: Case 8, subsidized-housing renter with heat in rent is income eligible but not vulnerable. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 29 + employment_income: 12_000 + spm_units: + spm_unit: + members: [person1] + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 1_200 + ks_liheap_dwelling_type: APARTMENT + receives_housing_assistance: true + heat_expense_included_in_rent: true + households: + household: + members: [person1] + state_code: KS + output: + ks_liheap_household_size: 1 + ks_liheap_household_size_group: 1 + ks_liheap_countable_income: 12_000 + ks_liheap_income_eligible: true + # KEESM 13340 / plan 2.3: heat included in subsidized rent -> ineligible + ks_liheap_eligible: false + ks_liheap_income_band: 2 + ks_liheap_fuel_category: ELECTRICITY + ks_liheap: 0 + +- name: Case 9, single adult in a propane trailer on the lowest tier gets the 130 minimum. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 55 + employment_income: 21_600 + spm_units: + spm_unit: + members: [person1] + heating_type: PROPANE + bottled_gas_expense: 1_200 + ks_liheap_dwelling_type: TRAILER_OTHER + ks_liheap_utility_rate_tier: A + households: + household: + members: [person1] + state_code: KS + output: + ks_liheap_household_size: 1 + ks_liheap_household_size_group: 1 + ks_liheap_countable_income: 21_600 + # 21,600 <= 23,472 + ks_liheap_income_eligible: true + ks_liheap_eligible: true + # 21,600 / 12 = 1,800 -> 1,700 & over + ks_liheap_income_band: 4 + ks_liheap_fuel_category: PROPANE + # matrix p.3 propane (80%) 1,700 & over, tier A, Trailer/Other, size 1-4 = 75 + ks_liheap_matrix_amount: 75 + # max(75, 130) = 130 (plan 2.6 minimum benefit) + ks_liheap: 130 + +- name: Case 10, single parent on TANF heating with purchased wood. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 26 + employment_income: 0 + person2: + age: 2 + spm_units: + spm_unit: + members: [person1, person2] + heating_type: WOOD + wood_expense: 1_200 + ks_liheap_dwelling_type: HOUSE_MODULAR_MOBILE + ks_tanf: 3_600 + households: + household: + members: [person1, person2] + state_code: KS + output: + ks_liheap_household_size: 2 + ks_liheap_household_size_group: 1 + # TANF counts as income (plan 1.8): 3,600 + ks_liheap_countable_income: 3_600 + ks_liheap_income_eligible: true + ks_liheap_eligible: true + # 3,600 / 12 = 300 -> 0-899 + ks_liheap_income_band: 1 + # WOOD -> other table (no utility tier) + ks_liheap_fuel_category: OTHER + # matrix p.4 other (80%) 0-899, House, size 1-4 = 639 + ks_liheap_matrix_amount: 639 + ks_liheap: 639 + +- name: Case 11, working household with a teenager whose earnings are excluded. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 44 + employment_income: 20_000 + person2: + age: 42 + employment_income: 8_000 + interest_income: 1_500 + person3: + age: 17 + employment_income: 6_000 + spm_units: + spm_unit: + members: [person1, person2, person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + ks_liheap_dwelling_type: DUPLEX + ks_liheap_utility_rate_tier: B + snap: 0 + ks_tanf: 0 + households: + household: + members: [person1, person2, person3] + state_code: KS + output: + ks_liheap_household_size: 3 + ks_liheap_household_size_group: 1 + # 20,000 + 8,000 + 1,500 = 29,500; only the teenager's wages excluded + ks_liheap_countable_income: 29_500 + # 29,500 <= 3,331 x 12 = 39,972 + ks_liheap_income_eligible: true + ks_liheap_eligible: true + # 29,500 / 12 = 2,458 -> 1,700 & over + ks_liheap_income_band: 4 + ks_liheap_fuel_category: NATURAL_GAS + # matrix p.1 (80%) 1,700 & over, tier B, Duplex, size 1-4 = 307 + ks_liheap_matrix_amount: 307 + ks_liheap: 307 + +- name: Case 12, single adult in a propane trailer on the lowest tier in the FY2025 season gets the 100 minimum. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 55 + employment_income: 21_600 + spm_units: + spm_unit: + members: [person1] + heating_type: PROPANE + bottled_gas_expense: 1_200 + ks_liheap_dwelling_type: TRAILER_OTHER + ks_liheap_utility_rate_tier: A + snap: 0 + ks_tanf: 0 + households: + household: + members: [person1] + state_code: KS + output: + ks_liheap_household_size: 1 + ks_liheap_household_size_group: 1 + ks_liheap_countable_income: 21_600 + # 21,600 <= 1.5 x 15,060 = 22,590 (2025 season uses 2024 guidelines) + ks_liheap_income_eligible: true + ks_liheap_eligible: true + # 21,600 / 12 = 1,800 -> 1,700 & over + ks_liheap_income_band: 4 + ks_liheap_fuel_category: PROPANE + # KS_BenefitMatrix_2025.pdf p.3 (100%) propane 1,700 & over, tier A, + # Trailer/Other, size 1-4 = 100 + ks_liheap_matrix_amount: 100 + # FY2025 minimum benefit $100 (KS LIHEAP State Plan FY2025 2.6, #page=9): + # max(100, 100) = 100 (Case 9 shows the same household in FY2026: 75 -> 130) + ks_liheap: 100 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/ks_liheap.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/ks_liheap.yaml new file mode 100644 index 00000000000..339abe0aa37 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/ks_liheap.yaml @@ -0,0 +1,272 @@ +# Kansas LIEAP annual heating benefit: one regular benefit per program year +# (KEESM 13310), equal to the matrix cell (KEESM 13410; KS_BenefitMatrix_2026 +# at 80%, KS_BenefitMatrix_2025 at 100%) with the $130 minimum benefit applied +# as a floor (KS LIHEAP State Plan FY2026 2.6, #page=9). The FY2025 season +# minimum is $100 (KS LIHEAP State Plan FY2025 2.6, #page=9). Zero when +# ineligible. +# KEESM sections refer to the October 2024 and January 2026 editions: +# https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/ and +# https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/ (keesm
.htm). + +- name: Case 1, other fuel trailer cell of 128 for a large family is raised to 130. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 30_000 + person2: + age: 38 + person3: + age: 12 + person4: + age: 9 + person5: + age: 4 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + ks_tanf: 0 + heating_type: WOOD + wood_expense: 1_200 + ks_liheap_dwelling_type: TRAILER_OTHER + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: KS + output: + # 2,500/mo -> 1,700 & over; matrix p.4 other (80%), Trailer/Other, + # size 5+ = 128; max(128, 130) = 130 + ks_liheap: 130 + +- name: Case 2, cell just above the minimum is paid unchanged. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 9_600 + person2: + age: 38 + person3: + age: 12 + person4: + age: 9 + person5: + age: 4 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + ks_tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 1_200 + ks_liheap_utility_rate_tier: A + ks_liheap_dwelling_type: TRAILER_OTHER + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: KS + output: + # 800/mo -> 0-899; matrix p.1 (80%) tier A, Trailer/Other, size 5+ = 138; + # max(138, 130) = 138 + ks_liheap: 138 + +- name: Case 3, home with no heating receives nothing. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 9_600 + spm_units: + spm_unit: + members: [person1] + heating_type: NONE + households: + household: + members: [person1] + state_code: KS + output: + ks_liheap_eligible: false + ks_liheap: 0 + +- name: Case 4, negative self-employment income does not inflate the benefit. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + self_employment_income: -60_000 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + ks_liheap_utility_rate_tier: E + ks_liheap_dwelling_type: HOUSE_MODULAR_MOBILE + households: + household: + members: [person1] + state_code: KS + output: + # The business loss is floored at zero in countable earned income, so + # countable income is 0 and the household falls in the lowest income band + # (0-899): matrix p.1 (80%) tier E, House, size 1-4 = 709. + ks_liheap: 709 + +- name: Case 5, FY2025 natural gas trailer cell of 112 is above the 100 minimum and unchanged. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 21_600 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + ks_liheap_utility_rate_tier: A + ks_liheap_dwelling_type: TRAILER_OTHER + snap: 0 + ks_tanf: 0 + households: + household: + members: [person1] + state_code: KS + output: + # KS_BenefitMatrix_2025.pdf p.1 (100%) 1,700 & over tier A, Trailer/Other, + # size 1-4 = 112; max(112, 100) = 112 (would be 130 under the FY2026 + # minimum, KS LIHEAP State Plan FY2025 2.6, #page=9 gives $100). + ks_liheap: 112 + +# Case 6 evaluates seven SPM units in one simulation, including a Missouri +# unit that the Kansas mask must zero: FY2026 adjusted matrix cells +# (KS_BenefitMatrix_2026.pdf pages 1-4), the income limit (KEESM 13362) and +# the energy-vulnerability gate (KEESM 13340). +- name: Case 6, mixed households evaluate Kansas LIEAP in one vectorized simulation. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 9_600 + person2: + age: 40 + employment_income: 22_000 + person3: + age: 40 + employment_income: 21_600 + person4: + age: 40 + employment_income: 12_000 + person5: + age: 40 + employment_income: 30_000 + person6: + age: 40 + employment_income: 12_000 + person7: + age: 40 + employment_income: 9_600 + spm_units: + gas: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + ks_liheap_utility_rate_tier: E + ks_liheap_dwelling_type: HOUSE_MODULAR_MOBILE + ks_tanf: 0 + electric: + members: [person2] + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 1_200 + ks_liheap_utility_rate_tier: E + ks_liheap_dwelling_type: APARTMENT + ks_tanf: 0 + propane: + members: [person3] + heating_type: PROPANE + bottled_gas_expense: 1_200 + ks_liheap_utility_rate_tier: A + ks_liheap_dwelling_type: TRAILER_OTHER + ks_tanf: 0 + wood: + members: [person4] + heating_type: WOOD + wood_expense: 1_200 + ks_liheap_utility_rate_tier: J + ks_liheap_dwelling_type: DUPLEX + ks_tanf: 0 + over_limit: + members: [person5] + heating_type: NATURAL_GAS + gas_expense: 1_200 + ks_liheap_utility_rate_tier: B + ks_liheap_dwelling_type: DUPLEX + ks_tanf: 0 + free_wood: + members: [person6] + heating_type: WOOD + wood_expense: 0 + ks_liheap_utility_rate_tier: A + ks_liheap_dwelling_type: HOUSE_MODULAR_MOBILE + ks_tanf: 0 + missouri: + members: [person7] + heating_type: NATURAL_GAS + gas_expense: 1_200 + ks_liheap_utility_rate_tier: E + ks_liheap_dwelling_type: HOUSE_MODULAR_MOBILE + ks_tanf: 0 + households: + gas: + members: [person1] + state_code: KS + electric: + members: [person2] + state_code: KS + propane: + members: [person3] + state_code: KS + wood: + members: [person4] + state_code: KS + over_limit: + members: [person5] + state_code: KS + free_wood: + members: [person6] + state_code: KS + missouri: + members: [person7] + state_code: MO + output: + spm_units: + gas: + ks_liheap_eligible: true + ks_liheap: 709 + electric: + ks_liheap_eligible: true + ks_liheap: 365 + propane: + ks_liheap_eligible: true + ks_liheap: 130 + wood: + ks_liheap_eligible: true + ks_liheap: 431 + over_limit: + ks_liheap_eligible: false + ks_liheap: 0 + free_wood: + ks_liheap_eligible: false + ks_liheap: 0 + missouri: + ks_liheap_eligible: false + ks_liheap: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/ks_liheap_fuel_category.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/ks_liheap_fuel_category.yaml new file mode 100644 index 00000000000..6f697039865 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/ks_liheap_fuel_category.yaml @@ -0,0 +1,178 @@ +# Kansas LIEAP primary heating fuel category (KEESM 13410; KS LIHEAP State +# Plan FY2026 2.5, pages 8-9; KS_BenefitMatrix_2026.pdf pages 1-4: Natural Gas, +# Electricity, Propane, Other). Mapping from the canonical heating_type input: +# NATURAL_GAS -> natural gas; ELECTRICITY, SOLAR -> electricity; PROPANE -> +# propane; FUEL_OIL, KEROSENE, WOOD, COAL, OTHER, UNSPECIFIED -> other. +# KEESM sections refer to the October 2024 and January 2026 editions: +# https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/ and +# https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/ (keesm
.htm). + +- name: Case 1, natural gas maps to the natural gas table. + period: 2026 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + households: + household: + members: [person1] + state_code: KS + output: + ks_liheap_fuel_category: NATURAL_GAS + +- name: Case 2, electricity maps to the electricity table. + period: 2026 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + heating_type: ELECTRICITY + households: + household: + members: [person1] + state_code: KS + output: + ks_liheap_fuel_category: ELECTRICITY + +- name: Case 3, solar maps to the electricity table. + period: 2026 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + heating_type: SOLAR + households: + household: + members: [person1] + state_code: KS + output: + ks_liheap_fuel_category: ELECTRICITY + +- name: Case 4, propane maps to the propane table. + period: 2026 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + heating_type: PROPANE + households: + household: + members: [person1] + state_code: KS + output: + ks_liheap_fuel_category: PROPANE + +- name: Case 5, fuel oil maps to the other table. + period: 2026 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + heating_type: FUEL_OIL + households: + household: + members: [person1] + state_code: KS + output: + ks_liheap_fuel_category: OTHER + +- name: Case 6, kerosene maps to the other table. + period: 2026 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + heating_type: KEROSENE + households: + household: + members: [person1] + state_code: KS + output: + ks_liheap_fuel_category: OTHER + +- name: Case 7, wood maps to the other table. + period: 2026 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + heating_type: WOOD + households: + household: + members: [person1] + state_code: KS + output: + ks_liheap_fuel_category: OTHER + +- name: Case 8, coal maps to the other table. + period: 2026 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + heating_type: COAL + households: + household: + members: [person1] + state_code: KS + output: + ks_liheap_fuel_category: OTHER + +- name: Case 9, other fuel maps to the other table. + period: 2026 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + heating_type: OTHER + households: + household: + members: [person1] + state_code: KS + output: + ks_liheap_fuel_category: OTHER + +- name: Case 10, unspecified heating type defaults to the other table. + period: 2026 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KS + output: + # heating_type defaults to UNSPECIFIED -> other (scope decision). + ks_liheap_fuel_category: OTHER diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/ks_liheap_household_size.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/ks_liheap_household_size.yaml new file mode 100644 index 00000000000..8bc35678fcb --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/ks_liheap_household_size.yaml @@ -0,0 +1,161 @@ +# Kansas LIEAP household size (KEESM 13330): members who are U.S. citizens or +# qualified noncitizens. Non-qualified members are not counted in the household +# size, although their income still counts (see ks_liheap_countable_income.yaml). +# Qualified aliens per KEESM 13330: legal permanent residents, refugees, +# asylees, parolees (1+ year), deportation withheld, conditional entrants. +# KEESM sections refer to the October 2024 and January 2026 editions: +# https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/ and +# https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/ (keesm
.htm). + +- name: Case 1, single citizen counts as one. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KS + output: + ks_liheap_household_size: 1 + +- name: Case 2, family of four citizens counts four. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + person2: + age: 33 + person3: + age: 8 + person4: + age: 5 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: KS + output: + ks_liheap_household_size: 4 + +- name: Case 3, five members with one undocumented adult counts four. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + immigration_status: CITIZEN + person2: + age: 33 + immigration_status: UNDOCUMENTED + person3: + age: 10 + person4: + age: 7 + person5: + age: 3 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: KS + output: + # KEESM 13330: the undocumented member is excluded -> 5 - 1 = 4. + ks_liheap_household_size: 4 + +- name: Case 4, lawful permanent resident is a qualified noncitizen and counts. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + immigration_status: CITIZEN + person2: + age: 44 + immigration_status: LEGAL_PERMANENT_RESIDENT + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: KS + output: + ks_liheap_household_size: 2 + +- name: Case 5, household of two undocumented members counts zero. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + immigration_status: UNDOCUMENTED + person2: + age: 28 + immigration_status: UNDOCUMENTED + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: KS + output: + ks_liheap_household_size: 0 + +- name: Case 6, DACA member is not a qualified noncitizen and is excluded. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + immigration_status: CITIZEN + person2: + age: 22 + immigration_status: DACA + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: KS + output: + # DACA is not on the KEESM 13330 qualified-alien list (8 USC 1641). + ks_liheap_household_size: 1 + +- name: Case 7, refugee with a citizen child counts two. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 36 + immigration_status: REFUGEE + person2: + age: 6 + immigration_status: CITIZEN + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: KS + output: + ks_liheap_household_size: 2 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/payment/ks_liheap_household_size_group.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/payment/ks_liheap_household_size_group.yaml new file mode 100644 index 00000000000..49594193361 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/payment/ks_liheap_household_size_group.yaml @@ -0,0 +1,155 @@ +# Kansas LIEAP benefit matrix household size group +# (KS_BenefitMatrix_2026.pdf columns "Household Size 1-4" and "Household Size +# 5 and Over"): group 1 for one to four countable members, group 2 for five +# or more. Size counts only citizens and qualified aliens (KEESM 13330). +# KEESM sections refer to the October 2024 and January 2026 editions: +# https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/ and +# https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/ (keesm
.htm). + +- name: Case 1, single person is in the 1-4 group. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KS + output: + ks_liheap_household_size_group: 1 + +- name: Case 2, four members are the top of the 1-4 group. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + person2: + age: 38 + person3: + age: 10 + person4: + age: 6 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: KS + output: + ks_liheap_household_size_group: 1 + +- name: Case 3, five members are the bottom of the 5 and over group. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + person2: + age: 38 + person3: + age: 10 + person4: + age: 6 + person5: + age: 2 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: KS + output: + ks_liheap_household_size_group: 2 + +- name: Case 4, seven members are in the 5 and over group. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + person2: + age: 38 + person3: + age: 16 + person4: + age: 12 + person5: + age: 9 + person6: + age: 5 + person7: + age: 2 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7] + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7] + state_code: KS + output: + ks_liheap_household_size_group: 2 + +- name: Case 5, five members with one undocumented member fall in the 1-4 group. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + immigration_status: CITIZEN + person2: + age: 38 + immigration_status: UNDOCUMENTED + person3: + age: 10 + person4: + age: 6 + person5: + age: 2 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: KS + output: + # KEESM 13330: countable size 4 -> "Household Size 1-4" + ks_liheap_household_size_group: 1 + +- name: Case 6, FY2025 season uses the same size groups. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + person2: + age: 38 + person3: + age: 10 + person4: + age: 6 + person5: + age: 2 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: KS + output: + # KS_BenefitMatrix_2025.pdf columns are the same 1-4 / 5 and over split. + ks_liheap_household_size_group: 2 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/payment/ks_liheap_income_band.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/payment/ks_liheap_income_band.yaml new file mode 100644 index 00000000000..3c62fcb1551 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/payment/ks_liheap_income_band.yaml @@ -0,0 +1,211 @@ +# Kansas LIEAP one-month income band (KS_BenefitMatrix_2026.pdf rows; +# KEESM 13230 uses income of the application month). Monthly income = +# annual countable income / 12. Bands: 1 = 0-899, 2 = 900-1,199, +# 3 = 1,200-1,699, 4 = 1,700 and over. +# KEESM sections refer to the October 2024 and January 2026 editions: +# https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/ and +# https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/ (keesm
.htm). + +- name: Case 1, zero income is in the lowest band. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 0 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KS + output: + # 0 / 12 = 0 -> "0 - 899" + ks_liheap_income_band: 1 + +- name: Case 2, 899 per month is the top of band 1. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 10_788 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KS + output: + # 10,788 / 12 = 899 -> "0 - 899" + ks_liheap_income_band: 1 + +- name: Case 3, 900 per month is the bottom of band 2. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 10_800 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KS + output: + # 10,800 / 12 = 900 -> "900 - 1,199" + ks_liheap_income_band: 2 + +- name: Case 4, 1,199 per month is the top of band 2. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 14_388 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KS + output: + # 14,388 / 12 = 1,199 -> "900 - 1,199" + ks_liheap_income_band: 2 + +- name: Case 5, 1,200 per month is the bottom of band 3. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 14_400 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KS + output: + # 14,400 / 12 = 1,200 -> "1,200 - 1,699" + ks_liheap_income_band: 3 + +- name: Case 6, 1,699 per month is the top of band 3. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 20_388 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KS + output: + # 20,388 / 12 = 1,699 -> "1,200 - 1,699" + ks_liheap_income_band: 3 + +- name: Case 7, 1,700 per month is the bottom of band 4. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 20_400 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KS + output: + # 20,400 / 12 = 1,700 -> "1,700 & over" + ks_liheap_income_band: 4 + +- name: Case 8, high income is in band 4. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 30_000 + person2: + age: 38 + employment_income: 30_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: KS + output: + # 60,000 / 12 = 5,000 -> "1,700 & over" + ks_liheap_income_band: 4 + +- name: Case 9, band uses countable income so counted adult interest can move it. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 10_800 + interest_income: 6_000 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KS + output: + # Countable (10,800 + 6,000) / 12 = 1,400 -> band 3 (KEESM 13360). + ks_liheap_income_band: 3 + +- name: Case 10, FY2025 season uses the same band thresholds. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 14_400 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KS + output: + # 14,400 / 12 = 1,200 -> "1,200 - 1,699" (KS_BenefitMatrix_2025.pdf rows) + ks_liheap_income_band: 3 + +- name: Case 11, negative countable income is floored to the lowest band. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: KS + ks_liheap_countable_income: -5_000 + output: + # max(-5,000, 0) / 12 = 0 -> band 1 (0-899). + ks_liheap_income_band: 1 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/payment/ks_liheap_matrix_amount.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/payment/ks_liheap_matrix_amount.yaml new file mode 100644 index 00000000000..ade8314f6fe --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/liheap/payment/ks_liheap_matrix_amount.yaml @@ -0,0 +1,620 @@ +# Kansas LIEAP benefit matrix lookup (KEESM 13410; KS LIHEAP State Plan FY2026 +# 2.5, pages 8-9). Dimensions: primary fuel table (natural gas p.1, +# electricity p.2, propane p.3, other p.4 of KS_BenefitMatrix_2026.pdf), +# one-month income band, utility range tier A-J (no tier on the Other table), +# dwelling type (House/Modular/Mobile, Duplex, Apt, Trailer/Other) and +# household size group (1-4, 5 and over). FY2026 (period 2026) pays the +# right-hand "Benefit Adjustment @ 80%" values; FY2025 (period 2025) pays the +# KS_BenefitMatrix_2025.pdf values at 100%. Raw cell values: the $130 minimum +# benefit floor is applied in ks_liheap, not here. Inputs are annual; monthly +# income = annual / 12. Defaults: tier E, dwelling House/Modular/Mobile. +# KEESM sections refer to the October 2024 and January 2026 editions: +# https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/ and +# https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/ (keesm
.htm). + +- name: Case 1, natural gas, band 1, default tier E and house, size 1. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 9_600 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + households: + household: + members: [person1] + state_code: KS + output: + # 9,600 / 12 = 800 -> 0-899; matrix p.1 (80%) tier E, House, size 1-4 = 709 + ks_liheap_matrix_amount: 709 + +- name: Case 2, natural gas, band 1, tier E, duplex. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 9_600 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + ks_liheap_utility_rate_tier: E + ks_liheap_dwelling_type: DUPLEX + households: + household: + members: [person1] + state_code: KS + output: + # matrix p.1 (80%) 0-899 tier E, Duplex, size 1-4 = 532 + ks_liheap_matrix_amount: 532 + +- name: Case 3, natural gas, band 1, tier E, apartment. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 9_600 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + ks_liheap_utility_rate_tier: E + ks_liheap_dwelling_type: APARTMENT + households: + household: + members: [person1] + state_code: KS + output: + # matrix p.1 (80%) 0-899 tier E, Apt, size 1-4 = 354 + ks_liheap_matrix_amount: 354 + +- name: Case 4, natural gas, band 1, tier E, trailer. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 9_600 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + ks_liheap_utility_rate_tier: E + ks_liheap_dwelling_type: TRAILER_OTHER + households: + household: + members: [person1] + state_code: KS + output: + # matrix p.1 (80%) 0-899 tier E, Trailer/Other, size 1-4 = 177 + ks_liheap_matrix_amount: 177 + +- name: Case 5, natural gas, band 1, lowest tier A, house. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 9_600 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + ks_liheap_utility_rate_tier: A + ks_liheap_dwelling_type: HOUSE_MODULAR_MOBILE + households: + household: + members: [person1] + state_code: KS + output: + # matrix p.1 (80%) 0-899 tier A, House, size 1-4 = 482 + ks_liheap_matrix_amount: 482 + +- name: Case 6, natural gas, band 1, highest tier J, house. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 9_600 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + ks_liheap_utility_rate_tier: J + ks_liheap_dwelling_type: HOUSE_MODULAR_MOBILE + households: + household: + members: [person1] + state_code: KS + output: + # matrix p.1 (80%) 0-899 tier J, House, size 1-4 = 1,136 + ks_liheap_matrix_amount: 1_136 + +- name: Case 7, natural gas, band 1, tier E, house, family of five uses the 5+ column. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 9_600 + person2: + age: 38 + person3: + age: 10 + person4: + age: 6 + person5: + age: 2 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + ks_tanf: 0 + heating_type: NATURAL_GAS + ks_liheap_utility_rate_tier: E + ks_liheap_dwelling_type: HOUSE_MODULAR_MOBILE + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: KS + output: + # size 5 -> "Household Size 5 and Over": matrix p.1 (80%) 0-899 tier E, + # House = 810 + ks_liheap_matrix_amount: 810 + +- name: Case 8, natural gas, band 2, tier E, house. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 13_200 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + ks_liheap_utility_rate_tier: E + ks_liheap_dwelling_type: HOUSE_MODULAR_MOBILE + households: + household: + members: [person1] + state_code: KS + output: + # 13,200 / 12 = 1,100 -> 900-1,199; matrix p.1 (80%) tier E, House = 638 + ks_liheap_matrix_amount: 638 + +- name: Case 9, natural gas, band 3, tier E, house. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 18_000 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + ks_liheap_utility_rate_tier: E + ks_liheap_dwelling_type: HOUSE_MODULAR_MOBILE + households: + household: + members: [person1] + state_code: KS + output: + # 18,000 / 12 = 1,500 -> 1,200-1,699; matrix p.1 (80%) tier E, House = 567 + ks_liheap_matrix_amount: 567 + +- name: Case 10, natural gas, band 4, tier E, house. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 21_600 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + ks_liheap_utility_rate_tier: E + ks_liheap_dwelling_type: HOUSE_MODULAR_MOBILE + households: + household: + members: [person1] + state_code: KS + output: + # 21,600 / 12 = 1,800 -> 1,700 & over; matrix p.1 (80%) tier E, House = 496 + ks_liheap_matrix_amount: 496 + +- name: Case 11, natural gas, band 2, tier G, duplex, size 5+. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 13_200 + person2: + age: 38 + person3: + age: 12 + person4: + age: 9 + person5: + age: 4 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + ks_tanf: 0 + heating_type: NATURAL_GAS + ks_liheap_utility_rate_tier: G + ks_liheap_dwelling_type: DUPLEX + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: KS + output: + # 1,100/mo -> 900-1,199; matrix p.1 (80%) tier G, Duplex, size 5+ = 585 + ks_liheap_matrix_amount: 585 + +- name: Case 12, electricity, band 1, tier E, house. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 9_600 + spm_units: + spm_unit: + members: [person1] + heating_type: ELECTRICITY + ks_liheap_utility_rate_tier: E + ks_liheap_dwelling_type: HOUSE_MODULAR_MOBILE + households: + household: + members: [person1] + state_code: KS + output: + # matrix p.2 electricity (80%) 0-899 tier E, House, size 1-4 = 1,043 + ks_liheap_matrix_amount: 1_043 + +- name: Case 13, electricity, band 4, tier E, apartment, size 5+. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 30_000 + person2: + age: 38 + person3: + age: 12 + person4: + age: 9 + person5: + age: 4 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + ks_tanf: 0 + heating_type: ELECTRICITY + ks_liheap_utility_rate_tier: E + ks_liheap_dwelling_type: APARTMENT + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: KS + output: + # 30,000 / 12 = 2,500 -> 1,700 & over; matrix p.2 (80%) tier E, Apt, + # size 5+ = 417 + ks_liheap_matrix_amount: 417 + +- name: Case 14, electricity, band 3, tier H, trailer. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 18_000 + spm_units: + spm_unit: + members: [person1] + heating_type: ELECTRICITY + ks_liheap_utility_rate_tier: H + ks_liheap_dwelling_type: TRAILER_OTHER + households: + household: + members: [person1] + state_code: KS + output: + # 1,500/mo -> 1,200-1,699; matrix p.2 (80%) tier H, Trailer/Other, + # size 1-4 = 232 + ks_liheap_matrix_amount: 232 + +- name: Case 15, propane, band 1, tier E, house. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 9_600 + spm_units: + spm_unit: + members: [person1] + heating_type: PROPANE + ks_liheap_utility_rate_tier: E + ks_liheap_dwelling_type: HOUSE_MODULAR_MOBILE + households: + household: + members: [person1] + state_code: KS + output: + # matrix p.3 propane (80%) 0-899 tier E, House, size 1-4 = 553 + ks_liheap_matrix_amount: 553 + +- name: Case 16, propane, band 4, tier A, trailer returns the raw cell below the floor. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 21_600 + spm_units: + spm_unit: + members: [person1] + heating_type: PROPANE + ks_liheap_utility_rate_tier: A + ks_liheap_dwelling_type: TRAILER_OTHER + households: + household: + members: [person1] + state_code: KS + output: + # 1,800/mo -> 1,700 & over; matrix p.3 (80%) tier A, Trailer/Other, + # size 1-4 = 75 (the $130 floor is applied in ks_liheap) + ks_liheap_matrix_amount: 75 + +- name: Case 17, propane, band 3, tier C, apartment, size 5+. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 18_000 + person2: + age: 38 + person3: + age: 12 + person4: + age: 9 + person5: + age: 4 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + ks_tanf: 0 + heating_type: PROPANE + ks_liheap_utility_rate_tier: C + ks_liheap_dwelling_type: APARTMENT + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: KS + output: + # 1,500/mo -> 1,200-1,699; matrix p.3 (80%) tier C, Apt, size 5+ = 233 + ks_liheap_matrix_amount: 233 + +- name: Case 18, wood heat uses the other table, band 1, house. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 9_600 + spm_units: + spm_unit: + members: [person1] + heating_type: WOOD + ks_liheap_dwelling_type: HOUSE_MODULAR_MOBILE + households: + household: + members: [person1] + state_code: KS + output: + # matrix p.4 other (80%) 0-899, House, size 1-4 = 639 (no tier) + ks_liheap_matrix_amount: 639 + +- name: Case 19, fuel oil on the other table ignores the utility tier. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 9_600 + spm_units: + spm_unit: + members: [person1] + heating_type: FUEL_OIL + ks_liheap_utility_rate_tier: J + ks_liheap_dwelling_type: HOUSE_MODULAR_MOBILE + households: + household: + members: [person1] + state_code: KS + output: + # matrix p.4 other (80%) 0-899, House, size 1-4 = 639 regardless of tier J + ks_liheap_matrix_amount: 639 + +- name: Case 20, other fuel, band 4, trailer, size 5+. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 30_000 + person2: + age: 38 + person3: + age: 12 + person4: + age: 9 + person5: + age: 4 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + ks_tanf: 0 + heating_type: OTHER + ks_liheap_dwelling_type: TRAILER_OTHER + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: KS + output: + # 2,500/mo -> 1,700 & over; matrix p.4 other (80%), Trailer/Other, + # size 5+ = 128 + ks_liheap_matrix_amount: 128 + +- name: Case 21, zero income lands in band 1. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 0 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + ks_liheap_utility_rate_tier: E + ks_liheap_dwelling_type: HOUSE_MODULAR_MOBILE + households: + household: + members: [person1] + state_code: KS + output: + # 0/mo -> 0-899; matrix p.1 (80%) tier E, House, size 1-4 = 709 + ks_liheap_matrix_amount: 709 + +- name: Case 22, FY2025 season pays the 100 percent natural gas value for the Case 1 household. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 9_600 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + ks_liheap_utility_rate_tier: E + ks_liheap_dwelling_type: HOUSE_MODULAR_MOBILE + households: + household: + members: [person1] + state_code: KS + output: + # KS_BenefitMatrix_2025.pdf p.1 (100%) 0-899 tier E, House, size 1-4 = 941 + # (vs 709 at 80% in FY2026, Case 1) + ks_liheap_matrix_amount: 941 + +- name: Case 23, FY2025 electricity, band 1, tier E, house, size 5+. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 9_600 + person2: + age: 38 + person3: + age: 12 + person4: + age: 9 + person5: + age: 4 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + ks_tanf: 0 + heating_type: ELECTRICITY + ks_liheap_utility_rate_tier: E + ks_liheap_dwelling_type: HOUSE_MODULAR_MOBILE + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: KS + output: + # KS_BenefitMatrix_2025.pdf p.1 (100%) 0-899 tier E, House, size 5+ = 1,584 + ks_liheap_matrix_amount: 1_584 + +- name: Case 24, FY2025 propane, band 2, tier J, duplex. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 13_200 + spm_units: + spm_unit: + members: [person1] + heating_type: PROPANE + ks_liheap_utility_rate_tier: J + ks_liheap_dwelling_type: DUPLEX + households: + household: + members: [person1] + state_code: KS + output: + # 1,100/mo -> 900-1,199; KS_BenefitMatrix_2025.pdf p.2 (100%) tier J, + # Duplex, size 1-4 = 868 + ks_liheap_matrix_amount: 868 + +- name: Case 25, FY2025 other fuel, band 4, house. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 21_600 + spm_units: + spm_unit: + members: [person1] + heating_type: KEROSENE + ks_liheap_dwelling_type: HOUSE_MODULAR_MOBILE + households: + household: + members: [person1] + state_code: KS + output: + # 1,800/mo -> 1,700 & over; KS_BenefitMatrix_2025.pdf p.3 (100%) other, + # House, size 1-4 = 594 + ks_liheap_matrix_amount: 594 diff --git a/policyengine_us/variables/gov/states/ks/dcf/liheap/eligibility/ks_liheap_eligible.py b/policyengine_us/variables/gov/states/ks/dcf/liheap/eligibility/ks_liheap_eligible.py new file mode 100644 index 00000000000..14a8842e37e --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/liheap/eligibility/ks_liheap_eligible.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class ks_liheap_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = YEAR + label = "Eligible for Kansas LIEAP" + documentation = "Kansas household that is income eligible, contains at least one citizen or qualified noncitizen, and meets the heating energy vulnerability requirement." + reference = ( + "https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13300.htm", + "https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13300.htm", + "https://liheapch.acf.gov/docs/2026/state-plans/KS_Plan_2026.pdf#page=8", + ) + defined_for = StateCode.KS + + def formula(spm_unit, period, parameters): + income_eligible = spm_unit("ks_liheap_income_eligible", period) + has_qualified_member = spm_unit("ks_liheap_household_size", period) > 0 + energy_vulnerable = spm_unit("ks_liheap_energy_vulnerable", period) + return income_eligible & has_qualified_member & energy_vulnerable diff --git a/policyengine_us/variables/gov/states/ks/dcf/liheap/eligibility/ks_liheap_energy_vulnerable.py b/policyengine_us/variables/gov/states/ks/dcf/liheap/eligibility/ks_liheap_energy_vulnerable.py new file mode 100644 index 00000000000..bd5c2c353fe --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/liheap/eligibility/ks_liheap_energy_vulnerable.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class ks_liheap_energy_vulnerable(Variable): + value_type = bool + entity = SPMUnit + definition_period = YEAR + label = "Kansas LIEAP household meets heating cost responsibility rules" + documentation = "Defaults to separately paid heating costs or heat included in unsubsidized rent. Set this fact directly for shared unmetered heat, subsidized tenants paying excess heating charges, limited FHA subsidies, or homeless households owing qualifying heating debt from a prior Kansas address. The default assumes an adult household member is responsible for separately metered purchased fuel." + defined_for = StateCode.KS + reference = ( + "https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13300.htm", + "https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13300.htm", + ) + + def formula(spm_unit, period, parameters): + pays_for_heat = spm_unit("has_heating_expense", period) + heat_in_rent = spm_unit("heat_expense_included_in_rent", period) + subsidized = spm_unit("receives_housing_assistance", period) + return pays_for_heat | (heat_in_rent & ~subsidized) diff --git a/policyengine_us/variables/gov/states/ks/dcf/liheap/eligibility/ks_liheap_income_eligible.py b/policyengine_us/variables/gov/states/ks/dcf/liheap/eligibility/ks_liheap_income_eligible.py new file mode 100644 index 00000000000..45fa33d0c71 --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/liheap/eligibility/ks_liheap_income_eligible.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class ks_liheap_income_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = YEAR + label = "Kansas LIEAP income eligible" + documentation = "Countable household income does not exceed the published seasonal income limit. Kansas reuses income verified for other benefits but still tests total household income. Annual income represents twelve times income in the application month." + reference = ( + "https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13360.htm", + "https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13360.htm", + "https://liheapch.acf.gov/docs/2026/state-plans/KS_Plan_2026.pdf#page=8", + "https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13000.htm", + "https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13000.htm", + "https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13300.htm", + "https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13300.htm", + ) + defined_for = StateCode.KS + + def formula(spm_unit, period, parameters): + income = spm_unit("ks_liheap_countable_income", period) + limit = spm_unit("ks_liheap_income_limit", period) + return income <= limit diff --git a/policyengine_us/variables/gov/states/ks/dcf/liheap/eligibility/ks_liheap_income_limit.py b/policyengine_us/variables/gov/states/ks/dcf/liheap/eligibility/ks_liheap_income_limit.py new file mode 100644 index 00000000000..e095c36b0da --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/liheap/eligibility/ks_liheap_income_limit.py @@ -0,0 +1,44 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.hhs.tax_unit_fpg import fpg + + +class ks_liheap_income_limit(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Kansas LIEAP annualized income limit" + defined_for = StateCode.KS + reference = ( + "https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13360.htm", + "https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13360.htm", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ks.dcf.liheap.eligibility + size = spm_unit("ks_liheap_household_size", period) + state_group = spm_unit.household("state_group_str", period) + capped_size = clip(size, 1, p.max_table_size) + additional_people = max_(size - p.max_table_size, 0) + guideline = fpg( + capped_size, state_group, period, parameters, year_lag=p.fpg_year_lag + ) + additional_guideline = ( + fpg( + capped_size + 1, + state_group, + period, + parameters, + year_lag=p.fpg_year_lag, + ) + - guideline + ) + monthly_factor = p.fpg_rate / MONTHS_IN_YEAR + monthly_limit = guideline * monthly_factor + monthly_increment = additional_guideline * monthly_factor + # Round the base limit and each additional-person increment separately, + # to the nearest policy increment with ties rounded up. + rounding = p.rounding_increment + rounded_limit = np.floor(monthly_limit / rounding + 0.5) * rounding + rounded_increment = np.floor(monthly_increment / rounding + 0.5) * rounding + return (rounded_limit + additional_people * rounded_increment) * MONTHS_IN_YEAR diff --git a/policyengine_us/variables/gov/states/ks/dcf/liheap/income/ks_liheap_countable_earned_income.py b/policyengine_us/variables/gov/states/ks/dcf/liheap/income/ks_liheap_countable_earned_income.py new file mode 100644 index 00000000000..24a8651ff60 --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/liheap/income/ks_liheap_countable_earned_income.py @@ -0,0 +1,36 @@ +from policyengine_us.model_api import * + + +class ks_liheap_countable_earned_income(Variable): + value_type = float + entity = Person + definition_period = YEAR + label = "Kansas LIEAP countable earned income" + documentation = ( + "Gross wages and reported net self-employment income of adults. " + "Using net business income directly approximates KEESM 13360's gross " + "receipts less a 25% expense deduction or elected allowable actual " + "costs; no additional expense deduction is applied to net income. " + "Each income source is floored at zero, so business losses do not " + "offset other earnings. Earned income of children under 18 is excluded. " + "Supply countable earned income directly when the exact Kansas " + "self-employment amount is known." + ) + unit = USD + reference = ( + "https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13360.htm", + "https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13360.htm", + "https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm7122.htm", + "https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm7122.htm", + # Section 1.9 (pages 6-7). + "https://liheapch.acf.gov/docs/2026/state-plans/KS_Plan_2026.pdf#page=6", + ) + defined_for = StateCode.KS + + def formula(person, period, parameters): + p = parameters(period).gov.states.ks.dcf.liheap.income + earned = 0 + for source in p.sources.earned: + earned = earned + max_(person(source, period), 0) + age = person("age", period) + return where(age >= p.earned_income_min_age, earned, 0) diff --git a/policyengine_us/variables/gov/states/ks/dcf/liheap/income/ks_liheap_countable_income.py b/policyengine_us/variables/gov/states/ks/dcf/liheap/income/ks_liheap_countable_income.py new file mode 100644 index 00000000000..3b1d7127cad --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/liheap/income/ks_liheap_countable_income.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class ks_liheap_countable_income(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + label = "Kansas LIEAP countable income" + documentation = "Combined gross income of all persons living at the address counted under Kansas LIEAP, including the income of members who are not citizens or qualified aliens." + unit = USD + reference = ( + "https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13000.htm", + "https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13000.htm", + "https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13300.htm", + "https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13300.htm", + ) + defined_for = StateCode.KS + + adds = [ + "ks_liheap_countable_earned_income", + "ks_liheap_countable_unearned_income", + ] diff --git a/policyengine_us/variables/gov/states/ks/dcf/liheap/income/ks_liheap_countable_interest_dividend_income.py b/policyengine_us/variables/gov/states/ks/dcf/liheap/income/ks_liheap_countable_interest_dividend_income.py new file mode 100644 index 00000000000..73bcde16436 --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/liheap/income/ks_liheap_countable_interest_dividend_income.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +class ks_liheap_countable_interest_dividend_income(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Kansas LIEAP countable interest and dividend income" + documentation = "Recurring interest and dividends, excluding interest of children under 18 and the FY2025 monthly exemption. Set countable income directly for exempt burial-fund interest or FY2026 irregular, unpredictable payments below the quarterly exemption." + defined_for = StateCode.KS + reference = ( + "https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13360.htm", + "https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13360.htm", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ks.dcf.liheap.income + age = spm_unit.members("age", period) + interest = spm_unit.members("interest_income", period) + adult_interest = spm_unit.sum( + where(age >= p.interest_income_min_age, interest, 0) + ) + dividends = add(spm_unit, period, ["ordinary_dividend_income"]) + total = adult_interest + dividends + threshold = p.regular_interest_dividend_exemption * MONTHS_IN_YEAR + return where(total > threshold, total, 0) diff --git a/policyengine_us/variables/gov/states/ks/dcf/liheap/income/ks_liheap_countable_unearned_income.py b/policyengine_us/variables/gov/states/ks/dcf/liheap/income/ks_liheap_countable_unearned_income.py new file mode 100644 index 00000000000..ae73b686206 --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/liheap/income/ks_liheap_countable_unearned_income.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class ks_liheap_countable_unearned_income(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + label = "Kansas LIEAP countable unearned income" + documentation = "Gross unearned income of all household members counted toward Kansas LIEAP household income." + unit = USD + reference = ( + "https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13360.htm", + "https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13360.htm", + "https://liheapch.acf.gov/docs/2026/state-plans/KS_Plan_2026.pdf#page=6", + ) + defined_for = StateCode.KS + + adds = "gov.states.ks.dcf.liheap.income.sources.unearned" diff --git a/policyengine_us/variables/gov/states/ks/dcf/liheap/ks_liheap.py b/policyengine_us/variables/gov/states/ks/dcf/liheap/ks_liheap.py new file mode 100644 index 00000000000..985703b749e --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/liheap/ks_liheap.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class ks_liheap(Variable): + value_type = float + entity = SPMUnit + label = "Kansas LIEAP" + documentation = "Annual Kansas Low Income Energy Assistance Program (LIEAP) heating benefit: the benefit matrix amount, subject to the minimum benefit. Verified for FY2025-2026; earlier results use model parameter backfilling and are unverified historical estimates." + unit = USD + definition_period = YEAR + defined_for = "ks_liheap_eligible" + reference = ( + "https://liheapch.acf.gov/docs/2026/state-plans/KS_Plan_2026.pdf#page=9", + "https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13400.htm", + "https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13400.htm", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ks.dcf.liheap.payment + matrix_amount = spm_unit("ks_liheap_matrix_amount", period) + return max_(matrix_amount, p.min_benefit) diff --git a/policyengine_us/variables/gov/states/ks/dcf/liheap/ks_liheap_dwelling_type.py b/policyengine_us/variables/gov/states/ks/dcf/liheap/ks_liheap_dwelling_type.py new file mode 100644 index 00000000000..3f4979ea2ef --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/liheap/ks_liheap_dwelling_type.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class KSLIEAPDwellingType(Enum): + HOUSE_MODULAR_MOBILE = "House, modular home or mobile home" + DUPLEX = "Duplex" + APARTMENT = "Apartment" + TRAILER_OTHER = "Trailer or other dwelling" + + +class ks_liheap_dwelling_type(Variable): + value_type = Enum + entity = SPMUnit + possible_values = KSLIEAPDwellingType + default_value = KSLIEAPDwellingType.HOUSE_MODULAR_MOBILE + definition_period = YEAR + label = "Kansas LIEAP dwelling type" + documentation = "Dwelling type column of the Kansas LIEAP benefit matrix: house, modular home or mobile home; duplex; apartment; or trailer or other dwelling. Defaults to the house, modular or mobile home column." + reference = "https://liheapch.acf.gov/docs/2026/benefits-matricies/KS_BenefitMatrix_2026.pdf#page=1" diff --git a/policyengine_us/variables/gov/states/ks/dcf/liheap/ks_liheap_fuel_category.py b/policyengine_us/variables/gov/states/ks/dcf/liheap/ks_liheap_fuel_category.py new file mode 100644 index 00000000000..bfe1084f89f --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/liheap/ks_liheap_fuel_category.py @@ -0,0 +1,42 @@ +from policyengine_us.model_api import * + + +class KSLIEAPFuelCategory(Enum): + NATURAL_GAS = "Natural gas" + ELECTRICITY = "Electricity" + PROPANE = "Propane" + OTHER = "Other" + + +class ks_liheap_fuel_category(Variable): + value_type = Enum + entity = SPMUnit + possible_values = KSLIEAPFuelCategory + default_value = KSLIEAPFuelCategory.OTHER + definition_period = YEAR + label = "Kansas LIEAP primary heating fuel category" + documentation = "Benefit matrix fuel table derived from the canonical heating_type input: natural gas; electricity (including solar); propane; and other for fuel oil, kerosene, wood, coal, other fuels, no heating and an unspecified fuel." + reference = ( + "https://liheapch.acf.gov/docs/2026/benefits-matricies/KS_BenefitMatrix_2026.pdf#page=4", + "https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13400.htm", + "https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13400.htm", + ) + defined_for = StateCode.KS + + def formula(spm_unit, period, parameters): + heating_type = spm_unit("heating_type", period) + types = heating_type.possible_values + natural_gas = heating_type == types.NATURAL_GAS + electricity = (heating_type == types.ELECTRICITY) | ( + heating_type == types.SOLAR + ) + propane = heating_type == types.PROPANE + return select( + [natural_gas, electricity, propane], + [ + KSLIEAPFuelCategory.NATURAL_GAS, + KSLIEAPFuelCategory.ELECTRICITY, + KSLIEAPFuelCategory.PROPANE, + ], + default=KSLIEAPFuelCategory.OTHER, + ) diff --git a/policyengine_us/variables/gov/states/ks/dcf/liheap/ks_liheap_household_size.py b/policyengine_us/variables/gov/states/ks/dcf/liheap/ks_liheap_household_size.py new file mode 100644 index 00000000000..5f83f198dea --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/liheap/ks_liheap_household_size.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class ks_liheap_household_size(Variable): + value_type = int + entity = SPMUnit + definition_period = YEAR + label = "Kansas LIEAP household size" + documentation = "Number of household members who are U.S. citizens or qualified aliens. Other members are not counted in household size, although their income counts toward household income." + reference = ( + "https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13300.htm", + "https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13300.htm", + ) + defined_for = StateCode.KS + + # KEESM 13330 excludes ineligible members from size but retains their income. + # It expressly includes refugees/asylees; do not substitute SNAP eligibility. + # Its size sentence names "citizens or lawful permanent residents", while + # its list of qualified aliens is broader. Counting every qualified status + # is an interpretation of that section, not an express instruction. + adds = ["is_citizen_or_legal_immigrant"] diff --git a/policyengine_us/variables/gov/states/ks/dcf/liheap/ks_liheap_utility_rate_tier.py b/policyengine_us/variables/gov/states/ks/dcf/liheap/ks_liheap_utility_rate_tier.py new file mode 100644 index 00000000000..b12422e1c01 --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/liheap/ks_liheap_utility_rate_tier.py @@ -0,0 +1,28 @@ +from policyengine_us.model_api import * + + +class KSLIEAPUtilityRateTier(Enum): + A = "Tier A (lowest rates)" + B = "Tier B" + C = "Tier C" + D = "Tier D" + E = "Tier E" + F = "Tier F" + G = "Tier G" + H = "Tier H" + I = "Tier I" + J = "Tier J (highest rates)" + + +class ks_liheap_utility_rate_tier(Variable): + value_type = Enum + entity = SPMUnit + possible_values = KSLIEAPUtilityRateTier + default_value = KSLIEAPUtilityRateTier.E + definition_period = YEAR + label = "Kansas LIEAP utility rate tier" + documentation = "Utility range tier of the household's primary heating fuel provider in the Kansas LIEAP benefit matrix. Kansas groups fuel providers into tiers A (lowest rates) through J (highest rates) from a periodic rate survey. The tier is a provider attribute the model cannot derive, so it is an input defaulting to the midpoint tier E. The other-fuel matrix has no tier." + reference = ( + "https://liheapch.acf.gov/docs/2026/benefits-matricies/KS_BenefitMatrix_2026.pdf#page=1", + "https://liheapch.acf.gov/docs/2026/state-plans/KS_Plan_2026.pdf#page=9", + ) diff --git a/policyengine_us/variables/gov/states/ks/dcf/liheap/payment/ks_liheap_household_size_group.py b/policyengine_us/variables/gov/states/ks/dcf/liheap/payment/ks_liheap_household_size_group.py new file mode 100644 index 00000000000..a5fceb2ba6c --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/liheap/payment/ks_liheap_household_size_group.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + + +class ks_liheap_household_size_group(Variable): + value_type = int + entity = SPMUnit + definition_period = YEAR + label = "Kansas LIEAP household size group" + documentation = "Benefit matrix household size group: 1 for households of one to four countable members, 2 for five or more." + reference = "https://liheapch.acf.gov/docs/2026/benefits-matricies/KS_BenefitMatrix_2026.pdf#page=1" + defined_for = StateCode.KS + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ks.dcf.liheap.payment + size = spm_unit("ks_liheap_household_size", period) + return p.household_size_group.calc(size) diff --git a/policyengine_us/variables/gov/states/ks/dcf/liheap/payment/ks_liheap_income_band.py b/policyengine_us/variables/gov/states/ks/dcf/liheap/payment/ks_liheap_income_band.py new file mode 100644 index 00000000000..632ea1f2234 --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/liheap/payment/ks_liheap_income_band.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class ks_liheap_income_band(Variable): + value_type = int + entity = SPMUnit + definition_period = YEAR + label = "Kansas LIEAP one-month income band" + documentation = "Benefit matrix income band (1-4) from one-month gross countable income, taken as one twelfth of annual countable income." + reference = ( + "https://liheapch.acf.gov/docs/2026/benefits-matricies/KS_BenefitMatrix_2026.pdf#page=1", + "https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13200.htm", + "https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13200.htm", + ) + defined_for = StateCode.KS + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ks.dcf.liheap.payment + income = spm_unit("ks_liheap_countable_income", period) + monthly_income = max_(income, 0) / MONTHS_IN_YEAR + return p.income_band.calc(monthly_income) diff --git a/policyengine_us/variables/gov/states/ks/dcf/liheap/payment/ks_liheap_matrix_amount.py b/policyengine_us/variables/gov/states/ks/dcf/liheap/payment/ks_liheap_matrix_amount.py new file mode 100644 index 00000000000..11f3eea325e --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/liheap/payment/ks_liheap_matrix_amount.py @@ -0,0 +1,43 @@ +from policyengine_us.model_api import * + + +class ks_liheap_matrix_amount(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + label = "Kansas LIEAP benefit matrix amount" + documentation = "Annual benefit from the Kansas LIEAP benefit matrix for the household's primary heating fuel, one-month income band, utility rate tier, dwelling type and household size group, before the minimum benefit." + unit = USD + reference = ( + "https://liheapch.acf.gov/docs/2026/benefits-matricies/KS_BenefitMatrix_2026.pdf#page=1", + "https://liheapch.acf.gov/docs/2025/benefits-matricies/KS_BenefitMatrix_2025.pdf#page=1", + "https://content.dcf.ks.gov/ees/KEESM/Robo10-24/Robo_10_01_24/keesm13400.htm", + "https://content.dcf.ks.gov/ees/KEESM/Robo01-26/Robo_01_01_26/keesm13400.htm", + ) + defined_for = StateCode.KS + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ks.dcf.liheap.payment.matrix + fuel = spm_unit("ks_liheap_fuel_category", period) + fuels = fuel.possible_values + # State-masked helpers return zero outside Kansas. Keep lookup keys + # valid while the framework evaluates mixed-state arrays. + band = max_(spm_unit("ks_liheap_income_band", period), 1) + tier = spm_unit("ks_liheap_utility_rate_tier", period) + dwelling = spm_unit("ks_liheap_dwelling_type", period) + size_group = max_(spm_unit("ks_liheap_household_size_group", period), 1) + return select( + [ + fuel == fuels.NATURAL_GAS, + fuel == fuels.ELECTRICITY, + fuel == fuels.PROPANE, + fuel == fuels.OTHER, + ], + [ + p.natural_gas[band][tier][dwelling][size_group], + p.electricity[band][tier][dwelling][size_group], + p.propane[band][tier][dwelling][size_group], + p.other[band][dwelling][size_group], + ], + default=0, + )