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 d2cbd6ba2d4..87e4bd2b57c 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -90,6 +90,7 @@ values: # Washington benefits - wa_child_care_subsidies # New York benefits + - ny_ssp - ny_child_care_subsidies 2024-01-01: # Delaware benefits @@ -192,6 +193,7 @@ values: # Washington child care subsidies - wa_child_care_subsidies # New York benefits + - ny_ssp - ny_child_care_subsidies 2025-01-01: # Delaware benefits @@ -295,6 +297,7 @@ values: # Washington child care subsidies - wa_child_care_subsidies # New York benefits + - ny_ssp - ny_child_care_subsidies 2026-01-01: # Delaware benefits @@ -400,7 +403,9 @@ values: # New Jersey benefits - nj_property_tax_relief # New York benefits + - ny_ssp - ny_child_care_subsidies + metadata: unit: list period: year 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 0df11213631..b6daf259c7f 100644 --- a/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml @@ -19,6 +19,7 @@ values: - strike_benefits - social_security - ssi + - ny_ssp - general_assistance - total_unemployment_compensation - child_support_received @@ -29,6 +30,7 @@ values: - disability_benefits - survivor_benefits - financial_assistance + metadata: unit: list period: year diff --git a/policyengine_us/parameters/gov/ssa/ssi/state_supplement/minimum_payment.yaml b/policyengine_us/parameters/gov/ssa/ssi/state_supplement/minimum_payment.yaml new file mode 100644 index 00000000000..1d3e6e2e6b6 --- /dev/null +++ b/policyengine_us/parameters/gov/ssa/ssi/state_supplement/minimum_payment.yaml @@ -0,0 +1,13 @@ +description: The Social Security Administration pays at least this monthly amount to each recipient of a positive federally administered optional state supplement. +values: + 2026-01-01: 1 + +metadata: + unit: currency-USD + period: month + label: SSI optional state supplement minimum payment + reference: + - title: 20 CFR 416.2020(c) - Minimum federally administered supplementary payment + href: https://www.ssa.gov/OP_Home/cfr20/416/416-2020.htm + - title: POMS SI 02001.005 A.2 and B.2 - Minimum benefit for individuals and members of couples + href: https://secure.ssa.gov/poms.nsf/lnx/0502001005 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 e9baee603e8..64aa57603ef 100644 --- a/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml @@ -47,6 +47,7 @@ values: - mo_ssp - ne_aabd - nm_ssi_state_supplement + - ny_ssp - sc_ssi_state_supplement - tx_ssi_state_supplement - wa_ssp @@ -95,9 +96,7 @@ values: metadata: reference: - - title: 7 CFR 273.9(b)(2) - href: https://www.law.cornell.edu/cfr/text/7/273.9#b_2 - - title: 7 CFR 273.9(c)(1) - href: https://www.law.cornell.edu/cfr/text/7/273.9#c_1 + - title: 7 CFR 273.9(b)(2) and (c)(1) + href: https://www.law.cornell.edu/cfr/text/7/273.9 - title: POMS SI 01401.001 General Information about State Supplementation href: https://secure.ssa.gov/poms.nsf/lnx/0501401001 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 5250ab3aa89..d06bff6c0a7 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1093,6 +1093,16 @@ programs: tracks. Unmodeled paths: grandfathered medically-needy-in-medical- institution recipients per WAC 388-478-0055(2)(b); DDA-determined / PVL track per (2)(f); and foster child in BRS per (2)(g). + - 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..3572d22eae5 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ny/otda/ssp/ny_ssp.yaml @@ -0,0 +1,590 @@ +- 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, deeming claimant in a nursing home receives no state payment. + 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 + 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] + # Social Services Law 209(1)(d) bars a state payment in a Medicaid-majority + # facility, and the deemed income rules out the personal needs allowance + # (18 NYCRR 398-3.2(d)). + ny_ssp: [0, 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 + 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] + +- 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] diff --git a/policyengine_us/variables/gov/ssa/ssi/_ssi_state_supplement.py b/policyengine_us/variables/gov/ssa/ssi/_ssi_state_supplement.py new file mode 100644 index 00000000000..5e0c84da3f3 --- /dev/null +++ b/policyengine_us/variables/gov/ssa/ssi/_ssi_state_supplement.py @@ -0,0 +1,53 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.ssa.ssi.eligibility.status.ssi_federal_living_arrangement import ( + SSIFederalLivingArrangement, +) + + +def ssi_state_supplement( + person, period, parameters, individual_rate, couple_rate, federal_payment_rules=True +): + """Apply SSI-based supplement income, couple and spouse-deeming rules. + + Rates are state supplements, excluding federal SSI. Each member supplies + the same-category couple rate; averaging these rates implements mixed + arrangements where the state's published schedule supports that method. + Set federal_payment_rules only for SSA-administered payments; state + administrators do not inherit the federal rounding or minimum payment. + Sources: 20 CFR 416.2025; POMS SI 01320.430 D, SI 02005.030 G, + SI 02001.005 and SI 02001.010. Callers apply state-specific eligibility. + """ + joint = person("ssi_couple_computation_applies", period) + couple_total = person.marital_unit.sum(couple_rate / 2) + standard = where(joint, couple_total / 2, individual_rate) + countable = person("ssi_countable_income", period) + federal_amount = person("ssi_amount_if_eligible", period) + excess = max_(countable - federal_amount, 0) + payment = max_(standard - excess, 0) + + deeming = person("is_ssi_spousal_deeming_applies", period.this_year) + deemed = person("ssi_income_deemed_from_ineligible_spouse", period) + own_income = max_(countable - deemed, 0) + ssi = parameters(period).gov.ssa.ssi + federal_la = person("ssi_federal_living_arrangement", period) + own_federal_amount = ssi.amount.individual * where( + federal_la == SSIFederalLivingArrangement.ANOTHER_PERSONS_HOUSEHOLD, + 1 - ssi.amount.one_third_reduction_rate, + 1, + ) + own_payment = max_(individual_rate - max_(own_income - own_federal_amount, 0), 0) + # SI 01320.430 D.2: use the higher individual rate where it exceeds + # the couple rate (including New Jersey's ineligible-spouse variation). + deemed_payment = max_(max_(couple_rate, individual_rate) - excess, 0) + payment = where(deeming, min_(own_payment, deemed_payment), payment) + + eligible = person("is_ssi_eligible", period) & person( + "takes_up_ssi_if_eligible", period.this_year + ) + # Federal administration discards digits beyond the third decimal place, + # rounds up to cents, and pays at least one dollar for a positive amount. + rounded = np.ceil(np.floor(payment * 1_000) / 10) / 100 + federal_payment = where( + rounded > 0, max_(rounded, ssi.state_supplement.minimum_payment), 0 + ) + return eligible * where(federal_payment_rules, federal_payment, payment) 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..10f6c0a256e --- /dev/null +++ b/policyengine_us/variables/gov/states/ny/otda/ssp/ny_ssp_living_arrangement.py @@ -0,0 +1,84 @@ +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, family care resident or aide cases that + 18 NYCRR 398-4.5(a)(1) counts as living alone. + """ + + 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 do not end it ((a)(1)(vi), (a)(2)(ii)), and a member + # living in a medical facility is not part of the household. + household_member = ~person("is_in_foster_care", period) & ~in_facility + alone = person.household.sum(household_member) == where( + joint, person.marital_unit.sum(household_member), 1 + ) + 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 a473c2b438d..b5511a11c21 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 @@ -22,6 +22,7 @@ def formula(spm_unit, period, parameters): "ky_ssp", # Kentucky benefits "de_ssp", # Delaware benefits "fl_oss", + "ny_ssp", # New York benefits "ks_sspp", # Kansas benefits "hi_oss", "la_oss", # Louisiana benefits