From 695a852e6ae1d2b342bddb2bc0867bcd81d58fe3 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 16 Jun 2026 15:49:44 -0400 Subject: [PATCH 1/5] Initialize Missouri CCAP implementation Co-Authored-By: Claude Opus 4.8 (1M context) --- changelog.d/mo-ccap.added.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/mo-ccap.added.md diff --git a/changelog.d/mo-ccap.added.md b/changelog.d/mo-ccap.added.md new file mode 100644 index 00000000000..212f2c43276 --- /dev/null +++ b/changelog.d/mo-ccap.added.md @@ -0,0 +1 @@ +Implement Missouri Child Care Assistance Program (CCAP / Child Care Subsidy). From c1f254ca8c45d4a64b6fa80c43ec917d45d08f04 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 16 Jun 2026 17:16:35 -0400 Subject: [PATCH 2/5] Add Missouri Child Care Subsidy (CCS) program Implements Missouri's Child Care Subsidy under DESE, a provider-reimbursement subsidy with four geographic regions, age-based maximum daily rates by provider type (licensed center, registered center, licensed family home, group home, and six-or-fewer), special-needs rate add-ons, time-category-based units (full/half/ part-day), and a family-size copay tier with SMI minimum rate and minimum annual fee. Includes FPL-based initial and transitional income eligibility, activity and protective-services eligibility paths, and wires the state into the federal CCDF child_care_subsidy_programs registry and programs.yaml. Closes #8652 Co-Authored-By: Claude Opus 4.8 (1M context) --- changelog.d/mo-ccap.added.md | 2 +- .../hhs/ccdf/child_care_subsidy_programs.yaml | 1 + .../gov/states/mo/dese/ccs/age_group/age.yaml | 26 + .../dese/ccs/copay/daily_fee/full_unit.yaml | 59 ++ .../dese/ccs/copay/daily_fee/half_unit.yaml | 59 ++ .../dese/ccs/copay/daily_fee/part_unit.yaml | 59 ++ .../mo/dese/ccs/copay/minimum_annual_fee.yaml | 13 + .../mo/dese/ccs/copay/smi_minimum_rate.yaml | 11 + .../states/mo/dese/ccs/copay/tier/size_1.yaml | 60 ++ .../mo/dese/ccs/copay/tier/size_10.yaml | 60 ++ .../mo/dese/ccs/copay/tier/size_11.yaml | 60 ++ .../mo/dese/ccs/copay/tier/size_12.yaml | 60 ++ .../mo/dese/ccs/copay/tier/size_13.yaml | 60 ++ .../mo/dese/ccs/copay/tier/size_14.yaml | 60 ++ .../mo/dese/ccs/copay/tier/size_15.yaml | 60 ++ .../mo/dese/ccs/copay/tier/size_16.yaml | 60 ++ .../mo/dese/ccs/copay/tier/size_17.yaml | 60 ++ .../mo/dese/ccs/copay/tier/size_18.yaml | 60 ++ .../mo/dese/ccs/copay/tier/size_19.yaml | 60 ++ .../states/mo/dese/ccs/copay/tier/size_2.yaml | 60 ++ .../mo/dese/ccs/copay/tier/size_20.yaml | 60 ++ .../states/mo/dese/ccs/copay/tier/size_3.yaml | 60 ++ .../states/mo/dese/ccs/copay/tier/size_4.yaml | 60 ++ .../states/mo/dese/ccs/copay/tier/size_5.yaml | 60 ++ .../states/mo/dese/ccs/copay/tier/size_6.yaml | 60 ++ .../states/mo/dese/ccs/copay/tier/size_7.yaml | 60 ++ .../states/mo/dese/ccs/copay/tier/size_8.yaml | 60 ++ .../states/mo/dese/ccs/copay/tier/size_9.yaml | 60 ++ .../dese/ccs/eligibility/child_age_limit.yaml | 13 + .../special_needs_child_age_limit.yaml | 11 + .../special_needs_in_school_age_limit.yaml | 11 + .../ccs/income/countable_income/sources.yaml | 48 ++ .../income/fpl_rate/initial_eligibility.yaml | 13 + .../ccs/income/fpl_rate/transitional.yaml | 13 + .../mo/dese/ccs/rates/group_home/base.yaml | 123 ++++ .../ccs/rates/group_home/special_needs.yaml | 123 ++++ .../dese/ccs/rates/licensed_center/base.yaml | 123 ++++ .../rates/licensed_center/special_needs.yaml | 123 ++++ .../ccs/rates/licensed_family_home/base.yaml | 123 ++++ .../licensed_family_home/special_needs.yaml | 123 ++++ .../ccs/rates/registered_center/base.yaml | 123 ++++ .../registered_center/special_needs.yaml | 123 ++++ .../mo/dese/ccs/rates/six_or_fewer/base.yaml | 123 ++++ .../ccs/rates/six_or_fewer/special_needs.yaml | 123 ++++ .../mo/dese/ccs/region/region_1_counties.yaml | 18 + .../mo/dese/ccs/region/region_2_counties.yaml | 28 + .../mo/dese/ccs/region/region_3_counties.yaml | 21 + .../mo/dese/ccs/region/region_4_counties.yaml | 33 ++ .../mo/dese/ccs/time_category/hours.yaml | 27 + .../dese/ccs/transitional/funding_rate.yaml | 34 ++ policyengine_us/programs.yaml | 8 +- .../mo/dese/ccs/copay/mo_ccs_copay.yaml | 482 +++++++++++++++ .../eligibility/mo_ccs_activity_eligible.yaml | 129 ++++ .../dese/ccs/eligibility/mo_ccs_eligible.yaml | 162 +++++ .../eligibility/mo_ccs_eligible_child.yaml | 196 +++++++ .../eligibility/mo_ccs_income_eligible.yaml | 219 +++++++ .../mo_ccs_protective_services.yaml | 79 +++ .../ccs/income/mo_ccs_adjusted_income.yaml | 63 ++ .../ccs/income/mo_ccs_countable_income.yaml | 127 ++++ .../gov/states/mo/dese/ccs/integration.yaml | 304 ++++++++++ .../gov/states/mo/dese/ccs/mo_ccs.yaml | 226 +++++++ .../states/mo/dese/ccs/mo_ccs_age_group.yaml | 84 +++ .../ccs/mo_ccs_maximum_daily_benefit.yaml | 554 ++++++++++++++++++ .../gov/states/mo/dese/ccs/mo_ccs_region.yaml | 75 +++ .../mo/dese/ccs/mo_ccs_time_category.yaml | 88 +++ .../mo/dese/ccs/mo_child_care_subsidies.yaml | 68 +++ .../states/mo/dese/ccs/copay/mo_ccs_copay.py | 73 +++ .../eligibility/mo_ccs_activity_eligible.py | 29 + .../dese/ccs/eligibility/mo_ccs_eligible.py | 28 + .../ccs/eligibility/mo_ccs_eligible_child.py | 36 ++ .../ccs/eligibility/mo_ccs_income_eligible.py | 27 + .../eligibility/mo_ccs_protective_services.py | 23 + .../dese/ccs/income/mo_ccs_adjusted_income.py | 21 + .../ccs/income/mo_ccs_countable_income.py | 15 + .../gov/states/mo/dese/ccs/mo_ccs.py | 23 + .../states/mo/dese/ccs/mo_ccs_age_group.py | 25 + .../gov/states/mo/dese/ccs/mo_ccs_enrolled.py | 10 + .../dese/ccs/mo_ccs_maximum_daily_benefit.py | 57 ++ .../mo/dese/ccs/mo_ccs_provider_type.py | 20 + .../gov/states/mo/dese/ccs/mo_ccs_region.py | 41 ++ .../mo/dese/ccs/mo_ccs_time_category.py | 25 + .../mo/dese/ccs/mo_child_care_subsidies.py | 11 + 82 files changed, 6256 insertions(+), 2 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/age_group/age.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/daily_fee/full_unit.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/daily_fee/half_unit.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/daily_fee/part_unit.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/minimum_annual_fee.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/smi_minimum_rate.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_1.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_10.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_11.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_12.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_13.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_14.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_15.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_16.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_17.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_18.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_19.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_2.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_20.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_3.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_4.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_5.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_6.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_7.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_8.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_9.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/eligibility/child_age_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/eligibility/special_needs_child_age_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/eligibility/special_needs_in_school_age_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/income/countable_income/sources.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/income/fpl_rate/initial_eligibility.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/income/fpl_rate/transitional.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/rates/group_home/base.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/rates/group_home/special_needs.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/rates/licensed_center/base.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/rates/licensed_center/special_needs.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/rates/licensed_family_home/base.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/rates/licensed_family_home/special_needs.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/rates/registered_center/base.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/rates/registered_center/special_needs.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/rates/six_or_fewer/base.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/rates/six_or_fewer/special_needs.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/region/region_1_counties.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/region/region_2_counties.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/region/region_3_counties.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/region/region_4_counties.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/time_category/hours.yaml create mode 100644 policyengine_us/parameters/gov/states/mo/dese/ccs/transitional/funding_rate.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/copay/mo_ccs_copay.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible_child.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_income_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_protective_services.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/income/mo_ccs_adjusted_income.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/income/mo_ccs_countable_income.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/integration.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_age_group.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_region.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_time_category.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_child_care_subsidies.yaml create mode 100644 policyengine_us/variables/gov/states/mo/dese/ccs/copay/mo_ccs_copay.py create mode 100644 policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.py create mode 100644 policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible.py create mode 100644 policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible_child.py create mode 100644 policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_income_eligible.py create mode 100644 policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_protective_services.py create mode 100644 policyengine_us/variables/gov/states/mo/dese/ccs/income/mo_ccs_adjusted_income.py create mode 100644 policyengine_us/variables/gov/states/mo/dese/ccs/income/mo_ccs_countable_income.py create mode 100644 policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs.py create mode 100644 policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_age_group.py create mode 100644 policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_enrolled.py create mode 100644 policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.py create mode 100644 policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_provider_type.py create mode 100644 policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_region.py create mode 100644 policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_time_category.py create mode 100644 policyengine_us/variables/gov/states/mo/dese/ccs/mo_child_care_subsidies.py diff --git a/changelog.d/mo-ccap.added.md b/changelog.d/mo-ccap.added.md index 212f2c43276..a45480605db 100644 --- a/changelog.d/mo-ccap.added.md +++ b/changelog.d/mo-ccap.added.md @@ -1 +1 @@ -Implement Missouri Child Care Assistance Program (CCAP / Child Care Subsidy). +Add Missouri Child Care Subsidy program. 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 748e5f5bffc..26cd0ef4dc0 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 @@ -17,6 +17,7 @@ values: - ky_child_care_subsidies # Kentucky Child Care Assistance Program - ma_child_care_subsidies # Massachusetts Child Care Financial Assistance - me_child_care_subsidies # Maine Child Care Affordability Program + - mo_child_care_subsidies # Missouri Child Care Subsidy - ne_child_care_subsidies # Nebraska Child Care Subsidy - vt_child_care_subsidies # Vermont Child Care Financial Assistance Program - nh_child_care_subsidies # New Hampshire Child Care Scholarship Program diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/age_group/age.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/age_group/age.yaml new file mode 100644 index 00000000000..8783bce3986 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/age_group/age.yaml @@ -0,0 +1,26 @@ +description: Missouri determines a child's age group from age for provider payment rates under the Child Care Subsidy program. +# 0 = INFANT_TODDLER (newborn to 2 years), 1 = PRESCHOOL (2 to 5 years), +# 2 = SCHOOL_AGE (5 years and over). +metadata: + type: single_amount + threshold_unit: year + amount_unit: /1 + period: year + label: Missouri Child Care Subsidy child age group by age + reference: + - title: Missouri Child Care Subsidy Payments — Age Rate Categories + href: https://dese.mo.gov/childhood/child-care-subsidy/payments + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 2 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 5 + amount: + 2025-10-01: 2 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/daily_fee/full_unit.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/daily_fee/full_unit.yaml new file mode 100644 index 00000000000..60c3f6683e1 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/daily_fee/full_unit.yaml @@ -0,0 +1,59 @@ +description: Missouri charges this daily sliding fee per child for a full unit of care by sliding fee tier under the Child Care Subsidy program. +# Tier index from copay/tier/size_N. Tier 0 is the $1/year minimum (no daily +# fee). Tiers 1-7 are the traditional ladder; tiers 8-10 are Transitional Child +# Care Levels 1-3. +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + period: day + label: Missouri Child Care Subsidy full unit daily sliding fee + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1 + amount: + 2025-10-01: 0.5 + - threshold: + 2025-10-01: 2 + amount: + 2025-10-01: 0.75 + - threshold: + 2025-10-01: 3 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 4 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 5 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 6 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 7 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 8 + amount: + 2025-10-01: 7.5 + - threshold: + 2025-10-01: 9 + amount: + 2025-10-01: 8.75 + - threshold: + 2025-10-01: 10 + amount: + 2025-10-01: 10 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/daily_fee/half_unit.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/daily_fee/half_unit.yaml new file mode 100644 index 00000000000..de36b699740 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/daily_fee/half_unit.yaml @@ -0,0 +1,59 @@ +description: Missouri charges this daily sliding fee per child for a half unit of care by sliding fee tier under the Child Care Subsidy program. +# Tier index from copay/tier/size_N. Tier 0 is the $1/year minimum (no daily +# fee). Tiers 1-7 are the traditional ladder; tiers 8-10 are Transitional Child +# Care Levels 1-3. +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + period: day + label: Missouri Child Care Subsidy half unit daily sliding fee + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1 + amount: + 2025-10-01: 0.35 + - threshold: + 2025-10-01: 2 + amount: + 2025-10-01: 0.5 + - threshold: + 2025-10-01: 3 + amount: + 2025-10-01: 0.65 + - threshold: + 2025-10-01: 4 + amount: + 2025-10-01: 1.3 + - threshold: + 2025-10-01: 5 + amount: + 2025-10-01: 1.95 + - threshold: + 2025-10-01: 6 + amount: + 2025-10-01: 2.6 + - threshold: + 2025-10-01: 7 + amount: + 2025-10-01: 3.25 + - threshold: + 2025-10-01: 8 + amount: + 2025-10-01: 3.75 + - threshold: + 2025-10-01: 9 + amount: + 2025-10-01: 4.4 + - threshold: + 2025-10-01: 10 + amount: + 2025-10-01: 5 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/daily_fee/part_unit.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/daily_fee/part_unit.yaml new file mode 100644 index 00000000000..2e4d73ad146 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/daily_fee/part_unit.yaml @@ -0,0 +1,59 @@ +description: Missouri charges this daily sliding fee per child for a part unit of care by sliding fee tier under the Child Care Subsidy program. +# Tier index from copay/tier/size_N. Tier 0 is the $1/year minimum (no daily +# fee). Tiers 1-7 are the traditional ladder; tiers 8-10 are Transitional Child +# Care Levels 1-3. +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + period: day + label: Missouri Child Care Subsidy part unit daily sliding fee + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1 + amount: + 2025-10-01: 0.25 + - threshold: + 2025-10-01: 2 + amount: + 2025-10-01: 0.35 + - threshold: + 2025-10-01: 3 + amount: + 2025-10-01: 0.45 + - threshold: + 2025-10-01: 4 + amount: + 2025-10-01: 0.9 + - threshold: + 2025-10-01: 5 + amount: + 2025-10-01: 1.35 + - threshold: + 2025-10-01: 6 + amount: + 2025-10-01: 1.8 + - threshold: + 2025-10-01: 7 + amount: + 2025-10-01: 2.25 + - threshold: + 2025-10-01: 8 + amount: + 2025-10-01: 2.5 + - threshold: + 2025-10-01: 9 + amount: + 2025-10-01: 2.9 + - threshold: + 2025-10-01: 10 + amount: + 2025-10-01: 3.3 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/minimum_annual_fee.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/minimum_annual_fee.yaml new file mode 100644 index 00000000000..cc52b989bea --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/minimum_annual_fee.yaml @@ -0,0 +1,13 @@ +description: Missouri charges this minimum annual sliding fee under the Child Care Subsidy program. +values: + 2025-10-01: 1 + +metadata: + unit: currency-USD + period: year + label: Missouri Child Care Subsidy minimum annual sliding fee + reference: + - title: Missouri Child Care Subsidy Eligibility Policy Manual 2025.010 Sliding Fee from Households + href: https://web.archive.org/web/20211208060516id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2025/010 + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/smi_minimum_rate.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/smi_minimum_rate.yaml new file mode 100644 index 00000000000..4d56e915fa9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/smi_minimum_rate.yaml @@ -0,0 +1,11 @@ +description: Missouri charges only the minimum annual sliding fee when gross income falls below this share of the state median income under the Child Care Subsidy program. +values: + 2025-10-01: 0.25 + +metadata: + unit: /1 + period: year + label: Missouri Child Care Subsidy minimum fee state median income share + reference: + - title: Missouri Child Care Subsidy Eligibility Policy Manual 2025.010 Sliding Fee from Households + href: https://web.archive.org/web/20211208060516id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2025/010 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_1.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_1.yaml new file mode 100644 index 00000000000..9eceddfa242 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_1.yaml @@ -0,0 +1,60 @@ +description: Missouri assigns a sliding fee tier by monthly gross income for a household of one under the Child Care Subsidy program. +# Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is +# the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are +# Transitional Child Care Levels 1-3. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: month + period: month + label: Missouri Child Care Subsidy sliding fee tier for household of one + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 417.0001 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 500.0001 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 583.0001 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 667.0001 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 750.0001 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 834.0001 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 917.0001 + amount: + 2025-10-01: 7 + - threshold: + 2025-10-01: 1956.0001 + amount: + 2025-10-01: 8 + - threshold: + 2025-10-01: 2413.0001 + amount: + 2025-10-01: 9 + - threshold: + 2025-10-01: 2804.0001 + amount: + 2025-10-01: 10 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_10.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_10.yaml new file mode 100644 index 00000000000..e73cc8dc43e --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_10.yaml @@ -0,0 +1,60 @@ +description: Missouri assigns a sliding fee tier by monthly gross income for a household of ten under the Child Care Subsidy program. +# Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is +# the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are +# Transitional Child Care Levels 1-3. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: month + period: month + label: Missouri Child Care Subsidy sliding fee tier for household of ten + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1154.0001 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 1385.0001 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 1616.0001 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 1847.0001 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 2078.0001 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 2309.0001 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 2539.0001 + amount: + 2025-10-01: 7 + - threshold: + 2025-10-01: 8144.0001 + amount: + 2025-10-01: 8 + - threshold: + 2025-10-01: 10044.0001 + amount: + 2025-10-01: 9 + - threshold: + 2025-10-01: 11673.0001 + amount: + 2025-10-01: 10 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_11.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_11.yaml new file mode 100644 index 00000000000..831e3f270fc --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_11.yaml @@ -0,0 +1,60 @@ +description: Missouri assigns a sliding fee tier by monthly gross income for a household of eleven under the Child Care Subsidy program. +# Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is +# the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are +# Transitional Child Care Levels 1-3. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: month + period: month + label: Missouri Child Care Subsidy sliding fee tier for household of eleven + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1179.0001 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 1414.0001 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 1650.0001 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 1886.0001 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 2121.0001 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 2357.0001 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 2593.0001 + amount: + 2025-10-01: 7 + - threshold: + 2025-10-01: 8831.0001 + amount: + 2025-10-01: 8 + - threshold: + 2025-10-01: 10892.0001 + amount: + 2025-10-01: 9 + - threshold: + 2025-10-01: 12658.0001 + amount: + 2025-10-01: 10 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_12.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_12.yaml new file mode 100644 index 00000000000..fdb83fef57d --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_12.yaml @@ -0,0 +1,60 @@ +description: Missouri assigns a sliding fee tier by monthly gross income for a household of twelve under the Child Care Subsidy program. +# Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is +# the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are +# Transitional Child Care Levels 1-3. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: month + period: month + label: Missouri Child Care Subsidy sliding fee tier for household of twelve + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1203.0001 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 1443.0001 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 1684.0001 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 1924.0001 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 2165.0001 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 2405.0001 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 2646.0001 + amount: + 2025-10-01: 7 + - threshold: + 2025-10-01: 9519.0001 + amount: + 2025-10-01: 8 + - threshold: + 2025-10-01: 11740.0001 + amount: + 2025-10-01: 9 + - threshold: + 2025-10-01: 13644.0001 + amount: + 2025-10-01: 10 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_13.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_13.yaml new file mode 100644 index 00000000000..a60691808c9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_13.yaml @@ -0,0 +1,60 @@ +description: Missouri assigns a sliding fee tier by monthly gross income for a household of thirteen under the Child Care Subsidy program. +# Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is +# the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are +# Transitional Child Care Levels 1-3. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: month + period: month + label: Missouri Child Care Subsidy sliding fee tier for household of thirteen + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1227.0001 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 1472.0001 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 1717.0001 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 1962.0001 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 2208.0001 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 2453.0001 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 2698.0001 + amount: + 2025-10-01: 7 + - threshold: + 2025-10-01: 10206.0001 + amount: + 2025-10-01: 8 + - threshold: + 2025-10-01: 12588.0001 + amount: + 2025-10-01: 9 + - threshold: + 2025-10-01: 14629.0001 + amount: + 2025-10-01: 10 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_14.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_14.yaml new file mode 100644 index 00000000000..aa186956228 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_14.yaml @@ -0,0 +1,60 @@ +description: Missouri assigns a sliding fee tier by monthly gross income for a household of fourteen under the Child Care Subsidy program. +# Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is +# the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are +# Transitional Child Care Levels 1-3. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: month + period: month + label: Missouri Child Care Subsidy sliding fee tier for household of fourteen + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1251.0001 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 1501.0001 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 1751.0001 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 2001.0001 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 2251.0001 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 2501.0001 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 2751.0001 + amount: + 2025-10-01: 7 + - threshold: + 2025-10-01: 10894.0001 + amount: + 2025-10-01: 8 + - threshold: + 2025-10-01: 13436.0001 + amount: + 2025-10-01: 9 + - threshold: + 2025-10-01: 15614.0001 + amount: + 2025-10-01: 10 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_15.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_15.yaml new file mode 100644 index 00000000000..0679238bff5 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_15.yaml @@ -0,0 +1,60 @@ +description: Missouri assigns a sliding fee tier by monthly gross income for a household of fifteen under the Child Care Subsidy program. +# Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is +# the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are +# Transitional Child Care Levels 1-3. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: month + period: month + label: Missouri Child Care Subsidy sliding fee tier for household of fifteen + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1275.0001 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 1529.0001 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 1784.0001 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 2039.0001 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 2294.0001 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 2549.0001 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 2804.0001 + amount: + 2025-10-01: 7 + - threshold: + 2025-10-01: 11581.0001 + amount: + 2025-10-01: 8 + - threshold: + 2025-10-01: 14284.0001 + amount: + 2025-10-01: 9 + - threshold: + 2025-10-01: 16600.0001 + amount: + 2025-10-01: 10 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_16.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_16.yaml new file mode 100644 index 00000000000..0f82bcb7e98 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_16.yaml @@ -0,0 +1,60 @@ +description: Missouri assigns a sliding fee tier by monthly gross income for a household of sixteen under the Child Care Subsidy program. +# Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is +# the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are +# Transitional Child Care Levels 1-3. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: month + period: month + label: Missouri Child Care Subsidy sliding fee tier for household of sixteen + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1299.0001 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 1559.0001 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 1818.0001 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 2078.0001 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 2338.0001 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 2598.0001 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 2857.0001 + amount: + 2025-10-01: 7 + - threshold: + 2025-10-01: 12269.0001 + amount: + 2025-10-01: 8 + - threshold: + 2025-10-01: 15131.0001 + amount: + 2025-10-01: 9 + - threshold: + 2025-10-01: 17585.0001 + amount: + 2025-10-01: 10 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_17.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_17.yaml new file mode 100644 index 00000000000..91def6e4793 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_17.yaml @@ -0,0 +1,60 @@ +description: Missouri assigns a sliding fee tier by monthly gross income for a household of seventeen under the Child Care Subsidy program. +# Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is +# the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are +# Transitional Child Care Levels 1-3. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: month + period: month + label: Missouri Child Care Subsidy sliding fee tier for household of seventeen + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1323.0001 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 1587.0001 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 1852.0001 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 2116.0001 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 2381.0001 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 2646.0001 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 2910.0001 + amount: + 2025-10-01: 7 + - threshold: + 2025-10-01: 12956.0001 + amount: + 2025-10-01: 8 + - threshold: + 2025-10-01: 15979.0001 + amount: + 2025-10-01: 9 + - threshold: + 2025-10-01: 18571.0001 + amount: + 2025-10-01: 10 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_18.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_18.yaml new file mode 100644 index 00000000000..8c9fe9f35d0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_18.yaml @@ -0,0 +1,60 @@ +description: Missouri assigns a sliding fee tier by monthly gross income for a household of eighteen under the Child Care Subsidy program. +# Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is +# the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are +# Transitional Child Care Levels 1-3. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: month + period: month + label: Missouri Child Care Subsidy sliding fee tier for household of eighteen + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1347.0001 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 1616.0001 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 1885.0001 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 2155.0001 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 2424.0001 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 2694.0001 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 2963.0001 + amount: + 2025-10-01: 7 + - threshold: + 2025-10-01: 13644.0001 + amount: + 2025-10-01: 8 + - threshold: + 2025-10-01: 16827.0001 + amount: + 2025-10-01: 9 + - threshold: + 2025-10-01: 19556.0001 + amount: + 2025-10-01: 10 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_19.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_19.yaml new file mode 100644 index 00000000000..ad955a41749 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_19.yaml @@ -0,0 +1,60 @@ +description: Missouri assigns a sliding fee tier by monthly gross income for a household of nineteen under the Child Care Subsidy program. +# Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is +# the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are +# Transitional Child Care Levels 1-3. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: month + period: month + label: Missouri Child Care Subsidy sliding fee tier for household of nineteen + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1371.0001 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 1645.0001 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 1919.0001 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 2193.0001 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 2467.0001 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 2742.0001 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 3016.0001 + amount: + 2025-10-01: 7 + - threshold: + 2025-10-01: 14331.0001 + amount: + 2025-10-01: 8 + - threshold: + 2025-10-01: 17675.0001 + amount: + 2025-10-01: 9 + - threshold: + 2025-10-01: 20541.0001 + amount: + 2025-10-01: 10 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_2.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_2.yaml new file mode 100644 index 00000000000..0f33e847fb5 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_2.yaml @@ -0,0 +1,60 @@ +description: Missouri assigns a sliding fee tier by monthly gross income for a household of two under the Child Care Subsidy program. +# Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is +# the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are +# Transitional Child Care Levels 1-3. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: month + period: month + label: Missouri Child Care Subsidy sliding fee tier for household of two + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 545.0001 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 654.0001 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 763.0001 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 872.0001 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 981.0001 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 1090.0001 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 1199.0001 + amount: + 2025-10-01: 7 + - threshold: + 2025-10-01: 2644.0001 + amount: + 2025-10-01: 8 + - threshold: + 2025-10-01: 3261.0001 + amount: + 2025-10-01: 9 + - threshold: + 2025-10-01: 3789.0001 + amount: + 2025-10-01: 10 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_20.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_20.yaml new file mode 100644 index 00000000000..d86a29068e3 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_20.yaml @@ -0,0 +1,60 @@ +description: Missouri assigns a sliding fee tier by monthly gross income for a household of twenty under the Child Care Subsidy program. +# Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is +# the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are +# Transitional Child Care Levels 1-3. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: month + period: month + label: Missouri Child Care Subsidy sliding fee tier for household of twenty + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1395.0001 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 1674.0001 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 1953.0001 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 2232.0001 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 2511.0001 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 2790.0001 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 3068.0001 + amount: + 2025-10-01: 7 + - threshold: + 2025-10-01: 15019.0001 + amount: + 2025-10-01: 8 + - threshold: + 2025-10-01: 18523.0001 + amount: + 2025-10-01: 9 + - threshold: + 2025-10-01: 21527.0001 + amount: + 2025-10-01: 10 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_3.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_3.yaml new file mode 100644 index 00000000000..0ff5e0c4417 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_3.yaml @@ -0,0 +1,60 @@ +description: Missouri assigns a sliding fee tier by monthly gross income for a household of three under the Child Care Subsidy program. +# Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is +# the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are +# Transitional Child Care Levels 1-3. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: month + period: month + label: Missouri Child Care Subsidy sliding fee tier for household of three + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 674.0001 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 808.0001 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 943.0001 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 1078.0001 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 1212.0001 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 1347.0001 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 1482.0001 + amount: + 2025-10-01: 7 + - threshold: + 2025-10-01: 3331.0001 + amount: + 2025-10-01: 8 + - threshold: + 2025-10-01: 4109.0001 + amount: + 2025-10-01: 9 + - threshold: + 2025-10-01: 4775.0001 + amount: + 2025-10-01: 10 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_4.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_4.yaml new file mode 100644 index 00000000000..75b10fdedad --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_4.yaml @@ -0,0 +1,60 @@ +description: Missouri assigns a sliding fee tier by monthly gross income for a household of four under the Child Care Subsidy program. +# Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is +# the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are +# Transitional Child Care Levels 1-3. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: month + period: month + label: Missouri Child Care Subsidy sliding fee tier for household of four + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 802.0001 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 962.0001 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 1122.0001 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 1283.0001 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 1443.0001 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 1604.0001 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 1764.0001 + amount: + 2025-10-01: 7 + - threshold: + 2025-10-01: 4019.0001 + amount: + 2025-10-01: 8 + - threshold: + 2025-10-01: 4956.0001 + amount: + 2025-10-01: 9 + - threshold: + 2025-10-01: 5760.0001 + amount: + 2025-10-01: 10 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_5.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_5.yaml new file mode 100644 index 00000000000..3d10f74ac19 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_5.yaml @@ -0,0 +1,60 @@ +description: Missouri assigns a sliding fee tier by monthly gross income for a household of five under the Child Care Subsidy program. +# Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is +# the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are +# Transitional Child Care Levels 1-3. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: month + period: month + label: Missouri Child Care Subsidy sliding fee tier for household of five + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 930.0001 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 1116.0001 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 1302.0001 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 1488.0001 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 1674.0001 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 1860.0001 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 2046.0001 + amount: + 2025-10-01: 7 + - threshold: + 2025-10-01: 4706.0001 + amount: + 2025-10-01: 8 + - threshold: + 2025-10-01: 5804.0001 + amount: + 2025-10-01: 9 + - threshold: + 2025-10-01: 6746.0001 + amount: + 2025-10-01: 10 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_6.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_6.yaml new file mode 100644 index 00000000000..2ccc5ddef97 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_6.yaml @@ -0,0 +1,60 @@ +description: Missouri assigns a sliding fee tier by monthly gross income for a household of six under the Child Care Subsidy program. +# Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is +# the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are +# Transitional Child Care Levels 1-3. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: month + period: month + label: Missouri Child Care Subsidy sliding fee tier for household of six + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1058.0001 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 1270.0001 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 1482.0001 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 1693.0001 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 1905.0001 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 2117.0001 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 2328.0001 + amount: + 2025-10-01: 7 + - threshold: + 2025-10-01: 5394.0001 + amount: + 2025-10-01: 8 + - threshold: + 2025-10-01: 6652.0001 + amount: + 2025-10-01: 9 + - threshold: + 2025-10-01: 7731.0001 + amount: + 2025-10-01: 10 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_7.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_7.yaml new file mode 100644 index 00000000000..beaea08ac81 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_7.yaml @@ -0,0 +1,60 @@ +description: Missouri assigns a sliding fee tier by monthly gross income for a household of seven under the Child Care Subsidy program. +# Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is +# the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are +# Transitional Child Care Levels 1-3. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: month + period: month + label: Missouri Child Care Subsidy sliding fee tier for household of seven + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1082.0001 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 1299.0001 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 1515.0001 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 1732.0001 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 1948.0001 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 2165.0001 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 2381.0001 + amount: + 2025-10-01: 7 + - threshold: + 2025-10-01: 6081.0001 + amount: + 2025-10-01: 8 + - threshold: + 2025-10-01: 7500.0001 + amount: + 2025-10-01: 9 + - threshold: + 2025-10-01: 8716.0001 + amount: + 2025-10-01: 10 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_8.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_8.yaml new file mode 100644 index 00000000000..55fc26aa407 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_8.yaml @@ -0,0 +1,60 @@ +description: Missouri assigns a sliding fee tier by monthly gross income for a household of eight under the Child Care Subsidy program. +# Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is +# the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are +# Transitional Child Care Levels 1-3. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: month + period: month + label: Missouri Child Care Subsidy sliding fee tier for household of eight + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1106.0001 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 1328.0001 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 1549.0001 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 1770.0001 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 1991.0001 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 2213.0001 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 2434.0001 + amount: + 2025-10-01: 7 + - threshold: + 2025-10-01: 6769.0001 + amount: + 2025-10-01: 8 + - threshold: + 2025-10-01: 8348.0001 + amount: + 2025-10-01: 9 + - threshold: + 2025-10-01: 9702.0001 + amount: + 2025-10-01: 10 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_9.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_9.yaml new file mode 100644 index 00000000000..9594f93ee93 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_9.yaml @@ -0,0 +1,60 @@ +description: Missouri assigns a sliding fee tier by monthly gross income for a household of nine under the Child Care Subsidy program. +# Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is +# the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are +# Transitional Child Care Levels 1-3. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: month + period: month + label: Missouri Child Care Subsidy sliding fee tier for household of nine + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1130.0001 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 1356.0001 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 1582.0001 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 1808.0001 + amount: + 2025-10-01: 4 + - threshold: + 2025-10-01: 2034.0001 + amount: + 2025-10-01: 5 + - threshold: + 2025-10-01: 2261.0001 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 2487.0001 + amount: + 2025-10-01: 7 + - threshold: + 2025-10-01: 7456.0001 + amount: + 2025-10-01: 8 + - threshold: + 2025-10-01: 9196.0001 + amount: + 2025-10-01: 9 + - threshold: + 2025-10-01: 10687.0001 + amount: + 2025-10-01: 10 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/eligibility/child_age_limit.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/eligibility/child_age_limit.yaml new file mode 100644 index 00000000000..de318bb6a5a --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/eligibility/child_age_limit.yaml @@ -0,0 +1,13 @@ +description: Missouri sets this age as the upper limit for an eligible child under the Child Care Subsidy program. +values: + 2025-10-01: 13 + +metadata: + unit: year + period: year + label: Missouri Child Care Subsidy child age limit + reference: + - title: 5 CSR 25-200.050 Definitions (Eligible Child) + href: https://www.law.cornell.edu/regulations/missouri/5-CSR-25-200-050 + - title: Missouri Child Care Subsidy Eligibility Policy Manual 2010.005 + href: https://web.archive.org/web/20211208073247id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/005/00 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/eligibility/special_needs_child_age_limit.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/eligibility/special_needs_child_age_limit.yaml new file mode 100644 index 00000000000..98c396d90c7 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/eligibility/special_needs_child_age_limit.yaml @@ -0,0 +1,11 @@ +description: Missouri sets this age as the upper limit for a child with special needs under the Child Care Subsidy program. +values: + 2025-10-01: 18 + +metadata: + unit: year + period: year + label: Missouri Child Care Subsidy special needs child age limit + reference: + - title: 5 CSR 25-200.050 Definitions (Child with Special Needs) + href: https://www.law.cornell.edu/regulations/missouri/5-CSR-25-200-050 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/eligibility/special_needs_in_school_age_limit.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/eligibility/special_needs_in_school_age_limit.yaml new file mode 100644 index 00000000000..20283e888f3 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/eligibility/special_needs_in_school_age_limit.yaml @@ -0,0 +1,11 @@ +description: Missouri sets this age as the upper limit for a child with special needs who is in school under the Child Care Subsidy program. +values: + 2025-10-01: 19 + +metadata: + unit: year + period: year + label: Missouri Child Care Subsidy special needs in-school child age limit + reference: + - title: 5 CSR 25-200.050 Definitions (Child with Special Needs) + href: https://www.law.cornell.edu/regulations/missouri/5-CSR-25-200-050 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/income/countable_income/sources.yaml new file mode 100644 index 00000000000..71b6fa9520d --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/income/countable_income/sources.yaml @@ -0,0 +1,48 @@ +description: Missouri counts these income sources toward monthly gross income under the Child Care Subsidy program. +values: + 2025-10-01: + - employment_income + - self_employment_income + - farm_operations_income + # Regular monthly survivor / RSDI benefits are counted; only death and + # burial lump sums are excluded (Manual 2010.045.10.05). + - social_security + - pension_income + # PolicyEngine records military retirement separately from pension_income. + - military_retirement_pay + - unemployment_compensation + - workers_compensation + - child_support_received + - alimony_income + - interest_income + - dividend_income + - rental_income + # The student/education-maintenance portion of veterans benefits is excluded + # (Manual 2010.045.10.05) but we don't track that split at the moment, so the + # gross amount is counted. + - veterans_benefits + # + # The Manual lists 45 excluded income types in 2010.045.10.05-.30; they are + # modeled by omission (anything not listed above is not counted). Excluded + # types that DO have a PolicyEngine variable are deliberately left out: + # - ssi (2010.045.10.05) + # - tanf (2010.045.10.05 treats Temporary Assistance as the family's only + # income under the $1/year sliding-fee rule; also omitted to avoid the + # Child Care Subsidy -> TANF circular dependency, handled via + # is_tanf_enrolled in mo_ccs_copay) + # - capital_gains (2010.045.10.10 — treated as a resource, not income) + # Excluded types with no PolicyEngine variable (foster care, adoption + # subsidy, LIHEAP, SNAP value, HUD allowances, tribal funds, restitution + # payments, educational grants/loans, etc.) are excluded automatically. + # + # Provisions we don't model at the moment: + # - 2010.045.10.15 exclusion of a school-attending child's earnings — we + # don't filter income sources by the age of the earner. + +metadata: + unit: list + period: year + label: Missouri Child Care Subsidy countable income sources + reference: + - title: Missouri Child Care Subsidy Eligibility Policy Manual 2010.045.10 Exclusions from Monthly Gross Income + href: https://web.archive.org/web/20211208073807id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/045/10 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/income/fpl_rate/initial_eligibility.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/income/fpl_rate/initial_eligibility.yaml new file mode 100644 index 00000000000..a498d94980f --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/income/fpl_rate/initial_eligibility.yaml @@ -0,0 +1,13 @@ +description: Missouri limits adjusted gross income to this multiple of the federal poverty guideline for new applicants under the Child Care Subsidy program. +values: + 2025-10-01: 1.5 + +metadata: + unit: /1 + period: year + label: Missouri Child Care Subsidy traditional income limit + reference: + - title: Missouri Child Care Subsidy Eligibility Policy Manual 2010.045 Income Eligibility Guidelines + href: https://web.archive.org/web/20211208073807id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/045/10 + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/income/fpl_rate/transitional.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/income/fpl_rate/transitional.yaml new file mode 100644 index 00000000000..000490f32e7 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/income/fpl_rate/transitional.yaml @@ -0,0 +1,13 @@ +description: Missouri limits adjusted gross income to this multiple of the federal poverty guideline for existing families under the Child Care Subsidy program. +values: + 2025-10-01: 2.42 + +metadata: + unit: /1 + period: year + label: Missouri Child Care Subsidy transitional income limit + reference: + - title: 5 CSR 25-200.060 Eligibility and Authorization for Child Care Subsidy + href: https://www.law.cornell.edu/regulations/missouri/5-CSR-25-200-060 + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/group_home/base.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/group_home/base.yaml new file mode 100644 index 00000000000..71d55dcf361 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/group_home/base.yaml @@ -0,0 +1,123 @@ +description: Missouri provides these daily base reimbursement rates to a group home under the Child Care Subsidy program. +metadata: + period: day + unit: currency-USD + label: Missouri Child Care Subsidy group home daily rates + breakdown: + - mo_ccs_region + - mo_ccs_age_group + - mo_ccs_time_category + reference: + - title: 2025 Rates Held Harmless 2.0, Daytime Rates 2025 + href: https://dese.mo.gov/sites/dese/files/media/file/2025/12/2025%20Rates%20Held%20Harmless%202.0.xlsx + +DENSE_URBAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 72 + HALF_TIME: + 2025-10-01: 54 + PART_TIME: + 2025-10-01: 36 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 50 + HALF_TIME: + 2025-10-01: 37.5 + PART_TIME: + 2025-10-01: 25 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 40 + HALF_TIME: + 2025-10-01: 30 + PART_TIME: + 2025-10-01: 20 +METRO: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 59.09 + HALF_TIME: + 2025-10-01: 44.3175 + PART_TIME: + 2025-10-01: 29.545 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 27.6 + HALF_TIME: + 2025-10-01: 20.7 + PART_TIME: + 2025-10-01: 13.8 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 25 + HALF_TIME: + 2025-10-01: 18.75 + PART_TIME: + 2025-10-01: 12.5 +URBAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 59.09 + HALF_TIME: + 2025-10-01: 44.3175 + PART_TIME: + 2025-10-01: 29.545 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 40.7 + HALF_TIME: + 2025-10-01: 30.525 + PART_TIME: + 2025-10-01: 20.35 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 35.75 + HALF_TIME: + 2025-10-01: 26.8125 + PART_TIME: + 2025-10-01: 17.875 +MICROPOLITAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 43.2 + HALF_TIME: + 2025-10-01: 32.4 + PART_TIME: + 2025-10-01: 21.6 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 29.34 + HALF_TIME: + 2025-10-01: 22.005 + PART_TIME: + 2025-10-01: 14.67 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 23.95 + HALF_TIME: + 2025-10-01: 17.9625 + PART_TIME: + 2025-10-01: 11.975 +RURAL: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 59.09 + HALF_TIME: + 2025-10-01: 44.3175 + PART_TIME: + 2025-10-01: 29.545 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 25.5 + HALF_TIME: + 2025-10-01: 19.125 + PART_TIME: + 2025-10-01: 12.75 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 23.95 + HALF_TIME: + 2025-10-01: 17.9625 + PART_TIME: + 2025-10-01: 11.975 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/group_home/special_needs.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/group_home/special_needs.yaml new file mode 100644 index 00000000000..37e1f346b72 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/group_home/special_needs.yaml @@ -0,0 +1,123 @@ +description: Missouri provides these daily reimbursement rates to a group home serving a child with special needs under the Child Care Subsidy program. +metadata: + period: day + unit: currency-USD + label: Missouri Child Care Subsidy group home daily special needs rates + breakdown: + - mo_ccs_region + - mo_ccs_age_group + - mo_ccs_time_category + reference: + - title: 2025 Rates Held Harmless 2.0, Daytime Rates 2025 + href: https://dese.mo.gov/sites/dese/files/media/file/2025/12/2025%20Rates%20Held%20Harmless%202.0.xlsx + +DENSE_URBAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 72 + HALF_TIME: + 2025-10-01: 54 + PART_TIME: + 2025-10-01: 36 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 66 + HALF_TIME: + 2025-10-01: 49.5 + PART_TIME: + 2025-10-01: 33 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 38 + HALF_TIME: + 2025-10-01: 28.5 + PART_TIME: + 2025-10-01: 19 +METRO: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 59.09 + HALF_TIME: + 2025-10-01: 44.3175 + PART_TIME: + 2025-10-01: 29.545 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 66 + HALF_TIME: + 2025-10-01: 49.5 + PART_TIME: + 2025-10-01: 33 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 45 + HALF_TIME: + 2025-10-01: 33.75 + PART_TIME: + 2025-10-01: 22.5 +URBAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 59.09 + HALF_TIME: + 2025-10-01: 44.3175 + PART_TIME: + 2025-10-01: 29.545 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 45 + HALF_TIME: + 2025-10-01: 33.75 + PART_TIME: + 2025-10-01: 22.5 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 41 + HALF_TIME: + 2025-10-01: 30.75 + PART_TIME: + 2025-10-01: 20.5 +MICROPOLITAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 43.2 + HALF_TIME: + 2025-10-01: 32.4 + PART_TIME: + 2025-10-01: 21.6 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 56.75 + HALF_TIME: + 2025-10-01: 42.5625 + PART_TIME: + 2025-10-01: 28.375 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 40 + HALF_TIME: + 2025-10-01: 30 + PART_TIME: + 2025-10-01: 20 +RURAL: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 59.09 + HALF_TIME: + 2025-10-01: 44.3175 + PART_TIME: + 2025-10-01: 29.545 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 40 + HALF_TIME: + 2025-10-01: 30 + PART_TIME: + 2025-10-01: 20 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 40 + HALF_TIME: + 2025-10-01: 30 + PART_TIME: + 2025-10-01: 20 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/licensed_center/base.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/licensed_center/base.yaml new file mode 100644 index 00000000000..5994337fa01 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/licensed_center/base.yaml @@ -0,0 +1,123 @@ +description: Missouri provides these daily base reimbursement rates to a licensed center under the Child Care Subsidy program. +metadata: + period: day + unit: currency-USD + label: Missouri Child Care Subsidy licensed center daily rates + breakdown: + - mo_ccs_region + - mo_ccs_age_group + - mo_ccs_time_category + reference: + - title: 2025 Rates Held Harmless 2.0, Daytime Rates 2025 + href: https://dese.mo.gov/sites/dese/files/media/file/2025/12/2025%20Rates%20Held%20Harmless%202.0.xlsx + +DENSE_URBAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 96 + HALF_TIME: + 2025-10-01: 72 + PART_TIME: + 2025-10-01: 48 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 50 + HALF_TIME: + 2025-10-01: 37.5 + PART_TIME: + 2025-10-01: 25 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 36 + HALF_TIME: + 2025-10-01: 27 + PART_TIME: + 2025-10-01: 18 +METRO: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 71.6 + HALF_TIME: + 2025-10-01: 53.7 + PART_TIME: + 2025-10-01: 35.8 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 37 + HALF_TIME: + 2025-10-01: 27.75 + PART_TIME: + 2025-10-01: 18.5 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 34 + HALF_TIME: + 2025-10-01: 25.5 + PART_TIME: + 2025-10-01: 17 +URBAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 79 + HALF_TIME: + 2025-10-01: 59.25 + PART_TIME: + 2025-10-01: 39.5 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 40 + HALF_TIME: + 2025-10-01: 30 + PART_TIME: + 2025-10-01: 20 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 46.54 + HALF_TIME: + 2025-10-01: 34.905 + PART_TIME: + 2025-10-01: 23.27 +MICROPOLITAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 58.5 + HALF_TIME: + 2025-10-01: 43.875 + PART_TIME: + 2025-10-01: 29.25 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 32.5 + HALF_TIME: + 2025-10-01: 24.375 + PART_TIME: + 2025-10-01: 16.25 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 30 + HALF_TIME: + 2025-10-01: 22.5 + PART_TIME: + 2025-10-01: 15 +RURAL: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 58.5 + HALF_TIME: + 2025-10-01: 43.875 + PART_TIME: + 2025-10-01: 29.25 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 31 + HALF_TIME: + 2025-10-01: 23.25 + PART_TIME: + 2025-10-01: 15.5 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 30.02 + HALF_TIME: + 2025-10-01: 22.515 + PART_TIME: + 2025-10-01: 15.01 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/licensed_center/special_needs.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/licensed_center/special_needs.yaml new file mode 100644 index 00000000000..1ace11baeca --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/licensed_center/special_needs.yaml @@ -0,0 +1,123 @@ +description: Missouri provides these daily reimbursement rates to a licensed center serving a child with special needs under the Child Care Subsidy program. +metadata: + period: day + unit: currency-USD + label: Missouri Child Care Subsidy licensed center daily special needs rates + breakdown: + - mo_ccs_region + - mo_ccs_age_group + - mo_ccs_time_category + reference: + - title: 2025 Rates Held Harmless 2.0, Daytime Rates 2025 + href: https://dese.mo.gov/sites/dese/files/media/file/2025/12/2025%20Rates%20Held%20Harmless%202.0.xlsx + +DENSE_URBAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 96 + HALF_TIME: + 2025-10-01: 72 + PART_TIME: + 2025-10-01: 48 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 71.57 + HALF_TIME: + 2025-10-01: 53.6775 + PART_TIME: + 2025-10-01: 35.785 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 55 + HALF_TIME: + 2025-10-01: 41.25 + PART_TIME: + 2025-10-01: 27.5 +METRO: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 71.6 + HALF_TIME: + 2025-10-01: 53.7 + PART_TIME: + 2025-10-01: 35.8 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 64.66 + HALF_TIME: + 2025-10-01: 48.495 + PART_TIME: + 2025-10-01: 32.33 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 46.18 + HALF_TIME: + 2025-10-01: 34.635 + PART_TIME: + 2025-10-01: 23.09 +URBAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 79 + HALF_TIME: + 2025-10-01: 59.25 + PART_TIME: + 2025-10-01: 39.5 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 40.41 + HALF_TIME: + 2025-10-01: 30.3075 + PART_TIME: + 2025-10-01: 20.205 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 40 + HALF_TIME: + 2025-10-01: 30 + PART_TIME: + 2025-10-01: 20 +MICROPOLITAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 58.5 + HALF_TIME: + 2025-10-01: 43.875 + PART_TIME: + 2025-10-01: 29.25 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 69 + HALF_TIME: + 2025-10-01: 51.75 + PART_TIME: + 2025-10-01: 34.5 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 55 + HALF_TIME: + 2025-10-01: 41.25 + PART_TIME: + 2025-10-01: 27.5 +RURAL: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 58.5 + HALF_TIME: + 2025-10-01: 43.875 + PART_TIME: + 2025-10-01: 29.25 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 55.42 + HALF_TIME: + 2025-10-01: 41.565 + PART_TIME: + 2025-10-01: 27.71 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 53.11 + HALF_TIME: + 2025-10-01: 39.8325 + PART_TIME: + 2025-10-01: 26.555 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/licensed_family_home/base.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/licensed_family_home/base.yaml new file mode 100644 index 00000000000..b6e9028563d --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/licensed_family_home/base.yaml @@ -0,0 +1,123 @@ +description: Missouri provides these daily base reimbursement rates to a licensed family home under the Child Care Subsidy program. +metadata: + period: day + unit: currency-USD + label: Missouri Child Care Subsidy licensed family home daily rates + breakdown: + - mo_ccs_region + - mo_ccs_age_group + - mo_ccs_time_category + reference: + - title: 2025 Rates Held Harmless 2.0, Daytime Rates 2025 + href: https://dese.mo.gov/sites/dese/files/media/file/2025/12/2025%20Rates%20Held%20Harmless%202.0.xlsx + +DENSE_URBAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 70.91 + HALF_TIME: + 2025-10-01: 53.1825 + PART_TIME: + 2025-10-01: 35.455 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 40 + HALF_TIME: + 2025-10-01: 30 + PART_TIME: + 2025-10-01: 20 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 36.5 + HALF_TIME: + 2025-10-01: 27.375 + PART_TIME: + 2025-10-01: 18.25 +METRO: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 59.09 + HALF_TIME: + 2025-10-01: 44.3175 + PART_TIME: + 2025-10-01: 29.545 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 30 + HALF_TIME: + 2025-10-01: 22.5 + PART_TIME: + 2025-10-01: 15 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 28.75 + HALF_TIME: + 2025-10-01: 21.5625 + PART_TIME: + 2025-10-01: 14.375 +URBAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 53 + HALF_TIME: + 2025-10-01: 39.75 + PART_TIME: + 2025-10-01: 26.5 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 34.31 + HALF_TIME: + 2025-10-01: 25.7325 + PART_TIME: + 2025-10-01: 17.155 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 32.3 + HALF_TIME: + 2025-10-01: 24.225 + PART_TIME: + 2025-10-01: 16.15 +MICROPOLITAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 50 + HALF_TIME: + 2025-10-01: 37.5 + PART_TIME: + 2025-10-01: 25 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 28 + HALF_TIME: + 2025-10-01: 21 + PART_TIME: + 2025-10-01: 14 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 23.25 + HALF_TIME: + 2025-10-01: 17.4375 + PART_TIME: + 2025-10-01: 11.625 +RURAL: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 59.09 + HALF_TIME: + 2025-10-01: 44.3175 + PART_TIME: + 2025-10-01: 29.545 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 28.25 + HALF_TIME: + 2025-10-01: 21.1875 + PART_TIME: + 2025-10-01: 14.125 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 29.3 + HALF_TIME: + 2025-10-01: 21.975 + PART_TIME: + 2025-10-01: 14.65 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/licensed_family_home/special_needs.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/licensed_family_home/special_needs.yaml new file mode 100644 index 00000000000..b0f77e7a212 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/licensed_family_home/special_needs.yaml @@ -0,0 +1,123 @@ +description: Missouri provides these daily reimbursement rates to a licensed family home serving a child with special needs under the Child Care Subsidy program. +metadata: + period: day + unit: currency-USD + label: Missouri Child Care Subsidy licensed family home daily special needs rates + breakdown: + - mo_ccs_region + - mo_ccs_age_group + - mo_ccs_time_category + reference: + - title: 2025 Rates Held Harmless 2.0, Daytime Rates 2025 + href: https://dese.mo.gov/sites/dese/files/media/file/2025/12/2025%20Rates%20Held%20Harmless%202.0.xlsx + +DENSE_URBAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 70.91 + HALF_TIME: + 2025-10-01: 53.1825 + PART_TIME: + 2025-10-01: 35.455 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 70 + HALF_TIME: + 2025-10-01: 52.5 + PART_TIME: + 2025-10-01: 35 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 50 + HALF_TIME: + 2025-10-01: 37.5 + PART_TIME: + 2025-10-01: 25 +METRO: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 59.09 + HALF_TIME: + 2025-10-01: 44.3175 + PART_TIME: + 2025-10-01: 29.545 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 35 + HALF_TIME: + 2025-10-01: 26.25 + PART_TIME: + 2025-10-01: 17.5 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 35 + HALF_TIME: + 2025-10-01: 26.25 + PART_TIME: + 2025-10-01: 17.5 +URBAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 53 + HALF_TIME: + 2025-10-01: 39.75 + PART_TIME: + 2025-10-01: 26.5 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 36 + HALF_TIME: + 2025-10-01: 27 + PART_TIME: + 2025-10-01: 18 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 36 + HALF_TIME: + 2025-10-01: 27 + PART_TIME: + 2025-10-01: 18 +MICROPOLITAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 50 + HALF_TIME: + 2025-10-01: 37.5 + PART_TIME: + 2025-10-01: 25 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 50 + HALF_TIME: + 2025-10-01: 37.5 + PART_TIME: + 2025-10-01: 25 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 50 + HALF_TIME: + 2025-10-01: 37.5 + PART_TIME: + 2025-10-01: 25 +RURAL: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 59.09 + HALF_TIME: + 2025-10-01: 44.3175 + PART_TIME: + 2025-10-01: 29.545 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 40.41 + HALF_TIME: + 2025-10-01: 30.3075 + PART_TIME: + 2025-10-01: 20.205 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 34.64 + HALF_TIME: + 2025-10-01: 25.98 + PART_TIME: + 2025-10-01: 17.32 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/registered_center/base.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/registered_center/base.yaml new file mode 100644 index 00000000000..f6734b438da --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/registered_center/base.yaml @@ -0,0 +1,123 @@ +description: Missouri provides these daily base reimbursement rates to a registered center under the Child Care Subsidy program. +metadata: + period: day + unit: currency-USD + label: Missouri Child Care Subsidy registered center daily rates + breakdown: + - mo_ccs_region + - mo_ccs_age_group + - mo_ccs_time_category + reference: + - title: 2025 Rates Held Harmless 2.0, Daytime Rates 2025 + href: https://dese.mo.gov/sites/dese/files/media/file/2025/12/2025%20Rates%20Held%20Harmless%202.0.xlsx + +DENSE_URBAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 84 + HALF_TIME: + 2025-10-01: 63 + PART_TIME: + 2025-10-01: 42 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 40.25 + HALF_TIME: + 2025-10-01: 30.1875 + PART_TIME: + 2025-10-01: 20.125 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 34.24 + HALF_TIME: + 2025-10-01: 25.68 + PART_TIME: + 2025-10-01: 17.12 +METRO: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 70 + HALF_TIME: + 2025-10-01: 52.5 + PART_TIME: + 2025-10-01: 35 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 30.27 + HALF_TIME: + 2025-10-01: 22.7025 + PART_TIME: + 2025-10-01: 15.135 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 26 + HALF_TIME: + 2025-10-01: 19.5 + PART_TIME: + 2025-10-01: 13 +URBAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 70 + HALF_TIME: + 2025-10-01: 52.5 + PART_TIME: + 2025-10-01: 35 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 36.45 + HALF_TIME: + 2025-10-01: 27.3375 + PART_TIME: + 2025-10-01: 18.225 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 26 + HALF_TIME: + 2025-10-01: 19.5 + PART_TIME: + 2025-10-01: 13 +MICROPOLITAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 70 + HALF_TIME: + 2025-10-01: 52.5 + PART_TIME: + 2025-10-01: 35 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 31.56 + HALF_TIME: + 2025-10-01: 23.67 + PART_TIME: + 2025-10-01: 15.78 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 31.25 + HALF_TIME: + 2025-10-01: 23.4375 + PART_TIME: + 2025-10-01: 15.625 +RURAL: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 70 + HALF_TIME: + 2025-10-01: 52.5 + PART_TIME: + 2025-10-01: 35 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 30.27 + HALF_TIME: + 2025-10-01: 22.7025 + PART_TIME: + 2025-10-01: 15.135 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 30.8 + HALF_TIME: + 2025-10-01: 23.1 + PART_TIME: + 2025-10-01: 15.4 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/registered_center/special_needs.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/registered_center/special_needs.yaml new file mode 100644 index 00000000000..987d01a33f9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/registered_center/special_needs.yaml @@ -0,0 +1,123 @@ +description: Missouri provides these daily reimbursement rates to a registered center serving a child with special needs under the Child Care Subsidy program. +metadata: + period: day + unit: currency-USD + label: Missouri Child Care Subsidy registered center daily special needs rates + breakdown: + - mo_ccs_region + - mo_ccs_age_group + - mo_ccs_time_category + reference: + - title: 2025 Rates Held Harmless 2.0, Daytime Rates 2025 + href: https://dese.mo.gov/sites/dese/files/media/file/2025/12/2025%20Rates%20Held%20Harmless%202.0.xlsx + +DENSE_URBAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 84 + HALF_TIME: + 2025-10-01: 63 + PART_TIME: + 2025-10-01: 42 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 68 + HALF_TIME: + 2025-10-01: 51 + PART_TIME: + 2025-10-01: 34 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 55.43 + HALF_TIME: + 2025-10-01: 41.5725 + PART_TIME: + 2025-10-01: 27.715 +METRO: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 70 + HALF_TIME: + 2025-10-01: 52.5 + PART_TIME: + 2025-10-01: 35 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 53 + HALF_TIME: + 2025-10-01: 39.75 + PART_TIME: + 2025-10-01: 26.5 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 40 + HALF_TIME: + 2025-10-01: 30 + PART_TIME: + 2025-10-01: 20 +URBAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 70 + HALF_TIME: + 2025-10-01: 52.5 + PART_TIME: + 2025-10-01: 35 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 39.26 + HALF_TIME: + 2025-10-01: 29.445 + PART_TIME: + 2025-10-01: 19.63 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 30.8 + HALF_TIME: + 2025-10-01: 23.1 + PART_TIME: + 2025-10-01: 15.4 +MICROPOLITAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 70 + HALF_TIME: + 2025-10-01: 52.5 + PART_TIME: + 2025-10-01: 35 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 60.3 + HALF_TIME: + 2025-10-01: 45.225 + PART_TIME: + 2025-10-01: 30.15 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 37 + HALF_TIME: + 2025-10-01: 27.75 + PART_TIME: + 2025-10-01: 18.5 +RURAL: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 70 + HALF_TIME: + 2025-10-01: 52.5 + PART_TIME: + 2025-10-01: 35 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 38.1 + HALF_TIME: + 2025-10-01: 28.575 + PART_TIME: + 2025-10-01: 19.05 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 32 + HALF_TIME: + 2025-10-01: 24 + PART_TIME: + 2025-10-01: 16 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/six_or_fewer/base.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/six_or_fewer/base.yaml new file mode 100644 index 00000000000..3ac83d943b2 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/six_or_fewer/base.yaml @@ -0,0 +1,123 @@ +description: Missouri provides these daily base reimbursement rates to a license-exempt provider caring for six or fewer children under the Child Care Subsidy program. +metadata: + period: day + unit: currency-USD + label: Missouri Child Care Subsidy six or fewer daily rates + breakdown: + - mo_ccs_region + - mo_ccs_age_group + - mo_ccs_time_category + reference: + - title: 2025 Rates Held Harmless 2.0, Daytime Rates 2025 + href: https://dese.mo.gov/sites/dese/files/media/file/2025/12/2025%20Rates%20Held%20Harmless%202.0.xlsx + +DENSE_URBAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 49.66 + HALF_TIME: + 2025-10-01: 37.245 + PART_TIME: + 2025-10-01: 24.83 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 28 + HALF_TIME: + 2025-10-01: 21 + PART_TIME: + 2025-10-01: 14 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 25.45 + HALF_TIME: + 2025-10-01: 19.0875 + PART_TIME: + 2025-10-01: 12.725 +METRO: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 41.36 + HALF_TIME: + 2025-10-01: 31.02 + PART_TIME: + 2025-10-01: 20.68 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 21 + HALF_TIME: + 2025-10-01: 15.75 + PART_TIME: + 2025-10-01: 10.5 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 20.2 + HALF_TIME: + 2025-10-01: 15.15 + PART_TIME: + 2025-10-01: 10.1 +URBAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 36.96 + HALF_TIME: + 2025-10-01: 27.72 + PART_TIME: + 2025-10-01: 18.48 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 24.02 + HALF_TIME: + 2025-10-01: 18.015 + PART_TIME: + 2025-10-01: 12.01 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 22.75 + HALF_TIME: + 2025-10-01: 17.0625 + PART_TIME: + 2025-10-01: 11.375 +MICROPOLITAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 35 + HALF_TIME: + 2025-10-01: 26.25 + PART_TIME: + 2025-10-01: 17.5 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 19.6 + HALF_TIME: + 2025-10-01: 14.7 + PART_TIME: + 2025-10-01: 9.8 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 16.35 + HALF_TIME: + 2025-10-01: 12.2625 + PART_TIME: + 2025-10-01: 8.175 +RURAL: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 41.6 + HALF_TIME: + 2025-10-01: 31.2 + PART_TIME: + 2025-10-01: 20.8 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 19.78 + HALF_TIME: + 2025-10-01: 14.835 + PART_TIME: + 2025-10-01: 9.89 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 16.8 + HALF_TIME: + 2025-10-01: 12.6 + PART_TIME: + 2025-10-01: 8.4 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/six_or_fewer/special_needs.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/six_or_fewer/special_needs.yaml new file mode 100644 index 00000000000..20af710a67a --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/rates/six_or_fewer/special_needs.yaml @@ -0,0 +1,123 @@ +description: Missouri provides these daily reimbursement rates to a license-exempt provider caring for six or fewer children serving a child with special needs under the Child Care Subsidy program. +metadata: + period: day + unit: currency-USD + label: Missouri Child Care Subsidy six or fewer daily special needs rates + breakdown: + - mo_ccs_region + - mo_ccs_age_group + - mo_ccs_time_category + reference: + - title: 2025 Rates Held Harmless 2.0, Daytime Rates 2025 + href: https://dese.mo.gov/sites/dese/files/media/file/2025/12/2025%20Rates%20Held%20Harmless%202.0.xlsx + +DENSE_URBAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 49.66 + HALF_TIME: + 2025-10-01: 37.245 + PART_TIME: + 2025-10-01: 24.83 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 49 + HALF_TIME: + 2025-10-01: 36.75 + PART_TIME: + 2025-10-01: 24.5 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 35 + HALF_TIME: + 2025-10-01: 26.25 + PART_TIME: + 2025-10-01: 17.5 +METRO: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 41.36 + HALF_TIME: + 2025-10-01: 31.02 + PART_TIME: + 2025-10-01: 20.68 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 24.5 + HALF_TIME: + 2025-10-01: 18.375 + PART_TIME: + 2025-10-01: 12.25 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 24.5 + HALF_TIME: + 2025-10-01: 18.375 + PART_TIME: + 2025-10-01: 12.25 +URBAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 36.96 + HALF_TIME: + 2025-10-01: 27.72 + PART_TIME: + 2025-10-01: 18.48 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 25.2 + HALF_TIME: + 2025-10-01: 18.9 + PART_TIME: + 2025-10-01: 12.6 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 25.2 + HALF_TIME: + 2025-10-01: 18.9 + PART_TIME: + 2025-10-01: 12.6 +MICROPOLITAN: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 35 + HALF_TIME: + 2025-10-01: 26.25 + PART_TIME: + 2025-10-01: 17.5 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 35 + HALF_TIME: + 2025-10-01: 26.25 + PART_TIME: + 2025-10-01: 17.5 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 35 + HALF_TIME: + 2025-10-01: 26.25 + PART_TIME: + 2025-10-01: 17.5 +RURAL: + INFANT_TODDLER: + FULL_TIME: + 2025-10-01: 41.6 + HALF_TIME: + 2025-10-01: 31.2 + PART_TIME: + 2025-10-01: 20.8 + PRESCHOOL: + FULL_TIME: + 2025-10-01: 28.287 + HALF_TIME: + 2025-10-01: 21.2152 + PART_TIME: + 2025-10-01: 14.1435 + SCHOOL_AGE: + FULL_TIME: + 2025-10-01: 24.248 + HALF_TIME: + 2025-10-01: 18.186 + PART_TIME: + 2025-10-01: 12.124 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/region/region_1_counties.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/region/region_1_counties.yaml new file mode 100644 index 00000000000..b99beee4286 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/region/region_1_counties.yaml @@ -0,0 +1,18 @@ +description: Missouri assigns these counties to Region 1 dense urban for provider payment rates under the Child Care Subsidy program. +values: + 2025-10-01: + - CLAY_COUNTY_MO + - JACKSON_COUNTY_MO + - JEFFERSON_COUNTY_MO + - PLATTE_COUNTY_MO + - ST_CHARLES_COUNTY_MO + - ST_LOUIS_CITY_MO + - ST_LOUIS_COUNTY_MO + +metadata: + unit: list + period: year + label: Missouri Child Care Subsidy Region 1 dense urban counties + reference: + - title: 2025 Rates Held Harmless 2.0, Breakdown Of Counties + href: https://dese.mo.gov/sites/dese/files/media/file/2025/12/2025%20Rates%20Held%20Harmless%202.0.xlsx diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/region/region_2_counties.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/region/region_2_counties.yaml new file mode 100644 index 00000000000..2ab23d0d83d --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/region/region_2_counties.yaml @@ -0,0 +1,28 @@ +description: Missouri assigns these counties to Region 2 metro for provider payment rates under the Child Care Subsidy program. +values: + 2025-10-01: + - ANDREW_COUNTY_MO + - BATES_COUNTY_MO + - BOLLINGER_COUNTY_MO + - CALDWELL_COUNTY_MO + - CALLAWAY_COUNTY_MO + - CLINTON_COUNTY_MO + - COOPER_COUNTY_MO + - DALLAS_COUNTY_MO + - FRANKLIN_COUNTY_MO + - HOWARD_COUNTY_MO + - LAFAYETTE_COUNTY_MO + - LINCOLN_COUNTY_MO + - MONITEAU_COUNTY_MO + - OSAGE_COUNTY_MO + - POLK_COUNTY_MO + - WARREN_COUNTY_MO + - WEBSTER_COUNTY_MO + +metadata: + unit: list + period: year + label: Missouri Child Care Subsidy Region 2 metro counties + reference: + - title: 2025 Rates Held Harmless 2.0, Breakdown Of Counties + href: https://dese.mo.gov/sites/dese/files/media/file/2025/12/2025%20Rates%20Held%20Harmless%202.0.xlsx diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/region/region_3_counties.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/region/region_3_counties.yaml new file mode 100644 index 00000000000..1c4f1a9eb75 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/region/region_3_counties.yaml @@ -0,0 +1,21 @@ +description: Missouri assigns these counties to Region 3 urban for provider payment rates under the Child Care Subsidy program. +values: + 2025-10-01: + - BOONE_COUNTY_MO + - BUCHANAN_COUNTY_MO + - CAPE_GIRARDEAU_COUNTY_MO + - CASS_COUNTY_MO + - CHRISTIAN_COUNTY_MO + - COLE_COUNTY_MO + - GREENE_COUNTY_MO + - JASPER_COUNTY_MO + - NEWTON_COUNTY_MO + - RAY_COUNTY_MO + +metadata: + unit: list + period: year + label: Missouri Child Care Subsidy Region 3 urban counties + reference: + - title: 2025 Rates Held Harmless 2.0, Breakdown Of Counties + href: https://dese.mo.gov/sites/dese/files/media/file/2025/12/2025%20Rates%20Held%20Harmless%202.0.xlsx diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/region/region_4_counties.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/region/region_4_counties.yaml new file mode 100644 index 00000000000..03a26c24f7f --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/region/region_4_counties.yaml @@ -0,0 +1,33 @@ +description: Missouri assigns these counties to Region 4 micropolitan for provider payment rates under the Child Care Subsidy program. +values: + 2025-10-01: + - ADAIR_COUNTY_MO + - AUDRAIN_COUNTY_MO + - BUTLER_COUNTY_MO + - DUNKLIN_COUNTY_MO + - HOWELL_COUNTY_MO + - JOHNSON_COUNTY_MO + - LACLEDE_COUNTY_MO + - MARION_COUNTY_MO + - MISSISSIPPI_COUNTY_MO + - NODAWAY_COUNTY_MO + - PETTIS_COUNTY_MO + - PHELPS_COUNTY_MO + - PULASKI_COUNTY_MO + - RALLS_COUNTY_MO + - RANDOLPH_COUNTY_MO + - SCHUYLER_COUNTY_MO + - SCOTT_COUNTY_MO + - STODDARD_COUNTY_MO + - STONE_COUNTY_MO + - ST_FRANCOIS_COUNTY_MO + - TANEY_COUNTY_MO + - VERNON_COUNTY_MO + +metadata: + unit: list + period: year + label: Missouri Child Care Subsidy Region 4 micropolitan counties + reference: + - title: 2025 Rates Held Harmless 2.0, Breakdown Of Counties + href: https://dese.mo.gov/sites/dese/files/media/file/2025/12/2025%20Rates%20Held%20Harmless%202.0.xlsx diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/time_category/hours.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/time_category/hours.yaml new file mode 100644 index 00000000000..df583d5f832 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/time_category/hours.yaml @@ -0,0 +1,27 @@ +description: Missouri determines the care time unit from weekly hours of care under the Child Care Subsidy program. +# Amount is the MOCCSTimeCategory enum index: 0 = FULL_TIME, 1 = HALF_TIME, +# 2 = PART_TIME. Part time is one half hour up to 3 hours of care, half time is +# 3 up to 5 hours, and full time is 5 up to 12 hours (chart footnotes). +metadata: + type: single_amount + threshold_unit: hour + amount_unit: /1 + period: year + label: Missouri Child Care Subsidy care time unit by hours + reference: + - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart + href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 3 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 5 + amount: + 2025-10-01: 0 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/transitional/funding_rate.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/transitional/funding_rate.yaml new file mode 100644 index 00000000000..f373ddf808c --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/transitional/funding_rate.yaml @@ -0,0 +1,34 @@ +description: Missouri funds this share of the base reimbursement rate by federal poverty guideline ratio under the Child Care Subsidy program. +# Traditional families (at or below 150% FPL) are funded at the full base rate. +# Transitional Child Care families are funded at a reduced share: +# Level 1 (above 150% up to 185%) = 80%, Level 2 (above 185% up to 215%) = 60%, +# Level 3 (above 215% up to 242%) = 50%. +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: /1 + period: year + label: Missouri Child Care Subsidy transitional funding rate + reference: + - title: Missouri Child Care Subsidy Eligibility Policy Manual 2010.045 Income Eligibility Guidelines + href: https://web.archive.org/web/20211208073807id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/045/10 + - title: 5 CSR 25-200.060 Eligibility and Authorization for Child Care Subsidy (Transitional Child Care) + href: https://www.law.cornell.edu/regulations/missouri/5-CSR-25-200-060 + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 1.5001 + amount: + 2025-10-01: 0.8 + - threshold: + 2025-10-01: 1.8501 + amount: + 2025-10-01: 0.6 + - threshold: + 2025-10-01: 2.1501 + amount: + 2025-10-01: 0.5 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 83ef1f1f1a0..1a02d8cda1c 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -460,7 +460,7 @@ programs: category: Benefits agency: HHS status: partial - coverage: AK, AR, AL, CA, CO, CT, DE, DC, FL, HI, IA, ID, IL, IN, KS, KY, MA, MD, ME, NC, NH, NJ, PA, RI, SC, TX, VA, VT, WA, WV + coverage: AK, AR, AL, CA, CO, CT, DE, DC, FL, HI, IA, ID, IL, IN, KS, KY, MA, MD, ME, MO, NC, NH, NJ, PA, RI, SC, TX, VA, VT, WA, WV state_implementations: - state: AK status: complete @@ -554,6 +554,12 @@ programs: name: Maine CCAP full_name: Maine Child Care Affordability Program variable: me_ccap + - state: MO + status: complete + name: Missouri CCS + full_name: Missouri Child Care Subsidy + variable: mo_ccs + parameter_prefix: gov.states.mo.dese.ccs - state: IA status: complete name: Iowa CCA diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/copay/mo_ccs_copay.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/copay/mo_ccs_copay.yaml new file mode 100644 index 00000000000..7a5f36d050c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/copay/mo_ccs_copay.yaml @@ -0,0 +1,482 @@ +# MO CCS sliding fee (copay) tests +# mo_ccs_copay is SPMUnit, MONTH. +# Tier looked up from copay/tier/size_N by monthly countable income; daily fee +# from copay/daily_fee/{full,half,part}_unit by tier and the child's time unit; +# monthly fee = sum over paying children of daily_fee * attending days. +# A paying child is an eligible, non-disabled child attending care (days > 0). +# $1/year minimum (1/12 per month) applies when only-TANF or income < 25% SMI. +# +# 2025 values used below (test period 2025-01): +# FPG size 2 = 21,150/yr. MO SMI base 2025 = 105,825. +# SMI size 2 = 105,825 * 0.68 = 71,961/yr; 25% / 12 = $1,499.19/mo floor. +# Size 2 tier bands (monthly income): tier 7 is >$1,199 up to $2,644. +# Size 2 tier 8 (TCC1) is >$2,644. +# Daily full/half/part fee: tier 7 = $5.00/$3.25/$2.25; tier 8 = $7.50/$3.75/$2.50. + +- name: Case 1, full time child in a paid tier. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # Countable income = 24,000 / 12 = 2,000 > SMI floor 1,499.19 (not $1/yr). + # Size 2: 1,199 < 2,000 <= 2,644 -> tier 7. Full unit fee = $5/day. + # $5 * 20 days * 1 child = $100/mo. + mo_ccs_copay: 100 + +- name: Case 2, half time child in the same paid tier. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 4 + childcare_attending_days_per_month: 20 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # Tier 7 half unit fee = $3.25/day. $3.25 * 20 * 1 = $65/mo. + mo_ccs_copay: 65 + +- name: Case 3, part time child in the same paid tier. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 2 + childcare_attending_days_per_month: 20 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # Tier 7 part unit fee = $2.25/day. $2.25 * 20 * 1 = $45/mo. + mo_ccs_copay: 45 + +- name: Case 4, transitional family in TCC1 copay row. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 33_600 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # Countable income = 33,600 / 12 = 2,800 > 2,644 -> tier 8 (TCC1). + # Full unit fee = $7.50/day. $7.50 * 20 * 1 = $150/mo. + mo_ccs_copay: 150 + +- name: Case 5, TANF-enrolled family pays only the minimum fee. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: MO + output: + # TANF enrolled -> $1/year minimum = 1/12 = $0.0833/mo regardless of income. + mo_ccs_copay: 0.0833 + +- name: Case 6, very low income below 25 percent SMI pays only the minimum fee. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 12_000 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # Countable income = 12,000 / 12 = 1,000 < SMI floor 1,499.19 -> $1/yr min. + # 1 / 12 = $0.0833/mo. + mo_ccs_copay: 0.0833 + +- name: Case 7, special-needs child is not charged a fee. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + is_disabled: true + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # Disabled child excluded from the fee; no other paying child -> $0. + mo_ccs_copay: 0 + +- name: Case 8, two children both charged the daily fee. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + person3: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: MO + output: + # Size 3 family. Countable income = 36,000 / 12 = 3,000. + # Size 3 SMI = 105,825 * 0.84 = 88,893; 25% / 12 = $1,852/mo floor; 3,000 above. + # Size 3 tier bands put 3,000 in the top traditional tier 7 (full fee $5/day). + # Two full-time children: $5 * 20 * 2 = $200/mo. + mo_ccs_copay: 200 + +- name: Case 9, income at top of traditional tier 7 boundary. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 31_728 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # Countable income = 31,728 / 12 = 2,644 = top of size-2 tier 7 + # (band > 1,199 up to 2,644). 2,644 not > 2,644.0001 -> tier 7 (not tier 8). + # Full unit fee tier 7 = $5/day. $5 * 20 * 1 = $100/mo. + mo_ccs_copay: 100 + +- name: Case 10, income just above the tier 7 boundary moves to tier 8. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 31_740 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # Countable income = 31,740 / 12 = 2,645 > 2,644.0001 -> tier 8 (TCC1). + # Full unit fee tier 8 = $7.50/day. $7.50 * 20 * 1 = $150/mo. + mo_ccs_copay: 150 + +- name: Case 11, income just below the 25 percent SMI floor pays only the minimum. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 17_988 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # Countable income = 17,988 / 12 = 1,499 < SMI floor 1,499.19 -> $1/yr min. + # 1 / 12 = $0.0833/mo. + mo_ccs_copay: 0.0833 + +- name: Case 12, income just above the 25 percent SMI floor pays the tier fee. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # Countable income = 18,000 / 12 = 1,500 > SMI floor 1,499.19 -> not minimum. + # Size 2: 1,199 < 1,500 <= 2,644 -> tier 7. Full fee $5/day * 20 = $100/mo. + mo_ccs_copay: 100 + +- name: Case 13, household of twenty uses the top copay size column. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 48_000 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + person3: + age: 38 + person4: + age: 30 + person5: + age: 30 + person6: + age: 30 + person7: + age: 30 + person8: + age: 30 + person9: + age: 30 + person10: + age: 30 + person11: + age: 30 + person12: + age: 30 + person13: + age: 30 + person14: + age: 30 + person15: + age: 30 + person16: + age: 30 + person17: + age: 30 + person18: + age: 30 + person19: + age: 30 + person20: + age: 30 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: + [ + person1, + person2, + person3, + person4, + person5, + person6, + person7, + person8, + person9, + person10, + person11, + person12, + person13, + person14, + person15, + person16, + person17, + person18, + person19, + person20, + ] + households: + household: + members: + [ + person1, + person2, + person3, + person4, + person5, + person6, + person7, + person8, + person9, + person10, + person11, + person12, + person13, + person14, + person15, + person16, + person17, + person18, + person19, + person20, + ] + state_code: MO + output: + # Size 20 uses the size_20 tier column. Countable income = 48,000 / 12 = + # 4,000/mo. Size-20 SMI = 105,825 * 1.74 = 184,135.50; 25% / 12 = $3,836.16 + # floor; 4,000 > floor -> not minimum. Size-20 tier 7 band is > 3,068 up to + # 15,019 -> tier 7. Only person2 is a paying child (others have no care + # days). Full fee $5/day * 20 days * 1 child = $100/mo. + mo_ccs_copay: 100 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.yaml new file mode 100644 index 00000000000..b89c08a36dc --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.yaml @@ -0,0 +1,129 @@ +# MO CCS activity (need for care) eligibility tests +# mo_ccs_activity_eligible is SPMUnit, MONTH. +# Requires at least one tax-unit head/spouse, and every head/spouse to have a +# qualifying activity: employment (weekly_hours_worked > 0) or full-time study. +# We don't track activity-hours verification at the moment, so any positive +# activity is treated as meeting the need (Manual 2010.050.05-.20). + +- name: Case 1, working parent meets activity requirement. + period: 2025-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 30 + person2: + age: 5 + 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: MO + output: + mo_ccs_activity_eligible: true + +- name: Case 2, parent with no activity fails. + period: 2025-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 0 + is_full_time_student: false + person2: + age: 5 + 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: MO + output: + mo_ccs_activity_eligible: false + +- name: Case 3, full-time student parent meets requirement. + period: 2025-01 + input: + people: + person1: + age: 22 + weekly_hours_worked: 0 + is_full_time_student: true + 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: MO + output: + mo_ccs_activity_eligible: true + +- name: Case 4, two-parent unit where one parent has no activity fails. + period: 2025-01 + input: + people: + person1: + age: 35 + weekly_hours_worked: 40 + person2: + age: 33 + weekly_hours_worked: 0 + is_full_time_student: false + person3: + age: 5 + 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: MO + output: + # Every head/spouse must have an activity; the non-working spouse fails it. + mo_ccs_activity_eligible: false + +- name: Case 5, unit with only dependents does not vacuously pass. + period: 2025-01 + input: + people: + person1: + age: 16 + is_tax_unit_dependent: true + person2: + age: 10 + 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: MO + output: + # No head/spouse present -> not eligible. + mo_ccs_activity_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible.yaml new file mode 100644 index 00000000000..e5c79cd674b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible.yaml @@ -0,0 +1,162 @@ +# MO CCS overall eligibility tests +# mo_ccs_eligible is SPMUnit, MONTH. +# Requires: an eligible child AND income eligible AND asset eligible AND +# (activity eligible OR protective services). State scope is MO. + +- name: Case 1, eligible working family in MO. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + immigration_status: CITIZEN + weekly_hours_worked: 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: MO + output: + mo_ccs_eligible: true + +- name: Case 2, ineligible due to income above 150 percent FPL. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 60_000 + immigration_status: CITIZEN + weekly_hours_worked: 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: MO + output: + # 60,000/yr = 5,000/mo > 2,643.75 (150% FPL size 2) -> income ineligible. + mo_ccs_eligible: false + +- name: Case 3, ineligible with no eligible child. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 20_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: MO + output: + mo_ccs_eligible: false + +- name: Case 4, ineligible due to no activity. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 20_000 + immigration_status: CITIZEN + weekly_hours_worked: 0 + is_full_time_student: false + 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: MO + output: + # No work, not a student, no protective pathway -> ineligible. + mo_ccs_eligible: false + +- name: Case 5, protective services family with no activity is eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 20_000 + immigration_status: CITIZEN + weekly_hours_worked: 0 + is_full_time_student: 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: MO + output: + # Foster child waives the activity requirement; income still eligible. + mo_ccs_eligible: true + +- name: Case 6, non-MO family ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 20_000 + immigration_status: CITIZEN + weekly_hours_worked: 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: KS + output: + mo_ccs_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible_child.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible_child.yaml new file mode 100644 index 00000000000..d4d8f36551c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible_child.yaml @@ -0,0 +1,196 @@ +# MO CCS eligible child tests +# mo_ccs_eligible_child is Person, MONTH. +# Eligible if age < 13 (or < 18, or < 19 if in K-12 school, when disabled), +# AND a CCDF immigration-eligible child AND a tax-unit dependent. + +- name: Case 1, eligible child under 13. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + mo_ccs_eligible_child: [false, true] + +- name: Case 2, child age 12 at boundary eligible. + period: 2025-01 + input: + people: + person1: + age: 40 + person2: + age: 12 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + mo_ccs_eligible_child: [false, true] + +- name: Case 3, child age 13 ineligible without disability. + period: 2025-01 + input: + people: + person1: + age: 35 + person2: + age: 13 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # Age 13 not < 13 limit -> ineligible. + mo_ccs_eligible_child: [false, false] + +- name: Case 4, disabled child age 15 in school eligible. + period: 2025-01 + input: + people: + person1: + age: 40 + person2: + age: 15 + is_tax_unit_dependent: true + is_disabled: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # Disabled, age 15 in K-12 school -> limit 19 -> eligible. + mo_ccs_eligible_child: [false, true] + +- name: Case 5, disabled child age 19 ineligible. + period: 2025-01 + input: + people: + person1: + age: 45 + person2: + age: 19 + is_tax_unit_dependent: true + is_disabled: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # Age 19 not < 19 -> ineligible even when disabled. + mo_ccs_eligible_child: [false, false] + +- name: Case 6, undocumented child ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: UNDOCUMENTED + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + mo_ccs_eligible_child: [false, false] + +- name: Case 7, non-dependent child ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 8 + is_tax_unit_dependent: false + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # Child must reside with caretaker in the EU (tax-unit dependent proxy). + mo_ccs_eligible_child: [false, false] + +- name: Case 8, disabled child age 18 not in school is ineligible. + period: 2025-01 + input: + people: + person1: + age: 45 + person2: + age: 18 + is_tax_unit_dependent: true + is_disabled: true + is_in_k12_school: false + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # Disabled, not in school -> limit 18; age 18 not < 18 -> ineligible. + mo_ccs_eligible_child: [false, false] + +- name: Case 9, disabled child age 18 in school is eligible. + period: 2025-01 + input: + people: + person1: + age: 45 + person2: + age: 18 + is_tax_unit_dependent: true + is_disabled: true + is_in_k12_school: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # Disabled, in school -> limit 19; age 18 < 19 -> eligible. + mo_ccs_eligible_child: [false, true] diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_income_eligible.yaml new file mode 100644 index 00000000000..db82944fc70 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_income_eligible.yaml @@ -0,0 +1,219 @@ +# MO CCS income eligibility tests +# mo_ccs_income_eligible is SPMUnit, MONTH. +# Compares mo_ccs_adjusted_income (monthly) to monthly_fpg * rate. +# Traditional (new applicants): rate = 1.50. +# Transitional (mo_ccs_enrolled): rate = 2.42. +# 2025 FPG (contiguous US): family of 2 = $21,150. +# 150% FPL = $31,725/yr = $2,643.75/mo. +# 242% FPL = $51,183/yr = $4,265.25/mo. + +- name: Case 1, income below 150 percent FPL is eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # Monthly income = 30,000 / 12 = 2,500 <= 2,643.75 -> eligible. + mo_ccs_income_eligible: true + +- name: Case 2, income exactly at 150 percent FPL is eligible. + period: 2025-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 31_725 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # Monthly income = 31,725 / 12 = 2,643.75 = 150% FPL limit -> <= -> eligible. + mo_ccs_income_eligible: true + +- name: Case 3, income above 150 percent FPL ineligible for new applicant. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # Monthly income = 36,000 / 12 = 3,000 > 2,643.75 -> ineligible (traditional). + mo_ccs_income_eligible: false + +- name: Case 4, existing family above 150 percent but below 242 percent is eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + mo_ccs_enrolled: true + households: + household: + members: [person1, person2] + state_code: MO + output: + # Enrolled -> transitional limit 2.42 * monthly_fpg = 4,265.25. + # Monthly income = 3,000 <= 4,265.25 -> eligible. + mo_ccs_income_eligible: true + +- name: Case 5, existing family above 242 percent FPL is ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 54_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + mo_ccs_enrolled: true + households: + household: + members: [person1, person2] + state_code: MO + output: + # Monthly income = 54,000 / 12 = 4,500 > 4,265.25 -> ineligible. + mo_ccs_income_eligible: false + +- name: Case 6, health insurance premiums reduce adjusted income below the limit. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + health_insurance_premiums: 6_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # Countable = 3,000/mo; premiums = 500/mo; adjusted = 2,500 <= 2,643.75 + # -> eligible (only medical premiums are deducted). + mo_ccs_income_eligible: true + +- name: Case 7, zero income family eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + mo_ccs_income_eligible: true + +- name: Case 8, new applicant just above 150 percent FPL is ineligible. + period: 2025-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 31_737 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # Monthly income = 31,737 / 12 = 2,644.75 > 2,643.75 (150% FPL size 2) + # -> just over the traditional limit -> ineligible. + mo_ccs_income_eligible: false + +- name: Case 9, existing family exactly at 242 percent FPL is eligible. + period: 2025-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 51_183 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + mo_ccs_enrolled: true + households: + household: + members: [person1, person2] + state_code: MO + output: + # Monthly income = 51,183 / 12 = 4,265.25 = 242% FPL limit -> <= -> eligible. + mo_ccs_income_eligible: true + +- name: Case 10, existing family just above 242 percent FPL is ineligible. + period: 2025-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 51_195 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + mo_ccs_enrolled: true + households: + household: + members: [person1, person2] + state_code: MO + output: + # Monthly income = 51,195 / 12 = 4,266.25 > 4,265.25 (242% FPL size 2) + # -> just over the transitional limit -> ineligible. + mo_ccs_income_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_protective_services.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_protective_services.yaml new file mode 100644 index 00000000000..640dc17ce15 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_protective_services.yaml @@ -0,0 +1,79 @@ +# MO CCS protective services pathway tests +# mo_ccs_protective_services is SPMUnit, MONTH. +# True when the unit has a foster child, is homeless, or has a child +# receiving/needing protective services. + +- name: Case 1, foster child triggers protective services. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_in_foster_care: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + mo_ccs_protective_services: true + +- name: Case 2, homeless family triggers protective services. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + is_homeless: true + output: + mo_ccs_protective_services: true + +- name: Case 3, child needing protective services triggers pathway. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + receives_or_needs_protective_services: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + mo_ccs_protective_services: true + +- name: Case 4, no protective services indicators. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + mo_ccs_protective_services: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/income/mo_ccs_adjusted_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/income/mo_ccs_adjusted_income.yaml new file mode 100644 index 00000000000..10ac417a1b4 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/income/mo_ccs_adjusted_income.yaml @@ -0,0 +1,63 @@ +# MO CCS adjusted gross income tests +# mo_ccs_adjusted_income is SPMUnit, MONTH. +# = monthly countable income - health insurance premiums, floored at 0. +# Medical premiums are the only allowed deduction (5 CSR 25-200.050(2)). + +- name: Case 1, no premiums leaves income unchanged. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: MO + output: + # 36,000 / 12 = 3,000; no premiums. + mo_ccs_adjusted_income: 3_000 + +- name: Case 2, premiums deducted from countable income. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + health_insurance_premiums: 6_000 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: MO + output: + # Countable 3,000/mo; premiums 6,000/12 = 500/mo; adjusted = 2,500. + mo_ccs_adjusted_income: 2_500 + +- name: Case 3, premiums larger than income floor at zero. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 6_000 + health_insurance_premiums: 12_000 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: MO + output: + # Countable 500/mo; premiums 1,000/mo; max(500 - 1,000, 0) = 0. + mo_ccs_adjusted_income: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/income/mo_ccs_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/income/mo_ccs_countable_income.yaml new file mode 100644 index 00000000000..50eb7b597b5 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/income/mo_ccs_countable_income.yaml @@ -0,0 +1,127 @@ +# MO CCS countable income tests +# mo_ccs_countable_income is SPMUnit, MONTH. +# Sums the listed monthly gross income sources; excluded types (SSI, SNAP, +# TANF, capital gains, etc.) are omitted from the sources list. The annual +# input variables are auto-divided to a monthly amount at the MONTH period. + +- name: Case 1, employment income counted. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: MO + output: + # 36,000 / 12 = 3,000 monthly. + mo_ccs_countable_income: 3_000 + +- name: Case 2, SSI excluded from countable income. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + ssi: 12_000 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: MO + output: + # SSI is excluded (Manual 2010.045.10.05); only employment counts. + # 24,000 / 12 = 2,000 monthly. + mo_ccs_countable_income: 2_000 + +- name: Case 3, multiple counted sources summed. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 24_000 + self_employment_income: 12_000 + social_security: 6_000 + child_support_received: 3_600 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: MO + output: + # (24,000 + 12,000 + 6,000 + 3,600) / 12 = 45,600 / 12 = 3,800. + mo_ccs_countable_income: 3_800 + +- name: Case 4, two-person household income summed. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 30_000 + person2: + age: 33 + employment_income: 18_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # (30,000 + 18,000) / 12 = 4,000 monthly. + mo_ccs_countable_income: 4_000 + +- name: Case 5, SNAP excluded from countable income. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + spm_units: + spm_unit: + members: [person1] + snap: 3_600 + households: + household: + members: [person1] + state_code: MO + output: + # SNAP value is excluded (Manual 2010.045.10.20). + # 18,000 / 12 = 1,500 monthly. + mo_ccs_countable_income: 1_500 + +- name: Case 6, zero income family. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: MO + output: + mo_ccs_countable_income: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/integration.yaml new file mode 100644 index 00000000000..a053a0bcbef --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/integration.yaml @@ -0,0 +1,304 @@ +# MO Child Care Subsidy integration tests +# End-to-end scenarios exercising eligibility, region/time classification, +# the daily rate (with transitional funding multiplier), the sliding fee, and +# the final monthly benefit. +# +# 2025 reference values (test period 2025-01): +# FPG (contiguous US): family of 2 = 21,150/yr -> 1,762.50/mo. +# 150% FPL (size 2) = 2,643.75/mo; 242% FPL = 4,265.25/mo. +# MO SMI base 2025 = 105,825; size 2 = * 0.68 = 71,961/yr; +# 25% / 12 floor = $1,499.19/mo. +# Licensed center, dense urban (Jackson County), infant/toddler, full time +# base rate = $96/day; preschool special-needs (PS) rate = $71.57/day. +# Size 2 sliding fee tier 7 full fee = $5/day; tier 8 (TCC1) full fee = $7.50/day. + +- name: Case 1, eligible working family with an infant in a licensed center. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + immigration_status: CITIZEN + weekly_hours_worked: 35 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 30_000 + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # === Classification === + mo_ccs_region: DENSE_URBAN + mo_ccs_age_group: [SCHOOL_AGE, INFANT_TODDLER] + mo_ccs_time_category: [PART_TIME, FULL_TIME] + + # === Eligibility === + # Infant < 13, citizen, dependent -> eligible child. + mo_ccs_eligible_child: [false, true] + # Income 24,000/yr = 2,000/mo <= 2,643.75 (150% FPL size 2) -> eligible. + mo_ccs_income_eligible: true + mo_ccs_eligible: true + + # === Daily rate === + # Licensed center, dense urban, infant/toddler, full time = $96/day + # (funding rate 1.0 for a traditional family). + mo_ccs_maximum_daily_benefit: [0, 96] + + # === Copay === + # Income 2,000 > SMI floor 1,499.19; size 2 tier 7 full fee $5/day. + # $5 * 20 days * 1 child = $100/mo. + mo_ccs_copay: 100 + + # === Benefit === + # Reimbursement = min($96 * 20, $2,500 monthly expenses) = $1,920. + # Benefit = max(1,920 - 100, 0) = $1,820/mo. + mo_ccs: 1_820 + +- name: Case 2, family with income exactly at the 150 percent FPL threshold. + period: 2025-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 31_725 + immigration_status: CITIZEN + weekly_hours_worked: 35 + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 30_000 + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Income 31,725/yr = 2,643.75/mo = 150% FPL exactly -> <= -> eligible. + mo_ccs_income_eligible: true + mo_ccs_eligible: true + # FPL ratio 1.50 -> traditional funding 1.0; preschool dense urban FT = $50/day. + mo_ccs_maximum_daily_benefit: [0, 50] + +- name: Case 3, transitional family in TCC1 funded at 80 percent. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 33_840 + immigration_status: CITIZEN + weekly_hours_worked: 35 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + mo_ccs_enrolled: true + spm_unit_pre_subsidy_childcare_expenses: 30_000 + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Income 33,840/yr = 2,820/mo. Enrolled -> transitional limit 4,265.25. + # 2,820 <= 4,265.25 -> income eligible. + mo_ccs_income_eligible: true + mo_ccs_eligible: true + # FPL ratio = 2,820 / 1,762.50 = 1.60 -> TCC1 funding 0.80. + # Daily benefit = $96 * 0.80 = $76.80. + mo_ccs_maximum_daily_benefit: [0, 76.8] + # Size 2 income 2,820 > 2,644 -> tier 8 (TCC1) full fee $7.50/day. + # $7.50 * 20 = $150/mo copay. + mo_ccs_copay: 150 + # Reimbursement = min($76.80 * 20, $2,500) = $1,536. + # Benefit = max(1,536 - 150, 0) = $1,386/mo. + mo_ccs: 1_386 + +- name: Case 4, special-needs child with no sliding fee. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + immigration_status: CITIZEN + weekly_hours_worked: 35 + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + is_disabled: true + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 30_000 + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Disabled preschooler -> eligible child; PS rate used. + mo_ccs_eligible_child: [false, true] + # PS rate, dense urban, preschool, full time = $71.57/day. + mo_ccs_maximum_daily_benefit: [0, 71.57] + # Special-needs child not charged -> copay $0. + mo_ccs_copay: 0 + # Reimbursement = min($71.57 * 20, $2,500) = $1,431.40; benefit = $1,431.40. + mo_ccs: 1_431.40 + +- name: Case 5, low-income family pays only the minimum fee. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 12_000 + immigration_status: CITIZEN + weekly_hours_worked: 35 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 30_000 + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + mo_ccs_eligible: true + # Income 12,000/yr = 1,000/mo < SMI floor 1,499.19 -> $1/year min copay. + mo_ccs_copay: 0.0833 + # Daily benefit $96 * 20 = $1,920; expenses cap $2,500 not binding. + # Benefit = max(1,920 - 0.0833, 0) = $1,919.92. + mo_ccs: 1_919.92 + +- name: Case 6, ineligible family above 150 percent FPL. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 60_000 + immigration_status: CITIZEN + weekly_hours_worked: 35 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 30_000 + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # 60,000/yr = 5,000/mo > 2,643.75 (150% FPL size 2), new applicant. + mo_ccs_income_eligible: false + mo_ccs_eligible: false + mo_ccs: 0 + +- name: Case 7, benefit capped at pre-subsidy expenses with negative income. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + self_employment_income: -12_000 + immigration_status: CITIZEN + weekly_hours_worked: 35 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + mo_ccs_provider_type: LICENSED_CENTER + 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: MO + county: JACKSON_COUNTY_MO + output: + # Negative countable income -> adjusted income floored at 0, eligible, + # funding rate 1.0 (no transitional inflation). + mo_ccs_eligible: true + mo_ccs_maximum_daily_benefit: [0, 96] + # Income below SMI floor -> $1/year minimum copay $0.0833/mo. + mo_ccs_copay: 0.0833 + # Reimbursement bounded by expenses: per-child monthly = 12,000 / 12 = + # $1,000 (< rate*days $1,920). Benefit = max(1,000 - 0.0833, 0) = $999.92. + # Negative income does not inflate the benefit. + mo_ccs: 999.92 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs.yaml new file mode 100644 index 00000000000..fb4f94dbd05 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs.yaml @@ -0,0 +1,226 @@ +# MO CCS monthly benefit tests +# mo_ccs is SPMUnit, MONTH, defined_for mo_ccs_eligible. +# Per child: min(daily_benefit * attending days, monthly pre-subsidy expenses). +# Benefit = max(sum over children - copay, 0). +# pre_subsidy_childcare_expenses is the SPM unit expense prorated over children +# (annual), accessed monthly (auto-divided by 12). +# +# 2025 values (test period 2025-01): FPG size 2 = 21,150/yr (1,762.50/mo); +# 150% FPL = 2,643.75/mo. MO SMI size 2 = 71,961/yr; 25%/12 floor = $1,499.19/mo. +# Licensed center, dense urban (Jackson County), infant/toddler, full time +# base rate = $96/day; preschool special-needs (PS) rate = $71.57/day. + +- name: Case 1, positive benefit, rate not capped by expenses. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 30_000 + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Eligible: income 2,000/mo <= 2,643.75; working; eligible infant. + # Daily benefit $96 (funding 1.0) * 20 days = $1,920. + # Per-child monthly expenses = 30,000 / 1 child / 12 = $2,500; cap not binding. + # Copay: income 2,000 > SMI floor; size 2 tier 7 full fee $5 * 20 = $100. + # Benefit = max(1,920 - 100, 0) = $1,820. + mo_ccs: 1_820 + +- name: Case 2, benefit capped at pre-subsidy childcare expenses. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + mo_ccs_provider_type: LICENSED_CENTER + 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: MO + county: JACKSON_COUNTY_MO + output: + # Daily benefit $96 * 20 = $1,920, but per-child monthly expenses = + # 12,000 / 12 = $1,000 caps the reimbursement. + # Copay $100 (tier 7 full). Benefit = max(1,000 - 100, 0) = $900. + mo_ccs: 900 + +- name: Case 3, ineligible family receives zero. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 60_000 + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 30_000 + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # 60,000/yr = 5,000/mo > 2,643.75 (150% FPL size 2), new applicant -> ineligible. + mo_ccs: 0 + +- name: Case 4, low-income family pays only the minimum copay. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 12_000 + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 30_000 + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Income 1,000/mo < SMI floor 1,499.19 -> $1/year minimum copay = $0.0833/mo. + # Daily benefit $96 * 20 = $1,920; expenses cap $2,500 not binding. + # Benefit = max(1,920 - 0.0833, 0) = $1,919.92. + mo_ccs: 1_919.92 + +- name: Case 5, special-needs child has no copay and uses the PS rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + is_disabled: true + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 30_000 + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # PS rate, dense urban, preschool, full time = $71.57/day * 20 = $1,431.40. + # Disabled child excluded from the sliding fee -> copay $0. + # Expenses cap = 30,000 / 12 = 2,500 not binding. + # Benefit = max(1,431.40 - 0, 0) = $1,431.40. + mo_ccs: 1_431.40 + +- name: Case 6, negative income does not inflate the benefit. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + self_employment_income: -12_000 + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + mo_ccs_provider_type: LICENSED_CENTER + 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: MO + county: JACKSON_COUNTY_MO + output: + # Countable income negative (-1,000/mo) -> adjusted income floored at 0, + # income eligible, funding rate 1.0 (no transitional reduction). + # Income < SMI floor -> $1/year minimum copay $0.0833/mo. + # Benefit still bounded by rate*days and expenses: per-child monthly + # expenses = 12,000 / 12 = 1,000 caps reimbursement (rate*days = 1,920). + # Benefit = max(1,000 - 0.0833, 0) = $999.92 (not inflated by negative income). + mo_ccs: 999.92 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_age_group.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_age_group.yaml new file mode 100644 index 00000000000..2e1af939fe7 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_age_group.yaml @@ -0,0 +1,84 @@ +# MO CCS age group tests +# mo_ccs_age_group is Person, MONTH (enum: INFANT_TODDLER, PRESCHOOL, +# SCHOOL_AGE). Age bracket: 0-<2 INFANT_TODDLER, 2-<5 PRESCHOOL, +# 5+ SCHOOL_AGE. + +- name: Case 1, infant is infant/toddler. + period: 2025-01 + input: + people: + person1: + age: 0 + households: + household: + members: [person1] + state_code: MO + output: + mo_ccs_age_group: INFANT_TODDLER + +- name: Case 2, one year old is infant/toddler. + period: 2025-01 + input: + people: + person1: + age: 1 + households: + household: + members: [person1] + state_code: MO + output: + mo_ccs_age_group: INFANT_TODDLER + +- name: Case 3, two year old is preschool. + period: 2025-01 + input: + people: + person1: + age: 2 + households: + household: + members: [person1] + state_code: MO + output: + # Threshold 2 (inclusive) -> PRESCHOOL. + mo_ccs_age_group: PRESCHOOL + +- name: Case 4, four year old is preschool. + period: 2025-01 + input: + people: + person1: + age: 4 + households: + household: + members: [person1] + state_code: MO + output: + mo_ccs_age_group: PRESCHOOL + +- name: Case 5, five year old is school age. + period: 2025-01 + input: + people: + person1: + age: 5 + households: + household: + members: [person1] + state_code: MO + output: + # Threshold 5 (inclusive) -> SCHOOL_AGE. + mo_ccs_age_group: SCHOOL_AGE + +- name: Case 6, eight year old is school age. + period: 2025-01 + input: + people: + person1: + age: 8 + households: + household: + members: [person1] + state_code: MO + output: + mo_ccs_age_group: SCHOOL_AGE diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.yaml new file mode 100644 index 00000000000..47ce55144f4 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.yaml @@ -0,0 +1,554 @@ +# MO CCS maximum daily benefit tests +# mo_ccs_maximum_daily_benefit is Person, MONTH, defined_for mo_ccs_eligible_child. +# = daily base (or special-needs/PS) rate for the child's provider type x region +# x age group x time category, multiplied by the transitional funding rate +# (1.0 for traditional families <= 150% FPL). +# Rates from 2025 Rates Held Harmless 2.0 (Daytime Rates 2025), effective 2025-10-01. +# Low income (employment 18,000/yr = 1,500/mo) keeps the funding rate at 1.0. + +# === Provider type coverage (Region 1 dense urban, infant/toddler, full time) === +- name: Case 1, licensed center dense urban infant full time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Licensed center, dense urban, infant/toddler, full time = $96/day. + mo_ccs_maximum_daily_benefit: [0, 96] + +- name: Case 2, registered center dense urban infant full time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + mo_ccs_provider_type: REGISTERED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Registered center, dense urban, infant/toddler, full time = $84/day. + mo_ccs_maximum_daily_benefit: [0, 84] + +- name: Case 3, six-or-fewer license-exempt dense urban infant full time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + mo_ccs_provider_type: SIX_OR_FEWER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Six or fewer, dense urban, infant/toddler, full time = $49.66/day. + mo_ccs_maximum_daily_benefit: [0, 49.66] + +- name: Case 4, licensed family home dense urban infant full time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + mo_ccs_provider_type: LICENSED_FAMILY_HOME + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Licensed family home, dense urban, infant/toddler, full time = $70.91/day. + mo_ccs_maximum_daily_benefit: [0, 70.91] + +- name: Case 5, group home dense urban infant full time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + mo_ccs_provider_type: GROUP_HOME + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Group home, dense urban, infant/toddler, full time = $72/day. + mo_ccs_maximum_daily_benefit: [0, 72] + +# === Region coverage (licensed center, preschool, full time) === +- name: Case 6, licensed center metro preschool full time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + county: FRANKLIN_COUNTY_MO + output: + # Licensed center, metro (Region 2), preschool, full time = $37/day. + mo_ccs_maximum_daily_benefit: [0, 37] + +- name: Case 7, licensed center urban preschool full time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + county: BOONE_COUNTY_MO + output: + # Licensed center, urban (Region 3), preschool, full time = $40/day. + mo_ccs_maximum_daily_benefit: [0, 40] + +- name: Case 8, licensed center micropolitan preschool full time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + county: ADAIR_COUNTY_MO + output: + # Licensed center, micropolitan (Region 4), preschool, full time = $32.50/day. + mo_ccs_maximum_daily_benefit: [0, 32.5] + +- name: Case 9, licensed center rural preschool full time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + county: BARRY_COUNTY_MO + output: + # Licensed center, rural (Region 5 default), preschool, full time = $31/day. + mo_ccs_maximum_daily_benefit: [0, 31] + +# === Time category coverage (licensed center, dense urban, infant/toddler) === +- name: Case 10, half time infant in licensed center dense urban. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 4 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # 4 hours/week -> half time. Licensed center, dense urban, infant/toddler, + # half time = $72/day. + mo_ccs_maximum_daily_benefit: [0, 72] + +- name: Case 11, part time infant in licensed center dense urban. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 2 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # 2 hours/week -> part time. Licensed center, dense urban, infant/toddler, + # part time = $48/day. + mo_ccs_maximum_daily_benefit: [0, 48] + +# === School age coverage === +- name: Case 12, school age child licensed center dense urban full time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Licensed center, dense urban, school age, full time = $36/day. + mo_ccs_maximum_daily_benefit: [0, 36] + +# === Special-needs (PS) rate column === +- name: Case 13, special-needs child uses the PS rate column. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + is_disabled: true + childcare_hours_per_week: 40 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Disabled -> special-needs (PS) column. Licensed center, dense urban, + # preschool, full time PS = $71.57/day (base would be $50). + mo_ccs_maximum_daily_benefit: [0, 71.57] + +# === Transitional funding multiplier === +- name: Case 14, TCC1 family funded at 80 percent of base. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 33_840 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + mo_ccs_enrolled: true + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # FPG size 2 = 21,150/yr -> 1,762.50/mo. Income 33,840/yr = 2,820/mo. + # FPL ratio = 2,820 / 1,762.50 = 1.60 -> TCC1 funding rate 0.80. + # Base $96/day -> 96 * 0.80 = $76.80/day. + mo_ccs_maximum_daily_benefit: [0, 76.8] + +- name: Case 15, TCC2 family funded at 60 percent of base. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 42_300 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + mo_ccs_enrolled: true + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Income 42,300/yr = 3,525/mo. FPL ratio = 3,525 / 1,762.50 = 2.00 + # -> TCC2 (1.85-2.15) funding rate 0.60. + # Base $96/day -> 96 * 0.60 = $57.60/day. + mo_ccs_maximum_daily_benefit: [0, 57.6] + +- name: Case 16, TCC3 family funded at 50 percent of base. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 48_645 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + mo_ccs_enrolled: true + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Income 48,645/yr = 4,053.75/mo. FPL ratio = 4,053.75 / 1,762.50 = 2.30 + # -> TCC3 (2.15-2.42) funding rate 0.50. + # Base $96/day -> 96 * 0.50 = $48/day. + mo_ccs_maximum_daily_benefit: [0, 48] + +# === Transitional funding boundary (FPL ratio at exactly 150% vs just above) === +- name: Case 17, FPL ratio exactly 150 percent is funded at the full base rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 31_725 + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Income 31,725/yr = 2,643.75/mo. FPL ratio = 2,643.75 / 1,762.50 = 1.50 + # -> 1.50 not > 1.5001 -> traditional funding rate 1.0 (not TCC1). + # Preschool dense urban base $50/day * 1.0 = $50/day. + mo_ccs_maximum_daily_benefit: [0, 50] + +- name: Case 18, FPL ratio just above 150 percent drops to the TCC1 funding rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 31_940 + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + mo_ccs_enrolled: true + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Income 31,940/yr = 2,661.67/mo. FPL ratio = 2,661.67 / 1,762.50 = 1.5101 + # > 1.5001 -> TCC1 funding rate 0.80. + # Preschool dense urban base $50/day * 0.80 = $40/day. + mo_ccs_maximum_daily_benefit: [0, 40] diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_region.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_region.yaml new file mode 100644 index 00000000000..8f8d01b7aca --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_region.yaml @@ -0,0 +1,75 @@ +# MO CCS geographic region tests +# mo_ccs_region is Household, YEAR (enum: DENSE_URBAN, METRO, URBAN, +# MICROPOLITAN, RURAL). Derived from county via the region county lists; +# any county not in Regions 1-4 defaults to RURAL (Region 5). + +- name: Case 1, Jackson County is dense urban (Region 1). + period: 2025 + input: + people: + person1: + age: 5 + households: + household: + members: [person1] + state_code: MO + county: JACKSON_COUNTY_MO + output: + mo_ccs_region: DENSE_URBAN + +- name: Case 2, Franklin County is metro (Region 2). + period: 2025 + input: + people: + person1: + age: 5 + households: + household: + members: [person1] + state_code: MO + county: FRANKLIN_COUNTY_MO + output: + mo_ccs_region: METRO + +- name: Case 3, Boone County is urban (Region 3). + period: 2025 + input: + people: + person1: + age: 5 + households: + household: + members: [person1] + state_code: MO + county: BOONE_COUNTY_MO + output: + mo_ccs_region: URBAN + +- name: Case 4, Adair County is micropolitan (Region 4). + period: 2025 + input: + people: + person1: + age: 5 + households: + household: + members: [person1] + state_code: MO + county: ADAIR_COUNTY_MO + output: + mo_ccs_region: MICROPOLITAN + +- name: Case 5, Barry County defaults to rural (Region 5). + period: 2025 + input: + people: + person1: + age: 5 + households: + household: + members: [person1] + state_code: MO + county: BARRY_COUNTY_MO + output: + # Barry County is not listed in Regions 1-4 -> default RURAL. + mo_ccs_region: RURAL diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_time_category.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_time_category.yaml new file mode 100644 index 00000000000..aad1194495b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_time_category.yaml @@ -0,0 +1,88 @@ +# MO CCS care time unit tests +# mo_ccs_time_category is Person, MONTH (enum: FULL_TIME, HALF_TIME, +# PART_TIME). From childcare_hours_per_week: part 0.5-<3, half 3-<5, +# full 5-<12. Default (0 hours) -> PART_TIME (lowest bracket). + +- name: Case 1, thirty hours per week is full time. + period: 2025-01 + input: + people: + person1: + childcare_hours_per_week: 30 + households: + household: + members: [person1] + state_code: MO + output: + # 30 >= 5 -> FULL_TIME. + mo_ccs_time_category: FULL_TIME + +- name: Case 2, five hours per week is full time at boundary. + period: 2025-01 + input: + people: + person1: + childcare_hours_per_week: 5 + households: + household: + members: [person1] + state_code: MO + output: + # Threshold 5 (inclusive) -> FULL_TIME. + mo_ccs_time_category: FULL_TIME + +- name: Case 3, four hours per week is half time. + period: 2025-01 + input: + people: + person1: + childcare_hours_per_week: 4 + households: + household: + members: [person1] + state_code: MO + output: + # 3 <= 4 < 5 -> HALF_TIME. + mo_ccs_time_category: HALF_TIME + +- name: Case 4, three hours per week is half time at boundary. + period: 2025-01 + input: + people: + person1: + childcare_hours_per_week: 3 + households: + household: + members: [person1] + state_code: MO + output: + # Threshold 3 (inclusive) -> HALF_TIME. + mo_ccs_time_category: HALF_TIME + +- name: Case 5, two hours per week is part time. + period: 2025-01 + input: + people: + person1: + childcare_hours_per_week: 2 + households: + household: + members: [person1] + state_code: MO + output: + # 0.5 <= 2 < 3 -> PART_TIME. + mo_ccs_time_category: PART_TIME + +- name: Case 6, zero hours defaults to part time. + period: 2025-01 + input: + people: + person1: + childcare_hours_per_week: 0 + households: + household: + members: [person1] + state_code: MO + output: + # Lowest bracket (threshold 0) -> PART_TIME. + mo_ccs_time_category: PART_TIME diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_child_care_subsidies.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_child_care_subsidies.yaml new file mode 100644 index 00000000000..627cee38fbb --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_child_care_subsidies.yaml @@ -0,0 +1,68 @@ +# MO CCS annual aggregator tests +# mo_child_care_subsidies is SPMUnit, YEAR, adds = ["mo_ccs"]. +# At a YEAR period it sums the 12 monthly mo_ccs benefits. + +- name: Case 1, annual subsidy is twelve times the monthly benefit. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 30_000 + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Monthly benefit $1,820 (see mo_ccs Case 1) * 12 = $21,840. + mo_child_care_subsidies: 21_840 + +- name: Case 2, ineligible family receives zero annually. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 60_000 + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 30_000 + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + mo_child_care_subsidies: 0 diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/copay/mo_ccs_copay.py b/policyengine_us/variables/gov/states/mo/dese/ccs/copay/mo_ccs_copay.py new file mode 100644 index 00000000000..4d6827eab90 --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/copay/mo_ccs_copay.py @@ -0,0 +1,73 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.mo.dese.ccs.mo_ccs_time_category import ( + MOCCSTimeCategory, +) + + +class mo_ccs_copay(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "Missouri Child Care Subsidy monthly sliding fee" + definition_period = MONTH + defined_for = StateCode.MO + reference = ( + "https://web.archive.org/web/20211208060516id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2025/010", + "https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.mo.dese.ccs.copay + monthly_income = spm_unit("mo_ccs_countable_income", period) + + # The sliding fee tier is read from the household-size ladder by + # monthly gross income. Households larger than the largest published + # size (20) use the largest size column. + size = spm_unit("spm_unit_size", period.this_year) + max_size = 20 + tier = select( + [size == n for n in range(1, max_size)], + [ + getattr(p.tier, f"size_{n}").calc(monthly_income) + for n in range(1, max_size) + ], + default=getattr(p.tier, f"size_{max_size}").calc(monthly_income), + ) + + # The daily fee per child depends on the tier and the child's care + # time unit (full, half, or part). + person = spm_unit.members + time_category = person("mo_ccs_time_category", period) + full_fee = p.daily_fee.full_unit.calc(tier) + half_fee = p.daily_fee.half_unit.calc(tier) + part_fee = p.daily_fee.part_unit.calc(tier) + # tier is an SPMUnit-level array; broadcast to people via their unit. + daily_fee = select( + [ + time_category == MOCCSTimeCategory.FULL_TIME, + time_category == MOCCSTimeCategory.HALF_TIME, + time_category == MOCCSTimeCategory.PART_TIME, + ], + [ + spm_unit.project(full_fee), + spm_unit.project(half_fee), + spm_unit.project(part_fee), + ], + ) + + # Children with special needs are not charged a sliding fee. + is_eligible_child = person("mo_ccs_eligible_child", period) + is_disabled = person("is_disabled", period.this_year) + days = person("childcare_attending_days_per_month", period.this_year) + in_care = is_eligible_child & ~is_disabled & (days > 0) + monthly_fee = spm_unit.sum(daily_fee * days * in_care) + + # Households whose only income is Temporary Assistance, or whose gross + # income is below the state median income floor, pay only the minimum + # annual fee. + smi = spm_unit("hhs_smi", period.this_year) + smi_floor = smi * p.smi_minimum_rate / MONTHS_IN_YEAR + is_tanf = spm_unit("is_tanf_enrolled", period) + pays_minimum = is_tanf | (monthly_income < smi_floor) + minimum_fee = p.minimum_annual_fee / MONTHS_IN_YEAR + return where(pays_minimum, minimum_fee, monthly_fee) diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.py b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.py new file mode 100644 index 00000000000..f087fc1ae0b --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.py @@ -0,0 +1,29 @@ +from policyengine_us.model_api import * + + +class mo_ccs_activity_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for Missouri Child Care Subsidy based on need for care" + definition_period = MONTH + defined_for = StateCode.MO + reference = ( + "https://web.archive.org/web/20211208073247id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/050/05", + ) + + def formula(spm_unit, period, parameters): + person = spm_unit.members + is_head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) + # The need for care is met by employment, training or education, or job + # search. We don't track activity-hours verification at the moment, so + # an applicant is treated as meeting the need when an activity is + # present (Manual 2010.050.05-.20). + is_working = person("weekly_hours_worked", period.this_year) > 0 + is_student = person("is_full_time_student", period.this_year) + individually_eligible = is_working | is_student + # Require at least one head/spouse, and require every head/spouse to + # have a qualifying activity so an SPM unit of only dependents does not + # vacuously pass. + 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/mo/dese/ccs/eligibility/mo_ccs_eligible.py b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible.py new file mode 100644 index 00000000000..d0a6dce8867 --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible.py @@ -0,0 +1,28 @@ +from policyengine_us.model_api import * + + +class mo_ccs_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for Missouri Child Care Subsidy" + definition_period = MONTH + defined_for = StateCode.MO + reference = ( + "https://www.law.cornell.edu/regulations/missouri/5-CSR-25-200-060", + "https://web.archive.org/web/20211208073247id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/005/00", + ) + + def formula(spm_unit, period, parameters): + has_eligible_child = add(spm_unit, period, ["mo_ccs_eligible_child"]) > 0 + income_eligible = spm_unit("mo_ccs_income_eligible", period) + asset_eligible = spm_unit("is_ccdf_asset_eligible", period.this_year) + activity_eligible = spm_unit("mo_ccs_activity_eligible", period) + protective = spm_unit("mo_ccs_protective_services", period) + # The need for care is met by an activity or by the protective-services + # pathway. + return ( + has_eligible_child + & income_eligible + & asset_eligible + & (activity_eligible | protective) + ) diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible_child.py b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible_child.py new file mode 100644 index 00000000000..acded602c9c --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible_child.py @@ -0,0 +1,36 @@ +from policyengine_us.model_api import * + + +class mo_ccs_eligible_child(Variable): + value_type = bool + entity = Person + label = "Eligible child for Missouri Child Care Subsidy" + definition_period = MONTH + defined_for = StateCode.MO + reference = ( + "https://www.law.cornell.edu/regulations/missouri/5-CSR-25-200-050", + "https://web.archive.org/web/20211208073247id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/005/00", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.mo.dese.ccs.eligibility + age = person("age", period.this_year) + is_disabled = person("is_disabled", period.this_year) + is_in_school = person("is_in_k12_school", period.this_year) + # A child with special needs is eligible to a higher age, extended by + # one year while still in school. + special_needs_limit = where( + is_in_school, + p.special_needs_in_school_age_limit, + p.special_needs_child_age_limit, + ) + age_eligible = where( + is_disabled, + age < special_needs_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/mo/dese/ccs/eligibility/mo_ccs_income_eligible.py b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_income_eligible.py new file mode 100644 index 00000000000..cffa10eb6dd --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_income_eligible.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +class mo_ccs_income_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for Missouri Child Care Subsidy based on income" + definition_period = MONTH + defined_for = StateCode.MO + reference = ( + "https://web.archive.org/web/20211208073807id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/045/10", + "https://www.law.cornell.edu/regulations/missouri/5-CSR-25-200-060", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.mo.dese.ccs.income.fpl_rate + adjusted_income = spm_unit("mo_ccs_adjusted_income", period) + monthly_fpg = spm_unit("spm_unit_fpg", period.this_year) / MONTHS_IN_YEAR + # New applicants use the traditional limit; existing families may + # qualify up to the higher transitional limit. + enrolled = spm_unit("mo_ccs_enrolled", period) + income_limit = where( + enrolled, + monthly_fpg * p.transitional, + monthly_fpg * p.initial_eligibility, + ) + return adjusted_income <= income_limit diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_protective_services.py b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_protective_services.py new file mode 100644 index 00000000000..2ccaab94f10 --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_protective_services.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class mo_ccs_protective_services(Variable): + value_type = bool + entity = SPMUnit + label = "Missouri Child Care Subsidy protective services category" + definition_period = MONTH + defined_for = StateCode.MO + reference = "https://www.law.cornell.edu/regulations/missouri/5-CSR-25-200-050" + + def formula(spm_unit, period, parameters): + has_foster_child = add(spm_unit, period, ["is_in_foster_care"]) > 0 + is_homeless = spm_unit.household("is_homeless", period.this_year) + has_protective_child = ( + add( + spm_unit, + period.this_year, + ["receives_or_needs_protective_services"], + ) + > 0 + ) + return has_foster_child | is_homeless | has_protective_child diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/income/mo_ccs_adjusted_income.py b/policyengine_us/variables/gov/states/mo/dese/ccs/income/mo_ccs_adjusted_income.py new file mode 100644 index 00000000000..8956f916b28 --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/income/mo_ccs_adjusted_income.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class mo_ccs_adjusted_income(Variable): + value_type = float + entity = SPMUnit + label = "Missouri Child Care Subsidy adjusted gross income" + definition_period = MONTH + unit = USD + defined_for = StateCode.MO + reference = ( + "https://www.law.cornell.edu/regulations/missouri/5-CSR-25-200-050", + "https://web.archive.org/web/20211208073807id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/045/10", + ) + + def formula(spm_unit, period, parameters): + countable_income = spm_unit("mo_ccs_countable_income", period) + # Medical insurance premiums are the only deduction from monthly gross + # income (5 CSR 25-200.050(2); Manual 2010.045.15). + premiums = add(spm_unit, period, ["health_insurance_premiums"]) + return max_(countable_income - premiums, 0) diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/income/mo_ccs_countable_income.py b/policyengine_us/variables/gov/states/mo/dese/ccs/income/mo_ccs_countable_income.py new file mode 100644 index 00000000000..63d1342910d --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/income/mo_ccs_countable_income.py @@ -0,0 +1,15 @@ +from policyengine_us.model_api import * + + +class mo_ccs_countable_income(Variable): + value_type = float + entity = SPMUnit + label = "Missouri Child Care Subsidy countable income" + definition_period = MONTH + unit = USD + defined_for = StateCode.MO + reference = ( + "https://web.archive.org/web/20211208073807id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/045/10", + ) + + adds = "gov.states.mo.dese.ccs.income.countable_income.sources" diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs.py b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs.py new file mode 100644 index 00000000000..ca2a6f81b46 --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class mo_ccs(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "Missouri Child Care Subsidy benefit amount" + definition_period = MONTH + defined_for = "mo_ccs_eligible" + reference = "https://www.law.cornell.edu/regulations/missouri/5-CSR-25-200-060" + + def formula(spm_unit, period, parameters): + # Reimbursement is paid per child at a daily rate for each day of care, + # capped at the family's child care charges. + person = spm_unit.members + daily_benefit = person("mo_ccs_maximum_daily_benefit", period) + days = person("childcare_attending_days_per_month", period.this_year) + pre_subsidy_per_child = person("pre_subsidy_childcare_expenses", period) + per_child_reimbursement = min_(daily_benefit * days, pre_subsidy_per_child) + total_reimbursement = spm_unit.sum(per_child_reimbursement) + copay = spm_unit("mo_ccs_copay", period) + return max_(total_reimbursement - copay, 0) diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_age_group.py b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_age_group.py new file mode 100644 index 00000000000..e1ff1392810 --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_age_group.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class MOCCSAgeGroup(Enum): + INFANT_TODDLER = "Infant/Toddler" + PRESCHOOL = "Preschool" + SCHOOL_AGE = "School age" + + +class mo_ccs_age_group(Variable): + value_type = Enum + entity = Person + possible_values = MOCCSAgeGroup + default_value = MOCCSAgeGroup.SCHOOL_AGE + definition_period = MONTH + label = "Missouri Child Care Subsidy child age group for payment rates" + defined_for = StateCode.MO + reference = "https://dese.mo.gov/childhood/child-care-subsidy/payments" + + def formula(person, period, parameters): + age = person("age", period.this_year) + p = parameters(period).gov.states.mo.dese.ccs.age_group + # The age bracket returns the MOCCSAgeGroup enum index: + # 0 = INFANT_TODDLER, 1 = PRESCHOOL, 2 = SCHOOL_AGE. + return p.age.calc(age) diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_enrolled.py b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_enrolled.py new file mode 100644 index 00000000000..12bf9f4de5d --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_enrolled.py @@ -0,0 +1,10 @@ +from policyengine_us.model_api import * + + +class mo_ccs_enrolled(Variable): + value_type = bool + entity = SPMUnit + definition_period = MONTH + label = "Currently enrolled in Missouri Child Care Subsidy" + defined_for = StateCode.MO + reference = "https://www.law.cornell.edu/regulations/missouri/5-CSR-25-200-060" diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.py b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.py new file mode 100644 index 00000000000..dac6eced9e8 --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.py @@ -0,0 +1,57 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.mo.dese.ccs.mo_ccs_provider_type import ( + MOCCSProviderType, +) + + +class mo_ccs_maximum_daily_benefit(Variable): + value_type = float + entity = Person + unit = USD + label = "Missouri Child Care Subsidy maximum daily benefit per child" + definition_period = MONTH + defined_for = "mo_ccs_eligible_child" + reference = "https://dese.mo.gov/sites/dese/files/media/file/2025/12/2025%20Rates%20Held%20Harmless%202.0.xlsx" + + def formula(person, period, parameters): + p = parameters(period).gov.states.mo.dese.ccs + region = person.household("mo_ccs_region", period.this_year) + age_group = person("mo_ccs_age_group", period) + time_category = person("mo_ccs_time_category", period) + provider_type = person("mo_ccs_provider_type", period) + + rates = p.rates + # A child with special needs is reimbursed from the special needs (PS) + # rate column; all other children use the base column. + is_disabled = person("is_disabled", period.this_year) + + def provider_rate(provider): + base = provider.base[region][age_group][time_category] + special_needs = provider.special_needs[region][age_group][time_category] + return where(is_disabled, special_needs, base) + + daily_rate = select( + [ + provider_type == MOCCSProviderType.REGISTERED_CENTER, + provider_type == MOCCSProviderType.SIX_OR_FEWER, + provider_type == MOCCSProviderType.LICENSED_CENTER, + provider_type == MOCCSProviderType.LICENSED_FAMILY_HOME, + provider_type == MOCCSProviderType.GROUP_HOME, + ], + [ + provider_rate(rates.registered_center), + provider_rate(rates.six_or_fewer), + provider_rate(rates.licensed_center), + provider_rate(rates.licensed_family_home), + provider_rate(rates.group_home), + ], + ) + + # Transitional Child Care families are funded at a reduced share of the + # base rate by federal poverty guideline ratio; traditional families + # are funded at the full rate. + adjusted_income = person.spm_unit("mo_ccs_adjusted_income", period) + monthly_fpg = person.spm_unit("spm_unit_fpg", period.this_year) / MONTHS_IN_YEAR + fpl_ratio = where(monthly_fpg > 0, adjusted_income / monthly_fpg, 0) + funding_rate = p.transitional.funding_rate.calc(fpl_ratio) + return daily_rate * funding_rate diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_provider_type.py b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_provider_type.py new file mode 100644 index 00000000000..3b5117c9ab0 --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_provider_type.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class MOCCSProviderType(Enum): + REGISTERED_CENTER = "Registered child care center" + SIX_OR_FEWER = "License-exempt provider caring for six or fewer children" + LICENSED_CENTER = "Licensed child care center" + LICENSED_FAMILY_HOME = "Licensed family child care home" + GROUP_HOME = "Licensed group child care home" + + +class mo_ccs_provider_type(Variable): + value_type = Enum + entity = Person + possible_values = MOCCSProviderType + default_value = MOCCSProviderType.LICENSED_CENTER + definition_period = MONTH + label = "Missouri Child Care Subsidy provider type" + defined_for = StateCode.MO + reference = "https://dese.mo.gov/sites/dese/files/media/file/2025/12/2025%20Rates%20Held%20Harmless%202.0.xlsx" diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_region.py b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_region.py new file mode 100644 index 00000000000..dea86e551f3 --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_region.py @@ -0,0 +1,41 @@ +from policyengine_us.model_api import * + + +class MOCCSRegion(Enum): + DENSE_URBAN = "Dense urban (Region 1)" + METRO = "Metro (Region 2)" + URBAN = "Urban (Region 3)" + MICROPOLITAN = "Micropolitan (Region 4)" + RURAL = "Rural (Region 5)" + + +class mo_ccs_region(Variable): + value_type = Enum + entity = Household + possible_values = MOCCSRegion + default_value = MOCCSRegion.RURAL + definition_period = YEAR + label = "Missouri Child Care Subsidy geographic region" + defined_for = StateCode.MO + reference = "https://dese.mo.gov/sites/dese/files/media/file/2025/12/2025%20Rates%20Held%20Harmless%202.0.xlsx" + + def formula(household, period, parameters): + county = household("county_str", period) + p = parameters(period).gov.states.mo.dese.ccs.region + # Region 5 (rural) is the default for any county not listed in + # Regions 1-4. + return select( + [ + np.isin(county, p.region_1_counties), + np.isin(county, p.region_2_counties), + np.isin(county, p.region_3_counties), + np.isin(county, p.region_4_counties), + ], + [ + MOCCSRegion.DENSE_URBAN, + MOCCSRegion.METRO, + MOCCSRegion.URBAN, + MOCCSRegion.MICROPOLITAN, + ], + default=MOCCSRegion.RURAL, + ) diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_time_category.py b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_time_category.py new file mode 100644 index 00000000000..654cbca83ed --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_time_category.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class MOCCSTimeCategory(Enum): + FULL_TIME = "Full time" + HALF_TIME = "Half time" + PART_TIME = "Part time" + + +class mo_ccs_time_category(Variable): + value_type = Enum + entity = Person + possible_values = MOCCSTimeCategory + default_value = MOCCSTimeCategory.FULL_TIME + definition_period = MONTH + label = "Missouri Child Care Subsidy care time unit" + defined_for = StateCode.MO + reference = "https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf" + + def formula(person, period, parameters): + hours = person("childcare_hours_per_week", period.this_year) + p = parameters(period).gov.states.mo.dese.ccs.time_category + # The hours bracket returns the MOCCSTimeCategory enum index: + # 0 = FULL_TIME, 1 = HALF_TIME, 2 = PART_TIME. + return p.hours.calc(hours) diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/mo_child_care_subsidies.py b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_child_care_subsidies.py new file mode 100644 index 00000000000..4b9aa33680e --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_child_care_subsidies.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class mo_child_care_subsidies(Variable): + value_type = float + entity = SPMUnit + label = "Missouri child care subsidies" + unit = USD + definition_period = YEAR + defined_for = StateCode.MO + adds = ["mo_ccs"] From 97317b0a939cfe091538db5a5e9440fc358ae542 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 16 Jun 2026 18:54:26 -0400 Subject: [PATCH 3/5] Review-fix round 1: address /review-program should-address items (MO CCS) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - TCC funding multiplier applied to remaining base rate (base − fee) per 5 CSR 25-200.060 and Manual 2010.045.00 (transitional families only) - Sliding-fee copay tier keyed on adjusted gross income per CSR 25-200.060(3)(C)1 (25% SMI / $1-min floor remains on gross per Manual 2025.010) - Protective-services pathway bypasses income+activity per CSR 25-200.060(7)(B) - Incapacitated-parent need-for-care pathway added (is_disabled, Manual 2010.050.25) - Reference fixes: funding_rate + initial_eligibility repointed to current manual 2010.045.00; dropped stale EU-page ref on child_age_limit - Expanded test coverage (PS rates all providers, more rate cells, copay ladder) Co-Authored-By: Claude Opus 4.8 (1M context) --- .../dese/ccs/eligibility/child_age_limit.yaml | 2 - .../income/fpl_rate/initial_eligibility.yaml | 6 +- .../dese/ccs/transitional/funding_rate.yaml | 6 +- .../mo/dese/ccs/copay/mo_ccs_copay.yaml | 209 +++++++++++++- .../eligibility/mo_ccs_activity_eligible.yaml | 36 ++- .../dese/ccs/eligibility/mo_ccs_eligible.yaml | 40 ++- .../gov/states/mo/dese/ccs/integration.yaml | 20 +- .../ccs/mo_ccs_maximum_daily_benefit.yaml | 269 ++++++++++++++++-- .../states/mo/dese/ccs/copay/mo_ccs_copay.py | 17 +- .../eligibility/mo_ccs_activity_eligible.py | 7 +- .../dese/ccs/eligibility/mo_ccs_eligible.py | 11 +- .../gov/states/mo/dese/ccs/mo_ccs.py | 13 +- .../dese/ccs/mo_ccs_maximum_daily_benefit.py | 11 +- 13 files changed, 575 insertions(+), 72 deletions(-) diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/eligibility/child_age_limit.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/eligibility/child_age_limit.yaml index de318bb6a5a..8cbf76ab0c8 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/eligibility/child_age_limit.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/eligibility/child_age_limit.yaml @@ -9,5 +9,3 @@ metadata: reference: - title: 5 CSR 25-200.050 Definitions (Eligible Child) href: https://www.law.cornell.edu/regulations/missouri/5-CSR-25-200-050 - - title: Missouri Child Care Subsidy Eligibility Policy Manual 2010.005 - href: https://web.archive.org/web/20211208073247id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/005/00 diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/income/fpl_rate/initial_eligibility.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/income/fpl_rate/initial_eligibility.yaml index a498d94980f..116f4b3390e 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/income/fpl_rate/initial_eligibility.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/income/fpl_rate/initial_eligibility.yaml @@ -7,7 +7,9 @@ metadata: period: year label: Missouri Child Care Subsidy traditional income limit reference: - - title: Missouri Child Care Subsidy Eligibility Policy Manual 2010.045 Income Eligibility Guidelines - href: https://web.archive.org/web/20211208073807id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/045/10 + # The live DESE manual page returns HTTP 403 to automated access; this is + # the current page text recovered via the Wayback Machine. + - title: Missouri Child Care Subsidy Eligibility Policy Manual 2010.045.00 Income Eligibility Guidelines + href: https://web.archive.org/web/20250831220820id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/045/00 - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart href: https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/transitional/funding_rate.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/transitional/funding_rate.yaml index f373ddf808c..0f650c8ceda 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/transitional/funding_rate.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/transitional/funding_rate.yaml @@ -10,8 +10,10 @@ metadata: period: year label: Missouri Child Care Subsidy transitional funding rate reference: - - title: Missouri Child Care Subsidy Eligibility Policy Manual 2010.045 Income Eligibility Guidelines - href: https://web.archive.org/web/20211208073807id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/045/10 + # The live DESE manual page returns HTTP 403 to automated access; this is + # the current page text recovered via the Wayback Machine. + - title: Missouri Child Care Subsidy Eligibility Policy Manual 2010.045.00 Income Eligibility Guidelines + href: https://web.archive.org/web/20250831220820id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/045/00 - title: 5 CSR 25-200.060 Eligibility and Authorization for Child Care Subsidy (Transitional Child Care) href: https://www.law.cornell.edu/regulations/missouri/5-CSR-25-200-060 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/copay/mo_ccs_copay.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/copay/mo_ccs_copay.yaml index 7a5f36d050c..2cad76b9a98 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/copay/mo_ccs_copay.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/copay/mo_ccs_copay.yaml @@ -1,12 +1,17 @@ # MO CCS sliding fee (copay) tests # mo_ccs_copay is SPMUnit, MONTH. -# Tier looked up from copay/tier/size_N by monthly countable income; daily fee -# from copay/daily_fee/{full,half,part}_unit by tier and the child's time unit; +# Tier looked up from copay/tier/size_N by monthly ADJUSTED gross income +# (gross countable income minus health_insurance_premiums; 5 CSR +# 25-200.060(3)(C)1). No case below sets health_insurance_premiums, so adjusted +# income equals gross countable income here. The daily fee comes from +# copay/daily_fee/{full,half,part}_unit by tier and the child's time unit; # monthly fee = sum over paying children of daily_fee * attending days. # A paying child is an eligible, non-disabled child attending care (days > 0). -# $1/year minimum (1/12 per month) applies when only-TANF or income < 25% SMI. +# $1/year minimum (1/12 per month) applies when only-TANF or GROSS income < 25% +# SMI (the 25% SMI floor keys on gross income per Manual 2025.010 item 3). # -# 2025 values used below (test period 2025-01): +# 2025 values used below (test period 2025-01, which uses 2025 FPG to match the +# Nov-2025 chart dollar bands and the 2025-10-01 copay schedule): # FPG size 2 = 21,150/yr. MO SMI base 2025 = 105,825. # SMI size 2 = 105,825 * 0.68 = 71,961/yr; 25% / 12 = $1,499.19/mo floor. # Size 2 tier bands (monthly income): tier 7 is >$1,199 up to $2,644. @@ -480,3 +485,199 @@ # 15,019 -> tier 7. Only person2 is a paying child (others have no care # days). Full fee $5/day * 20 days * 1 child = $100/mo. mo_ccs_copay: 100 + +- name: Case 14, single-person household exercises the size-1 tier branch. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: MO + output: + # Degenerate size-1 unit: spm_unit_size == 1 hits the size_1 tier column + # (not the size_20 default). Income 2,000/mo > size-1 SMI floor + # (105,825 * 0.52 * 0.25 / 12 = $1,146.44) -> not the minimum fee. + # No eligible child in care -> monthly fee $0. + mo_ccs_copay: 0 + +- name: Case 15, transitional family half-time child in the TCC1 fee row. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 33_600 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 4 + childcare_attending_days_per_month: 20 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # Income 33,600 / 12 = 2,800 > 2,644 -> tier 8 (TCC1). 4 hrs/week -> half + # unit. Tier 8 half fee = $3.75/day. $3.75 * 20 * 1 = $75/mo. + mo_ccs_copay: 75 + +- name: Case 16, transitional family part-time child in the TCC1 fee row. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 33_600 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 2 + childcare_attending_days_per_month: 20 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + output: + # Income 33,600 / 12 = 2,800 > 2,644 -> tier 8 (TCC1). 2 hrs/week -> part + # unit. Tier 8 part fee = $2.50/day. $2.50 * 20 * 1 = $50/mo. + mo_ccs_copay: 50 + +- name: Case 17, household above the published max size uses the size-20 column. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 48_000 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 20 + person3: + age: 38 + person4: + age: 30 + person5: + age: 30 + person6: + age: 30 + person7: + age: 30 + person8: + age: 30 + person9: + age: 30 + person10: + age: 30 + person11: + age: 30 + person12: + age: 30 + person13: + age: 30 + person14: + age: 30 + person15: + age: 30 + person16: + age: 30 + person17: + age: 30 + person18: + age: 30 + person19: + age: 30 + person20: + age: 30 + person21: + age: 30 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: + [ + person1, + person2, + person3, + person4, + person5, + person6, + person7, + person8, + person9, + person10, + person11, + person12, + person13, + person14, + person15, + person16, + person17, + person18, + person19, + person20, + person21, + ] + households: + household: + members: + [ + person1, + person2, + person3, + person4, + person5, + person6, + person7, + person8, + person9, + person10, + person11, + person12, + person13, + person14, + person15, + person16, + person17, + person18, + person19, + person20, + person21, + ] + state_code: MO + output: + # Size 21 > 20 -> falls to the select() default (size_20 column). Countable + # income = 48,000 / 12 = 4,000/mo. Size-21 SMI = 105,825 * 1.77 = + # 187,310.25; 25% / 12 = $3,902.30 floor; 4,000 > floor -> not minimum. + # Size-20 tier 7 band > 3,068 up to 15,019 -> tier 7. Only person2 is a + # paying child. Full fee $5/day * 20 days * 1 child = $100/mo. + mo_ccs_copay: 100 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.yaml index b89c08a36dc..7dacb63fc5d 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.yaml @@ -1,9 +1,10 @@ # MO CCS activity (need for care) eligibility tests # mo_ccs_activity_eligible is SPMUnit, MONTH. # Requires at least one tax-unit head/spouse, and every head/spouse to have a -# qualifying activity: employment (weekly_hours_worked > 0) or full-time study. +# qualifying activity: employment (weekly_hours_worked > 0), full-time study, +# or being an incapacitated parent (modeled as is_disabled; Manual 2010.050.25). # We don't track activity-hours verification at the moment, so any positive -# activity is treated as meeting the need (Manual 2010.050.05-.20). +# activity is treated as meeting the need (Manual 2010.050.05-.25). - name: Case 1, working parent meets activity requirement. period: 2025-01 @@ -127,3 +128,34 @@ output: # No head/spouse present -> not eligible. mo_ccs_activity_eligible: false + +- name: Case 6, two-parent unit with one working and one incapacitated parent passes. + period: 2025-01 + input: + people: + person1: + age: 35 + weekly_hours_worked: 40 + person2: + age: 33 + weekly_hours_worked: 0 + is_full_time_student: false + is_disabled: true + person3: + age: 5 + 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: MO + output: + # An incapacitated parent is itself a valid need for care (Manual + # 2010.050.25), so the disabled non-working spouse satisfies the per-parent + # activity requirement and the unit passes. + mo_ccs_activity_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible.yaml index e5c79cd674b..9ec375f9880 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible.yaml @@ -1,7 +1,9 @@ # MO CCS overall eligibility tests # mo_ccs_eligible is SPMUnit, MONTH. -# Requires: an eligible child AND income eligible AND asset eligible AND -# (activity eligible OR protective services). State scope is MO. +# Requires: an eligible child AND asset eligible AND +# ((income eligible AND activity eligible) OR protective services). +# Protective-services children bypass BOTH the income and activity tests +# (5 CSR 25-200.060(7)(B)). State scope is MO. - name: Case 1, eligible working family in MO. period: 2025-01 @@ -132,7 +134,8 @@ members: [person1, person2] state_code: MO output: - # Foster child waives the activity requirement; income still eligible. + # Foster (protective-services) child bypasses the activity requirement; the + # family is also within the income limit, so the unit is eligible. mo_ccs_eligible: true - name: Case 6, non-MO family ineligible. @@ -160,3 +163,34 @@ state_code: KS output: mo_ccs_eligible: false + +- name: Case 7, protective services child above 150 percent FPL is still eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 60_000 + immigration_status: CITIZEN + weekly_hours_worked: 30 + 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: MO + output: + # 60,000/yr = 5,000/mo > 2,643.75 (150% FPL size 2) -> income ineligible, + # but the foster (protective-services) child bypasses the income maximum + # (5 CSR 25-200.060(7)(B)), so the unit is eligible. + mo_ccs_income_eligible: false + mo_ccs_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/integration.yaml index a053a0bcbef..3bbefe67956 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/integration.yaml @@ -1,7 +1,13 @@ # MO Child Care Subsidy integration tests # End-to-end scenarios exercising eligibility, region/time classification, -# the daily rate (with transitional funding multiplier), the sliding fee, and -# the final monthly benefit. +# the daily rate, the sliding fee, the transitional funding multiplier +# (applied in mo_ccs to the post-fee remainder), and the final monthly benefit. +# +# Test period is 2025-01: this uses the 2025 federal poverty guidelines, which +# match the dollar income bands on the Nov-2025 DESE Income/Sliding-Fee chart +# and the 2025-10-01 rate and copay schedules these cases are calibrated to. +# (2025-01 is the same calendar year as the 2025-10-01 parameter start, so it +# does not raise ParameterNotFoundError.) # # 2025 reference values (test period 2025-01): # FPG (contiguous US): family of 2 = 21,150/yr -> 1,762.50/mo. @@ -141,14 +147,14 @@ mo_ccs_income_eligible: true mo_ccs_eligible: true # FPL ratio = 2,820 / 1,762.50 = 1.60 -> TCC1 funding 0.80. - # Daily benefit = $96 * 0.80 = $76.80. - mo_ccs_maximum_daily_benefit: [0, 76.8] + # Daily benefit returns the gross base $96/day (funding applied in mo_ccs). + mo_ccs_maximum_daily_benefit: [0, 96] # Size 2 income 2,820 > 2,644 -> tier 8 (TCC1) full fee $7.50/day. # $7.50 * 20 = $150/mo copay. mo_ccs_copay: 150 - # Reimbursement = min($76.80 * 20, $2,500) = $1,536. - # Benefit = max(1,536 - 150, 0) = $1,386/mo. - mo_ccs: 1_386 + # Reimbursement = min($96 * 20, $2,500) = $1,920. + # TCC: benefit = funding 0.80 * max(1,920 - 150, 0) = 0.80 * 1,770 = $1,416/mo. + mo_ccs: 1_416 - name: Case 4, special-needs child with no sliding fee. period: 2025-01 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.yaml index 47ce55144f4..c1e69a1acc4 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.yaml @@ -1,10 +1,11 @@ # MO CCS maximum daily benefit tests # mo_ccs_maximum_daily_benefit is Person, MONTH, defined_for mo_ccs_eligible_child. -# = daily base (or special-needs/PS) rate for the child's provider type x region -# x age group x time category, multiplied by the transitional funding rate -# (1.0 for traditional families <= 150% FPL). +# = the gross daily base (or special-needs/PS) rate for the child's provider +# type x region x age group x time category. This variable returns the gross +# base rate; the transitional funding multiplier (80/60/50%) is applied +# downstream in mo_ccs, not here. # Rates from 2025 Rates Held Harmless 2.0 (Daytime Rates 2025), effective 2025-10-01. -# Low income (employment 18,000/yr = 1,500/mo) keeps the funding rate at 1.0. +# Test period 2025-01 uses 2025 FPG, matching the Nov-2025 chart dollar bands. # === Provider type coverage (Region 1 dense urban, infant/toddler, full time) === - name: Case 1, licensed center dense urban infant full time. @@ -392,8 +393,9 @@ # preschool, full time PS = $71.57/day (base would be $50). mo_ccs_maximum_daily_benefit: [0, 71.57] -# === Transitional funding multiplier === -- name: Case 14, TCC1 family funded at 80 percent of base. +# === Transitional families return the gross base rate (funding multiplier +# is applied downstream in mo_ccs, not here) === +- name: Case 14, TCC1 family returns the gross base rate. period: 2025-01 absolute_error_margin: 0.01 input: @@ -421,11 +423,11 @@ county: JACKSON_COUNTY_MO output: # FPG size 2 = 21,150/yr -> 1,762.50/mo. Income 33,840/yr = 2,820/mo. - # FPL ratio = 2,820 / 1,762.50 = 1.60 -> TCC1 funding rate 0.80. - # Base $96/day -> 96 * 0.80 = $76.80/day. - mo_ccs_maximum_daily_benefit: [0, 76.8] + # FPL ratio = 2,820 / 1,762.50 = 1.60 -> TCC1 (0.80 funding rate applied in + # mo_ccs). This variable returns the gross base $96/day. + mo_ccs_maximum_daily_benefit: [0, 96] -- name: Case 15, TCC2 family funded at 60 percent of base. +- name: Case 15, TCC2 family returns the gross base rate. period: 2025-01 absolute_error_margin: 0.01 input: @@ -453,11 +455,11 @@ county: JACKSON_COUNTY_MO output: # Income 42,300/yr = 3,525/mo. FPL ratio = 3,525 / 1,762.50 = 2.00 - # -> TCC2 (1.85-2.15) funding rate 0.60. - # Base $96/day -> 96 * 0.60 = $57.60/day. - mo_ccs_maximum_daily_benefit: [0, 57.6] + # -> TCC2 (1.85-2.15; 0.60 funding applied in mo_ccs). + # This variable returns the gross base $96/day. + mo_ccs_maximum_daily_benefit: [0, 96] -- name: Case 16, TCC3 family funded at 50 percent of base. +- name: Case 16, TCC3 family returns the gross base rate. period: 2025-01 absolute_error_margin: 0.01 input: @@ -485,12 +487,13 @@ county: JACKSON_COUNTY_MO output: # Income 48,645/yr = 4,053.75/mo. FPL ratio = 4,053.75 / 1,762.50 = 2.30 - # -> TCC3 (2.15-2.42) funding rate 0.50. - # Base $96/day -> 96 * 0.50 = $48/day. - mo_ccs_maximum_daily_benefit: [0, 48] + # -> TCC3 (2.15-2.42; 0.50 funding applied in mo_ccs). + # This variable returns the gross base $96/day. + mo_ccs_maximum_daily_benefit: [0, 96] -# === Transitional funding boundary (FPL ratio at exactly 150% vs just above) === -- name: Case 17, FPL ratio exactly 150 percent is funded at the full base rate. +# === FPL-ratio classification still works; the gross base rate is unchanged +# across the 150% boundary === +- name: Case 17, FPL ratio exactly 150 percent returns the gross base rate. period: 2025-01 absolute_error_margin: 0.01 input: @@ -517,11 +520,11 @@ county: JACKSON_COUNTY_MO output: # Income 31,725/yr = 2,643.75/mo. FPL ratio = 2,643.75 / 1,762.50 = 1.50 - # -> 1.50 not > 1.5001 -> traditional funding rate 1.0 (not TCC1). - # Preschool dense urban base $50/day * 1.0 = $50/day. + # -> 1.50 not > 1.5001 -> traditional (funding 1.0). + # Preschool dense urban base $50/day. mo_ccs_maximum_daily_benefit: [0, 50] -- name: Case 18, FPL ratio just above 150 percent drops to the TCC1 funding rate. +- name: Case 18, FPL ratio just above 150 percent returns the gross base rate. period: 2025-01 absolute_error_margin: 0.01 input: @@ -549,6 +552,222 @@ county: JACKSON_COUNTY_MO output: # Income 31,940/yr = 2,661.67/mo. FPL ratio = 2,661.67 / 1,762.50 = 1.5101 - # > 1.5001 -> TCC1 funding rate 0.80. - # Preschool dense urban base $50/day * 0.80 = $40/day. - mo_ccs_maximum_daily_benefit: [0, 40] + # > 1.5001 -> TCC1 (0.80 funding applied in mo_ccs). + # This variable returns the gross preschool dense urban base $50/day. + mo_ccs_maximum_daily_benefit: [0, 50] + +# === Special-needs (PS) rate column for non-licensed-center providers === +# provider_rate() reads each provider's special_needs column independently, so +# each provider type needs PS coverage (RI CCAP dimension-coverage lesson). +- name: Case 19, registered center special-needs preschool uses the PS column. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + is_disabled: true + childcare_hours_per_week: 40 + mo_ccs_provider_type: REGISTERED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Registered center, dense urban, preschool, full time PS = $68/day + # (base would be $40.25). + mo_ccs_maximum_daily_benefit: [0, 68] + +- name: Case 20, six-or-fewer special-needs school age uses the PS column. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + is_disabled: true + childcare_hours_per_week: 40 + mo_ccs_provider_type: SIX_OR_FEWER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Six or fewer, dense urban, school age, full time PS = $35/day + # (base would be $25.45). + mo_ccs_maximum_daily_benefit: [0, 35] + +- name: Case 21, licensed family home special-needs preschool uses the PS column. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + is_disabled: true + childcare_hours_per_week: 40 + mo_ccs_provider_type: LICENSED_FAMILY_HOME + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Licensed family home, dense urban, preschool, full time PS = $70/day + # (base would be $40). + mo_ccs_maximum_daily_benefit: [0, 70] + +- name: Case 22, group home special-needs preschool uses the PS column. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + is_disabled: true + childcare_hours_per_week: 40 + mo_ccs_provider_type: GROUP_HOME + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Group home, dense urban, preschool, full time PS = $66/day + # (base would be $50). + mo_ccs_maximum_daily_benefit: [0, 66] + +# === Region x age rate-matrix cells outside Region 1 (school age and infant +# in Regions 2/3/5, which previously had no coverage) === +- name: Case 23, licensed center metro school age full time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + county: FRANKLIN_COUNTY_MO + output: + # Licensed center, metro (Region 2), school age, full time = $34/day. + mo_ccs_maximum_daily_benefit: [0, 34] + +- name: Case 24, licensed center urban infant full time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + county: BOONE_COUNTY_MO + output: + # Licensed center, urban (Region 3), infant/toddler, full time = $79/day. + mo_ccs_maximum_daily_benefit: [0, 79] + +- name: Case 25, licensed center rural school age full time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + county: BARRY_COUNTY_MO + output: + # Licensed center, rural (Region 5 default), school age, full time = $30.02/day. + mo_ccs_maximum_daily_benefit: [0, 30.02] diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/copay/mo_ccs_copay.py b/policyengine_us/variables/gov/states/mo/dese/ccs/copay/mo_ccs_copay.py index 4d6827eab90..ab46ad41f6b 100644 --- a/policyengine_us/variables/gov/states/mo/dese/ccs/copay/mo_ccs_copay.py +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/copay/mo_ccs_copay.py @@ -18,20 +18,21 @@ class mo_ccs_copay(Variable): def formula(spm_unit, period, parameters): p = parameters(period).gov.states.mo.dese.ccs.copay - monthly_income = spm_unit("mo_ccs_countable_income", period) + adjusted_income = spm_unit("mo_ccs_adjusted_income", period) # The sliding fee tier is read from the household-size ladder by - # monthly gross income. Households larger than the largest published - # size (20) use the largest size column. + # monthly adjusted gross income (5 CSR 25-200.060(3)(C)1). Households + # larger than the largest published size (20) use the largest size + # column. size = spm_unit("spm_unit_size", period.this_year) max_size = 20 tier = select( [size == n for n in range(1, max_size)], [ - getattr(p.tier, f"size_{n}").calc(monthly_income) + getattr(p.tier, f"size_{n}").calc(adjusted_income) for n in range(1, max_size) ], - default=getattr(p.tier, f"size_{max_size}").calc(monthly_income), + default=getattr(p.tier, f"size_{max_size}").calc(adjusted_income), ) # The daily fee per child depends on the tier and the child's care @@ -64,10 +65,12 @@ def formula(spm_unit, period, parameters): # Households whose only income is Temporary Assistance, or whose gross # income is below the state median income floor, pay only the minimum - # annual fee. + # annual fee. The 25% SMI floor is keyed on gross income (Manual + # 2025.010 item 3), unlike the sliding fee tier above. + gross_income = spm_unit("mo_ccs_countable_income", period) smi = spm_unit("hhs_smi", period.this_year) smi_floor = smi * p.smi_minimum_rate / MONTHS_IN_YEAR is_tanf = spm_unit("is_tanf_enrolled", period) - pays_minimum = is_tanf | (monthly_income < smi_floor) + pays_minimum = is_tanf | (gross_income < smi_floor) minimum_fee = p.minimum_annual_fee / MONTHS_IN_YEAR return where(pays_minimum, minimum_fee, monthly_fee) diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.py b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.py index f087fc1ae0b..79c417d8465 100644 --- a/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.py +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.py @@ -9,6 +9,7 @@ class mo_ccs_activity_eligible(Variable): defined_for = StateCode.MO reference = ( "https://web.archive.org/web/20211208073247id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/050/05", + "https://web.archive.org/web/20211208073247id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/050/25", ) def formula(spm_unit, period, parameters): @@ -17,10 +18,12 @@ def formula(spm_unit, period, parameters): # The need for care is met by employment, training or education, or job # search. We don't track activity-hours verification at the moment, so # an applicant is treated as meeting the need when an activity is - # present (Manual 2010.050.05-.20). + # present (Manual 2010.050.05-.20). An incapacitated parent is itself a + # valid need for care (Manual 2010.050.25). is_working = person("weekly_hours_worked", period.this_year) > 0 is_student = person("is_full_time_student", period.this_year) - individually_eligible = is_working | is_student + is_disabled = person("is_disabled", period.this_year) + individually_eligible = is_working | is_student | is_disabled # Require at least one head/spouse, and require every head/spouse to # have a qualifying activity so an SPM unit of only dependents does not # vacuously pass. diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible.py b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible.py index d0a6dce8867..5a9625e7ff0 100644 --- a/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible.py +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible.py @@ -9,7 +9,7 @@ class mo_ccs_eligible(Variable): defined_for = StateCode.MO reference = ( "https://www.law.cornell.edu/regulations/missouri/5-CSR-25-200-060", - "https://web.archive.org/web/20211208073247id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/005/00", + "https://www.law.cornell.edu/regulations/missouri/5-CSR-25-200-050", ) def formula(spm_unit, period, parameters): @@ -18,11 +18,12 @@ def formula(spm_unit, period, parameters): asset_eligible = spm_unit("is_ccdf_asset_eligible", period.this_year) activity_eligible = spm_unit("mo_ccs_activity_eligible", period) protective = spm_unit("mo_ccs_protective_services", period) - # The need for care is met by an activity or by the protective-services - # pathway. + # Protective-services children are eligible regardless of parental + # financial need and are not subject to the income maximums or the need + # for care, so the protective pathway bypasses both the income and + # activity tests (5 CSR 25-200.060(7)(B)). return ( has_eligible_child - & income_eligible & asset_eligible - & (activity_eligible | protective) + & ((income_eligible & activity_eligible) | protective) ) diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs.py b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs.py index ca2a6f81b46..22f58c0992a 100644 --- a/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs.py +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs.py @@ -11,6 +11,7 @@ class mo_ccs(Variable): reference = "https://www.law.cornell.edu/regulations/missouri/5-CSR-25-200-060" def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.mo.dese.ccs # Reimbursement is paid per child at a daily rate for each day of care, # capped at the family's child care charges. person = spm_unit.members @@ -20,4 +21,14 @@ def formula(spm_unit, period, parameters): per_child_reimbursement = min_(daily_benefit * days, pre_subsidy_per_child) total_reimbursement = spm_unit.sum(per_child_reimbursement) copay = spm_unit("mo_ccs_copay", period) - return max_(total_reimbursement - copay, 0) + + # Transitional Child Care families are funded at a reduced share of the + # base rate remaining after the sliding fee is subtracted (5 CSR + # 25-200.060(3)(C)2 and Manual 2010.045.00: DESE funds the percentage + # "of the remaining state base rate"). Traditional families are funded + # at the full rate, so the multiplier is 1 and the order has no effect. + adjusted_income = spm_unit("mo_ccs_adjusted_income", period) + monthly_fpg = spm_unit("spm_unit_fpg", period.this_year) / MONTHS_IN_YEAR + fpl_ratio = where(monthly_fpg > 0, adjusted_income / monthly_fpg, 0) + funding_rate = p.transitional.funding_rate.calc(fpl_ratio) + return funding_rate * max_(total_reimbursement - copay, 0) diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.py b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.py index dac6eced9e8..7f0cdaaae62 100644 --- a/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.py +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.py @@ -30,7 +30,7 @@ def provider_rate(provider): special_needs = provider.special_needs[region][age_group][time_category] return where(is_disabled, special_needs, base) - daily_rate = select( + return select( [ provider_type == MOCCSProviderType.REGISTERED_CENTER, provider_type == MOCCSProviderType.SIX_OR_FEWER, @@ -46,12 +46,3 @@ def provider_rate(provider): provider_rate(rates.group_home), ], ) - - # Transitional Child Care families are funded at a reduced share of the - # base rate by federal poverty guideline ratio; traditional families - # are funded at the full rate. - adjusted_income = person.spm_unit("mo_ccs_adjusted_income", period) - monthly_fpg = person.spm_unit("spm_unit_fpg", period.this_year) / MONTHS_IN_YEAR - fpl_ratio = where(monthly_fpg > 0, adjusted_income / monthly_fpg, 0) - funding_rate = p.transitional.funding_rate.calc(fpl_ratio) - return daily_rate * funding_rate From 0247d46a14d1eafcffa674df3b511331059b0f96 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 16 Jun 2026 19:11:09 -0400 Subject: [PATCH 4/5] Review-fix round 2: fix protective-pathway homelessness regression (MO CCS) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Round 1 made the protective-services pathway bypass the income+activity tests, but mo_ccs_protective_services wrongly included is_homeless. Homelessness is a need-for-care reason (Manual 2010.050.35), NOT a CSR 25-200.060(7)(A) income-maximum exemption — so it must not bypass income. - Remove is_homeless from mo_ccs_protective_services (now foster | protective) - Add is_homeless as a need-for-care term in mo_ccs_activity_eligible, so homeless families satisfy need-for-care but still face the income test - Document is_disabled as a proxy for the incapacity attestation we don't track - Repoint dead Wayback manual references (2010.050.25/.05/.35) to working snapshots - Correct copay/tier/size_* descriptions to "adjusted gross income" - Add regression tests: homeless over-income -> ineligible; within-income -> eligible Co-Authored-By: Claude Opus 4.8 (1M context) --- .../states/mo/dese/ccs/copay/tier/size_1.yaml | 2 +- .../mo/dese/ccs/copay/tier/size_10.yaml | 2 +- .../mo/dese/ccs/copay/tier/size_11.yaml | 2 +- .../mo/dese/ccs/copay/tier/size_12.yaml | 2 +- .../mo/dese/ccs/copay/tier/size_13.yaml | 2 +- .../mo/dese/ccs/copay/tier/size_14.yaml | 2 +- .../mo/dese/ccs/copay/tier/size_15.yaml | 2 +- .../mo/dese/ccs/copay/tier/size_16.yaml | 2 +- .../mo/dese/ccs/copay/tier/size_17.yaml | 2 +- .../mo/dese/ccs/copay/tier/size_18.yaml | 2 +- .../mo/dese/ccs/copay/tier/size_19.yaml | 2 +- .../states/mo/dese/ccs/copay/tier/size_2.yaml | 2 +- .../mo/dese/ccs/copay/tier/size_20.yaml | 2 +- .../states/mo/dese/ccs/copay/tier/size_3.yaml | 2 +- .../states/mo/dese/ccs/copay/tier/size_4.yaml | 2 +- .../states/mo/dese/ccs/copay/tier/size_5.yaml | 2 +- .../states/mo/dese/ccs/copay/tier/size_6.yaml | 2 +- .../states/mo/dese/ccs/copay/tier/size_7.yaml | 2 +- .../states/mo/dese/ccs/copay/tier/size_8.yaml | 2 +- .../states/mo/dese/ccs/copay/tier/size_9.yaml | 2 +- .../eligibility/mo_ccs_activity_eligible.yaml | 29 ++++++++ .../dese/ccs/eligibility/mo_ccs_eligible.yaml | 68 +++++++++++++++++++ .../mo_ccs_protective_services.yaml | 12 ++-- .../eligibility/mo_ccs_activity_eligible.py | 19 ++++-- .../eligibility/mo_ccs_protective_services.py | 10 ++- 25 files changed, 147 insertions(+), 31 deletions(-) diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_1.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_1.yaml index 9eceddfa242..d1adc372c46 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_1.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_1.yaml @@ -1,4 +1,4 @@ -description: Missouri assigns a sliding fee tier by monthly gross income for a household of one under the Child Care Subsidy program. +description: Missouri assigns a sliding fee tier by monthly adjusted gross income for a household of one under the Child Care Subsidy program. # Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is # the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are # Transitional Child Care Levels 1-3. diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_10.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_10.yaml index e73cc8dc43e..eb8bdeec3d2 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_10.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_10.yaml @@ -1,4 +1,4 @@ -description: Missouri assigns a sliding fee tier by monthly gross income for a household of ten under the Child Care Subsidy program. +description: Missouri assigns a sliding fee tier by monthly adjusted gross income for a household of ten under the Child Care Subsidy program. # Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is # the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are # Transitional Child Care Levels 1-3. diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_11.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_11.yaml index 831e3f270fc..6b5894ce7c6 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_11.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_11.yaml @@ -1,4 +1,4 @@ -description: Missouri assigns a sliding fee tier by monthly gross income for a household of eleven under the Child Care Subsidy program. +description: Missouri assigns a sliding fee tier by monthly adjusted gross income for a household of eleven under the Child Care Subsidy program. # Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is # the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are # Transitional Child Care Levels 1-3. diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_12.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_12.yaml index fdb83fef57d..093b8808921 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_12.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_12.yaml @@ -1,4 +1,4 @@ -description: Missouri assigns a sliding fee tier by monthly gross income for a household of twelve under the Child Care Subsidy program. +description: Missouri assigns a sliding fee tier by monthly adjusted gross income for a household of twelve under the Child Care Subsidy program. # Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is # the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are # Transitional Child Care Levels 1-3. diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_13.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_13.yaml index a60691808c9..638c92edf18 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_13.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_13.yaml @@ -1,4 +1,4 @@ -description: Missouri assigns a sliding fee tier by monthly gross income for a household of thirteen under the Child Care Subsidy program. +description: Missouri assigns a sliding fee tier by monthly adjusted gross income for a household of thirteen under the Child Care Subsidy program. # Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is # the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are # Transitional Child Care Levels 1-3. diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_14.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_14.yaml index aa186956228..a20ce120346 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_14.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_14.yaml @@ -1,4 +1,4 @@ -description: Missouri assigns a sliding fee tier by monthly gross income for a household of fourteen under the Child Care Subsidy program. +description: Missouri assigns a sliding fee tier by monthly adjusted gross income for a household of fourteen under the Child Care Subsidy program. # Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is # the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are # Transitional Child Care Levels 1-3. diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_15.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_15.yaml index 0679238bff5..3f136d28c23 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_15.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_15.yaml @@ -1,4 +1,4 @@ -description: Missouri assigns a sliding fee tier by monthly gross income for a household of fifteen under the Child Care Subsidy program. +description: Missouri assigns a sliding fee tier by monthly adjusted gross income for a household of fifteen under the Child Care Subsidy program. # Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is # the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are # Transitional Child Care Levels 1-3. diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_16.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_16.yaml index 0f82bcb7e98..54fbda5661b 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_16.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_16.yaml @@ -1,4 +1,4 @@ -description: Missouri assigns a sliding fee tier by monthly gross income for a household of sixteen under the Child Care Subsidy program. +description: Missouri assigns a sliding fee tier by monthly adjusted gross income for a household of sixteen under the Child Care Subsidy program. # Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is # the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are # Transitional Child Care Levels 1-3. diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_17.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_17.yaml index 91def6e4793..2d615fb28b3 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_17.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_17.yaml @@ -1,4 +1,4 @@ -description: Missouri assigns a sliding fee tier by monthly gross income for a household of seventeen under the Child Care Subsidy program. +description: Missouri assigns a sliding fee tier by monthly adjusted gross income for a household of seventeen under the Child Care Subsidy program. # Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is # the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are # Transitional Child Care Levels 1-3. diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_18.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_18.yaml index 8c9fe9f35d0..a26d4877821 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_18.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_18.yaml @@ -1,4 +1,4 @@ -description: Missouri assigns a sliding fee tier by monthly gross income for a household of eighteen under the Child Care Subsidy program. +description: Missouri assigns a sliding fee tier by monthly adjusted gross income for a household of eighteen under the Child Care Subsidy program. # Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is # the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are # Transitional Child Care Levels 1-3. diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_19.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_19.yaml index ad955a41749..345395debbe 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_19.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_19.yaml @@ -1,4 +1,4 @@ -description: Missouri assigns a sliding fee tier by monthly gross income for a household of nineteen under the Child Care Subsidy program. +description: Missouri assigns a sliding fee tier by monthly adjusted gross income for a household of nineteen under the Child Care Subsidy program. # Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is # the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are # Transitional Child Care Levels 1-3. diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_2.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_2.yaml index 0f33e847fb5..1b286ce1613 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_2.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_2.yaml @@ -1,4 +1,4 @@ -description: Missouri assigns a sliding fee tier by monthly gross income for a household of two under the Child Care Subsidy program. +description: Missouri assigns a sliding fee tier by monthly adjusted gross income for a household of two under the Child Care Subsidy program. # Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is # the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are # Transitional Child Care Levels 1-3. diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_20.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_20.yaml index d86a29068e3..817091567ab 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_20.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_20.yaml @@ -1,4 +1,4 @@ -description: Missouri assigns a sliding fee tier by monthly gross income for a household of twenty under the Child Care Subsidy program. +description: Missouri assigns a sliding fee tier by monthly adjusted gross income for a household of twenty under the Child Care Subsidy program. # Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is # the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are # Transitional Child Care Levels 1-3. diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_3.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_3.yaml index 0ff5e0c4417..a74f7782fd6 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_3.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_3.yaml @@ -1,4 +1,4 @@ -description: Missouri assigns a sliding fee tier by monthly gross income for a household of three under the Child Care Subsidy program. +description: Missouri assigns a sliding fee tier by monthly adjusted gross income for a household of three under the Child Care Subsidy program. # Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is # the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are # Transitional Child Care Levels 1-3. diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_4.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_4.yaml index 75b10fdedad..acaa06f3652 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_4.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_4.yaml @@ -1,4 +1,4 @@ -description: Missouri assigns a sliding fee tier by monthly gross income for a household of four under the Child Care Subsidy program. +description: Missouri assigns a sliding fee tier by monthly adjusted gross income for a household of four under the Child Care Subsidy program. # Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is # the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are # Transitional Child Care Levels 1-3. diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_5.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_5.yaml index 3d10f74ac19..1ef321e0dc2 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_5.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_5.yaml @@ -1,4 +1,4 @@ -description: Missouri assigns a sliding fee tier by monthly gross income for a household of five under the Child Care Subsidy program. +description: Missouri assigns a sliding fee tier by monthly adjusted gross income for a household of five under the Child Care Subsidy program. # Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is # the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are # Transitional Child Care Levels 1-3. diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_6.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_6.yaml index 2ccc5ddef97..8ad2587ad04 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_6.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_6.yaml @@ -1,4 +1,4 @@ -description: Missouri assigns a sliding fee tier by monthly gross income for a household of six under the Child Care Subsidy program. +description: Missouri assigns a sliding fee tier by monthly adjusted gross income for a household of six under the Child Care Subsidy program. # Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is # the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are # Transitional Child Care Levels 1-3. diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_7.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_7.yaml index beaea08ac81..3a20814777b 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_7.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_7.yaml @@ -1,4 +1,4 @@ -description: Missouri assigns a sliding fee tier by monthly gross income for a household of seven under the Child Care Subsidy program. +description: Missouri assigns a sliding fee tier by monthly adjusted gross income for a household of seven under the Child Care Subsidy program. # Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is # the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are # Transitional Child Care Levels 1-3. diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_8.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_8.yaml index 55fc26aa407..d2a16b9cf8d 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_8.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_8.yaml @@ -1,4 +1,4 @@ -description: Missouri assigns a sliding fee tier by monthly gross income for a household of eight under the Child Care Subsidy program. +description: Missouri assigns a sliding fee tier by monthly adjusted gross income for a household of eight under the Child Care Subsidy program. # Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is # the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are # Transitional Child Care Levels 1-3. diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_9.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_9.yaml index 9594f93ee93..9937df22319 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_9.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/copay/tier/size_9.yaml @@ -1,4 +1,4 @@ -description: Missouri assigns a sliding fee tier by monthly gross income for a household of nine under the Child Care Subsidy program. +description: Missouri assigns a sliding fee tier by monthly adjusted gross income for a household of nine under the Child Care Subsidy program. # Amount is the sliding fee tier index used by copay/daily_fee. Tier 0 is # the $1/year minimum; tiers 1-7 are the traditional ladder; tiers 8-10 are # Transitional Child Care Levels 1-3. diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.yaml index 7dacb63fc5d..aaa04b05ab7 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.yaml @@ -159,3 +159,32 @@ # 2010.050.25), so the disabled non-working spouse satisfies the per-parent # activity requirement and the unit passes. mo_ccs_activity_eligible: true + +- name: Case 7, homeless family with no other activity meets need for care. + period: 2025-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 0 + is_full_time_student: false + is_disabled: false + person2: + age: 5 + 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: MO + is_homeless: true + output: + # The head has no employment, is not a student, and is not disabled, but the + # family is homeless. Homelessness is a valid need for care for the whole + # family (Manual 2010.050.35), so the activity requirement is satisfied. + mo_ccs_activity_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible.yaml index 9ec375f9880..18bb99a65d7 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible.yaml @@ -194,3 +194,71 @@ # (5 CSR 25-200.060(7)(B)), so the unit is eligible. mo_ccs_income_eligible: false mo_ccs_eligible: true + +- name: Case 8, homeless family above the income limit with no work is ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 60_000 + immigration_status: CITIZEN + weekly_hours_worked: 0 + is_full_time_student: false + 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: MO + is_homeless: true + output: + # Homelessness satisfies the need-for-care/activity requirement (Manual + # 2010.050.35), but unlike the (7)(A) protective categories it does NOT + # bypass the income test. 60,000/yr = 5,000/mo > 2,643.75 (150% FPL size 2) + # -> income ineligible, no protective pathway, so the unit is ineligible. + mo_ccs_income_eligible: false + mo_ccs_activity_eligible: true + mo_ccs_protective_services: false + mo_ccs_eligible: false + +- name: Case 9, homeless family within the income limit with no work is eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 12_000 + immigration_status: CITIZEN + weekly_hours_worked: 0 + is_full_time_student: false + 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: MO + is_homeless: true + output: + # 12,000/yr = 1,000/mo < 2,643.75 (150% FPL size 2) -> income eligible. + # Homelessness satisfies the activity/need-for-care requirement (Manual + # 2010.050.35), so the unit is eligible without any work activity. + mo_ccs_income_eligible: true + mo_ccs_activity_eligible: true + mo_ccs_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_protective_services.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_protective_services.yaml index 640dc17ce15..f6098f72e7e 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_protective_services.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_protective_services.yaml @@ -1,7 +1,8 @@ # MO CCS protective services pathway tests # mo_ccs_protective_services is SPMUnit, MONTH. -# True when the unit has a foster child, is homeless, or has a child -# receiving/needing protective services. +# True when the unit has a foster child or a child receiving/needing protective +# services. Homelessness is NOT a (7)(A) protective category; it is a separate +# valid need for care handled in mo_ccs_activity_eligible (Manual 2010.050.35). - name: Case 1, foster child triggers protective services. period: 2025-01 @@ -22,7 +23,7 @@ output: mo_ccs_protective_services: true -- name: Case 2, homeless family triggers protective services. +- name: Case 2, homelessness alone does not trigger protective services. period: 2025-01 input: people: @@ -39,7 +40,10 @@ state_code: MO is_homeless: true output: - mo_ccs_protective_services: true + # Homelessness is not a (7)(A) protective category; it is a need for care + # handled in mo_ccs_activity_eligible (Manual 2010.050.35), so the protective + # pathway is not triggered by homelessness alone. + mo_ccs_protective_services: false - name: Case 3, child needing protective services triggers pathway. period: 2025-01 diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.py b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.py index 79c417d8465..029a85b2591 100644 --- a/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.py +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.py @@ -8,8 +8,9 @@ class mo_ccs_activity_eligible(Variable): definition_period = MONTH defined_for = StateCode.MO reference = ( - "https://web.archive.org/web/20211208073247id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/050/05", - "https://web.archive.org/web/20211208073247id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/050/25", + "https://web.archive.org/web/20211208053941id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/050/05", + "https://web.archive.org/web/20211208064125id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/050/25", + "https://web.archive.org/web/20211208065820id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/050/35", ) def formula(spm_unit, period, parameters): @@ -18,8 +19,11 @@ def formula(spm_unit, period, parameters): # The need for care is met by employment, training or education, or job # search. We don't track activity-hours verification at the moment, so # an applicant is treated as meeting the need when an activity is - # present (Manual 2010.050.05-.20). An incapacitated parent is itself a - # valid need for care (Manual 2010.050.25). + # present (Manual 2010.050.05-.20). The incapacitated-parent pathway + # (Manual 2010.050.25) requires a physician's statement attesting that + # child care is needed because of the incapacity; we don't track that + # attestation at the moment, so is_disabled is used as a proxy for the + # incapacitated parent. is_working = person("weekly_hours_worked", period.this_year) > 0 is_student = person("is_full_time_student", period.this_year) is_disabled = person("is_disabled", period.this_year) @@ -29,4 +33,9 @@ def formula(spm_unit, period, parameters): # vacuously pass. 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 + # Homelessness is a valid need for care for the whole family (Manual + # 2010.050.35), so it satisfies the need-for-care requirement on its own + # — but, unlike the (7)(A) protective categories, a homeless family must + # still pass the income test. + is_homeless = spm_unit.household("is_homeless", period.this_year) + return has_head_or_spouse & (all_covered | is_homeless) diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_protective_services.py b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_protective_services.py index 2ccaab94f10..84ef8257ada 100644 --- a/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_protective_services.py +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_protective_services.py @@ -10,8 +10,14 @@ class mo_ccs_protective_services(Variable): reference = "https://www.law.cornell.edu/regulations/missouri/5-CSR-25-200-050" def formula(spm_unit, period, parameters): + # Per 5 CSR 25-200.060(7)(A), the protective-services categories that + # bypass the income maximums and the financial-need test are children + # in DSS legal custody (proxied by foster care) and children receiving + # or needing protective services. Homelessness is not a (7)(A) category; + # it is a separate valid need for care (Manual 2010.050.35), so it is + # handled in mo_ccs_activity_eligible and is still subject to the income + # test. has_foster_child = add(spm_unit, period, ["is_in_foster_care"]) > 0 - is_homeless = spm_unit.household("is_homeless", period.this_year) has_protective_child = ( add( spm_unit, @@ -20,4 +26,4 @@ def formula(spm_unit, period, parameters): ) > 0 ) - return has_foster_child | is_homeless | has_protective_child + return has_foster_child | has_protective_child From 40682061bf53245ba33658466a9b1550d9597c70 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 16 Jun 2026 23:52:00 -0400 Subject: [PATCH 5/5] Review-fix round 3: fix time-category per-day bug and address review items (MO CCS) Critical: - mo_ccs_time_category now reads childcare_hours_per_day (the chart's full/half/part thresholds are per day, not per week); update cascade across all 6 test files preserving each case's time category. References: - funding_rate / income fpl_rate transitional / income_eligible: cite 5 CSR 25-200.060(4)(C) Transitional Child Care and Manual 2010.045.00; fix pre-existing (3)(C) -> (4)(C) misreference in mo_ccs. Docs: - Note 85% SMI is the informational CCDF ceiling, infant/toddler special-needs rate equals base (deferred +25%), is_disabled proxy for the six-criteria special-needs definition, and job-search need not modeled. Tests: - Add TCC2 (0.60) and TCC3 (0.50) end-to-end funding cases, registered-center half/part rate cells, and a multi-child (special-needs + base) case. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../ccs/income/fpl_rate/transitional.yaml | 6 + .../mo/dese/ccs/time_category/hours.yaml | 2 +- .../dese/ccs/transitional/funding_rate.yaml | 6 +- .../mo/dese/ccs/copay/mo_ccs_copay.yaml | 38 ++--- .../gov/states/mo/dese/ccs/integration.yaml | 14 +- .../gov/states/mo/dese/ccs/mo_ccs.yaml | 135 +++++++++++++++++- .../ccs/mo_ccs_maximum_daily_benefit.yaml | 115 +++++++++++---- .../mo/dese/ccs/mo_ccs_time_category.yaml | 26 ++-- .../mo/dese/ccs/mo_child_care_subsidies.yaml | 4 +- .../eligibility/mo_ccs_activity_eligible.py | 5 +- .../ccs/eligibility/mo_ccs_eligible_child.py | 7 + .../ccs/eligibility/mo_ccs_income_eligible.py | 7 +- .../gov/states/mo/dese/ccs/mo_ccs.py | 7 +- .../dese/ccs/mo_ccs_maximum_daily_benefit.py | 6 +- .../mo/dese/ccs/mo_ccs_time_category.py | 4 +- 15 files changed, 299 insertions(+), 83 deletions(-) diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/income/fpl_rate/transitional.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/income/fpl_rate/transitional.yaml index 000490f32e7..0ff75383bc9 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/income/fpl_rate/transitional.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/income/fpl_rate/transitional.yaml @@ -7,6 +7,12 @@ metadata: period: year label: Missouri Child Care Subsidy transitional income limit reference: + # The 242% figure is stated verbatim in the Manual ("not to exceed 242 + # percent of poverty"); 5 CSR 25-200.060 is the enabling authority and the + # chart shows the dollar bands. The live manual page returns HTTP 403 to + # automated access, so the Wayback Machine snapshot is cited. + - title: Missouri Child Care Subsidy Eligibility Policy Manual 2010.045.00 Income Eligibility Guidelines + href: https://web.archive.org/web/20250831220820id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/045/00 - title: 5 CSR 25-200.060 Eligibility and Authorization for Child Care Subsidy href: https://www.law.cornell.edu/regulations/missouri/5-CSR-25-200-060 - title: November 2025 Child Care Eligibility Income Guidelines and Sliding Fee Chart diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/time_category/hours.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/time_category/hours.yaml index df583d5f832..1a628dcd644 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/time_category/hours.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/time_category/hours.yaml @@ -1,4 +1,4 @@ -description: Missouri determines the care time unit from weekly hours of care under the Child Care Subsidy program. +description: Missouri determines the care time unit from daily hours of care under the Child Care Subsidy program. # Amount is the MOCCSTimeCategory enum index: 0 = FULL_TIME, 1 = HALF_TIME, # 2 = PART_TIME. Part time is one half hour up to 3 hours of care, half time is # 3 up to 5 hours, and full time is 5 up to 12 hours (chart footnotes). diff --git a/policyengine_us/parameters/gov/states/mo/dese/ccs/transitional/funding_rate.yaml b/policyengine_us/parameters/gov/states/mo/dese/ccs/transitional/funding_rate.yaml index 0f650c8ceda..5f3b92b7ad9 100644 --- a/policyengine_us/parameters/gov/states/mo/dese/ccs/transitional/funding_rate.yaml +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/transitional/funding_rate.yaml @@ -12,9 +12,13 @@ metadata: reference: # The live DESE manual page returns HTTP 403 to automated access; this is # the current page text recovered via the Wayback Machine. + # The 80/60/50% phase-out shares are stated in the Manual; 5 CSR + # 25-200.060(4)(C) authorizes the gradual phase out of Transitional Child + # Care "in accordance with the Manual" but does not itself list the + # percentages. - title: Missouri Child Care Subsidy Eligibility Policy Manual 2010.045.00 Income Eligibility Guidelines href: https://web.archive.org/web/20250831220820id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/045/00 - - title: 5 CSR 25-200.060 Eligibility and Authorization for Child Care Subsidy (Transitional Child Care) + - title: 5 CSR 25-200.060(4)(C) Eligibility and Authorization for Child Care Subsidy (Transitional Child Care) href: https://www.law.cornell.edu/regulations/missouri/5-CSR-25-200-060 brackets: diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/copay/mo_ccs_copay.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/copay/mo_ccs_copay.yaml index 2cad76b9a98..939f7d63fcc 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/copay/mo_ccs_copay.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/copay/mo_ccs_copay.yaml @@ -30,7 +30,7 @@ age: 5 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 tax_units: tax_unit: @@ -60,7 +60,7 @@ age: 5 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 4 + childcare_hours_per_day: 4 childcare_attending_days_per_month: 20 tax_units: tax_unit: @@ -88,7 +88,7 @@ age: 5 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 2 + childcare_hours_per_day: 2 childcare_attending_days_per_month: 20 tax_units: tax_unit: @@ -116,7 +116,7 @@ age: 5 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 tax_units: tax_unit: @@ -145,7 +145,7 @@ age: 5 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 tax_units: tax_unit: @@ -174,7 +174,7 @@ age: 5 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 tax_units: tax_unit: @@ -204,7 +204,7 @@ is_tax_unit_dependent: true immigration_status: CITIZEN is_disabled: true - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 tax_units: tax_unit: @@ -232,13 +232,13 @@ age: 5 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 person3: age: 3 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 tax_units: tax_unit: @@ -269,7 +269,7 @@ age: 5 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 tax_units: tax_unit: @@ -299,7 +299,7 @@ age: 5 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 tax_units: tax_unit: @@ -328,7 +328,7 @@ age: 5 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 tax_units: tax_unit: @@ -357,7 +357,7 @@ age: 5 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 tax_units: tax_unit: @@ -386,7 +386,7 @@ age: 5 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 person3: age: 38 @@ -520,7 +520,7 @@ age: 5 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 4 + childcare_hours_per_day: 4 childcare_attending_days_per_month: 20 tax_units: tax_unit: @@ -533,7 +533,7 @@ members: [person1, person2] state_code: MO output: - # Income 33,600 / 12 = 2,800 > 2,644 -> tier 8 (TCC1). 4 hrs/week -> half + # Income 33,600 / 12 = 2,800 > 2,644 -> tier 8 (TCC1). 4 hrs/day -> half # unit. Tier 8 half fee = $3.75/day. $3.75 * 20 * 1 = $75/mo. mo_ccs_copay: 75 @@ -549,7 +549,7 @@ age: 5 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 2 + childcare_hours_per_day: 2 childcare_attending_days_per_month: 20 tax_units: tax_unit: @@ -562,7 +562,7 @@ members: [person1, person2] state_code: MO output: - # Income 33,600 / 12 = 2,800 > 2,644 -> tier 8 (TCC1). 2 hrs/week -> part + # Income 33,600 / 12 = 2,800 > 2,644 -> tier 8 (TCC1). 2 hrs/day -> part # unit. Tier 8 part fee = $2.50/day. $2.50 * 20 * 1 = $50/mo. mo_ccs_copay: 50 @@ -578,7 +578,7 @@ age: 5 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 person3: age: 38 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/integration.yaml index 3bbefe67956..59131a1e26d 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/integration.yaml @@ -32,7 +32,7 @@ age: 1 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 mo_ccs_provider_type: LICENSED_CENTER tax_units: @@ -89,7 +89,7 @@ age: 3 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 mo_ccs_provider_type: LICENSED_CENTER tax_units: @@ -125,7 +125,7 @@ age: 1 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 mo_ccs_provider_type: LICENSED_CENTER tax_units: @@ -171,7 +171,7 @@ is_tax_unit_dependent: true immigration_status: CITIZEN is_disabled: true - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 mo_ccs_provider_type: LICENSED_CENTER tax_units: @@ -210,7 +210,7 @@ age: 1 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 mo_ccs_provider_type: LICENSED_CENTER tax_units: @@ -247,7 +247,7 @@ age: 1 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 mo_ccs_provider_type: LICENSED_CENTER tax_units: @@ -282,7 +282,7 @@ age: 1 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 mo_ccs_provider_type: LICENSED_CENTER tax_units: diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs.yaml index fb4f94dbd05..7f23f1853f9 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs.yaml @@ -24,7 +24,7 @@ age: 1 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 mo_ccs_provider_type: LICENSED_CENTER tax_units: @@ -61,7 +61,7 @@ age: 1 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 mo_ccs_provider_type: LICENSED_CENTER tax_units: @@ -96,7 +96,7 @@ age: 1 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 mo_ccs_provider_type: LICENSED_CENTER tax_units: @@ -129,7 +129,7 @@ age: 1 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 mo_ccs_provider_type: LICENSED_CENTER tax_units: @@ -165,7 +165,7 @@ is_tax_unit_dependent: true immigration_status: CITIZEN is_disabled: true - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 mo_ccs_provider_type: LICENSED_CENTER tax_units: @@ -201,7 +201,7 @@ age: 1 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 mo_ccs_provider_type: LICENSED_CENTER tax_units: @@ -224,3 +224,126 @@ # expenses = 12,000 / 12 = 1,000 caps reimbursement (rate*days = 1,920). # Benefit = max(1,000 - 0.0833, 0) = $999.92 (not inflated by negative income). mo_ccs: 999.92 + +- name: Case 7, transitional family in TCC2 funded at 60 percent. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 42_300 + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_day: 8 + childcare_attending_days_per_month: 20 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + mo_ccs_enrolled: true + spm_unit_pre_subsidy_childcare_expenses: 30_000 + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Income 42,300/yr = 3,525/mo. Enrolled -> transitional limit 4,265.25 -> + # eligible. FPL ratio = 3,525 / 1,762.50 = 2.00 -> TCC2 funding 0.60. + # Size 2 income 3,525 -> tier 9 full fee $8.75/day * 20 = $175 copay. + # Reimbursement = min($96 * 20, $2,500) = $1,920. + # Benefit = 0.60 * max(1,920 - 175, 0) = 0.60 * 1,745 = $1,047. + mo_ccs: 1_047 + +- name: Case 8, transitional family in TCC3 funded at 50 percent. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 48_000 + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_day: 8 + childcare_attending_days_per_month: 20 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + mo_ccs_enrolled: true + spm_unit_pre_subsidy_childcare_expenses: 30_000 + households: + household: + members: [person1, person2] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Income 48,000/yr = 4,000/mo. Enrolled -> transitional limit 4,265.25 -> + # eligible. FPL ratio = 4,000 / 1,762.50 = 2.27 -> TCC3 funding 0.50. + # Size 2 income 4,000 -> tier 10 full fee $10/day * 20 = $200 copay. + # Reimbursement = min($96 * 20, $2,500) = $1,920. + # Benefit = 0.50 * max(1,920 - 200, 0) = 0.50 * 1,720 = $860. + mo_ccs: 860 + +- name: Case 9, family with two children, one with special needs. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + is_disabled: true + childcare_hours_per_day: 8 + childcare_attending_days_per_month: 20 + mo_ccs_provider_type: LICENSED_CENTER + person3: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_day: 8 + childcare_attending_days_per_month: 20 + mo_ccs_provider_type: LICENSED_CENTER + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_pre_subsidy_childcare_expenses: 120_000 + households: + household: + members: [person1, person2, person3] + state_code: MO + county: JACKSON_COUNTY_MO + output: + # Size 3, income 30,000/yr = 2,500/mo (above SMI floor 1,851.94; not TANF). + # New applicant: 2,500 <= 150% FPL size 3 (3,331.25) -> eligible; funding 1.0. + # Disabled preschooler -> PS rate $71.57/day; infant -> base rate $96/day. + # Reimbursement = (71.57 + 96) * 20 = $3,351.40 (expenses not binding). + # Copay: only the non-disabled child is charged; size 3 income 2,500 -> + # tier 7 full fee $5/day * 20 = $100. Disabled child waived. + # Benefit = max(3,351.40 - 100, 0) = $3,251.40. + mo_ccs: 3_251.40 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.yaml index c1e69a1acc4..8b4b8973505 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.yaml @@ -20,7 +20,7 @@ age: 1 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 mo_ccs_provider_type: LICENSED_CENTER tax_units: tax_unit: @@ -49,7 +49,7 @@ age: 1 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 mo_ccs_provider_type: REGISTERED_CENTER tax_units: tax_unit: @@ -78,7 +78,7 @@ age: 1 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 mo_ccs_provider_type: SIX_OR_FEWER tax_units: tax_unit: @@ -107,7 +107,7 @@ age: 1 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 mo_ccs_provider_type: LICENSED_FAMILY_HOME tax_units: tax_unit: @@ -136,7 +136,7 @@ age: 1 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 mo_ccs_provider_type: GROUP_HOME tax_units: tax_unit: @@ -166,7 +166,7 @@ age: 3 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 mo_ccs_provider_type: LICENSED_CENTER tax_units: tax_unit: @@ -195,7 +195,7 @@ age: 3 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 mo_ccs_provider_type: LICENSED_CENTER tax_units: tax_unit: @@ -224,7 +224,7 @@ age: 3 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 mo_ccs_provider_type: LICENSED_CENTER tax_units: tax_unit: @@ -253,7 +253,7 @@ age: 3 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 mo_ccs_provider_type: LICENSED_CENTER tax_units: tax_unit: @@ -283,7 +283,7 @@ age: 1 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 4 + childcare_hours_per_day: 4 mo_ccs_provider_type: LICENSED_CENTER tax_units: tax_unit: @@ -297,7 +297,7 @@ state_code: MO county: JACKSON_COUNTY_MO output: - # 4 hours/week -> half time. Licensed center, dense urban, infant/toddler, + # 4 hours/day -> half time. Licensed center, dense urban, infant/toddler, # half time = $72/day. mo_ccs_maximum_daily_benefit: [0, 72] @@ -313,7 +313,7 @@ age: 1 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 2 + childcare_hours_per_day: 2 mo_ccs_provider_type: LICENSED_CENTER tax_units: tax_unit: @@ -327,7 +327,7 @@ state_code: MO county: JACKSON_COUNTY_MO output: - # 2 hours/week -> part time. Licensed center, dense urban, infant/toddler, + # 2 hours/day -> part time. Licensed center, dense urban, infant/toddler, # part time = $48/day. mo_ccs_maximum_daily_benefit: [0, 48] @@ -344,7 +344,7 @@ age: 8 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 mo_ccs_provider_type: LICENSED_CENTER tax_units: tax_unit: @@ -375,7 +375,7 @@ is_tax_unit_dependent: true immigration_status: CITIZEN is_disabled: true - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 mo_ccs_provider_type: LICENSED_CENTER tax_units: tax_unit: @@ -407,7 +407,7 @@ age: 1 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 mo_ccs_provider_type: LICENSED_CENTER tax_units: tax_unit: @@ -439,7 +439,7 @@ age: 1 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 mo_ccs_provider_type: LICENSED_CENTER tax_units: tax_unit: @@ -471,7 +471,7 @@ age: 1 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 mo_ccs_provider_type: LICENSED_CENTER tax_units: tax_unit: @@ -505,7 +505,7 @@ age: 3 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 mo_ccs_provider_type: LICENSED_CENTER tax_units: tax_unit: @@ -536,7 +536,7 @@ age: 3 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 mo_ccs_provider_type: LICENSED_CENTER tax_units: tax_unit: @@ -572,7 +572,7 @@ is_tax_unit_dependent: true immigration_status: CITIZEN is_disabled: true - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 mo_ccs_provider_type: REGISTERED_CENTER tax_units: tax_unit: @@ -603,7 +603,7 @@ is_tax_unit_dependent: true immigration_status: CITIZEN is_disabled: true - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 mo_ccs_provider_type: SIX_OR_FEWER tax_units: tax_unit: @@ -634,7 +634,7 @@ is_tax_unit_dependent: true immigration_status: CITIZEN is_disabled: true - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 mo_ccs_provider_type: LICENSED_FAMILY_HOME tax_units: tax_unit: @@ -665,7 +665,7 @@ is_tax_unit_dependent: true immigration_status: CITIZEN is_disabled: true - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 mo_ccs_provider_type: GROUP_HOME tax_units: tax_unit: @@ -697,7 +697,7 @@ age: 8 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 mo_ccs_provider_type: LICENSED_CENTER tax_units: tax_unit: @@ -726,7 +726,7 @@ age: 1 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 mo_ccs_provider_type: LICENSED_CENTER tax_units: tax_unit: @@ -755,7 +755,7 @@ age: 8 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 mo_ccs_provider_type: LICENSED_CENTER tax_units: tax_unit: @@ -771,3 +771,64 @@ output: # Licensed center, rural (Region 5 default), school age, full time = $30.02/day. mo_ccs_maximum_daily_benefit: [0, 30.02] + +# === Half/part time coverage on a second provider type and region === +- name: Case 26, registered center urban infant half time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_day: 4 + mo_ccs_provider_type: REGISTERED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + county: BOONE_COUNTY_MO + output: + # 4 hours/day -> half time. Registered center, urban (Region 3), + # infant/toddler, half time = $52.50/day. + mo_ccs_maximum_daily_benefit: [0, 52.5] + +- name: Case 27, registered center urban infant part time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_day: 2 + mo_ccs_provider_type: REGISTERED_CENTER + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MO + county: BOONE_COUNTY_MO + output: + # 2 hours/day -> part time. Registered center, urban (Region 3), + # infant/toddler, part time = $35/day. + mo_ccs_maximum_daily_benefit: [0, 35] diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_time_category.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_time_category.yaml index aad1194495b..07b8b9e54c9 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_time_category.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_time_category.yaml @@ -1,28 +1,28 @@ # MO CCS care time unit tests # mo_ccs_time_category is Person, MONTH (enum: FULL_TIME, HALF_TIME, -# PART_TIME). From childcare_hours_per_week: part 0.5-<3, half 3-<5, +# PART_TIME). From childcare_hours_per_day: part 0.5-<3, half 3-<5, # full 5-<12. Default (0 hours) -> PART_TIME (lowest bracket). -- name: Case 1, thirty hours per week is full time. +- name: Case 1, eight hours per day is full time. period: 2025-01 input: people: person1: - childcare_hours_per_week: 30 + childcare_hours_per_day: 8 households: household: members: [person1] state_code: MO output: - # 30 >= 5 -> FULL_TIME. + # 8 >= 5 -> FULL_TIME. mo_ccs_time_category: FULL_TIME -- name: Case 2, five hours per week is full time at boundary. +- name: Case 2, five hours per day is full time at boundary. period: 2025-01 input: people: person1: - childcare_hours_per_week: 5 + childcare_hours_per_day: 5 households: household: members: [person1] @@ -31,12 +31,12 @@ # Threshold 5 (inclusive) -> FULL_TIME. mo_ccs_time_category: FULL_TIME -- name: Case 3, four hours per week is half time. +- name: Case 3, four hours per day is half time. period: 2025-01 input: people: person1: - childcare_hours_per_week: 4 + childcare_hours_per_day: 4 households: household: members: [person1] @@ -45,12 +45,12 @@ # 3 <= 4 < 5 -> HALF_TIME. mo_ccs_time_category: HALF_TIME -- name: Case 4, three hours per week is half time at boundary. +- name: Case 4, three hours per day is half time at boundary. period: 2025-01 input: people: person1: - childcare_hours_per_week: 3 + childcare_hours_per_day: 3 households: household: members: [person1] @@ -59,12 +59,12 @@ # Threshold 3 (inclusive) -> HALF_TIME. mo_ccs_time_category: HALF_TIME -- name: Case 5, two hours per week is part time. +- name: Case 5, two hours per day is part time. period: 2025-01 input: people: person1: - childcare_hours_per_week: 2 + childcare_hours_per_day: 2 households: household: members: [person1] @@ -78,7 +78,7 @@ input: people: person1: - childcare_hours_per_week: 0 + childcare_hours_per_day: 0 households: household: members: [person1] diff --git a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_child_care_subsidies.yaml b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_child_care_subsidies.yaml index 627cee38fbb..87409d1218f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_child_care_subsidies.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_child_care_subsidies.yaml @@ -16,7 +16,7 @@ age: 1 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 mo_ccs_provider_type: LICENSED_CENTER tax_units: @@ -49,7 +49,7 @@ age: 1 is_tax_unit_dependent: true immigration_status: CITIZEN - childcare_hours_per_week: 40 + childcare_hours_per_day: 8 childcare_attending_days_per_month: 20 mo_ccs_provider_type: LICENSED_CENTER tax_units: diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.py b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.py index 029a85b2591..f09a7d0b1d6 100644 --- a/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.py +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.py @@ -19,7 +19,10 @@ def formula(spm_unit, period, parameters): # The need for care is met by employment, training or education, or job # search. We don't track activity-hours verification at the moment, so # an applicant is treated as meeting the need when an activity is - # present (Manual 2010.050.05-.20). The incapacitated-parent pathway + # present (Manual 2010.050.05-.20). Job search (Manual 2010.050.20) is + # also a qualifying need but has no clean PolicyEngine input, so a + # family needing care solely for job search is not captured. The + # incapacitated-parent pathway # (Manual 2010.050.25) requires a physician's statement attesting that # child care is needed because of the incapacity; we don't track that # attestation at the moment, so is_disabled is used as a proxy for the diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible_child.py b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible_child.py index acded602c9c..dfbea2a68a3 100644 --- a/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible_child.py +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible_child.py @@ -15,6 +15,13 @@ class mo_ccs_eligible_child(Variable): def formula(person, period, parameters): p = parameters(period).gov.states.mo.dese.ccs.eligibility age = person("age", period.this_year) + # "Child with special needs" (5 CSR 25-200.050) covers six criteria: + # SSI receipt, mental-health services, verified disability, protective + # services, adoption subsidy, or court supervision. We approximate it + # with is_disabled (verified disability); the other pathways are not + # tracked at the moment. is_disabled also selects the special-needs rate + # column (mo_ccs_maximum_daily_benefit) and waives the sliding fee + # (mo_ccs_copay). is_disabled = person("is_disabled", period.this_year) is_in_school = person("is_in_k12_school", period.this_year) # A child with special needs is eligible to a higher age, extended by diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_income_eligible.py b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_income_eligible.py index cffa10eb6dd..e2975eddcad 100644 --- a/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_income_eligible.py +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_income_eligible.py @@ -8,7 +8,7 @@ class mo_ccs_income_eligible(Variable): definition_period = MONTH defined_for = StateCode.MO reference = ( - "https://web.archive.org/web/20211208073807id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/045/10", + "https://web.archive.org/web/20250831220820id_/https://dese.mo.gov/childhood/quality-programs/child-care-subsidy/child-care-manual/2010/045/00", "https://www.law.cornell.edu/regulations/missouri/5-CSR-25-200-060", ) @@ -16,6 +16,11 @@ def formula(spm_unit, period, parameters): p = parameters(period).gov.states.mo.dese.ccs.income.fpl_rate adjusted_income = spm_unit("mo_ccs_adjusted_income", period) monthly_fpg = spm_unit("spm_unit_fpg", period.this_year) / MONTHS_IN_YEAR + # Missouri's operative income limit is the FPG-based ceiling (150% for + # new applicants, 242% transitional). The 85% State Median Income row on + # the DESE chart is the informational federal CCDF ceiling, not a + # separate operative cap, and binds above the FPG limit, so it is not + # modeled as a test here. # New applicants use the traditional limit; existing families may # qualify up to the higher transitional limit. enrolled = spm_unit("mo_ccs_enrolled", period) diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs.py b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs.py index 22f58c0992a..064fcdca22e 100644 --- a/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs.py +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs.py @@ -24,9 +24,10 @@ def formula(spm_unit, period, parameters): # Transitional Child Care families are funded at a reduced share of the # base rate remaining after the sliding fee is subtracted (5 CSR - # 25-200.060(3)(C)2 and Manual 2010.045.00: DESE funds the percentage - # "of the remaining state base rate"). Traditional families are funded - # at the full rate, so the multiplier is 1 and the order has no effect. + # 25-200.060(4)(C) Transitional Child Care and Manual 2010.045.00: DESE + # funds the percentage "of the remaining state base rate"). Traditional + # families are funded at the full rate, so the multiplier is 1 and the + # order has no effect. adjusted_income = spm_unit("mo_ccs_adjusted_income", period) monthly_fpg = spm_unit("spm_unit_fpg", period.this_year) / MONTHS_IN_YEAR fpl_ratio = where(monthly_fpg > 0, adjusted_income / monthly_fpg, 0) diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.py b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.py index 7f0cdaaae62..bb1f592266f 100644 --- a/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.py +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.py @@ -22,7 +22,11 @@ def formula(person, period, parameters): rates = p.rates # A child with special needs is reimbursed from the special needs (PS) - # rate column; all other children use the base column. + # rate column; all other children use the base column. For preschool and + # school-age children the PS column is the market rate; for + # infant/toddler the published PS rate equals the base rate (the +25% + # special-needs enhancement is a deferred follow-up), so special-needs + # infants reimburse at the base rate. is_disabled = person("is_disabled", period.this_year) def provider_rate(provider): diff --git a/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_time_category.py b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_time_category.py index 654cbca83ed..d2c7b17f9d4 100644 --- a/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_time_category.py +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_time_category.py @@ -18,7 +18,9 @@ class mo_ccs_time_category(Variable): reference = "https://dese.mo.gov/sites/dese/files/media/pdf/2025/10/10.2025%20Income%20Eligibility%20Table%20%282%29.pdf" def formula(person, period, parameters): - hours = person("childcare_hours_per_week", period.this_year) + # The chart's full/half/part thresholds (5/3/0.5 hours) are per day of + # care, so the daily-hours input is used, not the weekly total. + hours = person("childcare_hours_per_day", period.this_year) p = parameters(period).gov.states.mo.dese.ccs.time_category # The hours bracket returns the MOCCSTimeCategory enum index: # 0 = FULL_TIME, 1 = HALF_TIME, 2 = PART_TIME.