diff --git a/changelog.d/mo-ccap.added.md b/changelog.d/mo-ccap.added.md new file mode 100644 index 00000000000..a45480605db --- /dev/null +++ b/changelog.d/mo-ccap.added.md @@ -0,0 +1 @@ +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..d1adc372c46 --- /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 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. +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..eb8bdeec3d2 --- /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 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. +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..6b5894ce7c6 --- /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 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. +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..093b8808921 --- /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 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. +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..638c92edf18 --- /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 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. +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..a20ce120346 --- /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 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. +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..3f136d28c23 --- /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 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. +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..54fbda5661b --- /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 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. +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..2d615fb28b3 --- /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 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. +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..a26d4877821 --- /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 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. +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..345395debbe --- /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 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. +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..1b286ce1613 --- /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 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. +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..817091567ab --- /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 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. +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..a74f7782fd6 --- /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 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. +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..acaa06f3652 --- /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 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. +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..1ef321e0dc2 --- /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 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. +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..8ad2587ad04 --- /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 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. +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..3a20814777b --- /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 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. +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..d2a16b9cf8d --- /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 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. +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..9937df22319 --- /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 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. +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..8cbf76ab0c8 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/eligibility/child_age_limit.yaml @@ -0,0 +1,11 @@ +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 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..116f4b3390e --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/income/fpl_rate/initial_eligibility.yaml @@ -0,0 +1,15 @@ +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: + # 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/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..0ff75383bc9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/income/fpl_rate/transitional.yaml @@ -0,0 +1,19 @@ +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: + # 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 + 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..1a628dcd644 --- /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 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). +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..5f3b92b7ad9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mo/dese/ccs/transitional/funding_rate.yaml @@ -0,0 +1,40 @@ +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: + # 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(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: + - 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..939f7d63fcc --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/copay/mo_ccs_copay.yaml @@ -0,0 +1,683 @@ +# MO CCS sliding fee (copay) tests +# mo_ccs_copay is SPMUnit, MONTH. +# 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 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, 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. +# 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_day: 8 + 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_day: 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_day: 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_day: 8 + 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_day: 8 + 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_day: 8 + 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_day: 8 + 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_day: 8 + childcare_attending_days_per_month: 20 + person3: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_day: 8 + 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_day: 8 + 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_day: 8 + 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_day: 8 + 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_day: 8 + 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_day: 8 + 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 + +- 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_day: 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/day -> 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_day: 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/day -> 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_day: 8 + 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 new file mode 100644 index 00000000000..aaa04b05ab7 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.yaml @@ -0,0 +1,190 @@ +# 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), 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-.25). + +- 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 + +- 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 + +- 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 new file mode 100644 index 00000000000..18bb99a65d7 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible.yaml @@ -0,0 +1,264 @@ +# MO CCS overall eligibility tests +# mo_ccs_eligible is SPMUnit, MONTH. +# 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 + 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 (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. + 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 + +- 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 + +- 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_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..f6098f72e7e --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/eligibility/mo_ccs_protective_services.yaml @@ -0,0 +1,83 @@ +# MO CCS protective services pathway tests +# mo_ccs_protective_services is SPMUnit, MONTH. +# 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 + 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, homelessness alone does not trigger 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: + # 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 + 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..59131a1e26d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/integration.yaml @@ -0,0 +1,310 @@ +# MO Child Care Subsidy integration tests +# End-to-end scenarios exercising eligibility, region/time classification, +# 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. +# 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_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] + 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_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] + 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_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 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 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($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 + 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_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] + 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_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] + 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_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] + 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_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] + 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..7f23f1853f9 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs.yaml @@ -0,0 +1,349 @@ +# 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_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] + 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_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] + 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_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] + 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_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] + 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_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] + 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_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] + 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 + +- 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_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..8b4b8973505 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.yaml @@ -0,0 +1,834 @@ +# MO CCS maximum daily benefit tests +# mo_ccs_maximum_daily_benefit is Person, MONTH, defined_for mo_ccs_eligible_child. +# = 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. +# 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. + 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: 8 + 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_day: 8 + 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_day: 8 + 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_day: 8 + 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_day: 8 + 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_day: 8 + 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_day: 8 + 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_day: 8 + 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_day: 8 + 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_day: 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/day -> 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_day: 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/day -> 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_day: 8 + 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_day: 8 + 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 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: + people: + person1: + age: 30 + employment_income: 33_840 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_day: 8 + 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 (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 returns the gross base rate. + 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_day: 8 + 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; 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 returns the gross base rate. + 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_day: 8 + 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; 0.50 funding applied in mo_ccs). + # This variable returns the gross base $96/day. + mo_ccs_maximum_daily_benefit: [0, 96] + +# === 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: + people: + person1: + age: 30 + employment_income: 31_725 + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_day: 8 + 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 1.0). + # Preschool dense urban base $50/day. + mo_ccs_maximum_daily_benefit: [0, 50] + +- name: Case 18, FPL ratio just above 150 percent returns the gross base 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_day: 8 + 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 (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_day: 8 + 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_day: 8 + 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_day: 8 + 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_day: 8 + 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_day: 8 + 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_day: 8 + 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_day: 8 + 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] + +# === 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_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..07b8b9e54c9 --- /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_day: part 0.5-<3, half 3-<5, +# full 5-<12. Default (0 hours) -> PART_TIME (lowest bracket). + +- name: Case 1, eight hours per day is full time. + period: 2025-01 + input: + people: + person1: + childcare_hours_per_day: 8 + households: + household: + members: [person1] + state_code: MO + output: + # 8 >= 5 -> FULL_TIME. + mo_ccs_time_category: FULL_TIME + +- name: Case 2, five hours per day is full time at boundary. + period: 2025-01 + input: + people: + person1: + childcare_hours_per_day: 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 day is half time. + period: 2025-01 + input: + people: + person1: + childcare_hours_per_day: 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 day is half time at boundary. + period: 2025-01 + input: + people: + person1: + childcare_hours_per_day: 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 day is part time. + period: 2025-01 + input: + people: + person1: + childcare_hours_per_day: 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_day: 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..87409d1218f --- /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_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] + 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_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] + 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..ab46ad41f6b --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/copay/mo_ccs_copay.py @@ -0,0 +1,76 @@ +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 + adjusted_income = spm_unit("mo_ccs_adjusted_income", period) + + # The sliding fee tier is read from the household-size ladder by + # 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(adjusted_income) + for n in range(1, max_size) + ], + 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 + # 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. 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 | (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 new file mode 100644 index 00000000000..f09a7d0b1d6 --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_activity_eligible.py @@ -0,0 +1,44 @@ +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/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): + 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). 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 + # 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) + 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. + has_head_or_spouse = spm_unit.sum(is_head_or_spouse) >= 1 + all_covered = spm_unit.sum(is_head_or_spouse & ~individually_eligible) == 0 + # 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_eligible.py b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible.py new file mode 100644 index 00000000000..5a9625e7ff0 --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible.py @@ -0,0 +1,29 @@ +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://www.law.cornell.edu/regulations/missouri/5-CSR-25-200-050", + ) + + 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) + # 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 + & asset_eligible + & ((income_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..dfbea2a68a3 --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_eligible_child.py @@ -0,0 +1,43 @@ +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) + # "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 + # 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..e2975eddcad --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_income_eligible.py @@ -0,0 +1,32 @@ +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/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", + ) + + 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) + 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..84ef8257ada --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_protective_services.py @@ -0,0 +1,29 @@ +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): + # 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 + has_protective_child = ( + add( + spm_unit, + period.this_year, + ["receives_or_needs_protective_services"], + ) + > 0 + ) + return has_foster_child | 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..064fcdca22e --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs.py @@ -0,0 +1,35 @@ +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): + 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 + 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) + + # 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(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) + 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_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..bb1f592266f --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_maximum_daily_benefit.py @@ -0,0 +1,52 @@ +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. 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): + 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) + + return 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), + ], + ) 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..d2c7b17f9d4 --- /dev/null +++ b/policyengine_us/variables/gov/states/mo/dese/ccs/mo_ccs_time_category.py @@ -0,0 +1,27 @@ +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): + # 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. + 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"]