Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/heating-snap-utility-incurrence.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
SNAP utility allowance incurrence now reads the canonical heating inputs through new `has_heating_expense` and `has_cooling_expense` facts, counts metered gas and every deliverable or cooking fuel as one gas-and-fuel utility, and Illinois AABD reads `gas_expense` instead of the deprecated `metered_gas_expense`; households without a `heating_type` keep their previous `heating_cooling_expense` behavior.
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ values:
- cooking_fuel_expense
- coal_expense
- fuel_oil_expense
- metered_gas_expense
- gas_expense
- bottled_gas_expense

metadata:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,23 @@
state_code: IL
output:
il_aabd_utility_allowance: 0

- name: Case 6, size 1, area 1, gas expense higher than the metered gas allowance.
period: 2022-01
input:
spm_unit_size: 1
county_str: COOK_COUNTY_IL
gas_expense: 20 * 12
state_code: IL
output:
il_aabd_utility_allowance: 11.9

- name: Case 7, the deprecated metered_gas_expense input is no longer read.
period: 2022-01
input:
spm_unit_size: 1
county_str: COOK_COUNTY_IL
metered_gas_expense: 20 * 12
state_code: IL
output:
il_aabd_utility_allowance: 0
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,8 @@
snap_utility_region_str: MO
gas_expense: 2_400
output:
# MO FY26 gas standard, read via the gas_and_fuel_expense -> gas_expense
# variable mapping
# MO FY26 gas and fuel standard, read via the gas_and_fuel_expense ->
# has_gas_and_fuel_expense incurrence mapping
snap_individual_utility_allowance: 162

# HI individual utility allowances vary by household size
Expand Down Expand Up @@ -246,3 +246,35 @@
phone_expense: 240
output:
snap_individual_utility_allowance: 41

# The gas and fuel standard is one individual standard covering metered gas
# and every deliverable or cooking fuel (7 CFR 273.9(d)(6)(iii)(A)(1)).
- name: MO fuel-oil-only household receives the gas and fuel standard in 2026
period: 2026-01
input:
snap_utility_allowance_type: IUA
snap_utility_region_str: MO
fuel_oil_expense: 1_800
output:
# MO FY26 gas and fuel standard
snap_individual_utility_allowance: 162

- name: MO metered gas plus propane household receives the gas and fuel standard once in 2026
period: 2026-01
input:
snap_utility_allowance_type: IUA
snap_utility_region_str: MO
gas_expense: 2_400
bottled_gas_expense: 600
output:
snap_individual_utility_allowance: 162

- name: MO wood and cooking fuel household receives the gas and fuel standard once in 2026
period: 2026-01
input:
snap_utility_allowance_type: IUA
snap_utility_region_str: MO
wood_expense: 500
cooking_fuel_expense: 120
output:
snap_individual_utility_allowance: 162
Original file line number Diff line number Diff line change
Expand Up @@ -475,3 +475,106 @@
snap_utility_allowance_type: IUA
snap_limited_utility_allowance: 0
snap_utility_allowance: 243

# Canonical heating inputs (heating_type plus the per-fuel bill) reaching a
# dollar allowance without forcing snap_utility_allowance_type, one case per
# incurrence path in 7 CFR 273.9(d)(6)(iii).
- name: Alabama gas-heated household with a gas bill receives the FY2026 HCSUA from canonical inputs
period: 2026-01
absolute_error_margin: 0.01
input:
people:
person:
age: 40
spm_units:
spm_unit:
members: [person]
heating_type: NATURAL_GAS
gas_expense: 1_200
heat_expense_included_in_rent: false
households:
household:
members: [person]
state_code: AL
output:
# (D)(1): heating incurred separately from rent.
has_heating_expense: true
snap_utility_allowance_type: SUA
snap_utility_allowance: 637

