diff --git a/changelog.d/ny-ssp-2026.added.md b/changelog.d/ny-ssp-2026.added.md new file mode 100644 index 00000000000..ca95253a1d0 --- /dev/null +++ b/changelog.d/ny-ssp-2026.added.md @@ -0,0 +1 @@ +Add New York State Supplement Program for 2026. diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index ffb762048b7..6bad1c4d142 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -101,6 +101,7 @@ values: # Washington benefits - wa_child_care_subsidies # New York benefits + - ny_ssp - ny_child_care_subsidies 2024-01-01: # Delaware benefits @@ -213,6 +214,7 @@ values: # Washington child care subsidies - wa_child_care_subsidies # New York benefits + - ny_ssp - ny_child_care_subsidies 2025-01-01: # Delaware benefits @@ -326,6 +328,7 @@ values: # Washington child care subsidies - wa_child_care_subsidies # New York benefits + - ny_ssp - ny_child_care_subsidies 2026-01-01: # Delaware benefits @@ -441,6 +444,7 @@ values: # New Jersey benefits - nj_property_tax_relief # New York benefits + - ny_ssp - ny_child_care_subsidies metadata: diff --git a/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml b/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml index 9a3bc0d80af..59145897a26 100644 --- a/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml @@ -26,6 +26,7 @@ values: - nv_oss - mt_ssp - ok_ssp + - ny_ssp - general_assistance - total_unemployment_compensation - child_support_received diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/couple.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/couple.yaml new file mode 100644 index 00000000000..11048eb02fa --- /dev/null +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/couple.yaml @@ -0,0 +1,19 @@ +description: New York provides this amount as the monthly couple payment for couples living alone or with others under the State Supplement Program. + +metadata: + unit: currency-USD + period: month + label: New York SSP couple amount + reference: + - title: New York 2026 SSI and SSP maximum monthly benefit levels + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 + - title: New York Social Services Law section 209(2)(a)-(b) + href: https://www.nysenate.gov/legislation/laws/SOS/209 + +# Congregate care couples have two times the individual standard of need +# (Social Services Law 209(2)(c)-(e)); ny_ssp computes those payments. +LIVING_ALONE: + 2026-01-01: 104 + +LIVING_WITH_OTHERS: + 2026-01-01: 46 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/individual.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/individual.yaml new file mode 100644 index 00000000000..45cd56ea9fd --- /dev/null +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/amount/individual.yaml @@ -0,0 +1,37 @@ +description: New York provides this amount as the monthly individual payment under the State Supplement Program. + +metadata: + unit: currency-USD + period: month + label: New York SSP individual amount + breakdown: + - ny_ssp_living_arrangement + reference: + - title: "New York 2026 SSI and SSP maximum monthly benefit levels #page 1-2" + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 + - title: New York Social Services Law section 209(2)(a)-(e) + href: https://www.nysenate.gov/legislation/laws/SOS/209 + +LIVING_ALONE: + 2026-01-01: 87 + +LIVING_WITH_OTHERS: + 2026-01-01: 23 + +FAMILY_CARE: + 2026-01-01: 228.48 + +RESIDENTIAL_CARE: + 2026-01-01: 405 + +ENHANCED_RESIDENTIAL_CARE: + 2026-01-01: 694 + +RESIDENTIAL_HEALTH_CARE_FACILITY: + 2026-01-01: 0 + +DEVELOPMENTAL_OR_MENTAL_HEALTH_FACILITY: + 2026-01-01: 0 + +NONE: + 2026-01-01: 0 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/downstate_counties.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/downstate_counties.yaml new file mode 100644 index 00000000000..2233481ce88 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/downstate_counties.yaml @@ -0,0 +1,21 @@ +description: New York pays the higher family care and residential care amounts in these counties under the State Supplement Program. +values: + 2026-01-01: + - BRONX_COUNTY_NY + - KINGS_COUNTY_NY + - NEW_YORK_COUNTY_NY + - QUEENS_COUNTY_NY + - RICHMOND_COUNTY_NY + - NASSAU_COUNTY_NY + - ROCKLAND_COUNTY_NY + - SUFFOLK_COUNTY_NY + - WESTCHESTER_COUNTY_NY + +metadata: + unit: list + label: New York SSP downstate care counties + reference: + - title: New York 2026 SSI and SSP maximum monthly benefit levels + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 + - title: New York Social Services Law section 209(2)(c)-(d) + href: https://www.nysenate.gov/legislation/laws/SOS/209 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/family_care_downstate_premium.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/family_care_downstate_premium.yaml new file mode 100644 index 00000000000..71a4dbe69a0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/family_care_downstate_premium.yaml @@ -0,0 +1,13 @@ +description: New York adds this amount per person to the monthly family care payment in downstate counties under the State Supplement Program. +values: + 2026-01-01: 38 + +metadata: + unit: currency-USD + period: month + label: New York SSP family care downstate premium + reference: + - title: New York 2026 SSI and SSP maximum monthly benefit levels + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 + - title: New York Social Services Law section 209(2)(c) + href: https://www.nysenate.gov/legislation/laws/SOS/209 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/minimum_payment.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/minimum_payment.yaml new file mode 100644 index 00000000000..3445c6c1b60 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/minimum_payment.yaml @@ -0,0 +1,11 @@ +description: New York sets this amount as the minimum monthly payment under the State Supplement Program. +values: + 2014-10-01: 1 + +metadata: + unit: currency-USD + period: month + label: New York SSP minimum payment + reference: + - title: 18 NYCRR 398-4.6(c), Payment of SSP benefits + href: https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-4.6 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/minor_age.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/minor_age.yaml new file mode 100644 index 00000000000..56aa37121ce --- /dev/null +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/minor_age.yaml @@ -0,0 +1,12 @@ +description: New York treats people below this age as minor children under the State Supplement Program. +values: + 2014-10-01: 18 + +metadata: + unit: year + label: New York SSP minor age + reference: + - title: 18 NYCRR 398-2.1(t), Minor child + href: https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1 + - title: New York Social Services Law section 209(3)(b) + href: https://www.nysenate.gov/legislation/laws/SOS/209 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/developmental_or_mental_health_facility.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/developmental_or_mental_health_facility.yaml new file mode 100644 index 00000000000..fd9945fc2c4 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/developmental_or_mental_health_facility.yaml @@ -0,0 +1,15 @@ +description: New York provides this amount as the monthly personal needs allowance to residents of developmental disabilities intermediate care facilities and state psychiatric hospitals under the State Supplement Program. +values: + 1988-01-01: 5 + +metadata: + unit: currency-USD + period: month + label: New York SSP developmental disabilities or mental health facility personal needs allowance + reference: + - title: New York 2026 SSI and SSP maximum monthly benefit levels + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=2 + - title: New York Social Services Law section 209(2-a) + href: https://www.nysenate.gov/legislation/laws/SOS/209 + - title: 18 NYCRR 398-3.4, Benefit levels for SSPNA + href: https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-3.4 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/residential_health_care_facility.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/residential_health_care_facility.yaml new file mode 100644 index 00000000000..69ea678c936 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/personal_needs/residential_health_care_facility.yaml @@ -0,0 +1,15 @@ +description: New York provides this amount as the monthly personal needs allowance to residential health care facility residents under the State Supplement Program. +values: + 1988-01-01: 25 + +metadata: + unit: currency-USD + period: month + label: New York SSP residential health care facility personal needs allowance + reference: + - title: New York 2026 SSI and SSP maximum monthly benefit levels + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=2 + - title: New York Social Services Law section 209(2-a) + href: https://www.nysenate.gov/legislation/laws/SOS/209 + - title: 18 NYCRR 398-3.4, Benefit levels for SSPNA + href: https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-3.4 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/residential_care_downstate_premium.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/residential_care_downstate_premium.yaml new file mode 100644 index 00000000000..d26f6fdeb2b --- /dev/null +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/residential_care_downstate_premium.yaml @@ -0,0 +1,13 @@ +description: New York adds this amount per person to the monthly residential care payment in downstate counties under the State Supplement Program. +values: + 2026-01-01: 30 + +metadata: + unit: currency-USD + period: month + label: New York SSP residential care downstate premium + reference: + - title: New York 2026 SSI and SSP maximum monthly benefit levels + href: https://opwdd.ny.gov/system/files/documents/2025/11/25-inf-06-attachment-1.pdf#page=1 + - title: New York Social Services Law section 209(2)(d) + href: https://www.nysenate.gov/legislation/laws/SOS/209 diff --git a/policyengine_us/parameters/gov/states/ny/otda/ssp/student_minor_age.yaml b/policyengine_us/parameters/gov/states/ny/otda/ssp/student_minor_age.yaml new file mode 100644 index 00000000000..82df5738e3e --- /dev/null +++ b/policyengine_us/parameters/gov/states/ny/otda/ssp/student_minor_age.yaml @@ -0,0 +1,12 @@ +description: New York treats unmarried students who do not head a household as minor children below this age under the State Supplement Program. +values: + 2014-10-01: 22 + +metadata: + unit: year + label: New York SSP student minor age + reference: + - title: 18 NYCRR 398-2.1(t), Minor child + href: https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1 + - title: New York Social Services Law section 209(3)(b) + href: https://www.nysenate.gov/legislation/laws/SOS/209 diff --git a/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml b/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml index deeeeeaef3a..78ce6f60c08 100644 --- a/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml @@ -51,6 +51,7 @@ values: - nj_ssp - nm_ssi_state_supplement - nv_oss + - ny_ssp - ok_ssp - pa_ssp - sc_ssi_state_supplement diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 2963a40c73d..68d896d0196 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1170,6 +1170,16 @@ programs: notes: Models the 2026 community supplement for individuals, couples and individuals with an ineligible spouse. Essential spouses, persons in a TANF case and grandfathered institutional payments are not modeled. + - state: NY + status: partial + name: New York SSP + full_name: New York State Supplement Program + variable: ny_ssp + parameter_prefix: gov.states.ny.otda.ssp + verified_years: '2026' + notes: Models 2026 living alone, living with others and congregate care supplements with + downstate premiums, plus the medical facility personal needs allowance. Grandfathered + mandatory payments are not modeled. - id: social_security name: Social Security diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/integration.yaml new file mode 100644 index 00000000000..72f1201d719 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/integration.yaml @@ -0,0 +1,307 @@ +- name: Case 1, couple living alone. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + person2: + age: 65 + marital_units: + couple: + members: [person1, person2] + tax_units: + unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NY + county: ALBANY_COUNTY_NY + output: + ny_ssp: [52, 52] + +- name: Case 2, family care couple. + # Social Services Law 209(2)(c): two times the 1_260.48 downstate individual + # standard is 2_520.96, less the 1_491 couple FBR = 1_029.96, or 514.98 each. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + ny_ssp_care_setting: FAMILY_CARE + person2: + age: 65 + ny_ssp_care_setting: FAMILY_CARE + marital_units: + couple: + members: [person1, person2] + tax_units: + unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NY + county: NEW_YORK_COUNTY_NY + output: + ny_ssp: [514.98, 514.98] + +- name: Case 3, residential care couple in a small non-institutional facility. + # 18 NYCRR 398-4.5(d): couple status continues where the facility is not an + # institution for SSI. 2 * 1_399 - 1_491 = 1_307, or 653.50 each. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + ny_ssp_care_setting: RESIDENTIAL_CARE + person2: + age: 65 + ny_ssp_care_setting: RESIDENTIAL_CARE + marital_units: + couple: + members: [person1, person2] + tax_units: + unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NY + county: ALBANY_COUNTY_NY + output: + ny_ssp: [653.5, 653.5] + +- name: Case 4, enhanced residential care couple in a small non-institutional facility. + # 18 NYCRR 398-4.5(e): 2 * 1_688 - 1_491 = 1_885, or 942.50 each. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE + person2: + age: 65 + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE + marital_units: + couple: + members: [person1, person2] + tax_units: + unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NY + county: ALBANY_COUNTY_NY + output: + ny_ssp: [942.5, 942.5] + +- name: Case 5, ineligible spouse uses living with others. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + person2: + age: 40 + marital_units: + couple: + members: [person1, person2] + tax_units: + unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NY + county: ALBANY_COUNTY_NY + output: + ny_ssp: [23, 0] + +- name: Case 6, spouse deemed income above the standard of need leaves no state payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + person2: + # Early-claimed Social Security retirement benefit of 1_550 a month. + age: 63 + social_security_retirement: 18_600 + marital_units: + couple: + members: [person1, person2] + tax_units: + unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NY + county: ALBANY_COUNTY_NY + output: + # Spouse income 18_600 / 12 = 1_550 > 1_491 - 994 = 497, so deeming applies. + is_ssi_spousal_deeming_applies: [true, false] + # Couple countable (1_550 - 20) - own countable 0 = 1_530. + ssi_income_deemed_from_ineligible_spouse: [1_530, 0] + ssi_countable_income: [1_530, 0] + # Couple FBR 1_491 - 1_530 = -39, so no federal SSI. + uncapped_ssi: [-39, 0] + ssi: [0, 0] + # The ineligible spouse makes a two-person household. + ny_ssp_living_arrangement: [LIVING_WITH_OTHERS, LIVING_WITH_OTHERS] + # 18 NYCRR 398-4.4(b): standard 994 + 23 = 1_017 minus the greater of the + # 994 FBR or countable income 1_530 is below zero, so no state payment. + ny_ssp: [0, 0] + +- name: Case 7, annual benefit and SNAP income. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + output: + ny_ssp: 1_044 + household_state_benefits: 1_044 + snap_unearned_income: 12_972 + hud_unearned_income: 12_972 + # SNAP with the 877 utility allowance: 168 a month in January to September + # (298 - 130) and 180 in October to December (306 - 126), 2_052 a year. + # SSI 11_928 + 1_044 + 2_052 = 15_024. + spm_unit_benefits: 15_024 + +- name: Case 8, part-time earnings reduce SSI but not the state payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + meets_ssi_disability_criteria: true + # 20 hours a week at the 2026 minimum wage outside New York City, + # Long Island and Westchester ($16.00, https://dol.ny.gov/minimum-wage-0): + # 16 * 20 * 52 = 16_640. + employment_income: 16_640 + households: + household: + members: [person1] + state_code: NY + county: ALBANY_COUNTY_NY + output: + # 16_640 / 12 = 1_386.67 a month. + ssi_earned_income: 1_386.67 + # 1_386.67 is below the 2026 non-blind SGA limit of 1_690. + ssi_engaged_in_sga: false + is_ssi_disabled: true + # (1_386.67 - 20 general - 65 earned) / 2 = 650.83. + ssi_countable_income: 650.83 + # Individual FBR in the person's own household. + ssi_amount_if_eligible: 994 + # 994 - 650.83 = 343.17. + uncapped_ssi: 343.17 + ssi: 343.17 + ny_ssp_is_minor: false + # One-person household. + ny_ssp_living_arrangement: LIVING_ALONE + # Excess countable income max(650.83 - 994, 0) = 0: living alone rate 87 - 0 = 87. + ny_ssp: 87 + +- name: Case 9, residential care spouses claim as individuals after the month of entry. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + ny_ssp_care_setting: RESIDENTIAL_CARE + person2: + age: 65 + ny_ssp_care_setting: RESIDENTIAL_CARE + # 18 NYCRR 398-4.5(d): after the month of entry into an institutional level + # II facility, the spouses are two individuals, entered as separate units. + marital_units: + unit1: + members: [person1] + unit2: + members: [person2] + tax_units: + unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NY + county: ALBANY_COUNTY_NY + output: + ssi: [994, 994] + ny_ssp: [405, 405] + +- name: Case 10, enhanced residential care spouses claim as individuals after the month of entry. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE + person2: + age: 65 + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE + # 18 NYCRR 398-4.5(e) applies the same rule to level III. + marital_units: + unit1: + members: [person1] + unit2: + members: [person2] + tax_units: + unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NY + county: ALBANY_COUNTY_NY + output: + ssi: [994, 994] + ny_ssp: [694, 694] + +- name: Case 11, spouse with part-time earnings leaves the state payment unchanged under deeming. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + person2: + age: 63 + # 20 hours a week at the 2026 minimum wage outside New York City, + # Long Island and Westchester ($16.00, https://dol.ny.gov/minimum-wage-0): + # 16 * 20 * 52 = 16_640. + employment_income: 16_640 + marital_units: + couple: + members: [person1, person2] + tax_units: + unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NY + county: ALBANY_COUNTY_NY + output: + # Spouse earnings 16_640 / 12 = 1_386.67 > 497, so deeming applies. + is_ssi_spousal_deeming_applies: [true, false] + # (1_386.67 - 20 - 65) / 2 = 650.83. + ssi_countable_income: [650.83, 0] + # Couple FBR 1_491 - 650.83 = 840.17. + ssi: [840.17, 0] + # 18 NYCRR 398-4.4(b): 1_017 - max(994, 650.83) = 23. + ny_ssp: [23, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp.yaml b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp.yaml new file mode 100644 index 00000000000..0559c19f184 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp.yaml @@ -0,0 +1,741 @@ +- name: Case 1, living alone. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + output: + ny_ssp: 87 + +- name: Case 2, living with others. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ny_ssp_living_arrangement: LIVING_WITH_OTHERS + output: + ny_ssp: 23 + +- name: Case 3, federal household reduction. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + output: + ny_ssp: 23 + +- name: Case 4, family_care in albany_county_ny. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ny_ssp_care_setting: FAMILY_CARE + county: ALBANY_COUNTY_NY + output: + ny_ssp: 228.48 + +- name: Case 5, family_care in bronx_county_ny. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ny_ssp_care_setting: FAMILY_CARE + county: BRONX_COUNTY_NY + output: + ny_ssp: 266.48 + +- name: Case 6, family_care in nassau_county_ny. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ny_ssp_care_setting: FAMILY_CARE + county: NASSAU_COUNTY_NY + output: + ny_ssp: 266.48 + +- name: Case 7, residential_care in albany_county_ny. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ny_ssp_care_setting: RESIDENTIAL_CARE + county: ALBANY_COUNTY_NY + output: + ny_ssp: 405 + +- name: Case 8, residential_care in westchester_county_ny. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ny_ssp_care_setting: RESIDENTIAL_CARE + county: WESTCHESTER_COUNTY_NY + output: + ny_ssp: 435 + +- name: Case 9, enhanced_residential_care in albany_county_ny. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE + county: ALBANY_COUNTY_NY + output: + ny_ssp: 694 + +- name: Case 10, state only payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + social_security_retirement: 12_360 + output: + ny_ssp: 71 + +- name: Case 11, state minimum payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + social_security_retirement: 13_209 + output: + ny_ssp: 1 + +- name: Case 12, income cutoff. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + social_security_retirement: 13_212 + output: + ny_ssp: 0 + +- name: Case 13, excess resources. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ssi_countable_resources: 2_001 + output: + ny_ssp: 0 + +- name: Case 14, nonresident. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NJ + age: 65 + output: + ny_ssp: 0 + +- name: Case 15, no aged blind or disability eligibility. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 30 + output: + ny_ssp: 0 + +- name: Case 16, does not apply for SSI. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + takes_up_ssi_if_eligible: false + output: + ny_ssp: 0 + +- name: Case 17, excluded institution. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ny_ssp_care_setting: EXCLUDED + output: + ny_ssp: 0 + +- name: Case 18, residential health care facility personal needs by default. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + output: + ny_ssp: 25 + +- name: Case 19, OPWDD or OMH facility personal needs. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + ny_ssp_care_setting: DEVELOPMENTAL_OR_MENTAL_HEALTH_FACILITY + output: + ny_ssp: 5 + +- name: Case 20, nursing facility countable income prevents personal needs. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + social_security_retirement: 252 + output: + ny_ssp: 0 + +- name: Case 21, excluded income does not prevent personal needs. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + social_security_retirement: 240 + output: + ny_ssp: 25 + +- name: Case 22, institution without Medicaid paying majority. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ssi_lives_in_medical_treatment_facility: true + output: + ny_ssp: 0 + +- name: Case 23, OPWDD or OMH facility without Medicaid paying the majority. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ny_ssp_care_setting: DEVELOPMENTAL_OR_MENTAL_HEALTH_FACILITY + output: + ny_ssp: 0 + +- name: Case 24, minor in enhanced care receives household rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 17 + is_blind: true + is_full_time_student: false + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE + output: + ny_ssp: 23 + +- name: Case 25, student under twenty two is a minor. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 21 + is_blind: true + is_full_time_student: true + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE + output: + ny_ssp: 23 + +- name: Case 26, student at age twenty two receives care rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 22 + is_blind: true + is_full_time_student: true + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE + output: + ny_ssp: 694 + +- name: Case 27, certified minor family placement receives care rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 17 + is_blind: true + is_full_time_student: false + ny_ssp_care_setting: FAMILY_CARE + output: + ny_ssp: 228.48 + +# 18 NYCRR 398-2.1(t): is_full_time_student stands in for regular school attendance; +# qualifying part-time attendance is not modeled. +# https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1 +- name: Case 28, full-time student who is not a household head receives minor rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 20 + is_blind: true + is_full_time_student: true + is_household_head: false + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE + output: + ny_ssp: 23 + +- name: Case 29, part-time attendance does not confer minor status. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 20 + is_blind: true + is_part_time_college_student: true + is_full_time_student: false + is_household_head: false + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE + output: + ny_ssp: 694 + +- name: Case 30, full-time student who is household head receives adult rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 20 + is_blind: true + is_full_time_student: true + is_household_head: true + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE + output: + ny_ssp: 694 + +- name: Case 31, full-time student at age twenty-two receives adult rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 22 + is_blind: true + is_full_time_student: true + is_household_head: false + ny_ssp_care_setting: ENHANCED_RESIDENTIAL_CARE + output: + ny_ssp: 694 + +# 18 NYCRR 398-2.1(t): a minor is neither married nor a head of a household, +# under both the age and the student test. +# https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1 +- name: Case 32, blind seventeen-year-old household head living alone is not a minor. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 17 + is_blind: true + is_household_head: true + output: + # Age 17 < 18, but a household head is not a minor. + ny_ssp_is_minor: false + # One-person household, not a minor: living alone. + ny_ssp_living_arrangement: LIVING_ALONE + # Living alone rate 87 - excess countable income 0 = 87. + ny_ssp: 87 + +- name: Case 33, blind sixteen-year-old living with parents receives minor rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + own_children_in_household: 1 + person2: + age: 43 + own_children_in_household: 1 + person3: + age: 16 + is_blind: true + marital_units: + parents: + members: [person1, person2] + child: + members: [person3] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: NY + output: + # person3: age 16 < 18, unmarried and not a household head. + ny_ssp_is_minor: [false, false, true] + # person3 is a minor (the three-person household also rules out living alone). + ny_ssp_living_arrangement: [LIVING_WITH_OTHERS, LIVING_WITH_OTHERS, LIVING_WITH_OTHERS] + # Parents have no income to deem: living with others rate 23 - 0 = 23. + # The parents are not aged, blind or disabled. + ny_ssp: [0, 0, 23] + +- name: Case 34, unmarried twenty-year-old student with married parents is a minor. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + person2: + age: 48 + person3: + age: 20 + is_blind: true + is_full_time_student: true + marital_units: + parents: + members: [person1, person2] + child: + members: [person3] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: NY + output: + # person3: age 20 < 22 and a full-time student; the parents' marriage does + # not make person3 married. + ny_ssp_is_minor: [false, false, true] + ny_ssp_living_arrangement: [LIVING_WITH_OTHERS, LIVING_WITH_OTHERS, LIVING_WITH_OTHERS] + # No countable income: living with others rate 23 - 0 = 23. + ny_ssp: [0, 0, 23] + +- name: Case 35, general hospital resident receives no state payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + # Social Services Law 209(2-a) pays no allowance in a general hospital. + ny_ssp_care_setting: EXCLUDED + output: + ssi: 30 + ny_ssp_living_arrangement: NONE + ny_ssp: 0 + +- name: Case 36, person at the minor age living alone is not a minor. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 18 + is_blind: true + is_full_time_student: false + output: + ny_ssp_living_arrangement: LIVING_ALONE + ny_ssp: 87 + +- name: Case 37, married seventeen-year-old is not a minor. + period: 2026 + input: + people: + person1: + age: 17 + is_blind: true + # A spouse is not the other spouse's tax dependent. + is_tax_unit_dependent: false + person2: + age: 19 + marital_units: + couple: + members: [person1, person2] + tax_units: + unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NY + output: + # 18 NYCRR 398-2.1(t): a minor child is neither married nor a household head. + ny_ssp_is_minor: [false, false] + +- name: Case 38, living only with a foster child is living alone. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + person2: + age: 10 + is_in_foster_care: true + households: + household: + members: [person1, person2] + state_code: NY + output: + # 18 NYCRR 398-4.5(a)(1)(vi): lives with only a foster child. + ny_ssp_living_arrangement: [LIVING_ALONE, LIVING_WITH_OTHERS] + ny_ssp: [87, 0] + +- name: Case 39, spouse at home is living alone while the other spouse is in a nursing home. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + person2: + age: 70 + marital_units: + couple: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NY + output: + ny_ssp_living_arrangement: [RESIDENTIAL_HEALTH_CARE_FACILITY, LIVING_ALONE] + ssi: [30, 994] + # $25 allowance in the nursing home; 87 living alone at home. + ny_ssp: [25, 87] + +- name: Case 40, nursing home resident with an ineligible spouse at home receives the personal needs allowance. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + person2: + age: 63 + social_security_retirement: 12_000 + # 20 CFR 416.1160(a)(1) deems an ineligible spouse's income only in the + # same household, and 416.1167(a)(2) keeps a facility resident in it only + # while a 416.212 benefit is paid. Separate marital units keep the federal + # model from deeming to a resident on the reduced benefit. + marital_units: + unit1: + members: [person1] + unit2: + members: [person2] + households: + household: + members: [person1, person2] + state_code: NY + output: + ny_ssp_living_arrangement: [RESIDENTIAL_HEALTH_CARE_FACILITY, LIVING_ALONE] + ssi: [30, 0] + # No countable income besides the $30 SSI: the $25 allowance + # (18 NYCRR 398-3.2(d), 398-3.4). The spouse is not aged, blind or disabled. + ny_ssp: [25, 0] + +- name: Case 41, spouse at home is living alone while the other spouse is in a facility Medicaid does not mostly pay for. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + ssi_lives_in_medical_treatment_facility: true + person2: + age: 70 + marital_units: + couple: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NY + output: + ny_ssp_living_arrangement: [NONE, LIVING_ALONE] + # Known limitation: with one marital unit the federal model still computes + # the spouses as a couple, and the shared helper averages the members' + # couple rates, (0 + 104) / 4 = 26, instead of the 87 for an individual + # living alone (18 NYCRR 398-2.1(l)). Enter spouses who live apart as + # separate marital units (Case 45). The resident receives nothing. + ssi: [745.5, 745.5] + ny_ssp: [0, 26] + +- name: Case 42, household member in a medical facility does not end living alone. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + person2: + age: 45 + ssi_lives_in_medical_treatment_facility: true + households: + household: + members: [person1, person2] + state_code: NY + output: + ny_ssp_living_arrangement: [LIVING_ALONE, NONE] + ny_ssp: [87, 0] + +- name: Case 43, foster youth living with one foster parent lives with others. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 19 + meets_ssi_disability_criteria: true + is_full_time_student: false + is_in_foster_care: true + person2: + age: 45 + marital_units: + unit1: + members: [person1] + unit2: + members: [person2] + households: + household: + members: [person1, person2] + state_code: NY + output: + # 18 NYCRR 398-4.5(b)(1): the youth shares the foster home. The foster + # parent lives with only a foster child ((a)(1)(vi)). + ny_ssp_living_arrangement: [LIVING_WITH_OTHERS, LIVING_ALONE] + ny_ssp: [23, 0] + +- name: Case 44, foster youth living by themselves lives alone. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 19 + meets_ssi_disability_criteria: true + is_full_time_student: false + is_in_foster_care: true + output: + # A private household of one SSP-eligible individual (18 NYCRR 398-4.5(a)). + ny_ssp_living_arrangement: LIVING_ALONE + ny_ssp: 87 + +- name: Case 45, spouse in an excluded setting entered as a separate marital unit leaves the other spouse living alone. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + ny_ssp_care_setting: EXCLUDED + person2: + age: 70 + marital_units: + unit1: + members: [person1] + unit2: + members: [person2] + households: + household: + members: [person1, person2] + state_code: NY + output: + # A spouse in an excluded setting is not part of the private household + # (18 NYCRR 398-4.5(a)), and spouses living apart are not an eligible + # couple (398-2.1(l)). + ny_ssp_living_arrangement: [NONE, LIVING_ALONE] + ny_ssp: [0, 87] + +- name: Case 46, state only payment in another person's household. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NY + age: 65 + social_security_retirement: 8_400 + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + output: + # $700 a month less the $20 exclusion is 680, above the reduced federal + # benefit rate of 994 x 2/3 = 662.67, so SSI is 0. + ssi_countable_income: 680 + ssi: 0 + # Standard of need 662.67 + 23 = 685.67, so 685.67 - 680 = 5.67. + ny_ssp: 5.67 + +- name: Case 47, state only payment for a couple living alone. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + social_security_retirement: 19_200 + person2: + age: 70 + marital_units: + couple: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NY + output: + ny_ssp_living_arrangement: [LIVING_ALONE, LIVING_ALONE] + # $1,600 a month less the $20 exclusion is 1,580 for the couple, above + # the 1,491 couple federal benefit rate, so SSI is 0. + ssi: [0, 0] + # Couple standard of need 1,491 + 104 = 1,595: (1,595 - 1,580) / 2 = 7.50 + # each. + ny_ssp: [7.5, 7.5] + +- name: Case 48, claimant living with only a family care resident lives alone. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + person2: + age: 40 + meets_ssi_disability_criteria: true + ny_ssp_care_setting: FAMILY_CARE + marital_units: + unit1: + members: [person1] + unit2: + members: [person2] + households: + household: + members: [person1, person2] + state_code: NY + output: + # 18 NYCRR 398-4.5(a)(1)(viii): living with only a family care resident + # counts as living alone. The resident gets the family care rate. + ny_ssp_living_arrangement: [LIVING_ALONE, FAMILY_CARE] + ny_ssp: [87, 228.48] diff --git a/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp.py b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp.py new file mode 100644 index 00000000000..c69e3ac2acf --- /dev/null +++ b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp.py @@ -0,0 +1,138 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.ssa.ssi._ssi_state_supplement import ( + ssi_state_supplement, +) +from policyengine_us.variables.gov.ssa.ssi.eligibility.status.ssi_federal_living_arrangement import ( + SSIFederalLivingArrangement, +) + + +class ny_ssp(Variable): + value_type = float + entity = Person + label = "New York State Supplement Program payment" + unit = USD + definition_period = MONTH + defined_for = StateCode.NY + reference = ( + # Social Services Law 209(2)(a)-(e), (2-a), (4) + "https://www.nysenate.gov/legislation/laws/SOS/209", + # 18 NYCRR 398-2.1(g), (l), (o), (ac) + "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1", + "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-3.2", + "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-3.4", + "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-4.2", + "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-4.4", + "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-4.6", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.ny.otda.ssp + fbr = parameters(period).gov.ssa.ssi.amount + arrangement = person("ny_ssp_living_arrangement", period) + la = arrangement.possible_values + # A minor in level III receives the living-with-others rate. + minor = person("ny_ssp_is_minor", period.this_year) + minor_enhanced_care = minor & (arrangement == la.ENHANCED_RESIDENTIAL_CARE) + county = person.household("county_str", period.this_year) + downstate = np.isin(county, p.downstate_counties) + premium = downstate * select( + [arrangement == la.FAMILY_CARE, arrangement == la.RESIDENTIAL_CARE], + [p.family_care_downstate_premium, p.residential_care_downstate_premium], + default=0, + ) + individual = where( + minor_enhanced_care, + p.amount.individual.LIVING_WITH_OTHERS, + p.amount.individual[arrangement] + premium, + ) + congregate_care = ( + (arrangement == la.FAMILY_CARE) + | (arrangement == la.RESIDENTIAL_CARE) + | (arrangement == la.ENHANCED_RESIDENTIAL_CARE) + ) & ~minor_enhanced_care + household_couple = select( + [ + arrangement == la.LIVING_ALONE, + (arrangement == la.LIVING_WITH_OTHERS) | minor_enhanced_care, + ], + [p.amount.couple.LIVING_ALONE, p.amount.couple.LIVING_WITH_OTHERS], + default=0, + ) + # Social Services Law 209(2)(c)-(e): a congregate care couple's standard + # of need is two times the individual standard, so its supplement moves + # with each federal benefit increase. + couple = where( + congregate_care, + 2 * (fbr.individual + individual) - fbr.couple, + household_couple, + ) + # NOTE: 18 NYCRR 398-2.1(l) requires both spouses to be in active + # receipt of SSI. The federal couple computation ignores take-up, so a + # couple in which an aged, blind or disabled spouse declines SSI is + # still computed as a couple. + payment = ssi_state_supplement( + person, + period, + parameters, + individual, + couple, + federal_payment_rules=False, + ) + # NOTE: Under spousal deeming, New York's sources differ. The shared + # helper follows SSA's method for federally administered supplements + # (POMS SI 01320.430 D), which uses the couple rate. Social Services Law + # 209(4) subtracts "the sum of such individual's or couple's + # supplemental security income benefit plus countable income". 18 NYCRR + # 398-2.1(ac) and 398-4.4(b) subtract "the FBR or a recipient's monthly + # Countable Income, whichever is greater", where the FBR is "the maximum + # amount of SSI payable to an individual or couple with no countable + # income" (398-2.1(o)). New York administers its own supplement since + # October 1, 2014, and the model follows the regulation: countable + # income includes the deemed income (398-2.1(g)), measured against the + # individual's own FBR. + deeming = person("is_ssi_spousal_deeming_applies", period.this_year) + federal_la = person("ssi_federal_living_arrangement", period) + # 20 CFR 416.1131(a): one-third of the FBR counts as income in another + # person's household. + own_fbr = fbr.individual * where( + federal_la == SSIFederalLivingArrangement.ANOTHER_PERSONS_HOUSEHOLD, + 1 - fbr.one_third_reduction_rate, + 1, + ) + countable = person("ssi_countable_income", period) + regulatory = max_(individual - max_(countable - own_fbr, 0), 0) + eligible = person("is_ssi_eligible", period) & person( + "takes_up_ssi_if_eligible", period.this_year + ) + payment = where(deeming, eligible * regulatory, payment) + # Social Services Law 209(1)(d): no state payment in a public + # institution or a medical facility where Medicaid pays more than half + # the cost; only the personal needs allowance is paid there. + no_standard = ( + (arrangement == la.NONE) + | (arrangement == la.RESIDENTIAL_HEALTH_CARE_FACILITY) + | (arrangement == la.DEVELOPMENTAL_OR_MENTAL_HEALTH_FACILITY) + ) + payment = where(no_standard, 0, payment) + payment = where(payment > 0, max_(payment, p.minimum_payment), 0) + # NOTE: The 2026 OTDA chart gives $5 to residents of "other medical + # facilities"; Social Services Law 209(2-a) and 18 NYCRR 398-3.4 limit + # the $5 allowance to OPWDD intermediate care facilities and OMH + # hospitals and pay $25 in residential health care facilities. The + # model follows the statute and regulation. + personal_needs_eligible = (person("ssi", period) > 0) & ( + person("ssi_countable_income", period) == 0 + ) + personal_needs = select( + [ + arrangement == la.RESIDENTIAL_HEALTH_CARE_FACILITY, + arrangement == la.DEVELOPMENTAL_OR_MENTAL_HEALTH_FACILITY, + ], + [ + p.personal_needs.residential_health_care_facility, + p.personal_needs.developmental_or_mental_health_facility, + ], + default=0, + ) + return payment + personal_needs_eligible * personal_needs diff --git a/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_care_setting.py b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_care_setting.py new file mode 100644 index 00000000000..df52ffcce82 --- /dev/null +++ b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_care_setting.py @@ -0,0 +1,40 @@ +from policyengine_us.model_api import * + + +class NYSSPCareSetting(Enum): + FAMILY_CARE = "New York certified family care (congregate care level I)" + RESIDENTIAL_CARE = "New York certified residential care (congregate care level II)" + ENHANCED_RESIDENTIAL_CARE = ( + "New York certified enhanced residential care (congregate care level III)" + ) + DEVELOPMENTAL_OR_MENTAL_HEALTH_FACILITY = ( + "OPWDD intermediate care facility or OMH hospital" + ) + EXCLUDED = "Setting excluded from the New York State Supplement Program" + NONE = "No certified care or designated facility setting" + + +class ny_ssp_care_setting(Variable): + value_type = Enum + entity = Person + label = "New York SSP care setting" + definition_period = MONTH + defined_for = StateCode.NY + possible_values = NYSSPCareSetting + default_value = NYSSPCareSetting.NONE + reference = ( + "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-4.5", + "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-3.4", + ) + documentation = """ + Certified care levels require an operating certificate for the facility. + Family and residential care for minors require the authorized placements + in 18 NYCRR 398-4.5. DEVELOPMENTAL_OR_MENTAL_HEALTH_FACILITY covers OPWDD + intermediate care facilities and OMH hospitals, which pay the lower + personal needs allowance when Medicaid pays most of the cost of care. + EXCLUDED covers publicly operated residences, emergency shelters and other + medical facilities, such as general hospitals, that the State Supplement + Program does not pay. Use separate marital units for a spouse living apart + in an excluded setting, and for couples after their month of entry into an + institutional level II or III facility. + """ diff --git a/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_is_minor.py b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_is_minor.py new file mode 100644 index 00000000000..55e7265f1b6 --- /dev/null +++ b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_is_minor.py @@ -0,0 +1,36 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.ssa.ssi.eligibility.resources.deemed._ssi_spouses import ( + _ssi_spouse_index, +) + + +class ny_ssp_is_minor(Variable): + value_type = bool + entity = Person + label = "Minor for New York State Supplement Program living arrangements" + definition_period = YEAR + defined_for = StateCode.NY + reference = ( + # 18 NYCRR 398-2.1(t) + "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-2.1", + # Social Services Law 209(3)(b) + "https://www.nysenate.gov/legislation/laws/SOS/209", + ) + documentation = """ + A minor is below the minor age, or below the student minor age and a + full-time student, and is neither married nor the head of a household. + Set is_household_head for a student who lives away from home and heads + their own household. Part-time attendance that counts as regular + attendance under 20 CFR 416.1861 is not captured by is_full_time_student. + """ + + def formula(person, period, parameters): + p = parameters(period).gov.states.ny.otda.ssp + age = person("age", period) + student = person("is_full_time_student", period) + # Marriage uses the SSI spouse test, so a child of a married couple + # is not treated as married. + married = _ssi_spouse_index(person, period) >= 0 + head = person("is_household_head", period) + under_age = (age < p.minor_age) | ((age < p.student_minor_age) & student) + return under_age & ~married & ~head diff --git a/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_living_arrangement.py b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_living_arrangement.py new file mode 100644 index 00000000000..116ef0272ff --- /dev/null +++ b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_living_arrangement.py @@ -0,0 +1,91 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.ssa.ssi.eligibility.status.ssi_federal_living_arrangement import ( + SSIFederalLivingArrangement, +) +from policyengine_us.variables.gov.states.ny.otda.ssp.ny_ssp_care_setting import ( + NYSSPCareSetting, +) + + +class NYSSPLivingArrangement(Enum): + LIVING_ALONE = "Living alone" + LIVING_WITH_OTHERS = "Living with others" + FAMILY_CARE = "Certified congregate care level I" + RESIDENTIAL_CARE = "Certified congregate care level II" + ENHANCED_RESIDENTIAL_CARE = "Certified congregate care level III" + RESIDENTIAL_HEALTH_CARE_FACILITY = "Residential health care facility" + DEVELOPMENTAL_OR_MENTAL_HEALTH_FACILITY = ( + "OPWDD intermediate care facility or OMH hospital" + ) + NONE = "No eligible New York living arrangement" + + +class ny_ssp_living_arrangement(Variable): + value_type = Enum + entity = Person + label = "New York State Supplement Program living arrangement" + definition_period = MONTH + defined_for = StateCode.NY + possible_values = NYSSPLivingArrangement + default_value = NYSSPLivingArrangement.NONE + reference = ( + "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-4.5", + "https://www.law.cornell.edu/regulations/new-york/18-NYCRR-398-3.4", + ) + documentation = """ + Care levels and designated facilities come from ny_ssp_care_setting. + Residents of medical facilities where Medicaid pays more than half the + cost default to a residential health care facility (nursing home). Set + this variable for every member of the household only for the separate-food, + room-and-board, homemaker or aide cases that 18 NYCRR 398-4.5(a)(1) counts + as living alone. A family care resident counts through their own + ny_ssp_care_setting. + """ + + def formula(person, period, parameters): + la = NYSSPLivingArrangement + care = person("ny_ssp_care_setting", period) + federal = person("ssi_federal_living_arrangement", period) + medical = federal == SSIFederalLivingArrangement.MEDICAL_TREATMENT_FACILITY + in_facility = person("ssi_lives_in_medical_treatment_facility", period) + designated = care == NYSSPCareSetting.DEVELOPMENTAL_OR_MENTAL_HEALTH_FACILITY + excluded = (care == NYSSPCareSetting.EXCLUDED) | ( + (in_facility | designated) & ~medical + ) + other = federal == SSIFederalLivingArrangement.ANOTHER_PERSONS_HOUSEHOLD + joint = person("ssi_couple_computation_applies", period) + # 18 NYCRR 398-4.5(a) defines living alone by the private household. + # Foster children ((a)(1)(vi), (a)(2)(ii)), family care residents + # ((a)(1)(viii)) and members living in a facility or another care + # setting do not end it. The count leaves out the person themselves, + # so their own foster status does not matter. + housemate = ( + ~person("is_in_foster_care", period) + & ~in_facility + & (care == NYSSPCareSetting.NONE) + ) + housemates = person.household.sum(housemate) - housemate + spouse = person.marital_unit.sum(housemate) - housemate + alone = housemates == where(joint, spouse, 0) + minor = person("ny_ssp_is_minor", period.this_year) + return select( + [ + excluded, + medical & designated, + medical, + care == NYSSPCareSetting.FAMILY_CARE, + care == NYSSPCareSetting.RESIDENTIAL_CARE, + care == NYSSPCareSetting.ENHANCED_RESIDENTIAL_CARE, + other | minor | ~alone, + ], + [ + la.NONE, + la.DEVELOPMENTAL_OR_MENTAL_HEALTH_FACILITY, + la.RESIDENTIAL_HEALTH_CARE_FACILITY, + la.FAMILY_CARE, + la.RESIDENTIAL_CARE, + la.ENHANCED_RESIDENTIAL_CARE, + la.LIVING_WITH_OTHERS, + ], + default=la.LIVING_ALONE, + ) 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 34e7c49e878..748e7de27f7 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 @@ -28,6 +28,7 @@ def formula(spm_unit, period, parameters): "nc_sa", # North Carolina benefits "mt_ssp", # Montana benefits "ok_ssp", # Oklahoma benefits + "ny_ssp", # New York benefits "ks_sspp", # Kansas benefits "hi_oss", "la_oss", # Louisiana benefits