diff --git a/changelog.d/al-ccap.added.md b/changelog.d/al-ccap.added.md new file mode 100644 index 00000000000..ed6369b8bac --- /dev/null +++ b/changelog.d/al-ccap.added.md @@ -0,0 +1 @@ +Added Alabama Child Care Subsidy Program (CCSP). diff --git a/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml b/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml index ed0f0a42c7d..5f246733bc8 100644 --- a/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml +++ b/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml @@ -2,6 +2,7 @@ description: The federal government counts these state programs as child care su values: 2021-01-01: - ak_child_care_subsidies # Alaska Child Care Assistance Program (PASS) + - al_child_care_subsidies # Alabama Child Care Subsidy Program - ca_child_care_subsidies # California Child Care - co_child_care_subsidies # Colorado Child Care Assistance Program - ct_child_care_subsidies # Connecticut Care 4 Kids diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index b74241a36b5..3c5dd97256a 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -32,6 +32,7 @@ values: - ca_state_supplement # Alabama benefits - al_ssp + - al_child_care_subsidies # Alaska benefits - ak_ssp # Florida benefits @@ -99,6 +100,7 @@ values: - ca_state_supplement # Alabama benefits - al_ssp + - al_child_care_subsidies # Alaska benefits - ak_ssp # Florida benefits diff --git a/policyengine_us/parameters/gov/states/al/dhr/ccsp/activity/hours_minimum.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/activity/hours_minimum.yaml new file mode 100644 index 00000000000..f881e5c7cb7 --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/activity/hours_minimum.yaml @@ -0,0 +1,11 @@ +description: Alabama sets this minimum number of combined weekly hours of work, training, or education for activity eligibility under the Child Care Subsidy Program. +values: + 2024-01-01: 15 + +metadata: + unit: hour + period: year + label: Alabama CCSP minimum weekly activity hours + reference: + - title: Alabama CCDF State Plan 2025-2027, Section 2.2.2 + href: https://dhr.alabama.gov/wp-content/uploads/2023/04/2025-2027-CCDF-State-Plan-with-Approval-Letter.pdf#page=22 diff --git a/policyengine_us/parameters/gov/states/al/dhr/ccsp/age/child_limit.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/age/child_limit.yaml new file mode 100644 index 00000000000..20a96b43c97 --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/age/child_limit.yaml @@ -0,0 +1,11 @@ +description: Alabama limits the Child Care Subsidy Program to children younger than this age. +values: + 2024-01-01: 13 + +metadata: + unit: year + period: year + label: Alabama CCSP child age limit + reference: + - title: Alabama CCDF State Plan 2025-2027, Section 2.2.1 + href: https://dhr.alabama.gov/wp-content/uploads/2023/04/2025-2027-CCDF-State-Plan-with-Approval-Letter.pdf#page=20 diff --git a/policyengine_us/parameters/gov/states/al/dhr/ccsp/age/disabled_child_limit.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/age/disabled_child_limit.yaml new file mode 100644 index 00000000000..4d4e3a6b755 --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/age/disabled_child_limit.yaml @@ -0,0 +1,11 @@ +description: Alabama limits the Child Care Subsidy Program to disabled children younger than this age. +values: + 2024-01-01: 19 + +metadata: + unit: year + period: year + label: Alabama CCSP disabled child age limit + reference: + - title: Alabama CCDF State Plan 2025-2027, Section 2.2.1 + href: https://dhr.alabama.gov/wp-content/uploads/2023/04/2025-2027-CCDF-State-Plan-with-Approval-Letter.pdf#page=20 diff --git a/policyengine_us/parameters/gov/states/al/dhr/ccsp/age_category/months.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/age_category/months.yaml new file mode 100644 index 00000000000..eb77d2d2853 --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/age_category/months.yaml @@ -0,0 +1,34 @@ +description: Alabama uses this age in months threshold to assign care level categories under the Child Care Subsidy Program. +# 0 = INFANT_TODDLER (under 36 months) +# 1 = PRESCHOOL (36-59 months) +# 2 = SCHOOL_AGE (60+ months) +# The Provider Rate Chart lists 0-36 / 37-59 / 60+ months, but +# PolicyEngine's age variable is annual; integer survey ages would +# round all 3-year-olds (36-47 months actual) down to 36 months. +# Setting the PRESCHOOL threshold at 36 months maps a child reported +# as age 3 to PRESCHOOL, matching how Alabama operationally treats +# 3-year-olds. + +metadata: + type: single_amount + threshold_unit: month + amount_unit: /1 + period: year + label: Alabama CCSP age category by age in months + reference: + - title: Alabama DHR Child Care Subsidy Program Provider Rate Chart, Key to Care Level + href: https://dhr.alabama.gov/wp-content/uploads/2023/04/Provider-Rates-with-QRIS-Tiers-April-1-2022-b.pdf#page=2 + +brackets: + - threshold: + 2022-04-11: 0 + amount: + 2022-04-11: 0 + - threshold: + 2022-04-11: 36 + amount: + 2022-04-11: 1 + - threshold: + 2022-04-11: 60 + amount: + 2022-04-11: 2 diff --git a/policyengine_us/parameters/gov/states/al/dhr/ccsp/copay/fee_by_fpl.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/copay/fee_by_fpl.yaml new file mode 100644 index 00000000000..a03874180f4 --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/copay/fee_by_fpl.yaml @@ -0,0 +1,59 @@ +description: Alabama sets this weekly per-child fee under the Child Care Subsidy Program, indexed to the family's share of the federal poverty guideline. + +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + period: week + label: Alabama CCSP weekly per-child fee by FPL ratio + reference: + - title: Alabama Child Care Fact Sheet, Initial and Continuing Eligibility Monthly Income Scale and Parental Fee Chart + href: https://dhr.alabama.gov/wp-content/uploads/2024/01/Child-Care-Fact-Sheet-2024.pdf + - title: Alabama CCDF State Plan 2025-2027, Section 3.1.2(b) Parental Fee Chart + href: https://dhr.alabama.gov/wp-content/uploads/2023/04/2025-2027-CCDF-State-Plan-with-Approval-Letter.pdf#page=41 + +brackets: + - threshold: + 2024-01-01: 0 + amount: + 2024-01-01: 0 + - threshold: + 2024-01-01: 1.0001 + amount: + 2024-01-01: 18 + - threshold: + 2024-01-01: 1.1001 + amount: + 2024-01-01: 21 + - threshold: + 2024-01-01: 1.2001 + amount: + 2024-01-01: 24 + - threshold: + 2024-01-01: 1.3001 + amount: + 2024-01-01: 27 + - threshold: + 2024-01-01: 1.4001 + amount: + 2024-01-01: 30 + - threshold: + 2024-01-01: 1.5001 + amount: + 2024-01-01: 33 + - threshold: + 2024-01-01: 1.6001 + amount: + 2024-01-01: 36 + - threshold: + 2024-01-01: 1.7001 + amount: + 2024-01-01: 39 + - threshold: + 2024-01-01: 1.8001 + amount: + 2024-01-01: 42 + - threshold: + 2024-01-01: 1.9001 + amount: + 2024-01-01: 45 diff --git a/policyengine_us/parameters/gov/states/al/dhr/ccsp/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/income/countable_income/sources.yaml new file mode 100644 index 00000000000..2feb93e5c50 --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/income/countable_income/sources.yaml @@ -0,0 +1,29 @@ +description: Alabama counts these income sources under the Child Care Subsidy Program. +values: + 2024-01-01: + - employment_income + - self_employment_income + - farm_operations_income + - social_security + - pension_income + - unemployment_compensation + - workers_compensation + - ssi + - al_ssp + - interest_income + - dividend_income + - alimony_income + - veterans_benefits + # - tanf exclude as of now to avoid circular reference error + # Section 2.2.4(c) also lists inheritance and college work-study, + # but no matching variables exist in policyengine-us at this time. + +metadata: + unit: list + period: year + label: Alabama CCSP countable income sources + reference: + - title: Alabama CCDF State Plan 2025-2027, Section 2.2.4(c) + href: https://dhr.alabama.gov/wp-content/uploads/2023/04/2025-2027-CCDF-State-Plan-with-Approval-Letter.pdf#page=26 + - title: Alabama Child Care Fact Sheet + href: https://dhr.alabama.gov/wp-content/uploads/2024/01/Child-Care-Fact-Sheet-2024.pdf diff --git a/policyengine_us/parameters/gov/states/al/dhr/ccsp/income/limit/fpl_continuing.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/income/limit/fpl_continuing.yaml new file mode 100644 index 00000000000..37c974933f7 --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/income/limit/fpl_continuing.yaml @@ -0,0 +1,13 @@ +description: Alabama caps continuing-eligibility family income at this share of the federal poverty guideline under the Child Care Subsidy Program. +values: + 2024-01-01: 2.0 + +metadata: + unit: /1 + period: year + label: Alabama CCSP continuing income limit (share of federal poverty guideline) + reference: + - title: Alabama CCDF State Plan 2025-2027, Section 2.5.2(c)(iii) + href: https://dhr.alabama.gov/wp-content/uploads/2023/04/2025-2027-CCDF-State-Plan-with-Approval-Letter.pdf#page=39 + - title: Alabama Child Care Fact Sheet + href: https://dhr.alabama.gov/wp-content/uploads/2024/01/Child-Care-Fact-Sheet-2024.pdf diff --git a/policyengine_us/parameters/gov/states/al/dhr/ccsp/income/limit/fpl_initial.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/income/limit/fpl_initial.yaml new file mode 100644 index 00000000000..6036f37af07 --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/income/limit/fpl_initial.yaml @@ -0,0 +1,13 @@ +description: Alabama caps initial-application family income at this share of the federal poverty guideline under the Child Care Subsidy Program. +values: + 2024-01-01: 1.8 + +metadata: + unit: /1 + period: year + label: Alabama CCSP initial income limit (share of federal poverty guideline) + reference: + - title: Alabama CCDF State Plan 2025-2027, Section 2.2.4 + href: https://dhr.alabama.gov/wp-content/uploads/2023/04/2025-2027-CCDF-State-Plan-with-Approval-Letter.pdf#page=26 + - title: Alabama Child Care Fact Sheet (Initial Eligibility Monthly Income Scale) + href: https://dhr.alabama.gov/wp-content/uploads/2024/01/Child-Care-Fact-Sheet-2024.pdf diff --git a/policyengine_us/parameters/gov/states/al/dhr/ccsp/income/limit/smi_cap.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/income/limit/smi_cap.yaml new file mode 100644 index 00000000000..7dcaab5c5cb --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/income/limit/smi_cap.yaml @@ -0,0 +1,15 @@ +description: Alabama caps Child Care Subsidy Program eligibility at this share of state median income, terminating participation prior to the 12-month review when exceeded. +values: + 2024-01-01: 0.85 + +metadata: + unit: /1 + period: year + label: Alabama CCSP income cap (share of state median income) + reference: + - title: Alabama CCDF State Plan 2025-2027, Section 2.2.4 + href: https://dhr.alabama.gov/wp-content/uploads/2023/04/2025-2027-CCDF-State-Plan-with-Approval-Letter.pdf#page=26 + - title: Alabama CCDF State Plan 2025-2027, Section 2.5.2(c)(iv) Income Cutoff (85% SMI) + href: https://dhr.alabama.gov/wp-content/uploads/2023/04/2025-2027-CCDF-State-Plan-with-Approval-Letter.pdf#page=39 + - title: Alabama Child Care Fact Sheet (Income Cutoff 85% SMI) + href: https://dhr.alabama.gov/wp-content/uploads/2024/01/Child-Care-Fact-Sheet-2024.pdf diff --git a/policyengine_us/parameters/gov/states/al/dhr/ccsp/rates/full_time_hours_threshold.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/rates/full_time_hours_threshold.yaml new file mode 100644 index 00000000000..8f547a451d3 --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/rates/full_time_hours_threshold.yaml @@ -0,0 +1,11 @@ +description: Alabama treats child care services averaging more than this many weekly hours as full-time under the Child Care Subsidy Program. +values: + 2022-04-11: 25 + +metadata: + unit: hour + period: year + label: Alabama CCSP full-time weekly hours threshold + reference: + - title: Alabama DHR Child Care Subsidy Program Provider Rate Chart (Full-time / Part-time Rates note) + href: https://dhr.alabama.gov/wp-content/uploads/2023/04/Provider-Rates-with-QRIS-Tiers-April-1-2022-b.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/al/dhr/ccsp/rates/informal_weekly_cap.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/rates/informal_weekly_cap.yaml new file mode 100644 index 00000000000..bcf88450c3a --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/rates/informal_weekly_cap.yaml @@ -0,0 +1,11 @@ +description: Alabama caps the weekly reimbursement rate for informal (license-exempt) child care providers under the Child Care Subsidy Program. +values: + 2022-04-11: 50 + +metadata: + unit: currency-USD + period: week + label: Alabama CCSP informal-provider weekly rate cap + reference: + - title: Alabama DHR Child Care Subsidy Program Provider Rate Chart (Informal care providers cap) + href: https://dhr.alabama.gov/wp-content/uploads/2023/04/Provider-Rates-with-QRIS-Tiers-April-1-2022-b.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/al/dhr/ccsp/rates/maximum_weekly_full_time.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/rates/maximum_weekly_full_time.yaml new file mode 100644 index 00000000000..3687fc8d901 --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/rates/maximum_weekly_full_time.yaml @@ -0,0 +1,1100 @@ +description: Alabama sets these maximum weekly full-time provider reimbursement rates under the Child Care Subsidy Program, indexed by provider type, region, age category, and quality tier. + +metadata: + period: week + unit: currency-USD + label: Alabama CCSP maximum weekly full-time provider rates + breakdown: + - al_ccsp_provider_type + - al_ccsp_region + - al_ccsp_age_category + - al_ccsp_quality_tier + reference: + - title: Alabama DHR Child Care Subsidy Program Provider Rate Chart, Maximum Weekly Full-time Rates + href: https://dhr.alabama.gov/wp-content/uploads/2023/04/Provider-Rates-with-QRIS-Tiers-April-1-2022-b.pdf#page=1 + +CENTER: + HUNTSVILLE: + INFANT_TODDLER: + BASE: + 2022-04-11: 165 + STAR_1: + 2022-04-11: 168 + STAR_2: + 2022-04-11: 172 + STAR_3: + 2022-04-11: 175 + STAR_4: + 2022-04-11: 179 + STAR_5: + 2022-04-11: 182 + PRESCHOOL: + BASE: + 2022-04-11: 153 + STAR_1: + 2022-04-11: 156 + STAR_2: + 2022-04-11: 159 + STAR_3: + 2022-04-11: 162 + STAR_4: + 2022-04-11: 166 + STAR_5: + 2022-04-11: 169 + SCHOOL_AGE: + BASE: + 2022-04-11: 135 + STAR_1: + 2022-04-11: 138 + STAR_2: + 2022-04-11: 140 + STAR_3: + 2022-04-11: 143 + STAR_4: + 2022-04-11: 146 + STAR_5: + 2022-04-11: 149 + TUSCALOOSA: + INFANT_TODDLER: + BASE: + 2022-04-11: 146 + STAR_1: + 2022-04-11: 149 + STAR_2: + 2022-04-11: 152 + STAR_3: + 2022-04-11: 155 + STAR_4: + 2022-04-11: 158 + STAR_5: + 2022-04-11: 161 + PRESCHOOL: + BASE: + 2022-04-11: 136 + STAR_1: + 2022-04-11: 139 + STAR_2: + 2022-04-11: 141 + STAR_3: + 2022-04-11: 144 + STAR_4: + 2022-04-11: 147 + STAR_5: + 2022-04-11: 150 + SCHOOL_AGE: + BASE: + 2022-04-11: 125 + STAR_1: + 2022-04-11: 128 + STAR_2: + 2022-04-11: 130 + STAR_3: + 2022-04-11: 133 + STAR_4: + 2022-04-11: 135 + STAR_5: + 2022-04-11: 138 + MOBILE: + INFANT_TODDLER: + BASE: + 2022-04-11: 145 + STAR_1: + 2022-04-11: 148 + STAR_2: + 2022-04-11: 151 + STAR_3: + 2022-04-11: 154 + STAR_4: + 2022-04-11: 157 + STAR_5: + 2022-04-11: 160 + PRESCHOOL: + BASE: + 2022-04-11: 135 + STAR_1: + 2022-04-11: 138 + STAR_2: + 2022-04-11: 140 + STAR_3: + 2022-04-11: 143 + STAR_4: + 2022-04-11: 146 + STAR_5: + 2022-04-11: 149 + SCHOOL_AGE: + BASE: + 2022-04-11: 130 + STAR_1: + 2022-04-11: 133 + STAR_2: + 2022-04-11: 135 + STAR_3: + 2022-04-11: 138 + STAR_4: + 2022-04-11: 141 + STAR_5: + 2022-04-11: 144 + FT_PAYNE: + INFANT_TODDLER: + BASE: + 2022-04-11: 118 + STAR_1: + 2022-04-11: 120 + STAR_2: + 2022-04-11: 123 + STAR_3: + 2022-04-11: 125 + STAR_4: + 2022-04-11: 128 + STAR_5: + 2022-04-11: 130 + PRESCHOOL: + BASE: + 2022-04-11: 115 + STAR_1: + 2022-04-11: 117 + STAR_2: + 2022-04-11: 120 + STAR_3: + 2022-04-11: 122 + STAR_4: + 2022-04-11: 124 + STAR_5: + 2022-04-11: 127 + SCHOOL_AGE: + BASE: + 2022-04-11: 110 + STAR_1: + 2022-04-11: 112 + STAR_2: + 2022-04-11: 114 + STAR_3: + 2022-04-11: 117 + STAR_4: + 2022-04-11: 119 + STAR_5: + 2022-04-11: 121 + BIRMINGHAM: + INFANT_TODDLER: + BASE: + 2022-04-11: 195 + STAR_1: + 2022-04-11: 199 + STAR_2: + 2022-04-11: 203 + STAR_3: + 2022-04-11: 207 + STAR_4: + 2022-04-11: 211 + STAR_5: + 2022-04-11: 215 + PRESCHOOL: + BASE: + 2022-04-11: 180 + STAR_1: + 2022-04-11: 184 + STAR_2: + 2022-04-11: 187 + STAR_3: + 2022-04-11: 191 + STAR_4: + 2022-04-11: 195 + STAR_5: + 2022-04-11: 199 + SCHOOL_AGE: + BASE: + 2022-04-11: 150 + STAR_1: + 2022-04-11: 153 + STAR_2: + 2022-04-11: 156 + STAR_3: + 2022-04-11: 159 + STAR_4: + 2022-04-11: 162 + STAR_5: + 2022-04-11: 166 + TALLADEGA: + INFANT_TODDLER: + BASE: + 2022-04-11: 120 + STAR_1: + 2022-04-11: 122 + STAR_2: + 2022-04-11: 125 + STAR_3: + 2022-04-11: 127 + STAR_4: + 2022-04-11: 130 + STAR_5: + 2022-04-11: 132 + PRESCHOOL: + BASE: + 2022-04-11: 120 + STAR_1: + 2022-04-11: 122 + STAR_2: + 2022-04-11: 125 + STAR_3: + 2022-04-11: 127 + STAR_4: + 2022-04-11: 130 + STAR_5: + 2022-04-11: 132 + SCHOOL_AGE: + BASE: + 2022-04-11: 119 + STAR_1: + 2022-04-11: 121 + STAR_2: + 2022-04-11: 124 + STAR_3: + 2022-04-11: 126 + STAR_4: + 2022-04-11: 129 + STAR_5: + 2022-04-11: 131 + MONTGOMERY: + INFANT_TODDLER: + BASE: + 2022-04-11: 150 + STAR_1: + 2022-04-11: 153 + STAR_2: + 2022-04-11: 156 + STAR_3: + 2022-04-11: 159 + STAR_4: + 2022-04-11: 162 + STAR_5: + 2022-04-11: 166 + PRESCHOOL: + BASE: + 2022-04-11: 135 + STAR_1: + 2022-04-11: 138 + STAR_2: + 2022-04-11: 140 + STAR_3: + 2022-04-11: 143 + STAR_4: + 2022-04-11: 146 + STAR_5: + 2022-04-11: 149 + SCHOOL_AGE: + BASE: + 2022-04-11: 125 + STAR_1: + 2022-04-11: 128 + STAR_2: + 2022-04-11: 130 + STAR_3: + 2022-04-11: 133 + STAR_4: + 2022-04-11: 135 + STAR_5: + 2022-04-11: 138 + DOTHAN: + INFANT_TODDLER: + BASE: + 2022-04-11: 125 + STAR_1: + 2022-04-11: 128 + STAR_2: + 2022-04-11: 130 + STAR_3: + 2022-04-11: 133 + STAR_4: + 2022-04-11: 135 + STAR_5: + 2022-04-11: 138 + PRESCHOOL: + BASE: + 2022-04-11: 120 + STAR_1: + 2022-04-11: 122 + STAR_2: + 2022-04-11: 125 + STAR_3: + 2022-04-11: 127 + STAR_4: + 2022-04-11: 130 + STAR_5: + 2022-04-11: 132 + SCHOOL_AGE: + BASE: + 2022-04-11: 115 + STAR_1: + 2022-04-11: 117 + STAR_2: + 2022-04-11: 120 + STAR_3: + 2022-04-11: 122 + STAR_4: + 2022-04-11: 124 + STAR_5: + 2022-04-11: 127 + OPELIKA: + INFANT_TODDLER: + BASE: + 2022-04-11: 147 + STAR_1: + 2022-04-11: 150 + STAR_2: + 2022-04-11: 153 + STAR_3: + 2022-04-11: 156 + STAR_4: + 2022-04-11: 159 + STAR_5: + 2022-04-11: 162 + PRESCHOOL: + BASE: + 2022-04-11: 140 + STAR_1: + 2022-04-11: 143 + STAR_2: + 2022-04-11: 146 + STAR_3: + 2022-04-11: 149 + STAR_4: + 2022-04-11: 152 + STAR_5: + 2022-04-11: 155 + SCHOOL_AGE: + BASE: + 2022-04-11: 140 + STAR_1: + 2022-04-11: 143 + STAR_2: + 2022-04-11: 146 + STAR_3: + 2022-04-11: 149 + STAR_4: + 2022-04-11: 152 + STAR_5: + 2022-04-11: 155 + +GFDC: + HUNTSVILLE: + INFANT_TODDLER: + BASE: + 2022-04-11: 145 + STAR_1: + 2022-04-11: 148 + STAR_2: + 2022-04-11: 151 + STAR_3: + 2022-04-11: 154 + STAR_4: + 2022-04-11: 157 + STAR_5: + 2022-04-11: 160 + PRESCHOOL: + BASE: + 2022-04-11: 145 + STAR_1: + 2022-04-11: 148 + STAR_2: + 2022-04-11: 151 + STAR_3: + 2022-04-11: 154 + STAR_4: + 2022-04-11: 157 + STAR_5: + 2022-04-11: 160 + SCHOOL_AGE: + BASE: + 2022-04-11: 137 + STAR_1: + 2022-04-11: 140 + STAR_2: + 2022-04-11: 143 + STAR_3: + 2022-04-11: 145 + STAR_4: + 2022-04-11: 148 + STAR_5: + 2022-04-11: 151 + TUSCALOOSA: + INFANT_TODDLER: + BASE: + 2022-04-11: 125 + STAR_1: + 2022-04-11: 128 + STAR_2: + 2022-04-11: 130 + STAR_3: + 2022-04-11: 133 + STAR_4: + 2022-04-11: 135 + STAR_5: + 2022-04-11: 138 + PRESCHOOL: + BASE: + 2022-04-11: 125 + STAR_1: + 2022-04-11: 128 + STAR_2: + 2022-04-11: 130 + STAR_3: + 2022-04-11: 133 + STAR_4: + 2022-04-11: 135 + STAR_5: + 2022-04-11: 138 + SCHOOL_AGE: + BASE: + 2022-04-11: 125 + STAR_1: + 2022-04-11: 128 + STAR_2: + 2022-04-11: 130 + STAR_3: + 2022-04-11: 133 + STAR_4: + 2022-04-11: 135 + STAR_5: + 2022-04-11: 138 + MOBILE: + INFANT_TODDLER: + BASE: + 2022-04-11: 134 + STAR_1: + 2022-04-11: 137 + STAR_2: + 2022-04-11: 139 + STAR_3: + 2022-04-11: 142 + STAR_4: + 2022-04-11: 145 + STAR_5: + 2022-04-11: 148 + PRESCHOOL: + BASE: + 2022-04-11: 129 + STAR_1: + 2022-04-11: 132 + STAR_2: + 2022-04-11: 134 + STAR_3: + 2022-04-11: 137 + STAR_4: + 2022-04-11: 140 + STAR_5: + 2022-04-11: 142 + SCHOOL_AGE: + BASE: + 2022-04-11: 125 + STAR_1: + 2022-04-11: 128 + STAR_2: + 2022-04-11: 130 + STAR_3: + 2022-04-11: 133 + STAR_4: + 2022-04-11: 135 + STAR_5: + 2022-04-11: 138 + FT_PAYNE: + INFANT_TODDLER: + BASE: + 2022-04-11: 110 + STAR_1: + 2022-04-11: 112 + STAR_2: + 2022-04-11: 114 + STAR_3: + 2022-04-11: 117 + STAR_4: + 2022-04-11: 119 + STAR_5: + 2022-04-11: 121 + PRESCHOOL: + BASE: + 2022-04-11: 100 + STAR_1: + 2022-04-11: 102 + STAR_2: + 2022-04-11: 104 + STAR_3: + 2022-04-11: 106 + STAR_4: + 2022-04-11: 108 + STAR_5: + 2022-04-11: 110 + SCHOOL_AGE: + BASE: + 2022-04-11: 90 + STAR_1: + 2022-04-11: 92 + STAR_2: + 2022-04-11: 94 + STAR_3: + 2022-04-11: 96 + STAR_4: + 2022-04-11: 97 + STAR_5: + 2022-04-11: 99 + BIRMINGHAM: + INFANT_TODDLER: + BASE: + 2022-04-11: 144 + STAR_1: + 2022-04-11: 147 + STAR_2: + 2022-04-11: 150 + STAR_3: + 2022-04-11: 153 + STAR_4: + 2022-04-11: 156 + STAR_5: + 2022-04-11: 159 + PRESCHOOL: + BASE: + 2022-04-11: 141 + STAR_1: + 2022-04-11: 144 + STAR_2: + 2022-04-11: 147 + STAR_3: + 2022-04-11: 150 + STAR_4: + 2022-04-11: 153 + STAR_5: + 2022-04-11: 156 + SCHOOL_AGE: + BASE: + 2022-04-11: 131 + STAR_1: + 2022-04-11: 134 + STAR_2: + 2022-04-11: 136 + STAR_3: + 2022-04-11: 139 + STAR_4: + 2022-04-11: 142 + STAR_5: + 2022-04-11: 145 + TALLADEGA: + INFANT_TODDLER: + BASE: + 2022-04-11: 115 + STAR_1: + 2022-04-11: 117 + STAR_2: + 2022-04-11: 120 + STAR_3: + 2022-04-11: 122 + STAR_4: + 2022-04-11: 124 + STAR_5: + 2022-04-11: 127 + PRESCHOOL: + BASE: + 2022-04-11: 119 + STAR_1: + 2022-04-11: 121 + STAR_2: + 2022-04-11: 124 + STAR_3: + 2022-04-11: 126 + STAR_4: + 2022-04-11: 129 + STAR_5: + 2022-04-11: 131 + SCHOOL_AGE: + BASE: + 2022-04-11: 115 + STAR_1: + 2022-04-11: 117 + STAR_2: + 2022-04-11: 120 + STAR_3: + 2022-04-11: 122 + STAR_4: + 2022-04-11: 124 + STAR_5: + 2022-04-11: 127 + MONTGOMERY: + INFANT_TODDLER: + BASE: + 2022-04-11: 100 + STAR_1: + 2022-04-11: 102 + STAR_2: + 2022-04-11: 104 + STAR_3: + 2022-04-11: 106 + STAR_4: + 2022-04-11: 108 + STAR_5: + 2022-04-11: 110 + PRESCHOOL: + BASE: + 2022-04-11: 100 + STAR_1: + 2022-04-11: 102 + STAR_2: + 2022-04-11: 104 + STAR_3: + 2022-04-11: 106 + STAR_4: + 2022-04-11: 108 + STAR_5: + 2022-04-11: 110 + SCHOOL_AGE: + BASE: + 2022-04-11: 98 + STAR_1: + 2022-04-11: 100 + STAR_2: + 2022-04-11: 102 + STAR_3: + 2022-04-11: 104 + STAR_4: + 2022-04-11: 106 + STAR_5: + 2022-04-11: 108 + DOTHAN: + INFANT_TODDLER: + BASE: + 2022-04-11: 100 + STAR_1: + 2022-04-11: 102 + STAR_2: + 2022-04-11: 104 + STAR_3: + 2022-04-11: 106 + STAR_4: + 2022-04-11: 108 + STAR_5: + 2022-04-11: 110 + PRESCHOOL: + BASE: + 2022-04-11: 110 + STAR_1: + 2022-04-11: 112 + STAR_2: + 2022-04-11: 114 + STAR_3: + 2022-04-11: 117 + STAR_4: + 2022-04-11: 119 + STAR_5: + 2022-04-11: 121 + SCHOOL_AGE: + BASE: + 2022-04-11: 100 + STAR_1: + 2022-04-11: 102 + STAR_2: + 2022-04-11: 104 + STAR_3: + 2022-04-11: 106 + STAR_4: + 2022-04-11: 108 + STAR_5: + 2022-04-11: 110 + OPELIKA: + INFANT_TODDLER: + BASE: + 2022-04-11: 148 + STAR_1: + 2022-04-11: 151 + STAR_2: + 2022-04-11: 154 + STAR_3: + 2022-04-11: 157 + STAR_4: + 2022-04-11: 160 + STAR_5: + 2022-04-11: 163 + PRESCHOOL: + BASE: + 2022-04-11: 145 + STAR_1: + 2022-04-11: 148 + STAR_2: + 2022-04-11: 151 + STAR_3: + 2022-04-11: 154 + STAR_4: + 2022-04-11: 157 + STAR_5: + 2022-04-11: 160 + SCHOOL_AGE: + BASE: + 2022-04-11: 138 + STAR_1: + 2022-04-11: 141 + STAR_2: + 2022-04-11: 144 + STAR_3: + 2022-04-11: 146 + STAR_4: + 2022-04-11: 149 + STAR_5: + 2022-04-11: 152 + +FDC: + HUNTSVILLE: + INFANT_TODDLER: + BASE: + 2022-04-11: 150 + STAR_1: + 2022-04-11: 153 + STAR_2: + 2022-04-11: 156 + STAR_3: + 2022-04-11: 159 + STAR_4: + 2022-04-11: 162 + STAR_5: + 2022-04-11: 166 + PRESCHOOL: + BASE: + 2022-04-11: 150 + STAR_1: + 2022-04-11: 153 + STAR_2: + 2022-04-11: 156 + STAR_3: + 2022-04-11: 159 + STAR_4: + 2022-04-11: 162 + STAR_5: + 2022-04-11: 166 + SCHOOL_AGE: + BASE: + 2022-04-11: 150 + STAR_1: + 2022-04-11: 153 + STAR_2: + 2022-04-11: 156 + STAR_3: + 2022-04-11: 159 + STAR_4: + 2022-04-11: 162 + STAR_5: + 2022-04-11: 166 + TUSCALOOSA: + INFANT_TODDLER: + BASE: + 2022-04-11: 118 + STAR_1: + 2022-04-11: 120 + STAR_2: + 2022-04-11: 123 + STAR_3: + 2022-04-11: 125 + STAR_4: + 2022-04-11: 128 + STAR_5: + 2022-04-11: 130 + PRESCHOOL: + BASE: + 2022-04-11: 115 + STAR_1: + 2022-04-11: 117 + STAR_2: + 2022-04-11: 120 + STAR_3: + 2022-04-11: 122 + STAR_4: + 2022-04-11: 124 + STAR_5: + 2022-04-11: 127 + SCHOOL_AGE: + BASE: + 2022-04-11: 100 + STAR_1: + 2022-04-11: 102 + STAR_2: + 2022-04-11: 104 + STAR_3: + 2022-04-11: 106 + STAR_4: + 2022-04-11: 108 + STAR_5: + 2022-04-11: 110 + MOBILE: + INFANT_TODDLER: + BASE: + 2022-04-11: 134 + STAR_1: + 2022-04-11: 137 + STAR_2: + 2022-04-11: 139 + STAR_3: + 2022-04-11: 142 + STAR_4: + 2022-04-11: 145 + STAR_5: + 2022-04-11: 148 + PRESCHOOL: + BASE: + 2022-04-11: 130 + STAR_1: + 2022-04-11: 133 + STAR_2: + 2022-04-11: 135 + STAR_3: + 2022-04-11: 138 + STAR_4: + 2022-04-11: 141 + STAR_5: + 2022-04-11: 144 + SCHOOL_AGE: + BASE: + 2022-04-11: 125 + STAR_1: + 2022-04-11: 128 + STAR_2: + 2022-04-11: 130 + STAR_3: + 2022-04-11: 133 + STAR_4: + 2022-04-11: 135 + STAR_5: + 2022-04-11: 138 + FT_PAYNE: + INFANT_TODDLER: + BASE: + 2022-04-11: 90 + STAR_1: + 2022-04-11: 92 + STAR_2: + 2022-04-11: 94 + STAR_3: + 2022-04-11: 96 + STAR_4: + 2022-04-11: 97 + STAR_5: + 2022-04-11: 99 + PRESCHOOL: + BASE: + 2022-04-11: 90 + STAR_1: + 2022-04-11: 92 + STAR_2: + 2022-04-11: 94 + STAR_3: + 2022-04-11: 96 + STAR_4: + 2022-04-11: 97 + STAR_5: + 2022-04-11: 99 + SCHOOL_AGE: + BASE: + 2022-04-11: 90 + STAR_1: + 2022-04-11: 92 + STAR_2: + 2022-04-11: 94 + STAR_3: + 2022-04-11: 96 + STAR_4: + 2022-04-11: 97 + STAR_5: + 2022-04-11: 99 + BIRMINGHAM: + INFANT_TODDLER: + BASE: + 2022-04-11: 150 + STAR_1: + 2022-04-11: 153 + STAR_2: + 2022-04-11: 156 + STAR_3: + 2022-04-11: 159 + STAR_4: + 2022-04-11: 162 + STAR_5: + 2022-04-11: 166 + PRESCHOOL: + BASE: + 2022-04-11: 145 + STAR_1: + 2022-04-11: 148 + STAR_2: + 2022-04-11: 151 + STAR_3: + 2022-04-11: 154 + STAR_4: + 2022-04-11: 157 + STAR_5: + 2022-04-11: 160 + SCHOOL_AGE: + BASE: + 2022-04-11: 133 + STAR_1: + 2022-04-11: 136 + STAR_2: + 2022-04-11: 138 + STAR_3: + 2022-04-11: 141 + STAR_4: + 2022-04-11: 144 + STAR_5: + 2022-04-11: 147 + TALLADEGA: + INFANT_TODDLER: + BASE: + 2022-04-11: 120 + STAR_1: + 2022-04-11: 122 + STAR_2: + 2022-04-11: 125 + STAR_3: + 2022-04-11: 127 + STAR_4: + 2022-04-11: 130 + STAR_5: + 2022-04-11: 132 + PRESCHOOL: + BASE: + 2022-04-11: 120 + STAR_1: + 2022-04-11: 122 + STAR_2: + 2022-04-11: 125 + STAR_3: + 2022-04-11: 127 + STAR_4: + 2022-04-11: 130 + STAR_5: + 2022-04-11: 132 + SCHOOL_AGE: + BASE: + 2022-04-11: 128 + STAR_1: + 2022-04-11: 131 + STAR_2: + 2022-04-11: 133 + STAR_3: + 2022-04-11: 136 + STAR_4: + 2022-04-11: 139 + STAR_5: + 2022-04-11: 141 + MONTGOMERY: + INFANT_TODDLER: + BASE: + 2022-04-11: 135 + STAR_1: + 2022-04-11: 138 + STAR_2: + 2022-04-11: 140 + STAR_3: + 2022-04-11: 143 + STAR_4: + 2022-04-11: 146 + STAR_5: + 2022-04-11: 149 + PRESCHOOL: + BASE: + 2022-04-11: 135 + STAR_1: + 2022-04-11: 138 + STAR_2: + 2022-04-11: 140 + STAR_3: + 2022-04-11: 143 + STAR_4: + 2022-04-11: 146 + STAR_5: + 2022-04-11: 149 + SCHOOL_AGE: + BASE: + 2022-04-11: 128 + STAR_1: + 2022-04-11: 131 + STAR_2: + 2022-04-11: 133 + STAR_3: + 2022-04-11: 136 + STAR_4: + 2022-04-11: 139 + STAR_5: + 2022-04-11: 141 + DOTHAN: + INFANT_TODDLER: + BASE: + 2022-04-11: 103 + STAR_1: + 2022-04-11: 105 + STAR_2: + 2022-04-11: 107 + STAR_3: + 2022-04-11: 109 + STAR_4: + 2022-04-11: 111 + STAR_5: + 2022-04-11: 114 + PRESCHOOL: + BASE: + 2022-04-11: 103 + STAR_1: + 2022-04-11: 105 + STAR_2: + 2022-04-11: 107 + STAR_3: + 2022-04-11: 109 + STAR_4: + 2022-04-11: 111 + STAR_5: + 2022-04-11: 114 + SCHOOL_AGE: + BASE: + 2022-04-11: 88 + STAR_1: + 2022-04-11: 90 + STAR_2: + 2022-04-11: 92 + STAR_3: + 2022-04-11: 93 + STAR_4: + 2022-04-11: 95 + STAR_5: + 2022-04-11: 97 + OPELIKA: + INFANT_TODDLER: + BASE: + 2022-04-11: 140 + STAR_1: + 2022-04-11: 143 + STAR_2: + 2022-04-11: 146 + STAR_3: + 2022-04-11: 149 + STAR_4: + 2022-04-11: 152 + STAR_5: + 2022-04-11: 155 + PRESCHOOL: + BASE: + 2022-04-11: 138 + STAR_1: + 2022-04-11: 141 + STAR_2: + 2022-04-11: 144 + STAR_3: + 2022-04-11: 146 + STAR_4: + 2022-04-11: 149 + STAR_5: + 2022-04-11: 152 + SCHOOL_AGE: + BASE: + 2022-04-11: 130 + STAR_1: + 2022-04-11: 133 + STAR_2: + 2022-04-11: 135 + STAR_3: + 2022-04-11: 138 + STAR_4: + 2022-04-11: 141 + STAR_5: + 2022-04-11: 144 diff --git a/policyengine_us/parameters/gov/states/al/dhr/ccsp/rates/part_time_multiplier.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/rates/part_time_multiplier.yaml new file mode 100644 index 00000000000..c193d813b5c --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/rates/part_time_multiplier.yaml @@ -0,0 +1,11 @@ +description: Alabama applies this multiplier to the full-time provider rate to compute the part-time rate under the Child Care Subsidy Program. +values: + 2022-04-11: 0.5 + +metadata: + unit: /1 + period: year + label: Alabama CCSP part-time rate multiplier + reference: + - title: Alabama DHR Child Care Subsidy Program Provider Rate Chart (Part-time Rates) + href: https://dhr.alabama.gov/wp-content/uploads/2023/04/Provider-Rates-with-QRIS-Tiers-April-1-2022-b.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/al/dhr/ccsp/region/counties.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/region/counties.yaml new file mode 100644 index 00000000000..c197d84612f --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/region/counties.yaml @@ -0,0 +1,97 @@ +description: Alabama groups counties into nine Child Care Subsidy Program rate-setting regions. + +metadata: + unit: list + period: year + label: Alabama CCSP counties by region + breakdown: + - al_ccsp_region + reference: + - title: Alabama DHR Child Care Subsidy Program Provider Rate Chart, Regions and Counties Served + href: https://dhr.alabama.gov/wp-content/uploads/2023/04/Provider-Rates-with-QRIS-Tiers-April-1-2022-b.pdf#page=1 + +HUNTSVILLE: + 2022-04-11: + - COLBERT_COUNTY_AL + - CULLMAN_COUNTY_AL + - FRANKLIN_COUNTY_AL + - LAUDERDALE_COUNTY_AL + - LAWRENCE_COUNTY_AL + - LIMESTONE_COUNTY_AL + - MADISON_COUNTY_AL + - MORGAN_COUNTY_AL + - WINSTON_COUNTY_AL +TUSCALOOSA: + 2022-04-11: + - BIBB_COUNTY_AL + - CHOCTAW_COUNTY_AL + - FAYETTE_COUNTY_AL + - GREENE_COUNTY_AL + - HALE_COUNTY_AL + - LAMAR_COUNTY_AL + - MARENGO_COUNTY_AL + - MARION_COUNTY_AL + - PERRY_COUNTY_AL + - PICKENS_COUNTY_AL + - SUMTER_COUNTY_AL + - TUSCALOOSA_COUNTY_AL +MOBILE: + 2022-04-11: + - BALDWIN_COUNTY_AL + - CLARKE_COUNTY_AL + - CONECUH_COUNTY_AL + - ESCAMBIA_COUNTY_AL + - MOBILE_COUNTY_AL + - MONROE_COUNTY_AL + - WASHINGTON_COUNTY_AL +FT_PAYNE: + 2022-04-11: + - CHEROKEE_COUNTY_AL + - DEKALB_COUNTY_AL + - ETOWAH_COUNTY_AL + - JACKSON_COUNTY_AL + - MARSHALL_COUNTY_AL +BIRMINGHAM: + 2022-04-11: + - BLOUNT_COUNTY_AL + - JEFFERSON_COUNTY_AL + - ST_CLAIR_COUNTY_AL + - SHELBY_COUNTY_AL + - WALKER_COUNTY_AL +TALLADEGA: + 2022-04-11: + - CALHOUN_COUNTY_AL + - CLAY_COUNTY_AL + - CLEBURNE_COUNTY_AL + - COOSA_COUNTY_AL + - RANDOLPH_COUNTY_AL + - TALLADEGA_COUNTY_AL +MONTGOMERY: + 2022-04-11: + - AUTAUGA_COUNTY_AL + - BULLOCK_COUNTY_AL + - BUTLER_COUNTY_AL + - CHILTON_COUNTY_AL + - COVINGTON_COUNTY_AL + - DALLAS_COUNTY_AL + - ELMORE_COUNTY_AL + - LOWNDES_COUNTY_AL + - MONTGOMERY_COUNTY_AL + - WILCOX_COUNTY_AL +DOTHAN: + 2022-04-11: + - BARBOUR_COUNTY_AL + - COFFEE_COUNTY_AL + - CRENSHAW_COUNTY_AL + - DALE_COUNTY_AL + - GENEVA_COUNTY_AL + - HENRY_COUNTY_AL + - HOUSTON_COUNTY_AL + - PIKE_COUNTY_AL +OPELIKA: + 2022-04-11: + - CHAMBERS_COUNTY_AL + - LEE_COUNTY_AL + - MACON_COUNTY_AL + - RUSSELL_COUNTY_AL + - TALLAPOOSA_COUNTY_AL diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 7d6212eec9a..88b2e255030 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -460,7 +460,7 @@ programs: category: Benefits agency: HHS status: partial - coverage: AK, CA, CO, CT, DE, DC, IL, MA, MD, ME, NC, NH, NJ, PA, RI, SC, TX, VA, VT, WV + coverage: AK, AL, CA, CO, CT, DE, DC, IL, MA, MD, ME, NC, NH, NJ, PA, RI, SC, TX, VA, VT, WV state_implementations: - state: AK status: complete @@ -468,6 +468,12 @@ programs: full_name: Alaska Child Care Assistance Program variable: ak_ccap notes: Modeled as PASS II/III; PASS I (ATAP-bundled) and PASS IV (OCS protective services) not modeled + - state: AL + status: partial + name: Alabama CCSP + full_name: Alabama Child Care Subsidy Program + variable: al_ccsp + parameter_prefix: gov.states.al.dhr.ccsp - state: CA status: complete name: CalWORKs childcare diff --git a/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp.yaml b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp.yaml new file mode 100644 index 00000000000..5dfeb50822f --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp.yaml @@ -0,0 +1,214 @@ +# AL CCSP benefit tests (SPMUnit, MONTH, USD) +# per_child_weekly_subsidy = max(0, min(weekly_charge, max_weekly_rate) - weekly_copay_per_child) +# monthly_subsidy = per_child_weekly_subsidy * (52/12) * eligible_child +# al_ccsp = sum over SPMUnit members. + +- name: Ineligible family gets zero benefit. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 80_000 # > 85% SMI fam of 4 + immigration_status: CITIZEN + weekly_hours_worked: 40 + person2: + age: 28 + person3: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + person4: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + spm_unit_pre_subsidy_childcare_expenses: 24_000 + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + al_ccsp: 0 + +- name: Low-income family at zero copay receives full max rate. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 18_000 # ~91% 2023 FPG fam of 2 -> 0% copay band + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + pre_subsidy_childcare_expenses: 10_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 10_000 + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + # BIRMINGHAM CENTER PRESCHOOL BASE = $180/wk + # Weekly charge = 10,000 / 52 = $192.31 + # min($192.31, $180) = $180 + # copay = $0 + # weekly subsidy = $180 + # monthly subsidy = $180 * (52/12) = $780 + al_ccsp: 780 + +- name: Family at 150 percent FPL with copay. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 29_580 # 150% 2023 FPG fam of 2 = 19,720 * 1.5 + immigration_status: CITIZEN + weekly_hours_worked: 40 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + pre_subsidy_childcare_expenses: 10_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 10_000 + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + # BIRMINGHAM CENTER PRESCHOOL BASE = $180/wk + # weekly charge = 10,000 / 52 = $192.31; min(192.31, 180) = $180 + # copay = $30/wk; weekly subsidy = $180 - $30 = $150 + # monthly subsidy = $150 * (52/12) = $650 + al_ccsp: 650 + +- name: Provider charge below max rate caps subsidy at charge minus copay. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 18_000 # zero copay tier + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + pre_subsidy_childcare_expenses: 5_200 # $100/wk charge + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 5_200 + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + # weekly charge = $100; max rate = $180; min = $100; copay = $0 + # monthly subsidy = $100 * (52/12) = $433.33 + al_ccsp: 433.33 + +- name: Three children with only one eligible subsidizes only the eligible child. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 18_000 # ~60% 2023 FPG fam of 4 -> zero copay band + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + # Truly eligible: age 4, citizen, dependent, in care + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + pre_subsidy_childcare_expenses: 10_000 + person3: + # Over age (>= 13): ineligible, in care + age: 14 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + pre_subsidy_childcare_expenses: 10_000 + person4: + # Undocumented: ineligible by immigration, in care + age: 6 + is_tax_unit_dependent: true + immigration_status: UNDOCUMENTED + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + pre_subsidy_childcare_expenses: 10_000 + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + spm_unit_pre_subsidy_childcare_expenses: 30_000 + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + # Only person2 is is_paying_child (eligible_child & in_care). + # BIRMINGHAM CENTER PRESCHOOL BASE = $180/wk for person2. + # weekly charge = $10,000 / 52 = $192.31; min($192.31, $180) = $180 + # copay = $0/wk (zero-copay band); weekly subsidy = $180 + # monthly subsidy = $180 * (52/12) = $780 + # Ineligible siblings get zero subsidy. + al_ccsp: 780 diff --git a/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_activity_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_activity_eligible.yaml new file mode 100644 index 00000000000..d61e3be9dfc --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_activity_eligible.yaml @@ -0,0 +1,305 @@ +# AL CCSP activity eligibility tests (SPMUnit, MONTH) +# At least one parent must work >= 15 hr/wk, be a full-time student, or be disabled (SC/VA convention). + +- name: Parent working 30 hrs per week is activity eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + weekly_hours_worked: 30 + is_full_time_student: false + is_disabled: false + person2: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_activity_eligible: true + +- name: Parent at 15 hours minimum boundary is activity eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 15 + is_full_time_student: false + is_disabled: false + person2: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_activity_eligible: true + +- name: Parent working 10 hrs is activity ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 10 + is_full_time_student: false + is_disabled: false + person2: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_activity_eligible: false + +- name: Full-time student parent is activity eligible. + period: 2024-01 + input: + people: + person1: + age: 22 + weekly_hours_worked: 0 + is_full_time_student: true + is_disabled: false + person2: + age: 2 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_activity_eligible: true + +- name: Disabled parent without modeled activity or CCDF fallback is ineligible. + period: 2024-01 + input: + # Alabama's §2.2.2 does not list parental disability as an automatic + # activity exemption. Disabled parents must be marked via the + # meets_ccdf_activity_test fallback to capture a case-by-case + # good-cause exemption. + people: + person1: + age: 40 + weekly_hours_worked: 0 + is_full_time_student: false + is_disabled: true + person2: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_activity_eligible: false + +- name: Two parents both meeting 15 hours is activity eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 30 + person2: + age: 28 + weekly_hours_worked: 20 + person3: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: AL + output: + al_ccsp_activity_eligible: true + +- name: Two parents where one fails activity test is activity ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 30 + person2: + age: 28 + weekly_hours_worked: 0 + is_full_time_student: false + is_disabled: false + person3: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: AL + output: + al_ccsp_activity_eligible: false + +- name: Working parent plus non-working spouse fails activity test by default. + period: 2024-01 + input: + # Per §2.2.2 each head/spouse must individually meet the 15hr work, + # student, or fallback test. Alabama's State Plan does NOT list + # parental disability as an automatic exemption (only protective + # services for children waives the activity test, §2.2.2(h)). + people: + person1: + age: 30 + weekly_hours_worked: 40 + person2: + age: 28 + weekly_hours_worked: 0 + is_full_time_student: false + is_disabled: true + person3: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: AL + output: + al_ccsp_activity_eligible: false + +- name: Working parent plus disabled spouse with CCDF fallback flag is activity eligible. + period: 2024-01 + input: + # The fallback input (meets_ccdf_activity_test) is the supported + # pathway for case-by-case good-cause exemptions like disability. + people: + person1: + age: 30 + weekly_hours_worked: 40 + person2: + age: 28 + weekly_hours_worked: 0 + is_full_time_student: false + is_disabled: true + person3: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3] + state_code: AL + output: + al_ccsp_activity_eligible: true + +- name: Parent with zero modeled activity but meets_ccdf_activity_test true is eligible. + period: 2024-01 + input: + people: + person1: + # Would fail the modeled activity test (0 work hours, not student, + # not disabled), but the SPMUnit-level fallback flag is set to + # capture an approved unmodeled activity (e.g., job training, + # education hours, SNAP E&T, temporary leave). + age: 30 + weekly_hours_worked: 0 + is_full_time_student: false + is_disabled: false + person2: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_activity_eligible: true + +- name: Parent with zero modeled activity and meets_ccdf_activity_test false is ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 0 + is_full_time_student: false + is_disabled: false + person2: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: false + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_activity_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_age_category.yaml b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_age_category.yaml new file mode 100644 index 00000000000..911ac1b200b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_age_category.yaml @@ -0,0 +1,97 @@ +# AL CCSP age category tests (Person, MONTH, Enum) +# Bracket on age-in-months -> {INFANT_TODDLER (0-35mo), PRESCHOOL (36-59mo), SCHOOL_AGE (60mo+)}. +# Provider Rate Chart lists 36 as the boundary; integer survey ages +# at age 3 map to exactly 36 months -> PRESCHOOL. + +- name: Infant age 0 is INFANT_TODDLER. + period: 2024-01 + input: + people: + person1: + age: 0 + households: + household: + members: [person1] + state_code: AL + output: + al_ccsp_age_category: INFANT_TODDLER + +- name: Toddler age 2 is INFANT_TODDLER. + period: 2024-01 + input: + people: + person1: + age: 2 + households: + household: + members: [person1] + state_code: AL + output: + al_ccsp_age_category: INFANT_TODDLER + +- name: Child age 3 (exactly 36 months) is PRESCHOOL. + period: 2024-01 + input: + people: + person1: + age: 3 + households: + household: + members: [person1] + state_code: AL + output: + # 36 months is at the PRESCHOOL threshold. + al_ccsp_age_category: PRESCHOOL + +- name: Child age 2.99 is INFANT_TODDLER. + period: 2024-01 + input: + people: + person1: + age: 2.99 + households: + household: + members: [person1] + state_code: AL + output: + # Just below 36 months (35.88 months). + al_ccsp_age_category: INFANT_TODDLER + +- name: Child age 4 is PRESCHOOL. + period: 2024-01 + input: + people: + person1: + age: 4 + households: + household: + members: [person1] + state_code: AL + output: + al_ccsp_age_category: PRESCHOOL + +- name: Child age 5 is SCHOOL_AGE. + period: 2024-01 + input: + people: + person1: + age: 5 + households: + household: + members: [person1] + state_code: AL + output: + al_ccsp_age_category: SCHOOL_AGE + +- name: Child age 12 is SCHOOL_AGE. + period: 2024-01 + input: + people: + person1: + age: 12 + households: + household: + members: [person1] + state_code: AL + output: + al_ccsp_age_category: SCHOOL_AGE diff --git a/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_copay_waived.yaml b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_copay_waived.yaml new file mode 100644 index 00000000000..a2558ddb89a --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_copay_waived.yaml @@ -0,0 +1,167 @@ +# AL CCSP copay waiver tests (SPMUnit, MONTH, bool). +# Per CCDF State Plan §3.3.1, copay is waived for families that include: +# (iv) a disabled child (under disabled_child_limit, age 19) +# (v) a child enrolled in Head Start / Early Head Start +# (vi) a child authorized under the Protective Service category +# (foster, kinship, or homelessness per §2.2.2(f)). + +- name: Case 1, family with disabled child waives copay. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + is_disabled: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_copay_waived: true + +- name: Case 2, family with Head Start enrolled child waives copay. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_tax_unit_dependent: true + is_enrolled_in_head_start: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_copay_waived: true + +- name: Case 3, family with foster child waives copay. + period: 2024-01 + input: + people: + person1: + age: 35 + person2: + age: 5 + is_tax_unit_dependent: true + is_in_foster_care: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_copay_waived: true + +- name: Case 4, family with no waiver triggers does not waive copay. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_copay_waived: false + +- name: Case 5, disabled adult (non-dependent) does not trigger waiver. + period: 2024-01 + input: + people: + person1: + age: 30 + is_disabled: true + person2: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_copay_waived: false + +- name: Case 6, homeless household waives copay via Protective Service category. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + is_homeless: true + output: + al_ccsp_copay_waived: true + +- name: Case 7, disabled non-dependent under age 19 does not trigger waiver. + period: 2024-01 + input: + people: + person1: + age: 30 + is_tax_unit_head: true + person2: + age: 18 + is_tax_unit_spouse: true + is_disabled: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_copay_waived: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_countable_income.yaml new file mode 100644 index 00000000000..a31c7753acc --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_countable_income.yaml @@ -0,0 +1,128 @@ +# AL CCSP countable income tests (SPMUnit, MONTH, USD) +# Uses adds = "gov.states.al.dhr.ccsp.income.countable_income.sources" — annual +# sources auto-divided to monthly by PolicyEngine. + +- name: Employment income only. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 24_000 + person2: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + # Monthly = 24,000 / 12 = 2,000 + al_ccsp_countable_income: 2_000 + +- name: Self employment and interest income. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + self_employment_income: 18_000 + interest_income: 2_400 + person2: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + # Monthly = (18,000 + 2,400) / 12 = 1,700 + al_ccsp_countable_income: 1_700 + +- name: Social security counted. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 65 + social_security_retirement: 12_000 + person2: + age: 6 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + # Monthly = 12,000 / 12 = 1,000 + al_ccsp_countable_income: 1_000 + +- name: Child support excluded. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 24_000 + child_support_received: 6_000 + person2: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + # Child support excluded -> monthly = 24,000 / 12 = 2,000 + al_ccsp_countable_income: 2_000 + +- name: Zero income family. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_countable_income: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_eligible.yaml new file mode 100644 index 00000000000..334262fd782 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_eligible.yaml @@ -0,0 +1,293 @@ +# AL CCSP top-level eligibility tests (SPMUnit, MONTH) +# Combines: has eligible child, AL residency, income eligible (180% FPL or 200% if enrolled, AND 85% SMI), +# asset eligible ($1M federal floor), activity eligible OR protective services waiver. + +- name: Working AL family with one child age 4 is eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_eligible: true + +- name: Working family in GA is ineligible (non-AL). + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: GA + output: + al_ccsp_eligible: false + +- name: Adult-only household with no children is ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 25_000 + immigration_status: CITIZEN + weekly_hours_worked: 30 + tax_units: + tax_unit: + members: [person1] + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: AL + output: + al_ccsp_eligible: false + +- name: Parent at 10 hrs work non-student non-disabled is activity ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 15_000 + immigration_status: CITIZEN + weekly_hours_worked: 10 + is_full_time_student: false + is_disabled: false + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_eligible: false + +- name: Foster child waives activity requirement. + period: 2024-01 + input: + people: + person1: + age: 35 + immigration_status: CITIZEN + weekly_hours_worked: 0 + is_full_time_student: false + is_disabled: false + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + is_in_foster_care: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + # Foster -> protective services -> waives income AND activity + al_ccsp_eligible: true + +- name: Family at 190 percent FPL initial path is ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 59_280 # 190% FPL fam of 4 = 4,940/mo + immigration_status: CITIZEN + weekly_hours_worked: 40 + person2: + age: 28 + weekly_hours_worked: 40 + person3: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person4: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + al_ccsp_enrolled: false + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + output: + # 190% FPL > 180% initial limit, al_ccsp_enrolled=false -> ineligible + al_ccsp_eligible: false + +- name: Family at 190 percent FPL continuing path is eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 59_280 + immigration_status: CITIZEN + weekly_hours_worked: 40 + person2: + age: 28 + weekly_hours_worked: 40 + person3: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person4: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + al_ccsp_enrolled: true + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + output: + # 190% FPL <= 200% continuing limit, and 4,940/mo <= 6,262/mo 85% SMI -> eligible + al_ccsp_eligible: true + +- name: Family above 85 percent SMI is ineligible even at continuing tier. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 80_000 # 6,667/mo > 6,262 (85% SMI fam of 4) + immigration_status: CITIZEN + weekly_hours_worked: 40 + person2: + age: 28 + person3: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person4: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + al_ccsp_enrolled: true + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + output: + al_ccsp_eligible: false + +- name: Homeless household waives activity test via protective services. + period: 2024-01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + weekly_hours_worked: 0 + is_full_time_student: false + is_disabled: false + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + is_homeless: true + output: + # Homeless -> protective services -> waives income AND activity + al_ccsp_eligible: true + +- name: Asset over 1 million is ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_assets: 1_500_000 + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_eligible_child.yaml b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_eligible_child.yaml new file mode 100644 index 00000000000..108ba1ffced --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_eligible_child.yaml @@ -0,0 +1,281 @@ +# AL CCSP eligible child tests (Person, MONTH) +# Combines: age.child_limit (<13) or age.disabled_child_limit (<19 if disabled), +# is_ccdf_immigration_eligible_child, is_tax_unit_dependent. + +- name: Child age 4 citizen dependent is eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_eligible_child: [false, true] + +- name: Child age 12 citizen dependent is eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 12 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_eligible_child: [false, true] + +- name: Child age 4 citizen non-dependent is ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + is_tax_unit_head: true + person2: + age: 4 + immigration_status: CITIZEN + is_tax_unit_dependent: false + tax_units: + tax_unit: + members: [person1] + child_tax_unit: + members: [person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_eligible_child: [false, false] + +- name: Child age 13 not disabled is ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 13 + is_tax_unit_dependent: true + immigration_status: CITIZEN + is_disabled: false + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_eligible_child: [false, false] + +- name: Non-disabled child age 14 is ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 14 + is_tax_unit_dependent: true + immigration_status: CITIZEN + is_disabled: false + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_eligible_child: [false, false] + +- name: Disabled child age 14 is eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 14 + is_tax_unit_dependent: true + immigration_status: CITIZEN + is_disabled: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_eligible_child: [false, true] + +- name: Disabled child age 18 is eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 18 + is_tax_unit_dependent: true + immigration_status: CITIZEN + is_disabled: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_eligible_child: [false, true] + +- name: Disabled child age 19 is ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 19 + is_tax_unit_dependent: true + immigration_status: CITIZEN + is_disabled: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_eligible_child: [false, false] + +- name: Non-citizen ineligible-immigration child is ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: UNDOCUMENTED + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_eligible_child: [false, false] + +- name: Non-AL family child is ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: GA + output: + al_ccsp_eligible_child: [false, false] + +- name: Multi-child family with mixed ages and immigration statuses. + period: 2024-01 + input: + people: + person1: + # Parent (age 30, not a child) + age: 30 + immigration_status: CITIZEN + person2: + # Eligible: age 4, citizen, dependent + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person3: + # Ineligible by age: age 14 >= 13 + age: 14 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person4: + # Ineligible by immigration: age 6 but undocumented + age: 6 + is_tax_unit_dependent: true + immigration_status: UNDOCUMENTED + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + output: + # Parent: not under age 13 -> false + # person2: age 4 + citizen + dependent -> true + # person3: age 14 fails age check -> false + # person4: undocumented fails immigration check -> false + al_ccsp_eligible_child: [false, true, false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_income_eligible.yaml new file mode 100644 index 00000000000..c5dad7f2e3b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_income_eligible.yaml @@ -0,0 +1,258 @@ +# AL CCSP income eligibility tests (SPMUnit, MONTH) +# Initial path: monthly income <= 180% FPL AND <= 85% SMI. +# Continuing path (al_ccsp_enrolled=True): monthly income <= 200% FPL AND <= 85% SMI. +# +# AL CCSP uses the prior year's HHS FPG (Fact Sheet 2024 -> 2023 FPG). +# 2023 FPG (Contiguous US): first_person $14,580, additional $5,140. +# Family of 2: $19,720/yr ($1,643.33/mo) +# Family of 3: $24,860/yr ($2,071.67/mo) +# Family of 4: $30,000/yr ($2,500/mo) +# 180% FPL (FS 3): $44,748/yr ($3,729/mo) +# 180% FPL (FS 4): $54,000/yr ($4,500/mo) +# 200% FPL (FS 4): $60,000/yr ($5,000/mo) +# AL SMI FS 4 (2023-10-01 -> applies 2024): $88,407. 85% SMI FS 4: $75,145.95/yr ($6,262.16/mo). + +- name: Family at 150 percent FPL initial path is income eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 45_000 # 150% FPL fam of 4 = 45,000/yr = 3,750/mo + person2: + age: 28 + person3: + age: 4 + is_tax_unit_dependent: true + person4: + age: 2 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + al_ccsp_enrolled: false + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + output: + # 3,750/mo <= 4,500/mo (180% FPL) -> initial-eligible + # 3,750/mo <= 6,262/mo (85% SMI) -> SMI-eligible + al_ccsp_income_eligible: true + +- name: Family at 190 percent FPL initial path is income ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 57_000 # 190% FPL fam of 4 = 57,000/yr = 4,750/mo + person2: + age: 28 + person3: + age: 4 + is_tax_unit_dependent: true + person4: + age: 2 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + al_ccsp_enrolled: false + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + output: + # 4,750/mo > 4,500/mo (180% FPL) -> initial path fails + al_ccsp_income_eligible: false + +- name: Family at 190 percent FPL continuing path is income eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 57_000 # 190% FPL fam of 4 + person2: + age: 28 + person3: + age: 4 + is_tax_unit_dependent: true + person4: + age: 2 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + al_ccsp_enrolled: true + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + output: + # 4,750/mo <= 5,000/mo (200% FPL) -> continuing-eligible + # 4,750/mo <= 6,262/mo (85% SMI) -> SMI-eligible + al_ccsp_income_eligible: true + +- name: Family above 200 percent FPL continuing path is income ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 63_000 # 210% FPL fam of 4 = 5,250/mo + person2: + age: 28 + person3: + age: 4 + is_tax_unit_dependent: true + person4: + age: 2 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + al_ccsp_enrolled: true + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + output: + # 5,250/mo > 5,000/mo (200% FPL) -> continuing path fails + al_ccsp_income_eligible: false + +- name: Family above 85 percent SMI is income ineligible even at continuing tier. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 80_000 # 6,667/mo > 85% SMI fam of 4 (6,262/mo) + person2: + age: 28 + person3: + age: 4 + is_tax_unit_dependent: true + person4: + age: 2 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + al_ccsp_enrolled: true + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + output: + # 6,667/mo > 6,262/mo (85% SMI) -> SMI cap fails even though < 200% FPL? actually 80,000 = 256% FPL. + # Either way, SMI cap fails. + al_ccsp_income_eligible: false + +- name: Family at exactly 180 percent FPL initial path is income eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 54_000 # 180% FPL fam of 4 = 30,000 * 1.8 + person2: + age: 28 + person3: + age: 4 + is_tax_unit_dependent: true + person4: + age: 2 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + al_ccsp_enrolled: false + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + output: + # 54,000 == 180% FPL exactly -> formula uses <=, so still eligible at the boundary. + al_ccsp_income_eligible: true + +- name: Family at exactly 200 percent FPL continuing path is income eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 60_000 # 200% FPL fam of 4 = 30,000 * 2.0 + person2: + age: 28 + person3: + age: 4 + is_tax_unit_dependent: true + person4: + age: 2 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + al_ccsp_enrolled: true + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + output: + # 60,000 == 200% FPL exactly -> formula uses <=, so still eligible at the boundary. + # 60,000/yr < 75,146/yr (85% SMI) -> SMI cap passes. + al_ccsp_income_eligible: true + +- name: Family just over 85 percent SMI is income ineligible at continuing tier. + period: 2024-01 + input: + people: + person1: + age: 30 + # 85% SMI fam of 4 = 88,407 * 0.85 = 75,145.95; use +$0.01 above cap. + employment_income: 75_145.96 + person2: + age: 28 + person3: + age: 4 + is_tax_unit_dependent: true + person4: + age: 2 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + al_ccsp_enrolled: true + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + output: + # 75,145.96 > 75,145.95 (85% SMI cap) -> SMI cap fails. + al_ccsp_income_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_maximum_weekly_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_maximum_weekly_rate.yaml new file mode 100644 index 00000000000..0239c08363c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_maximum_weekly_rate.yaml @@ -0,0 +1,492 @@ +# AL CCSP maximum weekly provider rate tests (Person, MONTH, USD) +# Looked up by provider_type x region x age_category x quality_tier. +# Full-time when childcare_hours_per_week > 25; otherwise rate is halved (part-time multiplier 0.5). +# INFORMAL provider has a flat $50/wk cap regardless of region/age/quality. +# defined_for: al_ccsp_eligible_child (Person, MONTH). + +- name: CENTER BIRMINGHAM PRESCHOOL STAR_3 full-time is 191 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: STAR_3 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + al_ccsp_maximum_weekly_rate: [0, 191] + +- name: CENTER HUNTSVILLE INFANT_TODDLER BASE full-time is 165 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: MADISON_COUNTY_AL + output: + al_ccsp_maximum_weekly_rate: [0, 165] + +- name: GFDC HUNTSVILLE SCHOOL_AGE STAR_5 full-time is 151 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 30 + al_ccsp_provider_type: GFDC + al_ccsp_quality_tier: STAR_5 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: MADISON_COUNTY_AL + output: + al_ccsp_maximum_weekly_rate: [0, 151] + +- name: FDC MOBILE INFANT_TODDLER BASE full-time is 134 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 30 + al_ccsp_provider_type: FDC + al_ccsp_quality_tier: BASE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: MOBILE_COUNTY_AL + output: + al_ccsp_maximum_weekly_rate: [0, 134] + +- name: Part-time care halves full-time rate. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 20 # <= 25 -> part-time + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: STAR_3 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL # BIRMINGHAM, PRESCHOOL STAR_3 = $191 -> half = $95.5 + output: + al_ccsp_maximum_weekly_rate: [0, 95.5] + +- name: INFORMAL provider full-time capped at 50 per week regardless of region. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: INFORMAL + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + al_ccsp_maximum_weekly_rate: [0, 50] + +- name: INFORMAL provider part-time capped at 25 per week (half of informal cap). + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 20 # <= 25 -> part-time + al_ccsp_provider_type: INFORMAL + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + # Part-time = 1/2 of applicable full-time rate; for INFORMAL the + # applicable full-time rate is the $50 cap, so part-time = $25. + al_ccsp_maximum_weekly_rate: [0, 25] + +- name: Adult gets zero rate (not an eligible child). + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + childcare_hours_per_week: 30 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: STAR_3 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 30 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: STAR_3 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + al_ccsp_maximum_weekly_rate: [0, 191] + +- name: CENTER HUNTSVILLE INFANT_TODDLER STAR_1 full-time is 168 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: STAR_1 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: MADISON_COUNTY_AL + output: + al_ccsp_maximum_weekly_rate: [0, 168] + +- name: CENTER HUNTSVILLE INFANT_TODDLER STAR_2 full-time is 172 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: STAR_2 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: MADISON_COUNTY_AL + output: + al_ccsp_maximum_weekly_rate: [0, 172] + +- name: CENTER HUNTSVILLE INFANT_TODDLER STAR_4 full-time is 179 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: STAR_4 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: MADISON_COUNTY_AL + output: + al_ccsp_maximum_weekly_rate: [0, 179] + +- name: Over-age child with full provider/quality settings gets zero rate. + # Regression: confirms `defined_for = al_ccsp_eligible_child` correctly + # masks the rate to zero based on the eligibility variable, not just on + # personhood (the existing adult-zero-rate test could pass even if + # `defined_for` were dropped). + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 14 + is_tax_unit_dependent: true + is_disabled: false + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: STAR_3 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + al_ccsp_eligible_child: [false, false] + al_ccsp_maximum_weekly_rate: [0, 0] + +- name: CENTER TUSCALOOSA PRESCHOOL STAR_3 full-time is 144 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: STAR_3 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: BIBB_COUNTY_AL + output: + al_ccsp_maximum_weekly_rate: [0, 144] + +- name: CENTER FT_PAYNE PRESCHOOL STAR_3 full-time is 122 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: STAR_3 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: CHEROKEE_COUNTY_AL + output: + al_ccsp_maximum_weekly_rate: [0, 122] + +- name: CENTER DOTHAN PRESCHOOL STAR_3 full-time is 127 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: STAR_3 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: BARBOUR_COUNTY_AL + output: + al_ccsp_maximum_weekly_rate: [0, 127] + +- name: CENTER OPELIKA PRESCHOOL STAR_3 full-time is 149 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: STAR_3 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: LEE_COUNTY_AL + output: + al_ccsp_maximum_weekly_rate: [0, 149] + +- name: INFORMAL provider ignores quality_tier (STAR_5 still hits $50 cap). + # Regression: INFORMAL bypasses the rate matrix entirely. The + # quality_tier input must not affect the $50/wk full-time cap. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + al_ccsp_provider_type: INFORMAL + al_ccsp_quality_tier: STAR_5 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + al_ccsp_maximum_weekly_rate: [0, 50] diff --git a/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_protective_services.yaml b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_protective_services.yaml new file mode 100644 index 00000000000..308db690a99 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_protective_services.yaml @@ -0,0 +1,71 @@ +# AL CCSP protective services tests (SPMUnit, MONTH) +# Per scope decision: foster care OR homelessness flag the SPM unit as protective services. +# Kinship care is EXCLUDED (per CCDF State Plan §2.2.2(f) checkbox). + +- name: Foster child in family triggers protective services. + period: 2024-01 + input: + people: + person1: + age: 40 + person2: + age: 5 + is_tax_unit_dependent: true + is_in_foster_care: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_protective_services: true + +- name: Homeless household triggers protective services. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + is_homeless: true + output: + al_ccsp_protective_services: true + +- name: Family with no foster and not homeless is not in protective services. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_protective_services: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_region.yaml b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_region.yaml new file mode 100644 index 00000000000..6560960f257 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_region.yaml @@ -0,0 +1,128 @@ +# AL CCSP region tests (Household, YEAR, Enum) +# Maps county -> region using counties.yaml lists. + +- name: Madison County is HUNTSVILLE. + period: 2024 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AL + county_str: MADISON_COUNTY_AL + output: + al_ccsp_region: HUNTSVILLE + +- name: Tuscaloosa County is TUSCALOOSA. + period: 2024 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AL + county_str: TUSCALOOSA_COUNTY_AL + output: + al_ccsp_region: TUSCALOOSA + +- name: Mobile County is MOBILE. + period: 2024 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AL + county_str: MOBILE_COUNTY_AL + output: + al_ccsp_region: MOBILE + +- name: DeKalb County is FT_PAYNE. + period: 2024 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AL + county_str: DEKALB_COUNTY_AL + output: + al_ccsp_region: FT_PAYNE + +- name: Jefferson County is BIRMINGHAM. + period: 2024 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + al_ccsp_region: BIRMINGHAM + +- name: Talladega County is TALLADEGA. + period: 2024 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AL + county_str: TALLADEGA_COUNTY_AL + output: + al_ccsp_region: TALLADEGA + +- name: Montgomery County is MONTGOMERY. + period: 2024 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AL + county_str: MONTGOMERY_COUNTY_AL + output: + al_ccsp_region: MONTGOMERY + +- name: Houston County is DOTHAN. + period: 2024 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AL + county_str: HOUSTON_COUNTY_AL + output: + al_ccsp_region: DOTHAN + +- name: Lee County is OPELIKA. + period: 2024 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AL + county_str: LEE_COUNTY_AL + output: + al_ccsp_region: OPELIKA diff --git a/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_weekly_copay_per_child.yaml b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_weekly_copay_per_child.yaml new file mode 100644 index 00000000000..7b5270f2fbd --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_weekly_copay_per_child.yaml @@ -0,0 +1,290 @@ +# AL CCSP weekly per-child parental fee tests (SPMUnit, MONTH). +# Unified 11-band fee schedule indexed by FPL ratio (0-200% FPL). +# Initial applicants must be at or below 180% FPL; continuing recipients may +# remain enrolled up to 200% FPL. Both tiers use the same fee schedule. +# +# AL uses the prior year's HHS FPG (Fact Sheet 2024 -> 2023 FPG). +# 2023 FPG (Contiguous US), family of 4: $30,000/yr = $2,500/mo. +# 80% FPL fam of 4 = $24,000/yr ($2,000/mo) +# 150% FPL fam of 4 = $45,000/yr ($3,750/mo) +# 185% FPL fam of 4 = $55,500/yr ($4,625/mo) +# 195% FPL fam of 4 = $58,500/yr ($4,875/mo) + +- name: Family at 150 percent FPL has $30 weekly per-child fee. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 45_000 # 150% FPL fam of 4 = 45,000/yr + person2: + age: 28 + person3: + age: 4 + is_tax_unit_dependent: true + person4: + age: 2 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + al_ccsp_enrolled: false + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + output: + # FPL ratio = 3,750 / 2,500 = 1.5 -> band [1.4001, 1.5001) -> $30/wk + al_ccsp_weekly_copay_per_child: 30 + +- name: Family at 80 percent FPL has zero weekly per-child fee. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 24_000 # 80% FPL fam of 4 + person2: + age: 28 + person3: + age: 4 + is_tax_unit_dependent: true + person4: + age: 2 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + al_ccsp_enrolled: false + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + output: + # FPL ratio = 2,000 / 2,500 = 0.8 -> band [0, 1.0001) -> $0/wk + al_ccsp_weekly_copay_per_child: 0 + +- name: Enrolled family at 185 percent FPL has $42 weekly per-child fee. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 55_500 # 185% FPL fam of 4 + person2: + age: 28 + person3: + age: 4 + is_tax_unit_dependent: true + person4: + age: 2 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + al_ccsp_enrolled: true + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + output: + # FPL ratio = 4,625 / 2,500 = 1.85 -> band [1.8001, 1.9001) -> $42/wk + al_ccsp_weekly_copay_per_child: 42 + +- name: Enrolled family at 195 percent FPL has $45 weekly per-child fee. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 58_500 # 195% FPL fam of 4 + person2: + age: 28 + person3: + age: 4 + is_tax_unit_dependent: true + person4: + age: 2 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + al_ccsp_enrolled: true + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + output: + # FPL ratio = 4,875 / 2,500 = 1.95 -> band [1.9001, ...) -> $45/wk + al_ccsp_weekly_copay_per_child: 45 + +- name: Family at 130 percent FPL has $24 weekly per-child fee. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 39_000 # 130% FPL fam of 4 = 3,250/mo + person2: + age: 28 + person3: + age: 4 + is_tax_unit_dependent: true + person4: + age: 2 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + al_ccsp_enrolled: false + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + output: + # FPL ratio = 3,250 / 2,500 = 1.30 -> band [1.2001, 1.3001) -> $24/wk + al_ccsp_weekly_copay_per_child: 24 + +- name: Family at 140 percent FPL has $27 weekly per-child fee. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 42_000 # 140% FPL fam of 4 = 3,500/mo + person2: + age: 28 + person3: + age: 4 + is_tax_unit_dependent: true + person4: + age: 2 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + al_ccsp_enrolled: false + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + output: + # FPL ratio = 3,500 / 2,500 = 1.40 -> band [1.3001, 1.4001) -> $27/wk + al_ccsp_weekly_copay_per_child: 27 + +- name: Family at 160 percent FPL has $33 weekly per-child fee. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 48_000 # 160% FPL fam of 4 = 4,000/mo + person2: + age: 28 + person3: + age: 4 + is_tax_unit_dependent: true + person4: + age: 2 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + al_ccsp_enrolled: false + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + output: + # FPL ratio = 4,000 / 2,500 = 1.60 -> band [1.5001, 1.6001) -> $33/wk + al_ccsp_weekly_copay_per_child: 33 + +- name: Family at 170 percent FPL has $36 weekly per-child fee. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 51_000 # 170% FPL fam of 4 = 4,250/mo + person2: + age: 28 + person3: + age: 4 + is_tax_unit_dependent: true + person4: + age: 2 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + al_ccsp_enrolled: false + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + output: + # FPL ratio = 4,250 / 2,500 = 1.70 -> band [1.6001, 1.7001) -> $36/wk + al_ccsp_weekly_copay_per_child: 36 + +- name: Enrolled family at exactly 200 percent FPL has $45 weekly per-child fee. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 60_000 # 200% FPL fam of 4 = 5,000/mo + person2: + age: 28 + person3: + age: 4 + is_tax_unit_dependent: true + person4: + age: 2 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + al_ccsp_enrolled: true + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + output: + # FPL ratio = 5,000 / 2,500 = 2.00 -> band [1.9001, inf) -> $45/wk + al_ccsp_weekly_copay_per_child: 45 diff --git a/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_child_care_subsidies.yaml b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_child_care_subsidies.yaml new file mode 100644 index 00000000000..9f116aab770 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_child_care_subsidies.yaml @@ -0,0 +1,69 @@ +# AL CCSP annual aggregator tests (SPMUnit, YEAR, USD) +# adds = ["al_ccsp"] -- sums the monthly al_ccsp benefit over 12 months. + +- name: Ineligible family aggregator is zero. + period: 2024 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 80_000 + immigration_status: CITIZEN + weekly_hours_worked: 40 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 12_000 + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + al_child_care_subsidies: 0 + +- name: Low-income family aggregator is 12 times monthly subsidy. + period: 2024 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 18_000 + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + pre_subsidy_childcare_expenses: 10_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 10_000 + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + # Monthly al_ccsp = $780 (BIRMINGHAM CENTER PRESCHOOL BASE $180 * 52/12) + # Annual = 12 * $780 = $9,360 + al_child_care_subsidies: 9360 diff --git a/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/edge_cases.yaml b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/edge_cases.yaml new file mode 100644 index 00000000000..ca2b8d3f800 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/edge_cases.yaml @@ -0,0 +1,514 @@ +# AL CCSP edge case tests +# Boundary conditions, multi-dimension rate coverage, and unusual configurations. + +# -- Age boundary tests -- + +- name: Child exactly age 13 not disabled is ineligible (strict less-than). + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 13 + is_tax_unit_dependent: true + immigration_status: CITIZEN + is_disabled: false + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_eligible_child: [false, false] + +- name: Disabled child exactly age 19 is ineligible (strict less-than). + period: 2024-01 + input: + people: + person1: + age: 40 + person2: + age: 19 + is_tax_unit_dependent: true + immigration_status: CITIZEN + is_disabled: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_eligible_child: [false, false] + +# -- Activity boundary tests -- + +- name: Parent working 14 hours per week is activity ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 14 + is_full_time_student: false + is_disabled: false + person2: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_activity_eligible: false + +# -- Asset boundary test -- + +- name: Assets exactly 1 million dollars is asset eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_assets: 1_000_000 + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_eligible: true + +- name: Assets one dollar over 1 million is asset ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_assets: 1_000_001 + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_eligible: false + +# -- Care hours boundary tests (full-time / part-time) -- + +- name: Care hours exactly 25 is part-time (half rate). + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 25 # boundary <= 25 = part-time + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL # BIRMINGHAM CENTER PRESCHOOL BASE = $180 -> half = $90 + output: + al_ccsp_maximum_weekly_rate: [0, 90] + +- name: Care hours exactly 26 is full-time. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 26 # > 25 -> full-time + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + al_ccsp_maximum_weekly_rate: [0, 180] + +# -- Multi-region rate coverage -- + +- name: GFDC rate in Huntsville Preschool STAR_3 is 154 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: GFDC + al_ccsp_quality_tier: STAR_3 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: MADISON_COUNTY_AL + output: + al_ccsp_maximum_weekly_rate: [0, 154] + +- name: FDC rate in Mobile School_Age STAR_5 is 138 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 30 + al_ccsp_provider_type: FDC + al_ccsp_quality_tier: STAR_5 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: MOBILE_COUNTY_AL + output: + al_ccsp_maximum_weekly_rate: [0, 138] + +- name: CENTER Talladega INFANT_TODDLER BASE is 120 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: TALLADEGA_COUNTY_AL + output: + al_ccsp_maximum_weekly_rate: [0, 120] + +- name: CENTER Montgomery PRESCHOOL STAR_5 is 149 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: STAR_5 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: MONTGOMERY_COUNTY_AL + output: + al_ccsp_maximum_weekly_rate: [0, 149] + +# -- Copay band boundary tests -- + +- name: Family at exactly 100 percent FPL has zero copay. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 19_720 # 100% 2023 FPG fam of 2 + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + # At exactly 100% FPL (ratio 1.0), the $0 band applies (next threshold is 1.0001). + al_ccsp_weekly_copay_per_child: 0 + +- name: Family at exactly 110 percent FPL pays 18 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 21_692 # 110% 2023 FPG fam of 2 = 19,720 * 1.10 + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + # 110% FPL ratio = 1.10 -> 101-110 band ($18/wk). + al_ccsp_weekly_copay_per_child: 18 + +- name: Family at 120 percent FPL pays 21 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 23_664 # 120% 2023 FPG fam of 2 = 19,720 * 1.20 + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + # 120% FPL -> 111-120 band ($21/wk). + al_ccsp_weekly_copay_per_child: 21 + +# -- Zero family income -- + +- name: Zero income working-zero parent fails activity test but eligible-child still true. + period: 2024-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 0 + is_full_time_student: false + is_disabled: false + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AL + output: + al_ccsp_eligible_child: [false, true] + al_ccsp_activity_eligible: false + al_ccsp_eligible: false + +# -- Region masking for non-AL households (no crash) -- + +- name: Non-AL family has zero benefit even with childcare expenses. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 24_000 + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + pre_subsidy_childcare_expenses: 8_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 8_000 + households: + household: + members: [person1, person2] + state_code: GA + county_str: AUTAUGA_COUNTY_AL + output: + # Regression: non-AL household carrying an AL county string must not + # crash the region lookup; al_ccsp_region.py masks county lookup to + # AL households only. + al_ccsp: 0 + al_ccsp_eligible: false + +# -- Negative countable income (self-employment loss) -- + +- name: Self-employment loss floors copay at zero and does not inflate subsidy. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + self_employment_income: -60_000 # -$5K/month loss + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + pre_subsidy_childcare_expenses: 20_000 # /year per child + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 20_000 + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL # Birmingham region + output: + # Negative countable income passes the FPL/SMI tests trivially. + al_ccsp_income_eligible: true + # fpl_ratio is floored at 0 -> lowest fee bracket (0) + al_ccsp_weekly_copay_per_child: 0 + # Weekly expense ($20K/52 = $384.62) capped at Birmingham CENTER + # PRESCHOOL BASE max rate ($180). Subsidy = $180 - $0 copay = $180/wk. + # Monthly: $180 * (52/12) = $780. + al_ccsp: 780 diff --git a/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/integration.yaml new file mode 100644 index 00000000000..bc238c2d49e --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/integration.yaml @@ -0,0 +1,480 @@ +# AL CCSP integration tests +# Cross-cuts eligibility, copay, rate lookup, and benefit calculation. +# +# AL CCSP uses the prior calendar year's HHS FPG (Fact Sheet 2024 -> 2023 FPG). +# 2023 FPG (Contiguous US): first $14,580, additional $5,140. +# FS 2: $19,720/yr ($1,643.33/mo); 150% FPL = 2,465/mo; 180% = 2,958/mo +# FS 3: $24,860/yr ($2,071.67/mo) +# FS 4: $30,000/yr ($2,500/mo); 150% FPL = 3,750/mo; 180% = 4,500/mo; +# 190% = 4,750/mo; 200% = 5,000/mo +# AL SMI FS 4 (2023-10-01): $88,407/yr. 85% SMI FS 4: $75,145.95/yr (6,262.16/mo). +# Weekly -> monthly multiplier: WEEKS_IN_YEAR / MONTHS_IN_YEAR = 52/12 ≈ 4.3333. + +- name: Two-parent family at 150 FPL with center care in Birmingham STAR_3. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 37_290 # 150% 2023 FPG fam of 3 = 24,860 * 1.5 + immigration_status: CITIZEN + weekly_hours_worked: 40 + person2: + age: 28 + weekly_hours_worked: 40 + person3: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: STAR_3 + pre_subsidy_childcare_expenses: 10_000 + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_pre_subsidy_childcare_expenses: 10_000 + al_ccsp_enrolled: false + households: + household: + members: [person1, person2, person3] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + al_ccsp_eligible_child: [false, false, true] + al_ccsp_income_eligible: true + al_ccsp_eligible: true + # 150% FPL -> $30/wk per child + al_ccsp_weekly_copay_per_child: 30 + # BIRMINGHAM CENTER PRESCHOOL STAR_3 full-time = $191/wk + al_ccsp_maximum_weekly_rate: [0, 0, 191] + # weekly charge = 10,000 / 52 = $192.31; min($192.31, $191) = $191 + # weekly subsidy = $191 - $30 = $161 + # monthly = $161 * (52/12) = $697.67 + al_ccsp: 697.67 + +- name: Single parent at 60 FPL enrolled with FDC in Mobile BASE. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 25 + employment_income: 12_264 # ~62% 2023 FPG fam of 2 = 1,022/mo + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: FDC + al_ccsp_quality_tier: BASE + pre_subsidy_childcare_expenses: 8_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 8_000 + al_ccsp_enrolled: true + households: + household: + members: [person1, person2] + state_code: AL + county_str: MOBILE_COUNTY_AL + output: + al_ccsp_eligible_child: [false, true] + al_ccsp_eligible: true + # <= 100% FPL -> $0/wk copay + al_ccsp_weekly_copay_per_child: 0 + # MOBILE FDC INFANT_TODDLER BASE full-time = $134/wk + al_ccsp_maximum_weekly_rate: [0, 134] + # weekly charge = 8,000 / 52 = $153.85; min($153.85, $134) = $134 + # monthly = $134 * (52/12) = $580.67 + al_ccsp: 580.67 + +- name: Family at 190 FPL initial tier is ineligible. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 57_000 # 190% 2023 FPG fam of 4 = 30,000 * 1.9 + immigration_status: CITIZEN + weekly_hours_worked: 40 + person2: + age: 28 + person3: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + person4: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + spm_unit_pre_subsidy_childcare_expenses: 18_000 + al_ccsp_enrolled: false + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + al_ccsp_income_eligible: false + al_ccsp_eligible: false + al_ccsp: 0 + +- name: Family at 190 FPL continuing tier is eligible with copay 42 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 47_234 # 190% 2023 FPG fam of 3 = 24,860 * 1.9 + immigration_status: CITIZEN + weekly_hours_worked: 40 + person2: + age: 28 + weekly_hours_worked: 40 + person3: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + pre_subsidy_childcare_expenses: 10_000 + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_pre_subsidy_childcare_expenses: 10_000 + al_ccsp_enrolled: true + households: + household: + members: [person1, person2, person3] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + al_ccsp_eligible: true + # FPL ratio = 47,234 / 24,860 = 1.90 -> 181-190 band -> $42/wk + al_ccsp_weekly_copay_per_child: 42 + # BIRMINGHAM CENTER PRESCHOOL BASE = $180/wk + al_ccsp_maximum_weekly_rate: [0, 0, 180] + # weekly charge = 10,000 / 52 = $192.31; min($192.31, $180) = $180 + # weekly subsidy = $180 - $42 = $138 + # monthly = $138 * (52/12) = $598 + al_ccsp: 598 + +- name: Foster child waives income test and copay. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 35 + employment_income: 35_000 # would otherwise be a paid copay tier + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + is_in_foster_care: true + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + pre_subsidy_childcare_expenses: 10_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 10_000 + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + al_ccsp_eligible: true + al_ccsp_protective_services: true + al_ccsp_weekly_copay_per_child: 0 + # BIRMINGHAM CENTER SCHOOL_AGE BASE = $150/wk + al_ccsp_maximum_weekly_rate: [0, 150] + # weekly subsidy = $150; monthly = $150 * (52/12) = $650 + al_ccsp: 650 + +- name: Disabled child waives copay. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 35 + employment_income: 29_580 # 150% 2023 FPG fam of 2 (would normally have $30/wk copay) + immigration_status: CITIZEN + weekly_hours_worked: 40 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + is_disabled: true + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + pre_subsidy_childcare_expenses: 10_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 10_000 + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + al_ccsp_eligible: true + al_ccsp_weekly_copay_per_child: 0 + # BIRMINGHAM CENTER SCHOOL_AGE BASE = $150/wk (age 5) + # weekly subsidy = $150 - $0 = $150; monthly = $150 * (52/12) = $650 + al_ccsp: 650 + +- name: Family above 85 SMI is ineligible even with low FPL ratio (large household). + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 85_000 # well above 85% SMI fam of 4 ($75,146/yr) + immigration_status: CITIZEN + weekly_hours_worked: 40 + person2: + age: 28 + person3: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + person4: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + spm_unit_pre_subsidy_childcare_expenses: 18_000 + al_ccsp_enrolled: true + households: + household: + members: [person1, person2, person3, person4] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + al_ccsp_eligible: false + al_ccsp: 0 + +- name: Two eligible children with center care split copay. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 37_290 # 150% 2023 FPG fam of 3 = 24,860 * 1.5 + immigration_status: CITIZEN + weekly_hours_worked: 40 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + pre_subsidy_childcare_expenses: 7_000 + person3: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + pre_subsidy_childcare_expenses: 7_000 + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_pre_subsidy_childcare_expenses: 14_000 + households: + household: + members: [person1, person2, person3] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + al_ccsp_eligible_child: [false, true, true] + al_ccsp_eligible: true + # 150% FPL -> $30/wk per child (2 children both pay) + al_ccsp_weekly_copay_per_child: 30 + # BIRMINGHAM CENTER PRESCHOOL BASE = $180; CENTER INFANT_TODDLER BASE = $195 + al_ccsp_maximum_weekly_rate: [0, 180, 195] + # weekly charge per child = 7,000 / 52 = $134.62 + # child 1 (age 4): min($134.62, $180) = $134.62; subsidy = $134.62 - $30 = $104.62 + # child 2 (age 2): min($134.62, $195) = $134.62; subsidy = $134.62 - $30 = $104.62 + # total weekly subsidy = $209.24; monthly = $209.24 * (52/12) = $906.71 + al_ccsp: 906.71 + +- name: Part-time care halves provider rate. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 18_000 + immigration_status: CITIZEN + weekly_hours_worked: 20 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 20 # <= 25 -> part-time + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: BASE + pre_subsidy_childcare_expenses: 5_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 5_000 + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + al_ccsp_eligible: true + # BIRMINGHAM CENTER PRESCHOOL BASE full-time = $180; part-time = $90 + al_ccsp_maximum_weekly_rate: [0, 90] + # weekly charge = 5,000 / 52 = $96.15; min(96.15, 90) = $90 + # copay = $0 (<=100% FPL) + # monthly = $90 * (52/12) = $390 + al_ccsp: 390 + +- name: INFORMAL provider capped at 50 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 18_000 + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: INFORMAL + pre_subsidy_childcare_expenses: 5_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 5_000 + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + al_ccsp_eligible: true + al_ccsp_maximum_weekly_rate: [0, 50] + # weekly charge = $96.15; min($96.15, $50) = $50 + # copay = $0; monthly = $50 * (52/12) = $216.67 + al_ccsp: 216.67 + +# -- 2025 coverage check (parameters carry forward) -- + +- name: Two-parent family at 150 FPL with center care in 2025 (same as 2024 baseline). + period: 2025-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + # 2025-01 uses prior-year (2024) FPG for fam of 3 = 25,820; + # 150% = 38,730. + employment_income: 38_730 + immigration_status: CITIZEN + weekly_hours_worked: 40 + person2: + age: 28 + weekly_hours_worked: 40 + person3: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + al_ccsp_provider_type: CENTER + al_ccsp_quality_tier: STAR_3 + pre_subsidy_childcare_expenses: 10_000 + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_pre_subsidy_childcare_expenses: 10_000 + al_ccsp_enrolled: false + households: + household: + members: [person1, person2, person3] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + # State Plan covers FFY 2025-2027; parameter values carry forward + # from 2024-01-01 entries. This test guards against accidental + # parameter resets between 2024 and 2025. + al_ccsp_eligible: true diff --git a/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp.py b/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp.py new file mode 100644 index 00000000000..0378765dd8e --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp.py @@ -0,0 +1,38 @@ +from policyengine_us.model_api import * + + +class al_ccsp(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "Alabama Child Care Subsidy Program benefit amount" + definition_period = MONTH + defined_for = "al_ccsp_eligible" + reference = "https://dhr.alabama.gov/wp-content/uploads/2023/04/2025-2027-CCDF-State-Plan-with-Approval-Letter.pdf#page=40" + + def formula(spm_unit, period): + person = spm_unit.members + + weekly_rate = person("al_ccsp_maximum_weekly_rate", period) + is_eligible_child = person("al_ccsp_eligible_child", period) + in_care = person("childcare_hours_per_week", period.this_year) > 0 + is_paying_child = is_eligible_child & in_care + + # al_ccsp_weekly_copay_per_child already applies the §3.3.1 waiver. + weekly_copay = spm_unit("al_ccsp_weekly_copay_per_child", period) + per_child_weekly_copay_broadcast = spm_unit.project(weekly_copay) + + annual_expense = person("pre_subsidy_childcare_expenses", period.this_year) + weekly_expense = annual_expense / WEEKS_IN_YEAR + + capped_charge = min_(weekly_expense, weekly_rate) + per_child_weekly_subsidy = max_( + capped_charge - per_child_weekly_copay_broadcast, 0 + ) + + per_child_monthly_subsidy = ( + per_child_weekly_subsidy + * (WEEKS_IN_YEAR / MONTHS_IN_YEAR) + * is_paying_child + ) + return spm_unit.sum(per_child_monthly_subsidy) diff --git a/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_age_category.py b/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_age_category.py new file mode 100644 index 00000000000..5cf3c15ff97 --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_age_category.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class ALCCSPAgeCategory(Enum): + INFANT_TODDLER = "Infant/Toddler (under 36 months)" + PRESCHOOL = "Preschool (36-59 months)" + SCHOOL_AGE = "School Age (60+ months)" + + +class al_ccsp_age_category(Variable): + value_type = Enum + entity = Person + possible_values = ALCCSPAgeCategory + default_value = ALCCSPAgeCategory.INFANT_TODDLER + definition_period = MONTH + label = "Alabama CCSP child age category for payment rates" + defined_for = StateCode.AL + reference = "https://dhr.alabama.gov/wp-content/uploads/2023/04/Provider-Rates-with-QRIS-Tiers-April-1-2022-b.pdf#page=2" + + def formula(person, period, parameters): + p = parameters(period).gov.states.al.dhr.ccsp.age_category + age_months = person("age", period.this_year) * MONTHS_IN_YEAR + return p.months.calc(age_months) diff --git a/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_countable_income.py b/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_countable_income.py new file mode 100644 index 00000000000..c0749c38191 --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_countable_income.py @@ -0,0 +1,13 @@ +from policyengine_us.model_api import * + + +class al_ccsp_countable_income(Variable): + value_type = float + entity = SPMUnit + label = "Alabama CCSP countable monthly gross income" + definition_period = MONTH + unit = USD + defined_for = StateCode.AL + reference = "https://dhr.alabama.gov/wp-content/uploads/2023/04/2025-2027-CCDF-State-Plan-with-Approval-Letter.pdf#page=26" + + adds = "gov.states.al.dhr.ccsp.income.countable_income.sources" diff --git a/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_enrolled.py b/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_enrolled.py new file mode 100644 index 00000000000..55f21e6be47 --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_enrolled.py @@ -0,0 +1,14 @@ +from policyengine_us.model_api import * + + +class al_ccsp_enrolled(Variable): + value_type = bool + entity = SPMUnit + definition_period = MONTH + # Distinguishes new applicants (180% FPL initial cap) from continuing + # recipients (200% FPL continuing cap, §2.5.2(c)(iii)). Defaults to + # False, so every household is treated as a new applicant unless this + # input is explicitly set. + label = "Whether the family is currently enrolled in Alabama CCSP" + defined_for = StateCode.AL + reference = "https://dhr.alabama.gov/wp-content/uploads/2023/04/2025-2027-CCDF-State-Plan-with-Approval-Letter.pdf#page=39" diff --git a/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_provider_type.py b/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_provider_type.py new file mode 100644 index 00000000000..a2cbad1aaa7 --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_provider_type.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class ALCCSPProviderType(Enum): + CENTER = "Child Care Center" + GFDC = "Group Family Day Care Home" + FDC = "Family Day Care Home" + INFORMAL = "Informal (License-Exempt) Provider" + + +class al_ccsp_provider_type(Variable): + value_type = Enum + entity = Person + possible_values = ALCCSPProviderType + default_value = ALCCSPProviderType.CENTER + definition_period = MONTH + label = "Alabama CCSP child care provider type" + defined_for = StateCode.AL + reference = "https://dhr.alabama.gov/wp-content/uploads/2023/04/Provider-Rates-with-QRIS-Tiers-April-1-2022-b.pdf#page=2" diff --git a/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_quality_tier.py b/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_quality_tier.py new file mode 100644 index 00000000000..cd29543a34b --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_quality_tier.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class ALCCSPQualityTier(Enum): + BASE = "Base" + STAR_1 = "1 Star" + STAR_2 = "2 Star" + STAR_3 = "3 Star" + STAR_4 = "4 Star" + STAR_5 = "5 Star" + + +class al_ccsp_quality_tier(Variable): + value_type = Enum + entity = Person + possible_values = ALCCSPQualityTier + default_value = ALCCSPQualityTier.BASE + definition_period = MONTH + label = "Alabama CCSP provider quality tier" + defined_for = StateCode.AL + reference = "https://dhr.alabama.gov/wp-content/uploads/2023/04/Provider-Rates-with-QRIS-Tiers-April-1-2022-b.pdf#page=2" diff --git a/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_region.py b/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_region.py new file mode 100644 index 00000000000..4b6e752154f --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_region.py @@ -0,0 +1,58 @@ +from policyengine_us.model_api import * + + +class ALCCSPRegion(Enum): + HUNTSVILLE = "Huntsville" + TUSCALOOSA = "Tuscaloosa" + MOBILE = "Mobile" + FT_PAYNE = "Ft. Payne" + BIRMINGHAM = "Birmingham" + TALLADEGA = "Talladega" + MONTGOMERY = "Montgomery" + DOTHAN = "Dothan" + OPELIKA = "Opelika" + + +class al_ccsp_region(Variable): + value_type = Enum + entity = Household + possible_values = ALCCSPRegion + default_value = ALCCSPRegion.BIRMINGHAM + definition_period = YEAR + label = "Alabama CCSP rate-setting region" + defined_for = StateCode.AL + reference = "https://dhr.alabama.gov/wp-content/uploads/2023/04/Provider-Rates-with-QRIS-Tiers-April-1-2022-b.pdf#page=1" + + def formula(household, period, parameters): + county = household("county_str", period) + state = household("state_code_str", period) + # Mask with state_code_str == "AL" so non-Alabama county strings + # do not flow into the region lookup (defined_for filters output + # but does not short-circuit vectorized indexing). + in_alabama = state == "AL" + p = parameters(period).gov.states.al.dhr.ccsp.region.counties + return select( + [ + in_alabama & np.isin(county, p.HUNTSVILLE), + in_alabama & np.isin(county, p.TUSCALOOSA), + in_alabama & np.isin(county, p.MOBILE), + in_alabama & np.isin(county, p.FT_PAYNE), + in_alabama & np.isin(county, p.BIRMINGHAM), + in_alabama & np.isin(county, p.TALLADEGA), + in_alabama & np.isin(county, p.MONTGOMERY), + in_alabama & np.isin(county, p.DOTHAN), + in_alabama & np.isin(county, p.OPELIKA), + ], + [ + ALCCSPRegion.HUNTSVILLE, + ALCCSPRegion.TUSCALOOSA, + ALCCSPRegion.MOBILE, + ALCCSPRegion.FT_PAYNE, + ALCCSPRegion.BIRMINGHAM, + ALCCSPRegion.TALLADEGA, + ALCCSPRegion.MONTGOMERY, + ALCCSPRegion.DOTHAN, + ALCCSPRegion.OPELIKA, + ], + default=ALCCSPRegion.BIRMINGHAM, + ) diff --git a/policyengine_us/variables/gov/states/al/dhr/ccsp/al_child_care_subsidies.py b/policyengine_us/variables/gov/states/al/dhr/ccsp/al_child_care_subsidies.py new file mode 100644 index 00000000000..2616bc70ab9 --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/al_child_care_subsidies.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class al_child_care_subsidies(Variable): + value_type = float + entity = SPMUnit + label = "Alabama child care subsidies" + unit = USD + definition_period = YEAR + defined_for = StateCode.AL + adds = ["al_ccsp"] diff --git a/policyengine_us/variables/gov/states/al/dhr/ccsp/copay/al_ccsp_copay_waived.py b/policyengine_us/variables/gov/states/al/dhr/ccsp/copay/al_ccsp_copay_waived.py new file mode 100644 index 00000000000..36d382e2e77 --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/copay/al_ccsp_copay_waived.py @@ -0,0 +1,28 @@ +from policyengine_us.model_api import * + + +class al_ccsp_copay_waived(Variable): + value_type = bool + entity = SPMUnit + label = "Alabama CCSP copay waived" + definition_period = MONTH + defined_for = StateCode.AL + reference = "https://dhr.alabama.gov/wp-content/uploads/2023/04/2025-2027-CCDF-State-Plan-with-Approval-Letter.pdf#page=43" + + def formula(spm_unit, period, parameters): + # Per §3.3.1, AL waives copay for: + # (iv) families with a disabled child + # (v) families with a Head Start / EHS child + # (vi) children authorized under the Protective Service category + # (foster, kinship, homelessness, etc. per §2.2.2(f)). + p_age = parameters(period).gov.states.al.dhr.ccsp.age + person = spm_unit.members + is_disabled = person("is_disabled", period.this_year) + age = person("age", period.this_year) + is_dependent = person("is_tax_unit_dependent", period.this_year) + has_disabled_child = spm_unit.any( + is_disabled & (age < p_age.disabled_child_limit) & is_dependent + ) + has_head_start_child = add(spm_unit, period, ["is_enrolled_in_head_start"]) > 0 + protective_services = spm_unit("al_ccsp_protective_services", period) + return has_disabled_child | has_head_start_child | protective_services diff --git a/policyengine_us/variables/gov/states/al/dhr/ccsp/copay/al_ccsp_weekly_copay_per_child.py b/policyengine_us/variables/gov/states/al/dhr/ccsp/copay/al_ccsp_weekly_copay_per_child.py new file mode 100644 index 00000000000..9b49401b51e --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/copay/al_ccsp_weekly_copay_per_child.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class al_ccsp_weekly_copay_per_child(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "Alabama CCSP weekly per-child parental fee" + definition_period = MONTH + defined_for = StateCode.AL + reference = "https://dhr.alabama.gov/wp-content/uploads/2024/01/Child-Care-Fact-Sheet-2024.pdf" + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.al.dhr.ccsp.copay + # Floor income at 0 so self-employment / farm losses land in the + # $0 copay band rather than producing a negative FPL ratio. + monthly_income = max_(spm_unit("al_ccsp_countable_income", period), 0) + # Use the prior calendar year's HHS poverty guidelines to match + # Alabama's Child Care Fact Sheet operational thresholds. + prior_year = period.start.year - 1 + monthly_fpg = spm_unit("spm_unit_fpg", str(prior_year)) / MONTHS_IN_YEAR + fpl_ratio = where(monthly_fpg > 0, monthly_income / monthly_fpg, 0) + fee = p.fee_by_fpl.calc(fpl_ratio) + copay_waived = spm_unit("al_ccsp_copay_waived", period) + return where(copay_waived, 0, fee) diff --git a/policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_activity_eligible.py b/policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_activity_eligible.py new file mode 100644 index 00000000000..348503b0a93 --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_activity_eligible.py @@ -0,0 +1,35 @@ +from policyengine_us.model_api import * + + +class al_ccsp_activity_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for Alabama CCSP based on parental activity requirements" + definition_period = MONTH + defined_for = StateCode.AL + reference = "https://dhr.alabama.gov/wp-content/uploads/2023/04/2025-2027-CCDF-State-Plan-with-Approval-Letter.pdf#page=22" + + def formula(spm_unit, period, parameters): + # Alabama §2.2.2(d)(ii) applies the activity test to the parent(s) + # or in loco parentis caregiver(s). We approximate the caregiver + # set with is_tax_unit_head_or_spouse; grandparent / kinship / + # foster caregivers who aren't the tax-unit head won't be checked + # individually, so users should set meets_ccdf_activity_test in + # those cases. + p = parameters(period).gov.states.al.dhr.ccsp.activity + person = spm_unit.members + is_head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) + hours_worked = person("weekly_hours_worked", period.this_year) + meets_work_requirement = hours_worked >= p.hours_minimum + is_student = person("is_full_time_student", period.this_year) + individually_eligible = meets_work_requirement | is_student + has_head_or_spouse = spm_unit.sum(is_head_or_spouse) >= 1 + all_covered = spm_unit.sum(is_head_or_spouse & ~individually_eligible) == 0 + # Permissive fallback for approved activities not individually + # modeled (job search, education/training, SNAP E&T, temporary + # leave, disabled-parent good cause, in loco parentis caregivers, + # etc.). §2.2.2 only waives the activity test categorically for + # children receiving protective services (§2.2.2(h)); other + # exemptions must be set via this fallback input. + fallback = spm_unit("meets_ccdf_activity_test", period.this_year) + return (has_head_or_spouse & all_covered) | fallback diff --git a/policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_eligible.py b/policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_eligible.py new file mode 100644 index 00000000000..3c92946dc0d --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_eligible.py @@ -0,0 +1,29 @@ +from policyengine_us.model_api import * + + +class al_ccsp_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for Alabama CCSP" + definition_period = MONTH + defined_for = StateCode.AL + reference = "https://dhr.alabama.gov/wp-content/uploads/2023/04/2025-2027-CCDF-State-Plan-with-Approval-Letter.pdf#page=20" + + def formula(spm_unit, period, parameters): + has_eligible_child = add(spm_unit, period, ["al_ccsp_eligible_child"]) > 0 + income_eligible = spm_unit("al_ccsp_income_eligible", period) + asset_eligible = spm_unit("is_ccdf_asset_eligible", period.this_year) + activity_eligible = spm_unit("al_ccsp_activity_eligible", period) + + # Standard pathway: child + income + asset + activity tests. + standard = ( + has_eligible_child & income_eligible & asset_eligible & activity_eligible + ) + + # Protective-services pathway (§2.2.2(f)) waives income and + # activity tests. The asset test is NOT waived (State Plan + # §2.2.6 leaves the protective-services waiver box unchecked). + protective = spm_unit("al_ccsp_protective_services", period) + protective_path = has_eligible_child & asset_eligible & protective + + return standard | protective_path diff --git a/policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_eligible_child.py b/policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_eligible_child.py new file mode 100644 index 00000000000..c5e53c59dfd --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_eligible_child.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class al_ccsp_eligible_child(Variable): + value_type = bool + entity = Person + label = "Eligible child for Alabama CCSP" + definition_period = MONTH + defined_for = StateCode.AL + reference = "https://dhr.alabama.gov/wp-content/uploads/2023/04/2025-2027-CCDF-State-Plan-with-Approval-Letter.pdf#page=20" + + def formula(person, period, parameters): + p = parameters(period).gov.states.al.dhr.ccsp.age + age = person("age", period.this_year) + is_disabled = person("is_disabled", period.this_year) + age_eligible = where( + is_disabled, + age < p.disabled_child_limit, + age < p.child_limit, + ) + immigration_eligible = person( + "is_ccdf_immigration_eligible_child", period.this_year + ) + is_dependent = person("is_tax_unit_dependent", period.this_year) + return age_eligible & immigration_eligible & is_dependent diff --git a/policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_income_eligible.py b/policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_income_eligible.py new file mode 100644 index 00000000000..09b7aa529c4 --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_income_eligible.py @@ -0,0 +1,33 @@ +from policyengine_us.model_api import * + + +class al_ccsp_income_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for Alabama CCSP based on income" + definition_period = MONTH + defined_for = StateCode.AL + reference = "https://dhr.alabama.gov/wp-content/uploads/2023/04/2025-2027-CCDF-State-Plan-with-Approval-Letter.pdf#page=24" + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.al.dhr.ccsp.income.limit + monthly_income = spm_unit("al_ccsp_countable_income", period) + + # Alabama's published income tables (Child Care Fact Sheet) use the + # prior calendar year's HHS poverty guidelines throughout the + # benefit year, since HHS publishes the new guidelines mid-January. + prior_year = period.start.year - 1 + annual_fpg = spm_unit("spm_unit_fpg", str(prior_year)) + monthly_fpg = annual_fpg / MONTHS_IN_YEAR + enrolled = spm_unit("al_ccsp_enrolled", period) + fpl_limit_ratio = where( + enrolled, + p.fpl_continuing, + p.fpl_initial, + ) + fpl_eligible = monthly_income <= monthly_fpg * fpl_limit_ratio + + monthly_smi = spm_unit("hhs_smi", period) + smi_eligible = monthly_income <= monthly_smi * p.smi_cap + + return fpl_eligible & smi_eligible diff --git a/policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_protective_services.py b/policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_protective_services.py new file mode 100644 index 00000000000..8b2ae791ed2 --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_protective_services.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class al_ccsp_protective_services(Variable): + value_type = bool + entity = SPMUnit + label = "Alabama CCSP protective services category" + definition_period = MONTH + defined_for = StateCode.AL + reference = "https://dhr.alabama.gov/wp-content/uploads/2023/04/2025-2027-CCDF-State-Plan-with-Approval-Letter.pdf#page=23" + + def formula(spm_unit, period, parameters): + # State Plan §2.2.2(f) checks four protective-services sub-populations: + # (i) foster care — modeled via is_in_foster_care + # (ii) families engaged with a child welfare agency — we don't + # track child-welfare engagement at the moment + # (iii) Early Head Start Child Care Partnerships (EHS-CCP) — we + # don't track EHS-CCP enrollment at the moment + # (iv) homelessness — modeled via is_homeless + # The two unmodeled categories under-count protective-services + # eligibility, which waives the income and activity tests + # (§2.2.2(g)-(h)). + has_foster_child = add(spm_unit, period, ["is_in_foster_care"]) > 0 + is_homeless = spm_unit.household("is_homeless", period.this_year) + return has_foster_child | is_homeless diff --git a/policyengine_us/variables/gov/states/al/dhr/ccsp/payment/al_ccsp_maximum_weekly_rate.py b/policyengine_us/variables/gov/states/al/dhr/ccsp/payment/al_ccsp_maximum_weekly_rate.py new file mode 100644 index 00000000000..00012f7ea19 --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/payment/al_ccsp_maximum_weekly_rate.py @@ -0,0 +1,49 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.al.dhr.ccsp.al_ccsp_provider_type import ( + ALCCSPProviderType, +) + + +class al_ccsp_maximum_weekly_rate(Variable): + value_type = float + entity = Person + unit = USD + label = "Alabama CCSP maximum weekly reimbursement rate per child" + definition_period = MONTH + defined_for = "al_ccsp_eligible_child" + reference = "https://dhr.alabama.gov/wp-content/uploads/2023/04/Provider-Rates-with-QRIS-Tiers-April-1-2022-b.pdf#page=1" + + def formula(person, period, parameters): + p = parameters(period).gov.states.al.dhr.ccsp.rates + provider_type = person("al_ccsp_provider_type", period) + region = person.household("al_ccsp_region", period.this_year) + age_category = person("al_ccsp_age_category", period) + quality_tier = person("al_ccsp_quality_tier", period) + + rates = p.maximum_weekly_full_time + center_rate = rates.CENTER[region][age_category][quality_tier] + gfdc_rate = rates.GFDC[region][age_category][quality_tier] + fdc_rate = rates.FDC[region][age_category][quality_tier] + + # INFORMAL providers use the flat informal_weekly_cap as their + # full-time rate; the matrix is not consulted for them. + full_time_rate = select( + [ + provider_type == ALCCSPProviderType.CENTER, + provider_type == ALCCSPProviderType.GFDC, + provider_type == ALCCSPProviderType.FDC, + ], + [center_rate, gfdc_rate, fdc_rate], + default=p.informal_weekly_cap, + ) + + # Part-time (≤25 hours/week) pays half the applicable full-time + # rate, including for INFORMAL providers (so the part-time cap is + # half of informal_weekly_cap). + hours = person("childcare_hours_per_week", period.this_year) + is_part_time = hours <= p.full_time_hours_threshold + return where( + is_part_time, + full_time_rate * p.part_time_multiplier, + full_time_rate, + )