- name: Idaho renter with heat in rent and electricity and trash bills receives the FY2026 LUA from canonical inputs
period: 2026-01
absolute_error_margin: 0.01
input:
people:
person:
age: 40
spm_units:
spm_unit:
members: [person]
heating_type: NATURAL_GAS
heat_expense_included_in_rent: true
pre_subsidy_electricity_expense: 960
trash_expense: 360
households:
household:
members: [person]
state_code: ID
output:
# Heat in rent is not separately incurred; electricity and trash are
# two non-heating utilities (A)(3).
has_heating_expense: false
count_distinct_utility_expenses: 2
snap_utility_allowance_type: LUA
snap_utility_allowance: 133

- name: Missouri home without heating that buys fuel oil for hot water receives the FY2026 gas and fuel standard and the matching shelter deduction
period: 2026-01
absolute_error_margin: 0.01
input:
people:
person:
age: 40
spm_units:
spm_unit:
members: [person]
heating_type: NONE
fuel_oil_expense: 1_800
snap_net_income_pre_shelter: 200
households:
household:
members: [person]
state_code: MO
output:
# (A)(1): fuel oil alone incurs the single gas and fuel standard; one
# utility is short of Missouri's two-utility LUA.
has_heating_expense: false
has_gas_and_fuel_expense: true
count_distinct_utility_expenses: 1
snap_utility_allowance_type: IUA
snap_utility_allowance: 162
# No housing cost: 162 - 0.5 * 200 = 62, under the $744 cap.
snap_excess_shelter_expense_deduction: 62

- name: Alabama home without heating that pays for cooling receives the FY2026 HCSUA from the stated cooling fact
period: 2026-01
absolute_error_margin: 0.01
input:
people:
person:
age: 40
spm_units:
spm_unit:
members: [person]
heating_type: NONE
has_cooling_expense: true
households:
household:
members: [person]
state_code: AL
output:
# (D)(1): heating or cooling incurred separately from rent.
has_heating_expense: false
has_heating_cooling_expense: true
snap_utility_allowance_type: SUA
snap_utility_allowance: 637
Original file line number Diff line number Diff line change
Expand Up @@ -213,3 +213,99 @@
has_heating_cooling_expense: false
output:
snap_utility_allowance_type: LUA

# End-to-end cases through has_heating_cooling_expense and
# count_distinct_utility_expenses from the canonical heating inputs
# (7 CFR 273.9(d)(6)(iii)(D)). Colorado has an LUA from October 2021.
- name: Fuel oil heat with a fuel oil bill receives the SUA
period: 2026
input:
heating_type: FUEL_OIL
fuel_oil_expense: 1_500
snap_utility_region_str: CO
snap_state_using_standard_utility_allowance: false
output:
snap_utility_allowance_type: SUA

- name: Gas heat included in rent with gas and electricity bills receives the LUA
period: 2026
input:
heating_type: NATURAL_GAS
gas_expense: 1_200
pre_subsidy_electricity_expense: 900
heat_expense_included_in_rent: true
snap_utility_region_str: CO
snap_state_using_standard_utility_allowance: false
output:
# Heat in rent is not a separately incurred heating cost; the gas and
# electricity bills are two non-heating utilities.
snap_utility_allowance_type: LUA

- name: A home without heating that pays for cooling receives the SUA
period: 2026
input:
heating_type: NONE
has_cooling_expense: true
snap_utility_region_str: CO
snap_state_using_standard_utility_allowance: false
output:
snap_utility_allowance_type: SUA

- name: Legacy heating_cooling_expense with heat in rent still receives the SUA
period: 2026
input:
heating_cooling_expense: 600
heat_expense_included_in_rent: true
snap_utility_region_str: CO
snap_state_using_standard_utility_allowance: false
output:
# Pre-canonical households never read the heat-in-rent flag here.
snap_utility_allowance_type: SUA

