diff --git a/changelog.d/ca-ssp-eligible-person-minor-children.fixed.md b/changelog.d/ca-ssp-eligible-person-minor-children.fixed.md new file mode 100644 index 00000000000..b55ac214737 --- /dev/null +++ b/changelog.d/ca-ssp-eligible-person-minor-children.fixed.md @@ -0,0 +1 @@ +Make ca_state_supplement_eligible_person true for blind or disabled dependents under 18, whom the model pays California's dependent supplement amount. diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/sbd/general_relief/eligibility/ca_sbd_general_relief_receives_other_cash_assistance.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/sbd/general_relief/eligibility/ca_sbd_general_relief_receives_other_cash_assistance.yaml index 5b4d7a1a12a..f2420462043 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/sbd/general_relief/eligibility/ca_sbd_general_relief_receives_other_cash_assistance.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/sbd/general_relief/eligibility/ca_sbd_general_relief_receives_other_cash_assistance.yaml @@ -177,3 +177,31 @@ # ca_state_supplement is an ungated computed entitlement; with take-up # declined no SSP check arrives, so the bar lifts like the ssi arm. ca_sbd_general_relief_receives_other_cash_assistance: false + +- name: Case 9, a disabled child with an SSP-only payment is barred, but the parent is not. + period: 2026-01 + input: + people: + person1: + age: 40 + ssi: 0 + person2: + age: 10 + is_disabled: true + meets_ssi_disability_criteria: true + ssi: 0 + spm_units: + spm_unit: + members: [person1, person2] + # An SSP-only case: a positive state supplement with no federal SSI. + ca_state_supplement: 200 + tanf: 0 + households: + household: + members: [person1, person2] + in_sbd: true + state_code: CA + output: + # The child is eligible for the state supplement as a disabled dependent + # under 18; the parent is not aged, blind or disabled. + ca_sbd_general_relief_receives_other_cash_assistance: [false, true] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_eligible_person.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_eligible_person.yaml index 819986ce413..0d53fc82ed2 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_eligible_person.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_eligible_person.yaml @@ -41,3 +41,57 @@ state_code: CA output: ca_state_supplement_eligible_person: false + +- name: Disabled dependent child below the age limit + period: 2026 + input: + people: + person1: + age: 33 + meets_ssi_resource_test: true + is_ssi_aged_blind_disabled: false + immigration_status: CITIZEN + person2: + age: 17 + meets_ssi_resource_test: true + is_ssi_aged_blind_disabled: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CA + output: + is_tax_unit_dependent: [false, true] + ca_state_supplement_eligible_person: [false, true] + +- name: Disabled dependent at the age limit + period: 2026 + input: + people: + person1: + age: 45 + meets_ssi_resource_test: true + is_ssi_aged_blind_disabled: false + immigration_status: CITIZEN + person2: + age: 18 + # Input so the age-ordered fallback does not make them the spouse. + is_tax_unit_dependent: true + meets_ssi_resource_test: true + is_ssi_aged_blind_disabled: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CA + output: + # Known limitation: POMS SI 01415.058 pays a disabled dependent aged 18 or + # older the adult rate, but the model pays them nothing and leaves the + # flag false (issue 10557). + ca_state_supplement_eligible_person: [false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_medical_care_facility_amount.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_medical_care_facility_amount.yaml index 54788888e2d..f60f86e39d8 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_medical_care_facility_amount.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_medical_care_facility_amount.yaml @@ -77,3 +77,25 @@ state_code: CA output: ca_state_supplement_medical_care_facility_amount: 62 + +- name: Dependent child in medical care facility gets no facility allowance + period: 2026-01 + input: + people: + person1: + ca_in_medical_care_facility: false + ca_state_supplement_eligible_person: true + person2: + age: 10 + ca_in_medical_care_facility: true + ca_state_supplement_eligible_person: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CA + output: + # The model pays a dependent child the dependent amount instead. + ca_state_supplement_medical_care_facility_amount: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_out_of_home_care_facility_amount.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_out_of_home_care_facility_amount.yaml index e5776e8e252..bb23657c64b 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_out_of_home_care_facility_amount.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_out_of_home_care_facility_amount.yaml @@ -77,3 +77,25 @@ state_code: CA output: ca_state_supplement_out_of_home_care_facility_amount: 1_153.31 # 3,252.14 - 2,098.83 + +- name: Dependent child in out of home care facility gets no facility allowance + period: 2026-01 + input: + people: + person1: + in_out_of_home_care_facility: false + ca_state_supplement_eligible_person: true + person2: + age: 10 + in_out_of_home_care_facility: true + ca_state_supplement_eligible_person: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CA + output: + # The model pays a dependent child the dependent amount instead. + ca_state_supplement_out_of_home_care_facility_amount: 0 diff --git a/policyengine_us/variables/gov/states/ca/cdss/capi/_ca_capi_ssi_ssp_standard.py b/policyengine_us/variables/gov/states/ca/cdss/capi/_ca_capi_ssi_ssp_standard.py index 41408ff9b62..f3ca99c0fd8 100644 --- a/policyengine_us/variables/gov/states/ca/cdss/capi/_ca_capi_ssi_ssp_standard.py +++ b/policyengine_us/variables/gov/states/ca/cdss/capi/_ca_capi_ssi_ssp_standard.py @@ -32,12 +32,14 @@ def ca_capi_spouse_ssi_ssp(person, period): Only a spouse who is not CAPI-eligible counts. ca_state_supplement is an SPM-unit amount, so as a simplification the spouse's share is pro rata - among the unit's members eligible for it; a citizen disabled child's - supplement in the unit is then attributed to the spouse. + among the unit's heads and spouses eligible for it; a citizen disabled + child's supplement in the unit is then attributed to the spouse. """ spouse = ~person("ca_capi_eligible_person", period.this_year) spouse_ssi = person.marital_unit.sum(person("ssi", period) * spouse) - ssp_eligible = person("ca_state_supplement_eligible_person", period) + ssp_eligible = person("ca_state_supplement_eligible_person", period) & person( + "is_tax_unit_head_or_spouse", period + ) spouse_ssp_share = person.marital_unit.sum(ssp_eligible * spouse) / max_( person.spm_unit.sum(ssp_eligible), 1 ) diff --git a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/ca_state_supplement_eligible_person.py b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/ca_state_supplement_eligible_person.py index c4852874796..6dfe1c4c81d 100644 --- a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/ca_state_supplement_eligible_person.py +++ b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/ca_state_supplement_eligible_person.py @@ -7,18 +7,30 @@ class ca_state_supplement_eligible_person(Variable): label = "California SSI state supplement eligible person" definition_period = MONTH defined_for = StateCode.CA - reference = "https://law.justia.com/codes/california/code-wic/division-9/part-3/chapter-3/article-4/" + reference = ( + "https://law.justia.com/codes/california/code-wic/division-9/part-3/chapter-3/article-4/", + "https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415058", + ) def formula(person, period, parameters): + p = parameters(period).gov.states.ca.cdss.state_supplement.payment_standard meets_resource_test = person("meets_ssi_resource_test", period) aged_blind_disabled = person("is_ssi_aged_blind_disabled", period) is_qualified_noncitizen = person("is_ssi_qualified_noncitizen", period) immigration_status = person("immigration_status", period.this_year) is_citizen = immigration_status == immigration_status.possible_values.CITIZEN + # Heads and spouses get the individual, couple and facility amounts. + # The model pays blind or disabled dependents below the age limit the + # dependent amount instead. This simplifies POMS SI 01415.058, which + # pays blind children the blind amount, children in care facilities + # the facility amount and adult dependents an individual amount + # (issue 10557). is_head_or_spouse = person("is_tax_unit_head_or_spouse", period) + dependent = person("is_tax_unit_dependent", period) + minor = person("monthly_age", period) < p.dependent.age_limit return ( meets_resource_test & aged_blind_disabled & (is_qualified_noncitizen | is_citizen) - & is_head_or_spouse + & (is_head_or_spouse | (dependent & minor)) ) diff --git a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_aged_disabled_count.py b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_aged_disabled_count.py index ec310240c41..e0a358ffb39 100644 --- a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_aged_disabled_count.py +++ b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_aged_disabled_count.py @@ -18,4 +18,6 @@ def formula(spm_unit, period, parameters): is_aged = age >= p.aged_or_disabled.age_threshold aged_or_disabled = is_aged | is_ssi_disabled eligible = person("ca_state_supplement_eligible_person", period) - return spm_unit.sum(aged_or_disabled * eligible) + # The model pays dependent children the dependent amount instead. + head_or_spouse = person("is_tax_unit_head_or_spouse", period) + return spm_unit.sum(aged_or_disabled * eligible * head_or_spouse) diff --git a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_dependent_amount.py b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_dependent_amount.py index aa37b9ab887..119b64cf2f1 100644 --- a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_dependent_amount.py +++ b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_dependent_amount.py @@ -13,24 +13,12 @@ class ca_state_supplement_dependent_amount(Variable): def formula(spm_unit, period, parameters): p = parameters(period).gov.states.ca.cdss.state_supplement.payment_standard person = spm_unit.members - # Blind amount - blind = person("is_blind", period) - is_ssi_disabled = person("is_ssi_disabled", period.this_year) age = person("monthly_age", period) - # Dependent amount dependent = person("is_tax_unit_dependent", period) dependent_age_eligible = age < p.dependent.age_limit - # The child must meet the SSI/SSP conditions that - # ca_state_supplement_eligible_person applies to adults; a child who - # fails SSI's noncitizen test gets CAPI instead (WIC 18938, 18941). - immigration_status = person("immigration_status", period.this_year) - is_citizen = immigration_status == immigration_status.possible_values.CITIZEN - is_qualified_noncitizen = person( - "is_ssi_qualified_noncitizen", period.this_year - ) - meets_resource_test = person("meets_ssi_resource_test", period) - eligible = meets_resource_test & (is_citizen | is_qualified_noncitizen) - dependent_count = spm_unit.sum( - dependent & dependent_age_eligible & (is_ssi_disabled | blind) & eligible - ) + # The eligible person flag applies the SSI/SSP conditions, including + # being blind or disabled; a child who fails SSI's noncitizen test + # gets CAPI instead (WIC 18938, 18941). + eligible = person("ca_state_supplement_eligible_person", period) + dependent_count = spm_unit.sum(dependent & dependent_age_eligible & eligible) return dependent_count * p.dependent.amount diff --git a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_medical_care_facility_amount.py b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_medical_care_facility_amount.py index 7f3943e31c4..c72962e0b2a 100644 --- a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_medical_care_facility_amount.py +++ b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_medical_care_facility_amount.py @@ -15,6 +15,10 @@ def formula(spm_unit, period, parameters): # Medical care facility amount person = spm_unit.members eligible = person("ca_state_supplement_eligible_person", period) + # The model pays dependent children the dependent amount instead. + head_or_spouse = person("is_tax_unit_head_or_spouse", period) in_medical_care_facility = person("ca_in_medical_care_facility", period) - medical_care_facility_count = spm_unit.sum(in_medical_care_facility * eligible) + medical_care_facility_count = spm_unit.sum( + in_medical_care_facility * eligible * head_or_spouse + ) return medical_care_facility_count * p.allowance.medical_care_facility diff --git a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_out_of_home_care_facility_amount.py b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_out_of_home_care_facility_amount.py index ede509980e9..c224d308335 100644 --- a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_out_of_home_care_facility_amount.py +++ b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_out_of_home_care_facility_amount.py @@ -14,8 +14,10 @@ def formula(spm_unit, period, parameters): p = parameters(period).gov.states.ca.cdss.state_supplement.payment_standard person = spm_unit.members eligible = person("ca_state_supplement_eligible_person", period) + # The model pays dependent children the dependent amount instead. + head_or_spouse = person("is_tax_unit_head_or_spouse", period) in_out_of_home_care_facility = person("in_out_of_home_care_facility", period) out_of_home_care_facility_count = spm_unit.sum( - in_out_of_home_care_facility * eligible + in_out_of_home_care_facility * eligible * head_or_spouse ) return out_of_home_care_facility_count * p.allowance.out_of_home_care