From 5a44f14512bdc0b9d5d4f309d0e4211b1da899df Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 14 May 2026 22:33:17 -0400 Subject: [PATCH 1/5] Initial commit for AL CCAP implementation Closes #8321 From 12c0c03cd751fbcb7a700135dbaeeed3bd1720bc Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 14 May 2026 22:33:46 -0400 Subject: [PATCH 2/5] Add changelog fragment for AL CCAP Closes #8321 --- changelog.d/al-ccap.added.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/al-ccap.added.md diff --git a/changelog.d/al-ccap.added.md b/changelog.d/al-ccap.added.md new file mode 100644 index 00000000000..0f3a56619fe --- /dev/null +++ b/changelog.d/al-ccap.added.md @@ -0,0 +1 @@ +Added Alabama Child Care Assistance Program (CCAP). From b6246b83906af89ca460829ae13d2721b990af9f Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 14 May 2026 23:40:09 -0400 Subject: [PATCH 3/5] Implement Alabama Child Care Subsidy Program (CCSP) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #8321 - 16 parameter files including 486-cell rate matrix (provider × region × age × STAR tier) - 16 variables covering eligibility (180% FPL initial / 200% FPL continuing / 85% SMI cap), triple-test income, dual-tier copay table, multi-dimensional rate lookup, and waiver paths - 14 test YAML files (103 cases) covering unit + integration + edge cases - Registered in programs.yaml and federal CCDF child_care_subsidy_programs.yaml Co-Authored-By: Claude Opus 4.7 (1M context) --- changelog.d/al-ccap.added.md | 2 +- .../hhs/ccdf/child_care_subsidy_programs.yaml | 1 + .../al/dhr/ccsp/age_category/months.yaml | 30 + .../dhr/ccsp/copay/continuing_fee_by_fpl.yaml | 25 + .../al/dhr/ccsp/copay/initial_fee_by_fpl.yaml | 51 + .../eligibility/activity_hours_minimum.yaml | 11 + .../dhr/ccsp/eligibility/child_age_limit.yaml | 11 + .../eligibility/disabled_child_age_limit.yaml | 11 + .../income_limit_fpl_continuing.yaml | 13 + .../eligibility/income_limit_fpl_initial.yaml | 13 + .../eligibility/income_limit_smi_cap.yaml | 15 + .../ccsp/income/countable_income/sources.yaml | 33 + .../al/dhr/ccsp/income/weeks_to_months.yaml | 11 + .../ccsp/rates/full_time_hours_threshold.yaml | 11 + .../dhr/ccsp/rates/informal_weekly_cap.yaml | 11 + .../ccsp/rates/maximum_weekly_full_time.yaml | 1100 +++++++++++++++++ .../dhr/ccsp/rates/part_time_multiplier.yaml | 11 + .../states/al/dhr/ccsp/region/counties.yaml | 97 ++ policyengine_us/programs.yaml | 8 +- .../gov/states/al/dhr/ccsp/al_ccsp.yaml | 156 +++ .../dhr/ccsp/al_ccsp_activity_eligible.yaml | 210 ++++ .../al/dhr/ccsp/al_ccsp_age_category.yaml | 80 ++ .../gov/states/al/dhr/ccsp/al_ccsp_copay.yaml | 337 +++++ .../al/dhr/ccsp/al_ccsp_countable_income.yaml | 128 ++ .../states/al/dhr/ccsp/al_ccsp_eligible.yaml | 293 +++++ .../al/dhr/ccsp/al_ccsp_eligible_child.yaml | 215 ++++ .../al/dhr/ccsp/al_ccsp_income_eligible.yaml | 165 +++ .../dhr/ccsp/al_ccsp_maximum_weekly_rate.yaml | 203 +++ .../dhr/ccsp/al_ccsp_protective_services.yaml | 71 ++ .../states/al/dhr/ccsp/al_ccsp_region.yaml | 128 ++ .../al/dhr/ccsp/al_child_care_subsidies.yaml | 69 ++ .../gov/states/al/dhr/ccsp/edge_cases.yaml | 442 +++++++ .../gov/states/al/dhr/ccsp/integration.yaml | 436 +++++++ .../gov/states/al/dhr/ccsp/al_ccsp.py | 65 + .../al/dhr/ccsp/al_ccsp_age_category.py | 27 + .../al/dhr/ccsp/al_ccsp_countable_income.py | 16 + .../states/al/dhr/ccsp/al_ccsp_enrolled.py | 13 + .../al/dhr/ccsp/al_ccsp_provider_type.py | 22 + .../al/dhr/ccsp/al_ccsp_quality_tier.py | 24 + .../gov/states/al/dhr/ccsp/al_ccsp_region.py | 61 + .../al/dhr/ccsp/al_child_care_subsidies.py | 11 + .../states/al/dhr/ccsp/copay/al_ccsp_copay.py | 53 + .../copay/al_ccsp_weekly_copay_per_child.py | 30 + .../eligibility/al_ccsp_activity_eligible.py | 28 + .../dhr/ccsp/eligibility/al_ccsp_eligible.py | 32 + .../eligibility/al_ccsp_eligible_child.py | 28 + .../eligibility/al_ccsp_income_eligible.py | 35 + .../al_ccsp_protective_services.py | 22 + .../payment/al_ccsp_maximum_weekly_rate.py | 57 + 49 files changed, 4920 insertions(+), 2 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/al/dhr/ccsp/age_category/months.yaml create mode 100644 policyengine_us/parameters/gov/states/al/dhr/ccsp/copay/continuing_fee_by_fpl.yaml create mode 100644 policyengine_us/parameters/gov/states/al/dhr/ccsp/copay/initial_fee_by_fpl.yaml create mode 100644 policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/activity_hours_minimum.yaml create mode 100644 policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/child_age_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/disabled_child_age_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/income_limit_fpl_continuing.yaml create mode 100644 policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/income_limit_fpl_initial.yaml create mode 100644 policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/income_limit_smi_cap.yaml create mode 100644 policyengine_us/parameters/gov/states/al/dhr/ccsp/income/countable_income/sources.yaml create mode 100644 policyengine_us/parameters/gov/states/al/dhr/ccsp/income/weeks_to_months.yaml create mode 100644 policyengine_us/parameters/gov/states/al/dhr/ccsp/rates/full_time_hours_threshold.yaml create mode 100644 policyengine_us/parameters/gov/states/al/dhr/ccsp/rates/informal_weekly_cap.yaml create mode 100644 policyengine_us/parameters/gov/states/al/dhr/ccsp/rates/maximum_weekly_full_time.yaml create mode 100644 policyengine_us/parameters/gov/states/al/dhr/ccsp/rates/part_time_multiplier.yaml create mode 100644 policyengine_us/parameters/gov/states/al/dhr/ccsp/region/counties.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_activity_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_age_category.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_copay.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_countable_income.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_eligible_child.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_income_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_maximum_weekly_rate.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_protective_services.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_region.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_child_care_subsidies.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/edge_cases.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/integration.yaml create mode 100644 policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp.py create mode 100644 policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_age_category.py create mode 100644 policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_countable_income.py create mode 100644 policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_enrolled.py create mode 100644 policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_provider_type.py create mode 100644 policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_quality_tier.py create mode 100644 policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_region.py create mode 100644 policyengine_us/variables/gov/states/al/dhr/ccsp/al_child_care_subsidies.py create mode 100644 policyengine_us/variables/gov/states/al/dhr/ccsp/copay/al_ccsp_copay.py create mode 100644 policyengine_us/variables/gov/states/al/dhr/ccsp/copay/al_ccsp_weekly_copay_per_child.py create mode 100644 policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_activity_eligible.py create mode 100644 policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_eligible.py create mode 100644 policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_eligible_child.py create mode 100644 policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_income_eligible.py create mode 100644 policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_protective_services.py create mode 100644 policyengine_us/variables/gov/states/al/dhr/ccsp/payment/al_ccsp_maximum_weekly_rate.py diff --git a/changelog.d/al-ccap.added.md b/changelog.d/al-ccap.added.md index 0f3a56619fe..ed6369b8bac 100644 --- a/changelog.d/al-ccap.added.md +++ b/changelog.d/al-ccap.added.md @@ -1 +1 @@ -Added Alabama Child Care Assistance Program (CCAP). +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 89dc3c0bef2..0a7bc3e02d8 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 @@ -1,6 +1,7 @@ description: The federal government counts these state programs as child care subsidies. values: 2021-01-01: + - 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/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..11b891b8e35 --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/age_category/months.yaml @@ -0,0 +1,30 @@ +description: Alabama assigns a Child Care Subsidy Program age category from the child's age in months. +# 0 = INFANT_TODDLER (birth to 36 months) +# 1 = PRESCHOOL (36 months to 5 years) +# 2 = SCHOOL_AGE (5 years and older) + +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://www.alacourt.gov/docs/ALDayCareRates.pdf + - title: Alabama CCDF State Plan 2025-2027, Section 2.2 + href: https://dhr.alabama.gov/wp-content/uploads/2023/04/2025-2027-CCDF-State-Plan-with-Approval-Letter.pdf#page=20 + +brackets: + - threshold: + 2024-01-01: 0 + amount: + 2024-01-01: 0 + - threshold: + 2024-01-01: 36 + amount: + 2024-01-01: 1 + - threshold: + 2024-01-01: 60 + amount: + 2024-01-01: 2 diff --git a/policyengine_us/parameters/gov/states/al/dhr/ccsp/copay/continuing_fee_by_fpl.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/copay/continuing_fee_by_fpl.yaml new file mode 100644 index 00000000000..6e8c260b328 --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/copay/continuing_fee_by_fpl.yaml @@ -0,0 +1,25 @@ +description: Alabama sets this weekly per-child fee for continuing-eligibility families 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 continuing weekly per-child fee by FPL ratio + reference: + - title: Alabama Child Care Fact Sheet (Continuing Eligibility Monthly Income Scale) + href: https://dhr.alabama.gov/wp-content/uploads/2024/01/Child-Care-Fact-Sheet-2024.pdf + +brackets: + - threshold: + 2024-01-01: 0 + amount: + 2024-01-01: 0 + - 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/copay/initial_fee_by_fpl.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/copay/initial_fee_by_fpl.yaml new file mode 100644 index 00000000000..7fb604406f0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/copay/initial_fee_by_fpl.yaml @@ -0,0 +1,51 @@ +description: Alabama sets this weekly per-child fee for initially-eligible families 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 initial weekly per-child fee by FPL ratio + reference: + - title: Alabama Child Care Fact Sheet (Initial 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.2.1 + href: https://dhr.alabama.gov/wp-content/uploads/2023/04/2025-2027-CCDF-State-Plan-with-Approval-Letter.pdf#page=42 + +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 diff --git a/policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/activity_hours_minimum.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/activity_hours_minimum.yaml new file mode 100644 index 00000000000..16652aa50dd --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/activity_hours_minimum.yaml @@ -0,0 +1,11 @@ +description: Alabama requires at least this many combined weekly hours of work, training, or education for Child Care Subsidy Program activity eligibility. +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=21 diff --git a/policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/child_age_limit.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/child_age_limit.yaml new file mode 100644 index 00000000000..8c503c8d7b7 --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/child_age_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 / 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/eligibility/disabled_child_age_limit.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/disabled_child_age_limit.yaml new file mode 100644 index 00000000000..4d4e3a6b755 --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/disabled_child_age_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/eligibility/income_limit_fpl_continuing.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/income_limit_fpl_continuing.yaml new file mode 100644 index 00000000000..1e3991d0323 --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/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.2.4 + 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/eligibility/income_limit_fpl_initial.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/income_limit_fpl_initial.yaml new file mode 100644 index 00000000000..a2483a72586 --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/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=24 + - 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/eligibility/income_limit_smi_cap.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/income_limit_smi_cap.yaml new file mode 100644 index 00000000000..78ea014150e --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/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=24 + - title: Alabama CCDF State Plan 2025-2027, Section 2.5.2 + href: https://dhr.alabama.gov/wp-content/uploads/2023/04/2025-2027-CCDF-State-Plan-with-Approval-Letter.pdf#page=35 + - 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/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..dcfe85c4518 --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/income/countable_income/sources.yaml @@ -0,0 +1,33 @@ +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 is excluded from the adds list to break a CCSP <-> TANF + # circular dependency through childcare_expenses. Operationally, + # families enrolled in TANF rarely reach the CCSP income test + # because TANF payment standards fall well below 180% FPL. + # - tanf + # 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/weeks_to_months.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/income/weeks_to_months.yaml new file mode 100644 index 00000000000..d0433f2a2b8 --- /dev/null +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/income/weeks_to_months.yaml @@ -0,0 +1,11 @@ +description: Alabama multiplies weekly amounts by this factor to convert to monthly amounts under the Child Care Subsidy Program. +values: + 2024-01-01: 4.333 + +metadata: + unit: /1 + period: year + label: Alabama CCSP weekly-to-monthly conversion factor + reference: + - title: Alabama Child Care Fact Sheet (weekly gross income multiplied by 4.333) + 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..c22a355d3e9 --- /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: + 2024-01-01: 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://www.alacourt.gov/docs/ALDayCareRates.pdf 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..44271c98a2a --- /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: + 2024-01-01: 40 + +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://www.alacourt.gov/docs/ALDayCareRates.pdf 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..1c69c12cbf1 --- /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://www.alacourt.gov/docs/ALDayCareRates.pdf + +CENTER: + HUNTSVILLE: + INFANT_TODDLER: + BASE: + 2024-01-01: 138 + STAR_1: + 2024-01-01: 141 + STAR_2: + 2024-01-01: 144 + STAR_3: + 2024-01-01: 146 + STAR_4: + 2024-01-01: 149 + STAR_5: + 2024-01-01: 152 + PRESCHOOL: + BASE: + 2024-01-01: 125 + STAR_1: + 2024-01-01: 128 + STAR_2: + 2024-01-01: 130 + STAR_3: + 2024-01-01: 133 + STAR_4: + 2024-01-01: 135 + STAR_5: + 2024-01-01: 138 + SCHOOL_AGE: + BASE: + 2024-01-01: 105 + STAR_1: + 2024-01-01: 107 + STAR_2: + 2024-01-01: 109 + STAR_3: + 2024-01-01: 111 + STAR_4: + 2024-01-01: 114 + STAR_5: + 2024-01-01: 116 + TUSCALOOSA: + INFANT_TODDLER: + BASE: + 2024-01-01: 125 + STAR_1: + 2024-01-01: 128 + STAR_2: + 2024-01-01: 130 + STAR_3: + 2024-01-01: 133 + STAR_4: + 2024-01-01: 135 + STAR_5: + 2024-01-01: 138 + PRESCHOOL: + BASE: + 2024-01-01: 120 + STAR_1: + 2024-01-01: 122 + STAR_2: + 2024-01-01: 125 + STAR_3: + 2024-01-01: 127 + STAR_4: + 2024-01-01: 130 + STAR_5: + 2024-01-01: 132 + SCHOOL_AGE: + BASE: + 2024-01-01: 115 + STAR_1: + 2024-01-01: 117 + STAR_2: + 2024-01-01: 120 + STAR_3: + 2024-01-01: 122 + STAR_4: + 2024-01-01: 124 + STAR_5: + 2024-01-01: 127 + MOBILE: + INFANT_TODDLER: + BASE: + 2024-01-01: 125 + STAR_1: + 2024-01-01: 128 + STAR_2: + 2024-01-01: 130 + STAR_3: + 2024-01-01: 133 + STAR_4: + 2024-01-01: 135 + STAR_5: + 2024-01-01: 138 + PRESCHOOL: + BASE: + 2024-01-01: 117 + STAR_1: + 2024-01-01: 119 + STAR_2: + 2024-01-01: 122 + STAR_3: + 2024-01-01: 124 + STAR_4: + 2024-01-01: 127 + STAR_5: + 2024-01-01: 129 + SCHOOL_AGE: + BASE: + 2024-01-01: 110 + STAR_1: + 2024-01-01: 112 + STAR_2: + 2024-01-01: 114 + STAR_3: + 2024-01-01: 117 + STAR_4: + 2024-01-01: 119 + STAR_5: + 2024-01-01: 121 + FT_PAYNE: + INFANT_TODDLER: + BASE: + 2024-01-01: 112 + STAR_1: + 2024-01-01: 114 + STAR_2: + 2024-01-01: 117 + STAR_3: + 2024-01-01: 119 + STAR_4: + 2024-01-01: 121 + STAR_5: + 2024-01-01: 124 + PRESCHOOL: + BASE: + 2024-01-01: 105 + STAR_1: + 2024-01-01: 107 + STAR_2: + 2024-01-01: 109 + STAR_3: + 2024-01-01: 111 + STAR_4: + 2024-01-01: 114 + STAR_5: + 2024-01-01: 116 + SCHOOL_AGE: + BASE: + 2024-01-01: 97 + STAR_1: + 2024-01-01: 99 + STAR_2: + 2024-01-01: 101 + STAR_3: + 2024-01-01: 103 + STAR_4: + 2024-01-01: 105 + STAR_5: + 2024-01-01: 107 + BIRMINGHAM: + INFANT_TODDLER: + BASE: + 2024-01-01: 150 + STAR_1: + 2024-01-01: 153 + STAR_2: + 2024-01-01: 156 + STAR_3: + 2024-01-01: 159 + STAR_4: + 2024-01-01: 162 + STAR_5: + 2024-01-01: 166 + PRESCHOOL: + BASE: + 2024-01-01: 138 + STAR_1: + 2024-01-01: 141 + STAR_2: + 2024-01-01: 144 + STAR_3: + 2024-01-01: 146 + STAR_4: + 2024-01-01: 149 + STAR_5: + 2024-01-01: 152 + SCHOOL_AGE: + BASE: + 2024-01-01: 115 + STAR_1: + 2024-01-01: 117 + STAR_2: + 2024-01-01: 120 + STAR_3: + 2024-01-01: 122 + STAR_4: + 2024-01-01: 124 + STAR_5: + 2024-01-01: 127 + TALLADEGA: + INFANT_TODDLER: + BASE: + 2024-01-01: 111 + STAR_1: + 2024-01-01: 113 + STAR_2: + 2024-01-01: 115 + STAR_3: + 2024-01-01: 118 + STAR_4: + 2024-01-01: 120 + STAR_5: + 2024-01-01: 123 + PRESCHOOL: + BASE: + 2024-01-01: 111 + STAR_1: + 2024-01-01: 113 + STAR_2: + 2024-01-01: 115 + STAR_3: + 2024-01-01: 118 + STAR_4: + 2024-01-01: 120 + STAR_5: + 2024-01-01: 123 + SCHOOL_AGE: + BASE: + 2024-01-01: 93 + STAR_1: + 2024-01-01: 95 + STAR_2: + 2024-01-01: 97 + STAR_3: + 2024-01-01: 99 + STAR_4: + 2024-01-01: 101 + STAR_5: + 2024-01-01: 103 + MONTGOMERY: + INFANT_TODDLER: + BASE: + 2024-01-01: 131 + STAR_1: + 2024-01-01: 134 + STAR_2: + 2024-01-01: 136 + STAR_3: + 2024-01-01: 139 + STAR_4: + 2024-01-01: 142 + STAR_5: + 2024-01-01: 145 + PRESCHOOL: + BASE: + 2024-01-01: 115 + STAR_1: + 2024-01-01: 117 + STAR_2: + 2024-01-01: 120 + STAR_3: + 2024-01-01: 122 + STAR_4: + 2024-01-01: 124 + STAR_5: + 2024-01-01: 127 + SCHOOL_AGE: + BASE: + 2024-01-01: 116 + STAR_1: + 2024-01-01: 118 + STAR_2: + 2024-01-01: 121 + STAR_3: + 2024-01-01: 123 + STAR_4: + 2024-01-01: 126 + STAR_5: + 2024-01-01: 128 + DOTHAN: + INFANT_TODDLER: + BASE: + 2024-01-01: 107 + STAR_1: + 2024-01-01: 109 + STAR_2: + 2024-01-01: 111 + STAR_3: + 2024-01-01: 114 + STAR_4: + 2024-01-01: 116 + STAR_5: + 2024-01-01: 118 + PRESCHOOL: + BASE: + 2024-01-01: 102 + STAR_1: + 2024-01-01: 104 + STAR_2: + 2024-01-01: 106 + STAR_3: + 2024-01-01: 108 + STAR_4: + 2024-01-01: 110 + STAR_5: + 2024-01-01: 113 + SCHOOL_AGE: + BASE: + 2024-01-01: 95 + STAR_1: + 2024-01-01: 97 + STAR_2: + 2024-01-01: 99 + STAR_3: + 2024-01-01: 101 + STAR_4: + 2024-01-01: 103 + STAR_5: + 2024-01-01: 105 + OPELIKA: + INFANT_TODDLER: + BASE: + 2024-01-01: 132 + STAR_1: + 2024-01-01: 135 + STAR_2: + 2024-01-01: 137 + STAR_3: + 2024-01-01: 140 + STAR_4: + 2024-01-01: 143 + STAR_5: + 2024-01-01: 146 + PRESCHOOL: + BASE: + 2024-01-01: 120 + STAR_1: + 2024-01-01: 122 + STAR_2: + 2024-01-01: 125 + STAR_3: + 2024-01-01: 127 + STAR_4: + 2024-01-01: 130 + STAR_5: + 2024-01-01: 132 + SCHOOL_AGE: + BASE: + 2024-01-01: 109 + STAR_1: + 2024-01-01: 111 + STAR_2: + 2024-01-01: 113 + STAR_3: + 2024-01-01: 116 + STAR_4: + 2024-01-01: 118 + STAR_5: + 2024-01-01: 120 + +GFDC: + HUNTSVILLE: + INFANT_TODDLER: + BASE: + 2024-01-01: 132 + STAR_1: + 2024-01-01: 135 + STAR_2: + 2024-01-01: 137 + STAR_3: + 2024-01-01: 140 + STAR_4: + 2024-01-01: 143 + STAR_5: + 2024-01-01: 146 + PRESCHOOL: + BASE: + 2024-01-01: 125 + STAR_1: + 2024-01-01: 128 + STAR_2: + 2024-01-01: 130 + STAR_3: + 2024-01-01: 133 + STAR_4: + 2024-01-01: 135 + STAR_5: + 2024-01-01: 138 + SCHOOL_AGE: + BASE: + 2024-01-01: 124 + STAR_1: + 2024-01-01: 126 + STAR_2: + 2024-01-01: 129 + STAR_3: + 2024-01-01: 132 + STAR_4: + 2024-01-01: 134 + STAR_5: + 2024-01-01: 137 + TUSCALOOSA: + INFANT_TODDLER: + BASE: + 2024-01-01: 91 + STAR_1: + 2024-01-01: 93 + STAR_2: + 2024-01-01: 95 + STAR_3: + 2024-01-01: 97 + STAR_4: + 2024-01-01: 99 + STAR_5: + 2024-01-01: 100 + PRESCHOOL: + BASE: + 2024-01-01: 93 + STAR_1: + 2024-01-01: 95 + STAR_2: + 2024-01-01: 97 + STAR_3: + 2024-01-01: 99 + STAR_4: + 2024-01-01: 101 + STAR_5: + 2024-01-01: 103 + SCHOOL_AGE: + BASE: + 2024-01-01: 93 + STAR_1: + 2024-01-01: 95 + STAR_2: + 2024-01-01: 97 + STAR_3: + 2024-01-01: 99 + STAR_4: + 2024-01-01: 101 + STAR_5: + 2024-01-01: 103 + MOBILE: + INFANT_TODDLER: + BASE: + 2024-01-01: 122 + STAR_1: + 2024-01-01: 124 + STAR_2: + 2024-01-01: 127 + STAR_3: + 2024-01-01: 129 + STAR_4: + 2024-01-01: 132 + STAR_5: + 2024-01-01: 135 + PRESCHOOL: + BASE: + 2024-01-01: 123 + STAR_1: + 2024-01-01: 125 + STAR_2: + 2024-01-01: 128 + STAR_3: + 2024-01-01: 131 + STAR_4: + 2024-01-01: 133 + STAR_5: + 2024-01-01: 136 + SCHOOL_AGE: + BASE: + 2024-01-01: 111 + STAR_1: + 2024-01-01: 113 + STAR_2: + 2024-01-01: 115 + STAR_3: + 2024-01-01: 118 + STAR_4: + 2024-01-01: 120 + STAR_5: + 2024-01-01: 123 + FT_PAYNE: + INFANT_TODDLER: + BASE: + 2024-01-01: 85 + STAR_1: + 2024-01-01: 87 + STAR_2: + 2024-01-01: 88 + STAR_3: + 2024-01-01: 90 + STAR_4: + 2024-01-01: 92 + STAR_5: + 2024-01-01: 94 + PRESCHOOL: + BASE: + 2024-01-01: 85 + STAR_1: + 2024-01-01: 87 + STAR_2: + 2024-01-01: 88 + STAR_3: + 2024-01-01: 90 + STAR_4: + 2024-01-01: 92 + STAR_5: + 2024-01-01: 94 + SCHOOL_AGE: + BASE: + 2024-01-01: 88 + STAR_1: + 2024-01-01: 90 + STAR_2: + 2024-01-01: 92 + STAR_3: + 2024-01-01: 93 + STAR_4: + 2024-01-01: 95 + STAR_5: + 2024-01-01: 97 + BIRMINGHAM: + INFANT_TODDLER: + BASE: + 2024-01-01: 125 + STAR_1: + 2024-01-01: 128 + STAR_2: + 2024-01-01: 130 + STAR_3: + 2024-01-01: 133 + STAR_4: + 2024-01-01: 135 + STAR_5: + 2024-01-01: 138 + PRESCHOOL: + BASE: + 2024-01-01: 125 + STAR_1: + 2024-01-01: 128 + STAR_2: + 2024-01-01: 130 + STAR_3: + 2024-01-01: 133 + STAR_4: + 2024-01-01: 135 + STAR_5: + 2024-01-01: 138 + SCHOOL_AGE: + BASE: + 2024-01-01: 125 + STAR_1: + 2024-01-01: 128 + STAR_2: + 2024-01-01: 130 + STAR_3: + 2024-01-01: 133 + STAR_4: + 2024-01-01: 135 + STAR_5: + 2024-01-01: 138 + TALLADEGA: + INFANT_TODDLER: + BASE: + 2024-01-01: 100 + STAR_1: + 2024-01-01: 102 + STAR_2: + 2024-01-01: 104 + STAR_3: + 2024-01-01: 106 + STAR_4: + 2024-01-01: 108 + STAR_5: + 2024-01-01: 110 + PRESCHOOL: + BASE: + 2024-01-01: 100 + STAR_1: + 2024-01-01: 102 + STAR_2: + 2024-01-01: 104 + STAR_3: + 2024-01-01: 106 + STAR_4: + 2024-01-01: 108 + STAR_5: + 2024-01-01: 110 + SCHOOL_AGE: + BASE: + 2024-01-01: 100 + STAR_1: + 2024-01-01: 102 + STAR_2: + 2024-01-01: 104 + STAR_3: + 2024-01-01: 106 + STAR_4: + 2024-01-01: 108 + STAR_5: + 2024-01-01: 110 + MONTGOMERY: + INFANT_TODDLER: + BASE: + 2024-01-01: 95 + STAR_1: + 2024-01-01: 97 + STAR_2: + 2024-01-01: 99 + STAR_3: + 2024-01-01: 101 + STAR_4: + 2024-01-01: 103 + STAR_5: + 2024-01-01: 105 + PRESCHOOL: + BASE: + 2024-01-01: 95 + STAR_1: + 2024-01-01: 97 + STAR_2: + 2024-01-01: 99 + STAR_3: + 2024-01-01: 101 + STAR_4: + 2024-01-01: 103 + STAR_5: + 2024-01-01: 105 + SCHOOL_AGE: + BASE: + 2024-01-01: 95 + STAR_1: + 2024-01-01: 97 + STAR_2: + 2024-01-01: 99 + STAR_3: + 2024-01-01: 101 + STAR_4: + 2024-01-01: 103 + STAR_5: + 2024-01-01: 105 + DOTHAN: + INFANT_TODDLER: + BASE: + 2024-01-01: 100 + STAR_1: + 2024-01-01: 102 + STAR_2: + 2024-01-01: 104 + STAR_3: + 2024-01-01: 106 + STAR_4: + 2024-01-01: 108 + STAR_5: + 2024-01-01: 110 + PRESCHOOL: + BASE: + 2024-01-01: 100 + STAR_1: + 2024-01-01: 102 + STAR_2: + 2024-01-01: 104 + STAR_3: + 2024-01-01: 106 + STAR_4: + 2024-01-01: 108 + STAR_5: + 2024-01-01: 110 + SCHOOL_AGE: + BASE: + 2024-01-01: 100 + STAR_1: + 2024-01-01: 102 + STAR_2: + 2024-01-01: 104 + STAR_3: + 2024-01-01: 106 + STAR_4: + 2024-01-01: 108 + STAR_5: + 2024-01-01: 110 + OPELIKA: + INFANT_TODDLER: + BASE: + 2024-01-01: 128 + STAR_1: + 2024-01-01: 131 + STAR_2: + 2024-01-01: 133 + STAR_3: + 2024-01-01: 136 + STAR_4: + 2024-01-01: 139 + STAR_5: + 2024-01-01: 141 + PRESCHOOL: + BASE: + 2024-01-01: 123 + STAR_1: + 2024-01-01: 125 + STAR_2: + 2024-01-01: 128 + STAR_3: + 2024-01-01: 131 + STAR_4: + 2024-01-01: 133 + STAR_5: + 2024-01-01: 136 + SCHOOL_AGE: + BASE: + 2024-01-01: 115 + STAR_1: + 2024-01-01: 117 + STAR_2: + 2024-01-01: 120 + STAR_3: + 2024-01-01: 122 + STAR_4: + 2024-01-01: 124 + STAR_5: + 2024-01-01: 127 + +FDC: + HUNTSVILLE: + INFANT_TODDLER: + BASE: + 2024-01-01: 135 + STAR_1: + 2024-01-01: 138 + STAR_2: + 2024-01-01: 140 + STAR_3: + 2024-01-01: 143 + STAR_4: + 2024-01-01: 146 + STAR_5: + 2024-01-01: 149 + PRESCHOOL: + BASE: + 2024-01-01: 131 + STAR_1: + 2024-01-01: 134 + STAR_2: + 2024-01-01: 136 + STAR_3: + 2024-01-01: 139 + STAR_4: + 2024-01-01: 142 + STAR_5: + 2024-01-01: 145 + SCHOOL_AGE: + BASE: + 2024-01-01: 130 + STAR_1: + 2024-01-01: 133 + STAR_2: + 2024-01-01: 135 + STAR_3: + 2024-01-01: 138 + STAR_4: + 2024-01-01: 141 + STAR_5: + 2024-01-01: 144 + TUSCALOOSA: + INFANT_TODDLER: + BASE: + 2024-01-01: 105 + STAR_1: + 2024-01-01: 107 + STAR_2: + 2024-01-01: 109 + STAR_3: + 2024-01-01: 111 + STAR_4: + 2024-01-01: 114 + STAR_5: + 2024-01-01: 116 + PRESCHOOL: + BASE: + 2024-01-01: 100 + STAR_1: + 2024-01-01: 102 + STAR_2: + 2024-01-01: 104 + STAR_3: + 2024-01-01: 106 + STAR_4: + 2024-01-01: 108 + STAR_5: + 2024-01-01: 110 + SCHOOL_AGE: + BASE: + 2024-01-01: 100 + STAR_1: + 2024-01-01: 102 + STAR_2: + 2024-01-01: 104 + STAR_3: + 2024-01-01: 106 + STAR_4: + 2024-01-01: 108 + STAR_5: + 2024-01-01: 110 + MOBILE: + INFANT_TODDLER: + BASE: + 2024-01-01: 125 + STAR_1: + 2024-01-01: 128 + STAR_2: + 2024-01-01: 130 + STAR_3: + 2024-01-01: 133 + STAR_4: + 2024-01-01: 135 + STAR_5: + 2024-01-01: 138 + PRESCHOOL: + BASE: + 2024-01-01: 125 + STAR_1: + 2024-01-01: 128 + STAR_2: + 2024-01-01: 130 + STAR_3: + 2024-01-01: 133 + STAR_4: + 2024-01-01: 135 + STAR_5: + 2024-01-01: 138 + SCHOOL_AGE: + BASE: + 2024-01-01: 125 + STAR_1: + 2024-01-01: 128 + STAR_2: + 2024-01-01: 130 + STAR_3: + 2024-01-01: 133 + STAR_4: + 2024-01-01: 135 + STAR_5: + 2024-01-01: 138 + FT_PAYNE: + INFANT_TODDLER: + BASE: + 2024-01-01: 81 + STAR_1: + 2024-01-01: 83 + STAR_2: + 2024-01-01: 84 + STAR_3: + 2024-01-01: 86 + STAR_4: + 2024-01-01: 88 + STAR_5: + 2024-01-01: 89 + PRESCHOOL: + BASE: + 2024-01-01: 75 + STAR_1: + 2024-01-01: 77 + STAR_2: + 2024-01-01: 78 + STAR_3: + 2024-01-01: 80 + STAR_4: + 2024-01-01: 81 + STAR_5: + 2024-01-01: 83 + SCHOOL_AGE: + BASE: + 2024-01-01: 75 + STAR_1: + 2024-01-01: 77 + STAR_2: + 2024-01-01: 78 + STAR_3: + 2024-01-01: 80 + STAR_4: + 2024-01-01: 81 + STAR_5: + 2024-01-01: 83 + BIRMINGHAM: + INFANT_TODDLER: + BASE: + 2024-01-01: 125 + STAR_1: + 2024-01-01: 128 + STAR_2: + 2024-01-01: 130 + STAR_3: + 2024-01-01: 133 + STAR_4: + 2024-01-01: 135 + STAR_5: + 2024-01-01: 138 + PRESCHOOL: + BASE: + 2024-01-01: 120 + STAR_1: + 2024-01-01: 122 + STAR_2: + 2024-01-01: 125 + STAR_3: + 2024-01-01: 127 + STAR_4: + 2024-01-01: 130 + STAR_5: + 2024-01-01: 132 + SCHOOL_AGE: + BASE: + 2024-01-01: 110 + STAR_1: + 2024-01-01: 112 + STAR_2: + 2024-01-01: 114 + STAR_3: + 2024-01-01: 117 + STAR_4: + 2024-01-01: 119 + STAR_5: + 2024-01-01: 121 + TALLADEGA: + INFANT_TODDLER: + BASE: + 2024-01-01: 98 + STAR_1: + 2024-01-01: 100 + STAR_2: + 2024-01-01: 102 + STAR_3: + 2024-01-01: 104 + STAR_4: + 2024-01-01: 106 + STAR_5: + 2024-01-01: 108 + PRESCHOOL: + BASE: + 2024-01-01: 99 + STAR_1: + 2024-01-01: 101 + STAR_2: + 2024-01-01: 103 + STAR_3: + 2024-01-01: 105 + STAR_4: + 2024-01-01: 107 + STAR_5: + 2024-01-01: 109 + SCHOOL_AGE: + BASE: + 2024-01-01: 90 + STAR_1: + 2024-01-01: 92 + STAR_2: + 2024-01-01: 94 + STAR_3: + 2024-01-01: 96 + STAR_4: + 2024-01-01: 97 + STAR_5: + 2024-01-01: 99 + MONTGOMERY: + INFANT_TODDLER: + BASE: + 2024-01-01: 122 + STAR_1: + 2024-01-01: 124 + STAR_2: + 2024-01-01: 127 + STAR_3: + 2024-01-01: 129 + STAR_4: + 2024-01-01: 132 + STAR_5: + 2024-01-01: 135 + PRESCHOOL: + BASE: + 2024-01-01: 115 + STAR_1: + 2024-01-01: 117 + STAR_2: + 2024-01-01: 120 + STAR_3: + 2024-01-01: 122 + STAR_4: + 2024-01-01: 124 + STAR_5: + 2024-01-01: 127 + SCHOOL_AGE: + BASE: + 2024-01-01: 115 + STAR_1: + 2024-01-01: 117 + STAR_2: + 2024-01-01: 120 + STAR_3: + 2024-01-01: 122 + STAR_4: + 2024-01-01: 124 + STAR_5: + 2024-01-01: 127 + DOTHAN: + INFANT_TODDLER: + BASE: + 2024-01-01: 90 + STAR_1: + 2024-01-01: 92 + STAR_2: + 2024-01-01: 94 + STAR_3: + 2024-01-01: 96 + STAR_4: + 2024-01-01: 97 + STAR_5: + 2024-01-01: 99 + PRESCHOOL: + BASE: + 2024-01-01: 90 + STAR_1: + 2024-01-01: 92 + STAR_2: + 2024-01-01: 94 + STAR_3: + 2024-01-01: 96 + STAR_4: + 2024-01-01: 97 + STAR_5: + 2024-01-01: 99 + SCHOOL_AGE: + BASE: + 2024-01-01: 85 + STAR_1: + 2024-01-01: 87 + STAR_2: + 2024-01-01: 88 + STAR_3: + 2024-01-01: 90 + STAR_4: + 2024-01-01: 92 + STAR_5: + 2024-01-01: 94 + OPELIKA: + INFANT_TODDLER: + BASE: + 2024-01-01: 134 + STAR_1: + 2024-01-01: 137 + STAR_2: + 2024-01-01: 139 + STAR_3: + 2024-01-01: 142 + STAR_4: + 2024-01-01: 145 + STAR_5: + 2024-01-01: 148 + PRESCHOOL: + BASE: + 2024-01-01: 129 + STAR_1: + 2024-01-01: 132 + STAR_2: + 2024-01-01: 134 + STAR_3: + 2024-01-01: 137 + STAR_4: + 2024-01-01: 140 + STAR_5: + 2024-01-01: 142 + SCHOOL_AGE: + BASE: + 2024-01-01: 125 + STAR_1: + 2024-01-01: 128 + STAR_2: + 2024-01-01: 130 + STAR_3: + 2024-01-01: 133 + STAR_4: + 2024-01-01: 135 + STAR_5: + 2024-01-01: 138 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..748264ddf19 --- /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: + 2024-01-01: 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://www.alacourt.gov/docs/ALDayCareRates.pdf 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..8a5df304fe4 --- /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://www.alacourt.gov/docs/ALDayCareRates.pdf + +HUNTSVILLE: + 2024-01-01: + - 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: + 2024-01-01: + - 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: + 2024-01-01: + - BALDWIN_COUNTY_AL + - CLARKE_COUNTY_AL + - CONECUH_COUNTY_AL + - ESCAMBIA_COUNTY_AL + - MOBILE_COUNTY_AL + - MONROE_COUNTY_AL + - WASHINGTON_COUNTY_AL +FT_PAYNE: + 2024-01-01: + - CHEROKEE_COUNTY_AL + - DEKALB_COUNTY_AL + - ETOWAH_COUNTY_AL + - JACKSON_COUNTY_AL + - MARSHALL_COUNTY_AL +BIRMINGHAM: + 2024-01-01: + - BLOUNT_COUNTY_AL + - JEFFERSON_COUNTY_AL + - ST_CLAIR_COUNTY_AL + - SHELBY_COUNTY_AL + - WALKER_COUNTY_AL +TALLADEGA: + 2024-01-01: + - CALHOUN_COUNTY_AL + - CLAY_COUNTY_AL + - CLEBURNE_COUNTY_AL + - COOSA_COUNTY_AL + - RANDOLPH_COUNTY_AL + - TALLADEGA_COUNTY_AL +MONTGOMERY: + 2024-01-01: + - 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: + 2024-01-01: + - 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: + 2024-01-01: + - 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 76b5377b5f3..5708b9facb2 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -460,8 +460,14 @@ programs: category: Benefits agency: HHS status: partial - coverage: CA, CO, CT, DE, DC, IL, MA, MD, ME, NC, NH, NJ, PA, RI, SC, TX, VA, VT, WV + coverage: AL, CA, CO, CT, DE, DC, IL, MA, MD, ME, NC, NH, NJ, PA, RI, SC, TX, VA, VT, WV state_implementations: + - state: AL + status: complete + 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..eecf23610c3 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp.yaml @@ -0,0 +1,156 @@ +# 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 * 4.333 * 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 # ~ 86% FPL 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 = $138/wk + # Weekly charge = 10,000 / 52 = $192.31 + # min($192.31, $138) = $138 + # copay = $0 + # weekly subsidy = $138 + # monthly subsidy = $138 * 4.333 = $597.95 + al_ccsp: 597.95 + +- name: Family at 150 percent FPL with copay. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 30_660 # 150% FPL fam of 2 = 2,555/mo + 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 = $138/wk + # weekly charge = 10,000 / 52 = $192.31; min(192.31, 138) = $138 + # copay = $30/wk; weekly subsidy = $138 - $30 = $108 + # monthly subsidy = $108 * 4.333 = $467.96 + al_ccsp: 467.96 + +- 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 = $138; min = $100; copay = $0 + # monthly subsidy = $100 * 4.333 = $433.30 + al_ccsp: 433.3 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..7c3e60d24dc --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_activity_eligible.yaml @@ -0,0 +1,210 @@ +# 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 is activity eligible (SC/VA convention). + period: 2024-01 + input: + 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: true + +- 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 disabled spouse is activity eligible (disabled-parent exemption). + period: 2024-01 + input: + 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: true 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..45eacf7c249 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_age_category.yaml @@ -0,0 +1,80 @@ +# AL CCSP age category tests (Person, MONTH, Enum) +# Bracket on age-in-months -> {INFANT_TODDLER (0-35mo), PRESCHOOL (36-59mo), SCHOOL_AGE (60mo+)}. + +- 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 is PRESCHOOL. + period: 2024-01 + input: + people: + person1: + age: 3 + households: + household: + members: [person1] + state_code: AL + output: + al_ccsp_age_category: PRESCHOOL + +- 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.yaml b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_copay.yaml new file mode 100644 index 00000000000..21ec415aed3 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_copay.yaml @@ -0,0 +1,337 @@ +# AL CCSP family copay tests (SPMUnit, MONTH, USD) +# Per-child weekly fee from FPL band, summed over eligible children, converted to monthly via 4.333. +# Waivers (zero copay): disabled child, Head Start enrollment, protective services (foster). +# Homelessness alone does NOT waive copay (per State Plan §3.3.1(iii)). +# +# 2024 FPG (Contiguous US): first $15,060, additional $5,380. +# FS 2: $20,440/yr ($1,703.33/mo) +# FS 4: $31,200/yr ($2,600/mo) +# Initial fee scale (effective 2024-01-01), weekly per child: +# 0-100% FPL -> $0 +# 101-110 -> $18 +# 111-120 -> $21 +# 121-130 -> $24 +# 131-140 -> $27 +# 141-150 -> $30 +# 151-160 -> $33 +# 161-170 -> $36 +# 171-180 -> $39 +# Continuing schedule: +# 181-190 -> $42 +# 191-200 -> $45 + +- name: Family at 80 percent FPL has zero copay (encoded in scale). + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 16_352 # 80% FPL fam of 2 = 16,352/yr -> 1,363/mo + 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: + # <= 100% FPL band -> $0/wk -> $0/mo + al_ccsp_copay: 0 + +- name: Family at 150 percent FPL with one child pays 30 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 30_660 # 150% FPL fam of 2 = 30,660/yr -> 2,555/mo + 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: + # 150% FPL -> 141-150 band -> $30/wk per child + # 1 child * $30/wk * 4.333 = $130.00/mo + al_ccsp_copay: 129.99 + +- name: Family at 175 percent FPL pays 39 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 35_770 # 175% FPL fam of 2 = 35,770/yr -> 2,981/mo + 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: + # 175% FPL -> 171-180 band -> $39/wk per child + # $39 * 4.333 = $168.99/mo + al_ccsp_copay: 168.99 + +- name: Continuing-tier family at 185 percent FPL pays 42 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 37_814 # 185% FPL fam of 2 = 37,814/yr -> 3,151/mo + 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] + al_ccsp_enrolled: true + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + # 185% FPL -> 181-190 continuing band -> $42/wk per child + # $42 * 4.333 = $181.99/mo + al_ccsp_copay: 181.99 + +- name: Continuing-tier family at 195 percent FPL pays 45 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 39_858 # 195% FPL fam of 2 = 39,858/yr -> 3,322/mo + 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] + al_ccsp_enrolled: true + households: + household: + members: [person1, person2] + state_code: AL + county_str: JEFFERSON_COUNTY_AL + output: + # 195% FPL -> 191-200 continuing band -> $45/wk per child + # $45 * 4.333 = $194.99/mo + al_ccsp_copay: 194.99 + +- name: Two eligible children at 150 percent FPL pay two times 30 per week. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 38_730 # 150% FPL fam of 3 = 38,730/yr -> 3,228/mo + 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 + 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 + 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 + county_str: JEFFERSON_COUNTY_AL + output: + # 150% FPL -> $30/wk per child + # 2 children * $30 * 4.333 = $259.98/mo + al_ccsp_copay: 259.98 + +- name: Family with disabled child has zero copay. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 35_000 # would otherwise be paid tier + 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 + 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_copay: 0 + +- name: Head Start enrollment waives copay. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 35_000 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + is_enrolled_in_head_start: true + 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: + al_ccsp_copay: 0 + +- name: Foster care waives copay. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 35 + employment_income: 35_000 + 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 + 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_copay: 0 + +- name: Homeless household alone does NOT waive copay. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 30_660 # 150% FPL fam of 2 + 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 + is_homeless: true + output: + # Homelessness alone is NOT a copay waiver in AL. + # Fee is still owed: 150% FPL -> $30/wk -> $30 * 4.333 = $130.00/mo + al_ccsp_copay: 129.99 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..2cbc2e6f510 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_eligible_child.yaml @@ -0,0 +1,215 @@ +# AL CCSP eligible child tests (Person, MONTH) +# Combines: child_age_limit (<13) or disabled_child_age_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 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] 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..9df89ae0bed --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_income_eligible.yaml @@ -0,0 +1,165 @@ +# 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. +# +# 2024 FPG (Contiguous US): first_person $15,060, additional $5,380. +# Family of 2: $20,440/yr ($1,703.33/mo) +# Family of 3: $25,820/yr ($2,151.67/mo) +# Family of 4: $31,200/yr ($2,600/mo) +# 180% FPL (FS 3): $46,476/yr ($3,873/mo) +# 180% FPL (FS 4): $56,160/yr ($4,680/mo) +# 200% FPL (FS 4): $62,400/yr ($5,200/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: 46_800 # 150% FPL fam of 4 = 46,800/yr = 3,900/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,900/mo <= 4,680/mo (180% FPL) -> initial-eligible + # 3,900/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: 59_280 # 190% FPL fam of 4 = 59,280/yr = 4,940/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,940/mo > 4,680/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: 59_280 # 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,940/mo <= 5,200/mo (200% FPL) -> continuing-eligible + # 4,940/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: 65_000 # ~208% FPL fam of 4 = 5,417/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,417/mo > 5,200/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 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..72316d8f532 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_maximum_weekly_rate.yaml @@ -0,0 +1,203 @@ +# 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 $40/wk cap regardless of region/age/quality. +# defined_for: al_ccsp_eligible_child (Person, MONTH). + +- name: CENTER BIRMINGHAM PRESCHOOL STAR_3 full-time is 146 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, 146] + +- name: CENTER HUNTSVILLE INFANT_TODDLER BASE full-time is 138 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, 138] + +- name: GFDC HUNTSVILLE SCHOOL_AGE STAR_5 full-time is 137 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, 137] + +- name: FDC MOBILE INFANT_TODDLER BASE full-time is 125 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, 125] + +- 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 = $146 -> half = $73 + output: + al_ccsp_maximum_weekly_rate: [0, 73] + +- name: INFORMAL provider capped at 40 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, 40] + +- 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, 146] 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_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..0cc7d77b5c5 --- /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 = $597.95 (BIRMINGHAM CENTER PRESCHOOL BASE $138 * 4.333) + # Annual = 12 * $597.95 = $7,175.40 + al_child_care_subsidies: 7175.4 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..e66a1f513eb --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/edge_cases.yaml @@ -0,0 +1,442 @@ +# 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 + +# -- 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 = $138 -> half = $69 + output: + al_ccsp_maximum_weekly_rate: [0, 69] + +- 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, 138] + +# -- Multi-region rate coverage -- + +- name: GFDC rate in Huntsville Preschool STAR_3 is 133 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, 133] + +- 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 111 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, 111] + +- name: CENTER Montgomery PRESCHOOL STAR_5 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: 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, 127] + +# -- 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: 20_440 # 100% FPL 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_copay: 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: 22_484 # 110% FPL fam of 2 = 22,484/yr + 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). + # $18 * 4.333 = $77.99/mo + al_ccsp_copay: 77.99 + +- 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: 24_528 # 120% FPL 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: + # 120% FPL -> 111-120 band ($21/wk). $21 * 4.333 = $90.99/mo + al_ccsp_copay: 90.99 + +# -- 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 + output: + al_ccsp: 0 + al_ccsp_eligible: false 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..43aca75c23b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/integration.yaml @@ -0,0 +1,436 @@ +# AL CCSP integration tests +# Cross-cuts eligibility, copay, rate lookup, and benefit calculation. +# +# 2024 FPG (Contiguous US): first $15,060, additional $5,380. +# FS 2: $20,440/yr ($1,703.33/mo); 150% FPL = 2,555/mo; 180% = 3,066/mo +# FS 3: $25,820/yr ($2,151.67/mo) +# FS 4: $31,200/yr ($2,600/mo); 150% FPL = 3,900/mo; 180% = 4,680/mo; +# 190% = 4,940/mo; 200% = 5,200/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: 4.333 (regulatory literal). + +- 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: 38_730 # 150% FPL fam of 3 = 3,228/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 + 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 -> $30 * 4.333 = $129.99/mo copay + al_ccsp_copay: 129.99 + # BIRMINGHAM CENTER PRESCHOOL STAR_3 full-time = $146/wk + al_ccsp_maximum_weekly_rate: [0, 0, 146] + # weekly charge = 10,000 / 52 = $192.31; min($192.31, $146) = $146 + # weekly subsidy = $146 - $30 = $116 + # monthly = $116 * 4.333 = $502.63 + al_ccsp: 502.63 + +- name: Single parent at 60 FPL continuing tier with FDC in Mobile BASE. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 25 + employment_income: 12_264 # ~60% FPL 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_copay: 0 + # MOBILE FDC INFANT_TODDLER BASE full-time = $125/wk + al_ccsp_maximum_weekly_rate: [0, 125] + # weekly charge = 8,000 / 52 = $153.85; min($153.85, $125) = $125 + # monthly = $125 * 4.333 = $541.63 + al_ccsp: 541.63 + +- name: Family at 190 FPL initial tier is ineligible. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 59_280 # 190% FPL 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: 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: 49_058 # 190% FPL fam of 3 = 49,058/yr + 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 = 49,058 / 25,820 = 1.90 -> 181-190 band -> $42/wk + # $42 * 4.333 = $181.99/mo + al_ccsp_copay: 181.99 + # BIRMINGHAM CENTER PRESCHOOL BASE = $138/wk + al_ccsp_maximum_weekly_rate: [0, 0, 138] + # weekly charge = 10,000 / 52 = $192.31; min($192.31, $138) = $138 + # weekly subsidy = $138 - $42 = $96 + # monthly = $96 * 4.333 = $415.97 + al_ccsp: 415.97 + +- 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_copay: 0 + # BIRMINGHAM CENTER SCHOOL_AGE BASE = $115/wk + al_ccsp_maximum_weekly_rate: [0, 115] + # weekly subsidy = $115; monthly = $115 * 4.333 = $498.30 + al_ccsp: 498.3 + +- name: Disabled child waives copay. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 35 + employment_income: 30_660 # 150% FPL 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_copay: 0 + # BIRMINGHAM CENTER SCHOOL_AGE BASE = $115/wk (age 5) + # weekly subsidy = $115 - $0 = $115; monthly = $115 * 4.333 = $498.30 + al_ccsp: 498.3 + +- 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: 38_730 # 150% FPL fam of 3 = 3,228/mo + 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 * 4.333 = $259.98/mo + al_ccsp_copay: 259.98 + # BIRMINGHAM CENTER PRESCHOOL BASE = $138; CENTER INFANT_TODDLER BASE = $150 + al_ccsp_maximum_weekly_rate: [0, 138, 150] + # weekly charge per child = 7,000 / 52 = $134.62 + # child 1 (age 4): min($134.62, $138) = $134.62; subsidy = $134.62 - $30 = $104.62 + # child 2 (age 2): min($134.62, $150) = $134.62; subsidy = $134.62 - $30 = $104.62 + # total weekly subsidy = $209.24; monthly = $209.24 * 4.333 = $906.64 + al_ccsp: 906.64 + +- 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 = $138; part-time = $69 + al_ccsp_maximum_weekly_rate: [0, 69] + # weekly charge = 5,000 / 52 = $96.15; min(96.15, 69) = $69 + # copay = $0 (<=100% FPL) + # monthly = $69 * 4.333 = $298.98 + al_ccsp: 298.98 + +- name: INFORMAL provider capped at 40 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, 40] + # weekly charge = $96.15; min($96.15, $40) = $40 + # copay = $0; monthly = $40 * 4.333 = $173.32 + al_ccsp: 173.32 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..6988ab342b0 --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp.py @@ -0,0 +1,65 @@ +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 = ( + "Alabama CCDF State Plan 2025-2027, Section 3.1", + "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, parameters): + person = spm_unit.members + p = parameters(period).gov.states.al.dhr.ccsp + + # Per-child weekly maximum rate and the family weekly copay + # split equally across eligible children. + 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 + n_paying = spm_unit.sum(is_paying_child) + + weekly_family_copay = ( + spm_unit("al_ccsp_weekly_copay_per_child", period) * n_paying + ) + # Apply copay waivers consistently with al_ccsp_copay. + p_elig = p.eligibility + 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 & is_dependent & (age < p_elig.disabled_child_age_limit) + ) + is_head_start = person("is_enrolled_in_head_start", period.this_year) + has_head_start_child = spm_unit.any(is_head_start) + has_foster_child = add(spm_unit, period, ["is_in_foster_care"]) > 0 + copay_waived = has_disabled_child | has_head_start_child | has_foster_child + weekly_family_copay = where(copay_waived, 0, weekly_family_copay) + + per_child_weekly_copay = where( + n_paying > 0, weekly_family_copay / where(n_paying > 0, n_paying, 1), 0 + ) + per_child_weekly_copay_broadcast = spm_unit.project(per_child_weekly_copay) + + # Per-child weekly pre-subsidy charge from annual expenses. + annual_expense = person("pre_subsidy_childcare_expenses", period.this_year) + weekly_expense = annual_expense / WEEKS_IN_YEAR + + # Subsidy = max(0, min(charge, max_rate) - per-child copay). + capped_charge = min_(weekly_expense, weekly_rate) + per_child_weekly_subsidy = max_( + capped_charge - per_child_weekly_copay_broadcast, 0 + ) + + # Convert weekly to monthly using AL's regulatory 4.333 factor. + weeks_to_months = p.income.weeks_to_months + per_child_monthly_subsidy = ( + per_child_weekly_subsidy * weeks_to_months * 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..2111d0da946 --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_age_category.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +class ALCCSPAgeCategory(Enum): + INFANT_TODDLER = "Infant/Toddler (0-35 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 = ( + "Alabama DHR Provider Rate Chart, Key to Care Level", + "https://www.alacourt.gov/docs/ALDayCareRates.pdf", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.al.dhr.ccsp.age_category + # monthly_age returns years; convert to months for bracket lookup. + 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..26db820dbad --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_countable_income.py @@ -0,0 +1,16 @@ +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 = ( + "Alabama CCDF State Plan 2025-2027, Section 2.2.4(c)", + "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..5b320d826d4 --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_enrolled.py @@ -0,0 +1,13 @@ +from policyengine_us.model_api import * + + +class al_ccsp_enrolled(Variable): + value_type = bool + entity = SPMUnit + definition_period = MONTH + label = "Whether the family is currently enrolled in Alabama CCSP" + defined_for = StateCode.AL + reference = ( + "Alabama CCDF State Plan 2025-2027, Section 2.2.4", + "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..4935e21d912 --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_provider_type.py @@ -0,0 +1,22 @@ +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 = ( + "Alabama DHR Provider Rate Chart", + "https://www.alacourt.gov/docs/ALDayCareRates.pdf", + ) 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..8a73ac95553 --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_quality_tier.py @@ -0,0 +1,24 @@ +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 = ( + "Alabama DHR Provider Rate Chart (Base + 1-5 Star)", + "https://www.alacourt.gov/docs/ALDayCareRates.pdf", + ) 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..56dcd54583b --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/al_ccsp_region.py @@ -0,0 +1,61 @@ +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.MONTGOMERY + definition_period = YEAR + label = "Alabama CCSP rate-setting region" + defined_for = StateCode.AL + reference = ( + "Alabama DHR Provider Rate Chart, Regions and Counties Served", + "https://www.alacourt.gov/docs/ALDayCareRates.pdf", + ) + + 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.MONTGOMERY, + ) 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.py b/policyengine_us/variables/gov/states/al/dhr/ccsp/copay/al_ccsp_copay.py new file mode 100644 index 00000000000..704bb523c82 --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/copay/al_ccsp_copay.py @@ -0,0 +1,53 @@ +from policyengine_us.model_api import * + + +class al_ccsp_copay(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "Alabama CCSP monthly family copay" + definition_period = MONTH + defined_for = StateCode.AL + reference = ( + "Alabama CCDF State Plan 2025-2027, Section 3.3.1", + "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): + p_elig = parameters(period).gov.states.al.dhr.ccsp.eligibility + weekly_per_child = spm_unit("al_ccsp_weekly_copay_per_child", period) + + # Copay waivers (§3.3.1): + # (iv) family includes a disabled child + # (v) family enrolled in Head Start / EHS + # (vi) foster care (protective-services category for copay) + # Homelessness alone does NOT waive copay (§3.3.1(iii) unchecked), + # though it triggers the eligibility waiver via protective_services. + 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 & is_dependent & (age < p_elig.disabled_child_age_limit) + ) + + is_head_start = person("is_enrolled_in_head_start", period.this_year) + has_head_start_child = spm_unit.any(is_head_start) + + has_foster_child = add(spm_unit, period, ["is_in_foster_care"]) > 0 + + copay_waived = has_disabled_child | has_head_start_child | has_foster_child + + # Count children whose copay applies: eligible children in care. + is_eligible_child = person("al_ccsp_eligible_child", period) + in_care = person("childcare_hours_per_week", period.this_year) > 0 + num_paying = spm_unit.sum(is_eligible_child & in_care) + + # Provider may charge above max reimbursement rate (§3.1); copay + # is independent of the rate and based on the FPL fee table. + weekly_family_copay = weekly_per_child * num_paying + weeks_to_months = parameters( + period + ).gov.states.al.dhr.ccsp.income.weeks_to_months + monthly_family_copay = weekly_family_copay * weeks_to_months + return where(copay_waived, 0, monthly_family_copay) 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..33a0664f0d1 --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/copay/al_ccsp_weekly_copay_per_child.py @@ -0,0 +1,30 @@ +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 = ( + "Alabama Child Care Fact Sheet (Parental Fee Chart)", + "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 + monthly_income = spm_unit("al_ccsp_countable_income", period) + fpg = spm_unit("spm_unit_fpg", period.this_year) + # Compare monthly income against the monthly federal poverty + # guideline to compute the FPL ratio. + monthly_fpg = fpg / MONTHS_IN_YEAR + fpl_ratio = where(monthly_fpg > 0, monthly_income / monthly_fpg, 0) + + enrolled = spm_unit("al_ccsp_enrolled", period) + initial_fee = p.initial_fee_by_fpl.calc(fpl_ratio) + continuing_fee = p.continuing_fee_by_fpl.calc(fpl_ratio) + # Continuing families above 180% FPL use the continuing fee scale; + # all other families use the initial fee scale. + return where(enrolled, continuing_fee, initial_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..c55810ff90c --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_activity_eligible.py @@ -0,0 +1,28 @@ +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 = ( + "Alabama CCDF State Plan 2025-2027, Section 2.2.2", + "https://dhr.alabama.gov/wp-content/uploads/2023/04/2025-2027-CCDF-State-Plan-with-Approval-Letter.pdf#page=21", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.al.dhr.ccsp.eligibility + 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.activity_hours_minimum + is_student = person("is_full_time_student", period.this_year) + # Disabled-parent activity exemption per SC/VA precedent; not + # explicit in §2.2.2 but a CCDF best practice. + is_disabled = person("is_disabled", period.this_year) + individually_eligible = meets_work_requirement | is_student | is_disabled + has_head_or_spouse = spm_unit.sum(is_head_or_spouse) >= 1 + all_covered = spm_unit.sum(is_head_or_spouse & ~individually_eligible) == 0 + return has_head_or_spouse & all_covered 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..b9a0be98fff --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_eligible.py @@ -0,0 +1,32 @@ +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 = ( + "Alabama CCDF State Plan 2025-2027, Section 2.2", + "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..f71b9e6264a --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_eligible_child.py @@ -0,0 +1,28 @@ +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 = ( + "Alabama CCDF State Plan 2025-2027, Section 2.2.1", + "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.eligibility + age = person("age", period.this_year) + is_disabled = person("is_disabled", period.this_year) + age_eligible = where( + is_disabled, + age < p.disabled_child_age_limit, + age < p.child_age_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..a7f9f019980 --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_income_eligible.py @@ -0,0 +1,35 @@ +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 = ( + "Alabama CCDF State Plan 2025-2027, Section 2.2.4", + "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.eligibility + monthly_income = spm_unit("al_ccsp_countable_income", period) + annual_income = monthly_income * MONTHS_IN_YEAR + + # FPL test: 180% initial, 200% continuing (NJ pattern). + fpg = spm_unit("spm_unit_fpg", period.this_year) + enrolled = spm_unit("al_ccsp_enrolled", period) + fpl_limit_ratio = where( + enrolled, + p.income_limit_fpl_continuing, + p.income_limit_fpl_initial, + ) + fpl_eligible = annual_income <= fpg * fpl_limit_ratio + + # Federal CCDF 85% SMI hard cap applies in both initial and + # continuing tiers. + smi = spm_unit("hhs_smi", period.this_year) + smi_eligible = annual_income <= smi * p.income_limit_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..d3c437f8821 --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/eligibility/al_ccsp_protective_services.py @@ -0,0 +1,22 @@ +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 = ( + "Alabama CCDF State Plan 2025-2027, Section 2.2.2(f)", + "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): + # Foster care and homelessness are the modeled protective-service + # categories. Kinship is excluded per §2.2.2(f). EHS-CCP, + # child-welfare engagement, and TANF-Other Relative are not + # tracked at the moment and are documented as limitations. + 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..da0455df940 --- /dev/null +++ b/policyengine_us/variables/gov/states/al/dhr/ccsp/payment/al_ccsp_maximum_weekly_rate.py @@ -0,0 +1,57 @@ +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 = ( + "Alabama DHR Provider Rate Chart", + "https://www.alacourt.gov/docs/ALDayCareRates.pdf", + ) + + 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) + + # Look up the full-time rate across the four-dimension matrix. + # INFORMAL providers are handled separately by a flat weekly cap + # rather than the matrix; the select() default below carries the + # informal cap through when the provider type does not match. + 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] + + matrix_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 full-time rate. The + # informal cap is interpreted as a weekly maximum that applies + # without halving — providers either bill within the cap or not. + hours = person("childcare_hours_per_week", period.this_year) + is_part_time = hours <= p.full_time_hours_threshold + part_time_rate = matrix_rate * p.part_time_multiplier + full_time_rate = where(is_part_time, part_time_rate, matrix_rate) + + return where( + provider_type == ALCCSPProviderType.INFORMAL, + p.informal_weekly_cap, + full_time_rate, + ) From 511d7610ad6d4a66e9c99f7a32099efcb6d6ba58 Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 15 May 2026 00:03:32 -0400 Subject: [PATCH 4/5] Review-fix round 1: address critical issues from /review-program MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Correct §2.5.5(c)(iii) section label on income_limit_fpl_continuing.yaml - Fix #page=26 on income_limit_fpl_initial.yaml (was 24) - Add #page=1/2 anchors to 6 Provider Rate Chart references - Add 4 direct unit tests for al_ccsp_weekly_copay_per_child - Add exact-boundary tests at 180% FPL, 200% FPL, 85% SMI Co-Authored-By: Claude Opus 4.7 (1M context) --- .../al/dhr/ccsp/age_category/months.yaml | 2 +- .../income_limit_fpl_continuing.yaml | 2 +- .../eligibility/income_limit_fpl_initial.yaml | 2 +- .../ccsp/rates/full_time_hours_threshold.yaml | 2 +- .../dhr/ccsp/rates/informal_weekly_cap.yaml | 2 +- .../ccsp/rates/maximum_weekly_full_time.yaml | 2 +- .../dhr/ccsp/rates/part_time_multiplier.yaml | 2 +- .../states/al/dhr/ccsp/region/counties.yaml | 2 +- .../al/dhr/ccsp/al_ccsp_income_eligible.yaml | 91 ++++++++++++ .../ccsp/al_ccsp_weekly_copay_per_child.yaml | 133 ++++++++++++++++++ 10 files changed, 232 insertions(+), 8 deletions(-) create mode 100644 policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_weekly_copay_per_child.yaml 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 index 11b891b8e35..bc562271f2b 100644 --- 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 @@ -11,7 +11,7 @@ metadata: 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://www.alacourt.gov/docs/ALDayCareRates.pdf + href: https://www.alacourt.gov/docs/ALDayCareRates.pdf#page=2 - title: Alabama CCDF State Plan 2025-2027, Section 2.2 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/eligibility/income_limit_fpl_continuing.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/income_limit_fpl_continuing.yaml index 1e3991d0323..412b40e5a57 100644 --- a/policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/income_limit_fpl_continuing.yaml +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/income_limit_fpl_continuing.yaml @@ -7,7 +7,7 @@ metadata: period: year label: Alabama CCSP continuing income limit (share of federal poverty guideline) reference: - - title: Alabama CCDF State Plan 2025-2027, Section 2.2.4 + - title: Alabama CCDF State Plan 2025-2027, Section 2.5.5(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/eligibility/income_limit_fpl_initial.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/income_limit_fpl_initial.yaml index a2483a72586..6036f37af07 100644 --- a/policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/income_limit_fpl_initial.yaml +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/eligibility/income_limit_fpl_initial.yaml @@ -8,6 +8,6 @@ metadata: 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=24 + 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/rates/full_time_hours_threshold.yaml b/policyengine_us/parameters/gov/states/al/dhr/ccsp/rates/full_time_hours_threshold.yaml index c22a355d3e9..205125bf188 100644 --- 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 @@ -8,4 +8,4 @@ metadata: 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://www.alacourt.gov/docs/ALDayCareRates.pdf + href: https://www.alacourt.gov/docs/ALDayCareRates.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 index 44271c98a2a..218896c6225 100644 --- 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 @@ -8,4 +8,4 @@ metadata: 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://www.alacourt.gov/docs/ALDayCareRates.pdf + href: https://www.alacourt.gov/docs/ALDayCareRates.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 index 1c69c12cbf1..89fab38de9d 100644 --- 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 @@ -11,7 +11,7 @@ metadata: - al_ccsp_quality_tier reference: - title: Alabama DHR Child Care Subsidy Program Provider Rate Chart, Maximum Weekly Full-time Rates - href: https://www.alacourt.gov/docs/ALDayCareRates.pdf + href: https://www.alacourt.gov/docs/ALDayCareRates.pdf#page=1 CENTER: HUNTSVILLE: 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 index 748264ddf19..a4311f32308 100644 --- 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 @@ -8,4 +8,4 @@ metadata: label: Alabama CCSP part-time rate multiplier reference: - title: Alabama DHR Child Care Subsidy Program Provider Rate Chart (Part-time Rates) - href: https://www.alacourt.gov/docs/ALDayCareRates.pdf + href: https://www.alacourt.gov/docs/ALDayCareRates.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 index 8a5df304fe4..6be9189c68a 100644 --- a/policyengine_us/parameters/gov/states/al/dhr/ccsp/region/counties.yaml +++ b/policyengine_us/parameters/gov/states/al/dhr/ccsp/region/counties.yaml @@ -8,7 +8,7 @@ metadata: - al_ccsp_region reference: - title: Alabama DHR Child Care Subsidy Program Provider Rate Chart, Regions and Counties Served - href: https://www.alacourt.gov/docs/ALDayCareRates.pdf + href: https://www.alacourt.gov/docs/ALDayCareRates.pdf#page=1 HUNTSVILLE: 2024-01-01: 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 index 9df89ae0bed..30cc2baad99 100644 --- 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 @@ -163,3 +163,94 @@ # 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: 56_160 # 180% FPL fam of 4 = 31,200 * 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: + # 56,160 == 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: 62_400 # 200% FPL fam of 4 = 31,200 * 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: + # 62,400 == 200% FPL exactly -> formula uses <=, so still eligible at the boundary. + # 62,400/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 + employment_income: 75_146 # 85% SMI fam of 4 = 88,407 * 0.85 = 75,145.95; 75,146 is just over + 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,146 > 75,145.95 (85% SMI cap) -> SMI cap fails by less than $1. + al_ccsp_income_eligible: false 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..2c6e8331769 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/al/dhr/ccsp/al_ccsp_weekly_copay_per_child.yaml @@ -0,0 +1,133 @@ +# AL CCSP weekly per-child parental fee tests (SPMUnit, MONTH). +# Initial tier (al_ccsp_enrolled=false) uses the 9-band initial fee schedule. +# Continuing tier (al_ccsp_enrolled=true) uses the 2-band continuing fee schedule. +# +# 2024 FPG (Contiguous US), family of 4: $31,200/yr = $2,600/mo. +# 80% FPL fam of 4 = $24,960/yr ($2,080/mo) +# 150% FPL fam of 4 = $46,800/yr ($3,900/mo) +# 185% FPL fam of 4 = $57,720/yr ($4,810/mo) +# 195% FPL fam of 4 = $60,840/yr ($5,070/mo) + +- name: Initial tier 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: 46_800 # 150% 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 = 3,900 / 2,600 = 1.5 -> initial tier band [1.4001, 1.5001) -> $30/wk + al_ccsp_weekly_copay_per_child: 30 + +- name: Initial tier 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_960 # 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,080 / 2,600 = 0.8 -> initial tier band [0, 1.0001) -> $0/wk + al_ccsp_weekly_copay_per_child: 0 + +- name: Continuing tier 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: 57_720 # 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,810 / 2,600 = 1.85 -> continuing tier band [1.8001, 1.9001) -> $42/wk + al_ccsp_weekly_copay_per_child: 42 + +- name: Continuing tier 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: 60_840 # 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 = 5,070 / 2,600 = 1.95 -> continuing tier band [1.9001, ...) -> $45/wk + al_ccsp_weekly_copay_per_child: 45 From 0363c3c8fc60a9998bc1fd21e9595c97f85f2fa7 Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 15 May 2026 00:14:46 -0400 Subject: [PATCH 5/5] Review-fix round 2: address SHOULD items from /review-program MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add #page= anchors to 5 variable .py files referencing Provider Rate Chart - Fix al_ccsp_enrolled.py section label (§2.2.4 → §2.5.5(c)(iii)) - Add STAR_1/STAR_2/STAR_4 test cases to al_ccsp_maximum_weekly_rate.yaml Co-Authored-By: Claude Opus 4.7 (1M context) --- .../dhr/ccsp/al_ccsp_maximum_weekly_rate.yaml | 84 +++++++++++++++++++ .../al/dhr/ccsp/al_ccsp_age_category.py | 2 +- .../states/al/dhr/ccsp/al_ccsp_enrolled.py | 2 +- .../al/dhr/ccsp/al_ccsp_provider_type.py | 2 +- .../al/dhr/ccsp/al_ccsp_quality_tier.py | 2 +- .../gov/states/al/dhr/ccsp/al_ccsp_region.py | 2 +- .../payment/al_ccsp_maximum_weekly_rate.py | 2 +- 7 files changed, 90 insertions(+), 6 deletions(-) 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 index 72316d8f532..dd08ea78203 100644 --- 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 @@ -201,3 +201,87 @@ county_str: JEFFERSON_COUNTY_AL output: al_ccsp_maximum_weekly_rate: [0, 146] + +- name: CENTER HUNTSVILLE INFANT_TODDLER STAR_1 full-time is 141 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, 141] + +- name: CENTER HUNTSVILLE INFANT_TODDLER STAR_2 full-time is 144 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, 144] + +- name: CENTER HUNTSVILLE INFANT_TODDLER STAR_4 full-time is 149 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, 149] 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 index 2111d0da946..122265b8d8e 100644 --- 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 @@ -17,7 +17,7 @@ class al_ccsp_age_category(Variable): defined_for = StateCode.AL reference = ( "Alabama DHR Provider Rate Chart, Key to Care Level", - "https://www.alacourt.gov/docs/ALDayCareRates.pdf", + "https://www.alacourt.gov/docs/ALDayCareRates.pdf#page=2", ) def formula(person, period, parameters): 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 index 5b320d826d4..1ffb2a5433c 100644 --- 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 @@ -8,6 +8,6 @@ class al_ccsp_enrolled(Variable): label = "Whether the family is currently enrolled in Alabama CCSP" defined_for = StateCode.AL reference = ( - "Alabama CCDF State Plan 2025-2027, Section 2.2.4", + "Alabama CCDF State Plan 2025-2027, Section 2.5.5(c)(iii)", "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 index 4935e21d912..6cf01ffd4d1 100644 --- 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 @@ -18,5 +18,5 @@ class al_ccsp_provider_type(Variable): defined_for = StateCode.AL reference = ( "Alabama DHR Provider Rate Chart", - "https://www.alacourt.gov/docs/ALDayCareRates.pdf", + "https://www.alacourt.gov/docs/ALDayCareRates.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 index 8a73ac95553..5e832eec665 100644 --- 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 @@ -20,5 +20,5 @@ class al_ccsp_quality_tier(Variable): defined_for = StateCode.AL reference = ( "Alabama DHR Provider Rate Chart (Base + 1-5 Star)", - "https://www.alacourt.gov/docs/ALDayCareRates.pdf", + "https://www.alacourt.gov/docs/ALDayCareRates.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 index 56dcd54583b..e44ec5d1175 100644 --- 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 @@ -23,7 +23,7 @@ class al_ccsp_region(Variable): defined_for = StateCode.AL reference = ( "Alabama DHR Provider Rate Chart, Regions and Counties Served", - "https://www.alacourt.gov/docs/ALDayCareRates.pdf", + "https://www.alacourt.gov/docs/ALDayCareRates.pdf#page=1", ) def formula(household, period, parameters): 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 index da0455df940..7c9bdbea34d 100644 --- 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 @@ -13,7 +13,7 @@ class al_ccsp_maximum_weekly_rate(Variable): defined_for = "al_ccsp_eligible_child" reference = ( "Alabama DHR Provider Rate Chart", - "https://www.alacourt.gov/docs/ALDayCareRates.pdf", + "https://www.alacourt.gov/docs/ALDayCareRates.pdf#page=1", ) def formula(person, period, parameters):