From 04d7239c7155dd6efb418ae0dfcf414703904ed4 Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 21 May 2026 17:24:38 -0400 Subject: [PATCH 1/3] Add Arizona child care assistance program --- changelog.d/added/8370.md | 1 + .../hhs/ccdf/child_care_subsidy_programs.yaml | 1 + .../household/household_state_benefits.yaml | 4 + .../az/hhs/ccap/age_group/infant_max.yaml | 12 ++ .../az/hhs/ccap/age_group/preschool_max.yaml | 12 ++ .../az/hhs/ccap/age_group/toddler_max.yaml | 12 ++ .../gov/states/az/hhs/ccap/copay/daily.yaml | 29 ++++ .../hhs/ccap/eligibility/child_age_limit.yaml | 12 ++ .../ccap/income/countable_income/sources.yaml | 31 ++++ .../az/hhs/ccap/income/max_family_size.yaml | 12 ++ .../az/hhs/ccap/income/threshold/level_1.yaml | 39 ++++++ .../az/hhs/ccap/income/threshold/level_2.yaml | 39 ++++++ .../az/hhs/ccap/income/threshold/level_3.yaml | 39 ++++++ .../az/hhs/ccap/income/threshold/level_4.yaml | 39 ++++++ .../az/hhs/ccap/income/threshold/level_5.yaml | 39 ++++++ .../az/hhs/ccap/income/threshold/level_6.yaml | 39 ++++++ .../az/hhs/ccap/income/threshold/level_7.yaml | 39 ++++++ .../gov/states/az/hhs/ccap/rates/center.yaml | 21 +++ .../az/hhs/ccap/rates/certified_family.yaml | 21 +++ .../states/az/hhs/ccap/rates/group_home.yaml | 21 +++ .../az/hhs/ccap/rates/quality_multiplier.yaml | 14 ++ .../states/az/hhs/ccap/rates/relative.yaml | 21 +++ .../az/hhs/ccap/rates/special_needs.yaml | 15 ++ .../hhs/ccap/school_age_summer/end_month.yaml | 11 ++ .../ccap/school_age_summer/start_month.yaml | 12 ++ .../gov/states/az/hhs/ccap/az_ccap.yaml | 69 +++++++++ .../gov/states/az/hhs/ccap/az_ccap_copay.yaml | 66 +++++++++ .../az/hhs/ccap/az_ccap_daily_rate.yaml | 67 +++++++++ .../az/hhs/ccap/income/az_ccap_fee_level.yaml | 63 +++++++++ .../ccap/income/az_ccap_income_eligible.yaml | 65 +++++++++ .../gov/states/az/hhs/ccap/integration.yaml | 132 ++++++++++++++++++ .../states/az/hhs/az_child_care_subsidies.py | 11 ++ .../gov/states/az/hhs/ccap/az_ccap.py | 20 +++ .../states/az/hhs/ccap/az_ccap_age_group.py | 43 ++++++ .../gov/states/az/hhs/ccap/az_ccap_copay.py | 27 ++++ .../az/hhs/ccap/az_ccap_copay_exempt.py | 23 +++ .../states/az/hhs/ccap/az_ccap_daily_rate.py | 46 ++++++ .../states/az/hhs/ccap/az_ccap_enrolled.py | 9 ++ .../az/hhs/ccap/az_ccap_max_reimbursement.py | 19 +++ .../az/hhs/ccap/az_ccap_provider_type.py | 19 +++ .../ccap/az_ccap_quality_enhanced_provider.py | 13 ++ .../hhs/ccap/az_ccap_special_needs_child.py | 18 +++ .../eligibility/az_ccap_activity_eligible.py | 22 +++ .../hhs/ccap/eligibility/az_ccap_eligible.py | 17 +++ .../eligibility/az_ccap_eligible_child.py | 19 +++ .../ccap/income/az_ccap_countable_income.py | 12 ++ .../az/hhs/ccap/income/az_ccap_fee_level.py | 29 ++++ .../ccap/income/az_ccap_income_eligible.py | 15 ++ .../hhs/ccap/income/az_ccap_income_limit.py | 22 +++ sources/working_references.md | 94 +++++++++++++ 50 files changed, 1475 insertions(+) create mode 100644 changelog.d/added/8370.md create mode 100644 policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/infant_max.yaml create mode 100644 policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/preschool_max.yaml create mode 100644 policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/toddler_max.yaml create mode 100644 policyengine_us/parameters/gov/states/az/hhs/ccap/copay/daily.yaml create mode 100644 policyengine_us/parameters/gov/states/az/hhs/ccap/eligibility/child_age_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/az/hhs/ccap/income/countable_income/sources.yaml create mode 100644 policyengine_us/parameters/gov/states/az/hhs/ccap/income/max_family_size.yaml create mode 100644 policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_1.yaml create mode 100644 policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_2.yaml create mode 100644 policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_3.yaml create mode 100644 policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_4.yaml create mode 100644 policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_5.yaml create mode 100644 policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_6.yaml create mode 100644 policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_7.yaml create mode 100644 policyengine_us/parameters/gov/states/az/hhs/ccap/rates/center.yaml create mode 100644 policyengine_us/parameters/gov/states/az/hhs/ccap/rates/certified_family.yaml create mode 100644 policyengine_us/parameters/gov/states/az/hhs/ccap/rates/group_home.yaml create mode 100644 policyengine_us/parameters/gov/states/az/hhs/ccap/rates/quality_multiplier.yaml create mode 100644 policyengine_us/parameters/gov/states/az/hhs/ccap/rates/relative.yaml create mode 100644 policyengine_us/parameters/gov/states/az/hhs/ccap/rates/special_needs.yaml create mode 100644 policyengine_us/parameters/gov/states/az/hhs/ccap/school_age_summer/end_month.yaml create mode 100644 policyengine_us/parameters/gov/states/az/hhs/ccap/school_age_summer/start_month.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_copay.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_daily_rate.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_fee_level.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_income_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/integration.yaml create mode 100644 policyengine_us/variables/gov/states/az/hhs/az_child_care_subsidies.py create mode 100644 policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap.py create mode 100644 policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_age_group.py create mode 100644 policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_copay.py create mode 100644 policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_copay_exempt.py create mode 100644 policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_daily_rate.py create mode 100644 policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_enrolled.py create mode 100644 policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_max_reimbursement.py create mode 100644 policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_provider_type.py create mode 100644 policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_quality_enhanced_provider.py create mode 100644 policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_special_needs_child.py create mode 100644 policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.py create mode 100644 policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible.py create mode 100644 policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible_child.py create mode 100644 policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_countable_income.py create mode 100644 policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_fee_level.py create mode 100644 policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_income_eligible.py create mode 100644 policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_income_limit.py create mode 100644 sources/working_references.md diff --git a/changelog.d/added/8370.md b/changelog.d/added/8370.md new file mode 100644 index 00000000000..00fbfb6aa6a --- /dev/null +++ b/changelog.d/added/8370.md @@ -0,0 +1 @@ +Add the Arizona Child Care Assistance Program. diff --git a/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml b/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml index ed0f0a42c7d..6f17a569fb4 100644 --- a/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml +++ b/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml @@ -2,6 +2,7 @@ description: The federal government counts these state programs as child care su values: 2021-01-01: - ak_child_care_subsidies # Alaska Child Care Assistance Program (PASS) + - az_child_care_subsidies # Arizona Child Care Assistance Program - ca_child_care_subsidies # California Child Care - co_child_care_subsidies # Colorado Child Care Assistance Program - ct_child_care_subsidies # Connecticut Care 4 Kids diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index b74241a36b5..d76c6319ef2 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -34,6 +34,8 @@ values: - al_ssp # Alaska benefits - ak_ssp + # Arizona benefits + - az_child_care_subsidies # Florida benefits - fl_oss # Idaho benefits @@ -101,6 +103,8 @@ values: - al_ssp # Alaska benefits - ak_ssp + # Arizona benefits + - az_child_care_subsidies # Florida benefits - fl_oss # Idaho benefits diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/infant_max.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/infant_max.yaml new file mode 100644 index 00000000000..4413a2007a8 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/infant_max.yaml @@ -0,0 +1,12 @@ +description: Arizona limits child age to this threshold under the Child Care Assistance Program. +values: + 2025-11-01: 1 + +metadata: + unit: year + period: year + label: Arizona CCAP infant age group maximum age + reference: + - title: Arizona DES Maximum Reimbursement Rates for Child Care + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/preschool_max.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/preschool_max.yaml new file mode 100644 index 00000000000..5ced7b8f453 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/preschool_max.yaml @@ -0,0 +1,12 @@ +description: Arizona limits child age to this threshold under the Child Care Assistance Program. +values: + 2025-11-01: 6 + +metadata: + unit: year + period: year + label: Arizona CCAP age 3-5 age group maximum age + reference: + - title: Arizona DES Maximum Reimbursement Rates for Child Care + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/toddler_max.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/toddler_max.yaml new file mode 100644 index 00000000000..85d6cd56d7e --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/toddler_max.yaml @@ -0,0 +1,12 @@ +description: Arizona limits child age to this threshold under the Child Care Assistance Program. +values: + 2025-11-01: 3 + +metadata: + unit: year + period: year + label: Arizona CCAP age 1-2 age group maximum age + reference: + - title: Arizona DES Maximum Reimbursement Rates for Child Care + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/copay/daily.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/copay/daily.yaml new file mode 100644 index 00000000000..b9ea117a8ce --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/copay/daily.yaml @@ -0,0 +1,29 @@ +description: Arizona provides this amount as the daily copay under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: day + label: Arizona CCAP daily copay by fee level + breakdown: + - range(0,8) + breakdown_labels: + - Fee level + reference: + - title: Arizona DES Child Care Assistance Gross Monthly Income Eligibility Chart and Fee Schedule FFY 2026 + href: https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1 +0: + 2025-10-01: 0 +1: + 2025-10-01: 0.5 +2: + 2025-10-01: 0.5 +3: + 2025-10-01: 0.5 +4: + 2025-10-01: 1 +5: + 2025-10-01: 1.5 +6: + 2025-10-01: 2.5 +7: + 2025-10-01: 2.5 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/eligibility/child_age_limit.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/eligibility/child_age_limit.yaml new file mode 100644 index 00000000000..aca899a474b --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/eligibility/child_age_limit.yaml @@ -0,0 +1,12 @@ +description: Arizona limits child age to this threshold under the Child Care Assistance Program. +values: + 2025-10-01: 13 + +metadata: + unit: year + period: year + label: Arizona CCAP child age limit + reference: + - title: Arizona DES How to Apply for Child Care Assistance + href: https://des.az.gov/services/child-and-family/child-care/how-apply-for-child-care-assistance + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/countable_income/sources.yaml new file mode 100644 index 00000000000..f1dc2223b58 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/countable_income/sources.yaml @@ -0,0 +1,31 @@ +description: Arizona uses these income sources as countable income under the Child Care Assistance Program. +values: + 2025-10-01: + - employment_income + - self_employment_income + - sstb_self_employment_income + - farm_operations_income + - unemployment_compensation + - workers_compensation + - child_support_received + - alimony_income + - veterans_benefits + - pension_income + - retirement_distributions + - social_security + - disability_benefits + - interest_income + - dividend_income + - rental_income + - capital_gains + +metadata: + unit: list + period: year + label: Arizona CCAP countable income sources + reference: + - title: Arizona Administrative Code R6-5-4914 Income Eligibility + href: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=28 + - title: Arizona Administrative Code R6-5-4914 Excluded Income + href: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=31 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/income/max_family_size.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/max_family_size.yaml new file mode 100644 index 00000000000..06ef17aee17 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/max_family_size.yaml @@ -0,0 +1,12 @@ +description: Arizona limits family size to this threshold under the Child Care Assistance Program. +values: + 2025-10-01: 12 + +metadata: + unit: person + period: year + label: Arizona CCAP maximum income table family size + reference: + - title: Arizona DES Child Care Assistance Gross Monthly Income Eligibility Chart and Fee Schedule FFY 2026 + href: https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_1.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_1.yaml new file mode 100644 index 00000000000..f3bcb14e926 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_1.yaml @@ -0,0 +1,39 @@ +description: Arizona limits gross income to this amount under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: month + label: Arizona CCAP fee level 1 income threshold + breakdown: + - range(0,13) + breakdown_labels: + - Family size + reference: + - title: Arizona DES Child Care Assistance Gross Monthly Income Eligibility Chart and Fee Schedule FFY 2026 + href: https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1 +0: + 2025-10-01: 0 +1: + 2025-10-01: 1_110 +2: + 2025-10-01: 1_499 +3: + 2025-10-01: 1_888 +4: + 2025-10-01: 2_278 +5: + 2025-10-01: 2_668 +6: + 2025-10-01: 3_057 +7: + 2025-10-01: 3_447 +8: + 2025-10-01: 3_837 +9: + 2025-10-01: 4_226 +10: + 2025-10-01: 4_616 +11: + 2025-10-01: 5_005 +12: + 2025-10-01: 5_395 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_2.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_2.yaml new file mode 100644 index 00000000000..787b1870932 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_2.yaml @@ -0,0 +1,39 @@ +description: Arizona limits gross income to this amount under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: month + label: Arizona CCAP fee level 2 income threshold + breakdown: + - range(0,13) + breakdown_labels: + - Family size + reference: + - title: Arizona DES Child Care Assistance Gross Monthly Income Eligibility Chart and Fee Schedule FFY 2026 + href: https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1 +0: + 2025-10-01: 0 +1: + 2025-10-01: 1_305 +2: + 2025-10-01: 1_763 +3: + 2025-10-01: 2_221 +4: + 2025-10-01: 2_680 +5: + 2025-10-01: 3_138 +6: + 2025-10-01: 3_596 +7: + 2025-10-01: 4_055 +8: + 2025-10-01: 4_513 +9: + 2025-10-01: 4_971 +10: + 2025-10-01: 5_430 +11: + 2025-10-01: 5_888 +12: + 2025-10-01: 6_346 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_3.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_3.yaml new file mode 100644 index 00000000000..62f2d0f42d1 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_3.yaml @@ -0,0 +1,39 @@ +description: Arizona limits gross income to this amount under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: month + label: Arizona CCAP fee level 3 income threshold + breakdown: + - range(0,13) + breakdown_labels: + - Family size + reference: + - title: Arizona DES Child Care Assistance Gross Monthly Income Eligibility Chart and Fee Schedule FFY 2026 + href: https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1 +0: + 2025-10-01: 0 +1: + 2025-10-01: 1_762 +2: + 2025-10-01: 2_381 +3: + 2025-10-01: 2_999 +4: + 2025-10-01: 3_618 +5: + 2025-10-01: 4_237 +6: + 2025-10-01: 4_855 +7: + 2025-10-01: 5_475 +8: + 2025-10-01: 6_093 +9: + 2025-10-01: 6_711 +10: + 2025-10-01: 7_331 +11: + 2025-10-01: 7_949 +12: + 2025-10-01: 8_568 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_4.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_4.yaml new file mode 100644 index 00000000000..f6fd19ee667 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_4.yaml @@ -0,0 +1,39 @@ +description: Arizona limits gross income to this amount under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: month + label: Arizona CCAP fee level 4 income threshold + breakdown: + - range(0,13) + breakdown_labels: + - Family size + reference: + - title: Arizona DES Child Care Assistance Gross Monthly Income Eligibility Chart and Fee Schedule FFY 2026 + href: https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1 +0: + 2025-10-01: 0 +1: + 2025-10-01: 1_893 +2: + 2025-10-01: 2_557 +3: + 2025-10-01: 3_221 +4: + 2025-10-01: 3_886 +5: + 2025-10-01: 4_551 +6: + 2025-10-01: 5_215 +7: + 2025-10-01: 5_880 +8: + 2025-10-01: 6_544 +9: + 2025-10-01: 7_208 +10: + 2025-10-01: 7_874 +11: + 2025-10-01: 8_538 +12: + 2025-10-01: 9_202 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_5.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_5.yaml new file mode 100644 index 00000000000..3f5bba0e772 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_5.yaml @@ -0,0 +1,39 @@ +description: Arizona limits gross income to this amount under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: month + label: Arizona CCAP fee level 5 income threshold + breakdown: + - range(0,13) + breakdown_labels: + - Family size + reference: + - title: Arizona DES Child Care Assistance Gross Monthly Income Eligibility Chart and Fee Schedule FFY 2026 + href: https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1 +0: + 2025-10-01: 0 +1: + 2025-10-01: 2_023 +2: + 2025-10-01: 2_733 +3: + 2025-10-01: 3_443 +4: + 2025-10-01: 4_154 +5: + 2025-10-01: 4_864 +6: + 2025-10-01: 5_574 +7: + 2025-10-01: 6_286 +8: + 2025-10-01: 6_996 +9: + 2025-10-01: 7_706 +10: + 2025-10-01: 8_417 +11: + 2025-10-01: 9_127 +12: + 2025-10-01: 9_837 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_6.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_6.yaml new file mode 100644 index 00000000000..e0ca4e45098 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_6.yaml @@ -0,0 +1,39 @@ +description: Arizona limits gross income to this amount under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: month + label: Arizona CCAP fee level 6 income threshold + breakdown: + - range(0,13) + breakdown_labels: + - Family size + reference: + - title: Arizona DES Child Care Assistance Gross Monthly Income Eligibility Chart and Fee Schedule FFY 2026 + href: https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1 +0: + 2025-10-01: 0 +1: + 2025-10-01: 2_154 +2: + 2025-10-01: 2_909 +3: + 2025-10-01: 3_665 +4: + 2025-10-01: 4_422 +5: + 2025-10-01: 5_178 +6: + 2025-10-01: 5_934 +7: + 2025-10-01: 6_691 +8: + 2025-10-01: 7_447 +9: + 2025-10-01: 8_203 +10: + 2025-10-01: 8_960 +11: + 2025-10-01: 9_716 +12: + 2025-10-01: 10_471 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_7.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_7.yaml new file mode 100644 index 00000000000..d536774e5bf --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_7.yaml @@ -0,0 +1,39 @@ +description: Arizona limits gross income to this amount under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: month + label: Arizona CCAP fee level 7 income threshold + breakdown: + - range(0,13) + breakdown_labels: + - Family size + reference: + - title: Arizona DES Child Care Assistance Gross Monthly Income Eligibility Chart and Fee Schedule FFY 2026 + href: https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1 +0: + 2025-10-01: 0 +1: + 2025-10-01: 3_978 +2: + 2025-10-01: 5_202 +3: + 2025-10-01: 6_426 +4: + 2025-10-01: 7_649 +5: + 2025-10-01: 8_874 +6: + 2025-10-01: 10_098 +7: + 2025-10-01: 10_327 +8: + 2025-10-01: 10_557 +9: + 2025-10-01: 10_786 +10: + 2025-10-01: 11_015 +11: + 2025-10-01: 11_244 +12: + 2025-10-01: 11_474 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/center.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/center.yaml new file mode 100644 index 00000000000..74eb8b26658 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/center.yaml @@ -0,0 +1,21 @@ +description: Arizona provides this amount as the daily reimbursement rate under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: day + label: Arizona CCAP child care center daily reimbursement rate + breakdown: + - az_ccap_age_group + reference: + - title: Arizona DES Maximum Reimbursement Rates for Child Care + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 +INFANT: + 2025-11-01: 64.15 +TODDLER: + 2025-11-01: 48.70 +PRESCHOOL: + 2025-11-01: 42 +SCHOOL_AGE_SUMMER: + 2025-11-01: 35 +SCHOOL_AGE_SCHOOL_YEAR: + 2025-11-01: 25 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/certified_family.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/certified_family.yaml new file mode 100644 index 00000000000..37546899a3d --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/certified_family.yaml @@ -0,0 +1,21 @@ +description: Arizona provides this amount as the daily reimbursement rate under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: day + label: Arizona CCAP certified family or in-home daily reimbursement rate + breakdown: + - az_ccap_age_group + reference: + - title: Arizona DES Maximum Reimbursement Rates for Child Care + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 +INFANT: + 2025-11-01: 40 +TODDLER: + 2025-11-01: 30 +PRESCHOOL: + 2025-11-01: 30 +SCHOOL_AGE_SUMMER: + 2025-11-01: 25 +SCHOOL_AGE_SCHOOL_YEAR: + 2025-11-01: 20 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/group_home.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/group_home.yaml new file mode 100644 index 00000000000..78eabb7ee9d --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/group_home.yaml @@ -0,0 +1,21 @@ +description: Arizona provides this amount as the daily reimbursement rate under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: day + label: Arizona CCAP group home daily reimbursement rate + breakdown: + - az_ccap_age_group + reference: + - title: Arizona DES Maximum Reimbursement Rates for Child Care + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 +INFANT: + 2025-11-01: 40 +TODDLER: + 2025-11-01: 36 +PRESCHOOL: + 2025-11-01: 35 +SCHOOL_AGE_SUMMER: + 2025-11-01: 30 +SCHOOL_AGE_SCHOOL_YEAR: + 2025-11-01: 21 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/quality_multiplier.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/quality_multiplier.yaml new file mode 100644 index 00000000000..1dcb963de73 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/quality_multiplier.yaml @@ -0,0 +1,14 @@ +description: Arizona uses this share to increase provider rates under the Child Care Assistance Program. +values: + 2025-11-01: 1.4 + +metadata: + unit: /1 + period: year + label: Arizona CCAP quality enhanced rate multiplier + reference: + - title: Arizona DES Contracted Child Care Centers and Group Homes Rates FAQs + href: https://des.az.gov/services/child-and-family/child-care/des-contracted-child-care-provider-resources + - title: Arizona DES Maximum Reimbursement Rates for Child Care + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/relative.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/relative.yaml new file mode 100644 index 00000000000..e24622628a5 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/relative.yaml @@ -0,0 +1,21 @@ +description: Arizona provides this amount as the daily reimbursement rate under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: day + label: Arizona CCAP non-certified relative daily reimbursement rate + breakdown: + - az_ccap_age_group + reference: + - title: Arizona DES Maximum Reimbursement Rates for Child Care + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 +INFANT: + 2025-11-01: 15 +TODDLER: + 2025-11-01: 15 +PRESCHOOL: + 2025-11-01: 15 +SCHOOL_AGE_SUMMER: + 2025-11-01: 15 +SCHOOL_AGE_SCHOOL_YEAR: + 2025-11-01: 15 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/special_needs.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/special_needs.yaml new file mode 100644 index 00000000000..dfacc162637 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/special_needs.yaml @@ -0,0 +1,15 @@ +description: Arizona provides this amount as the daily special needs reimbursement rate under the Child Care Assistance Program. +values: + 2025-11-01: 89.81 + +metadata: + unit: currency-USD + period: day + label: Arizona CCAP special needs daily reimbursement rate + reference: + - title: Arizona DES Maximum Reimbursement Rates for Child Care + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 + - title: Arizona DES Child Care Provider Registration Agreement + href: https://des.az.gov/sites/default/files/dl/CCA-1210B.pdf#page=5 + - title: Arizona DES Child Care Provider Registration Agreement, Children with Special Needs + href: https://des.az.gov/sites/default/files/dl/CCA-1210B.pdf#page=13 diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/school_age_summer/end_month.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/school_age_summer/end_month.yaml new file mode 100644 index 00000000000..7aad7444043 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/school_age_summer/end_month.yaml @@ -0,0 +1,11 @@ +description: Arizona sets this threshold as the end month under the Child Care Assistance Program. +values: + 2025-11-01: 7 + +metadata: + unit: month + period: year + label: Arizona CCAP school-age summer rate end month + reference: + - title: Arizona DES Maximum Reimbursement Rates for Child Care + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/school_age_summer/start_month.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/school_age_summer/start_month.yaml new file mode 100644 index 00000000000..7d412f23734 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/school_age_summer/start_month.yaml @@ -0,0 +1,12 @@ +description: Arizona sets this threshold as the start month under the Child Care Assistance Program. +values: + 2025-11-01: 5 + +metadata: + unit: month + period: year + label: Arizona CCAP school-age summer rate start month + reference: + - title: Arizona DES Maximum Reimbursement Rates for Child Care + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 + diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap.yaml new file mode 100644 index 00000000000..91f4f4e217d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap.yaml @@ -0,0 +1,69 @@ +- name: Case 1, center infant benefit with copay. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 0 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 20_000 + households: + household: + members: [person1, person2] + state_code: AZ + output: + # min($20,000 / 12, $64.15 * 20) - ($0.50 * 20) = $1,273. + az_ccap: 1_273 + +- name: Case 2, copay exempt family receives full capped reimbursement. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 0 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 20_000 + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_copay_exempt: true + az_ccap: 1_283 + +- name: Case 3, expenses below reimbursement cap limit the benefit. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 4 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 6_000 + households: + household: + members: [person1, person2] + state_code: AZ + output: + # min($6,000 / 12, $42 * 20) - ($0.50 * 20) = $490. + az_ccap: 490 diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_copay.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_copay.yaml new file mode 100644 index 00000000000..bc19578565b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_copay.yaml @@ -0,0 +1,66 @@ +- name: Case 1, fee level 1 copay for one child. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 4 + childcare_attending_days_per_month: 20 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_copay: 10 + +- name: Case 2, fee level 5 copay for one child. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 48_000 + person2: + age: 4 + childcare_attending_days_per_month: 20 + person3: + age: 2 + person4: + age: 1 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: AZ + output: + az_ccap_copay: 30 + +- name: Case 3, copay exempt family has no copay. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 4 + childcare_attending_days_per_month: 20 + receives_or_needs_protective_services: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_copay_exempt: true + az_ccap_copay: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_daily_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_daily_rate.yaml new file mode 100644 index 00000000000..428d18ba9b3 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_daily_rate.yaml @@ -0,0 +1,67 @@ +- name: Case 1, center infant base rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 0 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_daily_rate: 64.15 + +- name: Case 2, center preschool quality enhanced rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 4 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + az_ccap_quality_enhanced_provider: true + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_daily_rate: 58.80 + +- name: Case 3, special needs rate for a quality provider. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 4 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + az_ccap_quality_enhanced_provider: true + is_disabled: true + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_special_needs_child: true + az_ccap_daily_rate: 89.81 + +- name: Case 4, relative provider rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 6 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: RELATIVE + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_daily_rate: 15 diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_fee_level.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_fee_level.yaml new file mode 100644 index 00000000000..bee8862c258 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_fee_level.yaml @@ -0,0 +1,63 @@ +- name: Case 1, family of two at fee level 3. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_fee_level: 3 + +- name: Case 2, family of four at fee level 5. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 48_000 + person2: + age: 4 + person3: + age: 2 + person4: + age: 1 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: AZ + output: + az_ccap_fee_level: 5 + +- name: Case 3, enrolled family can reach fee level 7. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 44_000 + person2: + age: 4 + person3: + age: 2 + spm_units: + spm_unit: + members: [person1, person2, person3] + az_ccap_enrolled: true + households: + household: + members: [person1, person2, person3] + state_code: AZ + output: + az_ccap_fee_level: 7 diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_income_eligible.yaml new file mode 100644 index 00000000000..f398be8c779 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_income_eligible.yaml @@ -0,0 +1,65 @@ +- name: Case 1, non-enrolled family at initial threshold is income eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 43_980 + person2: + age: 4 + person3: + age: 2 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: AZ + output: + # $43,980/year = $3,665/month, the family-size-3 initial threshold. + az_ccap_income_eligible: true + +- name: Case 2, non-enrolled family above initial threshold is not income eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 44_000 + person2: + age: 4 + person3: + age: 2 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: AZ + output: + az_ccap_income_eligible: false + +- name: Case 3, enrolled family above initial threshold but below ongoing threshold is income eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 44_000 + person2: + age: 4 + person3: + age: 2 + spm_units: + spm_unit: + members: [person1, person2, person3] + az_ccap_enrolled: true + households: + household: + members: [person1, person2, person3] + state_code: AZ + output: + az_ccap_income_eligible: true + diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/integration.yaml new file mode 100644 index 00000000000..79a6ba92f91 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/integration.yaml @@ -0,0 +1,132 @@ +- name: Case 1, zero-income family with infant in center care. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 0 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 20_000 + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_eligible_child: [false, true] + az_ccap_income_eligible: true + az_ccap_eligible: true + az_ccap_copay: 10 + az_ccap: 1_273 + +- name: Case 2, non-enrolled family above initial income limit is ineligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 44_000 + person2: + age: 4 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + person3: + age: 2 + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_pre_subsidy_childcare_expenses: 20_000 + households: + household: + members: [person1, person2, person3] + state_code: AZ + output: + az_ccap_income_eligible: false + az_ccap_eligible: false + az_ccap: 0 + +- name: Case 3, enrolled family above initial income limit remains eligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 44_000 + person2: + age: 4 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + person3: + age: 2 + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_pre_subsidy_childcare_expenses: 20_000 + az_ccap_enrolled: true + households: + household: + members: [person1, person2, person3] + state_code: AZ + output: + az_ccap_income_eligible: true + az_ccap_fee_level: 7 + az_ccap_eligible: true + # min($20,000 / 12, $42 * 20) - ($2.50 * 20) = $790. + az_ccap: 790 + +- name: Case 4, quality enhanced provider increases the reimbursement cap. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 4 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + az_ccap_quality_enhanced_provider: true + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 20_000 + households: + household: + members: [person1, person2] + state_code: AZ + output: + # min($20,000 / 12, $58.80 * 20) - ($0.50 * 20) = $1,166. + az_ccap: 1_166 + +- name: Case 5, special-needs child with quality provider receives the special-needs rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 4 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + az_ccap_quality_enhanced_provider: true + is_disabled: true + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 24_000 + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_special_needs_child: [false, true] + # min($24,000 / 12, $89.81 * 20) - ($0.50 * 20) = $1,786.20. + az_ccap: 1_786.20 diff --git a/policyengine_us/variables/gov/states/az/hhs/az_child_care_subsidies.py b/policyengine_us/variables/gov/states/az/hhs/az_child_care_subsidies.py new file mode 100644 index 00000000000..6cacebc83da --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/az_child_care_subsidies.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class az_child_care_subsidies(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "Arizona child care subsidies" + definition_period = YEAR + defined_for = StateCode.AZ + adds = ["az_ccap"] diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap.py new file mode 100644 index 00000000000..7a70e08ada7 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class az_ccap(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "Arizona Child Care Assistance Program benefit" + definition_period = MONTH + defined_for = "az_ccap_eligible" + reference = ( + "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1", + "https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=39", + ) + + def formula(spm_unit, period): + max_reimbursement = add(spm_unit, period, ["az_ccap_max_reimbursement"]) + childcare_expenses = spm_unit("spm_unit_pre_subsidy_childcare_expenses", period) + copay = spm_unit("az_ccap_copay", period) + return max_(min_(childcare_expenses, max_reimbursement) - copay, 0) diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_age_group.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_age_group.py new file mode 100644 index 00000000000..ace259da181 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_age_group.py @@ -0,0 +1,43 @@ +from policyengine_us.model_api import * + + +class AZCCAPAgeGroup(Enum): + INFANT = "Under age 1" + TODDLER = "Age 1 or 2" + PRESCHOOL = "Age 3 through 5" + SCHOOL_AGE_SUMMER = "Age 6 through 12, May through July" + SCHOOL_AGE_SCHOOL_YEAR = "Age 6 through 12, August through April" + + +class az_ccap_age_group(Variable): + value_type = Enum + entity = Person + possible_values = AZCCAPAgeGroup + default_value = AZCCAPAgeGroup.PRESCHOOL + definition_period = MONTH + label = "Arizona Child Care Assistance Program age group" + defined_for = StateCode.AZ + reference = "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1" + + def formula(person, period, parameters): + p = parameters(period).gov.states.az.hhs.ccap + age = person("age", period.this_year) + month = period.start.month + is_summer = (month >= p.school_age_summer.start_month) & ( + month <= p.school_age_summer.end_month + ) + return select( + [ + age < p.age_group.infant_max, + age < p.age_group.toddler_max, + age < p.age_group.preschool_max, + is_summer, + ], + [ + AZCCAPAgeGroup.INFANT, + AZCCAPAgeGroup.TODDLER, + AZCCAPAgeGroup.PRESCHOOL, + AZCCAPAgeGroup.SCHOOL_AGE_SUMMER, + ], + default=AZCCAPAgeGroup.SCHOOL_AGE_SCHOOL_YEAR, + ) diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_copay.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_copay.py new file mode 100644 index 00000000000..21daef00478 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_copay.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +class az_ccap_copay(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "Arizona Child Care Assistance Program copay" + definition_period = MONTH + defined_for = StateCode.AZ + reference = ( + "https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1", + "https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=33", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.az.hhs.ccap.copay + person = spm_unit.members + fee_level = spm_unit("az_ccap_fee_level", period) + eligible_child = person("az_ccap_eligible_child", period) + attending_days = person("childcare_attending_days_per_month", period.this_year) + per_child_copay = p.daily[fee_level] * attending_days * eligible_child + return where( + spm_unit("az_ccap_copay_exempt", period), + 0, + spm_unit.sum(per_child_copay), + ) diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_copay_exempt.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_copay_exempt.py new file mode 100644 index 00000000000..b504b522d4a --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_copay_exempt.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class az_ccap_copay_exempt(Variable): + value_type = bool + entity = SPMUnit + label = "Arizona Child Care Assistance Program copay exempt" + definition_period = MONTH + defined_for = StateCode.AZ + reference = ( + "https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1", + "https://des.az.gov/services/child-and-family/child-care/how-apply-for-child-care-assistance", + "https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=33", + ) + + def formula(spm_unit, period, parameters): + person = spm_unit.members + tanf_enrolled = spm_unit("is_tanf_enrolled", period) + protective_services = spm_unit.any( + person("receives_or_needs_protective_services", period.this_year) + ) + foster_care = spm_unit.any(person("is_in_foster_care", period)) + return tanf_enrolled | protective_services | foster_care diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_daily_rate.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_daily_rate.py new file mode 100644 index 00000000000..6d203d24835 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_daily_rate.py @@ -0,0 +1,46 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.az.hhs.ccap.az_ccap_provider_type import ( + AZCCAPProviderType, +) + + +class az_ccap_daily_rate(Variable): + value_type = float + entity = Person + unit = USD + label = "Arizona Child Care Assistance Program daily reimbursement rate" + definition_period = MONTH + defined_for = "az_ccap_eligible_child" + reference = ( + "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1", + "https://des.az.gov/services/child-and-family/child-care/des-contracted-child-care-provider-resources", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.az.hhs.ccap.rates + provider_type = person("az_ccap_provider_type", period) + age_group = person("az_ccap_age_group", period) + quality = person("az_ccap_quality_enhanced_provider", period) + special_needs = person("az_ccap_special_needs_child", period) + base_rate = select( + [ + provider_type == AZCCAPProviderType.CENTER, + provider_type == AZCCAPProviderType.GROUP_HOME, + provider_type == AZCCAPProviderType.CERTIFIED_FAMILY, + provider_type == AZCCAPProviderType.RELATIVE, + ], + [ + p.center[age_group], + p.group_home[age_group], + p.certified_family[age_group], + p.relative[age_group], + ], + default=p.center[age_group], + ) + quality_rate = where( + provider_type == AZCCAPProviderType.RELATIVE, + base_rate, + base_rate * p.quality_multiplier, + ) + regular_rate = where(quality, quality_rate, base_rate) + return where(special_needs & quality, p.special_needs, regular_rate) diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_enrolled.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_enrolled.py new file mode 100644 index 00000000000..378cecfa523 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_enrolled.py @@ -0,0 +1,9 @@ +from policyengine_us.model_api import * + + +class az_ccap_enrolled(Variable): + value_type = bool + entity = SPMUnit + label = "Enrolled in Arizona Child Care Assistance Program" + definition_period = MONTH + defined_for = StateCode.AZ diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_max_reimbursement.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_max_reimbursement.py new file mode 100644 index 00000000000..8727d4b945b --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_max_reimbursement.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class az_ccap_max_reimbursement(Variable): + value_type = float + entity = Person + unit = USD + label = "Arizona Child Care Assistance Program maximum reimbursement" + definition_period = MONTH + defined_for = "az_ccap_eligible_child" + reference = ( + "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1", + "https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=39", + ) + + def formula(person, period, parameters): + daily_rate = person("az_ccap_daily_rate", period) + attending_days = person("childcare_attending_days_per_month", period.this_year) + return daily_rate * attending_days diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_provider_type.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_provider_type.py new file mode 100644 index 00000000000..0b1daee56c9 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_provider_type.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class AZCCAPProviderType(Enum): + CENTER = "Child care center" + GROUP_HOME = "Group home" + CERTIFIED_FAMILY = "Certified family home or certified in-home provider" + RELATIVE = "Non-certified relative provider" + + +class az_ccap_provider_type(Variable): + value_type = Enum + entity = Person + possible_values = AZCCAPProviderType + default_value = AZCCAPProviderType.CENTER + definition_period = MONTH + label = "Arizona Child Care Assistance Program provider type" + defined_for = StateCode.AZ + reference = "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1" diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_quality_enhanced_provider.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_quality_enhanced_provider.py new file mode 100644 index 00000000000..ef49628fede --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_quality_enhanced_provider.py @@ -0,0 +1,13 @@ +from policyengine_us.model_api import * + + +class az_ccap_quality_enhanced_provider(Variable): + value_type = bool + entity = Person + label = "Arizona Child Care Assistance Program quality enhanced provider" + definition_period = MONTH + defined_for = StateCode.AZ + reference = ( + "https://des.az.gov/services/child-and-family/child-care/des-contracted-child-care-provider-resources", + "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1", + ) diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_special_needs_child.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_special_needs_child.py new file mode 100644 index 00000000000..fa9799b9db2 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_special_needs_child.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class az_ccap_special_needs_child(Variable): + value_type = bool + entity = Person + label = "Arizona Child Care Assistance Program special needs child" + definition_period = MONTH + defined_for = StateCode.AZ + reference = ( + "https://des.az.gov/sites/default/files/dl/CCA-1210B.pdf#page=5", + "https://des.az.gov/sites/default/files/dl/CCA-1210B.pdf#page=13", + ) + + def formula(person, period, parameters): + return person("az_ccap_eligible_child", period) & person( + "is_disabled", period.this_year + ) diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.py b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.py new file mode 100644 index 00000000000..499894a68ee --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class az_ccap_activity_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for Arizona Child Care Assistance Program based on activity" + definition_period = MONTH + defined_for = StateCode.AZ + reference = ( + "https://des.az.gov/services/child-and-family/child-care/how-apply-for-child-care-assistance", + "https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=25", + ) + + def formula(spm_unit, period, parameters): + person = spm_unit.members + head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) + working = person("weekly_hours_worked", period.this_year) > 0 + student = person("is_full_time_student", period.this_year) + unable_to_care = person("is_disabled", period.this_year) + eligible_person = working | student | unable_to_care + return spm_unit.sum(head_or_spouse & ~eligible_person) == 0 diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible.py b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible.py new file mode 100644 index 00000000000..217e179f185 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class az_ccap_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for Arizona Child Care Assistance Program" + definition_period = MONTH + defined_for = StateCode.AZ + reference = "https://des.az.gov/services/child-and-family/child-care/how-apply-for-child-care-assistance" + + def formula(spm_unit, period, parameters): + has_eligible_child = add(spm_unit, period, ["az_ccap_eligible_child"]) > 0 + income_eligible = spm_unit("az_ccap_income_eligible", period) + asset_eligible = spm_unit("is_ccdf_asset_eligible", period.this_year) + activity_eligible = spm_unit("az_ccap_activity_eligible", period) + return has_eligible_child & income_eligible & asset_eligible & activity_eligible diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible_child.py b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible_child.py new file mode 100644 index 00000000000..21512134e3d --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible_child.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class az_ccap_eligible_child(Variable): + value_type = bool + entity = Person + label = "Eligible child for Arizona Child Care Assistance Program" + definition_period = MONTH + defined_for = StateCode.AZ + reference = ( + "https://des.az.gov/services/child-and-family/child-care/how-apply-for-child-care-assistance", + "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.az.hhs.ccap.eligibility + age = person("age", period.this_year) + attending_days = person("childcare_attending_days_per_month", period.this_year) + return (age < p.child_age_limit) & (attending_days > 0) diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_countable_income.py b/policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_countable_income.py new file mode 100644 index 00000000000..2d16c6aa097 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_countable_income.py @@ -0,0 +1,12 @@ +from policyengine_us.model_api import * + + +class az_ccap_countable_income(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "Arizona Child Care Assistance Program countable income" + definition_period = MONTH + defined_for = StateCode.AZ + reference = "https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=28" + adds = "gov.states.az.hhs.ccap.income.countable_income.sources" diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_fee_level.py b/policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_fee_level.py new file mode 100644 index 00000000000..5679e5e649a --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_fee_level.py @@ -0,0 +1,29 @@ +from policyengine_us.model_api import * + + +class az_ccap_fee_level(Variable): + value_type = int + entity = SPMUnit + label = "Arizona Child Care Assistance Program fee level" + definition_period = MONTH + defined_for = StateCode.AZ + reference = "https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1" + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.az.hhs.ccap.income + family_size = spm_unit("spm_unit_size", period.this_year) + capped_size = clip(family_size, 1, p.max_family_size) + income = spm_unit("az_ccap_countable_income", period) + return select( + [ + income <= p.threshold.level_1[capped_size], + income <= p.threshold.level_2[capped_size], + income <= p.threshold.level_3[capped_size], + income <= p.threshold.level_4[capped_size], + income <= p.threshold.level_5[capped_size], + income <= p.threshold.level_6[capped_size], + income <= p.threshold.level_7[capped_size], + ], + [1, 2, 3, 4, 5, 6, 7], + default=0, + ) diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_income_eligible.py b/policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_income_eligible.py new file mode 100644 index 00000000000..efa6439cb66 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_income_eligible.py @@ -0,0 +1,15 @@ +from policyengine_us.model_api import * + + +class az_ccap_income_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for Arizona Child Care Assistance Program based on income" + definition_period = MONTH + defined_for = StateCode.AZ + reference = "https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1" + + def formula(spm_unit, period, parameters): + return spm_unit("az_ccap_countable_income", period) <= spm_unit( + "az_ccap_income_limit", period + ) diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_income_limit.py b/policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_income_limit.py new file mode 100644 index 00000000000..eedd8e774d2 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_income_limit.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class az_ccap_income_limit(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "Arizona Child Care Assistance Program income limit" + definition_period = MONTH + defined_for = StateCode.AZ + reference = "https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1" + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.az.hhs.ccap.income + family_size = spm_unit("spm_unit_size", period.this_year) + capped_size = clip(family_size, 1, p.max_family_size) + enrolled = spm_unit("az_ccap_enrolled", period) + return where( + enrolled, + p.threshold.level_7[capped_size], + p.threshold.level_6[capped_size], + ) diff --git a/sources/working_references.md b/sources/working_references.md new file mode 100644 index 00000000000..f3c72699a22 --- /dev/null +++ b/sources/working_references.md @@ -0,0 +1,94 @@ +# Arizona Child Care Assistance Program (CCAP) Working References + +Workflow prefix: `az-ccap` +Issue: https://github.com/PolicyEngine/policyengine-us/issues/8370 + +## Official Sources + +1. Arizona Department of Economic Security, "How to Apply for Child Care Assistance" + - URL: https://des.az.gov/services/child-and-family/child-care/how-apply-for-child-care-assistance + - Key text: Program helps families pay for child care for children under age 13 so parents/guardians can work, attend school, or participate in eligible activities. Assistance is also available for children experiencing homelessness and children referred by DCS or Tribal child welfare. + - Eligibility page states families are required to cost-share based on family size and income. + - Eligibility page states child care assistance is available to families at or below 165% FPL with children birth through age 12 who live in Arizona and meet listed eligible activities/needs. + - DES does not consider income for referrals from TANF Jobs, Department of Child Safety, or Tribal child welfare. + - Ongoing recipients must report income above 85% of SMI; redetermination occurs every 12 months. + +2. Arizona DES, "Child Care Assistance Gross Monthly Income Eligibility Chart and Fee Schedule FFY 2026", CCA-0229A, effective October 1, 2025. + - URL: https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1 + - Initial application gross monthly income maximum: at or below 165% FPL, fee levels L1-L6. + - Redetermination gross monthly income maximum: at or below 85% SMI, fee levels L1-L7. + - Family-size table, monthly thresholds: + - Size 1: L1 0-1,110; L2 1,111-1,305; L3 1,306-1,762; L4 1,763-1,893; L5 1,894-2,023; L6 2,024-2,154; L7 3,978. + - Size 2: L1 0-1,499; L2 1,500-1,763; L3 1,764-2,381; L4 2,382-2,557; L5 2,558-2,733; L6 2,734-2,909; L7 5,202. + - Size 3: L1 0-1,888; L2 1,889-2,221; L3 2,222-2,999; L4 3,000-3,221; L5 3,222-3,443; L6 3,444-3,665; L7 6,426. + - Size 4: L1 0-2,278; L2 2,279-2,680; L3 2,681-3,618; L4 3,619-3,886; L5 3,887-4,154; L6 4,155-4,422; L7 7,649. + - Size 5: L1 0-2,668; L2 2,669-3,138; L3 3,139-4,237; L4 4,238-4,551; L5 4,552-4,864; L6 4,865-5,178; L7 8,874. + - Size 6: L1 0-3,057; L2 3,058-3,596; L3 3,597-4,855; L4 4,856-5,215; L5 5,216-5,574; L6 5,575-5,934; L7 10,098. + - Size 7: L1 0-3,447; L2 3,448-4,055; L3 4,056-5,475; L4 5,476-5,880; L5 5,881-6,286; L6 6,287-6,691; L7 10,327. + - Size 8: L1 0-3,837; L2 3,838-4,513; L3 4,514-6,093; L4 6,094-6,544; L5 6,545-6,996; L6 6,997-7,447; L7 10,557. + - Size 9: L1 0-4,226; L2 4,227-4,971; L3 4,972-6,711; L4 6,712-7,208; L5 7,209-7,706; L6 7,707-8,203; L7 10,786. + - Size 10: L1 0-4,616; L2 4,617-5,430; L3 5,431-7,331; L4 7,332-7,874; L5 7,875-8,417; L6 8,418-8,960; L7 11,015. + - Size 11: L1 0-5,005; L2 5,006-5,888; L3 5,889-7,949; L4 7,950-8,538; L5 8,539-9,127; L6 9,128-9,716; L7 11,244. + - Size 12: L1 0-5,395; L2 5,396-6,346; L3 6,347-8,568; L4 8,569-9,202; L5 9,203-9,837; L6 9,838-10,471; L7 11,474. + - Minimum required copayment per child in care: + - L1-L3: $0.50 daily rate. + - L4: $1.00 daily rate. + - L5: $1.50 daily rate. + - L6-L7: $2.50 daily rate. + - TCC: no copay assigned beyond the 3rd child in the family. + - Daily rate applies for 15 minutes or more. + - DCS/Foster Care, Jobs Program, and working Cash Assistance families may not have a fee level or minimum required copay, but may owe charges above state reimbursement maximums or provider additional costs. + +3. Arizona DES, "Maximum Reimbursement Rates for Child Care", CCA-1227A, effective November 1, 2025. + - URL: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 + - Centers daily rates / quality rates: + - Under 1: $64.15 / $89.81. + - Age 1-2: $48.70 / $68.18. + - Age 3-5: $42.00 / $58.80. + - Age 6-12: summer $35.00 / $49.00; school-year $25.00 / $35.00. + - Group homes daily rates / quality rates: + - Under 1: $40.00 / $56.00. + - Age 1-2: $36.00 / $50.40. + - Age 3-5: $35.00 / $49.00. + - Age 6-12: summer $30.00 / $42.00; school-year $21.00 / $29.40. + - Certified family homes and certified in-home providers daily / CDA quality / quality rates: + - Under 1: $40.00 / $54.00 / $56.00. + - Age 1-2: $30.00 / $40.50 / $42.00. + - Age 3-5: $30.00 / $40.50 / $42.00. + - Age 6-12: summer $25.00 / $33.50 / $35.00; school-year $20.00 / $27.00 / $28.00. + - Non-certified relative provider rate: birth through age 12, $15.00 daily. + - Special needs rate: birth through age 12, $89.81 daily. + - Daily rate is paid when attending for 15 minutes or more. + - Quality rate: 3-, 4-, or 5-star Quality First, approved national accreditation, or Head Start performance standards program-wide receive 40% increase; family child care providers with CDA receive 35% increase. + - School-age children receive summer daily rate during May-July and school-year rate during August-April. + +4. Arizona Administrative Code, Title 6, Chapter 5, Article 49, Child Care Assistance. + - URL: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=24 + - R6-5-4911 general eligibility: applicant/recipient must comply with procedural requirements and provide complete truthful information; rule defines eligible applicant/child and allowable providers. + - URL: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=25 + - R6-5-4912 eligible activities/needs include employment, education/training, teen parent high school/GED/remedial education, treatment plan for inability to care, drug/alcohol rehabilitation or court-ordered community service, and shelter case plan. + - URL: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=28 + - R6-5-4914 income eligibility: some applicants may receive assistance without regard to income; income eligibility uses gross monthly countable income; countable income includes wages, self-employment, unemployment, workers compensation, alimony/spousal maintenance, child support, veterans benefits, monthly gifts, gambling/lottery, and other non-excluded income. + - URL: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=31 + - R6-5-4914 excluded income includes loans, tax refunds, EITC, SNAP/USDA food value, WIC/school lunch/child nutrition benefits, foster care maintenance, adoption subsidy, educational loans/grants/scholarships/work-study, and earnings of a child under 18 attending high school/training who is not a minor parent needing care. + - URL: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=32 + - R6-5-4914 income calculation: calculate each income source separately, add sources to total monthly income, convert non-monthly income to monthly, anticipate income from most recent 30-day period, and convert fixed weekly/biweekly/semimonthly income using 4.3, 2.15, and 2 multipliers. + - URL: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=33 + - R6-5-4915: fee level is based on family size and monthly gross countable income; copayment is per child based on fee level and number of children needing care; no fee/copayment for Jobs participants, working Cash Assistance participants needing child care, or families referred by CPS/DDD (current DES page uses DCS/Tribal child welfare). + - URL: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=39 + - R6-5-4925: Department shall pay for authorized child care at a rate not exceeding Appendix B reimbursement rates. + - URL: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=39 + - Appendix A contains child care assistance gross monthly income eligibility chart and fee schedule. + - URL: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=41 + - Appendix B contains maximum reimbursement rates for child care. + +## Existing PolicyEngine References + +- `policyengine_us/variables/gov/states/nh/dhhs/ccap`: complete CCAP pattern for eligibility, cost share, payment rates, and subsidy = min(pre-subsidy expense, payment rate) - family cost share. +- `policyengine_us/variables/gov/states/ak/dpa/ccap`: complete CCAP pattern with provider categories, age groups, copay, rates, special needs, and state-level registration in CCDF totals. +- `policyengine_us/variables/gov/states/sc/dss/ccap`: provider types, age groups, time categories, copay tiers, quality levels, and weekly benefit patterns. +- Existing input variables likely reusable: `pre_subsidy_childcare_expenses`, `spm_unit_pre_subsidy_childcare_expenses`, `childcare_days_per_week`, `childcare_hours_per_day`, `childcare_hours_per_week`, `is_tanf_enrolled`, `is_parent`, `age`, `immigration_status`, `is_disabled`, `employment_income`, `self_employment_income`, `unemployment_compensation`, `child_support_received`, `alimony_income`, `veterans_benefits`, `workers_compensation`, `pension_income`, `spm_unit_size`, `spm_unit_fpg`. + +## Fetch Notes + +- Local `curl` downloads from `des.az.gov` and `apps.azsos.gov` returned Cloudflare challenge HTML, not PDFs. The source text and page numbers above were available through indexed official-source access. No official source was excluded for lack of access. From 96d97d24bae4c18bb8119213a82b9b4aba300181 Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 1 Jun 2026 14:52:58 -0400 Subject: [PATCH 2/3] Address review findings for Arizona CCAP Critical fixes: - Correct copay daily rates at fee levels 2/3/4/6 to match CCA-0229AFY26 - Add categorical income-test bypass for foster/DCS/TANF families (R6-5-4914(A)) via new az_ccap_categorically_eligible - Remove capital_gains from countable income (excluded by R6-5-4914(G)(3)) - Add is_ccdf_immigration_eligible_child to eligible-child (45 CFR 98.20) - Correct regulation page anchors in parameters and variables Should-address: - Exclude minor-student earnings (R6-5-4914(G)(13)) and deduct child support paid (R6-5-4914(H)) from countable income - Register Arizona in programs.yaml CCDF coverage and state_implementations - Strip #page=1 anchors from the single-page CCA-1227A; improve citations - Document special-needs rate gate, CDA tier (not modeled), age<13 limit, TCC copay rule (not modeled), and activity pathways - Add test coverage: provider types, age groups, fee levels, direct unit tests, categorical bypass, and roll-up (21 -> 72 passing cases) Remove working_references.md transcription. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../az/hhs/ccap/age_group/infant_max.yaml | 2 +- .../az/hhs/ccap/age_group/preschool_max.yaml | 2 +- .../az/hhs/ccap/age_group/toddler_max.yaml | 2 +- .../gov/states/az/hhs/ccap/copay/daily.yaml | 8 +- .../hhs/ccap/eligibility/child_age_limit.yaml | 2 + .../ccap/income/countable_income/sources.yaml | 3 +- .../gov/states/az/hhs/ccap/rates/center.yaml | 2 +- .../az/hhs/ccap/rates/certified_family.yaml | 2 +- .../states/az/hhs/ccap/rates/group_home.yaml | 2 +- .../az/hhs/ccap/rates/quality_multiplier.yaml | 4 +- .../states/az/hhs/ccap/rates/relative.yaml | 2 +- .../az/hhs/ccap/rates/special_needs.yaml | 6 +- .../hhs/ccap/school_age_summer/end_month.yaml | 2 +- .../ccap/school_age_summer/start_month.yaml | 2 +- policyengine_us/programs.yaml | 7 +- .../gov/states/az/hhs/ccap/az_ccap.yaml | 59 ++++++ .../states/az/hhs/ccap/az_ccap_age_group.yaml | 78 ++++++++ .../az/hhs/ccap/az_ccap_copay_exempt.yaml | 74 +++++++ .../az/hhs/ccap/az_ccap_daily_rate.yaml | 181 ++++++++++++++++++ .../hhs/ccap/az_ccap_max_reimbursement.yaml | 33 ++++ .../az_ccap_activity_eligible.yaml | 106 ++++++++++ .../az_ccap_categorically_eligible.yaml | 74 +++++++ .../eligibility/az_ccap_eligible_child.yaml | 56 ++++++ .../ccap/income/az_ccap_countable_income.yaml | 98 ++++++++++ .../az/hhs/ccap/income/az_ccap_fee_level.yaml | 99 ++++++++++ .../hhs/ccap/income/az_ccap_income_limit.yaml | 44 +++++ .../gov/states/az/hhs/ccap/integration.yaml | 60 ++++++ .../gov/states/az/hhs/ccap/az_ccap.py | 4 +- .../states/az/hhs/ccap/az_ccap_age_group.py | 2 +- .../gov/states/az/hhs/ccap/az_ccap_copay.py | 3 + .../az/hhs/ccap/az_ccap_copay_exempt.py | 11 +- .../states/az/hhs/ccap/az_ccap_daily_rate.py | 9 +- .../az/hhs/ccap/az_ccap_max_reimbursement.py | 4 +- .../az/hhs/ccap/az_ccap_provider_type.py | 2 +- .../ccap/az_ccap_quality_enhanced_provider.py | 2 +- .../hhs/ccap/az_ccap_special_needs_child.py | 4 +- .../eligibility/az_ccap_activity_eligible.py | 8 +- .../az_ccap_categorically_eligible.py | 31 +++ .../hhs/ccap/eligibility/az_ccap_eligible.py | 16 +- .../eligibility/az_ccap_eligible_child.py | 14 +- .../ccap/income/az_ccap_countable_income.py | 31 ++- sources/working_references.md | 94 --------- 42 files changed, 1106 insertions(+), 139 deletions(-) create mode 100644 policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_age_group.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_copay_exempt.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_max_reimbursement.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_categorically_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible_child.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_countable_income.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_income_limit.yaml create mode 100644 policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_categorically_eligible.py delete mode 100644 sources/working_references.md diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/infant_max.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/infant_max.yaml index 4413a2007a8..d113eecd01d 100644 --- a/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/infant_max.yaml +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/infant_max.yaml @@ -8,5 +8,5 @@ metadata: label: Arizona CCAP infant age group maximum age reference: - title: Arizona DES Maximum Reimbursement Rates for Child Care - href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/preschool_max.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/preschool_max.yaml index 5ced7b8f453..349bc759df5 100644 --- a/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/preschool_max.yaml +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/preschool_max.yaml @@ -8,5 +8,5 @@ metadata: label: Arizona CCAP age 3-5 age group maximum age reference: - title: Arizona DES Maximum Reimbursement Rates for Child Care - href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/toddler_max.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/toddler_max.yaml index 85d6cd56d7e..cecf8717076 100644 --- a/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/toddler_max.yaml +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/toddler_max.yaml @@ -8,5 +8,5 @@ metadata: label: Arizona CCAP age 1-2 age group maximum age reference: - title: Arizona DES Maximum Reimbursement Rates for Child Care - href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/copay/daily.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/copay/daily.yaml index b9ea117a8ce..a616796d549 100644 --- a/policyengine_us/parameters/gov/states/az/hhs/ccap/copay/daily.yaml +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/copay/daily.yaml @@ -15,15 +15,15 @@ metadata: 1: 2025-10-01: 0.5 2: - 2025-10-01: 0.5 + 2025-10-01: 1 3: - 2025-10-01: 0.5 + 2025-10-01: 1.5 4: - 2025-10-01: 1 + 2025-10-01: 1.5 5: 2025-10-01: 1.5 6: - 2025-10-01: 2.5 + 2025-10-01: 1.5 7: 2025-10-01: 2.5 diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/eligibility/child_age_limit.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/eligibility/child_age_limit.yaml index aca899a474b..12f358296ec 100644 --- a/policyengine_us/parameters/gov/states/az/hhs/ccap/eligibility/child_age_limit.yaml +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/eligibility/child_age_limit.yaml @@ -7,6 +7,8 @@ metadata: period: year label: Arizona CCAP child age limit reference: + - title: Arizona Administrative Code R6-5-4911(D) Age of the Child (eligible child is birth through 12) + href: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=25 - title: Arizona DES How to Apply for Child Care Assistance href: https://des.az.gov/services/child-and-family/child-care/how-apply-for-child-care-assistance diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/countable_income/sources.yaml index f1dc2223b58..b1c8ad94134 100644 --- a/policyengine_us/parameters/gov/states/az/hhs/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/countable_income/sources.yaml @@ -17,7 +17,6 @@ values: - interest_income - dividend_income - rental_income - - capital_gains metadata: unit: list @@ -25,7 +24,7 @@ metadata: label: Arizona CCAP countable income sources reference: - title: Arizona Administrative Code R6-5-4914 Income Eligibility - href: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=28 + href: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=31 - title: Arizona Administrative Code R6-5-4914 Excluded Income href: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=31 diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/center.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/center.yaml index 74eb8b26658..81e48a4fc7c 100644 --- a/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/center.yaml +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/center.yaml @@ -7,7 +7,7 @@ metadata: - az_ccap_age_group reference: - title: Arizona DES Maximum Reimbursement Rates for Child Care - href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf INFANT: 2025-11-01: 64.15 TODDLER: diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/certified_family.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/certified_family.yaml index 37546899a3d..3b6e5f7d072 100644 --- a/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/certified_family.yaml +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/certified_family.yaml @@ -7,7 +7,7 @@ metadata: - az_ccap_age_group reference: - title: Arizona DES Maximum Reimbursement Rates for Child Care - href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf INFANT: 2025-11-01: 40 TODDLER: diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/group_home.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/group_home.yaml index 78eabb7ee9d..a957d4f8529 100644 --- a/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/group_home.yaml +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/group_home.yaml @@ -7,7 +7,7 @@ metadata: - az_ccap_age_group reference: - title: Arizona DES Maximum Reimbursement Rates for Child Care - href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf INFANT: 2025-11-01: 40 TODDLER: diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/quality_multiplier.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/quality_multiplier.yaml index 1dcb963de73..e6e74a563c9 100644 --- a/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/quality_multiplier.yaml +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/quality_multiplier.yaml @@ -7,8 +7,8 @@ metadata: period: year label: Arizona CCAP quality enhanced rate multiplier reference: + - title: Arizona DES Maximum Reimbursement Rates for Child Care + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf - title: Arizona DES Contracted Child Care Centers and Group Homes Rates FAQs href: https://des.az.gov/services/child-and-family/child-care/des-contracted-child-care-provider-resources - - title: Arizona DES Maximum Reimbursement Rates for Child Care - href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/relative.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/relative.yaml index e24622628a5..39e144f8b65 100644 --- a/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/relative.yaml +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/relative.yaml @@ -7,7 +7,7 @@ metadata: - az_ccap_age_group reference: - title: Arizona DES Maximum Reimbursement Rates for Child Care - href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf INFANT: 2025-11-01: 15 TODDLER: diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/special_needs.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/special_needs.yaml index dfacc162637..33b36594710 100644 --- a/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/special_needs.yaml +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/special_needs.yaml @@ -8,8 +8,8 @@ metadata: label: Arizona CCAP special needs daily reimbursement rate reference: - title: Arizona DES Maximum Reimbursement Rates for Child Care - href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf - title: Arizona DES Child Care Provider Registration Agreement - href: https://des.az.gov/sites/default/files/dl/CCA-1210B.pdf#page=5 + href: https://des.az.gov/sites/default/files/dl/CCA-1210B.pdf#page=6 - title: Arizona DES Child Care Provider Registration Agreement, Children with Special Needs - href: https://des.az.gov/sites/default/files/dl/CCA-1210B.pdf#page=13 + href: https://des.az.gov/sites/default/files/dl/CCA-1210B.pdf#page=14 diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/school_age_summer/end_month.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/school_age_summer/end_month.yaml index 7aad7444043..32f26193bab 100644 --- a/policyengine_us/parameters/gov/states/az/hhs/ccap/school_age_summer/end_month.yaml +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/school_age_summer/end_month.yaml @@ -8,4 +8,4 @@ metadata: label: Arizona CCAP school-age summer rate end month reference: - title: Arizona DES Maximum Reimbursement Rates for Child Care - href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/school_age_summer/start_month.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/school_age_summer/start_month.yaml index 7d412f23734..c52b2165e1e 100644 --- a/policyengine_us/parameters/gov/states/az/hhs/ccap/school_age_summer/start_month.yaml +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/school_age_summer/start_month.yaml @@ -8,5 +8,5 @@ metadata: label: Arizona CCAP school-age summer rate start month reference: - title: Arizona DES Maximum Reimbursement Rates for Child Care - href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 7d6212eec9a..b020ea7861f 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -460,7 +460,7 @@ programs: category: Benefits agency: HHS status: partial - coverage: AK, CA, CO, CT, DE, DC, IL, MA, MD, ME, NC, NH, NJ, PA, RI, SC, TX, VA, VT, WV + coverage: AK, AZ, CA, CO, CT, DE, DC, IL, MA, MD, ME, NC, NH, NJ, PA, RI, SC, TX, VA, VT, WV state_implementations: - state: AK status: complete @@ -468,6 +468,11 @@ programs: full_name: Alaska Child Care Assistance Program variable: ak_ccap notes: Modeled as PASS II/III; PASS I (ATAP-bundled) and PASS IV (OCS protective services) not modeled + - state: AZ + status: complete + name: CCAP + full_name: Arizona Child Care Assistance Program + variable: az_ccap - state: CA status: complete name: CalWORKs childcare diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap.yaml index 91f4f4e217d..d420c7112d7 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap.yaml @@ -67,3 +67,62 @@ output: # min($6,000 / 12, $42 * 20) - ($0.50 * 20) = $490. az_ccap: 490 + +- name: Case 4, family with no working, student, or disabled adult is ineligible on activity. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 0 + person2: + age: 0 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 20_000 + households: + household: + members: [person1, person2] + state_code: AZ + output: + # Eligible child, income eligible, and asset eligible, but the parent has no + # qualifying activity, so the binding failure is activity eligibility. + az_ccap_eligible_child: [false, true] + az_ccap_income_eligible: true + az_ccap_activity_eligible: false + az_ccap_eligible: false + az_ccap: 0 + +- name: Case 5, family above the CCDF asset limit is ineligible on assets. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 40 + person2: + age: 0 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 20_000 + spm_unit_assets: 2_000_000 + households: + household: + members: [person1, person2] + state_code: AZ + output: + # Eligible child, income eligible, and activity eligible, but assets exceed the + # $1,000,000 CCDF asset limit, so the binding failure is asset eligibility. + az_ccap_income_eligible: true + az_ccap_activity_eligible: true + is_ccdf_asset_eligible: false + az_ccap_eligible: false + az_ccap: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_age_group.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_age_group.yaml new file mode 100644 index 00000000000..d3da2c1e51d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_age_group.yaml @@ -0,0 +1,78 @@ +- name: Case 1, infant under age 1. + period: 2026-01 + input: + people: + person1: + age: 0 + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_age_group: INFANT + +- name: Case 2, toddler at age 1. + period: 2026-01 + input: + people: + person1: + age: 1 + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_age_group: TODDLER + +- name: Case 3, toddler at age 2. + period: 2026-01 + input: + people: + person1: + age: 2 + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_age_group: TODDLER + +- name: Case 4, preschool at age 3. + period: 2026-01 + input: + people: + person1: + age: 3 + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_age_group: PRESCHOOL + +- name: Case 5, preschool at age 4. + period: 2026-01 + input: + people: + person1: + age: 4 + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_age_group: PRESCHOOL + +- name: Case 6, school-age child in January uses the school-year group. + # January (month 1) is outside the May-July summer window. + period: 2026-01 + input: + people: + person1: + age: 8 + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_age_group: SCHOOL_AGE_SCHOOL_YEAR diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_copay_exempt.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_copay_exempt.yaml new file mode 100644 index 00000000000..daa2d05b5f3 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_copay_exempt.yaml @@ -0,0 +1,74 @@ +- name: Case 1, family with a foster child is copay exempt. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_in_foster_care: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_copay_exempt: true + +- name: Case 2, family needing protective services is copay exempt. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + receives_or_needs_protective_services: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_copay_exempt: true + +- name: Case 3, TANF-enrolled family is copay exempt. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_copay_exempt: true + +- name: Case 4, non-categorical family is not copay exempt. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_copay_exempt: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_daily_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_daily_rate.yaml index 428d18ba9b3..03c0932434b 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_daily_rate.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_daily_rate.yaml @@ -65,3 +65,184 @@ state_code: AZ output: az_ccap_daily_rate: 15 + +- name: Case 5, center toddler base rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 1 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_daily_rate: 48.70 + +- name: Case 6, center school-year rate for a school-age child in January. + # January (month 1) is outside the May-July summer window, so a 6-12 year-old + # gets the school-year rate. The summer rate (months 5-7) cannot be unit-tested + # because the test period must be January or a whole year. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 8 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_daily_rate: 25 + +- name: Case 7, group home infant base rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 0 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: GROUP_HOME + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_daily_rate: 40 + +- name: Case 8, group home toddler base rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 2 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: GROUP_HOME + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_daily_rate: 36 + +- name: Case 9, group home preschool base rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 3 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: GROUP_HOME + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_daily_rate: 35 + +- name: Case 10, group home school-year rate for a school-age child in January. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 8 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: GROUP_HOME + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_daily_rate: 21 + +- name: Case 11, group home infant quality enhanced rate applies the multiplier to a non-center base. + # $40 base x 1.4 quality multiplier = $56. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 0 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: GROUP_HOME + az_ccap_quality_enhanced_provider: true + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_daily_rate: 56 + +- name: Case 12, certified family infant base rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 0 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CERTIFIED_FAMILY + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_daily_rate: 40 + +- name: Case 13, certified family toddler base rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 2 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CERTIFIED_FAMILY + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_daily_rate: 30 + +- name: Case 14, certified family preschool base rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 4 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CERTIFIED_FAMILY + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_daily_rate: 30 + +- name: Case 15, certified family school-year rate for a school-age child in January. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 8 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CERTIFIED_FAMILY + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_daily_rate: 20 diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_max_reimbursement.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_max_reimbursement.yaml new file mode 100644 index 00000000000..61b13d0bc90 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_max_reimbursement.yaml @@ -0,0 +1,33 @@ +- name: Case 1, center infant maximum reimbursement. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 0 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + households: + household: + members: [person1] + state_code: AZ + output: + # $64.15 daily rate x 20 attending days = $1,283. + az_ccap_max_reimbursement: 1_283 + +- name: Case 2, center preschool maximum reimbursement with fewer days. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 4 + childcare_attending_days_per_month: 15 + az_ccap_provider_type: CENTER + households: + household: + members: [person1] + state_code: AZ + output: + # $42 daily rate x 15 attending days = $630. + az_ccap_max_reimbursement: 630 diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.yaml new file mode 100644 index 00000000000..4d3986e3934 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.yaml @@ -0,0 +1,106 @@ +- name: Case 1, single working parent is activity eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 40 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_activity_eligible: true + +- name: Case 2, single non-working parent is not activity eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 0 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_activity_eligible: false + +- name: Case 3, full-time student parent is activity eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 0 + is_full_time_student: true + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_activity_eligible: true + +- name: Case 4, disabled parent unable to provide care is activity eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 0 + is_disabled: true + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_activity_eligible: true + +- name: Case 5, two-parent family with one non-active parent is not activity eligible. + period: 2026-01 + input: + people: + person1: + age: 35 + weekly_hours_worked: 40 + person2: + age: 33 + weekly_hours_worked: 0 + is_full_time_student: false + person3: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: AZ + output: + # person2 is a head/spouse with no qualifying activity, so the + # head_or_spouse & ~eligible_person sum is nonzero and the unit fails. + az_ccap_activity_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_categorically_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_categorically_eligible.yaml new file mode 100644 index 00000000000..e46a7274e59 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_categorically_eligible.yaml @@ -0,0 +1,74 @@ +- name: Case 1, family with a foster child is categorically eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_in_foster_care: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_categorically_eligible: true + +- name: Case 2, family needing protective services is categorically eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + receives_or_needs_protective_services: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_categorically_eligible: true + +- name: Case 3, TANF-enrolled family is categorically eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_categorically_eligible: true + +- name: Case 4, family with none of the categorical conditions is not categorically eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_categorically_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible_child.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible_child.yaml new file mode 100644 index 00000000000..7f43e767c5c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible_child.yaml @@ -0,0 +1,56 @@ +- name: Case 1, citizen child under 13 attending care is an eligible child. + period: 2026-01 + input: + people: + person1: + age: 4 + childcare_attending_days_per_month: 20 + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_eligible_child: true + +- name: Case 2, child aged 13 is not an eligible child. + period: 2026-01 + input: + people: + person1: + age: 13 + childcare_attending_days_per_month: 20 + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_eligible_child: false + +- name: Case 3, child not attending care is not an eligible child. + period: 2026-01 + input: + people: + person1: + age: 4 + childcare_attending_days_per_month: 0 + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_eligible_child: false + +- name: Case 4, immigration-ineligible child is not an eligible child. + period: 2026-01 + input: + people: + person1: + age: 4 + childcare_attending_days_per_month: 20 + immigration_status: UNDOCUMENTED + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_eligible_child: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_countable_income.yaml new file mode 100644 index 00000000000..ed8d665b304 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_countable_income.yaml @@ -0,0 +1,98 @@ +- name: Case 1, parent earnings count as countable income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + # $24,000/year = $2,000/month countable. + az_ccap_countable_income: 2_000 + +- name: Case 2, a minor full-time student's earnings are excluded. + # R6-5-4914(G)(13): exclude the earnings of a child under 18 attending school + # who is not a minor parent. The teen's $12,000/year does not raise countable income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + person2: + age: 4 + person3: + age: 16 + is_full_time_student: true + employment_income: 12_000 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: AZ + output: + # ($24,000 + $12,000)/12 - $12,000/12 = $3,000 - $1,000 = $2,000. + az_ccap_countable_income: 2_000 + +- name: Case 3, a non-student minor's earnings count toward countable income. + # Without the student exclusion, the teen's $12,000/year is countable, so the + # result is higher than Case 2 -- confirming the exclusion is what removes it. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + person2: + age: 4 + person3: + age: 16 + is_full_time_student: false + employment_income: 12_000 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: AZ + output: + # ($24,000 + $12,000)/12 = $3,000. + az_ccap_countable_income: 3_000 + +- name: Case 4, child support paid is deducted from countable income. + # R6-5-4914(H): deduct legally mandated child support paid for dependents + # residing outside the household. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + child_support_expense: 6_000 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + # $24,000/12 - $6,000/12 = $2,000 - $500 = $1,500. + az_ccap_countable_income: 1_500 diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_fee_level.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_fee_level.yaml index bee8862c258..013a503968a 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_fee_level.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_fee_level.yaml @@ -61,3 +61,102 @@ state_code: AZ output: az_ccap_fee_level: 7 + +- name: Case 4, zero-income family of two at fee level 1. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + # $0/month is at or below the family-size-2 level 1 threshold ($1,499). + az_ccap_fee_level: 1 + +- name: Case 5, family of two at fee level 2. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 19_200 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + # $19,200/year = $1,600/month, between level 1 ($1,499) and level 2 ($1,763). + az_ccap_fee_level: 2 + +- name: Case 6, family of two at fee level 4. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 29_400 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + # $29,400/year = $2,450/month, between level 3 ($2,381) and level 4 ($2,557). + az_ccap_fee_level: 4 + +- name: Case 7, family of two at fee level 6. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 33_600 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + # $33,600/year = $2,800/month, between level 5 ($2,733) and level 6 ($2,909). + az_ccap_fee_level: 6 + +- name: Case 8, family of two above the level 7 threshold has fee level 0. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 63_600 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + # $63,600/year = $5,300/month, above the family-size-2 level 7 threshold ($5,202). + az_ccap_fee_level: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_income_limit.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_income_limit.yaml new file mode 100644 index 00000000000..2ff3f1102d7 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_income_limit.yaml @@ -0,0 +1,44 @@ +- name: Case 1, non-enrolled family of three uses the initial income limit. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 4 + person3: + age: 2 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: AZ + output: + # Non-enrolled applicants use the level 6 threshold (family size 3 = $3,665/month). + az_ccap_income_limit: 3_665 + +- name: Case 2, enrolled family of three uses the higher ongoing income limit. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 4 + person3: + age: 2 + spm_units: + spm_unit: + members: [person1, person2, person3] + az_ccap_enrolled: true + households: + household: + members: [person1, person2, person3] + state_code: AZ + output: + # Enrolled recipients use the level 7 threshold (family size 3 = $6,426/month). + az_ccap_income_limit: 6_426 diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/integration.yaml index 79a6ba92f91..548fb7a95b4 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/integration.yaml @@ -130,3 +130,63 @@ az_ccap_special_needs_child: [false, true] # min($24,000 / 12, $89.81 * 20) - ($0.50 * 20) = $1,786.20. az_ccap: 1_786.20 + +- name: Case 6, foster family above the income limit is eligible via categorical bypass. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 40 + employment_income: 60_000 + person2: + age: 0 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + is_in_foster_care: true + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 20_000 + households: + household: + members: [person1, person2] + state_code: AZ + output: + # $60,000/year = $5,000/month countable, above the family-size-2 level 6 + # limit ($2,909), so the family is income-ineligible. The foster child makes + # the family categorically eligible without regard to income, and copay exempt. + az_ccap_income_eligible: false + az_ccap_categorically_eligible: true + az_ccap_copay_exempt: true + az_ccap_eligible: true + # min($20,000 / 12, $64.15 * 20) - $0 = $1,283. + az_ccap: 1_283 + +- name: Case 7, monthly benefit rolls up to the annual federal child care subsidy total. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 40 + person2: + age: 0 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 20_000 + households: + household: + members: [person1, person2] + state_code: AZ + output: + # Monthly benefit min($20,000/12, $64.15 * 20) - ($0.50 * 20) = $1,273, + # summed over 12 months = $15,276. + az_ccap: 15_276 + az_child_care_subsidies: 15_276 + child_care_subsidies: 15_276 diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap.py index 7a70e08ada7..224d5d7d5e4 100644 --- a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap.py +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap.py @@ -9,8 +9,8 @@ class az_ccap(Variable): definition_period = MONTH defined_for = "az_ccap_eligible" reference = ( - "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1", - "https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=39", + "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf", + "https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=40", ) def formula(spm_unit, period): diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_age_group.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_age_group.py index ace259da181..09facb85c0d 100644 --- a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_age_group.py +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_age_group.py @@ -17,7 +17,7 @@ class az_ccap_age_group(Variable): definition_period = MONTH label = "Arizona Child Care Assistance Program age group" defined_for = StateCode.AZ - reference = "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1" + reference = "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf" def formula(person, period, parameters): p = parameters(period).gov.states.az.hhs.ccap diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_copay.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_copay.py index 21daef00478..b04ff6e30dc 100644 --- a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_copay.py +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_copay.py @@ -19,6 +19,9 @@ def formula(spm_unit, period, parameters): fee_level = spm_unit("az_ccap_fee_level", period) eligible_child = person("az_ccap_eligible_child", period) attending_days = person("childcare_attending_days_per_month", period.this_year) + # We don't model the Transitional Child Care (TCC) rule that waives the + # copay beyond the third child at the moment, since TCC enrollment is not + # separately tracked; the copay applies per eligible child for all families. per_child_copay = p.daily[fee_level] * attending_days * eligible_child return where( spm_unit("az_ccap_copay_exempt", period), diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_copay_exempt.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_copay_exempt.py index b504b522d4a..60329944ed8 100644 --- a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_copay_exempt.py +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_copay_exempt.py @@ -14,10 +14,7 @@ class az_ccap_copay_exempt(Variable): ) def formula(spm_unit, period, parameters): - person = spm_unit.members - tanf_enrolled = spm_unit("is_tanf_enrolled", period) - protective_services = spm_unit.any( - person("receives_or_needs_protective_services", period.this_year) - ) - foster_care = spm_unit.any(person("is_in_foster_care", period)) - return tanf_enrolled | protective_services | foster_care + # R6-5-4915: the same families served without regard to income under + # R6-5-4914(A) (DCS/DDD/foster referrals, Cash Assistance/Jobs families) + # also have no fee or copayment. + return spm_unit("az_ccap_categorically_eligible", period) diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_daily_rate.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_daily_rate.py index 6d203d24835..c663138470c 100644 --- a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_daily_rate.py +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_daily_rate.py @@ -12,7 +12,7 @@ class az_ccap_daily_rate(Variable): definition_period = MONTH defined_for = "az_ccap_eligible_child" reference = ( - "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1", + "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf", "https://des.az.gov/services/child-and-family/child-care/des-contracted-child-care-provider-resources", ) @@ -43,4 +43,11 @@ def formula(person, period, parameters): base_rate * p.quality_multiplier, ) regular_rate = where(quality, quality_rate, base_rate) + # CCA-1210B item 14: a disabled child (documented via IFSP/IEP/ISP/504 plan — + # we use is_disabled as a proxy) at a provider with a 3-5 star Quality First + # rating or national accreditation (the `quality` gate) receives the flat + # Special Needs Enhanced Rate, which replaces the base/age/provider rate. + # We don't model the separate +35% CDA tier for CDA-credentialed certified + # family / in-home providers at the moment (the +40% quality tier dominates + # it wherever a provider holds both credentials). return where(special_needs & quality, p.special_needs, regular_rate) diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_max_reimbursement.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_max_reimbursement.py index 8727d4b945b..04bfc4c5335 100644 --- a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_max_reimbursement.py +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_max_reimbursement.py @@ -9,8 +9,8 @@ class az_ccap_max_reimbursement(Variable): definition_period = MONTH defined_for = "az_ccap_eligible_child" reference = ( - "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1", - "https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=39", + "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf", + "https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=40", ) def formula(person, period, parameters): diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_provider_type.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_provider_type.py index 0b1daee56c9..8b5b7531ead 100644 --- a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_provider_type.py +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_provider_type.py @@ -16,4 +16,4 @@ class az_ccap_provider_type(Variable): definition_period = MONTH label = "Arizona Child Care Assistance Program provider type" defined_for = StateCode.AZ - reference = "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1" + reference = "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf" diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_quality_enhanced_provider.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_quality_enhanced_provider.py index ef49628fede..45db05aa296 100644 --- a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_quality_enhanced_provider.py +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_quality_enhanced_provider.py @@ -9,5 +9,5 @@ class az_ccap_quality_enhanced_provider(Variable): defined_for = StateCode.AZ reference = ( "https://des.az.gov/services/child-and-family/child-care/des-contracted-child-care-provider-resources", - "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1", + "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf", ) diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_special_needs_child.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_special_needs_child.py index fa9799b9db2..a03051ac2d2 100644 --- a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_special_needs_child.py +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_special_needs_child.py @@ -8,8 +8,8 @@ class az_ccap_special_needs_child(Variable): definition_period = MONTH defined_for = StateCode.AZ reference = ( - "https://des.az.gov/sites/default/files/dl/CCA-1210B.pdf#page=5", - "https://des.az.gov/sites/default/files/dl/CCA-1210B.pdf#page=13", + "https://des.az.gov/sites/default/files/dl/CCA-1210B.pdf#page=6", + "https://des.az.gov/sites/default/files/dl/CCA-1210B.pdf#page=14", ) def formula(person, period, parameters): diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.py b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.py index 499894a68ee..00c5846d9c9 100644 --- a/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.py +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.py @@ -9,10 +9,16 @@ class az_ccap_activity_eligible(Variable): defined_for = StateCode.AZ reference = ( "https://des.az.gov/services/child-and-family/child-care/how-apply-for-child-care-assistance", - "https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=25", + "https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=26", ) def formula(spm_unit, period, parameters): + # R6-5-4912 qualifying activities: employment, education/training, + # teen-parent education, a treatment plan for inability to provide care, + # drug/alcohol rehabilitation, court-ordered community service, and a + # shelter case plan. We model employment, education/training, and inability + # to provide care (is_disabled); we don't separately track rehabilitation, + # court-ordered community service, or shelter case plans at the moment. person = spm_unit.members head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) working = person("weekly_hours_worked", period.this_year) > 0 diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_categorically_eligible.py b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_categorically_eligible.py new file mode 100644 index 00000000000..00258053231 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_categorically_eligible.py @@ -0,0 +1,31 @@ +from policyengine_us.model_api import * + + +class az_ccap_categorically_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Categorically eligible for Arizona Child Care Assistance without regard to income" + definition_period = MONTH + defined_for = StateCode.AZ + reference = ( + # R6-5-4914(A) Child Care Assistance Without Regard to Income + "https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=29", + # R6-5-4915 (no fee/copayment for these families) + "https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=33", + ) + + def formula(spm_unit, period, parameters): + person = spm_unit.members + # R6-5-4914(A): Cash Assistance / Jobs participants needing child care for + # an activity, and families referred by DCS/DDD or in foster care, receive + # Child Care Assistance without regard to income (and without a copay under + # R6-5-4915). The "needing child care for an activity" condition is enforced + # separately by az_ccap_activity_eligible, so we do not re-test employment + # here. We don't separately track Jobs-program participation at the moment, + # so it is folded into Cash Assistance (TANF) enrollment. + tanf_enrolled = spm_unit("is_tanf_enrolled", period) + protective_services = spm_unit.any( + person("receives_or_needs_protective_services", period.this_year) + ) + foster_care = spm_unit.any(person("is_in_foster_care", period)) + return tanf_enrolled | protective_services | foster_care diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible.py b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible.py index 217e179f185..f93d6f31869 100644 --- a/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible.py +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible.py @@ -7,11 +7,23 @@ class az_ccap_eligible(Variable): label = "Eligible for Arizona Child Care Assistance Program" definition_period = MONTH defined_for = StateCode.AZ - reference = "https://des.az.gov/services/child-and-family/child-care/how-apply-for-child-care-assistance" + reference = ( + "https://des.az.gov/services/child-and-family/child-care/how-apply-for-child-care-assistance", + # R6-5-4914(A) Child Care Assistance Without Regard to Income + "https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=29", + ) def formula(spm_unit, period, parameters): has_eligible_child = add(spm_unit, period, ["az_ccap_eligible_child"]) > 0 income_eligible = spm_unit("az_ccap_income_eligible", period) + # R6-5-4914(A): DCS/DDD/foster referrals and Cash Assistance/Jobs families + # qualify without regard to income. + categorically_eligible = spm_unit("az_ccap_categorically_eligible", period) asset_eligible = spm_unit("is_ccdf_asset_eligible", period.this_year) activity_eligible = spm_unit("az_ccap_activity_eligible", period) - return has_eligible_child & income_eligible & asset_eligible & activity_eligible + return ( + has_eligible_child + & (income_eligible | categorically_eligible) + & asset_eligible + & activity_eligible + ) diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible_child.py b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible_child.py index 21512134e3d..e512f5f13b7 100644 --- a/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible_child.py +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible_child.py @@ -9,11 +9,21 @@ class az_ccap_eligible_child(Variable): defined_for = StateCode.AZ reference = ( "https://des.az.gov/services/child-and-family/child-care/how-apply-for-child-care-assistance", - "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1", + "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf", + "https://www.law.cornell.edu/cfr/text/45/98.20", ) def formula(person, period, parameters): p = parameters(period).gov.states.az.hhs.ccap.eligibility age = person("age", period.this_year) attending_days = person("childcare_attending_days_per_month", period.this_year) - return (age < p.child_age_limit) & (attending_days > 0) + # AZ defines an eligible child as "a child less than 13 years of age" + # (R6-5-4901(27)) for all children; there is no higher ceiling for disabled + # children (the Special Needs Rate itself is birth-through-12 on CCA-1227A), + # so we don't model a 13-17 special-needs age extension. + # CCDF (45 CFR 98.20) requires the child to be a citizen or qualified + # noncitizen, consistent with every other state CCAP implementation. + immigration_eligible = person( + "is_ccdf_immigration_eligible_child", period.this_year + ) + return (age < p.child_age_limit) & (attending_days > 0) & immigration_eligible diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_countable_income.py b/policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_countable_income.py index 2d16c6aa097..6d1b91affda 100644 --- a/policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_countable_income.py +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_countable_income.py @@ -8,5 +8,32 @@ class az_ccap_countable_income(Variable): label = "Arizona Child Care Assistance Program countable income" definition_period = MONTH defined_for = StateCode.AZ - reference = "https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=28" - adds = "gov.states.az.hhs.ccap.income.countable_income.sources" + reference = ( + # R6-5-4914(F) countable income + "https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=31", + # R6-5-4914(G)(13) excluded school-age minor earnings; + # R6-5-4914(H) child support paid deduction + "https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=32", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.az.hhs.ccap.income.countable_income + countable = add(spm_unit, period, p.sources) + person = spm_unit.members + # R6-5-4914(G)(13): exclude the earnings of a child under 18 attending + # high school / training who is not a minor parent. Minor parents are the + # head/spouse of their own tax unit, so only non-head/spouse minor students + # are excluded here. + age = person("age", period.this_year) + is_student = person("is_full_time_student", period.this_year) + is_head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) + is_excluded_minor = (age < 18) & is_student & ~is_head_or_spouse + minor_earnings = ( + person("employment_income", period) + + person("self_employment_income", period) + ) * is_excluded_minor + excluded_minor_earnings = spm_unit.sum(minor_earnings) + # R6-5-4914(H): deduct legally mandated child support paid for dependents + # residing outside the household. + child_support_paid = add(spm_unit, period, ["child_support_expense"]) + return max_(countable - excluded_minor_earnings - child_support_paid, 0) diff --git a/sources/working_references.md b/sources/working_references.md deleted file mode 100644 index f3c72699a22..00000000000 --- a/sources/working_references.md +++ /dev/null @@ -1,94 +0,0 @@ -# Arizona Child Care Assistance Program (CCAP) Working References - -Workflow prefix: `az-ccap` -Issue: https://github.com/PolicyEngine/policyengine-us/issues/8370 - -## Official Sources - -1. Arizona Department of Economic Security, "How to Apply for Child Care Assistance" - - URL: https://des.az.gov/services/child-and-family/child-care/how-apply-for-child-care-assistance - - Key text: Program helps families pay for child care for children under age 13 so parents/guardians can work, attend school, or participate in eligible activities. Assistance is also available for children experiencing homelessness and children referred by DCS or Tribal child welfare. - - Eligibility page states families are required to cost-share based on family size and income. - - Eligibility page states child care assistance is available to families at or below 165% FPL with children birth through age 12 who live in Arizona and meet listed eligible activities/needs. - - DES does not consider income for referrals from TANF Jobs, Department of Child Safety, or Tribal child welfare. - - Ongoing recipients must report income above 85% of SMI; redetermination occurs every 12 months. - -2. Arizona DES, "Child Care Assistance Gross Monthly Income Eligibility Chart and Fee Schedule FFY 2026", CCA-0229A, effective October 1, 2025. - - URL: https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1 - - Initial application gross monthly income maximum: at or below 165% FPL, fee levels L1-L6. - - Redetermination gross monthly income maximum: at or below 85% SMI, fee levels L1-L7. - - Family-size table, monthly thresholds: - - Size 1: L1 0-1,110; L2 1,111-1,305; L3 1,306-1,762; L4 1,763-1,893; L5 1,894-2,023; L6 2,024-2,154; L7 3,978. - - Size 2: L1 0-1,499; L2 1,500-1,763; L3 1,764-2,381; L4 2,382-2,557; L5 2,558-2,733; L6 2,734-2,909; L7 5,202. - - Size 3: L1 0-1,888; L2 1,889-2,221; L3 2,222-2,999; L4 3,000-3,221; L5 3,222-3,443; L6 3,444-3,665; L7 6,426. - - Size 4: L1 0-2,278; L2 2,279-2,680; L3 2,681-3,618; L4 3,619-3,886; L5 3,887-4,154; L6 4,155-4,422; L7 7,649. - - Size 5: L1 0-2,668; L2 2,669-3,138; L3 3,139-4,237; L4 4,238-4,551; L5 4,552-4,864; L6 4,865-5,178; L7 8,874. - - Size 6: L1 0-3,057; L2 3,058-3,596; L3 3,597-4,855; L4 4,856-5,215; L5 5,216-5,574; L6 5,575-5,934; L7 10,098. - - Size 7: L1 0-3,447; L2 3,448-4,055; L3 4,056-5,475; L4 5,476-5,880; L5 5,881-6,286; L6 6,287-6,691; L7 10,327. - - Size 8: L1 0-3,837; L2 3,838-4,513; L3 4,514-6,093; L4 6,094-6,544; L5 6,545-6,996; L6 6,997-7,447; L7 10,557. - - Size 9: L1 0-4,226; L2 4,227-4,971; L3 4,972-6,711; L4 6,712-7,208; L5 7,209-7,706; L6 7,707-8,203; L7 10,786. - - Size 10: L1 0-4,616; L2 4,617-5,430; L3 5,431-7,331; L4 7,332-7,874; L5 7,875-8,417; L6 8,418-8,960; L7 11,015. - - Size 11: L1 0-5,005; L2 5,006-5,888; L3 5,889-7,949; L4 7,950-8,538; L5 8,539-9,127; L6 9,128-9,716; L7 11,244. - - Size 12: L1 0-5,395; L2 5,396-6,346; L3 6,347-8,568; L4 8,569-9,202; L5 9,203-9,837; L6 9,838-10,471; L7 11,474. - - Minimum required copayment per child in care: - - L1-L3: $0.50 daily rate. - - L4: $1.00 daily rate. - - L5: $1.50 daily rate. - - L6-L7: $2.50 daily rate. - - TCC: no copay assigned beyond the 3rd child in the family. - - Daily rate applies for 15 minutes or more. - - DCS/Foster Care, Jobs Program, and working Cash Assistance families may not have a fee level or minimum required copay, but may owe charges above state reimbursement maximums or provider additional costs. - -3. Arizona DES, "Maximum Reimbursement Rates for Child Care", CCA-1227A, effective November 1, 2025. - - URL: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf#page=1 - - Centers daily rates / quality rates: - - Under 1: $64.15 / $89.81. - - Age 1-2: $48.70 / $68.18. - - Age 3-5: $42.00 / $58.80. - - Age 6-12: summer $35.00 / $49.00; school-year $25.00 / $35.00. - - Group homes daily rates / quality rates: - - Under 1: $40.00 / $56.00. - - Age 1-2: $36.00 / $50.40. - - Age 3-5: $35.00 / $49.00. - - Age 6-12: summer $30.00 / $42.00; school-year $21.00 / $29.40. - - Certified family homes and certified in-home providers daily / CDA quality / quality rates: - - Under 1: $40.00 / $54.00 / $56.00. - - Age 1-2: $30.00 / $40.50 / $42.00. - - Age 3-5: $30.00 / $40.50 / $42.00. - - Age 6-12: summer $25.00 / $33.50 / $35.00; school-year $20.00 / $27.00 / $28.00. - - Non-certified relative provider rate: birth through age 12, $15.00 daily. - - Special needs rate: birth through age 12, $89.81 daily. - - Daily rate is paid when attending for 15 minutes or more. - - Quality rate: 3-, 4-, or 5-star Quality First, approved national accreditation, or Head Start performance standards program-wide receive 40% increase; family child care providers with CDA receive 35% increase. - - School-age children receive summer daily rate during May-July and school-year rate during August-April. - -4. Arizona Administrative Code, Title 6, Chapter 5, Article 49, Child Care Assistance. - - URL: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=24 - - R6-5-4911 general eligibility: applicant/recipient must comply with procedural requirements and provide complete truthful information; rule defines eligible applicant/child and allowable providers. - - URL: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=25 - - R6-5-4912 eligible activities/needs include employment, education/training, teen parent high school/GED/remedial education, treatment plan for inability to care, drug/alcohol rehabilitation or court-ordered community service, and shelter case plan. - - URL: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=28 - - R6-5-4914 income eligibility: some applicants may receive assistance without regard to income; income eligibility uses gross monthly countable income; countable income includes wages, self-employment, unemployment, workers compensation, alimony/spousal maintenance, child support, veterans benefits, monthly gifts, gambling/lottery, and other non-excluded income. - - URL: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=31 - - R6-5-4914 excluded income includes loans, tax refunds, EITC, SNAP/USDA food value, WIC/school lunch/child nutrition benefits, foster care maintenance, adoption subsidy, educational loans/grants/scholarships/work-study, and earnings of a child under 18 attending high school/training who is not a minor parent needing care. - - URL: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=32 - - R6-5-4914 income calculation: calculate each income source separately, add sources to total monthly income, convert non-monthly income to monthly, anticipate income from most recent 30-day period, and convert fixed weekly/biweekly/semimonthly income using 4.3, 2.15, and 2 multipliers. - - URL: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=33 - - R6-5-4915: fee level is based on family size and monthly gross countable income; copayment is per child based on fee level and number of children needing care; no fee/copayment for Jobs participants, working Cash Assistance participants needing child care, or families referred by CPS/DDD (current DES page uses DCS/Tribal child welfare). - - URL: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=39 - - R6-5-4925: Department shall pay for authorized child care at a rate not exceeding Appendix B reimbursement rates. - - URL: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=39 - - Appendix A contains child care assistance gross monthly income eligibility chart and fee schedule. - - URL: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=41 - - Appendix B contains maximum reimbursement rates for child care. - -## Existing PolicyEngine References - -- `policyengine_us/variables/gov/states/nh/dhhs/ccap`: complete CCAP pattern for eligibility, cost share, payment rates, and subsidy = min(pre-subsidy expense, payment rate) - family cost share. -- `policyengine_us/variables/gov/states/ak/dpa/ccap`: complete CCAP pattern with provider categories, age groups, copay, rates, special needs, and state-level registration in CCDF totals. -- `policyengine_us/variables/gov/states/sc/dss/ccap`: provider types, age groups, time categories, copay tiers, quality levels, and weekly benefit patterns. -- Existing input variables likely reusable: `pre_subsidy_childcare_expenses`, `spm_unit_pre_subsidy_childcare_expenses`, `childcare_days_per_week`, `childcare_hours_per_day`, `childcare_hours_per_week`, `is_tanf_enrolled`, `is_parent`, `age`, `immigration_status`, `is_disabled`, `employment_income`, `self_employment_income`, `unemployment_compensation`, `child_support_received`, `alimony_income`, `veterans_benefits`, `workers_compensation`, `pension_income`, `spm_unit_size`, `spm_unit_fpg`. - -## Fetch Notes - -- Local `curl` downloads from `des.az.gov` and `apps.azsos.gov` returned Cloudflare challenge HTML, not PDFs. The source text and page numbers above were available through indexed official-source access. No official source was excluded for lack of access. From 06c7b6fcde43efa582c18cdb1ee7fc8137a800ea Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 1 Jun 2026 15:47:17 -0400 Subject: [PATCH 3/3] Apply second-round review fixes for Arizona CCAP - Count SSI, railroad retirement, and general assistance as countable income (R6-5-4914(F)(5),(8)) - Round countable income down to the whole dollar (R6-5-4914(I)) - Exclude all of a minor student's earnings, including SSTB and farm self-employment, not just wages (R6-5-4914(G)(13)) - Restrict the without-regard-to-income / fee-exempt categorical treatment for Cash Assistance families to those employed (R6-5-4914(A)(2)) - Require adults using education as their activity to work >=20 hours/week; education alone qualifies only teen parents under 20 (R6-5-4912(A)(3)-(4)) - Move the changelog fragment to a top-level path (changelog.d/8370.added.md) - Add tests: SSI counted, farm-earnings exclusion, whole-dollar floor, teen-parent activity, corrected adult-student activity Co-Authored-By: Claude Opus 4.8 (1M context) --- changelog.d/{added/8370.md => 8370.added.md} | 0 .../ccap/income/countable_income/sources.yaml | 3 + .../az_ccap_activity_eligible.yaml | 27 ++++++- .../ccap/income/az_ccap_countable_income.yaml | 71 +++++++++++++++++++ .../eligibility/az_ccap_activity_eligible.py | 23 +++--- .../az_ccap_categorically_eligible.py | 21 +++--- .../ccap/income/az_ccap_countable_income.py | 6 +- 7 files changed, 131 insertions(+), 20 deletions(-) rename changelog.d/{added/8370.md => 8370.added.md} (100%) diff --git a/changelog.d/added/8370.md b/changelog.d/8370.added.md similarity index 100% rename from changelog.d/added/8370.md rename to changelog.d/8370.added.md diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/countable_income/sources.yaml index b1c8ad94134..5bbdbca423d 100644 --- a/policyengine_us/parameters/gov/states/az/hhs/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/countable_income/sources.yaml @@ -13,6 +13,9 @@ values: - pension_income - retirement_distributions - social_security + - ssi + - railroad_benefits + - general_assistance - disability_benefits - interest_income - dividend_income diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.yaml index 4d3986e3934..6ace90a41b4 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.yaml @@ -36,7 +36,7 @@ output: az_ccap_activity_eligible: false -- name: Case 3, full-time student parent is activity eligible. +- name: Case 3, adult full-time student with no work is not activity eligible. period: 2026-01 input: people: @@ -54,7 +54,9 @@ members: [person1, person2] state_code: AZ output: - az_ccap_activity_eligible: true + # R6-5-4912(A)(3): adult education requires an average of >=20 hours/week of + # work; education alone does not qualify an adult. + az_ccap_activity_eligible: false - name: Case 4, disabled parent unable to provide care is activity eligible. period: 2026-01 @@ -104,3 +106,24 @@ # person2 is a head/spouse with no qualifying activity, so the # head_or_spouse & ~eligible_person sum is nonzero and the unit fails. az_ccap_activity_eligible: false + +- name: Case 6, teen parent under 20 in school without work is activity eligible. + period: 2026-01 + input: + people: + person1: + age: 18 + weekly_hours_worked: 0 + is_full_time_student: true + person2: + age: 1 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + # R6-5-4912(A)(4): teen parents under age 20 qualify via education without work. + az_ccap_activity_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_countable_income.yaml index ed8d665b304..334319b696f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_countable_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_countable_income.yaml @@ -96,3 +96,74 @@ output: # $24,000/12 - $6,000/12 = $2,000 - $500 = $1,500. az_ccap_countable_income: 1_500 + +- name: Case 5, SSI counts as countable income. + # R6-5-4914(F)(8): public assistance including SSI is countable income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + ssi: 800 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + # $800/month SSI is counted directly (SSI is a monthly variable). + az_ccap_countable_income: 800 + +- name: Case 6, a minor student's farm earnings are excluded. + # R6-5-4914(G)(13) excludes the child's earnings generally, including farm and + # SSTB self-employment, not just wages. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + person2: + age: 4 + person3: + age: 16 + is_full_time_student: true + farm_operations_income: 12_000 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: AZ + output: + # ($24,000 + $12,000)/12 - $12,000/12 = $3,000 - $1,000 = $2,000. + az_ccap_countable_income: 2_000 + +- name: Case 7, countable income is rounded down to the whole dollar. + # R6-5-4914(I): the Department uses the whole-dollar amount only, rounded down. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_006 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + # $18,006/12 = $1,500.50 -> rounded down to $1,500. + az_ccap_countable_income: 1_500 diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.py b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.py index 00c5846d9c9..96b25f2d215 100644 --- a/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.py +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.py @@ -13,16 +13,23 @@ class az_ccap_activity_eligible(Variable): ) def formula(spm_unit, period, parameters): - # R6-5-4912 qualifying activities: employment, education/training, - # teen-parent education, a treatment plan for inability to provide care, - # drug/alcohol rehabilitation, court-ordered community service, and a - # shelter case plan. We model employment, education/training, and inability - # to provide care (is_disabled); we don't separately track rehabilitation, - # court-ordered community service, or shelter case plans at the moment. + # R6-5-4912 qualifying activities: employment, education/training (with a + # work requirement for adults), teen-parent education, inability to provide + # care, drug/alcohol rehabilitation, court-ordered community service, and a + # shelter case plan. We model employment and inability to provide care + # (is_disabled); we don't separately track rehabilitation, court-ordered + # community service, or shelter case plans at the moment. person = spm_unit.members head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) + # R6-5-4912(A)(1): employment, full or part-time, is a qualifying activity. working = person("weekly_hours_worked", period.this_year) > 0 - student = person("is_full_time_student", period.this_year) + # R6-5-4912(A)(3) requires adults using education as their activity to also + # work an average of >=20 hours/week (already captured by `working`), so + # education on its own only qualifies teen parents under age 20 (A)(4). + age = person("age", period.this_year) + teen_parent_student = (age < 20) & person( + "is_full_time_student", period.this_year + ) unable_to_care = person("is_disabled", period.this_year) - eligible_person = working | student | unable_to_care + eligible_person = working | teen_parent_student | unable_to_care return spm_unit.sum(head_or_spouse & ~eligible_person) == 0 diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_categorically_eligible.py b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_categorically_eligible.py index 00258053231..fe58eabff1b 100644 --- a/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_categorically_eligible.py +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_categorically_eligible.py @@ -16,16 +16,19 @@ class az_ccap_categorically_eligible(Variable): def formula(spm_unit, period, parameters): person = spm_unit.members - # R6-5-4914(A): Cash Assistance / Jobs participants needing child care for - # an activity, and families referred by DCS/DDD or in foster care, receive - # Child Care Assistance without regard to income (and without a copay under - # R6-5-4915). The "needing child care for an activity" condition is enforced - # separately by az_ccap_activity_eligible, so we do not re-test employment - # here. We don't separately track Jobs-program participation at the moment, - # so it is folded into Cash Assistance (TANF) enrollment. - tanf_enrolled = spm_unit("is_tanf_enrolled", period) + head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) + employed = person("weekly_hours_worked", period.this_year) > 0 + # R6-5-4914(A)(1)-(A)(2): Cash Assistance / Jobs participants qualify without + # regard to income only when they need child care to maintain employment, so + # we require an employed head/spouse. (Jobs-program participation is folded + # into Cash Assistance / TANF enrollment, as it is not separately tracked.) + cash_assistance_for_work = spm_unit("is_tanf_enrolled", period) & spm_unit.any( + head_or_spouse & employed + ) + # R6-5-4914(A)(3): DCS/DDD referrals and foster-care families qualify + # regardless of income or employment. protective_services = spm_unit.any( person("receives_or_needs_protective_services", period.this_year) ) foster_care = spm_unit.any(person("is_in_foster_care", period)) - return tanf_enrolled | protective_services | foster_care + return cash_assistance_for_work | protective_services | foster_care diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_countable_income.py b/policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_countable_income.py index 6d1b91affda..6ae190707ec 100644 --- a/policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_countable_income.py +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_countable_income.py @@ -31,9 +31,13 @@ def formula(spm_unit, period, parameters): minor_earnings = ( person("employment_income", period) + person("self_employment_income", period) + + person("sstb_self_employment_income", period) + + person("farm_operations_income", period) ) * is_excluded_minor excluded_minor_earnings = spm_unit.sum(minor_earnings) # R6-5-4914(H): deduct legally mandated child support paid for dependents # residing outside the household. child_support_paid = add(spm_unit, period, ["child_support_expense"]) - return max_(countable - excluded_minor_earnings - child_support_paid, 0) + net = max_(countable - excluded_minor_earnings - child_support_paid, 0) + # R6-5-4914(I): use the whole-dollar amount only, rounded down. + return np.floor(net)