diff --git a/changelog.d/id-ssp.added.md b/changelog.d/id-ssp.added.md new file mode 100644 index 00000000000..bd7cd3c0e6d --- /dev/null +++ b/changelog.d/id-ssp.added.md @@ -0,0 +1 @@ +Added Idaho Aid to the Aged, Blind, and Disabled (AABD) cash assistance program. diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index 9573ff8c17e..6814e3880bf 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -26,6 +26,8 @@ values: - al_ssp # Alaska benefits - ak_ssp + # Idaho benefits + - id_aabd # Nebraska benefits - ne_child_care_subsidies # Massachusetts benefits @@ -57,6 +59,8 @@ values: - al_ssp # Alaska benefits - ak_ssp + # Idaho benefits + - id_aabd # Nebraska benefits - ne_child_care_subsidies # North Carolina benefits diff --git a/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/amount.yaml b/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/amount.yaml new file mode 100644 index 00000000000..46ac8e94f92 --- /dev/null +++ b/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/amount.yaml @@ -0,0 +1,31 @@ +description: >- + Idaho provides this maximum monthly AABD cash payment amount based on + the participant's living arrangement. +metadata: + unit: currency-USD + period: month + label: Idaho AABD maximum monthly cash payment + breakdown: + - id_aabd_living_arrangement + reference: + - title: IDAPA 16.03.05.514 - AABD Cash Payments + href: https://adminrules.idaho.gov/rules/current/16/160305.pdf#page=41 + - title: IDAPA 16.03.05.514 - AABD Cash Payments (2022 Archive) + href: https://adminrules.idaho.gov/rules/2022%20Archive/16/160305.pdf#page=55 + - title: Idaho Admin. Code r. 16.03.05.514 + href: https://www.law.cornell.edu/regulations/idaho/IDAPA-16.03.05.514 + +SINGLE: + 2022-07-01: 53 +COUPLE: + 2022-07-01: 20 +ESSENTIAL_PERSON: + 2022-07-01: 18 +SIGRIF: + 2022-07-01: 169 +ROOM_AND_BOARD: + 2022-07-01: 198 +RALF_CFH: + 2022-07-01: 0 +NONE: + 2022-07-01: 0 diff --git a/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/basic_allowance.yaml b/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/basic_allowance.yaml new file mode 100644 index 00000000000..83ba8660df7 --- /dev/null +++ b/policyengine_us/parameters/gov/states/id/dhw/aabd/payment/basic_allowance.yaml @@ -0,0 +1,32 @@ +description: >- + Idaho sets this amount as the monthly basic living allowance for AABD + participants based on living arrangement under the Aid to the Aged, + Blind, and Disabled program. +metadata: + unit: currency-USD + period: month + label: Idaho AABD basic living allowance + breakdown: + - id_aabd_living_arrangement + reference: + - title: IDAPA 16.03.05.501 - Basic Living Allowance + href: https://adminrules.idaho.gov/rules/current/16/160305.pdf#page=39 + - title: IDAPA 16.03.05.501 - Basic Living Allowance (2022 Archive) + href: https://adminrules.idaho.gov/rules/2022%20Archive/16/160305.pdf#page=53 + - title: IDAPA 16.03.05.512 - Room and Board Allowance + href: https://adminrules.idaho.gov/rules/current/16/160305.pdf#page=40 + +SINGLE: + 2022-07-01: 545 +COUPLE: + 2022-07-01: 768 +ESSENTIAL_PERSON: + 2022-07-01: 768 +SIGRIF: + 2022-07-01: 349 +ROOM_AND_BOARD: + 2022-07-01: 770 +RALF_CFH: + 2022-07-01: 96 +NONE: + 2022-07-01: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/dhw/aabd/id_aabd.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/dhw/aabd/id_aabd.yaml new file mode 100644 index 00000000000..8bf652af1ce --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/id/dhw/aabd/id_aabd.yaml @@ -0,0 +1,108 @@ +- name: Case 1, RALF/CFH resident ineligible for AABD cash. + period: 2025-01 + input: + people: + person1: + age: 70 + social_security: 4_800 + id_aabd_living_arrangement: RALF_CFH + households: + household: + members: [person1] + state_code: ID + output: + id_aabd_eligible: [false] + id_aabd: [0] + +- name: Case 2, NONE arrangement ineligible. + period: 2025-01 + input: + people: + person1: + age: 70 + social_security: 4_800 + households: + household: + members: [person1] + state_code: ID + output: + id_aabd_eligible: [false] + id_aabd: [0] + +- name: Case 3, no SSI ineligible. + period: 2025-01 + input: + people: + person1: + age: 70 + social_security: 12_000 + id_aabd_living_arrangement: SINGLE + households: + household: + members: [person1] + state_code: ID + output: + id_aabd_eligible: [false] + id_aabd: [0] + +- name: Case 4, non-Idaho resident. + period: 2025-01 + input: + people: + person1: + age: 70 + social_security: 4_800 + id_aabd_living_arrangement: SINGLE + households: + household: + members: [person1] + state_code: CA + output: + id_aabd: [0] + +- name: Case 5, nursing facility resident excluded from AABD. + period: 2025-01 + input: + people: + person1: + age: 70 + social_security: 1_200 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + id_aabd_living_arrangement: SINGLE + households: + household: + members: [person1] + state_code: ID + output: + # Federal LA = MEDICAL_TREATMENT_FACILITY, excluded by eligibility + id_aabd_eligible: [false] + id_aabd: [0] + +- name: Case 6, eligible person with ineligible spouse uses SINGLE not COUPLE. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security: 4_800 + id_aabd_living_arrangement: SINGLE + person2: + age: 30 + marital_units: + marital_unit: + members: [person1, person2] + marital_unit_id: 0 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ID + output: + # Per 501.01: "living with their ineligible spouse" = SINGLE + # Per 501.02: COUPLE requires both to be AABD participants + # Person1 gets individual rate ($53), not couple rate ($10) + id_aabd: [53, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/dhw/aabd/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/dhw/aabd/integration.yaml new file mode 100644 index 00000000000..53f0acf714f --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/id/dhw/aabd/integration.yaml @@ -0,0 +1,195 @@ +- name: Case 1, single with low income gets max AABD. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security: 4_800 + id_aabd_living_arrangement: SINGLE + households: + household: + members: [person1] + state_code: ID + output: + # Countable: ($4,800 - $240 disregard) / 12 = $380/mo + ssi_countable_income: [380] + # SSI: ($11,604 - $4,560) / 12 = $587/mo + ssi: [587] + id_aabd_eligible: [true] + # Need: $545 - $380 = $165; min($165, $53) = $53 + id_aabd: [53] + +- name: Case 2, single with moderate income gets reduced AABD. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security: 6_240 + id_aabd_living_arrangement: SINGLE + households: + household: + members: [person1] + state_code: ID + output: + # Countable: ($6,240 - $240) / 12 = $500/mo + ssi_countable_income: [500] + # SSI: ($11,604 - $6,000) / 12 = $467/mo + ssi: [467] + id_aabd_eligible: [true] + # Need: $545 - $500 = $45; min($45, $53) = $45 + id_aabd: [45] + +- name: Case 3, single with high income receives SSI but no AABD need. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security: 7_200 + id_aabd_living_arrangement: SINGLE + households: + household: + members: [person1] + state_code: ID + output: + # Countable: ($7,200 - $240) / 12 = $580/mo + ssi_countable_income: [580] + # SSI: ($11,604 - $6,960) / 12 = $387/mo + ssi: [387] + id_aabd_eligible: [true] + # Need: max(0, $545 - $580) = $0 + id_aabd: [0] + +- name: Case 4, couple both SSI recipients. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security: 2_400 + id_aabd_living_arrangement: COUPLE + person2: + age: 70 + social_security: 2_400 + id_aabd_living_arrangement: COUPLE + marital_units: + marital_unit: + members: [person1, person2] + marital_unit_id: 0 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ID + output: + # Combined SS: $4,800/yr, disregard $240 once + # Combined countable: $4,560/yr, per person: $2,280/yr = $190/mo + ssi_countable_income: [190, 190] + # Couple FBR: $17,400/yr, SSI: $12,840/yr, per person: $535/mo + ssi: [535, 535] + id_aabd_eligible: [true, true] + # Per-person allowance: $768/2 = $384 + # Need: $384 - $190 = $194; max per person: $20/2 = $10 + # AABD: min($194, $10) = $10 + id_aabd: [10, 10] + +- name: Case 5, SIGRIF resident with low income. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security: 2_400 + id_aabd_living_arrangement: SIGRIF + households: + household: + members: [person1] + state_code: ID + output: + # Countable: ($2,400 - $240) / 12 = $180/mo + ssi_countable_income: [180] + # SSI: ($11,604 - $2,160) / 12 = $787/mo + ssi: [787] + id_aabd_eligible: [true] + # Need: $349 - $180 = $169; min($169, $169) = $169 + id_aabd: [169] + +- name: Case 6, room and board resident with low income. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security: 4_800 + id_aabd_living_arrangement: ROOM_AND_BOARD + households: + household: + members: [person1] + state_code: ID + output: + # Countable: $380/mo + ssi_countable_income: [380] + # SSI: $587/mo + ssi: [587] + id_aabd_eligible: [true] + # Need: $770 - $380 = $390; min($390, $198) = $198 + id_aabd: [198] + +- name: Case 7, essential person arrangement with low income. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security: 4_800 + id_aabd_living_arrangement: ESSENTIAL_PERSON + households: + household: + members: [person1] + state_code: ID + output: + # Countable: $380/mo (individual, not couple) + ssi_countable_income: [380] + # SSI: $587/mo + ssi: [587] + id_aabd_eligible: [true] + # Need: $768 - $380 = $388; min($388, $18) = $18 + id_aabd: [18] + +- name: Case 8, asymmetric couple, one not ABD gets individual rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security: 4_800 + id_aabd_living_arrangement: SINGLE + person2: + age: 30 + marital_units: + marital_unit: + members: [person1, person2] + marital_unit_id: 0 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ID + output: + id_aabd_eligible: [true, false] + # Person1: individual, countable $380/mo + # Need: $545 - $380 = $165; min($165, $53) = $53 + id_aabd: [53, 0] diff --git a/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd.py b/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd.py new file mode 100644 index 00000000000..822990e39b4 --- /dev/null +++ b/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd.py @@ -0,0 +1,37 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.id.dhw.aabd.id_aabd_living_arrangement import ( + IDAAbdLivingArrangement, +) + + +class id_aabd(Variable): + value_type = float + entity = Person + label = "Idaho AABD cash payment" + unit = USD + definition_period = MONTH + defined_for = "id_aabd_eligible" + reference = ( + "https://adminrules.idaho.gov/rules/current/16/160305.pdf#page=41", + "https://www.law.cornell.edu/regulations/idaho/IDAPA-16.03.05.514", + ) + + def formula(person, period, parameters): + la = person("id_aabd_living_arrangement", period) + p = parameters(period).gov.states.id.dhw.aabd.payment + LA = IDAAbdLivingArrangement + + basic_allowance = p.basic_allowance[la] + max_payment = p.amount[la] + + # Couples: regulation defines combined amounts (Section 501.02) + # Both spouses are AABD participants, each gets half + is_couple = la == LA.COUPLE + per_person_allowance = where(is_couple, basic_allowance / 2, basic_allowance) + per_person_max = where(is_couple, max_payment / 2, max_payment) + + # AABD cash = basic allowance - countable income, capped at max + # (Section 514). Idaho mirrors SSI disregards (Sections 540-546). + countable_income = person("ssi_countable_income", period) + financial_need = max_(0, per_person_allowance - countable_income) + return min_(financial_need, per_person_max) diff --git a/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd_eligible.py b/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd_eligible.py new file mode 100644 index 00000000000..2457160fe18 --- /dev/null +++ b/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd_eligible.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.id.dhw.aabd.id_aabd_living_arrangement import ( + IDAAbdLivingArrangement, +) + + +class id_aabd_eligible(Variable): + value_type = bool + entity = Person + label = "Idaho AABD eligible" + definition_period = MONTH + defined_for = StateCode.ID + reference = ( + "https://adminrules.idaho.gov/rules/current/16/160305.pdf#page=41", + "https://www.law.cornell.edu/regulations/idaho/IDAPA-16.03.05.514", + ) + + def formula(person, period, parameters): + receives_ssi = person("ssi", period) > 0 + la = person("id_aabd_living_arrangement", period) + LA = IDAAbdLivingArrangement + # Nursing facility residents excluded (Section 501) + federal_la = person("ssi_federal_living_arrangement", period.this_year) + not_in_medical = ( + federal_la != federal_la.possible_values.MEDICAL_TREATMENT_FACILITY + ) + return receives_ssi & not_in_medical & (la != LA.RALF_CFH) & (la != LA.NONE) diff --git a/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd_living_arrangement.py b/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd_living_arrangement.py new file mode 100644 index 00000000000..57c242d0cdc --- /dev/null +++ b/policyengine_us/variables/gov/states/id/dhw/aabd/id_aabd_living_arrangement.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class IDAAbdLivingArrangement(Enum): + SINGLE = "Single participant" + COUPLE = "Couple" + ESSENTIAL_PERSON = "Participant with essential person" + SIGRIF = "Semi-independent group residential facility" + ROOM_AND_BOARD = "Room and board" + RALF_CFH = "Residential assisted living facility or certified family home" + NONE = "Not applicable" + + +class id_aabd_living_arrangement(Variable): + value_type = Enum + entity = Person + label = "Idaho AABD living arrangement" + definition_period = MONTH + defined_for = StateCode.ID + possible_values = IDAAbdLivingArrangement + default_value = IDAAbdLivingArrangement.NONE + reference = ( + "https://adminrules.idaho.gov/rules/current/16/160305.pdf#page=39", + "https://www.law.cornell.edu/regulations/idaho/IDAPA-16.03.05.514", + ) diff --git a/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py b/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py index 84cb7e78d39..edc8eb29f77 100644 --- a/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py +++ b/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py @@ -15,6 +15,7 @@ def formula(spm_unit, period, parameters): "ga_ssp", "al_ssp", "ak_ssp", + "id_aabd", # Idaho benefits "de_ssp", # Delaware benefits "ma_state_supplement", # Massachusetts benefits # California programs.