- name: Gas and electricity bills without a heating type receive the LUA, not the SUA
period: 2026
input:
gas_expense: 1_200
pre_subsidy_electricity_expense: 900
snap_utility_region_str: CO
snap_state_using_standard_utility_allowance: false
output:
# Per-fuel bills alone do not say which fuel heats the home.
snap_utility_allowance_type: LUA

- name: Free wood heat with a purchased propane backup receives the SUA when the household states it pays for heat
period: 2026
input:
heating_type: WOOD
wood_expense: 0
bottled_gas_expense: 300
has_heating_expense: true
snap_utility_region_str: CO
snap_state_using_standard_utility_allowance: false
output:
snap_utility_allowance_type: SUA

- name: A home without heating does not reach the LUA through a leftover legacy heating amount
period: 2026
input:
heating_type: NONE
heating_cooling_expense: 600
water_expense: 240
snap_utility_region_str: CO
snap_state_using_standard_utility_allowance: false
output:
# One utility (water): individual standards, not the LUA.
snap_utility_allowance_type: IUA

- name: An unspecified heating type with a legacy heating amount and a water bill receives the SUA, not the LUA
period: 2026
input:
heating_cooling_expense: 600
water_expense: 240
snap_utility_region_str: CO
snap_state_using_standard_utility_allowance: false
output:
# The legacy amount signals heating incurrence for pre-canonical
# households, so the SUA applies before the two-utility LUA count
# (legacy plus water) is ever reached.
snap_utility_allowance_type: SUA
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,58 @@
sewage_expense: 0
output:
count_distinct_utility_expenses: 0

# Gas and fuel bills are one SNAP individual-standard category
# (7 CFR 273.9(d)(6)(iii)(A)(1)), so metered gas plus a deliverable fuel
# counts once, while a deliverable fuel with no metered gas still counts.
- name: Fuel oil and electricity count as two utilities.
period: 2026
input:
fuel_oil_expense: 1_500
pre_subsidy_electricity_expense: 1_200
output:
count_distinct_utility_expenses: 2

- name: Metered gas plus propane count as one gas and fuel utility.
period: 2026
input:
gas_expense: 600
bottled_gas_expense: 300
output:
count_distinct_utility_expenses: 1

- name: Cooking fuel counts as the gas and fuel utility.
period: 2026
input:
cooking_fuel_expense: 108
output:
count_distinct_utility_expenses: 1

- name: Wood, coal, and other fuel bills with water count as two utilities.
period: 2026
input:
wood_expense: 400
coal_expense: 100
other_heating_fuel_expense: 50
water_expense: 240
output:
count_distinct_utility_expenses: 2

# The deprecated heating_cooling_expense input is read only for households
# whose heating_type is UNSPECIFIED.
- name: A known heating type does not count a leftover legacy heating amount.
period: 2026
input:
heating_type: NONE
heating_cooling_expense: 600
water_expense: 240
output:
count_distinct_utility_expenses: 1

- name: An unspecified heating type still counts the legacy heating amount.
period: 2026
input:
heating_cooling_expense: 600
water_expense: 240
output:
count_distinct_utility_expenses: 2
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
- name: Case 1, metered gas bill.
period: 2026
input:
gas_expense: 600
output:
has_gas_and_fuel_expense: true

- name: Case 2, propane bill.
period: 2026
input:
bottled_gas_expense: 300
output:
has_gas_and_fuel_expense: true

- name: Case 3, cooking fuel bill.
period: 2026
input:
cooking_fuel_expense: 108
output:
has_gas_and_fuel_expense: true

- name: Case 4, other heating fuel bill.
period: 2026
input:
other_heating_fuel_expense: 50
output:
has_gas_and_fuel_expense: true

- name: Case 5, electricity alone is not a gas or fuel bill.
period: 2026
input:
pre_subsidy_electricity_expense: 1_200
gas_expense: 0
output:
has_gas_and_fuel_expense: false

- name: Case 6, no bills.
period: 2026
input:
gas_expense: 0
output:
has_gas_and_fuel_expense: false
Loading
Loading