From fedff9df7028814eb7bf7ca5caf7b3d8fca0abd6 Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 11 Mar 2026 14:49:46 -0400 Subject: [PATCH 1/8] Add changelog fragment for Maine CCAP Co-Authored-By: Claude Opus 4.6 --- changelog.d/me-ccap.added.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/me-ccap.added.md diff --git a/changelog.d/me-ccap.added.md b/changelog.d/me-ccap.added.md new file mode 100644 index 00000000000..a599a47be71 --- /dev/null +++ b/changelog.d/me-ccap.added.md @@ -0,0 +1 @@ +Implement Maine CCAP (Child Care Assistance Program). Closes #7756. From 9e06f76c6621a8643c4295d4902eba8ebd7bf15e Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 11 Mar 2026 17:23:55 -0400 Subject: [PATCH 2/8] Implement Maine CCAP (Child Care Assistance Program) Add parameters, variables, and tests for Maine's CCAP program including: - Eligibility (income, assets, immigration status, child age) - Market rates by provider type, region, age group, and time category - Parent copayment calculation based on SMI percentage - Integration with childcare_expenses subsidy system - Update ME TANF child care deduction to use pre-subsidy expenses Co-Authored-By: Claude Opus 4.6 --- .../ccap/age_groups/infant_max_months.yaml | 11 + .../ccap/age_groups/preschool_max_years.yaml | 11 + .../ccap/age_groups/toddler_max_months.yaml | 11 + .../states/me/dhhs/ccap/age_limit/child.yaml | 11 + .../me/dhhs/ccap/age_limit/special_needs.yaml | 11 + .../gov/states/me/dhhs/ccap/asset_limit.yaml | 11 + .../me/dhhs/ccap/copay/cap/above_85_smi.yaml | 11 + .../me/dhhs/ccap/copay/cap/below_85_smi.yaml | 11 + .../me/dhhs/ccap/copay/cap_threshold.yaml | 11 + .../gov/states/me/dhhs/ccap/copay/rate.yaml | 57 ++ .../dhhs/ccap/hours/full_time_threshold.yaml | 11 + .../ccap/income/countable_income/sources.yaml | 32 + .../states/me/dhhs/ccap/income/smi_limit.yaml | 11 + .../dhhs/ccap/market_rate/license_exempt.yaml | 56 ++ .../ccap/market_rate/licensed_center.yaml | 56 ++ .../ccap/market_rate/licensed_family.yaml | 56 ++ .../dhhs/ccap/qualified_alien_statuses.yaml | 20 + .../me/dhhs/ccap/region_1_counties.yaml | 14 + .../dhhs/ccap/copay/me_ccap_parent_fee.yaml | 376 ++++++++ .../ccap/copay/me_ccap_smi_percentage.yaml | 82 ++ .../eligibility/me_ccap_asset_eligible.yaml | 41 + .../ccap/eligibility/me_ccap_eligible.yaml | 99 ++ .../eligibility/me_ccap_eligible_child.yaml | 229 +++++ .../me_ccap_immigration_status_eligible.yaml | 87 ++ .../eligibility/me_ccap_income_eligible.yaml | 247 +++++ .../gov/states/me/dhhs/ccap/integration.yaml | 626 ++++++++++++ .../gov/states/me/dhhs/ccap/me_ccap.yaml | 290 ++++++ .../dhhs/ccap/payment/me_ccap_age_group.yaml | 93 ++ .../ccap/payment/me_ccap_market_rate.yaml | 913 ++++++++++++++++++ .../me/dhhs/ccap/payment/me_ccap_region.yaml | 47 + .../ccap/payment/me_ccap_time_category.yaml | 76 ++ .../gov/states/me/dhhs/tanf/integration.yaml | 14 +- .../tanf/me_tanf_child_care_deduction.yaml | 10 +- .../me/dhhs/ccap/copay/me_ccap_parent_fee.py | 33 + .../dhhs/ccap/copay/me_ccap_smi_percentage.py | 22 + .../eligibility/me_ccap_asset_eligible.py | 15 + .../dhhs/ccap/eligibility/me_ccap_eligible.py | 16 + .../eligibility/me_ccap_eligible_child.py | 20 + .../me_ccap_immigration_status_eligible.py | 24 + .../eligibility/me_ccap_income_eligible.py | 17 + .../ccap/income/me_ccap_countable_income.py | 13 + .../states/me/dhhs/ccap/income/me_ccap_smi.py | 23 + .../gov/states/me/dhhs/ccap/me_ccap.py | 26 + .../me/dhhs/ccap/payment/me_ccap_age_group.py | 37 + .../dhhs/ccap/payment/me_ccap_market_rate.py | 39 + .../ccap/payment/me_ccap_provider_type.py | 18 + .../me/dhhs/ccap/payment/me_ccap_region.py | 27 + .../ccap/payment/me_ccap_time_category.py | 26 + .../states/me/dhhs/me_child_care_subsidies.py | 11 + .../me_tanf_child_care_deduction.py | 2 +- .../expense/childcare/childcare_expenses.py | 2 +- sources/working_references.md | 348 +++++++ 52 files changed, 4347 insertions(+), 14 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/infant_max_months.yaml create mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/preschool_max_years.yaml create mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/toddler_max_months.yaml create mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/child.yaml create mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/special_needs.yaml create mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/asset_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/above_85_smi.yaml create mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/below_85_smi.yaml create mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap_threshold.yaml create mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/rate.yaml create mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/full_time_threshold.yaml create mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/income/countable_income/sources.yaml create mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/income/smi_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/license_exempt.yaml create mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml create mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_family.yaml create mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/qualified_alien_statuses.yaml create mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/region_1_counties.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/copay/me_ccap_smi_percentage.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_asset_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible_child.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_immigration_status_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_income_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/integration.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/me_ccap.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_age_group.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_market_rate.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_region.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_time_category.yaml create mode 100644 policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.py create mode 100644 policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_smi_percentage.py create mode 100644 policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_asset_eligible.py create mode 100644 policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.py create mode 100644 policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible_child.py create mode 100644 policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_immigration_status_eligible.py create mode 100644 policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_income_eligible.py create mode 100644 policyengine_us/variables/gov/states/me/dhhs/ccap/income/me_ccap_countable_income.py create mode 100644 policyengine_us/variables/gov/states/me/dhhs/ccap/income/me_ccap_smi.py create mode 100644 policyengine_us/variables/gov/states/me/dhhs/ccap/me_ccap.py create mode 100644 policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_age_group.py create mode 100644 policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_market_rate.py create mode 100644 policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_provider_type.py create mode 100644 policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_region.py create mode 100644 policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_time_category.py create mode 100644 policyengine_us/variables/gov/states/me/dhhs/me_child_care_subsidies.py create mode 100644 sources/working_references.md diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/infant_max_months.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/infant_max_months.yaml new file mode 100644 index 00000000000..627b5101723 --- /dev/null +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/infant_max_months.yaml @@ -0,0 +1,11 @@ +description: Maine sets this threshold in months as the upper bound for the infant age group under the Child Care Affordability Program. +values: + 2024-07-01: 12 + +metadata: + unit: month + period: year + label: Maine CCAP infant age group upper bound in months + reference: + - title: 10-148 C.M.R. Chapter 6 §1 Definitions + href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/preschool_max_years.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/preschool_max_years.yaml new file mode 100644 index 00000000000..ec7b0f595a7 --- /dev/null +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/preschool_max_years.yaml @@ -0,0 +1,11 @@ +description: Maine sets this threshold in years as the upper bound for the preschool age group under the Child Care Affordability Program. +values: + 2024-07-01: 5 + +metadata: + unit: year + period: year + label: Maine CCAP preschool age group upper bound in years + reference: + - title: 10-148 C.M.R. Chapter 6 §1 Definitions + href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/toddler_max_months.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/toddler_max_months.yaml new file mode 100644 index 00000000000..2eac8395ca0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/toddler_max_months.yaml @@ -0,0 +1,11 @@ +description: Maine sets this threshold in months as the upper bound for the toddler age group under the Child Care Affordability Program. +values: + 2024-07-01: 36 + +metadata: + unit: month + period: year + label: Maine CCAP toddler age group upper bound in months + reference: + - title: 10-148 C.M.R. Chapter 6 §1 Definitions + href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/child.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/child.yaml new file mode 100644 index 00000000000..e00df0516b5 --- /dev/null +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/child.yaml @@ -0,0 +1,11 @@ +description: Maine limits non-disabled child eligibility to this threshold under the Child Care Affordability Program. +values: + 2024-07-01: 13 + +metadata: + unit: year + period: year + label: Maine CCAP child age limit + reference: + - title: 10-148 C.M.R. Chapter 6 §2.A + href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=5 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/special_needs.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/special_needs.yaml new file mode 100644 index 00000000000..f62db15f648 --- /dev/null +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/special_needs.yaml @@ -0,0 +1,11 @@ +description: Maine limits special needs child eligibility to this threshold under the Child Care Affordability Program. +values: + 2024-07-01: 19 + +metadata: + unit: year + period: year + label: Maine CCAP special needs child age limit + reference: + - title: 10-148 C.M.R. Chapter 6 §2.A.7 + href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=6 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/asset_limit.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/asset_limit.yaml new file mode 100644 index 00000000000..7d98adb605b --- /dev/null +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/asset_limit.yaml @@ -0,0 +1,11 @@ +description: Maine limits family assets to this amount under the Child Care Affordability Program. +values: + 2024-07-01: 1_000_000 + +metadata: + unit: currency-USD + period: year + label: Maine CCAP asset limit + reference: + - title: 10-148 C.M.R. Chapter 6 §2.C.1 + href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=7 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/above_85_smi.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/above_85_smi.yaml new file mode 100644 index 00000000000..721ad7e1959 --- /dev/null +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/above_85_smi.yaml @@ -0,0 +1,11 @@ +description: Maine limits total parent fees to this share of eligibility income for families at or above 85% of State Median Income under the Child Care Affordability Program. +values: + 2024-07-01: 0.1 + +metadata: + unit: /1 + period: year + label: Maine CCAP copay cap above 85% SMI + reference: + - title: 10-148 C.M.R. Chapter 6 §5.A.2.b + href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=26 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/below_85_smi.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/below_85_smi.yaml new file mode 100644 index 00000000000..f1d30af3d38 --- /dev/null +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/below_85_smi.yaml @@ -0,0 +1,11 @@ +description: Maine limits total parent fees to this share of eligibility income for families below 85% of State Median Income under the Child Care Affordability Program. +values: + 2024-07-01: 0.07 + +metadata: + unit: /1 + period: year + label: Maine CCAP copay cap below 85% SMI + reference: + - title: 10-148 C.M.R. Chapter 6 §5.A.2.a + href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=26 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap_threshold.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap_threshold.yaml new file mode 100644 index 00000000000..4c35543bcdc --- /dev/null +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap_threshold.yaml @@ -0,0 +1,11 @@ +description: Maine uses this share of the State Median Income as the threshold for determining which copay cap applies under the Child Care Affordability Program. +values: + 2024-07-01: 0.85 + +metadata: + unit: /1 + period: year + label: Maine CCAP copay cap SMI threshold + reference: + - title: 10-148 C.M.R. Chapter 6 §5.A.2 + href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=26 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/rate.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/rate.yaml new file mode 100644 index 00000000000..9c96656be5e --- /dev/null +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/rate.yaml @@ -0,0 +1,57 @@ +description: Maine sets the parent fee as this share of eligibility income based on the family's State Median Income percentage under the Child Care Affordability Program. + +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: /1 + period: week + label: Maine CCAP copay rate by SMI percentage + reference: + - title: 10-148 C.M.R. Chapter 6 §5.B.1 + href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=27 + +brackets: + - threshold: + 2024-07-01: 0 + amount: + 2024-07-01: 0 + - threshold: + 2024-07-01: 0.3 + amount: + 2024-07-01: 0.01 + - threshold: + 2024-07-01: 0.35 + amount: + 2024-07-01: 0.02 + - threshold: + 2024-07-01: 0.4 + amount: + 2024-07-01: 0.03 + - threshold: + 2024-07-01: 0.45 + amount: + 2024-07-01: 0.04 + - threshold: + 2024-07-01: 0.55 + amount: + 2024-07-01: 0.05 + - threshold: + 2024-07-01: 0.65 + amount: + 2024-07-01: 0.06 + - threshold: + 2024-07-01: 0.75 + amount: + 2024-07-01: 0.07 + - threshold: + 2024-07-01: 0.9 + amount: + 2024-07-01: 0.08 + - threshold: + 2024-07-01: 1 + amount: + 2024-07-01: 0.09 + - threshold: + 2024-07-01: 1.1 + amount: + 2024-07-01: 0.1 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/full_time_threshold.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/full_time_threshold.yaml new file mode 100644 index 00000000000..5ef1577db94 --- /dev/null +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/full_time_threshold.yaml @@ -0,0 +1,11 @@ +description: Maine sets this threshold for full-time child care hours per week under the Child Care Affordability Program. +values: + 2025-05-19: 30 + +metadata: + unit: /1 + period: week + label: Maine CCAP full-time hours threshold + reference: + - title: 10-148 C.M.R. Chapter 6 §1 Definitions 16, 22 + href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/countable_income/sources.yaml new file mode 100644 index 00000000000..c3999e2559e --- /dev/null +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/countable_income/sources.yaml @@ -0,0 +1,32 @@ +description: Maine uses these income sources for countable income under the Child Care Affordability Program. +values: + 2024-07-01: + # Earned income (Rule §2.C.3) + - employment_income + - self_employment_income + - farm_income + - rental_income + # Unearned income (Rule §2.C.4) + - social_security + - pension_income + - retirement_distributions + - disability_benefits + - ssi + - tanf + - veterans_benefits + - military_retirement_pay + - unemployment_compensation + - workers_compensation + - interest_income + - dividend_income + - child_support_received + - alimony_income + - capital_gains + +metadata: + unit: list + period: year + label: Maine CCAP countable income sources + reference: + - title: 10-148 C.M.R. Chapter 6 §2.C.3-4 + href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=7 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/smi_limit.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/smi_limit.yaml new file mode 100644 index 00000000000..96717af1005 --- /dev/null +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/smi_limit.yaml @@ -0,0 +1,11 @@ +description: Maine limits family income to this share of the State Median Income under the Child Care Affordability Program. +values: + 2024-07-01: 1.25 + +metadata: + unit: /1 + period: year + label: Maine CCAP SMI income limit rate + reference: + - title: 10-148 C.M.R. Chapter 6 §2.C.1 + href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=7 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/license_exempt.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/license_exempt.yaml new file mode 100644 index 00000000000..36665c2310d --- /dev/null +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/license_exempt.yaml @@ -0,0 +1,56 @@ +description: Maine provides these weekly reimbursement rates for license-exempt child care under the Child Care Affordability Program. + +metadata: + period: week + unit: currency-USD + label: Maine CCAP license-exempt weekly rates + breakdown: + - me_ccap_region + - me_ccap_age_group + - me_ccap_time_category + reference: + - title: 10-148 C.M.R. Chapter 6 §3 + href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=12 + +REGION_1: + INFANT: + FULL_TIME: + 2025-05-19: 171.5 + PART_TIME: + 2025-05-19: 128.63 + TODDLER: + FULL_TIME: + 2025-05-19: 161.54 + PART_TIME: + 2025-05-19: 121.15 + PRESCHOOL: + FULL_TIME: + 2025-05-19: 157.5 + PART_TIME: + 2025-05-19: 118.13 + SCHOOL_AGE: + FULL_TIME: + 2025-05-19: 122.5 + PART_TIME: + 2025-05-19: 98.33 +REGION_2: + INFANT: + FULL_TIME: + 2025-05-19: 147 + PART_TIME: + 2025-05-19: 110.25 + TODDLER: + FULL_TIME: + 2025-05-19: 140 + PART_TIME: + 2025-05-19: 105 + PRESCHOOL: + FULL_TIME: + 2025-05-19: 133 + PART_TIME: + 2025-05-19: 99.75 + SCHOOL_AGE: + FULL_TIME: + 2025-05-19: 119 + PART_TIME: + 2025-05-19: 95.51 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml new file mode 100644 index 00000000000..89327760b2a --- /dev/null +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml @@ -0,0 +1,56 @@ +description: Maine provides these weekly reimbursement rates for licensed child care centers under the Child Care Affordability Program. + +metadata: + period: week + unit: currency-USD + label: Maine CCAP licensed center weekly rates + breakdown: + - me_ccap_region + - me_ccap_age_group + - me_ccap_time_category + reference: + - title: 10-148 C.M.R. Chapter 6 §3 + href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=12 + +REGION_1: + INFANT: + FULL_TIME: + 2025-05-19: 330 + PART_TIME: + 2025-05-19: 247.5 + TODDLER: + FULL_TIME: + 2025-05-19: 320 + PART_TIME: + 2025-05-19: 240 + PRESCHOOL: + FULL_TIME: + 2025-05-19: 300 + PART_TIME: + 2025-05-19: 225 + SCHOOL_AGE: + FULL_TIME: + 2025-05-19: 214 + PART_TIME: + 2025-05-19: 171.76 +REGION_2: + INFANT: + FULL_TIME: + 2025-05-19: 275 + PART_TIME: + 2025-05-19: 206.25 + TODDLER: + FULL_TIME: + 2025-05-19: 250 + PART_TIME: + 2025-05-19: 187.5 + PRESCHOOL: + FULL_TIME: + 2025-05-19: 244 + PART_TIME: + 2025-05-19: 183 + SCHOOL_AGE: + FULL_TIME: + 2025-05-19: 180 + PART_TIME: + 2025-05-19: 144.47 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_family.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_family.yaml new file mode 100644 index 00000000000..a01e5deefe0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_family.yaml @@ -0,0 +1,56 @@ +description: Maine provides these weekly reimbursement rates for licensed family child care under the Child Care Affordability Program. + +metadata: + period: week + unit: currency-USD + label: Maine CCAP licensed family weekly rates + breakdown: + - me_ccap_region + - me_ccap_age_group + - me_ccap_time_category + reference: + - title: 10-148 C.M.R. Chapter 6 §3 + href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=12 + +REGION_1: + INFANT: + FULL_TIME: + 2025-05-19: 245 + PART_TIME: + 2025-05-19: 183.75 + TODDLER: + FULL_TIME: + 2025-05-19: 230.77 + PART_TIME: + 2025-05-19: 173.08 + PRESCHOOL: + FULL_TIME: + 2025-05-19: 225 + PART_TIME: + 2025-05-19: 168.75 + SCHOOL_AGE: + FULL_TIME: + 2025-05-19: 175 + PART_TIME: + 2025-05-19: 140.46 +REGION_2: + INFANT: + FULL_TIME: + 2025-05-19: 210 + PART_TIME: + 2025-05-19: 157.5 + TODDLER: + FULL_TIME: + 2025-05-19: 200 + PART_TIME: + 2025-05-19: 150 + PRESCHOOL: + FULL_TIME: + 2025-05-19: 190 + PART_TIME: + 2025-05-19: 142.5 + SCHOOL_AGE: + FULL_TIME: + 2025-05-19: 170 + PART_TIME: + 2025-05-19: 136.45 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/qualified_alien_statuses.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/qualified_alien_statuses.yaml new file mode 100644 index 00000000000..c9c2960e32e --- /dev/null +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/qualified_alien_statuses.yaml @@ -0,0 +1,20 @@ +description: Maine uses these statuses as qualified alien statuses under the Child Care Affordability Program. +values: + 2024-07-01: + - LEGAL_PERMANENT_RESIDENT + - REFUGEE + - ASYLEE + - DEPORTATION_WITHHELD + - CUBAN_HAITIAN_ENTRANT + - CONDITIONAL_ENTRANT + - PAROLED_ONE_YEAR + +metadata: + unit: list + period: year + label: Maine CCAP qualified alien statuses + reference: + - title: 10-148 C.M.R. Chapter 6 §2.A.2 + href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=5 + - title: 8 U.S.C. §1641 + href: https://www.law.cornell.edu/uscode/text/8/1641 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/region_1_counties.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/region_1_counties.yaml new file mode 100644 index 00000000000..52e849510d8 --- /dev/null +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/region_1_counties.yaml @@ -0,0 +1,14 @@ +description: Maine sets these counties as Region 1 for market rate purposes under the Child Care Affordability Program. +values: + 2024-07-01: + - CUMBERLAND_COUNTY_ME + - SAGADAHOC_COUNTY_ME + - YORK_COUNTY_ME + +metadata: + unit: list + period: year + label: Maine CCAP Region 1 counties + reference: + - title: 10-148 C.M.R. Chapter 6 §3 + href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=12 diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.yaml new file mode 100644 index 00000000000..13601799f32 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.yaml @@ -0,0 +1,376 @@ +# Parent fee tests use me_ccap_smi_percentage and me_ccap_countable_income +# as direct inputs to isolate the copay calculation from income pipeline. + +- name: Case 1, below 30% SMI, zero copay. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + me_ccap_smi_percentage: 0.195 + me_ccap_countable_income: 1_250 + households: + household: + members: [person1] + state_code: ME + output: + # 19.5% < 30% => 0% fee bracket. + me_ccap_parent_fee: 0 + +- name: Case 2, 30-35% SMI bracket, 1% fee. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + me_ccap_smi_percentage: 0.32 + me_ccap_countable_income: 2_053.75 + households: + household: + members: [person1] + state_code: ME + output: + # Weekly income = 2053.75 * 12/52 = 473.94. + # Fee = floor(473.94 * 0.01) = floor(4.74) = 4. + # Monthly = 4 * 52/12 = 17.33. + me_ccap_parent_fee: 17.33 + +- name: Case 3, 45-55% SMI bracket, 4% fee. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + me_ccap_smi_percentage: 0.50 + me_ccap_countable_income: 3_209 + households: + household: + members: [person1] + state_code: ME + output: + # Weekly income = 3209 * 12/52 = 740.54. + # Fee = floor(740.54 * 0.04) = floor(29.62) = 29. + # Monthly = 29 * 52/12 = 125.67. + me_ccap_parent_fee: 125.67 + +- name: Case 4, 75-90% SMI bracket, 7% fee with 7% cap. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + me_ccap_smi_percentage: 0.80 + me_ccap_countable_income: 5_134.42 + households: + household: + members: [person1] + state_code: ME + output: + # Weekly income = 5134.42 * 12/52 = 1184.87. + # Fee = floor(1184.87 * 0.07) = floor(82.94) = 82. + # Cap (80% < 85%): floor(1184.87 * 0.07) = floor(82.94) = 82. + # Fee = min(82, 82) = 82. + # Monthly = 82 * 52/12 = 355.33. + me_ccap_parent_fee: 355.33 + +- name: Case 5, 110-125% SMI bracket, 10% fee with 10% cap. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + me_ccap_smi_percentage: 1.15 + me_ccap_countable_income: 7_380.67 + households: + household: + members: [person1] + state_code: ME + output: + # Weekly income = 7380.67 * 12/52 = 1703.23. + # Fee = floor(1703.23 * 0.10) = floor(170.32) = 170. + # Cap (115% >= 85%): floor(1703.23 * 0.10) = floor(170.32) = 170. + # Monthly = 170 * 52/12 = 736.67. + me_ccap_parent_fee: 736.67 + +# === Edge cases: remaining copay tiers and boundary transitions === + +- name: Case 6, 35-40% SMI bracket, 2% fee. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + me_ccap_smi_percentage: 0.37 + me_ccap_countable_income: 2_475.50 + households: + household: + members: [person1] + state_code: ME + output: + # Weekly income = 2475.50 * 12/52 = 571.27. + # Raw weekly = floor(571.27 * 0.02) = floor(11.43) = 11. + # Cap (37% < 85%): floor(571.27 * 0.07) = floor(39.99) = 39. + # Fee = min(11, 39) = 11/week. + # Monthly = 11 * 52/12 = 47.67. + me_ccap_parent_fee: 47.67 + +- name: Case 7, 40-45% SMI bracket, 3% fee. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + me_ccap_smi_percentage: 0.42 + me_ccap_countable_income: 2_810 + households: + household: + members: [person1] + state_code: ME + output: + # Weekly income = 2810 * 12/52 = 648.46. + # Raw weekly = floor(648.46 * 0.03) = floor(19.45) = 19. + # Cap: floor(648.46 * 0.07) = floor(45.39) = 45. + # Fee = min(19, 45) = 19/week. + # Monthly = 19 * 52/12 = 82.33. + me_ccap_parent_fee: 82.33 + +- name: Case 8, 55-65% SMI bracket, 5% fee. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + me_ccap_smi_percentage: 0.60 + me_ccap_countable_income: 4_014.25 + households: + household: + members: [person1] + state_code: ME + output: + # Weekly income = 4014.25 * 12/52 = 926.37. + # Raw weekly = floor(926.37 * 0.05) = floor(46.32) = 46. + # Cap: floor(926.37 * 0.07) = floor(64.85) = 64. + # Fee = min(46, 64) = 46/week. + # Monthly = 46 * 52/12 = 199.33. + me_ccap_parent_fee: 199.33 + +- name: Case 9, 65-75% SMI bracket, 6% fee. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + me_ccap_smi_percentage: 0.70 + me_ccap_countable_income: 4_683.25 + households: + household: + members: [person1] + state_code: ME + output: + # Weekly income = 4683.25 * 12/52 = 1080.75. + # Raw weekly = floor(1080.75 * 0.06) = floor(64.85) = 64. + # Cap: floor(1080.75 * 0.07) = floor(75.65) = 75. + # Fee = min(64, 75) = 64/week. + # Monthly = 64 * 52/12 = 277.33. + me_ccap_parent_fee: 277.33 + +- name: Case 10, 90-100% SMI bracket, 8% fee with 10% cap. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + me_ccap_smi_percentage: 0.95 + me_ccap_countable_income: 6_355.83 + households: + household: + members: [person1] + state_code: ME + output: + # 95% >= 85% => 10% cap applies. + # Weekly income = 6355.83 * 12/52 = 1466.73. + # Raw weekly = floor(1466.73 * 0.08) = floor(117.34) = 117. + # Cap: floor(1466.73 * 0.10) = floor(146.67) = 146. + # Fee = min(117, 146) = 117/week. + # Monthly = 117 * 52/12 = 507. + me_ccap_parent_fee: 507 + +- name: Case 11, 100-110% SMI bracket, 9% fee with 10% cap. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + me_ccap_smi_percentage: 1.05 + me_ccap_countable_income: 7_024.87 + households: + household: + members: [person1] + state_code: ME + output: + # 105% >= 85% => 10% cap applies. + # Weekly income = 7024.87 * 12/52 = 1621.13. + # Raw weekly = floor(1621.13 * 0.09) = floor(145.90) = 145. + # Cap: floor(1621.13 * 0.10) = floor(162.11) = 162. + # Fee = min(145, 162) = 145/week. + # Monthly = 145 * 52/12 = 628.33. + me_ccap_parent_fee: 628.33 + +- name: Case 12, exactly at 85% SMI boundary, cap transitions from 7% to 10%. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + me_ccap_smi_percentage: 0.8501 + me_ccap_countable_income: 5_687.50 + households: + household: + members: [person1] + state_code: ME + output: + # 85.01% >= 85% => 10% cap applies. + # Weekly income = 5687.50 * 12/52 = 1312.50. + # Raw weekly = floor(1312.50 * 0.07) = floor(91.88) = 91. + # Cap: floor(1312.50 * 0.10) = floor(131.25) = 131. + # Fee = min(91, 131) = 91/week. + # Monthly = 91 * 52/12 = 394.33. + me_ccap_parent_fee: 394.33 + +- name: Case 13, just below 85% SMI, 7% cap binds at same rate as fee. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + me_ccap_smi_percentage: 0.8491 + me_ccap_countable_income: 5_680.08 + households: + household: + members: [person1] + state_code: ME + output: + # 84.91% < 85% => 7% cap applies. + # Weekly income = 5680.08 * 12/52 = 1310.79. + # Raw weekly = floor(1310.79 * 0.07) = floor(91.76) = 91. + # Cap: floor(1310.79 * 0.07) = floor(91.76) = 91. + # Fee = min(91, 91) = 91/week. + # Monthly = 91 * 52/12 = 394.33. + me_ccap_parent_fee: 394.33 + +- name: Case 14, zero income, zero parent fee. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + me_ccap_smi_percentage: 0 + me_ccap_countable_income: 0 + households: + household: + members: [person1] + state_code: ME + output: + # Zero income => 0% SMI => 0% fee bracket. + me_ccap_parent_fee: 0 + +- name: Case 15, exactly at 30% SMI boundary, enters 1% tier. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + me_ccap_smi_percentage: 0.3001 + me_ccap_countable_income: 2_007.83 + households: + household: + members: [person1] + state_code: ME + output: + # 30.01% => 30-35% bracket => 1% fee. + # Weekly income = 2007.83 * 12/52 = 463.35. + # Raw weekly = floor(463.35 * 0.01) = floor(4.63) = 4. + # Cap: floor(463.35 * 0.07) = floor(32.43) = 32. + # Fee = min(4, 32) = 4/week. + # Monthly = 4 * 52/12 = 17.33. + me_ccap_parent_fee: 17.33 + +- name: Case 16, just below 30% SMI boundary, zero copay. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + me_ccap_smi_percentage: 0.2998 + me_ccap_countable_income: 2_005.75 + households: + household: + members: [person1] + state_code: ME + output: + # 29.98% < 30% => 0% fee bracket. + me_ccap_parent_fee: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/copay/me_ccap_smi_percentage.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/copay/me_ccap_smi_percentage.yaml new file mode 100644 index 00000000000..760954950e5 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/copay/me_ccap_smi_percentage.yaml @@ -0,0 +1,82 @@ +# Tests for me_ccap_smi_percentage edge cases. +# SMI for ME size 2 (2025-10-01) = 118,065 * 0.68 = $80,284.20/yr = $6,690.35/mo. +# Use me_ccap_countable_income as direct input to isolate SMI percentage calculation. + +- name: Case 1, zero income, zero percentage. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + me_ccap_countable_income: 0 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + # income = 0, SMI = $6,690.35/mo. + # 0 / 6690.35 = 0. + me_ccap_smi_percentage: 0 + +- name: Case 2, income at 50% SMI. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + # 50% of $80,284.20/yr = $40,142.10/yr => monthly = $3,345.18. + me_ccap_countable_income: 3_345.18 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + # Monthly income = 3345.18. + # Monthly SMI = 80284.20/12 = 6690.35. + # 3345.18 / 6690.35 = 0.5000. + me_ccap_smi_percentage: 0.5000 + +- name: Case 3, income at 125% SMI. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + # 125% of $80,284.20/yr = $100,355.25/yr => monthly = $8,362.94. + me_ccap_countable_income: 8_362.94 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + # Monthly income = 8362.94. + # Monthly SMI = 6690.35. + # 8362.94 / 6690.35 = 1.2500. + me_ccap_smi_percentage: 1.2500 diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_asset_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_asset_eligible.yaml new file mode 100644 index 00000000000..a35194799aa --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_asset_eligible.yaml @@ -0,0 +1,41 @@ +- name: Case 1, assets at limit, eligible. + period: 2025-01 + input: + spm_unit_assets: 1_000_000 + state_code: ME + output: + me_ccap_asset_eligible: true + +- name: Case 2, assets above limit, ineligible. + period: 2025-01 + input: + spm_unit_assets: 1_000_001 + state_code: ME + output: + me_ccap_asset_eligible: false + +- name: Case 3, no assets, eligible. + period: 2025-01 + input: + spm_unit_assets: 0 + state_code: ME + output: + me_ccap_asset_eligible: true + +- name: Case 4, assets well below limit, eligible. + period: 2025-01 + input: + spm_unit_assets: 500_000 + state_code: ME + output: + me_ccap_asset_eligible: true + +# === Edge cases === + +- name: Case 5, assets one dollar below limit, eligible. + period: 2025-01 + input: + spm_unit_assets: 999_999 + state_code: ME + output: + me_ccap_asset_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.yaml new file mode 100644 index 00000000000..0d5c62a5a92 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.yaml @@ -0,0 +1,99 @@ +- name: Case 1, all conditions met, eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + spm_units: + spm_unit: + members: [person1, person2] + me_ccap_income_eligible: true + me_ccap_asset_eligible: true + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + me_ccap_eligible: true + +- name: Case 2, income ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + spm_units: + spm_unit: + members: [person1, person2] + me_ccap_income_eligible: false + me_ccap_asset_eligible: true + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + me_ccap_eligible: false + +- name: Case 3, asset ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + spm_units: + spm_unit: + members: [person1, person2] + me_ccap_income_eligible: true + me_ccap_asset_eligible: false + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + me_ccap_eligible: false + +- name: Case 4, no eligible child. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 15 + is_tax_unit_dependent: true + immigration_status: CITIZEN + spm_units: + spm_unit: + members: [person1, person2] + me_ccap_income_eligible: true + me_ccap_asset_eligible: true + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + me_ccap_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible_child.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible_child.yaml new file mode 100644 index 00000000000..4eff0dff497 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible_child.yaml @@ -0,0 +1,229 @@ +- name: Case 1, child under 13, citizen, dependent, eligible. + period: 2025-01 + input: + people: + person1: + age: 5 + is_disabled: false + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: ME + output: + me_ccap_eligible_child: [true] + +- name: Case 2, child age 13, not disabled, ineligible. + period: 2025-01 + input: + people: + person1: + age: 13 + is_disabled: false + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: ME + output: + me_ccap_eligible_child: [false] + +- name: Case 3, child age 12, boundary eligible. + period: 2025-01 + input: + people: + person1: + age: 12 + is_disabled: false + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: ME + output: + me_ccap_eligible_child: [true] + +- name: Case 4, disabled child age 18, eligible under special needs. + period: 2025-01 + input: + people: + person1: + age: 18 + is_disabled: true + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: ME + output: + me_ccap_eligible_child: [true] + +- name: Case 5, disabled child age 19, ineligible. + period: 2025-01 + input: + people: + person1: + age: 19 + is_disabled: true + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: ME + output: + me_ccap_eligible_child: [false] + +- name: Case 6, not a dependent, ineligible. + period: 2025-01 + input: + people: + person1: + age: 5 + is_disabled: false + is_tax_unit_dependent: false + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: ME + output: + me_ccap_eligible_child: [false] + +- name: Case 7, undocumented child, ineligible. + period: 2025-01 + input: + people: + person1: + age: 5 + is_disabled: false + is_tax_unit_dependent: true + immigration_status: UNDOCUMENTED + households: + household: + members: [person1] + state_code: ME + output: + me_ccap_eligible_child: [false] + +- name: Case 8, non-Maine resident, ineligible. + period: 2025-01 + input: + people: + person1: + age: 5 + is_disabled: false + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NY + output: + me_ccap_eligible_child: [false] + +# === Edge cases === + +- name: Case 9, disabled child exactly age 13, eligible under special needs. + period: 2025-01 + input: + people: + person1: + age: 13 + is_disabled: true + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: ME + output: + # age 13 < 19 (special needs limit) => eligible. + me_ccap_eligible_child: [true] + +- name: Case 10, non-disabled child age 0 (newborn), eligible. + period: 2025-01 + input: + people: + person1: + age: 0 + is_disabled: false + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: ME + output: + me_ccap_eligible_child: [true] + +- name: Case 11, disabled child exactly age 18, eligible. + period: 2025-01 + input: + people: + person1: + age: 18 + is_disabled: true + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: ME + output: + # age 18 < 19 => eligible. + me_ccap_eligible_child: [true] + +- name: Case 12, adult age 30, not eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + is_disabled: false + is_tax_unit_dependent: false + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: ME + output: + # age 30 >= 13 and not dependent => ineligible. + me_ccap_eligible_child: [false] + +- name: Case 13, child age 12 but legal permanent resident, eligible. + period: 2025-01 + input: + people: + person1: + age: 12 + is_disabled: false + is_tax_unit_dependent: true + immigration_status: LEGAL_PERMANENT_RESIDENT + households: + household: + members: [person1] + state_code: ME + output: + me_ccap_eligible_child: [true] + +- name: Case 14, disabled child age 15 but DACA, ineligible. + period: 2025-01 + input: + people: + person1: + age: 15 + is_disabled: true + is_tax_unit_dependent: true + immigration_status: DACA + households: + household: + members: [person1] + state_code: ME + output: + # Age 15 < 19 (special needs) but DACA is not a qualified status. + me_ccap_eligible_child: [false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_immigration_status_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_immigration_status_eligible.yaml new file mode 100644 index 00000000000..808917bce51 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_immigration_status_eligible.yaml @@ -0,0 +1,87 @@ +- name: Case 1, US citizen, eligible. + period: 2025-01 + input: + immigration_status: CITIZEN + state_code: ME + output: + me_ccap_immigration_status_eligible: true + +- name: Case 2, legal permanent resident, eligible. + period: 2025-01 + input: + immigration_status: LEGAL_PERMANENT_RESIDENT + state_code: ME + output: + me_ccap_immigration_status_eligible: true + +- name: Case 3, refugee, eligible. + period: 2025-01 + input: + immigration_status: REFUGEE + state_code: ME + output: + me_ccap_immigration_status_eligible: true + +- name: Case 4, asylee, eligible. + period: 2025-01 + input: + immigration_status: ASYLEE + state_code: ME + output: + me_ccap_immigration_status_eligible: true + +- name: Case 5, undocumented, ineligible. + period: 2025-01 + input: + immigration_status: UNDOCUMENTED + state_code: ME + output: + me_ccap_immigration_status_eligible: false + +- name: Case 6, DACA, ineligible. + period: 2025-01 + input: + immigration_status: DACA + state_code: ME + output: + me_ccap_immigration_status_eligible: false + +- name: Case 7, TPS, ineligible. + period: 2025-01 + input: + immigration_status: TPS + state_code: ME + output: + me_ccap_immigration_status_eligible: false + +- name: Case 8, Cuban/Haitian entrant, eligible. + period: 2025-01 + input: + immigration_status: CUBAN_HAITIAN_ENTRANT + state_code: ME + output: + me_ccap_immigration_status_eligible: true + +- name: Case 9, conditional entrant, eligible. + period: 2025-01 + input: + immigration_status: CONDITIONAL_ENTRANT + state_code: ME + output: + me_ccap_immigration_status_eligible: true + +- name: Case 10, paroled one year, eligible. + period: 2025-01 + input: + immigration_status: PAROLED_ONE_YEAR + state_code: ME + output: + me_ccap_immigration_status_eligible: true + +- name: Case 11, deportation withheld, eligible. + period: 2025-01 + input: + immigration_status: DEPORTATION_WITHHELD + state_code: ME + output: + me_ccap_immigration_status_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_income_eligible.yaml new file mode 100644 index 00000000000..bf7e564a7c9 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_income_eligible.yaml @@ -0,0 +1,247 @@ +# Income eligibility tests use me_ccap_countable_income as direct input +# to isolate from TANF/SSI feedback loop in income pipeline. + +- name: Case 1, family of 4 just below 125% SMI threshold, eligible. + period: 2025-01 + input: + people: + person1: + age: 35 + person2: + age: 33 + person3: + age: 8 + person4: + age: 5 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + # SMI for ME family of 4 (2024-10-01) = $113,259. + # 125% = $141,573.75/yr. + # Monthly limit = $11,797.81. + # Set monthly income just below. + me_ccap_countable_income: 11_750 + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: ME + output: + me_ccap_income_eligible: true + +- name: Case 2, family of 4 above 125% SMI, ineligible. + period: 2025-01 + input: + people: + person1: + age: 35 + person2: + age: 33 + person3: + age: 8 + person4: + age: 5 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + # 125% SMI for size 4 = $141,573.75/yr = $11,797.81/mo. + # Set monthly income above. + me_ccap_countable_income: 12_500 + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: ME + output: + me_ccap_income_eligible: false + +- name: Case 3, family of 2 low income, eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + me_ccap_countable_income: 2_500 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + me_ccap_income_eligible: true + +- name: Case 4, family of 2 moderate income, eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + # 125% SMI for size 2 (2024-10-01) = $96,270.15/yr = $8,022.51/mo. + me_ccap_countable_income: 6_667 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + me_ccap_income_eligible: true + +# === Edge cases: income boundary tests === +# SMI for ME (2025-10-01) 4-person = $118,065. + +- name: Case 5, income exactly at 125% SMI for size 2, eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + # Size 2 annual SMI = 118,065 * 0.68 = $80,284.20. + # 125% SMI = $100,355.25/yr. + # Monthly limit = $8,362.94. + me_ccap_countable_income: 8_362.92 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + # 8362.92 <= 8362.94 => eligible. + me_ccap_income_eligible: true + +- name: Case 6, income just above 125% SMI for size 2, ineligible. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + # Monthly limit = $8,362.94. + me_ccap_countable_income: 8_363 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + # 8363 > 8362.94 => ineligible. + me_ccap_income_eligible: false + +- name: Case 7, zero income, eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + me_ccap_countable_income: 0 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + me_ccap_income_eligible: true + +- name: Case 8, family size 1, income at boundary. + period: 2026-01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + # Size 1 annual SMI = 118,065 * 0.52 = $61,393.80. + # 125% SMI = $76,742.25/yr. + # Monthly limit = $6,395.19. + me_ccap_countable_income: 6_395.17 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: ME + output: + # 6395.17 <= 6395.19 => eligible. + me_ccap_income_eligible: true + +- name: Case 9, large family size 10. + period: 2026-01 + input: + people: + person1: + age: 35 + person2: + age: 33 + person3: + age: 12 + person4: + age: 10 + person5: + age: 8 + person6: + age: 6 + person7: + age: 5 + person8: + age: 4 + person9: + age: 3 + person10: + age: 1 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10] + # Size 10: adjustment = 0.52 + 5*0.16 + 4*0.03 = 1.44. + # Annual SMI = 118,065 * 1.44 = $170,013.60. + # 125% SMI = $212,517.00/yr. + # Monthly limit = $17,709.75. + me_ccap_countable_income: 15_833.33 + tax_units: + tax_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10] + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10] + state_code: ME + output: + # $15,833.33 <= $17,709.75 => eligible. + me_ccap_income_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/integration.yaml new file mode 100644 index 00000000000..d296cc04c26 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/integration.yaml @@ -0,0 +1,626 @@ +- name: Case 1, low-income single parent with one preschooler in Region 1 licensed center, zero copay. + period: 2026-01 + absolute_error_margin: 1 + input: + people: + person1: + age: 28 + employment_income: 20_000 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_day: 8 + childcare_days_per_week: 5 + me_ccap_provider_type: LICENSED_CENTER + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 15_000 + spm_unit_assets: 5_000 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + county_str: CUMBERLAND_COUNTY_ME + output: + # Eligibility: + # - Child age 4 < 13 => eligible child + # - Citizen => immigration eligible + # - Region 1 (Cumberland County) + me_ccap_eligible_child: [false, true] + + # Income: + # - me_ccap_countable_income = $20,000/yr + # - SMI for ME size 2 (2025-10-01): 118,065 * 0.68 = $80,284.20 + # - 125% SMI = $100,355.25 + # - $20,000 <= $100,355.25 => income eligible + me_ccap_income_eligible: true + + # Assets: + # - $5,000 <= $1,000,000 => asset eligible + me_ccap_asset_eligible: true + me_ccap_eligible: true + + # Age group: age 4 => PRESCHOOL + me_ccap_age_group: [SCHOOL_AGE, PRESCHOOL] + + # Time category: person1 adult (0 hrs => PT), person2 8*5 = 40 hrs/week >= 30 => FULL_TIME + me_ccap_time_category: [PART_TIME, FULL_TIME] + + # Region: Cumberland => REGION_1 + me_ccap_region: REGION_1 + + # SMI percentage: + # Countable income includes employment + computed TANF. + # Employment $20,000/yr = $1,667/mo + TANF ~$669/mo = ~$2,336/mo. + # SMI% = 2336 / 6690 = 34.9% => 30-35% bracket => 1% fee. + # Weekly income = 2336 * 12/52 = 539. + # Raw weekly = floor(539 * 0.01) = 5. + # Monthly = 5 * 52/12 = $21.67. + me_ccap_parent_fee: 22 + + # Market rate: Region 1 Licensed Center Preschool FT = $300/week + me_ccap_market_rate: [0, 300] + + # Benefit: + # Expenses (monthly): 15000/12 = $1,250 + # Parent fee (monthly): ~$22 + # Uncapped: max(1250 - 22, 0) = $1,228 + # Max reimbursement: 300 * 52/12 = $1,300 + # Benefit = min(1228, 1300) = $1,228 + me_ccap: 1_228 + +- name: Case 2, moderate-income family with two children, Region 2, licensed family, 4% copay. + period: 2026-01 + absolute_error_margin: 1 + input: + people: + person1: + age: 35 + employment_income: 45_000 + person2: + age: 32 + employment_income: 10_000 + person3: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_day: 8 + childcare_days_per_week: 5 + me_ccap_provider_type: LICENSED_FAMILY + person4: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_day: 4 + childcare_days_per_week: 5 + me_ccap_provider_type: LICENSED_FAMILY + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + spm_unit_pre_subsidy_childcare_expenses: 20_000 + spm_unit_assets: 50_000 + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: ME + county_str: PENOBSCOT_COUNTY_ME + output: + # Eligibility: + # - person3: age 2 < 13, citizen, dependent => eligible child + # - person4: age 7 < 13, citizen, dependent => eligible child + me_ccap_eligible_child: [false, false, true, true] + + # Income: + # - Total = $45,000 + $10,000 = $55,000 + # - SMI for ME size 4 (2025-10-01): 118,065 * 1.0 = $118,065 + # - 125% SMI = $147,581.25 + # - $55,000 <= $147,581 => income eligible + me_ccap_income_eligible: true + me_ccap_asset_eligible: true + me_ccap_eligible: true + + # Region: Penobscot => REGION_2 + me_ccap_region: REGION_2 + + # Age groups: person3 age 2 => TODDLER; person4 age 7 => SCHOOL_AGE + me_ccap_age_group: [SCHOOL_AGE, SCHOOL_AGE, TODDLER, SCHOOL_AGE] + + # Time categories: + # person1,2: adults (0 hrs => PT) + # person3: 8*5 = 40 hrs => FULL_TIME + # person4: 4*5 = 20 hrs => PART_TIME + me_ccap_time_category: [PART_TIME, PART_TIME, FULL_TIME, PART_TIME] + + # SMI percentage: $55,000 / $118,065 = 46.6% => 45-55% bracket => 4% fee + # Weekly income = $55,000 / 52 = $1,057.69 + # Raw weekly fee = floor(1057.69 * 0.04) = floor(42.31) = $42 + # Cap: 46.6% < 85% => 7% cap + # Cap amount = floor(1057.69 * 0.07) = floor(74.04) = $74 + # Fee = min(42, 74) = $42/week + # Monthly = 42 * 52/12 = $182 + me_ccap_parent_fee: 182 + + # Market rates (weekly): + # person3: Region 2 Licensed Family Toddler FT = $200/week + # person4: Region 2 Licensed Family School Age PT = $136.45/week + me_ccap_market_rate: [0, 0, 200, 136.45] + + # Benefit: + # Max reimbursement: (200 + 136.45) * 52/12 = 336.45 * 4.333 = $1,457.95 + # Expenses (monthly): 20000/12 = $1,666.67 + # Parent fee (monthly): $182 + # Uncapped = max(1666.67 - 182, 0) = $1,484.67 + # Benefit = min(1484.67, 1457.95) = $1,457.95 + me_ccap: 1_458 + +- name: Case 3, income above 125% SMI, ineligible. + period: 2026-01 + absolute_error_margin: 1 + input: + people: + person1: + age: 40 + employment_income: 120_000 + person2: + age: 38 + employment_income: 40_000 + person3: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_day: 8 + childcare_days_per_week: 5 + me_ccap_provider_type: LICENSED_CENTER + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_pre_subsidy_childcare_expenses: 18_000 + spm_unit_assets: 100_000 + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: ME + county_str: YORK_COUNTY_ME + output: + # Income: $120,000 + $40,000 = $160,000 + # SMI for ME size 3 (2025-10-01): 118,065 * 0.84 = $99,174.60 + # 125% SMI = $123,968.25 + # $160,000 > $123,968.25 => income ineligible + me_ccap_income_eligible: false + me_ccap_eligible: false + me_ccap: 0 + +- name: Case 4, undocumented child, ineligible. + period: 2026-01 + absolute_error_margin: 1 + input: + people: + person1: + age: 30 + employment_income: 25_000 + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: UNDOCUMENTED + childcare_hours_per_day: 8 + childcare_days_per_week: 5 + me_ccap_provider_type: LICENSED_CENTER + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 12_000 + spm_unit_assets: 10_000 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + county_str: CUMBERLAND_COUNTY_ME + output: + # Child is undocumented => not immigration eligible => not eligible child + me_ccap_immigration_status_eligible: [true, false] + me_ccap_eligible_child: [false, false] + me_ccap_eligible: false + me_ccap: 0 + +- name: Case 5, high-income family at 110% SMI, 10% copay bracket. + period: 2026-01 + absolute_error_margin: 1 + input: + people: + person1: + age: 42 + # SMI for ME size 3 (2025-10-01): 118,065 * 0.84 = $99,174.60. + # Target ~115% SMI => 99,175 * 1.15 = $114,051. + employment_income: 115_000 + person2: + age: 40 + person3: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_day: 9 + childcare_days_per_week: 5 + me_ccap_provider_type: LICENSED_CENTER + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_pre_subsidy_childcare_expenses: 25_000 + spm_unit_assets: 200_000 + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: ME + county_str: CUMBERLAND_COUNTY_ME + output: + # Eligibility: + me_ccap_eligible_child: [false, false, true] + + # Income: + # - $115,000 / $99,175 = 115.9% SMI + # - 125% SMI = $123,968.25 + # - $115,000 < $123,968 => income eligible + me_ccap_income_eligible: true + me_ccap_eligible: true + + # Region: Cumberland => REGION_1 + me_ccap_region: REGION_1 + + # Age group: age 1 => TODDLER + me_ccap_age_group: [SCHOOL_AGE, SCHOOL_AGE, TODDLER] + + # Time: person1,2 adults (0 hrs => PT), person3: 9*5 = 45 hrs => FULL_TIME + me_ccap_time_category: [PART_TIME, PART_TIME, FULL_TIME] + + # SMI percentage: $115,000 / $99,175 = 115.9% => 110-125% bracket => 10% fee + # Weekly income = $115,000/52 = $2,211.54 + # Raw weekly fee = floor(2211.54 * 0.10) = floor(221.15) = $221 + # Cap: 115.9% >= 85% => 10% cap + # Cap = floor(2211.54 * 0.10) = floor(221.15) = $221 + # Fee = $221/week => monthly = 221 * 52/12 = $957.67 + me_ccap_parent_fee: 957.67 + + # Market rate: Region 1 Licensed Center Toddler FT = $320/week + me_ccap_market_rate: [0, 0, 320] + + # Benefit: + # Max reimbursement: 320 * 52/12 = $1,386.67 + # Expenses (monthly): 25000/12 = $2,083.33 + # Parent fee (monthly): $957.67 + # Uncapped = max(2083.33 - 957.67, 0) = $1,125.67 + # Benefit = min(1125.67, 1386.67) = $1,125.67 + me_ccap: 1_126 + +- name: Case 6, disabled child age 15, eligible under special needs. + period: 2026-01 + absolute_error_margin: 1 + input: + people: + person1: + age: 45 + employment_income: 50_000 + person2: + age: 15 + is_disabled: true + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_day: 6 + childcare_days_per_week: 5 + me_ccap_provider_type: LICENSE_EXEMPT + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 8_000 + spm_unit_assets: 30_000 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + county_str: OXFORD_COUNTY_ME + output: + # person2: age 15, disabled => age < 19 special needs limit => eligible child + me_ccap_eligible_child: [false, true] + me_ccap_income_eligible: true + me_ccap_eligible: true + + # Region: Oxford => REGION_2 + me_ccap_region: REGION_2 + + # Age group: age 15 => SCHOOL_AGE + me_ccap_age_group: [SCHOOL_AGE, SCHOOL_AGE] + + # Time: person1 adult (0 hrs => PT), person2: 6*5 = 30 hrs => FULL_TIME (boundary) + me_ccap_time_category: [PART_TIME, FULL_TIME] + + # SMI %: $50,000 / $80,284 = 62.3% => 55-65% bracket => 5% fee + # Weekly income = 50000/52 = $961.54 + # Raw weekly fee = floor(961.54 * 0.05) = floor(48.08) = $48 + # Cap: 62.3% < 85% => 7% cap = floor(961.54 * 0.07) = floor(67.31) = $67 + # Fee = min(48, 67) = $48/week => monthly = 48 * 52/12 = $208 + me_ccap_parent_fee: 208 + + # Market rate: Region 2 License-Exempt School Age FT = $119/week + me_ccap_market_rate: [0, 119] + + # Benefit: + # Max reimbursement: 119 * 52/12 = $515.67 + # Expenses (monthly): 8000/12 = $666.67 + # Parent fee (monthly): $208 + # Uncapped = max(666.67 - 208, 0) = $458.67 + # Benefit = min(458.67, 515.67) = $458.67 + me_ccap: 459 + +- name: Case 7, assets over limit, ineligible. + period: 2026-01 + absolute_error_margin: 1 + input: + people: + person1: + age: 35 + employment_income: 60_000 + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_day: 8 + childcare_days_per_week: 5 + me_ccap_provider_type: LICENSED_CENTER + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 15_000 + spm_unit_assets: 1_500_000 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + county_str: KENNEBEC_COUNTY_ME + output: + # Assets $1,500,000 > $1,000,000 => asset ineligible + me_ccap_asset_eligible: false + me_ccap_eligible: false + me_ccap: 0 + +# === Edge case integration tests === + +- name: Case 8, assets exactly at limit, eligible. + period: 2026-01 + absolute_error_margin: 1 + input: + people: + person1: + age: 28 + employment_income: 30_000 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_day: 8 + childcare_days_per_week: 5 + me_ccap_provider_type: LICENSED_CENTER + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 15_000 + spm_unit_assets: 1_000_000 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + county_str: YORK_COUNTY_ME + output: + # Assets $1,000,000 <= $1,000,000 => asset eligible. + me_ccap_asset_eligible: true + me_ccap_eligible_child: [false, true] + me_ccap_income_eligible: true + me_ccap_eligible: true + # Region 1 (York), Preschool, FT, Licensed Center = $300/week. + me_ccap_region: REGION_1 + me_ccap_age_group: [SCHOOL_AGE, PRESCHOOL] + me_ccap_time_category: [PART_TIME, FULL_TIME] + # SMI% = 30000 / 80284.20 = 37.4% => 35-40% bracket => 2% fee. + # Weekly income = 30000/52 = 576.92. + # Raw weekly = floor(576.92 * 0.02) = floor(11.54) = 11. + # Cap: floor(576.92 * 0.07) = floor(40.38) = 40. + # Fee = 11/week => monthly = 11 * 52/12 = $47.67. + me_ccap_parent_fee: 48 + me_ccap_market_rate: [0, 300] + # Max reimbursement: 300 * 52/12 = $1,300. + # Expenses (monthly) = 15000/12 = $1,250. + # Parent fee (monthly): $47.67. + # Uncapped = max(1250 - 47.67, 0) = $1,202.33. + # Benefit = min(1202.33, 1300) = $1,202.33. + me_ccap: 1_202 + +- name: Case 9, multiple children with different provider types and time categories. + period: 2026-01 + absolute_error_margin: 1 + input: + people: + person1: + age: 35 + employment_income: 35_000 + person2: + age: 33 + person3: + age: 0 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_day: 9 + childcare_days_per_week: 5 + me_ccap_provider_type: LICENSED_CENTER + person4: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_day: 4 + childcare_days_per_week: 3 + me_ccap_provider_type: LICENSE_EXEMPT + person5: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_day: 3 + childcare_days_per_week: 5 + me_ccap_provider_type: LICENSED_FAMILY + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + spm_unit_pre_subsidy_childcare_expenses: 30_000 + spm_unit_assets: 200_000 + tax_units: + tax_unit: + members: [person1, person2, person3, person4, person5] + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: ME + county_str: SAGADAHOC_COUNTY_ME + output: + me_ccap_eligible_child: [false, false, true, true, true] + + # Size 5: adjustment = 0.52 + 4*0.16 = 1.16. + # Annual SMI = 118,065 * 1.16 = $136,955.40. + # 125% SMI = $171,194.25. + # $35,000 <= $171,194.25 => income eligible. + me_ccap_income_eligible: true + me_ccap_eligible: true + + # Region: Sagadahoc => REGION_1. + me_ccap_region: REGION_1 + + # Age groups: + # person3: age 0 => INFANT. + # person4: age 4 => PRESCHOOL. + # person5: age 8 => SCHOOL_AGE. + me_ccap_age_group: [SCHOOL_AGE, SCHOOL_AGE, INFANT, PRESCHOOL, SCHOOL_AGE] + + # Time categories: + # person1,2: adults (0 hrs => PT). + # person3: 9*5 = 45 hrs >= 30 => FULL_TIME. + # person4: 4*3 = 12 hrs < 30 => PART_TIME. + # person5: 3*5 = 15 hrs < 30 => PART_TIME. + me_ccap_time_category: [PART_TIME, PART_TIME, FULL_TIME, PART_TIME, PART_TIME] + + # SMI%: 35000 / 136955.40 = 25.6% => under 30% => 0% fee. + me_ccap_parent_fee: 0 + + # Market rates (weekly): + # person3: Region 1 Licensed Center Infant FT = 330. + # person4: Region 1 License-Exempt Preschool PT = 118.13. + # person5: Region 1 Licensed Family School Age PT = 140.46. + me_ccap_market_rate: [0, 0, 330, 118.13, 140.46] + + # Max reimbursement: (330 + 118.13 + 140.46) * 52/12 = 588.59 * 4.333 = $2,550.56. + # Expenses (monthly) = 30000/12 = $2,500. + # Parent fee (monthly): $0. + # Uncapped = max(2500 - 0, 0) = $2,500. + # Benefit = min(2500, 2550.56) = $2,500. + me_ccap: 2_500 + +- name: Case 10, high parent fee exceeds cheapest child's market rate but not most expensive. + period: 2026-01 + absolute_error_margin: 1 + input: + people: + person1: + age: 40 + # Target ~110% SMI for size 4 => $118,065 * 1.10 = $129,871.50. + employment_income: 129_872 + person2: + age: 38 + person3: + age: 0 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_day: 8 + childcare_days_per_week: 5 + me_ccap_provider_type: LICENSED_CENTER + person4: + age: 10 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_day: 3 + childcare_days_per_week: 5 + me_ccap_provider_type: LICENSE_EXEMPT + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + spm_unit_pre_subsidy_childcare_expenses: 30_000 + spm_unit_assets: 50_000 + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: ME + county_str: PENOBSCOT_COUNTY_ME + output: + me_ccap_eligible_child: [false, false, true, true] + + # Size 4 SMI = $118,065. 125% = $147,581.25. + # $129,872 <= $147,581 => eligible. + me_ccap_income_eligible: true + me_ccap_eligible: true + + # Region 2 (Penobscot). + me_ccap_region: REGION_2 + + # person3: age 0 => INFANT. person4: age 10 => SCHOOL_AGE. + me_ccap_age_group: [SCHOOL_AGE, SCHOOL_AGE, INFANT, SCHOOL_AGE] + + # person1,2: adults (0 hrs => PT). person3: 8*5=40 => FT. person4: 3*5=15 => PT. + me_ccap_time_category: [PART_TIME, PART_TIME, FULL_TIME, PART_TIME] + + # SMI% = 129872 / 118065 = 1.1000 => 100-110% bracket => 9% fee. + # But wait, need 110-125% bracket = threshold 1.1 => 10%. + # Actually, 1.1000 exactly: the bracket threshold at 1.1 gives 10%. + # But single_amount: the value at exactly 1.1 is 0.10 (the 110% threshold). + # Weekly income = 129872/52 = 2497.54. + # Raw weekly = floor(2497.54 * 0.10) = floor(249.75) = 249. + # Cap (110% >= 85%): floor(2497.54 * 0.10) = floor(249.75) = 249. + # Fee = 249/week. + # SMI% = 129872 / 118065 = 1.10 => 110-125% bracket => 10% fee. + # Weekly income = 129872/52 = $2,497.54. + # Raw weekly = floor(2497.54 * 0.10) = floor(249.75) = $249. + # Cap (110% >= 85%): floor(2497.54 * 0.10) = floor(249.75) = $249. + # Fee = 249/week => monthly = 249 * 52/12 = $1,079. + me_ccap_parent_fee: 1_079 + + # Market rates (weekly): + # person3: Region 2 Licensed Center Infant FT = $275. + # person4: Region 2 License-Exempt School Age PT = $95.51. + me_ccap_market_rate: [0, 0, 275, 95.51] + + # Max reimbursement: (275 + 95.51) * 52/12 = 370.51 * 4.333 = $1,605.54. + # Expenses (monthly): 30000/12 = $2,500. + # Parent fee (monthly): $1,079. + # Uncapped = max(2500 - 1079, 0) = $1,421. + # Benefit = min(1421, 1605.54) = $1,421. + me_ccap: 1_421 diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/me_ccap.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/me_ccap.yaml new file mode 100644 index 00000000000..6fc5db3e8ec --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/me_ccap.yaml @@ -0,0 +1,290 @@ +- name: Case 1, eligible family, benefit is min of expenses minus fee and market rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 4 + me_ccap_eligible_child: true + me_ccap_market_rate: 300 + spm_units: + spm_unit: + members: [person1, person2] + me_ccap_eligible: true + me_ccap_parent_fee: 216.67 + spm_unit_pre_subsidy_childcare_expenses: 20_800 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + # Market rate (weekly): $300 => monthly = 300 * 52/12 = $1,300. + # Parent fee (monthly): $216.67. + # Expenses (monthly): 20800/12 = $1,733.33. + # Uncapped: max(1733.33 - 216.67, 0) = $1,516.67. + # Max reimbursement: $1,300. + # Benefit = min(1516.67, 1300) = $1,300. + me_ccap: 1_300 + +- name: Case 2, ineligible family, zero benefit. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + me_ccap_eligible: false + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + me_ccap: 0 + +- name: Case 3, expenses less than market rate, benefit capped at expenses minus fee. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 4 + me_ccap_eligible_child: true + me_ccap_market_rate: 300 + spm_units: + spm_unit: + members: [person1, person2] + me_ccap_eligible: true + me_ccap_parent_fee: 216.67 + spm_unit_pre_subsidy_childcare_expenses: 10_400 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + # Market rate (weekly): $300 => monthly = $1,300. + # Parent fee (monthly): $216.67. + # Expenses (monthly): 10400/12 = $866.67. + # Uncapped: max(866.67 - 216.67, 0) = $650. + # Max reimbursement: $1,300. + # Benefit = min(650, 1300) = $650. + me_ccap: 650 + +- name: Case 4, parent fee exceeds expenses, zero benefit. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 4 + me_ccap_eligible_child: true + me_ccap_market_rate: 115.38 + spm_units: + spm_unit: + members: [person1, person2] + me_ccap_eligible: true + me_ccap_parent_fee: 700 + spm_unit_pre_subsidy_childcare_expenses: 6_000 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + # Expenses (monthly): 6000/12 = $500. + # Uncapped: max(500 - 700, 0) = $0. + # Benefit = min(0, 500) = $0. + me_ccap: 0 + +# === Edge cases === + +- name: Case 5, parent fee exceeds market rate for child (REQ-024). + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 10 + me_ccap_eligible_child: true + me_ccap_market_rate: 95.51 + spm_units: + spm_unit: + members: [person1, person2] + me_ccap_eligible: true + me_ccap_parent_fee: 650 + spm_unit_pre_subsidy_childcare_expenses: 10_000 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + # Weekly market rate: $95.51 => monthly = 95.51 * 52/12 = $413.88. + # Parent fee (monthly): $650. + # Expenses (monthly): 10000/12 = $833.33. + # Uncapped: max(833.33 - 650, 0) = $183.33. + # Max reimbursement: $413.88. + # Benefit = min(183.33, 413.88) = $183.33. + me_ccap: 183.33 + +- name: Case 6, multiple children, different age groups, one fee for family. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 0 + me_ccap_eligible_child: true + me_ccap_market_rate: 330 + person3: + age: 7 + me_ccap_eligible_child: true + me_ccap_market_rate: 214 + spm_units: + spm_unit: + members: [person1, person2, person3] + me_ccap_eligible: true + me_ccap_parent_fee: 216.67 + spm_unit_pre_subsidy_childcare_expenses: 30_000 + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: ME + output: + # Weekly market rates: infant $330 + school age $214 = $544. + # Max reimbursement: 544 * 52/12 = $2,357.33. + # Expenses (monthly): 30000/12 = $2,500. + # Parent fee (monthly): $216.67. + # Uncapped: max(2500 - 216.67, 0) = $2,283.33. + # Benefit = min(2283.33, 2357.33) = $2,283.33. + me_ccap: 2_283.33 + +- name: Case 7, multiple children, parent fee exceeds market rate for one child only. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 0 + me_ccap_eligible_child: true + me_ccap_market_rate: 275 + person3: + age: 10 + me_ccap_eligible_child: true + me_ccap_market_rate: 95.51 + spm_units: + spm_unit: + members: [person1, person2, person3] + me_ccap_eligible: true + me_ccap_parent_fee: 520 + spm_unit_pre_subsidy_childcare_expenses: 25_000 + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: ME + output: + # Weekly market rates: infant $275 + school age $95.51 = $370.51. + # Max reimbursement: 370.51 * 52/12 = $1,605.54. + # Expenses (monthly): 25000/12 = $2,083.33. + # Parent fee (monthly): $520. + # Uncapped: max(2083.33 - 520, 0) = $1,563.33. + # Benefit = min(1563.33, 1605.54) = $1,563.33. + me_ccap: 1_563.33 + +- name: Case 8, zero childcare expenses, benefit capped at zero. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 4 + me_ccap_eligible_child: true + me_ccap_market_rate: 300 + spm_units: + spm_unit: + members: [person1, person2] + me_ccap_eligible: true + me_ccap_parent_fee: 0 + spm_unit_pre_subsidy_childcare_expenses: 0 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + # Expenses = 0. + # Uncapped: max(0 - 0, 0) = 0. + # Benefit = min(0, 1300) = 0. + me_ccap: 0 + +- name: Case 9, parent fee exactly equals monthly market rate equivalent. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 4 + me_ccap_eligible_child: true + me_ccap_market_rate: 200 + spm_units: + spm_unit: + members: [person1, person2] + me_ccap_eligible: true + me_ccap_parent_fee: 866.67 + spm_unit_pre_subsidy_childcare_expenses: 15_000 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + # Weekly market rate: $200 => monthly = 200 * 52/12 = $866.67. + # Parent fee (monthly): $866.67. + # Expenses (monthly): 15000/12 = $1,250. + # Uncapped: max(1250 - 866.67, 0) = $383.33. + # Max reimbursement: $866.67. + # Benefit = min(383.33, 866.67) = $383.33. + me_ccap: 383.33 diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_age_group.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_age_group.yaml new file mode 100644 index 00000000000..0878729f925 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_age_group.yaml @@ -0,0 +1,93 @@ +- name: Case 1, infant, 6 months old. + period: 2025-01 + input: + age: 0.5 + state_code: ME + output: + me_ccap_age_group: INFANT + +- name: Case 2, infant at upper boundary, 11 months. + period: 2025-01 + input: + age: 0.92 + state_code: ME + output: + me_ccap_age_group: INFANT + +- name: Case 3, toddler, 1 year old. + period: 2025-01 + input: + age: 1 + state_code: ME + output: + me_ccap_age_group: TODDLER + +- name: Case 4, toddler, 2 years old. + period: 2025-01 + input: + age: 2 + state_code: ME + output: + me_ccap_age_group: TODDLER + +- name: Case 5, preschool, 3 years old. + period: 2025-01 + input: + age: 3 + state_code: ME + output: + me_ccap_age_group: PRESCHOOL + +- name: Case 6, preschool, 4 years old. + period: 2025-01 + input: + age: 4 + state_code: ME + output: + me_ccap_age_group: PRESCHOOL + +- name: Case 7, school age, 5 years old. + period: 2025-01 + input: + age: 5 + state_code: ME + output: + me_ccap_age_group: SCHOOL_AGE + +- name: Case 8, school age, 10 years old. + period: 2025-01 + input: + age: 10 + state_code: ME + output: + me_ccap_age_group: SCHOOL_AGE + +# === Edge cases: boundary ages === + +- name: Case 9, newborn, age 0, infant. + period: 2025-01 + input: + age: 0 + state_code: ME + output: + # 0 months <= 12 months => INFANT. + me_ccap_age_group: INFANT + +- name: Case 10, school age boundary, 12 years old. + period: 2025-01 + input: + age: 12 + state_code: ME + output: + # age 12 > 5 => SCHOOL_AGE. + me_ccap_age_group: SCHOOL_AGE + +- name: Case 11, special needs child age 17, still school age group. + period: 2025-01 + input: + age: 17 + state_code: ME + output: + # Even though special needs children are eligible up to age 19, + # the age group is still SCHOOL_AGE for all children 5+. + me_ccap_age_group: SCHOOL_AGE diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_market_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_market_rate.yaml new file mode 100644 index 00000000000..84ba3be33fb --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_market_rate.yaml @@ -0,0 +1,913 @@ +- name: Case 1, Region 1 infant full-time licensed center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: INFANT + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSED_CENTER + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 Licensed Center Infant FT = $330/week + me_ccap_market_rate: [330] + +- name: Case 2, Region 2 toddler part-time licensed family. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: TODDLER + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSED_FAMILY + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 Licensed Family Toddler PT = $150/week + me_ccap_market_rate: [150] + +- name: Case 3, Region 1 preschool full-time license-exempt. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: PRESCHOOL + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSE_EXEMPT + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 License-Exempt Preschool FT = $157.5/week + me_ccap_market_rate: [157.5] + +- name: Case 4, Region 2 school age part-time licensed center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: SCHOOL_AGE + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSED_CENTER + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 Licensed Center School Age PT = $144.47/week + me_ccap_market_rate: [144.47] + +- name: Case 5, Region 2 infant full-time license-exempt. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: INFANT + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSE_EXEMPT + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 License-Exempt Infant FT = $147/week + me_ccap_market_rate: [147] + +- name: Case 6, Region 1 school age full-time licensed family. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: SCHOOL_AGE + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSED_FAMILY + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 Licensed Family School Age FT = $175/week + me_ccap_market_rate: [175] + +# === Edge cases: remaining rate combinations === + +- name: Case 7, Region 1 infant part-time licensed center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: INFANT + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSED_CENTER + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 Licensed Center Infant PT = $247.50/week + me_ccap_market_rate: [247.50] + +- name: Case 8, Region 1 toddler full-time licensed center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: TODDLER + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSED_CENTER + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 Licensed Center Toddler FT = $320/week + me_ccap_market_rate: [320] + +- name: Case 9, Region 1 toddler part-time licensed center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: TODDLER + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSED_CENTER + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 Licensed Center Toddler PT = $240/week + me_ccap_market_rate: [240] + +- name: Case 10, Region 1 preschool full-time licensed center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: PRESCHOOL + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSED_CENTER + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 Licensed Center Preschool FT = $300/week + me_ccap_market_rate: [300] + +- name: Case 11, Region 1 preschool part-time licensed center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: PRESCHOOL + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSED_CENTER + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 Licensed Center Preschool PT = $225/week + me_ccap_market_rate: [225] + +- name: Case 12, Region 1 school age full-time licensed center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: SCHOOL_AGE + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSED_CENTER + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 Licensed Center School Age FT = $214/week + me_ccap_market_rate: [214] + +- name: Case 13, Region 1 school age part-time licensed center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: SCHOOL_AGE + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSED_CENTER + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 Licensed Center School Age PT = $171.76/week + me_ccap_market_rate: [171.76] + +- name: Case 14, Region 2 infant full-time licensed center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: INFANT + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSED_CENTER + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 Licensed Center Infant FT = $275/week + me_ccap_market_rate: [275] + +- name: Case 15, Region 2 infant part-time licensed center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: INFANT + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSED_CENTER + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 Licensed Center Infant PT = $206.25/week + me_ccap_market_rate: [206.25] + +- name: Case 16, Region 2 toddler full-time licensed center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: TODDLER + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSED_CENTER + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 Licensed Center Toddler FT = $250/week + me_ccap_market_rate: [250] + +- name: Case 17, Region 2 toddler part-time licensed center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: TODDLER + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSED_CENTER + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 Licensed Center Toddler PT = $187.50/week + me_ccap_market_rate: [187.50] + +- name: Case 18, Region 2 preschool full-time licensed center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: PRESCHOOL + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSED_CENTER + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 Licensed Center Preschool FT = $244/week + me_ccap_market_rate: [244] + +- name: Case 19, Region 2 preschool part-time licensed center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: PRESCHOOL + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSED_CENTER + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 Licensed Center Preschool PT = $183/week + me_ccap_market_rate: [183] + +- name: Case 20, Region 2 school age full-time licensed center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: SCHOOL_AGE + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSED_CENTER + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 Licensed Center School Age FT = $180/week + me_ccap_market_rate: [180] + +- name: Case 21, Region 1 infant full-time licensed family. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: INFANT + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSED_FAMILY + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 Licensed Family Infant FT = $245/week + me_ccap_market_rate: [245] + +- name: Case 22, Region 1 infant part-time licensed family. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: INFANT + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSED_FAMILY + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 Licensed Family Infant PT = $183.75/week + me_ccap_market_rate: [183.75] + +- name: Case 23, Region 1 toddler full-time licensed family. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: TODDLER + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSED_FAMILY + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 Licensed Family Toddler FT = $230.77/week + me_ccap_market_rate: [230.77] + +- name: Case 24, Region 1 toddler part-time licensed family. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: TODDLER + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSED_FAMILY + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 Licensed Family Toddler PT = $173.08/week + me_ccap_market_rate: [173.08] + +- name: Case 25, Region 1 preschool full-time licensed family. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: PRESCHOOL + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSED_FAMILY + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 Licensed Family Preschool FT = $225/week + me_ccap_market_rate: [225] + +- name: Case 26, Region 1 preschool part-time licensed family. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: PRESCHOOL + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSED_FAMILY + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 Licensed Family Preschool PT = $168.75/week + me_ccap_market_rate: [168.75] + +- name: Case 27, Region 1 school age part-time licensed family. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: SCHOOL_AGE + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSED_FAMILY + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 Licensed Family School Age PT = $140.46/week + me_ccap_market_rate: [140.46] + +- name: Case 28, Region 2 infant full-time licensed family. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: INFANT + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSED_FAMILY + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 Licensed Family Infant FT = $210/week + me_ccap_market_rate: [210] + +- name: Case 29, Region 2 infant part-time licensed family. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: INFANT + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSED_FAMILY + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 Licensed Family Infant PT = $157.50/week + me_ccap_market_rate: [157.50] + +- name: Case 30, Region 2 toddler full-time licensed family. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: TODDLER + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSED_FAMILY + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 Licensed Family Toddler FT = $200/week + me_ccap_market_rate: [200] + +- name: Case 31, Region 2 preschool full-time licensed family. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: PRESCHOOL + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSED_FAMILY + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 Licensed Family Preschool FT = $190/week + me_ccap_market_rate: [190] + +- name: Case 32, Region 2 preschool part-time licensed family. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: PRESCHOOL + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSED_FAMILY + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 Licensed Family Preschool PT = $142.50/week + me_ccap_market_rate: [142.50] + +- name: Case 33, Region 2 school age full-time licensed family. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: SCHOOL_AGE + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSED_FAMILY + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 Licensed Family School Age FT = $170/week + me_ccap_market_rate: [170] + +- name: Case 34, Region 2 school age part-time licensed family. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: SCHOOL_AGE + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSED_FAMILY + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 Licensed Family School Age PT = $136.45/week + me_ccap_market_rate: [136.45] + +- name: Case 35, Region 1 infant full-time license-exempt. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: INFANT + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSE_EXEMPT + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 License-Exempt Infant FT = $171.50/week + me_ccap_market_rate: [171.50] + +- name: Case 36, Region 1 infant part-time license-exempt. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: INFANT + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSE_EXEMPT + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 License-Exempt Infant PT = $128.63/week + me_ccap_market_rate: [128.63] + +- name: Case 37, Region 1 toddler full-time license-exempt. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: TODDLER + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSE_EXEMPT + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 License-Exempt Toddler FT = $161.54/week + me_ccap_market_rate: [161.54] + +- name: Case 38, Region 1 toddler part-time license-exempt. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: TODDLER + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSE_EXEMPT + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 License-Exempt Toddler PT = $121.15/week + me_ccap_market_rate: [121.15] + +- name: Case 39, Region 1 preschool part-time license-exempt. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: PRESCHOOL + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSE_EXEMPT + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 License-Exempt Preschool PT = $118.13/week + me_ccap_market_rate: [118.13] + +- name: Case 40, Region 1 school age full-time license-exempt. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: SCHOOL_AGE + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSE_EXEMPT + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 License-Exempt School Age FT = $122.50/week + me_ccap_market_rate: [122.50] + +- name: Case 41, Region 1 school age part-time license-exempt. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: SCHOOL_AGE + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSE_EXEMPT + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_1 + output: + # Region 1 License-Exempt School Age PT = $98.33/week + me_ccap_market_rate: [98.33] + +- name: Case 42, Region 2 infant part-time license-exempt. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: INFANT + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSE_EXEMPT + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 License-Exempt Infant PT = $110.25/week + me_ccap_market_rate: [110.25] + +- name: Case 43, Region 2 toddler full-time license-exempt. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: TODDLER + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSE_EXEMPT + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 License-Exempt Toddler FT = $140/week + me_ccap_market_rate: [140] + +- name: Case 44, Region 2 toddler part-time license-exempt. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: TODDLER + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSE_EXEMPT + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 License-Exempt Toddler PT = $105/week + me_ccap_market_rate: [105] + +- name: Case 45, Region 2 preschool full-time license-exempt. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: PRESCHOOL + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSE_EXEMPT + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 License-Exempt Preschool FT = $133/week + me_ccap_market_rate: [133] + +- name: Case 46, Region 2 preschool part-time license-exempt. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: PRESCHOOL + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSE_EXEMPT + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 License-Exempt Preschool PT = $99.75/week + me_ccap_market_rate: [99.75] + +- name: Case 47, Region 2 school age full-time license-exempt. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: SCHOOL_AGE + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSE_EXEMPT + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 License-Exempt School Age FT = $119/week + me_ccap_market_rate: [119] + +- name: Case 48, Region 2 school age part-time license-exempt. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: SCHOOL_AGE + me_ccap_time_category: PART_TIME + me_ccap_provider_type: LICENSE_EXEMPT + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: REGION_2 + output: + # Region 2 License-Exempt School Age PT = $95.51/week + me_ccap_market_rate: [95.51] diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_region.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_region.yaml new file mode 100644 index 00000000000..49f52a7a496 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_region.yaml @@ -0,0 +1,47 @@ +- name: Case 1, Cumberland County, Region 1. + period: 2025-01 + input: + county_str: CUMBERLAND_COUNTY_ME + state_code: ME + output: + me_ccap_region: REGION_1 + +- name: Case 2, York County, Region 1. + period: 2025-01 + input: + county_str: YORK_COUNTY_ME + state_code: ME + output: + me_ccap_region: REGION_1 + +- name: Case 3, Sagadahoc County, Region 1. + period: 2025-01 + input: + county_str: SAGADAHOC_COUNTY_ME + state_code: ME + output: + me_ccap_region: REGION_1 + +- name: Case 4, Penobscot County, Region 2. + period: 2025-01 + input: + county_str: PENOBSCOT_COUNTY_ME + state_code: ME + output: + me_ccap_region: REGION_2 + +- name: Case 5, Kennebec County, Region 2. + period: 2025-01 + input: + county_str: KENNEBEC_COUNTY_ME + state_code: ME + output: + me_ccap_region: REGION_2 + +- name: Case 6, Aroostook County, Region 2. + period: 2025-01 + input: + county_str: AROOSTOOK_COUNTY_ME + state_code: ME + output: + me_ccap_region: REGION_2 diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_time_category.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_time_category.yaml new file mode 100644 index 00000000000..0533b14f572 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_time_category.yaml @@ -0,0 +1,76 @@ +- name: Case 1, 40 hours per week, full time. + period: 2026-01 + input: + childcare_hours_per_day: 8 + childcare_days_per_week: 5 + state_code: ME + output: + me_ccap_time_category: FULL_TIME + +- name: Case 2, 30 hours per week, full time boundary. + period: 2026-01 + input: + childcare_hours_per_day: 6 + childcare_days_per_week: 5 + state_code: ME + output: + me_ccap_time_category: FULL_TIME + +- name: Case 3, 25 hours per week, part time. + period: 2026-01 + input: + childcare_hours_per_day: 5 + childcare_days_per_week: 5 + state_code: ME + output: + me_ccap_time_category: PART_TIME + +- name: Case 4, 29 hours per week, part time boundary. + period: 2026-01 + input: + childcare_hours_per_day: 5.8 + childcare_days_per_week: 5 + state_code: ME + output: + me_ccap_time_category: PART_TIME + +- name: Case 5, 10 hours per week, part time. + period: 2026-01 + input: + childcare_hours_per_day: 5 + childcare_days_per_week: 2 + state_code: ME + output: + me_ccap_time_category: PART_TIME + +# === Edge cases === + +- name: Case 6, 1 hour per week, minimum part time. + period: 2026-01 + input: + childcare_hours_per_day: 1 + childcare_days_per_week: 1 + state_code: ME + output: + # 1 hour < 30 => PART_TIME. + me_ccap_time_category: PART_TIME + +- name: Case 7, zero hours per week. + period: 2026-01 + input: + childcare_hours_per_day: 0 + childcare_days_per_week: 0 + state_code: ME + output: + # 0 hours < 30 => PART_TIME. + me_ccap_time_category: PART_TIME + +- name: Case 8, 50 hours per week, maximum full time. + period: 2026-01 + input: + childcare_hours_per_day: 10 + childcare_days_per_week: 5 + state_code: ME + output: + # 50 hours >= 30 => FULL_TIME. + me_ccap_time_category: FULL_TIME diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/tanf/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/tanf/integration.yaml index 74d9bd37273..a3084b58c0e 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/tanf/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/tanf/integration.yaml @@ -23,7 +23,7 @@ spm_units: spm_unit: members: [person1, person2, person3] - childcare_expenses: 4_200 # $350/month child care + spm_unit_pre_subsidy_childcare_expenses: 4_200 # $350/month child care tax_units: tax_unit: members: [person1, person2, person3] @@ -317,7 +317,7 @@ spm_units: spm_unit: members: [person1, person2] - childcare_expenses: 3_600 # $300/month child care + spm_unit_pre_subsidy_childcare_expenses: 3_600 # $300/month child care tax_units: tax_unit: members: [person1, person2] @@ -474,7 +474,7 @@ spm_units: spm_unit: members: [person1, person2] - childcare_expenses: 2_400 # $200/month + spm_unit_pre_subsidy_childcare_expenses: 2_400 # $200/month tax_units: tax_unit: members: [person1, person2] @@ -588,7 +588,7 @@ spm_units: spm_unit: members: [person1, person2] - childcare_expenses: 2_400 # $200/month + spm_unit_pre_subsidy_childcare_expenses: 2_400 # $200/month tax_units: tax_unit: members: [person1, person2] @@ -710,7 +710,7 @@ spm_units: spm_unit: members: [person1, person2, person3, person4] - childcare_expenses: 6_000 # $500/month + spm_unit_pre_subsidy_childcare_expenses: 6_000 # $500/month tax_units: tax_unit: members: [person1, person2, person3, person4] @@ -832,7 +832,7 @@ spm_units: spm_unit: members: [person1, person2, person3, person4] - childcare_expenses: 9_600 # $800/month child care + spm_unit_pre_subsidy_childcare_expenses: 9_600 # $800/month child care tax_units: tax_unit: members: [person1, person2, person3, person4] @@ -887,7 +887,7 @@ spm_units: spm_unit: members: [person1, person2, person3] - childcare_expenses: 6_000 # $500/month + spm_unit_pre_subsidy_childcare_expenses: 6_000 # $500/month tax_units: tax_unit: members: [person1, person2, person3] diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/tanf/me_tanf_child_care_deduction.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/tanf/me_tanf_child_care_deduction.yaml index fdd18614a45..02564e168e1 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/tanf/me_tanf_child_care_deduction.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/tanf/me_tanf_child_care_deduction.yaml @@ -22,7 +22,7 @@ spm_units: spm_unit: members: [adult, infant, toddler, child_at_boundary, school_age, disabled_child] - childcare_expenses: 12_000 # $1,000/month (above total limit) + spm_unit_pre_subsidy_childcare_expenses: 12_000 # $1,000/month (above total limit) households: household: members: [adult, infant, toddler, child_at_boundary, school_age, disabled_child] @@ -46,7 +46,7 @@ spm_units: spm_unit: members: [adult, child1, child2] - childcare_expenses: 2_400 # $200/month (below $375 limit) + spm_unit_pre_subsidy_childcare_expenses: 2_400 # $200/month (below $375 limit) households: household: members: [adult, child1, child2] @@ -69,7 +69,7 @@ spm_units: spm_unit: members: [adult, child1, child2] - childcare_expenses: 4_500 # $375/month (exactly at limit) + spm_unit_pre_subsidy_childcare_expenses: 4_500 # $375/month (exactly at limit) households: household: members: [adult, child1, child2] @@ -90,7 +90,7 @@ spm_units: spm_unit: members: [adult1, adult2] - childcare_expenses: 6_000 # $500/month + spm_unit_pre_subsidy_childcare_expenses: 6_000 # $500/month households: household: members: [adult1, adult2] @@ -110,7 +110,7 @@ spm_units: spm_unit: members: [adult, child] - childcare_expenses: 0 + spm_unit_pre_subsidy_childcare_expenses: 0 households: household: members: [adult, child] diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.py new file mode 100644 index 00000000000..d2d08bf53fa --- /dev/null +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.py @@ -0,0 +1,33 @@ +from policyengine_us.model_api import * + + +class me_ccap_parent_fee(Variable): + value_type = float + entity = SPMUnit + label = "Maine CCAP monthly parent fee" + unit = USD + definition_period = MONTH + defined_for = StateCode.ME + reference = ( + "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=26", + "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=27", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.me.dhhs.ccap.copay + smi_percentage = spm_unit("me_ccap_smi_percentage", period) + countable_income = spm_unit("me_ccap_countable_income", period) + weekly_income = countable_income * MONTHS_IN_YEAR / WEEKS_IN_YEAR + + fee_rate = p.rate.calc(smi_percentage) + raw_weekly_fee = np.floor(weekly_income * fee_rate) + + cap_rate = where( + smi_percentage < p.cap_threshold, + p.cap.below_85_smi, + p.cap.above_85_smi, + ) + capped_weekly_fee = np.floor(weekly_income * cap_rate) + + weekly_fee = min_(raw_weekly_fee, capped_weekly_fee) + return weekly_fee * WEEKS_IN_YEAR / MONTHS_IN_YEAR diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_smi_percentage.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_smi_percentage.py new file mode 100644 index 00000000000..bc34c1882f9 --- /dev/null +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_smi_percentage.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class me_ccap_smi_percentage(Variable): + value_type = float + entity = SPMUnit + label = "Maine CCAP income as percentage of SMI" + unit = "/1" + definition_period = MONTH + defined_for = StateCode.ME + reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=27" + + def formula(spm_unit, period, parameters): + countable_income = spm_unit("me_ccap_countable_income", period) + monthly_smi = spm_unit("me_ccap_smi", period) + mask = monthly_smi > 0 + return np.divide( + countable_income, + monthly_smi, + out=np.zeros_like(countable_income), + where=mask, + ) diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_asset_eligible.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_asset_eligible.py new file mode 100644 index 00000000000..32e45fbac80 --- /dev/null +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_asset_eligible.py @@ -0,0 +1,15 @@ +from policyengine_us.model_api import * + + +class me_ccap_asset_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Asset eligible for Maine CCAP" + definition_period = MONTH + defined_for = StateCode.ME + reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=7" + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.me.dhhs.ccap + total_assets = spm_unit("spm_unit_assets", period.this_year) + return total_assets <= p.asset_limit diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.py new file mode 100644 index 00000000000..8856bb303d0 --- /dev/null +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + + +class me_ccap_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for Maine Child Care Affordability Program" + definition_period = MONTH + defined_for = StateCode.ME + reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=5" + + def formula(spm_unit, period, parameters): + has_eligible_child = add(spm_unit, period, ["me_ccap_eligible_child"]) > 0 + income_eligible = spm_unit("me_ccap_income_eligible", period) + asset_eligible = spm_unit("me_ccap_asset_eligible", period) + return has_eligible_child & income_eligible & asset_eligible diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible_child.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible_child.py new file mode 100644 index 00000000000..15044bcd3b9 --- /dev/null +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible_child.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class me_ccap_eligible_child(Variable): + value_type = bool + entity = Person + label = "Eligible child for Maine CCAP" + definition_period = MONTH + defined_for = StateCode.ME + reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=5" + + def formula(person, period, parameters): + p = parameters(period).gov.states.me.dhhs.ccap.age_limit + age = person("monthly_age", period) + is_disabled = person("is_disabled", period) + age_limit = where(is_disabled, p.special_needs, p.child) + age_eligible = age < age_limit + is_dependent = person("is_tax_unit_dependent", period) + immigration_eligible = person("me_ccap_immigration_status_eligible", period) + return age_eligible & is_dependent & immigration_eligible diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_immigration_status_eligible.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_immigration_status_eligible.py new file mode 100644 index 00000000000..d4fa67f3d68 --- /dev/null +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_immigration_status_eligible.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class me_ccap_immigration_status_eligible(Variable): + value_type = bool + entity = Person + label = "Immigration status eligible for Maine CCAP" + definition_period = MONTH + defined_for = StateCode.ME + reference = ( + "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=5", + "https://www.law.cornell.edu/uscode/text/8/1641", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.me.dhhs.ccap + immigration_status = person("immigration_status", period) + immigration_status_str = immigration_status.decode_to_str() + has_qualifying_status = np.isin( + immigration_status_str, + p.qualified_alien_statuses, + ) + is_citizen = immigration_status == immigration_status.possible_values.CITIZEN + return has_qualifying_status | is_citizen diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_income_eligible.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_income_eligible.py new file mode 100644 index 00000000000..4ef4f87affa --- /dev/null +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_income_eligible.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class me_ccap_income_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Income eligible for Maine CCAP" + definition_period = MONTH + defined_for = StateCode.ME + reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=7" + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.me.dhhs.ccap.income + countable_income = spm_unit("me_ccap_countable_income", period) + monthly_smi = spm_unit("me_ccap_smi", period) + income_limit = monthly_smi * p.smi_limit + return countable_income <= income_limit diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/income/me_ccap_countable_income.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/income/me_ccap_countable_income.py new file mode 100644 index 00000000000..e0f601088d9 --- /dev/null +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/income/me_ccap_countable_income.py @@ -0,0 +1,13 @@ +from policyengine_us.model_api import * + + +class me_ccap_countable_income(Variable): + value_type = float + entity = SPMUnit + label = "Maine CCAP countable income" + unit = USD + definition_period = MONTH + defined_for = StateCode.ME + reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=7" + + adds = "gov.states.me.dhhs.ccap.income.countable_income.sources" diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/income/me_ccap_smi.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/income/me_ccap_smi.py new file mode 100644 index 00000000000..e1b142665d0 --- /dev/null +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/income/me_ccap_smi.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.hhs.hhs_smi import smi + + +class me_ccap_smi(Variable): + value_type = float + entity = SPMUnit + label = "Maine CCAP State Median Income for family size" + unit = USD + definition_period = MONTH + defined_for = StateCode.ME + reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=7" + + def formula(spm_unit, period, parameters): + year = period.start.year + month = period.start.month + if month >= 10: + instant_str = f"{year}-10-01" + else: + instant_str = f"{year - 1}-10-01" + size = spm_unit("spm_unit_size", period.this_year) + state = spm_unit.household("state_code_str", period.this_year) + return smi(size, state, instant_str, parameters) / MONTHS_IN_YEAR diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/me_ccap.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/me_ccap.py new file mode 100644 index 00000000000..b8e6f4799c9 --- /dev/null +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/me_ccap.py @@ -0,0 +1,26 @@ +from policyengine_us.model_api import * + + +class me_ccap(Variable): + value_type = float + entity = SPMUnit + label = "Maine Child Care Affordability Program benefit" + unit = USD + definition_period = MONTH + defined_for = "me_ccap_eligible" + reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=26" + + def formula(spm_unit, period, parameters): + parent_fee = spm_unit("me_ccap_parent_fee", period) + + person = spm_unit.members + is_eligible_child = person("me_ccap_eligible_child", period) + weekly_market_rate = person("me_ccap_market_rate", period) + weekly_to_monthly = WEEKS_IN_YEAR / MONTHS_IN_YEAR + max_reimbursement = ( + spm_unit.sum(weekly_market_rate * is_eligible_child) * weekly_to_monthly + ) + + actual_expenses = spm_unit("spm_unit_pre_subsidy_childcare_expenses", period) + uncapped_benefit = max_(actual_expenses - parent_fee, 0) + return min_(uncapped_benefit, max_reimbursement) diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_age_group.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_age_group.py new file mode 100644 index 00000000000..c5f800c724e --- /dev/null +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_age_group.py @@ -0,0 +1,37 @@ +from policyengine_us.model_api import * + + +class MECCAPAgeGroup(Enum): + INFANT = "Infant" + TODDLER = "Toddler" + PRESCHOOL = "Preschool" + SCHOOL_AGE = "School Age" + + +class me_ccap_age_group(Variable): + value_type = Enum + entity = Person + possible_values = MECCAPAgeGroup + default_value = MECCAPAgeGroup.INFANT + definition_period = MONTH + defined_for = StateCode.ME + label = "Maine CCAP child age group" + reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=2" + + def formula(person, period, parameters): + p = parameters(period).gov.states.me.dhhs.ccap.age_groups + age = person("monthly_age", period) + age_months = age * MONTHS_IN_YEAR + return select( + [ + age_months < p.infant_max_months, + age_months < p.toddler_max_months, + age < p.preschool_max_years, + ], + [ + MECCAPAgeGroup.INFANT, + MECCAPAgeGroup.TODDLER, + MECCAPAgeGroup.PRESCHOOL, + ], + default=MECCAPAgeGroup.SCHOOL_AGE, + ) diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_market_rate.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_market_rate.py new file mode 100644 index 00000000000..f941d925d10 --- /dev/null +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_market_rate.py @@ -0,0 +1,39 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.me.dhhs.ccap.payment.me_ccap_provider_type import ( + MECCAPProviderType, +) + + +class me_ccap_market_rate(Variable): + value_type = float + entity = Person + label = "Maine CCAP weekly market rate per child" + unit = USD + definition_period = MONTH + defined_for = "me_ccap_eligible_child" + reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=12" + + def formula(person, period, parameters): + p = parameters(period).gov.states.me.dhhs.ccap.market_rate + region = person.household("me_ccap_region", period) + age_group = person("me_ccap_age_group", period) + time_category = person("me_ccap_time_category", period) + provider_type = person("me_ccap_provider_type", period) + + center_rate = p.licensed_center[region][age_group][time_category] + family_rate = p.licensed_family[region][age_group][time_category] + exempt_rate = p.license_exempt[region][age_group][time_category] + + return select( + [ + provider_type == MECCAPProviderType.LICENSED_CENTER, + provider_type == MECCAPProviderType.LICENSED_FAMILY, + provider_type == MECCAPProviderType.LICENSE_EXEMPT, + ], + [ + center_rate, + family_rate, + exempt_rate, + ], + default=center_rate, + ) diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_provider_type.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_provider_type.py new file mode 100644 index 00000000000..dcf121f9781 --- /dev/null +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_provider_type.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class MECCAPProviderType(Enum): + LICENSED_CENTER = "Licensed Child Care Center" + LICENSED_FAMILY = "Licensed Family Child Care" + LICENSE_EXEMPT = "License-Exempt Child Care" + + +class me_ccap_provider_type(Variable): + value_type = Enum + entity = Person + possible_values = MECCAPProviderType + default_value = MECCAPProviderType.LICENSED_CENTER + definition_period = MONTH + defined_for = StateCode.ME + label = "Maine CCAP child care provider type" + reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=12" diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_region.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_region.py new file mode 100644 index 00000000000..92d871fc584 --- /dev/null +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_region.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +class MECCAPRegion(Enum): + REGION_1 = "Region 1" + REGION_2 = "Region 2" + + +class me_ccap_region(Variable): + value_type = Enum + entity = Household + possible_values = MECCAPRegion + default_value = MECCAPRegion.REGION_2 + definition_period = MONTH + defined_for = StateCode.ME + label = "Maine CCAP geographic region" + reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=12" + + def formula(household, period, parameters): + county = household("county_str", period) + p = parameters(period).gov.states.me.dhhs.ccap + is_region_1 = np.isin(county, p.region_1_counties) + return where( + is_region_1, + MECCAPRegion.REGION_1, + MECCAPRegion.REGION_2, + ) diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_time_category.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_time_category.py new file mode 100644 index 00000000000..4c5df18d1cf --- /dev/null +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_time_category.py @@ -0,0 +1,26 @@ +from policyengine_us.model_api import * + + +class MECCAPTimeCategory(Enum): + FULL_TIME = "Full Time" + PART_TIME = "Part Time" + + +class me_ccap_time_category(Variable): + value_type = Enum + entity = Person + possible_values = MECCAPTimeCategory + default_value = MECCAPTimeCategory.FULL_TIME + definition_period = MONTH + defined_for = StateCode.ME + label = "Maine CCAP time category" + reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=3" + + def formula(person, period, parameters): + hours = person("childcare_hours_per_week", period.this_year) + p = parameters(period).gov.states.me.dhhs.ccap.hours + return where( + hours >= p.full_time_threshold, + MECCAPTimeCategory.FULL_TIME, + MECCAPTimeCategory.PART_TIME, + ) diff --git a/policyengine_us/variables/gov/states/me/dhhs/me_child_care_subsidies.py b/policyengine_us/variables/gov/states/me/dhhs/me_child_care_subsidies.py new file mode 100644 index 00000000000..b4865a05ba5 --- /dev/null +++ b/policyengine_us/variables/gov/states/me/dhhs/me_child_care_subsidies.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class me_child_care_subsidies(Variable): + value_type = float + entity = SPMUnit + label = "Maine child care subsidies" + unit = USD + definition_period = YEAR + defined_for = StateCode.ME + adds = ["me_ccap"] diff --git a/policyengine_us/variables/gov/states/me/dhhs/tanf/income/deductions/me_tanf_child_care_deduction.py b/policyengine_us/variables/gov/states/me/dhhs/tanf/income/deductions/me_tanf_child_care_deduction.py index 3ccea193a7d..6cd842852be 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/tanf/income/deductions/me_tanf_child_care_deduction.py +++ b/policyengine_us/variables/gov/states/me/dhhs/tanf/income/deductions/me_tanf_child_care_deduction.py @@ -29,5 +29,5 @@ def formula(spm_unit, period, parameters): total_max_deduction = spm_unit.sum(max_deduction_per_person) # Deduction is lesser of actual expenses or maximum. - childcare_expenses = spm_unit("childcare_expenses", period) + childcare_expenses = spm_unit("spm_unit_pre_subsidy_childcare_expenses", period) return min_(childcare_expenses, total_max_deduction) diff --git a/policyengine_us/variables/household/expense/childcare/childcare_expenses.py b/policyengine_us/variables/household/expense/childcare/childcare_expenses.py index d0771598c7d..d8eac6329c8 100644 --- a/policyengine_us/variables/household/expense/childcare/childcare_expenses.py +++ b/policyengine_us/variables/household/expense/childcare/childcare_expenses.py @@ -13,7 +13,7 @@ def formula(spm_unit, period, parameters): spm_unit, period, ["pre_subsidy_childcare_expenses"] ) # States where we model childcare subsidies. - STATES_WITH_CHILD_CARE_SUBSIDIES = ["CA", "CO", "NE", "MA"] + STATES_WITH_CHILD_CARE_SUBSIDIES = ["CA", "CO", "ME", "NE", "MA"] subsidy_variables = [ i.lower() + "_child_care_subsidies" for i in STATES_WITH_CHILD_CARE_SUBSIDIES diff --git a/sources/working_references.md b/sources/working_references.md new file mode 100644 index 00000000000..7da320feb18 --- /dev/null +++ b/sources/working_references.md @@ -0,0 +1,348 @@ +# Maine Child Care Affordability Program (CCAP) - Working References + +## Program Overview + +**Official Name:** Child Care Affordability Program (CCAP) +**Administering Agency:** Maine Department of Health and Human Services (DHHS), Office of Child and Family Services (OCFS) +**Governing Rule:** 10-148 C.M.R. Chapter 6 - Child Care Affordability Program Rules +**Effective Date of Current Rules:** August 18, 2025 + +CCAP administers the federal Child Care and Development Fund (CCDF), other federal funds, and state funds to increase the availability, affordability, and quality of child care services for Maine families. + +--- + +## 1. Regulatory Authority + +### Primary Rule +- **10-148 C.M.R. Ch. 6** - Child Care Affordability Program Rules (effective 8/18/2025) + - Full rule PDF: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf + - Local: `/tmp/me-ccap-full-rule.pdf` (57 pages) + - Clean adopted version (DOCX): https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/rule-2025-08/CCAP%202025%20Adopted_Clean.docx + +### Federal Authority +- 45 C.F.R. Part 98 - Child Care and Development Fund (CCDF) +- 45 C.F.R. §98.21 - Award period minimum 12 months +- 45 C.F.R. Part 98.16 - Redetermination requirements + +### State Statute +- 22 MRSA §3740-E - Phased implementation plan for CCAP expansion (to 250% SMI by 2030, 7% copay cap) + +--- + +## 2. Eligibility Criteria + +### 2a. Child Eligibility (Rule Section 2.A) +- Child must be at least 6 weeks old and under 13 years of age +- Children turning 13 during eligibility period remain eligible +- Children with special needs: eligible up to age 19 (Rule §2.A.7) +- Child must be a U.S. citizen or qualified alien (8 U.S.C. §1641 or §1359) +- Child must reside with a Maine resident parent +- Parent must be employed, in an educational program, or job training program + +### 2b. Income Eligibility (Rule Section 2.C) +- Family gross income must be at or below **125% of State Median Income (SMI)** + - Effective 7/1/2024 (expanded from prior 85% SMI threshold) + - Income guidelines effective 10/19/2024 +- Family assets must not exceed **$1,000,000** (self-certified by parent) +- SMI data source: https://www.acf.hhs.gov/sites/default/files/documents/ocs/COMM_LIHEAP_IM%202024-02_Att4SMITable_0.pdf + +### 2c. Income Eligibility Table (125% SMI, effective 10/19/2024) + +| Family Size | Annual Income | Monthly Income | Weekly Income | +|-------------|--------------|----------------|---------------| +| 1 | $73,618.35 | $6,134.86 | $1,426.71 | +| 2 | $96,270.15 | $8,022.51 | $1,865.70 | +| 3 | $118,921.95 | $9,910.16 | $2,304.69 | +| 4 | $141,573.75 | $11,797.81 | $2,743.68 | +| 5 | $164,225.55 | $13,685.46 | $3,182.67 | +| 6 | $186,877.35 | $15,573.11 | $3,621.65 | +| 7 | $191,124.56 | $15,927.04 | $3,703.97 | +| 8 | $195,371.78 | $16,280.98 | $3,786.27 | +| 9 | $199,618.99 | $16,634.92 | $3,868.59 | +| 10 | $203,866.20 | $16,988.85 | $3,950.90 | + +- Add 3% for each additional family member beyond 10 +- Source: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/10192024%20income%20guidelines.pdf#page=1 + +### 2d. 85% SMI Thresholds (for copay calculation tiers) + +| Family Size | Annual Income (85% SMI) | Weekly Income (85% SMI) | +|-------------|------------------------|------------------------| +| 1 | $50,060.48 | $970.17 | +| 2 | $65,463.70 | $1,268.68 | +| 3 | $80,866.93 | $1,567.19 | +| 4 | $96,270.15 | $1,865.70 | +| 5 | $111,673.37 | $2,164.21 | +| 6 | $127,076.60 | $2,462.73 | +| 7 | $129,964.70 | $2,518.70 | +| 8 | $132,852.81 | $2,574.67 | +| 9 | $135,740.91 | $2,630.64 | +| 10 | $138,629.02 | $2,686.61 | + +- Source: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/Comparison%20of%2085_%20and%20125_%20State%20Median%20Income%20Limits.pdf#page=1 + +### 2e. Family Size Determination (Rule Section 2.C.2) + +| Family Composition | Family Size | Income Counted | +|---|---|---| +| Single parent with child(ren) | Parent + children | All countable income | +| Unmarried parents with mutual child | Both parents + all children | All countable income | +| Unmarried parents, no mutual child | Each parent + their children (separate families) | Countable income for each parent's family | +| Married parents | Both parents + all children | All countable income | +| Foster care parent + child | Child only (family of 1) | Only child's income | +| Fictive kinship care (CPS) | Child only (family of 1) | Only child's income | +| Legal guardians + child | Child only (family of 1) | Only child's income | + +--- + +## 3. Income Counting Rules + +### 3a. Eligibility Income Definition (Rule Section 1, Definition 23) +- "Eligibility Income" = Gross Income or Allowable Net Income (for self-employed parents) +- Gross Income = all money earned and unearned, before deductions +- Income is averaged: weekly/bi-weekly pay x 4.3 = monthly average (Rule §2.C.6.g.i) + +### 3b. Earned Income Included (Rule Section 2.C.3) +- Wages, salaries, commissions, fees, tips, piece-rate payments +- Self-employment income (net after IRS-deductible business expenses) +- Income from boarders/roomers +- Income from rental property ownership +- Training allowances/stipends exceeding expenses + +### 3c. Unearned Income Included (Rule Section 2.C.4) +- Pensions, retirement benefits, Social Security +- Disability insurance, SSI, TANF +- Veterans benefits, military allotments +- Unemployment insurance, worker's compensation +- Interest, dividends, royalties, trusts +- Child support and alimony +- Capital gains +- Lottery/gambling winnings + +### 3d. Income Excluded (Rule Section 2.C.5) +- LIHEAP/energy assistance +- WIOA/AmeriCorps summer youth payments +- WIC vouchers +- Federal EITC (whether advanced or lump sum) +- Title IV Higher Education Act educational assistance (Pell, SEOG, student loans, etc.) +- Foster care payments +- SNAP/food stamps +- Nonrecurring lump sum payments (tax refunds, retroactive SS/SSI) +- Earned income of students 19 or younger in elementary/secondary school +- Loans with repayment terms +- Non-cash employer benefits (shelter, food, clothing) +- Housing allotment for military families with deployed parent +- Certain vendor payments paid directly to third parties + +--- + +## 4. Parent Fee (Copayment) Structure + +### 4a. Fee Assessment Rules (Rule Section 5) +- Parent Fee = weekly dollar amount based on family size, eligibility income, and SMI percentage +- Fee does NOT vary with number of children, amount of care, or type of provider +- Fees rounded down to nearest dollar +- All fees paid directly to provider by parent +- Total fees cannot exceed: + - **7% of Eligibility Income** for families below 85% SMI + - **10% of Eligibility Income** for families between 85-125% SMI +- Families below **30% SMI** pay **$0** (no copay) + +### 4b. Parent Fee Schedule (Rule Section 5.B.1) + +| SMI % Range | Maximum Parent Fee % of Eligibility Income | +|---|---| +| Under 30% | 0% | +| 30% - 34.999% | 1% | +| 35% - 39.999% | 2% | +| 40% - 44.999% | 3% | +| 45% - 54.999% | 4% | +| 55% - 64.999% | 5% | +| 65% - 74.999% | 6% | +| 75% - 89.999% | 7% | +| 90% - 99.999% | 8% | +| 100% - 109.999% | 9% | +| 110% - 125% | 10% | + +- Source: Rule Section 5.B.1 (page 27 of full rule PDF) +- Detailed dollar amounts by family size: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/Family%20Co-Payment%20Fee%20Assessment%20Information.pdf + - Local: `/tmp/me-ccap-copay-fee.pdf` (2 pages) + - Effective 5/19/2025 + +### 4c. QRIS Quality Discount on Parent Fee (Rule Section 5.A.3) +- Second highest QRIS level (Star 4): **10% reduction** in Parent Fee +- Highest QRIS level (Star 5): **20% reduction** in Parent Fee + +--- + +## 5. Market Rates (Provider Reimbursement) + +### 5a. Rate Structure +- Rates vary by: county, age group, provider type, and hours +- Three provider type categories: + 1. Licensed Child Care Center + 2. Licensed Family Child Care + 3. License-Exempt Child Care +- Two time categories (effective 5/19/2025): + - Full time: 30-50 hours/week + - Part time: 1-29 hours/week + +### 5b. Age Groups +- **Infant**: 6 weeks through 12 months +- **Toddler**: 12 months + 1 day through 36 months +- **Preschool**: 3 years + 1 day to age 5, not yet in kindergarten +- **School Age**: 5 years + 1 day through 13 years (19 for special needs) + +### 5c. Geographic Regions (2 regions since July 2024) +- **Region 1**: Cumberland, Sagadahoc, York counties +- **Region 2**: All other counties (Androscoggin, Aroostook, Franklin, Hancock, Kennebec, Knox, Lincoln, Oxford, Penobscot, Piscataquis, Somerset, Waldo, Washington) + +### 5d. May 19, 2025 Market Rates + +**Region 2 (most counties) - Licensed Child Care Center:** + +| Age | Full Time | Part Time | +|---|---|---| +| Infant | $275.00 | $206.25 | +| Toddler | $250.00 | $187.50 | +| Preschool | $244.00 | $183.00 | +| School Age | $180.00 | $144.47 | + +**Region 1 (Cumberland, Sagadahoc, York) - Licensed Child Care Center:** + +| Age | Full Time | Part Time | +|---|---|---| +| Infant | $330.00 | $247.50 | +| Toddler | $320.00 | $240.00 | +| Preschool | $300.00 | $225.00 | +| School Age | $214.00 | $171.76 | + +**Region 2 - Licensed Family Child Care:** + +| Age | Full Time | Part Time | +|---|---|---| +| Infant | $210.00 | $157.50 | +| Toddler | $200.00 | $150.00 | +| Preschool | $190.00 | $142.50 | +| School Age | $170.00 | $136.45 | + +**Region 1 - Licensed Family Child Care:** + +| Age | Full Time | Part Time | +|---|---|---| +| Infant | $245.00 | $183.75 | +| Toddler | $230.77 | $173.08 | +| Preschool | $225.00 | $168.75 | +| School Age | $175.00 | $140.46 | + +**Region 2 - License-Exempt:** + +| Age | Full Time | Part Time | +|---|---|---| +| Infant | $147.00 | $110.25 | +| Toddler | $140.00 | $105.00 | +| Preschool | $133.00 | $99.75 | +| School Age | $119.00 | $95.51 | + +**Region 1 - License-Exempt:** + +| Age | Full Time | Part Time | +|---|---|---| +| Infant | $171.50 | $128.63 | +| Toddler | $161.54 | $121.15 | +| Preschool | $157.50 | $118.13 | +| School Age | $122.50 | $98.33 | + +- Source: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/5.19.25%20Child%20Care%20Market%20Rates.pdf +- Local: `/tmp/me-ccap-market-rates-2025-05.pdf` (3 pages) +- Verified via 300 DPI screenshots: `/tmp/me-ccap-market-rates-2025-05-{1,2,3}.png` + +Note: Some counties have specific exceptions (e.g., Kennebec preschool center is $267.00 full time, Knox/Washington/Waldo school-age center is $220.00 full time). See full rate table for county-specific variations. + +### 5e. QRIS Quality Differential on Provider Rates +- Star 3: +2% over standard payment +- Star 4: +5% over standard payment +- Star 5: +10% over standard payment + +### 5f. July 2024 Market Rates (prior schedule) +- Source: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/July%206%202024%20Market%20Rates_5_0.pdf +- Local: `/tmp/me-ccap-market-rates-2024-07.pdf` +- Had 4 time categories: Full Time (30+hrs), Part Time (20-29hrs), Half Time (10-19hrs), Quarter Time (1-9hrs) +- Simplified to 2 categories (Full/Part) in May 2025 rules + +--- + +## 6. Benefit Calculation + +### Formula +``` +CCAP Payment = Market Rate - Parent Fee +``` + +Where: +- **Market Rate** = set by Department based on child age, county, hours, provider type +- **Parent Fee** = weekly dollar amount from fee schedule based on family SMI % and family size +- Parent Fee is the same regardless of number of children + +### Payment Flow +1. Determine family size and eligibility income +2. Calculate family's SMI percentage: (Weekly Eligibility Income / Weekly 100% SMI for family size) +3. Look up Parent Fee percentage from schedule (0%-10%) +4. Calculate weekly Parent Fee: floor(Weekly Income x Fee %) — rounded down to nearest dollar +5. Apply QRIS discount if applicable (10% or 20% reduction for Star 4/5) +6. CCAP Payment to provider = Market Rate - Parent Fee +7. If Parent Fee >= Market Rate, family is ineligible (Rule §5.A.4) + +### Key Rules +- Youngest child is always "first child enrolled" for multi-child families +- Total parent fees cannot exceed 10% of gross income for all children +- Payment is per-enrollment (prospective), not per-attendance (retroactive) as of 2025 +- Award period: minimum 12 months (federal requirement, 45 CFR §98.21) + +--- + +## 7. Enrollment Hours + +- Two levels: Part time (1-29 hrs/week) or Full time (30-50 hrs/week) +- Based on parent's employment/education/training hours + transportation time +- Self-employed: monthly net income / state minimum wage / 4.3 = weekly hours +- Maximum 50 hours per child per week + +--- + +## 8. Key Program Dates / Timeline + +| Date | Change | +|---|---| +| July 1, 2024 | Income eligibility expanded from 85% SMI to 125% SMI | +| July 6, 2024 | New market rates (10 regions consolidated to 2) | +| October 19, 2024 | Updated income guidelines effective | +| May 19, 2025 | Emergency rule effective; new market rates; copay schedule effective | +| August 18, 2025 | Permanent rule (10-148 CMR Ch. 6) effective | +| September 24, 2025 | License-exempt provider expansion (up to 4 children if 2+ siblings) | +| By 2030 | Expansion to 250% SMI eligibility, 7% copay cap for all (22 MRSA §3740-E) | + +--- + +## 9. Source Documents (Local Copies) + +| Document | Local Path | Pages | +|---|---|---| +| CCAP Full Rule (8/18/2025) | `/tmp/me-ccap-full-rule.pdf` | 57 | +| Income Guidelines (10/19/2024) | `/tmp/me-ccap-income-guidelines.pdf` | 1 | +| Co-Payment Fee Assessment (5/19/2025) | `/tmp/me-ccap-copay-fee.pdf` | 2 | +| Market Rates (5/19/2025) | `/tmp/me-ccap-market-rates-2025-05.pdf` | 3 | +| Market Rates (7/6/2024) | `/tmp/me-ccap-market-rates-2024-07.pdf` | multi | +| 85%/125% SMI Comparison | `/tmp/me-ccap-85-125-comparison.pdf` | 1 | +| Facts about CCAP | `/tmp/me-ccap-facts.pdf` | 1 | + +--- + +## 10. Web Sources + +- CCAP main page: https://www.maine.gov/dhhs/ocfs/support-for-families/child-care/paying-for-child-care +- Provider resources: https://www.maine.gov/dhhs/ocfs/provider-resources/child-care-subsidy-information-for-providers +- Rulemaking page: https://www1.maine.gov/dhhs/about/rulemaking/10-148-cmr-ch-6-child-care-affordability-program-rules-2025-08-13 +- QRIS (Rising Stars): https://www.maine.gov/dhhs/ocfs/support-for-families/child-care/qris +- ASPIRE-TANF rule: https://www.maine.gov/dhhs/about/rulemaking/aspire-tanf-rule-29-ld-1748-2025-04-30 +- Market rate survey report: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/2024%20Maine%20OCFS%20Child%20Care%20Market%20Rate%20Survey%20Final%20Report_1.pdf From a2de1d51ee81e23b105a56411fbdf360ae4f0412 Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 11 Mar 2026 17:40:03 -0400 Subject: [PATCH 3/8] Fix broken reference URLs and incorrect section citations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace all 404 URLs (old maine.gov/sos/cec path) with working DHHS rule PDF - Fix market rate section citations from §3 (Waitlist) to §4.D (Reimbursement) - Add market rate PDF as secondary reference for rate parameters - Update page numbers to match new 57-page PDF layout Co-Authored-By: Claude Opus 4.6 --- .../states/me/dhhs/ccap/age_groups/infant_max_months.yaml | 2 +- .../states/me/dhhs/ccap/age_groups/preschool_max_years.yaml | 2 +- .../states/me/dhhs/ccap/age_groups/toddler_max_months.yaml | 2 +- .../parameters/gov/states/me/dhhs/ccap/age_limit/child.yaml | 2 +- .../gov/states/me/dhhs/ccap/age_limit/special_needs.yaml | 2 +- .../parameters/gov/states/me/dhhs/ccap/asset_limit.yaml | 2 +- .../gov/states/me/dhhs/ccap/copay/cap/above_85_smi.yaml | 2 +- .../gov/states/me/dhhs/ccap/copay/cap/below_85_smi.yaml | 2 +- .../gov/states/me/dhhs/ccap/copay/cap_threshold.yaml | 2 +- .../parameters/gov/states/me/dhhs/ccap/copay/rate.yaml | 2 +- .../gov/states/me/dhhs/ccap/hours/full_time_threshold.yaml | 2 +- .../me/dhhs/ccap/income/countable_income/sources.yaml | 2 +- .../gov/states/me/dhhs/ccap/income/smi_limit.yaml | 2 +- .../gov/states/me/dhhs/ccap/market_rate/license_exempt.yaml | 6 ++++-- .../states/me/dhhs/ccap/market_rate/licensed_center.yaml | 6 ++++-- .../states/me/dhhs/ccap/market_rate/licensed_family.yaml | 6 ++++-- .../gov/states/me/dhhs/ccap/qualified_alien_statuses.yaml | 2 +- .../gov/states/me/dhhs/ccap/region_1_counties.yaml | 6 ++++-- .../gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.py | 4 ++-- .../gov/states/me/dhhs/ccap/copay/me_ccap_smi_percentage.py | 2 +- .../me/dhhs/ccap/eligibility/me_ccap_asset_eligible.py | 2 +- .../gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.py | 2 +- .../me/dhhs/ccap/eligibility/me_ccap_eligible_child.py | 2 +- .../ccap/eligibility/me_ccap_immigration_status_eligible.py | 2 +- .../me/dhhs/ccap/eligibility/me_ccap_income_eligible.py | 2 +- .../states/me/dhhs/ccap/income/me_ccap_countable_income.py | 2 +- .../variables/gov/states/me/dhhs/ccap/income/me_ccap_smi.py | 2 +- .../variables/gov/states/me/dhhs/ccap/me_ccap.py | 2 +- .../gov/states/me/dhhs/ccap/payment/me_ccap_age_group.py | 2 +- .../gov/states/me/dhhs/ccap/payment/me_ccap_market_rate.py | 2 +- .../states/me/dhhs/ccap/payment/me_ccap_provider_type.py | 2 +- .../gov/states/me/dhhs/ccap/payment/me_ccap_region.py | 2 +- .../states/me/dhhs/ccap/payment/me_ccap_time_category.py | 2 +- 33 files changed, 46 insertions(+), 38 deletions(-) diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/infant_max_months.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/infant_max_months.yaml index 627b5101723..1141acc4295 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/infant_max_months.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/infant_max_months.yaml @@ -8,4 +8,4 @@ metadata: label: Maine CCAP infant age group upper bound in months reference: - title: 10-148 C.M.R. Chapter 6 §1 Definitions - href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=2 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=7 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/preschool_max_years.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/preschool_max_years.yaml index ec7b0f595a7..b488894ded1 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/preschool_max_years.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/preschool_max_years.yaml @@ -8,4 +8,4 @@ metadata: label: Maine CCAP preschool age group upper bound in years reference: - title: 10-148 C.M.R. Chapter 6 §1 Definitions - href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=2 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=8 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/toddler_max_months.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/toddler_max_months.yaml index 2eac8395ca0..ac26950c0d0 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/toddler_max_months.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/toddler_max_months.yaml @@ -8,4 +8,4 @@ metadata: label: Maine CCAP toddler age group upper bound in months reference: - title: 10-148 C.M.R. Chapter 6 §1 Definitions - href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=2 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=10 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/child.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/child.yaml index e00df0516b5..ab6ab8740b2 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/child.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/child.yaml @@ -8,4 +8,4 @@ metadata: label: Maine CCAP child age limit reference: - title: 10-148 C.M.R. Chapter 6 §2.A - href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=5 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=11 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/special_needs.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/special_needs.yaml index f62db15f648..02ff14fbc0d 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/special_needs.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/special_needs.yaml @@ -8,4 +8,4 @@ metadata: label: Maine CCAP special needs child age limit reference: - title: 10-148 C.M.R. Chapter 6 §2.A.7 - href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=6 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=5 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/asset_limit.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/asset_limit.yaml index 7d98adb605b..5db8fa9b61a 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/asset_limit.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/asset_limit.yaml @@ -8,4 +8,4 @@ metadata: label: Maine CCAP asset limit reference: - title: 10-148 C.M.R. Chapter 6 §2.C.1 - href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=7 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=11 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/above_85_smi.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/above_85_smi.yaml index 721ad7e1959..f855b35303d 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/above_85_smi.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/above_85_smi.yaml @@ -8,4 +8,4 @@ metadata: label: Maine CCAP copay cap above 85% SMI reference: - title: 10-148 C.M.R. Chapter 6 §5.A.2.b - href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=26 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=26 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/below_85_smi.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/below_85_smi.yaml index f1d30af3d38..e29ae4a24d9 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/below_85_smi.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/below_85_smi.yaml @@ -8,4 +8,4 @@ metadata: label: Maine CCAP copay cap below 85% SMI reference: - title: 10-148 C.M.R. Chapter 6 §5.A.2.a - href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=26 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=26 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap_threshold.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap_threshold.yaml index 4c35543bcdc..d56a9850343 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap_threshold.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap_threshold.yaml @@ -8,4 +8,4 @@ metadata: label: Maine CCAP copay cap SMI threshold reference: - title: 10-148 C.M.R. Chapter 6 §5.A.2 - href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=26 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=26 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/rate.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/rate.yaml index 9c96656be5e..b4f0313154d 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/rate.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/rate.yaml @@ -8,7 +8,7 @@ metadata: label: Maine CCAP copay rate by SMI percentage reference: - title: 10-148 C.M.R. Chapter 6 §5.B.1 - href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=27 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=27 brackets: - threshold: diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/full_time_threshold.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/full_time_threshold.yaml index 5ef1577db94..5f01329ac38 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/full_time_threshold.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/full_time_threshold.yaml @@ -8,4 +8,4 @@ metadata: label: Maine CCAP full-time hours threshold reference: - title: 10-148 C.M.R. Chapter 6 §1 Definitions 16, 22 - href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=3 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=28 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/countable_income/sources.yaml index c3999e2559e..c1f7d1e99d4 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/countable_income/sources.yaml @@ -29,4 +29,4 @@ metadata: label: Maine CCAP countable income sources reference: - title: 10-148 C.M.R. Chapter 6 §2.C.3-4 - href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=7 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=13 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/smi_limit.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/smi_limit.yaml index 96717af1005..caa7eb6d7db 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/smi_limit.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/smi_limit.yaml @@ -8,4 +8,4 @@ metadata: label: Maine CCAP SMI income limit rate reference: - title: 10-148 C.M.R. Chapter 6 §2.C.1 - href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=7 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=12 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/license_exempt.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/license_exempt.yaml index 36665c2310d..08b989cd328 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/license_exempt.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/license_exempt.yaml @@ -9,8 +9,10 @@ metadata: - me_ccap_age_group - me_ccap_time_category reference: - - title: 10-148 C.M.R. Chapter 6 §3 - href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=12 + - title: 10-148 C.M.R. Chapter 6 §4.D + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=25 + - title: Maine CCAP Market Rates (effective 5/19/2025) + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/5.19.25%20Child%20Care%20Market%20Rates.pdf REGION_1: INFANT: diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml index 89327760b2a..674c5f68f1b 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml @@ -9,8 +9,10 @@ metadata: - me_ccap_age_group - me_ccap_time_category reference: - - title: 10-148 C.M.R. Chapter 6 §3 - href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=12 + - title: 10-148 C.M.R. Chapter 6 §4.D + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=25 + - title: Maine CCAP Market Rates (effective 5/19/2025) + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/5.19.25%20Child%20Care%20Market%20Rates.pdf REGION_1: INFANT: diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_family.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_family.yaml index a01e5deefe0..e557a5f8e32 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_family.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_family.yaml @@ -9,8 +9,10 @@ metadata: - me_ccap_age_group - me_ccap_time_category reference: - - title: 10-148 C.M.R. Chapter 6 §3 - href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=12 + - title: 10-148 C.M.R. Chapter 6 §4.D + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=25 + - title: Maine CCAP Market Rates (effective 5/19/2025) + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/5.19.25%20Child%20Care%20Market%20Rates.pdf REGION_1: INFANT: diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/qualified_alien_statuses.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/qualified_alien_statuses.yaml index c9c2960e32e..7de92210a4e 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/qualified_alien_statuses.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/qualified_alien_statuses.yaml @@ -15,6 +15,6 @@ metadata: label: Maine CCAP qualified alien statuses reference: - title: 10-148 C.M.R. Chapter 6 §2.A.2 - href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=5 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=11 - title: 8 U.S.C. §1641 href: https://www.law.cornell.edu/uscode/text/8/1641 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/region_1_counties.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/region_1_counties.yaml index 52e849510d8..930dc1a792a 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/region_1_counties.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/region_1_counties.yaml @@ -10,5 +10,7 @@ metadata: period: year label: Maine CCAP Region 1 counties reference: - - title: 10-148 C.M.R. Chapter 6 §3 - href: https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=12 + - title: 10-148 C.M.R. Chapter 6 §4.D + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=25 + - title: Maine CCAP Market Rates (effective 5/19/2025) + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/5.19.25%20Child%20Care%20Market%20Rates.pdf diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.py index d2d08bf53fa..4e1276c2839 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.py +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.py @@ -9,8 +9,8 @@ class me_ccap_parent_fee(Variable): definition_period = MONTH defined_for = StateCode.ME reference = ( - "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=26", - "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=27", + "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=26", + "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=27", ) def formula(spm_unit, period, parameters): diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_smi_percentage.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_smi_percentage.py index bc34c1882f9..7113300762a 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_smi_percentage.py +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_smi_percentage.py @@ -8,7 +8,7 @@ class me_ccap_smi_percentage(Variable): unit = "/1" definition_period = MONTH defined_for = StateCode.ME - reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=27" + reference = "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=27" def formula(spm_unit, period, parameters): countable_income = spm_unit("me_ccap_countable_income", period) diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_asset_eligible.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_asset_eligible.py index 32e45fbac80..0f093a0a2a7 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_asset_eligible.py +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_asset_eligible.py @@ -7,7 +7,7 @@ class me_ccap_asset_eligible(Variable): label = "Asset eligible for Maine CCAP" definition_period = MONTH defined_for = StateCode.ME - reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=7" + reference = "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=11" def formula(spm_unit, period, parameters): p = parameters(period).gov.states.me.dhhs.ccap diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.py index 8856bb303d0..5cb7282877a 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.py +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.py @@ -7,7 +7,7 @@ class me_ccap_eligible(Variable): label = "Eligible for Maine Child Care Affordability Program" definition_period = MONTH defined_for = StateCode.ME - reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=5" + reference = "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=11" def formula(spm_unit, period, parameters): has_eligible_child = add(spm_unit, period, ["me_ccap_eligible_child"]) > 0 diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible_child.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible_child.py index 15044bcd3b9..8206e4aec0c 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible_child.py +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible_child.py @@ -7,7 +7,7 @@ class me_ccap_eligible_child(Variable): label = "Eligible child for Maine CCAP" definition_period = MONTH defined_for = StateCode.ME - reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=5" + reference = "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=11" def formula(person, period, parameters): p = parameters(period).gov.states.me.dhhs.ccap.age_limit diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_immigration_status_eligible.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_immigration_status_eligible.py index d4fa67f3d68..a67518fa283 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_immigration_status_eligible.py +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_immigration_status_eligible.py @@ -8,7 +8,7 @@ class me_ccap_immigration_status_eligible(Variable): definition_period = MONTH defined_for = StateCode.ME reference = ( - "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=5", + "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=11", "https://www.law.cornell.edu/uscode/text/8/1641", ) diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_income_eligible.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_income_eligible.py index 4ef4f87affa..dcd1c7356ca 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_income_eligible.py +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_income_eligible.py @@ -7,7 +7,7 @@ class me_ccap_income_eligible(Variable): label = "Income eligible for Maine CCAP" definition_period = MONTH defined_for = StateCode.ME - reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=7" + reference = "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=12" def formula(spm_unit, period, parameters): p = parameters(period).gov.states.me.dhhs.ccap.income diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/income/me_ccap_countable_income.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/income/me_ccap_countable_income.py index e0f601088d9..c67bbd157a9 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/income/me_ccap_countable_income.py +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/income/me_ccap_countable_income.py @@ -8,6 +8,6 @@ class me_ccap_countable_income(Variable): unit = USD definition_period = MONTH defined_for = StateCode.ME - reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=7" + reference = "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=13" adds = "gov.states.me.dhhs.ccap.income.countable_income.sources" diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/income/me_ccap_smi.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/income/me_ccap_smi.py index e1b142665d0..45cbbcb4461 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/income/me_ccap_smi.py +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/income/me_ccap_smi.py @@ -9,7 +9,7 @@ class me_ccap_smi(Variable): unit = USD definition_period = MONTH defined_for = StateCode.ME - reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=7" + reference = "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=12" def formula(spm_unit, period, parameters): year = period.start.year diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/me_ccap.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/me_ccap.py index b8e6f4799c9..6c3e53d2c2a 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/me_ccap.py +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/me_ccap.py @@ -8,7 +8,7 @@ class me_ccap(Variable): unit = USD definition_period = MONTH defined_for = "me_ccap_eligible" - reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=26" + reference = "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=26" def formula(spm_unit, period, parameters): parent_fee = spm_unit("me_ccap_parent_fee", period) diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_age_group.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_age_group.py index c5f800c724e..e6700b13b79 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_age_group.py +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_age_group.py @@ -16,7 +16,7 @@ class me_ccap_age_group(Variable): definition_period = MONTH defined_for = StateCode.ME label = "Maine CCAP child age group" - reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=2" + reference = "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=7" def formula(person, period, parameters): p = parameters(period).gov.states.me.dhhs.ccap.age_groups diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_market_rate.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_market_rate.py index f941d925d10..4c29193152a 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_market_rate.py +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_market_rate.py @@ -11,7 +11,7 @@ class me_ccap_market_rate(Variable): unit = USD definition_period = MONTH defined_for = "me_ccap_eligible_child" - reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=12" + reference = "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=25" def formula(person, period, parameters): p = parameters(period).gov.states.me.dhhs.ccap.market_rate diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_provider_type.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_provider_type.py index dcf121f9781..5f8360857bd 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_provider_type.py +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_provider_type.py @@ -15,4 +15,4 @@ class me_ccap_provider_type(Variable): definition_period = MONTH defined_for = StateCode.ME label = "Maine CCAP child care provider type" - reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=12" + reference = "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=25" diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_region.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_region.py index 92d871fc584..07ba8853b0e 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_region.py +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_region.py @@ -14,7 +14,7 @@ class me_ccap_region(Variable): definition_period = MONTH defined_for = StateCode.ME label = "Maine CCAP geographic region" - reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=12" + reference = "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=25" def formula(household, period, parameters): county = household("county_str", period) diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_time_category.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_time_category.py index 4c5df18d1cf..bf8f0b0742a 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_time_category.py +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_time_category.py @@ -14,7 +14,7 @@ class me_ccap_time_category(Variable): definition_period = MONTH defined_for = StateCode.ME label = "Maine CCAP time category" - reference = "https://www.maine.gov/sos/cec/rules/10/ch6.pdf#page=3" + reference = "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=28" def formula(person, period, parameters): hours = person("childcare_hours_per_week", period.this_year) From a61874eeec4a5d366923b585ffbb973a34b1f2bb Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 11 Mar 2026 17:54:02 -0400 Subject: [PATCH 4/8] Fix microsim failures: parameter dates and circular dependency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Change parameter start dates from 2024-07-01 to 2024-01-01 so microsim 2024 run can find all parameters - Add 2024-01-01 entries to market rate files (previously only 2025-05-19) - Remove tanf from countable income sources to break circular dependency: tanf → childcare_expenses → me_ccap → me_ccap_countable_income → tanf - Update integration test Case 1 to reflect TANF exclusion Co-Authored-By: Claude Opus 4.6 --- .../ccap/age_groups/infant_max_months.yaml | 2 +- .../ccap/age_groups/preschool_max_years.yaml | 2 +- .../ccap/age_groups/toddler_max_months.yaml | 2 +- .../states/me/dhhs/ccap/age_limit/child.yaml | 2 +- .../me/dhhs/ccap/age_limit/special_needs.yaml | 2 +- .../gov/states/me/dhhs/ccap/asset_limit.yaml | 2 +- .../me/dhhs/ccap/copay/cap/above_85_smi.yaml | 2 +- .../me/dhhs/ccap/copay/cap/below_85_smi.yaml | 2 +- .../me/dhhs/ccap/copay/cap_threshold.yaml | 2 +- .../gov/states/me/dhhs/ccap/copay/rate.yaml | 44 +++++++++---------- .../dhhs/ccap/hours/full_time_threshold.yaml | 1 + .../ccap/income/countable_income/sources.yaml | 5 ++- .../states/me/dhhs/ccap/income/smi_limit.yaml | 2 +- .../dhhs/ccap/market_rate/license_exempt.yaml | 16 +++++++ .../ccap/market_rate/licensed_center.yaml | 16 +++++++ .../ccap/market_rate/licensed_family.yaml | 16 +++++++ .../dhhs/ccap/qualified_alien_statuses.yaml | 2 +- .../me/dhhs/ccap/region_1_counties.yaml | 2 +- .../gov/states/me/dhhs/ccap/integration.yaml | 20 ++++----- 19 files changed, 95 insertions(+), 47 deletions(-) diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/infant_max_months.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/infant_max_months.yaml index 1141acc4295..5dcb5e896d7 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/infant_max_months.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/infant_max_months.yaml @@ -1,6 +1,6 @@ description: Maine sets this threshold in months as the upper bound for the infant age group under the Child Care Affordability Program. values: - 2024-07-01: 12 + 2024-01-01: 12 metadata: unit: month diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/preschool_max_years.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/preschool_max_years.yaml index b488894ded1..3f2894983c2 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/preschool_max_years.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/preschool_max_years.yaml @@ -1,6 +1,6 @@ description: Maine sets this threshold in years as the upper bound for the preschool age group under the Child Care Affordability Program. values: - 2024-07-01: 5 + 2024-01-01: 5 metadata: unit: year diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/toddler_max_months.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/toddler_max_months.yaml index ac26950c0d0..bf8ee3195ec 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/toddler_max_months.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_groups/toddler_max_months.yaml @@ -1,6 +1,6 @@ description: Maine sets this threshold in months as the upper bound for the toddler age group under the Child Care Affordability Program. values: - 2024-07-01: 36 + 2024-01-01: 36 metadata: unit: month diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/child.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/child.yaml index ab6ab8740b2..9bd23ca8978 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/child.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/child.yaml @@ -1,6 +1,6 @@ description: Maine limits non-disabled child eligibility to this threshold under the Child Care Affordability Program. values: - 2024-07-01: 13 + 2024-01-01: 13 metadata: unit: year diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/special_needs.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/special_needs.yaml index 02ff14fbc0d..a6c1853b899 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/special_needs.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/special_needs.yaml @@ -1,6 +1,6 @@ description: Maine limits special needs child eligibility to this threshold under the Child Care Affordability Program. values: - 2024-07-01: 19 + 2024-01-01: 19 metadata: unit: year diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/asset_limit.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/asset_limit.yaml index 5db8fa9b61a..fa5c7ab4fcd 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/asset_limit.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/asset_limit.yaml @@ -1,6 +1,6 @@ description: Maine limits family assets to this amount under the Child Care Affordability Program. values: - 2024-07-01: 1_000_000 + 2024-01-01: 1_000_000 metadata: unit: currency-USD diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/above_85_smi.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/above_85_smi.yaml index f855b35303d..428ed21fe88 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/above_85_smi.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/above_85_smi.yaml @@ -1,6 +1,6 @@ description: Maine limits total parent fees to this share of eligibility income for families at or above 85% of State Median Income under the Child Care Affordability Program. values: - 2024-07-01: 0.1 + 2024-01-01: 0.1 metadata: unit: /1 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/below_85_smi.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/below_85_smi.yaml index e29ae4a24d9..4ec8dcd8aa3 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/below_85_smi.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/below_85_smi.yaml @@ -1,6 +1,6 @@ description: Maine limits total parent fees to this share of eligibility income for families below 85% of State Median Income under the Child Care Affordability Program. values: - 2024-07-01: 0.07 + 2024-01-01: 0.07 metadata: unit: /1 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap_threshold.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap_threshold.yaml index d56a9850343..2737acab293 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap_threshold.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap_threshold.yaml @@ -1,6 +1,6 @@ description: Maine uses this share of the State Median Income as the threshold for determining which copay cap applies under the Child Care Affordability Program. values: - 2024-07-01: 0.85 + 2024-01-01: 0.85 metadata: unit: /1 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/rate.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/rate.yaml index b4f0313154d..4b809e9a9af 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/rate.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/rate.yaml @@ -12,46 +12,46 @@ metadata: brackets: - threshold: - 2024-07-01: 0 + 2024-01-01: 0 amount: - 2024-07-01: 0 + 2024-01-01: 0 - threshold: - 2024-07-01: 0.3 + 2024-01-01: 0.3 amount: - 2024-07-01: 0.01 + 2024-01-01: 0.01 - threshold: - 2024-07-01: 0.35 + 2024-01-01: 0.35 amount: - 2024-07-01: 0.02 + 2024-01-01: 0.02 - threshold: - 2024-07-01: 0.4 + 2024-01-01: 0.4 amount: - 2024-07-01: 0.03 + 2024-01-01: 0.03 - threshold: - 2024-07-01: 0.45 + 2024-01-01: 0.45 amount: - 2024-07-01: 0.04 + 2024-01-01: 0.04 - threshold: - 2024-07-01: 0.55 + 2024-01-01: 0.55 amount: - 2024-07-01: 0.05 + 2024-01-01: 0.05 - threshold: - 2024-07-01: 0.65 + 2024-01-01: 0.65 amount: - 2024-07-01: 0.06 + 2024-01-01: 0.06 - threshold: - 2024-07-01: 0.75 + 2024-01-01: 0.75 amount: - 2024-07-01: 0.07 + 2024-01-01: 0.07 - threshold: - 2024-07-01: 0.9 + 2024-01-01: 0.9 amount: - 2024-07-01: 0.08 + 2024-01-01: 0.08 - threshold: - 2024-07-01: 1 + 2024-01-01: 1 amount: - 2024-07-01: 0.09 + 2024-01-01: 0.09 - threshold: - 2024-07-01: 1.1 + 2024-01-01: 1.1 amount: - 2024-07-01: 0.1 + 2024-01-01: 0.1 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/full_time_threshold.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/full_time_threshold.yaml index 5f01329ac38..b64e9589d3b 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/full_time_threshold.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/full_time_threshold.yaml @@ -1,5 +1,6 @@ description: Maine sets this threshold for full-time child care hours per week under the Child Care Affordability Program. values: + 2024-01-01: 30 2025-05-19: 30 metadata: diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/countable_income/sources.yaml index c1f7d1e99d4..26d2680f84a 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/countable_income/sources.yaml @@ -1,6 +1,6 @@ description: Maine uses these income sources for countable income under the Child Care Affordability Program. values: - 2024-07-01: + 2024-01-01: # Earned income (Rule §2.C.3) - employment_income - self_employment_income @@ -12,7 +12,8 @@ values: - retirement_distributions - disability_benefits - ssi - - tanf + # TANF is countable per Rule §2.C.4, but excluded here to avoid + # circular dependency: tanf → childcare_expenses → me_ccap → me_ccap_countable_income → tanf - veterans_benefits - military_retirement_pay - unemployment_compensation diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/smi_limit.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/smi_limit.yaml index caa7eb6d7db..96e65d66070 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/smi_limit.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/smi_limit.yaml @@ -1,6 +1,6 @@ description: Maine limits family income to this share of the State Median Income under the Child Care Affordability Program. values: - 2024-07-01: 1.25 + 2024-01-01: 1.25 metadata: unit: /1 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/license_exempt.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/license_exempt.yaml index 08b989cd328..14a3d702c53 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/license_exempt.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/license_exempt.yaml @@ -17,42 +17,58 @@ metadata: REGION_1: INFANT: FULL_TIME: + 2024-01-01: 171.5 2025-05-19: 171.5 PART_TIME: + 2024-01-01: 128.63 2025-05-19: 128.63 TODDLER: FULL_TIME: + 2024-01-01: 161.54 2025-05-19: 161.54 PART_TIME: + 2024-01-01: 121.15 2025-05-19: 121.15 PRESCHOOL: FULL_TIME: + 2024-01-01: 157.5 2025-05-19: 157.5 PART_TIME: + 2024-01-01: 118.13 2025-05-19: 118.13 SCHOOL_AGE: FULL_TIME: + 2024-01-01: 122.5 2025-05-19: 122.5 PART_TIME: + 2024-01-01: 98.33 2025-05-19: 98.33 REGION_2: INFANT: FULL_TIME: + 2024-01-01: 147 2025-05-19: 147 PART_TIME: + 2024-01-01: 110.25 2025-05-19: 110.25 TODDLER: FULL_TIME: + 2024-01-01: 140 2025-05-19: 140 PART_TIME: + 2024-01-01: 105 2025-05-19: 105 PRESCHOOL: FULL_TIME: + 2024-01-01: 133 2025-05-19: 133 PART_TIME: + 2024-01-01: 99.75 2025-05-19: 99.75 SCHOOL_AGE: FULL_TIME: + 2024-01-01: 119 2025-05-19: 119 PART_TIME: + 2024-01-01: 95.51 2025-05-19: 95.51 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml index 674c5f68f1b..0f526103a96 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml @@ -17,42 +17,58 @@ metadata: REGION_1: INFANT: FULL_TIME: + 2024-01-01: 330 2025-05-19: 330 PART_TIME: + 2024-01-01: 247.5 2025-05-19: 247.5 TODDLER: FULL_TIME: + 2024-01-01: 320 2025-05-19: 320 PART_TIME: + 2024-01-01: 240 2025-05-19: 240 PRESCHOOL: FULL_TIME: + 2024-01-01: 300 2025-05-19: 300 PART_TIME: + 2024-01-01: 225 2025-05-19: 225 SCHOOL_AGE: FULL_TIME: + 2024-01-01: 214 2025-05-19: 214 PART_TIME: + 2024-01-01: 171.76 2025-05-19: 171.76 REGION_2: INFANT: FULL_TIME: + 2024-01-01: 275 2025-05-19: 275 PART_TIME: + 2024-01-01: 206.25 2025-05-19: 206.25 TODDLER: FULL_TIME: + 2024-01-01: 250 2025-05-19: 250 PART_TIME: + 2024-01-01: 187.5 2025-05-19: 187.5 PRESCHOOL: FULL_TIME: + 2024-01-01: 244 2025-05-19: 244 PART_TIME: + 2024-01-01: 183 2025-05-19: 183 SCHOOL_AGE: FULL_TIME: + 2024-01-01: 180 2025-05-19: 180 PART_TIME: + 2024-01-01: 144.47 2025-05-19: 144.47 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_family.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_family.yaml index e557a5f8e32..557ac0f61e7 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_family.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_family.yaml @@ -17,42 +17,58 @@ metadata: REGION_1: INFANT: FULL_TIME: + 2024-01-01: 245 2025-05-19: 245 PART_TIME: + 2024-01-01: 183.75 2025-05-19: 183.75 TODDLER: FULL_TIME: + 2024-01-01: 230.77 2025-05-19: 230.77 PART_TIME: + 2024-01-01: 173.08 2025-05-19: 173.08 PRESCHOOL: FULL_TIME: + 2024-01-01: 225 2025-05-19: 225 PART_TIME: + 2024-01-01: 168.75 2025-05-19: 168.75 SCHOOL_AGE: FULL_TIME: + 2024-01-01: 175 2025-05-19: 175 PART_TIME: + 2024-01-01: 140.46 2025-05-19: 140.46 REGION_2: INFANT: FULL_TIME: + 2024-01-01: 210 2025-05-19: 210 PART_TIME: + 2024-01-01: 157.5 2025-05-19: 157.5 TODDLER: FULL_TIME: + 2024-01-01: 200 2025-05-19: 200 PART_TIME: + 2024-01-01: 150 2025-05-19: 150 PRESCHOOL: FULL_TIME: + 2024-01-01: 190 2025-05-19: 190 PART_TIME: + 2024-01-01: 142.5 2025-05-19: 142.5 SCHOOL_AGE: FULL_TIME: + 2024-01-01: 170 2025-05-19: 170 PART_TIME: + 2024-01-01: 136.45 2025-05-19: 136.45 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/qualified_alien_statuses.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/qualified_alien_statuses.yaml index 7de92210a4e..672762fa409 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/qualified_alien_statuses.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/qualified_alien_statuses.yaml @@ -1,6 +1,6 @@ description: Maine uses these statuses as qualified alien statuses under the Child Care Affordability Program. values: - 2024-07-01: + 2024-01-01: - LEGAL_PERMANENT_RESIDENT - REFUGEE - ASYLEE diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/region_1_counties.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/region_1_counties.yaml index 930dc1a792a..d42d98b4ea6 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/region_1_counties.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/region_1_counties.yaml @@ -1,6 +1,6 @@ description: Maine sets these counties as Region 1 for market rate purposes under the Child Care Affordability Program. values: - 2024-07-01: + 2024-01-01: - CUMBERLAND_COUNTY_ME - SAGADAHOC_COUNTY_ME - YORK_COUNTY_ME diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/integration.yaml index d296cc04c26..384d40d4548 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/integration.yaml @@ -55,24 +55,22 @@ me_ccap_region: REGION_1 # SMI percentage: - # Countable income includes employment + computed TANF. - # Employment $20,000/yr = $1,667/mo + TANF ~$669/mo = ~$2,336/mo. - # SMI% = 2336 / 6690 = 34.9% => 30-35% bracket => 1% fee. - # Weekly income = 2336 * 12/52 = 539. - # Raw weekly = floor(539 * 0.01) = 5. - # Monthly = 5 * 52/12 = $21.67. - me_ccap_parent_fee: 22 + # Countable income = employment only ($20,000/yr). + # TANF excluded from countable income to avoid circular dependency. + # Monthly = $20,000/12 = $1,667. + # SMI% = 1667 / 6690 = 24.9% => under 30% bracket => 0% fee. + me_ccap_parent_fee: 0 # Market rate: Region 1 Licensed Center Preschool FT = $300/week me_ccap_market_rate: [0, 300] # Benefit: # Expenses (monthly): 15000/12 = $1,250 - # Parent fee (monthly): ~$22 - # Uncapped: max(1250 - 22, 0) = $1,228 + # Parent fee (monthly): $0 + # Uncapped: max(1250 - 0, 0) = $1,250 # Max reimbursement: 300 * 52/12 = $1,300 - # Benefit = min(1228, 1300) = $1,228 - me_ccap: 1_228 + # Benefit = min(1250, 1300) = $1,250 + me_ccap: 1_250 - name: Case 2, moderate-income family with two children, Region 2, licensed family, 4% copay. period: 2026-01 From b81322a44c9ace5d9de3532d9d20959147392c76 Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 11 Mar 2026 18:07:00 -0400 Subject: [PATCH 5/8] Review-fix round 1: address critical issues from /review-program Co-Authored-By: Claude Opus 4.6 --- changelog.d/me-ccap.added.md | 2 +- .../me/dhhs/ccap/age_limit/special_needs.yaml | 4 +- .../gov/states/me/dhhs/ccap/asset_limit.yaml | 2 +- .../me/dhhs/ccap/copay/cap/above_85_smi.yaml | 4 +- .../me/dhhs/ccap/copay/cap/below_85_smi.yaml | 4 +- .../me/dhhs/ccap/copay/cap_threshold.yaml | 4 +- .../gov/states/me/dhhs/ccap/copay/rate.yaml | 2 +- .../dhhs/ccap/hours/full_time_threshold.yaml | 5 +- .../ccap/income/countable_income/sources.yaml | 2 +- .../dhhs/ccap/market_rate/license_exempt.yaml | 2 +- .../ccap/market_rate/licensed_center.yaml | 2 +- .../ccap/market_rate/licensed_family.yaml | 2 +- .../dhhs/ccap/qualified_alien_statuses.yaml | 2 +- .../me/dhhs/ccap/region_1_counties.yaml | 2 +- .../me/dhhs/ccap/income/me_ccap_smi.yaml | 117 ++++++++++++++++++ 15 files changed, 136 insertions(+), 20 deletions(-) create mode 100644 policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/income/me_ccap_smi.yaml diff --git a/changelog.d/me-ccap.added.md b/changelog.d/me-ccap.added.md index a599a47be71..252ba1acf13 100644 --- a/changelog.d/me-ccap.added.md +++ b/changelog.d/me-ccap.added.md @@ -1 +1 @@ -Implement Maine CCAP (Child Care Assistance Program). Closes #7756. +Implement Maine CCAP (Child Care Affordability Program). Closes #7756. diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/special_needs.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/special_needs.yaml index a6c1853b899..062fa3b7327 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/special_needs.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/special_needs.yaml @@ -7,5 +7,5 @@ metadata: period: year label: Maine CCAP special needs child age limit reference: - - title: 10-148 C.M.R. Chapter 6 §2.A.7 - href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=5 + - title: 10-148 C.M.R. Chapter 6 §2.A.7.c + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=11 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/asset_limit.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/asset_limit.yaml index fa5c7ab4fcd..b13a7b384a8 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/asset_limit.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/asset_limit.yaml @@ -7,5 +7,5 @@ metadata: period: year label: Maine CCAP asset limit reference: - - title: 10-148 C.M.R. Chapter 6 §2.C.1 + - title: 10-148 C.M.R. Chapter 6 §2.A.2 href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=11 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/above_85_smi.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/above_85_smi.yaml index 428ed21fe88..77eca5604f1 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/above_85_smi.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/above_85_smi.yaml @@ -7,5 +7,5 @@ metadata: period: year label: Maine CCAP copay cap above 85% SMI reference: - - title: 10-148 C.M.R. Chapter 6 §5.A.2.b - href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=26 + - title: 10-148 C.M.R. Chapter 6 §5.A.7 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=27 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/below_85_smi.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/below_85_smi.yaml index 4ec8dcd8aa3..bfe6c3a2e97 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/below_85_smi.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/below_85_smi.yaml @@ -7,5 +7,5 @@ metadata: period: year label: Maine CCAP copay cap below 85% SMI reference: - - title: 10-148 C.M.R. Chapter 6 §5.A.2.a - href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=26 + - title: 10-148 C.M.R. Chapter 6 §5.A.7 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=27 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap_threshold.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap_threshold.yaml index 2737acab293..788f08c069e 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap_threshold.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap_threshold.yaml @@ -7,5 +7,5 @@ metadata: period: year label: Maine CCAP copay cap SMI threshold reference: - - title: 10-148 C.M.R. Chapter 6 §5.A.2 - href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=26 + - title: 10-148 C.M.R. Chapter 6 §5.A.7 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=27 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/rate.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/rate.yaml index 4b809e9a9af..1cb69c5a85c 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/rate.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/rate.yaml @@ -4,7 +4,7 @@ metadata: type: single_amount threshold_unit: /1 amount_unit: /1 - period: week + period: year label: Maine CCAP copay rate by SMI percentage reference: - title: 10-148 C.M.R. Chapter 6 §5.B.1 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/full_time_threshold.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/full_time_threshold.yaml index b64e9589d3b..0a72d58c9de 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/full_time_threshold.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/full_time_threshold.yaml @@ -1,12 +1,11 @@ description: Maine sets this threshold for full-time child care hours per week under the Child Care Affordability Program. values: - 2024-01-01: 30 - 2025-05-19: 30 + 2024-07-01: 30 metadata: unit: /1 period: week label: Maine CCAP full-time hours threshold reference: - - title: 10-148 C.M.R. Chapter 6 §1 Definitions 16, 22 + - title: 10-148 C.M.R. Chapter 6 §6.A.2.a href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=28 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/countable_income/sources.yaml index 26d2680f84a..b9f33903647 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/countable_income/sources.yaml @@ -1,6 +1,6 @@ description: Maine uses these income sources for countable income under the Child Care Affordability Program. values: - 2024-01-01: + 2024-07-01: # Earned income (Rule §2.C.3) - employment_income - self_employment_income diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/license_exempt.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/license_exempt.yaml index 14a3d702c53..4e229b1f238 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/license_exempt.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/license_exempt.yaml @@ -10,7 +10,7 @@ metadata: - me_ccap_time_category reference: - title: 10-148 C.M.R. Chapter 6 §4.D - href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=25 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=26 - title: Maine CCAP Market Rates (effective 5/19/2025) href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/5.19.25%20Child%20Care%20Market%20Rates.pdf diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml index 0f526103a96..92f83564132 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml @@ -10,7 +10,7 @@ metadata: - me_ccap_time_category reference: - title: 10-148 C.M.R. Chapter 6 §4.D - href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=25 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=26 - title: Maine CCAP Market Rates (effective 5/19/2025) href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/5.19.25%20Child%20Care%20Market%20Rates.pdf diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_family.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_family.yaml index 557ac0f61e7..b7bbc1d5c4c 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_family.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_family.yaml @@ -10,7 +10,7 @@ metadata: - me_ccap_time_category reference: - title: 10-148 C.M.R. Chapter 6 §4.D - href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=25 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=26 - title: Maine CCAP Market Rates (effective 5/19/2025) href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/5.19.25%20Child%20Care%20Market%20Rates.pdf diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/qualified_alien_statuses.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/qualified_alien_statuses.yaml index 672762fa409..9816a2deced 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/qualified_alien_statuses.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/qualified_alien_statuses.yaml @@ -14,7 +14,7 @@ metadata: period: year label: Maine CCAP qualified alien statuses reference: - - title: 10-148 C.M.R. Chapter 6 §2.A.2 + - title: 10-148 C.M.R. Chapter 6 §2.A.3 href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=11 - title: 8 U.S.C. §1641 href: https://www.law.cornell.edu/uscode/text/8/1641 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/region_1_counties.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/region_1_counties.yaml index d42d98b4ea6..34541ef6095 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/region_1_counties.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/region_1_counties.yaml @@ -11,6 +11,6 @@ metadata: label: Maine CCAP Region 1 counties reference: - title: 10-148 C.M.R. Chapter 6 §4.D - href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=25 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=26 - title: Maine CCAP Market Rates (effective 5/19/2025) href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/5.19.25%20Child%20Care%20Market%20Rates.pdf diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/income/me_ccap_smi.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/income/me_ccap_smi.yaml new file mode 100644 index 00000000000..3619ebcb639 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/income/me_ccap_smi.yaml @@ -0,0 +1,117 @@ +# Tests for me_ccap_smi: monthly SMI dollar values by family size. +# The formula uses an October 1 fiscal year cutover: +# month >= 10 -> uses current year's SMI +# month < 10 -> uses prior year's SMI +# +# SMI adjustment factors (from hhs_smi): +# size 1: 0.52, size 2: 0.68, size 4: 0.52 + 3*0.16 = 1.00 + +- name: Family of 2, January 2026 uses 2025-10-01 SMI. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + # SMI base (2025-10-01 ME) = $118,065. + # Size 2 adjustment = 0.68. + # Annual SMI = 118,065 * 0.68 = $80,284.20. + # Monthly = $80,284.20 / 12 = $6,690.35. + me_ccap_smi: 6_690.35 + +- name: Family of 4, January 2025 uses 2024-10-01 SMI. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + person2: + age: 33 + person3: + age: 8 + person4: + age: 5 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: ME + output: + # SMI base (2024-10-01 ME) = $113,259. + # Size 4 adjustment = 1.00. + # Annual SMI = $113,259.00. + # Monthly = $113,259.00 / 12 = $9,438.25. + me_ccap_smi: 9_438.25 + +- name: Family of 4, January 2026 uses 2025-10-01 SMI (verifies fiscal year crossover). + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + person2: + age: 33 + person3: + age: 8 + person4: + age: 5 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: ME + output: + # SMI base (2025-10-01 ME) = $118,065. + # Size 4 adjustment = 1.00. + # Annual SMI = $118,065.00. + # Monthly = $118,065.00 / 12 = $9,838.75. + me_ccap_smi: 9_838.75 + +- name: Family of 1, January 2026 uses 2025-10-01 SMI. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: ME + output: + # SMI base (2025-10-01 ME) = $118,065. + # Size 1 adjustment = 0.52. + # Annual SMI = 118,065 * 0.52 = $61,393.80. + # Monthly = $61,393.80 / 12 = $5,116.15. + me_ccap_smi: 5_116.15 From a22e745ee94e72a8c97df592806792808176f83c Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 11 Mar 2026 18:23:32 -0400 Subject: [PATCH 6/8] Review-fix round 2: fix special_needs reference and period access patterns Co-Authored-By: Claude Opus 4.6 --- .../gov/states/me/dhhs/ccap/age_limit/special_needs.yaml | 4 ++-- .../parameters/gov/states/me/dhhs/ccap/income/smi_limit.yaml | 4 ++-- .../states/me/dhhs/ccap/eligibility/me_ccap_eligible_child.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/special_needs.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/special_needs.yaml index 062fa3b7327..355c8a7d3ed 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/special_needs.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/age_limit/special_needs.yaml @@ -7,5 +7,5 @@ metadata: period: year label: Maine CCAP special needs child age limit reference: - - title: 10-148 C.M.R. Chapter 6 §2.A.7.c - href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=11 + - title: 10-148 C.M.R. Chapter 6 §1 Definition 11 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=4 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/smi_limit.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/smi_limit.yaml index 96e65d66070..e4f540d37c1 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/smi_limit.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/income/smi_limit.yaml @@ -7,5 +7,5 @@ metadata: period: year label: Maine CCAP SMI income limit rate reference: - - title: 10-148 C.M.R. Chapter 6 §2.C.1 - href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=12 + - title: 10-148 C.M.R. Chapter 6 §2.A.1 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=11 diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible_child.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible_child.py index 8206e4aec0c..e20ec5d79f8 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible_child.py +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible_child.py @@ -12,9 +12,9 @@ class me_ccap_eligible_child(Variable): def formula(person, period, parameters): p = parameters(period).gov.states.me.dhhs.ccap.age_limit age = person("monthly_age", period) - is_disabled = person("is_disabled", period) + is_disabled = person("is_disabled", period.this_year) age_limit = where(is_disabled, p.special_needs, p.child) age_eligible = age < age_limit - is_dependent = person("is_tax_unit_dependent", period) + is_dependent = person("is_tax_unit_dependent", period.this_year) immigration_eligible = person("me_ccap_immigration_status_eligible", period) return age_eligible & is_dependent & immigration_eligible From 085857f14fbfb43c096f1ad156a7ccf948b64079 Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 16 Mar 2026 01:08:01 -0400 Subject: [PATCH 7/8] adjustments --- .../hhs/ccdf/child_care_subsidy_programs.yaml | 1 + .../gov/states/me/dhhs/ccap/asset_limit.yaml | 11 - .../gov/states/me/dhhs/ccap/copay/cap.yaml | 20 + .../me/dhhs/ccap/copay/cap/above_85_smi.yaml | 11 - .../me/dhhs/ccap/copay/cap/below_85_smi.yaml | 11 - .../me/dhhs/ccap/copay/cap_threshold.yaml | 11 - .../dhhs/ccap/hours/full_time_threshold.yaml | 2 +- .../dhhs/ccap/hours/half_time_threshold.yaml | 11 + .../dhhs/ccap/hours/part_time_threshold.yaml | 11 + .../dhhs/ccap/hours/uses_simplified_time.yaml | 14 + .../dhhs/ccap/market_rate/license_exempt.yaml | 196 ++++++++-- .../ccap/market_rate/licensed_center.yaml | 195 ++++++++-- .../ccap/market_rate/licensed_family.yaml | 196 ++++++++-- .../dhhs/ccap/qualified_alien_statuses.yaml | 20 - .../me_ccap_activity_eligible.yaml | 127 +++++++ .../eligibility/me_ccap_asset_eligible.yaml | 41 --- .../ccap/eligibility/me_ccap_eligible.yaml | 8 +- .../me_ccap_immigration_status_eligible.yaml | 87 ----- .../gov/states/me/dhhs/ccap/integration.yaml | 26 +- .../gov/states/me/dhhs/ccap/me_ccap.yaml | 34 ++ .../ccap/payment/me_ccap_market_rate.yaml | 59 +++ .../me/dhhs/ccap/payment/me_ccap_region.yaml | 24 +- .../ccap/payment/me_ccap_time_category.yaml | 122 +++++- .../me/dhhs/ccap/copay/me_ccap_parent_fee.py | 6 +- .../eligibility/me_ccap_activity_eligible.py | 20 + .../eligibility/me_ccap_asset_eligible.py | 15 - .../dhhs/ccap/eligibility/me_ccap_eligible.py | 5 +- .../eligibility/me_ccap_eligible_child.py | 4 +- .../me_ccap_immigration_status_eligible.py | 24 -- .../me/dhhs/ccap/payment/me_ccap_region.py | 24 +- .../ccap/payment/me_ccap_time_category.py | 29 +- .../me_tanf_child_care_deduction.py | 2 +- sources/working_references.md | 348 ------------------ uv.lock | 2 +- 34 files changed, 996 insertions(+), 721 deletions(-) delete mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/asset_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap.yaml delete mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/above_85_smi.yaml delete mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/below_85_smi.yaml delete mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap_threshold.yaml create mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/half_time_threshold.yaml create mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/part_time_threshold.yaml create mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/uses_simplified_time.yaml delete mode 100644 policyengine_us/parameters/gov/states/me/dhhs/ccap/qualified_alien_statuses.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_activity_eligible.yaml delete mode 100644 policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_asset_eligible.yaml delete mode 100644 policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_immigration_status_eligible.yaml create mode 100644 policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_activity_eligible.py delete mode 100644 policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_asset_eligible.py delete mode 100644 policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_immigration_status_eligible.py delete mode 100644 sources/working_references.md 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 367612a52ae..addd736856e 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 @@ -4,6 +4,7 @@ values: - ca_child_care_subsidies # California Child Care - co_child_care_subsidies # Colorado Child Care Assistance Program - ma_child_care_subsidies # Massachusetts Child Care Financial Assistance + - me_child_care_subsidies # Maine Child Care Affordability Program - ne_child_care_subsidies # Nebraska Child Care Subsidy metadata: diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/asset_limit.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/asset_limit.yaml deleted file mode 100644 index b13a7b384a8..00000000000 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/asset_limit.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Maine limits family assets to this amount under the Child Care Affordability Program. -values: - 2024-01-01: 1_000_000 - -metadata: - unit: currency-USD - period: year - label: Maine CCAP asset limit - reference: - - title: 10-148 C.M.R. Chapter 6 §2.A.2 - href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=11 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap.yaml new file mode 100644 index 00000000000..5b831e2735c --- /dev/null +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap.yaml @@ -0,0 +1,20 @@ +description: Maine limits total parent fees to this share of eligibility income based on State Median Income level under the Child Care Affordability Program. +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: /1 + period: year + label: Maine CCAP copay cap by SMI percentage + reference: + - title: 10-148 C.M.R. Chapter 6 §5.A.7 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=27 + +brackets: + - threshold: + 2024-01-01: 0 + amount: + 2024-01-01: 0.07 + - threshold: + 2024-01-01: 0.85 + amount: + 2024-01-01: 0.1 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/above_85_smi.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/above_85_smi.yaml deleted file mode 100644 index 77eca5604f1..00000000000 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/above_85_smi.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Maine limits total parent fees to this share of eligibility income for families at or above 85% of State Median Income under the Child Care Affordability Program. -values: - 2024-01-01: 0.1 - -metadata: - unit: /1 - period: year - label: Maine CCAP copay cap above 85% SMI - reference: - - title: 10-148 C.M.R. Chapter 6 §5.A.7 - href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=27 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/below_85_smi.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/below_85_smi.yaml deleted file mode 100644 index bfe6c3a2e97..00000000000 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap/below_85_smi.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Maine limits total parent fees to this share of eligibility income for families below 85% of State Median Income under the Child Care Affordability Program. -values: - 2024-01-01: 0.07 - -metadata: - unit: /1 - period: year - label: Maine CCAP copay cap below 85% SMI - reference: - - title: 10-148 C.M.R. Chapter 6 §5.A.7 - href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=27 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap_threshold.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap_threshold.yaml deleted file mode 100644 index 788f08c069e..00000000000 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/copay/cap_threshold.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Maine uses this share of the State Median Income as the threshold for determining which copay cap applies under the Child Care Affordability Program. -values: - 2024-01-01: 0.85 - -metadata: - unit: /1 - period: year - label: Maine CCAP copay cap SMI threshold - reference: - - title: 10-148 C.M.R. Chapter 6 §5.A.7 - href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=27 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/full_time_threshold.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/full_time_threshold.yaml index 0a72d58c9de..a5c1d180890 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/full_time_threshold.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/full_time_threshold.yaml @@ -1,6 +1,6 @@ description: Maine sets this threshold for full-time child care hours per week under the Child Care Affordability Program. values: - 2024-07-01: 30 + 2024-07-06: 30 metadata: unit: /1 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/half_time_threshold.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/half_time_threshold.yaml new file mode 100644 index 00000000000..a2ccd170017 --- /dev/null +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/half_time_threshold.yaml @@ -0,0 +1,11 @@ +description: Maine sets this threshold for half-time child care hours per week under the Child Care Affordability Program. +values: + 2024-07-06: 10 + +metadata: + unit: /1 + period: week + label: Maine CCAP half-time hours threshold + reference: + - title: Maine Child Care Market Rates July 6, 2024 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/July%206%202024%20Market%20Rates_5_0.pdf diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/part_time_threshold.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/part_time_threshold.yaml new file mode 100644 index 00000000000..148b5a2e7f6 --- /dev/null +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/part_time_threshold.yaml @@ -0,0 +1,11 @@ +description: Maine sets this threshold for part-time child care hours per week under the Child Care Affordability Program. +values: + 2024-07-06: 20 + +metadata: + unit: /1 + period: week + label: Maine CCAP part-time hours threshold + reference: + - title: Maine Child Care Market Rates July 6, 2024 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/July%206%202024%20Market%20Rates_5_0.pdf diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/uses_simplified_time.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/uses_simplified_time.yaml new file mode 100644 index 00000000000..3e9a9857e48 --- /dev/null +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/hours/uses_simplified_time.yaml @@ -0,0 +1,14 @@ +description: Maine uses this indicator to determine whether the simplified two-category time authorization applies under the Child Care Affordability Program. +values: + 2024-07-06: false + 2025-05-19: true + +metadata: + unit: bool + period: year + label: Maine CCAP simplified time categories in effect + reference: + - title: Maine Child Care Market Rates July 6, 2024 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/July%206%202024%20Market%20Rates_5_0.pdf + - title: Maine Child Care Market Rates May 19, 2025 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/5.19.25%20Child%20Care%20Market%20Rates.pdf diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/license_exempt.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/license_exempt.yaml index 4e229b1f238..5fc40819ae2 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/license_exempt.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/license_exempt.yaml @@ -11,64 +11,198 @@ metadata: reference: - title: 10-148 C.M.R. Chapter 6 §4.D href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=26 - - title: Maine CCAP Market Rates (effective 5/19/2025) + - title: Maine CCAP Market Rates, effective July 6, 2024 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/July%206%202024%20Market%20Rates_5_0.pdf + - title: Maine CCAP Market Rates, effective May 19, 2025 href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/5.19.25%20Child%20Care%20Market%20Rates.pdf REGION_1: INFANT: FULL_TIME: - 2024-01-01: 171.5 - 2025-05-19: 171.5 + 2024-07-06: 171.5 PART_TIME: - 2024-01-01: 128.63 - 2025-05-19: 128.63 + 2024-07-06: 128.63 + HALF_TIME: + 2024-07-06: 85.75 + QUARTER_TIME: + 2024-07-06: 42.88 TODDLER: FULL_TIME: - 2024-01-01: 161.54 - 2025-05-19: 161.54 + 2024-07-06: 161.54 PART_TIME: - 2024-01-01: 121.15 - 2025-05-19: 121.15 + 2024-07-06: 121.15 + HALF_TIME: + 2024-07-06: 80.77 + QUARTER_TIME: + 2024-07-06: 40.38 PRESCHOOL: FULL_TIME: - 2024-01-01: 157.5 - 2025-05-19: 157.5 + 2024-07-06: 157.5 PART_TIME: - 2024-01-01: 118.13 - 2025-05-19: 118.13 + 2024-07-06: 118.13 + HALF_TIME: + 2024-07-06: 78.75 + QUARTER_TIME: + 2024-07-06: 39.38 SCHOOL_AGE: FULL_TIME: - 2024-01-01: 122.5 - 2025-05-19: 122.5 + 2024-07-06: 122.5 PART_TIME: - 2024-01-01: 98.33 + 2024-07-06: 91.88 2025-05-19: 98.33 + HALF_TIME: + 2024-07-06: 61.25 + QUARTER_TIME: + 2024-07-06: 30.63 REGION_2: INFANT: FULL_TIME: - 2024-01-01: 147 - 2025-05-19: 147 + 2024-07-06: 147 PART_TIME: - 2024-01-01: 110.25 - 2025-05-19: 110.25 + 2024-07-06: 110.25 + HALF_TIME: + 2024-07-06: 73.5 + QUARTER_TIME: + 2024-07-06: 36.75 TODDLER: FULL_TIME: - 2024-01-01: 140 - 2025-05-19: 140 + 2024-07-06: 140 PART_TIME: - 2024-01-01: 105 - 2025-05-19: 105 + 2024-07-06: 105 + HALF_TIME: + 2024-07-06: 70 + QUARTER_TIME: + 2024-07-06: 35 PRESCHOOL: FULL_TIME: - 2024-01-01: 133 - 2025-05-19: 133 + 2024-07-06: 133 PART_TIME: - 2024-01-01: 99.75 - 2025-05-19: 99.75 + 2024-07-06: 99.75 + HALF_TIME: + 2024-07-06: 66.5 + QUARTER_TIME: + 2024-07-06: 33.25 SCHOOL_AGE: FULL_TIME: - 2024-01-01: 119 - 2025-05-19: 119 + 2024-07-06: 119 PART_TIME: - 2024-01-01: 95.51 + 2024-07-06: 89.25 2025-05-19: 95.51 + HALF_TIME: + 2024-07-06: 59.5 + QUARTER_TIME: + 2024-07-06: 29.75 +KENNEBEC: + INFANT: + FULL_TIME: + 2024-07-06: 147 + PART_TIME: + 2024-07-06: 110.25 + HALF_TIME: + 2024-07-06: 73.5 + QUARTER_TIME: + 2024-07-06: 36.75 + TODDLER: + FULL_TIME: + 2024-07-06: 140 + PART_TIME: + 2024-07-06: 105 + HALF_TIME: + 2024-07-06: 70 + QUARTER_TIME: + 2024-07-06: 35 + PRESCHOOL: + FULL_TIME: + 2024-07-06: 133 + PART_TIME: + 2024-07-06: 99.75 + HALF_TIME: + 2024-07-06: 66.5 + QUARTER_TIME: + 2024-07-06: 33.25 + SCHOOL_AGE: + FULL_TIME: + 2024-07-06: 119 + PART_TIME: + 2024-07-06: 89.25 + 2025-05-19: 95.51 + HALF_TIME: + 2024-07-06: 59.5 + QUARTER_TIME: + 2024-07-06: 29.75 +KNOX_WALDO: + INFANT: + FULL_TIME: + 2024-07-06: 147 + PART_TIME: + 2024-07-06: 110.25 + HALF_TIME: + 2024-07-06: 73.5 + QUARTER_TIME: + 2024-07-06: 36.75 + TODDLER: + FULL_TIME: + 2024-07-06: 140 + PART_TIME: + 2024-07-06: 105 + HALF_TIME: + 2024-07-06: 70 + QUARTER_TIME: + 2024-07-06: 35 + PRESCHOOL: + FULL_TIME: + 2024-07-06: 133 + PART_TIME: + 2024-07-06: 99.75 + HALF_TIME: + 2024-07-06: 66.5 + QUARTER_TIME: + 2024-07-06: 33.25 + SCHOOL_AGE: + FULL_TIME: + 2024-07-06: 119 + PART_TIME: + 2024-07-06: 89.25 + 2025-05-19: 95.51 + HALF_TIME: + 2024-07-06: 59.5 + QUARTER_TIME: + 2024-07-06: 29.75 +PENOBSCOT: + INFANT: + FULL_TIME: + 2024-07-06: 147 + PART_TIME: + 2024-07-06: 110.25 + HALF_TIME: + 2024-07-06: 73.5 + QUARTER_TIME: + 2024-07-06: 36.75 + TODDLER: + FULL_TIME: + 2024-07-06: 140 + PART_TIME: + 2024-07-06: 105 + HALF_TIME: + 2024-07-06: 70 + QUARTER_TIME: + 2024-07-06: 35 + PRESCHOOL: + FULL_TIME: + 2024-07-06: 133 + PART_TIME: + 2024-07-06: 99.75 + HALF_TIME: + 2024-07-06: 66.5 + QUARTER_TIME: + 2024-07-06: 33.25 + SCHOOL_AGE: + FULL_TIME: + 2024-07-06: 119 + PART_TIME: + 2024-07-06: 89.25 + 2025-05-19: 95.51 + HALF_TIME: + 2024-07-06: 59.5 + QUARTER_TIME: + 2024-07-06: 29.75 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml index 92f83564132..9d013b0689c 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml @@ -11,64 +11,201 @@ metadata: reference: - title: 10-148 C.M.R. Chapter 6 §4.D href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=26 - - title: Maine CCAP Market Rates (effective 5/19/2025) + - title: Maine CCAP Market Rates, effective July 6, 2024 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/July%206%202024%20Market%20Rates_5_0.pdf + - title: Maine CCAP Market Rates, effective May 19, 2025 href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/5.19.25%20Child%20Care%20Market%20Rates.pdf REGION_1: INFANT: FULL_TIME: - 2024-01-01: 330 - 2025-05-19: 330 + 2024-07-06: 330 PART_TIME: - 2024-01-01: 247.5 - 2025-05-19: 247.5 + 2024-07-06: 247.5 + HALF_TIME: + 2024-07-06: 165 + QUARTER_TIME: + 2024-07-06: 82.5 TODDLER: FULL_TIME: - 2024-01-01: 320 - 2025-05-19: 320 + 2024-07-06: 320 PART_TIME: - 2024-01-01: 240 - 2025-05-19: 240 + 2024-07-06: 240 + HALF_TIME: + 2024-07-06: 160 + QUARTER_TIME: + 2024-07-06: 80 PRESCHOOL: FULL_TIME: - 2024-01-01: 300 - 2025-05-19: 300 + 2024-07-06: 300 PART_TIME: - 2024-01-01: 225 - 2025-05-19: 225 + 2024-07-06: 225 + HALF_TIME: + 2024-07-06: 150 + QUARTER_TIME: + 2024-07-06: 75 SCHOOL_AGE: FULL_TIME: - 2024-01-01: 214 - 2025-05-19: 214 + 2024-07-06: 214 PART_TIME: - 2024-01-01: 171.76 + 2024-07-06: 160.5 2025-05-19: 171.76 + HALF_TIME: + 2024-07-06: 107 + QUARTER_TIME: + 2024-07-06: 53.5 REGION_2: INFANT: FULL_TIME: - 2024-01-01: 275 - 2025-05-19: 275 + 2024-07-06: 275 PART_TIME: - 2024-01-01: 206.25 - 2025-05-19: 206.25 + 2024-07-06: 206.25 + HALF_TIME: + 2024-07-06: 137.5 + QUARTER_TIME: + 2024-07-06: 68.75 TODDLER: FULL_TIME: - 2024-01-01: 250 - 2025-05-19: 250 + 2024-07-06: 250 PART_TIME: - 2024-01-01: 187.5 - 2025-05-19: 187.5 + 2024-07-06: 187.5 + HALF_TIME: + 2024-07-06: 125 + QUARTER_TIME: + 2024-07-06: 62.5 PRESCHOOL: FULL_TIME: - 2024-01-01: 244 + 2024-07-06: 244 + PART_TIME: + 2024-07-06: 183 + HALF_TIME: + 2024-07-06: 122 + QUARTER_TIME: + 2024-07-06: 61 + SCHOOL_AGE: + FULL_TIME: + 2024-07-06: 180 + PART_TIME: + 2024-07-06: 135 + 2025-05-19: 144.47 + HALF_TIME: + 2024-07-06: 90 + QUARTER_TIME: + 2024-07-06: 45 +KENNEBEC: + INFANT: + FULL_TIME: + 2024-07-06: 275 + PART_TIME: + 2024-07-06: 206.25 + HALF_TIME: + 2024-07-06: 137.50 + QUARTER_TIME: + 2024-07-06: 68.75 + TODDLER: + FULL_TIME: + 2024-07-06: 250 + PART_TIME: + 2024-07-06: 187.50 + HALF_TIME: + 2024-07-06: 125 + QUARTER_TIME: + 2024-07-06: 62.50 + PRESCHOOL: + FULL_TIME: + 2024-07-06: 267 2025-05-19: 244 PART_TIME: - 2024-01-01: 183 + 2024-07-06: 200.25 2025-05-19: 183 + HALF_TIME: + 2024-07-06: 133.50 + QUARTER_TIME: + 2024-07-06: 66.75 SCHOOL_AGE: FULL_TIME: - 2024-01-01: 180 + 2024-07-06: 180 + PART_TIME: + 2024-07-06: 135 + HALF_TIME: + 2024-07-06: 90 + QUARTER_TIME: + 2024-07-06: 45 +KNOX_WALDO: + INFANT: + FULL_TIME: + 2024-07-06: 275 + PART_TIME: + 2024-07-06: 206.25 + HALF_TIME: + 2024-07-06: 137.50 + QUARTER_TIME: + 2024-07-06: 68.75 + TODDLER: + FULL_TIME: + 2024-07-06: 250 + PART_TIME: + 2024-07-06: 187.50 + HALF_TIME: + 2024-07-06: 125 + QUARTER_TIME: + 2024-07-06: 62.50 + PRESCHOOL: + FULL_TIME: + 2024-07-06: 244 + PART_TIME: + 2024-07-06: 183 + HALF_TIME: + 2024-07-06: 122 + QUARTER_TIME: + 2024-07-06: 61 + SCHOOL_AGE: + FULL_TIME: + 2024-07-06: 220 2025-05-19: 180 PART_TIME: - 2024-01-01: 144.47 - 2025-05-19: 144.47 + 2024-07-06: 165 + 2025-05-19: 135 + HALF_TIME: + 2024-07-06: 110 + QUARTER_TIME: + 2024-07-06: 55 +PENOBSCOT: + INFANT: + FULL_TIME: + 2024-07-06: 275 + PART_TIME: + 2024-07-06: 206.25 + HALF_TIME: + 2024-07-06: 137.50 + QUARTER_TIME: + 2024-07-06: 68.75 + TODDLER: + FULL_TIME: + 2024-07-06: 250 + PART_TIME: + 2024-07-06: 187.50 + HALF_TIME: + 2024-07-06: 125 + QUARTER_TIME: + 2024-07-06: 62.50 + PRESCHOOL: + FULL_TIME: + 2024-07-06: 244 + PART_TIME: + 2024-07-06: 183 + HALF_TIME: + 2024-07-06: 122 + QUARTER_TIME: + 2024-07-06: 61 + SCHOOL_AGE: + FULL_TIME: + 2024-07-06: 200 + 2025-05-19: 180 + PART_TIME: + 2024-07-06: 150 + 2025-05-19: 135 + HALF_TIME: + 2024-07-06: 100 + QUARTER_TIME: + 2024-07-06: 50 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_family.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_family.yaml index b7bbc1d5c4c..328688cbe76 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_family.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_family.yaml @@ -11,64 +11,198 @@ metadata: reference: - title: 10-148 C.M.R. Chapter 6 §4.D href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=26 - - title: Maine CCAP Market Rates (effective 5/19/2025) + - title: Maine CCAP Market Rates, effective July 6, 2024 + href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/July%206%202024%20Market%20Rates_5_0.pdf + - title: Maine CCAP Market Rates, effective May 19, 2025 href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/5.19.25%20Child%20Care%20Market%20Rates.pdf REGION_1: INFANT: FULL_TIME: - 2024-01-01: 245 - 2025-05-19: 245 + 2024-07-06: 245 PART_TIME: - 2024-01-01: 183.75 - 2025-05-19: 183.75 + 2024-07-06: 183.75 + HALF_TIME: + 2024-07-06: 122.5 + QUARTER_TIME: + 2024-07-06: 61.25 TODDLER: FULL_TIME: - 2024-01-01: 230.77 - 2025-05-19: 230.77 + 2024-07-06: 230.77 PART_TIME: - 2024-01-01: 173.08 - 2025-05-19: 173.08 + 2024-07-06: 173.08 + HALF_TIME: + 2024-07-06: 115.38 + QUARTER_TIME: + 2024-07-06: 57.69 PRESCHOOL: FULL_TIME: - 2024-01-01: 225 - 2025-05-19: 225 + 2024-07-06: 225 PART_TIME: - 2024-01-01: 168.75 - 2025-05-19: 168.75 + 2024-07-06: 168.75 + HALF_TIME: + 2024-07-06: 112.5 + QUARTER_TIME: + 2024-07-06: 56.25 SCHOOL_AGE: FULL_TIME: - 2024-01-01: 175 - 2025-05-19: 175 + 2024-07-06: 175 PART_TIME: - 2024-01-01: 140.46 + 2024-07-06: 131.25 2025-05-19: 140.46 + HALF_TIME: + 2024-07-06: 87.5 + QUARTER_TIME: + 2024-07-06: 43.75 REGION_2: INFANT: FULL_TIME: - 2024-01-01: 210 - 2025-05-19: 210 + 2024-07-06: 210 PART_TIME: - 2024-01-01: 157.5 - 2025-05-19: 157.5 + 2024-07-06: 157.5 + HALF_TIME: + 2024-07-06: 105 + QUARTER_TIME: + 2024-07-06: 52.5 TODDLER: FULL_TIME: - 2024-01-01: 200 - 2025-05-19: 200 + 2024-07-06: 200 PART_TIME: - 2024-01-01: 150 - 2025-05-19: 150 + 2024-07-06: 150 + HALF_TIME: + 2024-07-06: 100 + QUARTER_TIME: + 2024-07-06: 50 PRESCHOOL: FULL_TIME: - 2024-01-01: 190 - 2025-05-19: 190 + 2024-07-06: 190 PART_TIME: - 2024-01-01: 142.5 - 2025-05-19: 142.5 + 2024-07-06: 142.5 + HALF_TIME: + 2024-07-06: 95 + QUARTER_TIME: + 2024-07-06: 47.5 SCHOOL_AGE: FULL_TIME: - 2024-01-01: 170 - 2025-05-19: 170 + 2024-07-06: 170 PART_TIME: - 2024-01-01: 136.45 + 2024-07-06: 127.5 2025-05-19: 136.45 + HALF_TIME: + 2024-07-06: 85 + QUARTER_TIME: + 2024-07-06: 42.5 +KENNEBEC: + INFANT: + FULL_TIME: + 2024-07-06: 210 + PART_TIME: + 2024-07-06: 157.5 + HALF_TIME: + 2024-07-06: 105 + QUARTER_TIME: + 2024-07-06: 52.5 + TODDLER: + FULL_TIME: + 2024-07-06: 200 + PART_TIME: + 2024-07-06: 150 + HALF_TIME: + 2024-07-06: 100 + QUARTER_TIME: + 2024-07-06: 50 + PRESCHOOL: + FULL_TIME: + 2024-07-06: 190 + PART_TIME: + 2024-07-06: 142.5 + HALF_TIME: + 2024-07-06: 95 + QUARTER_TIME: + 2024-07-06: 47.5 + SCHOOL_AGE: + FULL_TIME: + 2024-07-06: 170 + PART_TIME: + 2024-07-06: 127.5 + 2025-05-19: 136.45 + HALF_TIME: + 2024-07-06: 85 + QUARTER_TIME: + 2024-07-06: 42.5 +KNOX_WALDO: + INFANT: + FULL_TIME: + 2024-07-06: 210 + PART_TIME: + 2024-07-06: 157.5 + HALF_TIME: + 2024-07-06: 105 + QUARTER_TIME: + 2024-07-06: 52.5 + TODDLER: + FULL_TIME: + 2024-07-06: 200 + PART_TIME: + 2024-07-06: 150 + HALF_TIME: + 2024-07-06: 100 + QUARTER_TIME: + 2024-07-06: 50 + PRESCHOOL: + FULL_TIME: + 2024-07-06: 190 + PART_TIME: + 2024-07-06: 142.5 + HALF_TIME: + 2024-07-06: 95 + QUARTER_TIME: + 2024-07-06: 47.5 + SCHOOL_AGE: + FULL_TIME: + 2024-07-06: 170 + PART_TIME: + 2024-07-06: 127.5 + 2025-05-19: 136.45 + HALF_TIME: + 2024-07-06: 85 + QUARTER_TIME: + 2024-07-06: 42.5 +PENOBSCOT: + INFANT: + FULL_TIME: + 2024-07-06: 210 + PART_TIME: + 2024-07-06: 157.5 + HALF_TIME: + 2024-07-06: 105 + QUARTER_TIME: + 2024-07-06: 52.5 + TODDLER: + FULL_TIME: + 2024-07-06: 200 + PART_TIME: + 2024-07-06: 150 + HALF_TIME: + 2024-07-06: 100 + QUARTER_TIME: + 2024-07-06: 50 + PRESCHOOL: + FULL_TIME: + 2024-07-06: 190 + PART_TIME: + 2024-07-06: 142.5 + HALF_TIME: + 2024-07-06: 95 + QUARTER_TIME: + 2024-07-06: 47.5 + SCHOOL_AGE: + FULL_TIME: + 2024-07-06: 170 + PART_TIME: + 2024-07-06: 127.5 + 2025-05-19: 136.45 + HALF_TIME: + 2024-07-06: 85 + QUARTER_TIME: + 2024-07-06: 42.5 diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/qualified_alien_statuses.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/qualified_alien_statuses.yaml deleted file mode 100644 index 9816a2deced..00000000000 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/qualified_alien_statuses.yaml +++ /dev/null @@ -1,20 +0,0 @@ -description: Maine uses these statuses as qualified alien statuses under the Child Care Affordability Program. -values: - 2024-01-01: - - LEGAL_PERMANENT_RESIDENT - - REFUGEE - - ASYLEE - - DEPORTATION_WITHHELD - - CUBAN_HAITIAN_ENTRANT - - CONDITIONAL_ENTRANT - - PAROLED_ONE_YEAR - -metadata: - unit: list - period: year - label: Maine CCAP qualified alien statuses - reference: - - title: 10-148 C.M.R. Chapter 6 §2.A.3 - href: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=11 - - title: 8 U.S.C. §1641 - href: https://www.law.cornell.edu/uscode/text/8/1641 diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_activity_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_activity_eligible.yaml new file mode 100644 index 00000000000..21a91755a04 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_activity_eligible.yaml @@ -0,0 +1,127 @@ +- name: Case 1, employed single parent meets requirement. + period: 2025-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 20 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + me_ccap_activity_eligible: true + +- name: Case 2, unemployed non-student parent does not meet requirement. + period: 2025-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 0 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + me_ccap_activity_eligible: false + +- name: Case 3, full time student parent qualifies. + period: 2025-01 + input: + people: + person1: + age: 25 + weekly_hours_worked: 0 + is_full_time_student: true + person2: + age: 3 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + me_ccap_activity_eligible: true + +- name: Case 4, disabled parent qualifies. + period: 2025-01 + input: + people: + person1: + age: 35 + weekly_hours_worked: 0 + is_disabled: true + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + me_ccap_activity_eligible: true + +- name: Case 5, two parents both employed. + period: 2025-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 25 + person2: + age: 28 + weekly_hours_worked: 15 + person3: + age: 5 + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: ME + output: + me_ccap_activity_eligible: true + +- name: Case 6, two parents one not employed or studying. + period: 2025-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 25 + person2: + age: 28 + weekly_hours_worked: 0 + person3: + age: 5 + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: ME + output: + me_ccap_activity_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_asset_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_asset_eligible.yaml deleted file mode 100644 index a35194799aa..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_asset_eligible.yaml +++ /dev/null @@ -1,41 +0,0 @@ -- name: Case 1, assets at limit, eligible. - period: 2025-01 - input: - spm_unit_assets: 1_000_000 - state_code: ME - output: - me_ccap_asset_eligible: true - -- name: Case 2, assets above limit, ineligible. - period: 2025-01 - input: - spm_unit_assets: 1_000_001 - state_code: ME - output: - me_ccap_asset_eligible: false - -- name: Case 3, no assets, eligible. - period: 2025-01 - input: - spm_unit_assets: 0 - state_code: ME - output: - me_ccap_asset_eligible: true - -- name: Case 4, assets well below limit, eligible. - period: 2025-01 - input: - spm_unit_assets: 500_000 - state_code: ME - output: - me_ccap_asset_eligible: true - -# === Edge cases === - -- name: Case 5, assets one dollar below limit, eligible. - period: 2025-01 - input: - spm_unit_assets: 999_999 - state_code: ME - output: - me_ccap_asset_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.yaml index 0d5c62a5a92..412b400c4d4 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.yaml @@ -12,7 +12,7 @@ spm_unit: members: [person1, person2] me_ccap_income_eligible: true - me_ccap_asset_eligible: true + is_ccdf_asset_eligible: true tax_units: tax_unit: members: [person1, person2] @@ -37,7 +37,7 @@ spm_unit: members: [person1, person2] me_ccap_income_eligible: false - me_ccap_asset_eligible: true + is_ccdf_asset_eligible: true tax_units: tax_unit: members: [person1, person2] @@ -62,7 +62,7 @@ spm_unit: members: [person1, person2] me_ccap_income_eligible: true - me_ccap_asset_eligible: false + is_ccdf_asset_eligible: false tax_units: tax_unit: members: [person1, person2] @@ -87,7 +87,7 @@ spm_unit: members: [person1, person2] me_ccap_income_eligible: true - me_ccap_asset_eligible: true + is_ccdf_asset_eligible: true tax_units: tax_unit: members: [person1, person2] diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_immigration_status_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_immigration_status_eligible.yaml deleted file mode 100644 index 808917bce51..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_immigration_status_eligible.yaml +++ /dev/null @@ -1,87 +0,0 @@ -- name: Case 1, US citizen, eligible. - period: 2025-01 - input: - immigration_status: CITIZEN - state_code: ME - output: - me_ccap_immigration_status_eligible: true - -- name: Case 2, legal permanent resident, eligible. - period: 2025-01 - input: - immigration_status: LEGAL_PERMANENT_RESIDENT - state_code: ME - output: - me_ccap_immigration_status_eligible: true - -- name: Case 3, refugee, eligible. - period: 2025-01 - input: - immigration_status: REFUGEE - state_code: ME - output: - me_ccap_immigration_status_eligible: true - -- name: Case 4, asylee, eligible. - period: 2025-01 - input: - immigration_status: ASYLEE - state_code: ME - output: - me_ccap_immigration_status_eligible: true - -- name: Case 5, undocumented, ineligible. - period: 2025-01 - input: - immigration_status: UNDOCUMENTED - state_code: ME - output: - me_ccap_immigration_status_eligible: false - -- name: Case 6, DACA, ineligible. - period: 2025-01 - input: - immigration_status: DACA - state_code: ME - output: - me_ccap_immigration_status_eligible: false - -- name: Case 7, TPS, ineligible. - period: 2025-01 - input: - immigration_status: TPS - state_code: ME - output: - me_ccap_immigration_status_eligible: false - -- name: Case 8, Cuban/Haitian entrant, eligible. - period: 2025-01 - input: - immigration_status: CUBAN_HAITIAN_ENTRANT - state_code: ME - output: - me_ccap_immigration_status_eligible: true - -- name: Case 9, conditional entrant, eligible. - period: 2025-01 - input: - immigration_status: CONDITIONAL_ENTRANT - state_code: ME - output: - me_ccap_immigration_status_eligible: true - -- name: Case 10, paroled one year, eligible. - period: 2025-01 - input: - immigration_status: PAROLED_ONE_YEAR - state_code: ME - output: - me_ccap_immigration_status_eligible: true - -- name: Case 11, deportation withheld, eligible. - period: 2025-01 - input: - immigration_status: DEPORTATION_WITHHELD - state_code: ME - output: - me_ccap_immigration_status_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/integration.yaml index 384d40d4548..97be2fb6550 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/integration.yaml @@ -42,7 +42,7 @@ # Assets: # - $5,000 <= $1,000,000 => asset eligible - me_ccap_asset_eligible: true + is_ccdf_asset_eligible: true me_ccap_eligible: true # Age group: age 4 => PRESCHOOL @@ -122,11 +122,11 @@ # - 125% SMI = $147,581.25 # - $55,000 <= $147,581 => income eligible me_ccap_income_eligible: true - me_ccap_asset_eligible: true + is_ccdf_asset_eligible: true me_ccap_eligible: true - # Region: Penobscot => REGION_2 - me_ccap_region: REGION_2 + # Region: Penobscot => PENOBSCOT + me_ccap_region: PENOBSCOT # Age groups: person3 age 2 => TODDLER; person4 age 7 => SCHOOL_AGE me_ccap_age_group: [SCHOOL_AGE, SCHOOL_AGE, TODDLER, SCHOOL_AGE] @@ -147,8 +147,8 @@ me_ccap_parent_fee: 182 # Market rates (weekly): - # person3: Region 2 Licensed Family Toddler FT = $200/week - # person4: Region 2 Licensed Family School Age PT = $136.45/week + # person3: Penobscot Licensed Family Toddler FT = $200/week (same as Region 2) + # person4: Penobscot Licensed Family School Age PT = $136.45/week (same as Region 2) me_ccap_market_rate: [0, 0, 200, 136.45] # Benefit: @@ -229,7 +229,7 @@ county_str: CUMBERLAND_COUNTY_ME output: # Child is undocumented => not immigration eligible => not eligible child - me_ccap_immigration_status_eligible: [true, false] + is_ccdf_immigration_eligible_child: [true, false] me_ccap_eligible_child: [false, false] me_ccap_eligible: false me_ccap: 0 @@ -397,7 +397,7 @@ county_str: KENNEBEC_COUNTY_ME output: # Assets $1,500,000 > $1,000,000 => asset ineligible - me_ccap_asset_eligible: false + is_ccdf_asset_eligible: false me_ccap_eligible: false me_ccap: 0 @@ -433,7 +433,7 @@ county_str: YORK_COUNTY_ME output: # Assets $1,000,000 <= $1,000,000 => asset eligible. - me_ccap_asset_eligible: true + is_ccdf_asset_eligible: true me_ccap_eligible_child: [false, true] me_ccap_income_eligible: true me_ccap_eligible: true @@ -587,8 +587,8 @@ me_ccap_income_eligible: true me_ccap_eligible: true - # Region 2 (Penobscot). - me_ccap_region: REGION_2 + # Penobscot region (Penobscot county). + me_ccap_region: PENOBSCOT # person3: age 0 => INFANT. person4: age 10 => SCHOOL_AGE. me_ccap_age_group: [SCHOOL_AGE, SCHOOL_AGE, INFANT, SCHOOL_AGE] @@ -612,8 +612,8 @@ me_ccap_parent_fee: 1_079 # Market rates (weekly): - # person3: Region 2 Licensed Center Infant FT = $275. - # person4: Region 2 License-Exempt School Age PT = $95.51. + # person3: Penobscot Licensed Center Infant FT = $275 (same as Region 2). + # person4: Penobscot License-Exempt School Age PT = $95.51 (same as Region 2). me_ccap_market_rate: [0, 0, 275, 95.51] # Max reimbursement: (275 + 95.51) * 52/12 = 370.51 * 4.333 = $1,605.54. diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/me_ccap.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/me_ccap.yaml index 6fc5db3e8ec..a3da7894ddd 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/me_ccap.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/me_ccap.yaml @@ -288,3 +288,37 @@ # Max reimbursement: $866.67. # Benefit = min(383.33, 866.67) = $383.33. me_ccap: 383.33 + +- name: Case 10, negative countable income does not inflate benefit. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + self_employment_income: -60_000_000 + person2: + age: 4 + me_ccap_eligible_child: true + me_ccap_market_rate: 300 + spm_units: + spm_unit: + members: [person1, person2] + me_ccap_eligible: true + spm_unit_pre_subsidy_childcare_expenses: 10_000 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + # Negative income -> parent fee = 0 (floor of negative = 0) + # Weekly market rate: $300 => monthly = 300 * 52/12 = $1,300. + # Expenses (monthly): 10,000/12 = $833.33. + # Uncapped: max(833.33 - 0, 0) = $833.33. + # Max reimbursement: $1,300. + # Benefit = min(833.33, 1,300) = $833.33. + # Benefit capped at expenses, NOT inflated by negative income. + me_ccap: 833.33 diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_market_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_market_rate.yaml index 84ba3be33fb..ec30321814a 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_market_rate.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_market_rate.yaml @@ -911,3 +911,62 @@ output: # Region 2 License-Exempt School Age PT = $95.51/week me_ccap_market_rate: [95.51] + +# === County-specific region rate tests === + +- name: Case 49, Kennebec Licensed Center Preschool FT 2024 rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: PRESCHOOL + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSED_CENTER + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: KENNEBEC + output: + # Kennebec Licensed Center Preschool FT = $267/week (2024 rate) + me_ccap_market_rate: [267] + +- name: Case 50, Knox Licensed Center School Age FT 2024 rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: SCHOOL_AGE + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSED_CENTER + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: KNOX_WALDO + output: + # Knox/Waldo Licensed Center School Age FT = $220/week (2024 rate) + me_ccap_market_rate: [220] + +- name: Case 51, Knox Licensed Center School Age FT 2025 rate converges to Region 2. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: SCHOOL_AGE + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSED_CENTER + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: KNOX_WALDO + output: + # Knox/Waldo Licensed Center School Age FT = $180/week (converged to Region 2) + me_ccap_market_rate: [180] diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_region.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_region.yaml index 49f52a7a496..00243477bf9 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_region.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_region.yaml @@ -22,21 +22,21 @@ output: me_ccap_region: REGION_1 -- name: Case 4, Penobscot County, Region 2. +- name: Case 4, Penobscot County, PENOBSCOT region. period: 2025-01 input: county_str: PENOBSCOT_COUNTY_ME state_code: ME output: - me_ccap_region: REGION_2 + me_ccap_region: PENOBSCOT -- name: Case 5, Kennebec County, Region 2. +- name: Case 5, Kennebec County, KENNEBEC region. period: 2025-01 input: county_str: KENNEBEC_COUNTY_ME state_code: ME output: - me_ccap_region: REGION_2 + me_ccap_region: KENNEBEC - name: Case 6, Aroostook County, Region 2. period: 2025-01 @@ -45,3 +45,19 @@ state_code: ME output: me_ccap_region: REGION_2 + +- name: Case 7, Knox county maps to KNOX_WALDO region. + period: 2025-01 + input: + county_str: KNOX_COUNTY_ME + state_code: ME + output: + me_ccap_region: KNOX_WALDO + +- name: Case 8, Waldo county maps to KNOX_WALDO region. + period: 2025-01 + input: + county_str: WALDO_COUNTY_ME + state_code: ME + output: + me_ccap_region: KNOX_WALDO diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_time_category.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_time_category.yaml index 0533b14f572..1332412d771 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_time_category.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_time_category.yaml @@ -1,4 +1,6 @@ -- name: Case 1, 40 hours per week, full time. +# === 2026: Simplified two-category system (uses_simplified_time = true) === + +- name: Case 1, 40 hours per week, full time (simplified). period: 2026-01 input: childcare_hours_per_day: 8 @@ -7,7 +9,7 @@ output: me_ccap_time_category: FULL_TIME -- name: Case 2, 30 hours per week, full time boundary. +- name: Case 2, 30 hours per week, full time boundary (simplified). period: 2026-01 input: childcare_hours_per_day: 6 @@ -16,7 +18,7 @@ output: me_ccap_time_category: FULL_TIME -- name: Case 3, 25 hours per week, part time. +- name: Case 3, 25 hours per week, part time (simplified). period: 2026-01 input: childcare_hours_per_day: 5 @@ -25,7 +27,7 @@ output: me_ccap_time_category: PART_TIME -- name: Case 4, 29 hours per week, part time boundary. +- name: Case 4, 29 hours per week, part time boundary (simplified). period: 2026-01 input: childcare_hours_per_day: 5.8 @@ -34,7 +36,7 @@ output: me_ccap_time_category: PART_TIME -- name: Case 5, 10 hours per week, part time. +- name: Case 5, 10 hours per week, part time (simplified). period: 2026-01 input: childcare_hours_per_day: 5 @@ -43,9 +45,9 @@ output: me_ccap_time_category: PART_TIME -# === Edge cases === +# === Edge cases (simplified) === -- name: Case 6, 1 hour per week, minimum part time. +- name: Case 6, 1 hour per week, minimum part time (simplified). period: 2026-01 input: childcare_hours_per_day: 1 @@ -55,7 +57,7 @@ # 1 hour < 30 => PART_TIME. me_ccap_time_category: PART_TIME -- name: Case 7, zero hours per week. +- name: Case 7, zero hours per week (simplified). period: 2026-01 input: childcare_hours_per_day: 0 @@ -65,7 +67,7 @@ # 0 hours < 30 => PART_TIME. me_ccap_time_category: PART_TIME -- name: Case 8, 50 hours per week, maximum full time. +- name: Case 8, 50 hours per week, maximum full time (simplified). period: 2026-01 input: childcare_hours_per_day: 10 @@ -74,3 +76,105 @@ output: # 50 hours >= 30 => FULL_TIME. me_ccap_time_category: FULL_TIME + +# === 2025: Four-category system (uses_simplified_time = false) === + +- name: Case 9, 35 hours per week, full time (4-category). + period: 2025-01 + input: + childcare_hours_per_day: 7 + childcare_days_per_week: 5 + state_code: ME + output: + # 35 hours >= 30 => FULL_TIME. + me_ccap_time_category: FULL_TIME + +- name: Case 10, 30 hours per week, full time boundary (4-category). + period: 2025-01 + input: + childcare_hours_per_day: 6 + childcare_days_per_week: 5 + state_code: ME + output: + # 30 hours >= 30 => FULL_TIME. + me_ccap_time_category: FULL_TIME + +- name: Case 11, 25 hours per week, part time (4-category). + period: 2025-01 + input: + childcare_hours_per_day: 5 + childcare_days_per_week: 5 + state_code: ME + output: + # 25 hours >= 20 => PART_TIME. + me_ccap_time_category: PART_TIME + +- name: Case 12, 20 hours per week, part time boundary (4-category). + period: 2025-01 + input: + childcare_hours_per_day: 4 + childcare_days_per_week: 5 + state_code: ME + output: + # 20 hours >= 20 => PART_TIME. + me_ccap_time_category: PART_TIME + +- name: Case 13, 15 hours per week, half time (4-category). + period: 2025-01 + input: + childcare_hours_per_day: 3 + childcare_days_per_week: 5 + state_code: ME + output: + # 15 hours >= 10 => HALF_TIME. + me_ccap_time_category: HALF_TIME + +- name: Case 14, 10 hours per week, half time boundary (4-category). + period: 2025-01 + input: + childcare_hours_per_day: 2 + childcare_days_per_week: 5 + state_code: ME + output: + # 10 hours >= 10 => HALF_TIME. + me_ccap_time_category: HALF_TIME + +- name: Case 15, 5 hours per week, quarter time (4-category). + period: 2025-01 + input: + childcare_hours_per_day: 1 + childcare_days_per_week: 5 + state_code: ME + output: + # 5 hours < 10 => QUARTER_TIME. + me_ccap_time_category: QUARTER_TIME + +- name: Case 16, 9 hours per week, quarter time boundary (4-category). + period: 2025-01 + input: + childcare_hours_per_day: 3 + childcare_days_per_week: 3 + state_code: ME + output: + # 9 hours < 10 => QUARTER_TIME. + me_ccap_time_category: QUARTER_TIME + +- name: Case 17, zero hours per week, quarter time (4-category). + period: 2025-01 + input: + childcare_hours_per_day: 0 + childcare_days_per_week: 0 + state_code: ME + output: + # 0 hours < 10 => QUARTER_TIME. + me_ccap_time_category: QUARTER_TIME + +- name: Case 18, 19 hours per week, half time (4-category). + period: 2025-01 + input: + childcare_hours_per_day: 3.8 + childcare_days_per_week: 5 + state_code: ME + output: + # 19 hours >= 10 but < 20 => HALF_TIME. + me_ccap_time_category: HALF_TIME diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.py index 4e1276c2839..3a5ff6a1045 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.py +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.py @@ -22,11 +22,7 @@ def formula(spm_unit, period, parameters): fee_rate = p.rate.calc(smi_percentage) raw_weekly_fee = np.floor(weekly_income * fee_rate) - cap_rate = where( - smi_percentage < p.cap_threshold, - p.cap.below_85_smi, - p.cap.above_85_smi, - ) + cap_rate = p.cap.calc(smi_percentage) capped_weekly_fee = np.floor(weekly_income * cap_rate) weekly_fee = min_(raw_weekly_fee, capped_weekly_fee) diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_activity_eligible.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_activity_eligible.py new file mode 100644 index 00000000000..2eeda3377e1 --- /dev/null +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_activity_eligible.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class me_ccap_activity_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for Maine CCAP based on activity requirements" + definition_period = MONTH + defined_for = StateCode.ME + reference = "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=12" + + def formula(spm_unit, period, parameters): + person = spm_unit.members + is_head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) + hours_worked = person("weekly_hours_worked", period.this_year) + is_employed = hours_worked > 0 + is_student = person("is_full_time_student", period.this_year) + is_disabled = person("is_disabled", period.this_year) + individually_eligible = is_employed | is_student | is_disabled + return spm_unit.sum(is_head_or_spouse & ~individually_eligible) == 0 diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_asset_eligible.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_asset_eligible.py deleted file mode 100644 index 0f093a0a2a7..00000000000 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_asset_eligible.py +++ /dev/null @@ -1,15 +0,0 @@ -from policyengine_us.model_api import * - - -class me_ccap_asset_eligible(Variable): - value_type = bool - entity = SPMUnit - label = "Asset eligible for Maine CCAP" - definition_period = MONTH - defined_for = StateCode.ME - reference = "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=11" - - def formula(spm_unit, period, parameters): - p = parameters(period).gov.states.me.dhhs.ccap - total_assets = spm_unit("spm_unit_assets", period.this_year) - return total_assets <= p.asset_limit diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.py index 5cb7282877a..5f02d5aaf61 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.py +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.py @@ -12,5 +12,6 @@ class me_ccap_eligible(Variable): def formula(spm_unit, period, parameters): has_eligible_child = add(spm_unit, period, ["me_ccap_eligible_child"]) > 0 income_eligible = spm_unit("me_ccap_income_eligible", period) - asset_eligible = spm_unit("me_ccap_asset_eligible", period) - return has_eligible_child & income_eligible & asset_eligible + asset_eligible = spm_unit("is_ccdf_asset_eligible", period.this_year) + activity_eligible = spm_unit("me_ccap_activity_eligible", period) + return has_eligible_child & income_eligible & asset_eligible & activity_eligible diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible_child.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible_child.py index e20ec5d79f8..a9cb8a68732 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible_child.py +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible_child.py @@ -16,5 +16,7 @@ def formula(person, period, parameters): age_limit = where(is_disabled, p.special_needs, p.child) age_eligible = age < age_limit is_dependent = person("is_tax_unit_dependent", period.this_year) - immigration_eligible = person("me_ccap_immigration_status_eligible", period) + immigration_eligible = person( + "is_ccdf_immigration_eligible_child", period.this_year + ) return age_eligible & is_dependent & immigration_eligible diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_immigration_status_eligible.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_immigration_status_eligible.py deleted file mode 100644 index a67518fa283..00000000000 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/eligibility/me_ccap_immigration_status_eligible.py +++ /dev/null @@ -1,24 +0,0 @@ -from policyengine_us.model_api import * - - -class me_ccap_immigration_status_eligible(Variable): - value_type = bool - entity = Person - label = "Immigration status eligible for Maine CCAP" - definition_period = MONTH - defined_for = StateCode.ME - reference = ( - "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=11", - "https://www.law.cornell.edu/uscode/text/8/1641", - ) - - def formula(person, period, parameters): - p = parameters(period).gov.states.me.dhhs.ccap - immigration_status = person("immigration_status", period) - immigration_status_str = immigration_status.decode_to_str() - has_qualifying_status = np.isin( - immigration_status_str, - p.qualified_alien_statuses, - ) - is_citizen = immigration_status == immigration_status.possible_values.CITIZEN - return has_qualifying_status | is_citizen diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_region.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_region.py index 07ba8853b0e..9eca1e31bd3 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_region.py +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_region.py @@ -4,6 +4,9 @@ class MECCAPRegion(Enum): REGION_1 = "Region 1" REGION_2 = "Region 2" + KENNEBEC = "Kennebec" + KNOX_WALDO = "Knox/Waldo" + PENOBSCOT = "Penobscot" class me_ccap_region(Variable): @@ -14,14 +17,25 @@ class me_ccap_region(Variable): definition_period = MONTH defined_for = StateCode.ME label = "Maine CCAP geographic region" - reference = "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=25" + reference = ( + "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=25", + "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/July%206%202024%20Market%20Rates_5_0.pdf", + ) def formula(household, period, parameters): county = household("county_str", period) p = parameters(period).gov.states.me.dhhs.ccap is_region_1 = np.isin(county, p.region_1_counties) - return where( - is_region_1, - MECCAPRegion.REGION_1, - MECCAPRegion.REGION_2, + is_kennebec = np.isin(county, ["KENNEBEC_COUNTY_ME"]) + is_knox_waldo = np.isin(county, ["KNOX_COUNTY_ME", "WALDO_COUNTY_ME"]) + is_penobscot = np.isin(county, ["PENOBSCOT_COUNTY_ME"]) + return select( + [is_region_1, is_kennebec, is_knox_waldo, is_penobscot], + [ + MECCAPRegion.REGION_1, + MECCAPRegion.KENNEBEC, + MECCAPRegion.KNOX_WALDO, + MECCAPRegion.PENOBSCOT, + ], + default=MECCAPRegion.REGION_2, ) diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_time_category.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_time_category.py index bf8f0b0742a..a7c7b1d09e9 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_time_category.py +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/payment/me_ccap_time_category.py @@ -4,6 +4,8 @@ class MECCAPTimeCategory(Enum): FULL_TIME = "Full Time" PART_TIME = "Part Time" + HALF_TIME = "Half Time" + QUARTER_TIME = "Quarter Time" class me_ccap_time_category(Variable): @@ -14,13 +16,30 @@ class me_ccap_time_category(Variable): definition_period = MONTH defined_for = StateCode.ME label = "Maine CCAP time category" - reference = "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=28" + reference = ( + "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=28", + "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/July%206%202024%20Market%20Rates_5_0.pdf", + ) def formula(person, period, parameters): hours = person("childcare_hours_per_week", period.this_year) p = parameters(period).gov.states.me.dhhs.ccap.hours - return where( - hours >= p.full_time_threshold, - MECCAPTimeCategory.FULL_TIME, - MECCAPTimeCategory.PART_TIME, + if p.uses_simplified_time: + return where( + hours >= p.full_time_threshold, + MECCAPTimeCategory.FULL_TIME, + MECCAPTimeCategory.PART_TIME, + ) + return select( + [ + hours >= p.full_time_threshold, + hours >= p.part_time_threshold, + hours >= p.half_time_threshold, + ], + [ + MECCAPTimeCategory.FULL_TIME, + MECCAPTimeCategory.PART_TIME, + MECCAPTimeCategory.HALF_TIME, + ], + default=MECCAPTimeCategory.QUARTER_TIME, ) diff --git a/policyengine_us/variables/gov/states/me/dhhs/tanf/income/deductions/me_tanf_child_care_deduction.py b/policyengine_us/variables/gov/states/me/dhhs/tanf/income/deductions/me_tanf_child_care_deduction.py index 6cd842852be..3ccea193a7d 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/tanf/income/deductions/me_tanf_child_care_deduction.py +++ b/policyengine_us/variables/gov/states/me/dhhs/tanf/income/deductions/me_tanf_child_care_deduction.py @@ -29,5 +29,5 @@ def formula(spm_unit, period, parameters): total_max_deduction = spm_unit.sum(max_deduction_per_person) # Deduction is lesser of actual expenses or maximum. - childcare_expenses = spm_unit("spm_unit_pre_subsidy_childcare_expenses", period) + childcare_expenses = spm_unit("childcare_expenses", period) return min_(childcare_expenses, total_max_deduction) diff --git a/sources/working_references.md b/sources/working_references.md deleted file mode 100644 index 7da320feb18..00000000000 --- a/sources/working_references.md +++ /dev/null @@ -1,348 +0,0 @@ -# Maine Child Care Affordability Program (CCAP) - Working References - -## Program Overview - -**Official Name:** Child Care Affordability Program (CCAP) -**Administering Agency:** Maine Department of Health and Human Services (DHHS), Office of Child and Family Services (OCFS) -**Governing Rule:** 10-148 C.M.R. Chapter 6 - Child Care Affordability Program Rules -**Effective Date of Current Rules:** August 18, 2025 - -CCAP administers the federal Child Care and Development Fund (CCDF), other federal funds, and state funds to increase the availability, affordability, and quality of child care services for Maine families. - ---- - -## 1. Regulatory Authority - -### Primary Rule -- **10-148 C.M.R. Ch. 6** - Child Care Affordability Program Rules (effective 8/18/2025) - - Full rule PDF: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf - - Local: `/tmp/me-ccap-full-rule.pdf` (57 pages) - - Clean adopted version (DOCX): https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/rule-2025-08/CCAP%202025%20Adopted_Clean.docx - -### Federal Authority -- 45 C.F.R. Part 98 - Child Care and Development Fund (CCDF) -- 45 C.F.R. §98.21 - Award period minimum 12 months -- 45 C.F.R. Part 98.16 - Redetermination requirements - -### State Statute -- 22 MRSA §3740-E - Phased implementation plan for CCAP expansion (to 250% SMI by 2030, 7% copay cap) - ---- - -## 2. Eligibility Criteria - -### 2a. Child Eligibility (Rule Section 2.A) -- Child must be at least 6 weeks old and under 13 years of age -- Children turning 13 during eligibility period remain eligible -- Children with special needs: eligible up to age 19 (Rule §2.A.7) -- Child must be a U.S. citizen or qualified alien (8 U.S.C. §1641 or §1359) -- Child must reside with a Maine resident parent -- Parent must be employed, in an educational program, or job training program - -### 2b. Income Eligibility (Rule Section 2.C) -- Family gross income must be at or below **125% of State Median Income (SMI)** - - Effective 7/1/2024 (expanded from prior 85% SMI threshold) - - Income guidelines effective 10/19/2024 -- Family assets must not exceed **$1,000,000** (self-certified by parent) -- SMI data source: https://www.acf.hhs.gov/sites/default/files/documents/ocs/COMM_LIHEAP_IM%202024-02_Att4SMITable_0.pdf - -### 2c. Income Eligibility Table (125% SMI, effective 10/19/2024) - -| Family Size | Annual Income | Monthly Income | Weekly Income | -|-------------|--------------|----------------|---------------| -| 1 | $73,618.35 | $6,134.86 | $1,426.71 | -| 2 | $96,270.15 | $8,022.51 | $1,865.70 | -| 3 | $118,921.95 | $9,910.16 | $2,304.69 | -| 4 | $141,573.75 | $11,797.81 | $2,743.68 | -| 5 | $164,225.55 | $13,685.46 | $3,182.67 | -| 6 | $186,877.35 | $15,573.11 | $3,621.65 | -| 7 | $191,124.56 | $15,927.04 | $3,703.97 | -| 8 | $195,371.78 | $16,280.98 | $3,786.27 | -| 9 | $199,618.99 | $16,634.92 | $3,868.59 | -| 10 | $203,866.20 | $16,988.85 | $3,950.90 | - -- Add 3% for each additional family member beyond 10 -- Source: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/10192024%20income%20guidelines.pdf#page=1 - -### 2d. 85% SMI Thresholds (for copay calculation tiers) - -| Family Size | Annual Income (85% SMI) | Weekly Income (85% SMI) | -|-------------|------------------------|------------------------| -| 1 | $50,060.48 | $970.17 | -| 2 | $65,463.70 | $1,268.68 | -| 3 | $80,866.93 | $1,567.19 | -| 4 | $96,270.15 | $1,865.70 | -| 5 | $111,673.37 | $2,164.21 | -| 6 | $127,076.60 | $2,462.73 | -| 7 | $129,964.70 | $2,518.70 | -| 8 | $132,852.81 | $2,574.67 | -| 9 | $135,740.91 | $2,630.64 | -| 10 | $138,629.02 | $2,686.61 | - -- Source: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/Comparison%20of%2085_%20and%20125_%20State%20Median%20Income%20Limits.pdf#page=1 - -### 2e. Family Size Determination (Rule Section 2.C.2) - -| Family Composition | Family Size | Income Counted | -|---|---|---| -| Single parent with child(ren) | Parent + children | All countable income | -| Unmarried parents with mutual child | Both parents + all children | All countable income | -| Unmarried parents, no mutual child | Each parent + their children (separate families) | Countable income for each parent's family | -| Married parents | Both parents + all children | All countable income | -| Foster care parent + child | Child only (family of 1) | Only child's income | -| Fictive kinship care (CPS) | Child only (family of 1) | Only child's income | -| Legal guardians + child | Child only (family of 1) | Only child's income | - ---- - -## 3. Income Counting Rules - -### 3a. Eligibility Income Definition (Rule Section 1, Definition 23) -- "Eligibility Income" = Gross Income or Allowable Net Income (for self-employed parents) -- Gross Income = all money earned and unearned, before deductions -- Income is averaged: weekly/bi-weekly pay x 4.3 = monthly average (Rule §2.C.6.g.i) - -### 3b. Earned Income Included (Rule Section 2.C.3) -- Wages, salaries, commissions, fees, tips, piece-rate payments -- Self-employment income (net after IRS-deductible business expenses) -- Income from boarders/roomers -- Income from rental property ownership -- Training allowances/stipends exceeding expenses - -### 3c. Unearned Income Included (Rule Section 2.C.4) -- Pensions, retirement benefits, Social Security -- Disability insurance, SSI, TANF -- Veterans benefits, military allotments -- Unemployment insurance, worker's compensation -- Interest, dividends, royalties, trusts -- Child support and alimony -- Capital gains -- Lottery/gambling winnings - -### 3d. Income Excluded (Rule Section 2.C.5) -- LIHEAP/energy assistance -- WIOA/AmeriCorps summer youth payments -- WIC vouchers -- Federal EITC (whether advanced or lump sum) -- Title IV Higher Education Act educational assistance (Pell, SEOG, student loans, etc.) -- Foster care payments -- SNAP/food stamps -- Nonrecurring lump sum payments (tax refunds, retroactive SS/SSI) -- Earned income of students 19 or younger in elementary/secondary school -- Loans with repayment terms -- Non-cash employer benefits (shelter, food, clothing) -- Housing allotment for military families with deployed parent -- Certain vendor payments paid directly to third parties - ---- - -## 4. Parent Fee (Copayment) Structure - -### 4a. Fee Assessment Rules (Rule Section 5) -- Parent Fee = weekly dollar amount based on family size, eligibility income, and SMI percentage -- Fee does NOT vary with number of children, amount of care, or type of provider -- Fees rounded down to nearest dollar -- All fees paid directly to provider by parent -- Total fees cannot exceed: - - **7% of Eligibility Income** for families below 85% SMI - - **10% of Eligibility Income** for families between 85-125% SMI -- Families below **30% SMI** pay **$0** (no copay) - -### 4b. Parent Fee Schedule (Rule Section 5.B.1) - -| SMI % Range | Maximum Parent Fee % of Eligibility Income | -|---|---| -| Under 30% | 0% | -| 30% - 34.999% | 1% | -| 35% - 39.999% | 2% | -| 40% - 44.999% | 3% | -| 45% - 54.999% | 4% | -| 55% - 64.999% | 5% | -| 65% - 74.999% | 6% | -| 75% - 89.999% | 7% | -| 90% - 99.999% | 8% | -| 100% - 109.999% | 9% | -| 110% - 125% | 10% | - -- Source: Rule Section 5.B.1 (page 27 of full rule PDF) -- Detailed dollar amounts by family size: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/Family%20Co-Payment%20Fee%20Assessment%20Information.pdf - - Local: `/tmp/me-ccap-copay-fee.pdf` (2 pages) - - Effective 5/19/2025 - -### 4c. QRIS Quality Discount on Parent Fee (Rule Section 5.A.3) -- Second highest QRIS level (Star 4): **10% reduction** in Parent Fee -- Highest QRIS level (Star 5): **20% reduction** in Parent Fee - ---- - -## 5. Market Rates (Provider Reimbursement) - -### 5a. Rate Structure -- Rates vary by: county, age group, provider type, and hours -- Three provider type categories: - 1. Licensed Child Care Center - 2. Licensed Family Child Care - 3. License-Exempt Child Care -- Two time categories (effective 5/19/2025): - - Full time: 30-50 hours/week - - Part time: 1-29 hours/week - -### 5b. Age Groups -- **Infant**: 6 weeks through 12 months -- **Toddler**: 12 months + 1 day through 36 months -- **Preschool**: 3 years + 1 day to age 5, not yet in kindergarten -- **School Age**: 5 years + 1 day through 13 years (19 for special needs) - -### 5c. Geographic Regions (2 regions since July 2024) -- **Region 1**: Cumberland, Sagadahoc, York counties -- **Region 2**: All other counties (Androscoggin, Aroostook, Franklin, Hancock, Kennebec, Knox, Lincoln, Oxford, Penobscot, Piscataquis, Somerset, Waldo, Washington) - -### 5d. May 19, 2025 Market Rates - -**Region 2 (most counties) - Licensed Child Care Center:** - -| Age | Full Time | Part Time | -|---|---|---| -| Infant | $275.00 | $206.25 | -| Toddler | $250.00 | $187.50 | -| Preschool | $244.00 | $183.00 | -| School Age | $180.00 | $144.47 | - -**Region 1 (Cumberland, Sagadahoc, York) - Licensed Child Care Center:** - -| Age | Full Time | Part Time | -|---|---|---| -| Infant | $330.00 | $247.50 | -| Toddler | $320.00 | $240.00 | -| Preschool | $300.00 | $225.00 | -| School Age | $214.00 | $171.76 | - -**Region 2 - Licensed Family Child Care:** - -| Age | Full Time | Part Time | -|---|---|---| -| Infant | $210.00 | $157.50 | -| Toddler | $200.00 | $150.00 | -| Preschool | $190.00 | $142.50 | -| School Age | $170.00 | $136.45 | - -**Region 1 - Licensed Family Child Care:** - -| Age | Full Time | Part Time | -|---|---|---| -| Infant | $245.00 | $183.75 | -| Toddler | $230.77 | $173.08 | -| Preschool | $225.00 | $168.75 | -| School Age | $175.00 | $140.46 | - -**Region 2 - License-Exempt:** - -| Age | Full Time | Part Time | -|---|---|---| -| Infant | $147.00 | $110.25 | -| Toddler | $140.00 | $105.00 | -| Preschool | $133.00 | $99.75 | -| School Age | $119.00 | $95.51 | - -**Region 1 - License-Exempt:** - -| Age | Full Time | Part Time | -|---|---|---| -| Infant | $171.50 | $128.63 | -| Toddler | $161.54 | $121.15 | -| Preschool | $157.50 | $118.13 | -| School Age | $122.50 | $98.33 | - -- Source: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/5.19.25%20Child%20Care%20Market%20Rates.pdf -- Local: `/tmp/me-ccap-market-rates-2025-05.pdf` (3 pages) -- Verified via 300 DPI screenshots: `/tmp/me-ccap-market-rates-2025-05-{1,2,3}.png` - -Note: Some counties have specific exceptions (e.g., Kennebec preschool center is $267.00 full time, Knox/Washington/Waldo school-age center is $220.00 full time). See full rate table for county-specific variations. - -### 5e. QRIS Quality Differential on Provider Rates -- Star 3: +2% over standard payment -- Star 4: +5% over standard payment -- Star 5: +10% over standard payment - -### 5f. July 2024 Market Rates (prior schedule) -- Source: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/July%206%202024%20Market%20Rates_5_0.pdf -- Local: `/tmp/me-ccap-market-rates-2024-07.pdf` -- Had 4 time categories: Full Time (30+hrs), Part Time (20-29hrs), Half Time (10-19hrs), Quarter Time (1-9hrs) -- Simplified to 2 categories (Full/Part) in May 2025 rules - ---- - -## 6. Benefit Calculation - -### Formula -``` -CCAP Payment = Market Rate - Parent Fee -``` - -Where: -- **Market Rate** = set by Department based on child age, county, hours, provider type -- **Parent Fee** = weekly dollar amount from fee schedule based on family SMI % and family size -- Parent Fee is the same regardless of number of children - -### Payment Flow -1. Determine family size and eligibility income -2. Calculate family's SMI percentage: (Weekly Eligibility Income / Weekly 100% SMI for family size) -3. Look up Parent Fee percentage from schedule (0%-10%) -4. Calculate weekly Parent Fee: floor(Weekly Income x Fee %) — rounded down to nearest dollar -5. Apply QRIS discount if applicable (10% or 20% reduction for Star 4/5) -6. CCAP Payment to provider = Market Rate - Parent Fee -7. If Parent Fee >= Market Rate, family is ineligible (Rule §5.A.4) - -### Key Rules -- Youngest child is always "first child enrolled" for multi-child families -- Total parent fees cannot exceed 10% of gross income for all children -- Payment is per-enrollment (prospective), not per-attendance (retroactive) as of 2025 -- Award period: minimum 12 months (federal requirement, 45 CFR §98.21) - ---- - -## 7. Enrollment Hours - -- Two levels: Part time (1-29 hrs/week) or Full time (30-50 hrs/week) -- Based on parent's employment/education/training hours + transportation time -- Self-employed: monthly net income / state minimum wage / 4.3 = weekly hours -- Maximum 50 hours per child per week - ---- - -## 8. Key Program Dates / Timeline - -| Date | Change | -|---|---| -| July 1, 2024 | Income eligibility expanded from 85% SMI to 125% SMI | -| July 6, 2024 | New market rates (10 regions consolidated to 2) | -| October 19, 2024 | Updated income guidelines effective | -| May 19, 2025 | Emergency rule effective; new market rates; copay schedule effective | -| August 18, 2025 | Permanent rule (10-148 CMR Ch. 6) effective | -| September 24, 2025 | License-exempt provider expansion (up to 4 children if 2+ siblings) | -| By 2030 | Expansion to 250% SMI eligibility, 7% copay cap for all (22 MRSA §3740-E) | - ---- - -## 9. Source Documents (Local Copies) - -| Document | Local Path | Pages | -|---|---|---| -| CCAP Full Rule (8/18/2025) | `/tmp/me-ccap-full-rule.pdf` | 57 | -| Income Guidelines (10/19/2024) | `/tmp/me-ccap-income-guidelines.pdf` | 1 | -| Co-Payment Fee Assessment (5/19/2025) | `/tmp/me-ccap-copay-fee.pdf` | 2 | -| Market Rates (5/19/2025) | `/tmp/me-ccap-market-rates-2025-05.pdf` | 3 | -| Market Rates (7/6/2024) | `/tmp/me-ccap-market-rates-2024-07.pdf` | multi | -| 85%/125% SMI Comparison | `/tmp/me-ccap-85-125-comparison.pdf` | 1 | -| Facts about CCAP | `/tmp/me-ccap-facts.pdf` | 1 | - ---- - -## 10. Web Sources - -- CCAP main page: https://www.maine.gov/dhhs/ocfs/support-for-families/child-care/paying-for-child-care -- Provider resources: https://www.maine.gov/dhhs/ocfs/provider-resources/child-care-subsidy-information-for-providers -- Rulemaking page: https://www1.maine.gov/dhhs/about/rulemaking/10-148-cmr-ch-6-child-care-affordability-program-rules-2025-08-13 -- QRIS (Rising Stars): https://www.maine.gov/dhhs/ocfs/support-for-families/child-care/qris -- ASPIRE-TANF rule: https://www.maine.gov/dhhs/about/rulemaking/aspire-tanf-rule-29-ld-1748-2025-04-30 -- Market rate survey report: https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/2024%20Maine%20OCFS%20Child%20Care%20Market%20Rate%20Survey%20Final%20Report_1.pdf diff --git a/uv.lock b/uv.lock index efec4d8555d..7adaf13620b 100644 --- a/uv.lock +++ b/uv.lock @@ -1492,7 +1492,7 @@ wheels = [ [[package]] name = "policyengine-us" -version = "1.592.1" +version = "1.598.0" source = { editable = "." } dependencies = [ { name = "microdf-python" }, From 421c12fd321898be461db360166db52e74c6cb1c Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 16 Mar 2026 01:49:43 -0400 Subject: [PATCH 8/8] fix --- .../ccap/market_rate/licensed_center.yaml | 8 +- .../dhhs/ccap/copay/me_ccap_parent_fee.yaml | 34 ++++---- .../ccap/copay/me_ccap_smi_percentage.yaml | 82 ------------------- .../ccap/eligibility/me_ccap_eligible.yaml | 26 ++++++ .../ccap/payment/me_ccap_market_rate.yaml | 63 +++++++++++++- .../gov/states/me/dhhs/tanf/integration.yaml | 14 ++-- .../tanf/me_tanf_child_care_deduction.yaml | 10 +-- .../me/dhhs/ccap/copay/me_ccap_parent_fee.py | 3 +- .../dhhs/ccap/copay/me_ccap_smi_percentage.py | 22 ----- 9 files changed, 119 insertions(+), 143 deletions(-) delete mode 100644 policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/copay/me_ccap_smi_percentage.yaml delete mode 100644 policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_smi_percentage.py diff --git a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml index 9d013b0689c..36274c24a8f 100644 --- a/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml +++ b/policyengine_us/parameters/gov/states/me/dhhs/ccap/market_rate/licensed_center.yaml @@ -114,10 +114,8 @@ KENNEBEC: PRESCHOOL: FULL_TIME: 2024-07-06: 267 - 2025-05-19: 244 PART_TIME: 2024-07-06: 200.25 - 2025-05-19: 183 HALF_TIME: 2024-07-06: 133.50 QUARTER_TIME: @@ -162,10 +160,9 @@ KNOX_WALDO: SCHOOL_AGE: FULL_TIME: 2024-07-06: 220 - 2025-05-19: 180 PART_TIME: 2024-07-06: 165 - 2025-05-19: 135 + 2025-05-19: 176.58 HALF_TIME: 2024-07-06: 110 QUARTER_TIME: @@ -201,10 +198,9 @@ PENOBSCOT: SCHOOL_AGE: FULL_TIME: 2024-07-06: 200 - 2025-05-19: 180 PART_TIME: 2024-07-06: 150 - 2025-05-19: 135 + 2025-05-19: 160.53 HALF_TIME: 2024-07-06: 100 QUARTER_TIME: diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.yaml index 13601799f32..017ddf80347 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.yaml @@ -1,4 +1,4 @@ -# Parent fee tests use me_ccap_smi_percentage and me_ccap_countable_income +# Parent fee tests use me_ccap_smi and me_ccap_countable_income # as direct inputs to isolate the copay calculation from income pipeline. - name: Case 1, below 30% SMI, zero copay. @@ -11,7 +11,7 @@ spm_units: spm_unit: members: [person1] - me_ccap_smi_percentage: 0.195 + me_ccap_smi: 6_410.26 me_ccap_countable_income: 1_250 households: household: @@ -31,7 +31,7 @@ spm_units: spm_unit: members: [person1] - me_ccap_smi_percentage: 0.32 + me_ccap_smi: 6_417.97 me_ccap_countable_income: 2_053.75 households: household: @@ -53,7 +53,7 @@ spm_units: spm_unit: members: [person1] - me_ccap_smi_percentage: 0.50 + me_ccap_smi: 6_418 me_ccap_countable_income: 3_209 households: household: @@ -75,7 +75,7 @@ spm_units: spm_unit: members: [person1] - me_ccap_smi_percentage: 0.80 + me_ccap_smi: 6_418.02 me_ccap_countable_income: 5_134.42 households: household: @@ -99,7 +99,7 @@ spm_units: spm_unit: members: [person1] - me_ccap_smi_percentage: 1.15 + me_ccap_smi: 6_417.97 me_ccap_countable_income: 7_380.67 households: household: @@ -124,7 +124,7 @@ spm_units: spm_unit: members: [person1] - me_ccap_smi_percentage: 0.37 + me_ccap_smi: 6_690.54 me_ccap_countable_income: 2_475.50 households: household: @@ -148,7 +148,7 @@ spm_units: spm_unit: members: [person1] - me_ccap_smi_percentage: 0.42 + me_ccap_smi: 6_690.48 me_ccap_countable_income: 2_810 households: household: @@ -172,7 +172,7 @@ spm_units: spm_unit: members: [person1] - me_ccap_smi_percentage: 0.60 + me_ccap_smi: 6_690.42 me_ccap_countable_income: 4_014.25 households: household: @@ -196,7 +196,7 @@ spm_units: spm_unit: members: [person1] - me_ccap_smi_percentage: 0.70 + me_ccap_smi: 6_690.36 me_ccap_countable_income: 4_683.25 households: household: @@ -220,7 +220,7 @@ spm_units: spm_unit: members: [person1] - me_ccap_smi_percentage: 0.95 + me_ccap_smi: 6_690.35 me_ccap_countable_income: 6_355.83 households: household: @@ -245,7 +245,7 @@ spm_units: spm_unit: members: [person1] - me_ccap_smi_percentage: 1.05 + me_ccap_smi: 6_690.35 me_ccap_countable_income: 7_024.87 households: household: @@ -270,7 +270,7 @@ spm_units: spm_unit: members: [person1] - me_ccap_smi_percentage: 0.8501 + me_ccap_smi: 6_690.39 me_ccap_countable_income: 5_687.50 households: household: @@ -295,7 +295,7 @@ spm_units: spm_unit: members: [person1] - me_ccap_smi_percentage: 0.8491 + me_ccap_smi: 6_689.53 me_ccap_countable_income: 5_680.08 households: household: @@ -320,7 +320,7 @@ spm_units: spm_unit: members: [person1] - me_ccap_smi_percentage: 0 + me_ccap_smi: 0 me_ccap_countable_income: 0 households: household: @@ -340,7 +340,7 @@ spm_units: spm_unit: members: [person1] - me_ccap_smi_percentage: 0.3001 + me_ccap_smi: 6_690.54 me_ccap_countable_income: 2_007.83 households: household: @@ -365,7 +365,7 @@ spm_units: spm_unit: members: [person1] - me_ccap_smi_percentage: 0.2998 + me_ccap_smi: 6_690.29 me_ccap_countable_income: 2_005.75 households: household: diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/copay/me_ccap_smi_percentage.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/copay/me_ccap_smi_percentage.yaml deleted file mode 100644 index 760954950e5..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/copay/me_ccap_smi_percentage.yaml +++ /dev/null @@ -1,82 +0,0 @@ -# Tests for me_ccap_smi_percentage edge cases. -# SMI for ME size 2 (2025-10-01) = 118,065 * 0.68 = $80,284.20/yr = $6,690.35/mo. -# Use me_ccap_countable_income as direct input to isolate SMI percentage calculation. - -- name: Case 1, zero income, zero percentage. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 30 - person2: - age: 4 - spm_units: - spm_unit: - members: [person1, person2] - me_ccap_countable_income: 0 - tax_units: - tax_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: ME - output: - # income = 0, SMI = $6,690.35/mo. - # 0 / 6690.35 = 0. - me_ccap_smi_percentage: 0 - -- name: Case 2, income at 50% SMI. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 30 - person2: - age: 4 - spm_units: - spm_unit: - members: [person1, person2] - # 50% of $80,284.20/yr = $40,142.10/yr => monthly = $3,345.18. - me_ccap_countable_income: 3_345.18 - tax_units: - tax_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: ME - output: - # Monthly income = 3345.18. - # Monthly SMI = 80284.20/12 = 6690.35. - # 3345.18 / 6690.35 = 0.5000. - me_ccap_smi_percentage: 0.5000 - -- name: Case 3, income at 125% SMI. - period: 2026-01 - absolute_error_margin: 0.001 - input: - people: - person1: - age: 30 - person2: - age: 4 - spm_units: - spm_unit: - members: [person1, person2] - # 125% of $80,284.20/yr = $100,355.25/yr => monthly = $8,362.94. - me_ccap_countable_income: 8_362.94 - tax_units: - tax_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: ME - output: - # Monthly income = 8362.94. - # Monthly SMI = 6690.35. - # 8362.94 / 6690.35 = 1.2500. - me_ccap_smi_percentage: 1.2500 diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.yaml index 412b400c4d4..ec43a651c36 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/eligibility/me_ccap_eligible.yaml @@ -97,3 +97,29 @@ state_code: ME output: me_ccap_eligible: false + +- name: Case 5, activity ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + spm_units: + spm_unit: + members: [person1, person2] + me_ccap_income_eligible: true + is_ccdf_asset_eligible: true + me_ccap_activity_eligible: false + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: ME + output: + me_ccap_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_market_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_market_rate.yaml index ec30321814a..0b57be51c58 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_market_rate.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/ccap/payment/me_ccap_market_rate.yaml @@ -952,7 +952,7 @@ # Knox/Waldo Licensed Center School Age FT = $220/week (2024 rate) me_ccap_market_rate: [220] -- name: Case 51, Knox Licensed Center School Age FT 2025 rate converges to Region 2. +- name: Case 51, Knox Licensed Center School Age FT 2025 rate retained. period: 2026-01 absolute_error_margin: 0.01 input: @@ -968,5 +968,62 @@ state_code: ME me_ccap_region: KNOX_WALDO output: - # Knox/Waldo Licensed Center School Age FT = $180/week (converged to Region 2) - me_ccap_market_rate: [180] + # Knox/Waldo Licensed Center School Age FT = $220/week (retains unique rate per May 2025 PDF) + me_ccap_market_rate: [220] + +- name: Case 52, Kennebec Licensed Center Preschool FT 2025 rate retained. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: PRESCHOOL + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSED_CENTER + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: KENNEBEC + output: + # Kennebec Licensed Center Preschool FT = $267/week (retains unique rate per May 2025 PDF) + me_ccap_market_rate: [267] + +- name: Case 53, Penobscot Licensed Center School Age FT 2024 rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: SCHOOL_AGE + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSED_CENTER + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: PENOBSCOT + output: + # Penobscot Licensed Center School Age FT = $200/week (2024 rate) + me_ccap_market_rate: [200] + +- name: Case 54, Penobscot Licensed Center School Age FT 2025 rate retained. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + me_ccap_age_group: SCHOOL_AGE + me_ccap_time_category: FULL_TIME + me_ccap_provider_type: LICENSED_CENTER + me_ccap_eligible_child: true + households: + household: + members: [person1] + state_code: ME + me_ccap_region: PENOBSCOT + output: + # Penobscot Licensed Center School Age FT = $200/week (retains unique rate per May 2025 PDF) + me_ccap_market_rate: [200] diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/tanf/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/tanf/integration.yaml index a3084b58c0e..74d9bd37273 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/tanf/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/tanf/integration.yaml @@ -23,7 +23,7 @@ spm_units: spm_unit: members: [person1, person2, person3] - spm_unit_pre_subsidy_childcare_expenses: 4_200 # $350/month child care + childcare_expenses: 4_200 # $350/month child care tax_units: tax_unit: members: [person1, person2, person3] @@ -317,7 +317,7 @@ spm_units: spm_unit: members: [person1, person2] - spm_unit_pre_subsidy_childcare_expenses: 3_600 # $300/month child care + childcare_expenses: 3_600 # $300/month child care tax_units: tax_unit: members: [person1, person2] @@ -474,7 +474,7 @@ spm_units: spm_unit: members: [person1, person2] - spm_unit_pre_subsidy_childcare_expenses: 2_400 # $200/month + childcare_expenses: 2_400 # $200/month tax_units: tax_unit: members: [person1, person2] @@ -588,7 +588,7 @@ spm_units: spm_unit: members: [person1, person2] - spm_unit_pre_subsidy_childcare_expenses: 2_400 # $200/month + childcare_expenses: 2_400 # $200/month tax_units: tax_unit: members: [person1, person2] @@ -710,7 +710,7 @@ spm_units: spm_unit: members: [person1, person2, person3, person4] - spm_unit_pre_subsidy_childcare_expenses: 6_000 # $500/month + childcare_expenses: 6_000 # $500/month tax_units: tax_unit: members: [person1, person2, person3, person4] @@ -832,7 +832,7 @@ spm_units: spm_unit: members: [person1, person2, person3, person4] - spm_unit_pre_subsidy_childcare_expenses: 9_600 # $800/month child care + childcare_expenses: 9_600 # $800/month child care tax_units: tax_unit: members: [person1, person2, person3, person4] @@ -887,7 +887,7 @@ spm_units: spm_unit: members: [person1, person2, person3] - spm_unit_pre_subsidy_childcare_expenses: 6_000 # $500/month + childcare_expenses: 6_000 # $500/month tax_units: tax_unit: members: [person1, person2, person3] diff --git a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/tanf/me_tanf_child_care_deduction.yaml b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/tanf/me_tanf_child_care_deduction.yaml index 02564e168e1..fdd18614a45 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/tanf/me_tanf_child_care_deduction.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/me/dhhs/tanf/me_tanf_child_care_deduction.yaml @@ -22,7 +22,7 @@ spm_units: spm_unit: members: [adult, infant, toddler, child_at_boundary, school_age, disabled_child] - spm_unit_pre_subsidy_childcare_expenses: 12_000 # $1,000/month (above total limit) + childcare_expenses: 12_000 # $1,000/month (above total limit) households: household: members: [adult, infant, toddler, child_at_boundary, school_age, disabled_child] @@ -46,7 +46,7 @@ spm_units: spm_unit: members: [adult, child1, child2] - spm_unit_pre_subsidy_childcare_expenses: 2_400 # $200/month (below $375 limit) + childcare_expenses: 2_400 # $200/month (below $375 limit) households: household: members: [adult, child1, child2] @@ -69,7 +69,7 @@ spm_units: spm_unit: members: [adult, child1, child2] - spm_unit_pre_subsidy_childcare_expenses: 4_500 # $375/month (exactly at limit) + childcare_expenses: 4_500 # $375/month (exactly at limit) households: household: members: [adult, child1, child2] @@ -90,7 +90,7 @@ spm_units: spm_unit: members: [adult1, adult2] - spm_unit_pre_subsidy_childcare_expenses: 6_000 # $500/month + childcare_expenses: 6_000 # $500/month households: household: members: [adult1, adult2] @@ -110,7 +110,7 @@ spm_units: spm_unit: members: [adult, child] - spm_unit_pre_subsidy_childcare_expenses: 0 + childcare_expenses: 0 households: household: members: [adult, child] diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.py index 3a5ff6a1045..e144b30a4cb 100644 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.py +++ b/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_parent_fee.py @@ -15,8 +15,9 @@ class me_ccap_parent_fee(Variable): def formula(spm_unit, period, parameters): p = parameters(period).gov.states.me.dhhs.ccap.copay - smi_percentage = spm_unit("me_ccap_smi_percentage", period) countable_income = spm_unit("me_ccap_countable_income", period) + monthly_smi = spm_unit("me_ccap_smi", period) + smi_percentage = where(monthly_smi > 0, countable_income / monthly_smi, 0) weekly_income = countable_income * MONTHS_IN_YEAR / WEEKS_IN_YEAR fee_rate = p.rate.calc(smi_percentage) diff --git a/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_smi_percentage.py b/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_smi_percentage.py deleted file mode 100644 index 7113300762a..00000000000 --- a/policyengine_us/variables/gov/states/me/dhhs/ccap/copay/me_ccap_smi_percentage.py +++ /dev/null @@ -1,22 +0,0 @@ -from policyengine_us.model_api import * - - -class me_ccap_smi_percentage(Variable): - value_type = float - entity = SPMUnit - label = "Maine CCAP income as percentage of SMI" - unit = "/1" - definition_period = MONTH - defined_for = StateCode.ME - reference = "https://www.maine.gov/dhhs/sites/maine.gov.dhhs/files/inline-files/CCAP%20Full%20Rule%208.18.2025_1.pdf#page=27" - - def formula(spm_unit, period, parameters): - countable_income = spm_unit("me_ccap_countable_income", period) - monthly_smi = spm_unit("me_ccap_smi", period) - mask = monthly_smi > 0 - return np.divide( - countable_income, - monthly_smi, - out=np.zeros_like(countable_income), - where=mask, - )