diff --git a/changelog.d/8370.added.md b/changelog.d/8370.added.md new file mode 100644 index 00000000000..00fbfb6aa6a --- /dev/null +++ b/changelog.d/8370.added.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 748e5f5bffc..9920759cd00 100644 --- a/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml +++ b/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml @@ -4,6 +4,7 @@ values: - ak_child_care_subsidies # Alaska Child Care Assistance Program (PASS) - ar_child_care_subsidies # Arkansas School Readiness Assistance - al_child_care_subsidies # Alabama Child Care Subsidy Program + - 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 eb18a6283e4..0ca695272aa 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -41,6 +41,8 @@ values: - al_child_care_subsidies # Alaska benefits - ak_ssp + # Arizona benefits + - az_child_care_subsidies # Florida benefits - fl_oss # Idaho benefits @@ -120,6 +122,8 @@ values: - al_child_care_subsidies # 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/copay/daily.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/copay/daily.yaml new file mode 100644 index 00000000000..e294c598e11 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/copay/daily.yaml @@ -0,0 +1,28 @@ +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: 1 +3: + 2025-10-01: 1.5 +4: + 2025-10-01: 1.5 +5: + 2025-10-01: 1.5 +6: + 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 new file mode 100644 index 00000000000..1d8580648c8 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/eligibility/child_age_limit.yaml @@ -0,0 +1,13 @@ +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 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=26 + - 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/eligibility/teen_parent_age_limit.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/eligibility/teen_parent_age_limit.yaml new file mode 100644 index 00000000000..4d344892b64 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/eligibility/teen_parent_age_limit.yaml @@ -0,0 +1,10 @@ +description: Arizona treats a parent under this age as a teen parent, who may qualify for the Child Care Assistance Program education activity without a work requirement. +values: + 2025-10-01: 20 +metadata: + unit: year + period: year + label: Arizona CCAP teen parent age limit + reference: + - title: Arizona Administrative Code R6-5-4912(A)(4)(a) (the teen parent is under age 20) + href: https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=27 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..5ec98a36f05 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/countable_income/sources.yaml @@ -0,0 +1,34 @@ +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 + - ssi + - railroad_benefits + - general_assistance + - disability_benefits + - interest_income + - dividend_income + - rental_income + - financial_assistance + - gambling_winnings + +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=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/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..c811c7ecd60 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/max_family_size.yaml @@ -0,0 +1,11 @@ +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..0286d631341 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_1.yaml @@ -0,0 +1,38 @@ +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..aa752c6f355 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_2.yaml @@ -0,0 +1,38 @@ +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..75c7c22a8b6 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_3.yaml @@ -0,0 +1,38 @@ +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..112d447ebfb --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_4.yaml @@ -0,0 +1,38 @@ +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..2912b0d8a2c --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_5.yaml @@ -0,0 +1,38 @@ +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..9fb702c4574 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_6.yaml @@ -0,0 +1,38 @@ +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..be2ddf12c7a --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_7.yaml @@ -0,0 +1,38 @@ +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/reimbursement/age_group/infant_max.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/age_group/infant_max.yaml new file mode 100644 index 00000000000..74396683268 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/age_group/infant_max.yaml @@ -0,0 +1,11 @@ +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 diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/age_group/preschool_max.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/age_group/preschool_max.yaml new file mode 100644 index 00000000000..e250361dbc3 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/age_group/preschool_max.yaml @@ -0,0 +1,11 @@ +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 diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/age_group/toddler_max.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/age_group/toddler_max.yaml new file mode 100644 index 00000000000..303b15ff541 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/age_group/toddler_max.yaml @@ -0,0 +1,11 @@ +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 diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/rates/center.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/rates/center.yaml new file mode 100644 index 00000000000..f66d34d685b --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/rates/center.yaml @@ -0,0 +1,20 @@ +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 +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/reimbursement/rates/certified_family.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/rates/certified_family.yaml new file mode 100644 index 00000000000..d7e0e19e243 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/rates/certified_family.yaml @@ -0,0 +1,20 @@ +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 +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/reimbursement/rates/group_home.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/rates/group_home.yaml new file mode 100644 index 00000000000..f8f4ffc1113 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/rates/group_home.yaml @@ -0,0 +1,20 @@ +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 +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/reimbursement/rates/quality_multiplier.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/rates/quality_multiplier.yaml new file mode 100644 index 00000000000..59cb4df2340 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/rates/quality_multiplier.yaml @@ -0,0 +1,13 @@ +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 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 diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/rates/relative.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/rates/relative.yaml new file mode 100644 index 00000000000..0f49236d47e --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/rates/relative.yaml @@ -0,0 +1,20 @@ +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 +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/reimbursement/rates/special_needs.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/rates/special_needs.yaml new file mode 100644 index 00000000000..33b36594710 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/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 + - title: Arizona DES Child Care Provider Registration Agreement + 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=14 diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/school_age_summer/end_month.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/school_age_summer/end_month.yaml new file mode 100644 index 00000000000..32f26193bab --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/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 diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/school_age_summer/start_month.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/school_age_summer/start_month.yaml new file mode 100644 index 00000000000..b9ca26b14f9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/reimbursement/school_age_summer/start_month.yaml @@ -0,0 +1,11 @@ +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 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 83ef1f1f1a0..919a75c39e0 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -460,7 +460,7 @@ programs: category: Benefits agency: HHS status: partial - coverage: AK, AR, AL, CA, CO, CT, DE, DC, FL, HI, IA, ID, IL, IN, KS, KY, MA, MD, ME, NC, NH, NJ, PA, RI, SC, TX, VA, VT, WA, WV + coverage: AK, AR, AL, AZ, CA, CO, CT, DE, DC, FL, HI, IA, ID, IL, IN, KS, KY, MA, MD, ME, NC, NH, NJ, PA, RI, SC, TX, VA, VT, WA, WV state_implementations: - state: AK status: complete @@ -480,6 +480,12 @@ programs: full_name: Alabama Child Care Subsidy Program variable: al_ccsp parameter_prefix: gov.states.al.dhr.ccsp + - state: AZ + status: complete + name: CCAP + full_name: Arizona Child Care Assistance Program + variable: az_ccap + parameter_prefix: gov.states.az.hhs.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 new file mode 100644 index 00000000000..f15c59763f1 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap.yaml @@ -0,0 +1,128 @@ +- 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 + +- 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_before_lsr: 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_before_lsr: 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/copay/az_ccap_copay.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/copay/az_ccap_copay.yaml new file mode 100644 index 00000000000..a589f7ed15d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/copay/az_ccap_copay.yaml @@ -0,0 +1,117 @@ +- 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 + +- name: Case 4, copay sums across two attending children. + # Two eligible children both attending 20 days at fee level 1 ($0.50/day): + # 2 x ($0.50 x 20) = $20. Verifies the per-child copay summation. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 4 + childcare_attending_days_per_month: 20 + person3: + age: 6 + childcare_attending_days_per_month: 20 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: AZ + output: + az_ccap_copay: 20 + +- name: Case 5, fee level 7 copay for an enrolled family. + # Enrolled family reaching fee level 7 ($2.50/day): $2.50 x 20 = $50. + 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 + 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 + az_ccap_copay: 50 diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/copay/az_ccap_copay_exempt.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/copay/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/copay/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/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..5fd4e5678e1 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.yaml @@ -0,0 +1,196 @@ +- name: Case 1, single working parent is activity eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + weekly_hours_worked_before_lsr: 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_before_lsr: 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, adult full-time student with no work is not activity eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + weekly_hours_worked_before_lsr: 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: + # 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 + input: + people: + person1: + age: 30 + weekly_hours_worked_before_lsr: 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_before_lsr: 40 + person2: + age: 33 + weekly_hours_worked_before_lsr: 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 + +- name: Case 6, teen parent under 20 in secondary school without work is activity eligible. + period: 2026-01 + input: + people: + parent: + age: 18 + weekly_hours_worked_before_lsr: 0 + is_in_secondary_school: true + own_children_in_household: 1 + child: + age: 1 + spm_units: + spm_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: AZ + output: + # R6-5-4912(A)(4): teen parents under age 20 in secondary school qualify via + # education without a work requirement. + az_ccap_activity_eligible: true + +- name: Case 7, adult college student without work is not activity eligible. + period: 2026-01 + input: + people: + person1: + age: 22 + weekly_hours_worked_before_lsr: 0 + is_full_time_student: true + person2: + age: 2 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + # College is not secondary school, and the adult does not work, so the + # education exception does not apply (R6-5-4912(A)(3)-(4)). + az_ccap_activity_eligible: false + +- name: Case 8, non-working caretaker of a foster child is activity eligible. + period: 2026-01 + input: + people: + person1: + age: 40 + weekly_hours_worked_before_lsr: 0 + child: + age: 4 + is_in_foster_care: true + spm_units: + spm_unit: + members: [person1, child] + households: + household: + members: [person1, child] + state_code: AZ + output: + # R6-5-4912(A)(9): a CPS/DDD foster case plan is itself an eligible need, so + # the family qualifies without an employment activity. + az_ccap_activity_eligible: true + +- name: Case 9, non-working caretaker of a protective-services child is activity eligible. + period: 2026-01 + input: + people: + person1: + age: 40 + weekly_hours_worked_before_lsr: 0 + child: + age: 4 + receives_or_needs_protective_services: true + spm_units: + spm_unit: + members: [person1, child] + households: + household: + members: [person1, child] + state_code: AZ + output: + # R6-5-4912(A)(9): a CPS-referred case plan is itself an eligible need. + az_ccap_activity_eligible: true 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.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible.yaml new file mode 100644 index 00000000000..4570253f6aa --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible.yaml @@ -0,0 +1,90 @@ +- name: Case 1, working family with an eligible low-income child is eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + weekly_hours_worked_before_lsr: 40 + 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_eligible: true + +- name: Case 2, family with no eligible child is not eligible. + # The only child is 13, so there is no eligible child and the gate fails + # regardless of income/activity. + period: 2026-01 + input: + people: + person1: + age: 30 + weekly_hours_worked_before_lsr: 40 + person2: + age: 13 + childcare_attending_days_per_month: 20 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_eligible: false + +- name: Case 3, high-income foster family qualifies via the categorical pathway. + # Income is far above the limit (so income_eligible is false) and the parent + # does not work, but a foster child makes the unit categorically eligible + # (R6-5-4914(A)(3)) and satisfies the activity-or-need test (R6-5-4912(A)(9)). + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 120_000 + weekly_hours_worked_before_lsr: 0 + person2: + age: 4 + childcare_attending_days_per_month: 20 + is_in_foster_care: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_income_eligible: false + az_ccap_categorically_eligible: true + az_ccap_eligible: true + +- name: Case 4, eligible low-income child but no qualifying activity is not eligible. + # The parent does not work and the unit is not categorically eligible, so the + # activity gate fails even though income and the child both qualify. + period: 2026-01 + input: + people: + person1: + age: 30 + weekly_hours_worked_before_lsr: 0 + 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_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..5ae1fe63128 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible_child.yaml @@ -0,0 +1,72 @@ +- 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 + +- name: Case 5, child aged 12 is the highest eligible age. + # R6-5-4901(27): an eligible child is birth through 12 years of age, so age 12 + # must still qualify (pins the < 13 boundary against an off-by-one flip). + period: 2026-01 + input: + people: + person1: + age: 12 + childcare_attending_days_per_month: 20 + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_eligible_child: 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 new file mode 100644 index 00000000000..c00f7193b99 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_countable_income.yaml @@ -0,0 +1,192 @@ +- 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 + +- 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 + +- name: Case 8, recurring cash gifts and gambling proceeds count as income. + # R6-5-4914(F)(16)-(17): monthly cash gifts and lottery/gambling proceeds are countable. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + financial_assistance: 6_000 + gambling_winnings: 12_000 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + # ($6,000 + $12,000)/12 = $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 new file mode 100644 index 00000000000..05d1e61e5b2 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_fee_level.yaml @@ -0,0 +1,204 @@ +- 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 + +- 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 + +- name: Case 9, income exactly at the level 1 threshold is fee level 1. + # The fee level uses `income <= threshold`, so a family-size-2 income of exactly + # $1,499/month falls in level 1 (pins the inclusive boundary). + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 17_988 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + # $17,988/year = $1,499/month = the family-size-2 level 1 threshold exactly. + az_ccap_fee_level: 1 + +- name: Case 10, income one dollar above the level 1 threshold is fee level 2. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + # $18,000/year = $1,500/month, just above level 1 ($1,499) and at/below level 2 ($1,763). + az_ccap_fee_level: 2 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..5489ef9d8e8 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_income_eligible.yaml @@ -0,0 +1,64 @@ +- 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/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 new file mode 100644 index 00000000000..53982be21bf --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/integration.yaml @@ -0,0 +1,192 @@ +- 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 + +- 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_before_lsr: 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_before_lsr: 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/tests/policy/baseline/gov/states/az/hhs/ccap/reimbursement/az_ccap_age_group.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/reimbursement/az_ccap_age_group.yaml new file mode 100644 index 00000000000..0d5b18a9f27 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/reimbursement/az_ccap_age_group.yaml @@ -0,0 +1,105 @@ +- 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 + +- name: Case 7, age 5 is the top of the preschool group. + # Pins the preschool/school-age boundary (age < 6) against an off-by-one flip. + period: 2026-01 + input: + people: + person1: + age: 5 + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_age_group: PRESCHOOL + +- name: Case 8, age 6 is the bottom of the school-age group. + period: 2026-01 + input: + people: + person1: + age: 6 + 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/reimbursement/az_ccap_daily_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/reimbursement/az_ccap_daily_rate.yaml new file mode 100644 index 00000000000..c2fee8b523c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/reimbursement/az_ccap_daily_rate.yaml @@ -0,0 +1,305 @@ +- 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 + +- 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 + +- name: Case 16, special needs child without a quality provider falls back to the base rate. + # The flat Special Needs Rate ($89.81) applies only at a quality-enhanced provider; + # without quality the child gets the regular center preschool base rate ($42.00). + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 4 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + is_disabled: true + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_special_needs_child: true + az_ccap_daily_rate: 42.00 + +- name: Case 17, relative provider with the quality flag still gets the flat relative rate. + # Relatives are excluded from the quality multiplier, so a quality flag does not + # raise the $15 relative 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 + az_ccap_quality_enhanced_provider: true + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_daily_rate: 15 + +- name: Case 18, certified family quality enhanced rate applies the multiplier. + # $30 preschool base x 1.4 quality multiplier = $42.00. + 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 + az_ccap_quality_enhanced_provider: true + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_daily_rate: 42.00 diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/reimbursement/az_ccap_max_reimbursement.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/reimbursement/az_ccap_max_reimbursement.yaml new file mode 100644 index 00000000000..a5d4bdc8ceb --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/reimbursement/az_ccap_max_reimbursement.yaml @@ -0,0 +1,54 @@ +- 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 + +- name: Case 3, whole-year reimbursement applies the summer rate May through July. + # A school-age (age 7) child at a center attending 10 days/month all year. + # School-year months (Aug-Apr, 9 months) reimburse at $25/day; summer months + # (May-Jul, 3 months) at $35/day. The whole-year period exercises the seasonal + # split through the monthly rollup: + # 9 x $25 x 10 + 3 x $35 x 10 = $2,250 + $1,050 = $3,300. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 7 + childcare_attending_days_per_month: 10 + az_ccap_provider_type: CENTER + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_max_reimbursement: 3_300 diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/reimbursement/az_ccap_special_needs_child.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/reimbursement/az_ccap_special_needs_child.yaml new file mode 100644 index 00000000000..2f9091e2f00 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/reimbursement/az_ccap_special_needs_child.yaml @@ -0,0 +1,84 @@ +- name: Case 1, disabled eligible child is a special needs child. + period: 2026-01 + input: + people: + person1: + age: 4 + childcare_attending_days_per_month: 20 + is_disabled: true + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_special_needs_child: true + +- name: Case 2, disabled child who is not an eligible child is not a special needs child. + # A 13-year-old is not an eligible child, so disability alone is insufficient + # (pins the AND with az_ccap_eligible_child). + period: 2026-01 + input: + people: + person1: + age: 13 + childcare_attending_days_per_month: 20 + is_disabled: true + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_special_needs_child: false + +- name: Case 3, eligible child with none of the disability flags is not a special needs child. + period: 2026-01 + input: + people: + person1: + age: 4 + childcare_attending_days_per_month: 20 + is_disabled: false + has_individualized_education_program: false + has_developmental_delay: false + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_special_needs_child: false + +- name: Case 4, eligible child with an IEP is a special needs child. + # CCA-1210B item 14(ii): a child with an Individualized Education Program (IEP) + # qualifies even without the generic is_disabled flag. + period: 2026-01 + input: + people: + person1: + age: 4 + childcare_attending_days_per_month: 20 + is_disabled: false + has_individualized_education_program: true + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_special_needs_child: true + +- name: Case 5, eligible child with a developmental delay is a special needs child. + # CCA-1210B item 14(i)/(iii): a child with a documented developmental delay + # (AzEIP / IFSP or DDD / ISP pathway) qualifies. + period: 2026-01 + input: + people: + person1: + age: 2 + childcare_attending_days_per_month: 20 + is_disabled: false + has_developmental_delay: true + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_special_needs_child: true 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..224d5d7d5e4 --- /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", + "https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=40", + ) + + 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_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/copay/az_ccap_copay.py b/policyengine_us/variables/gov/states/az/hhs/ccap/copay/az_ccap_copay.py new file mode 100644 index 00000000000..8786ef7cef1 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/copay/az_ccap_copay.py @@ -0,0 +1,35 @@ +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) + # 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. + # `fee_level` is SPMUnit-level, so project it to persons before multiplying + # by the person-level attendance/eligibility arrays (avoids a NumPy + # broadcasting error when SPM units and persons differ in count). + per_child_copay = ( + spm_unit.project(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/copay/az_ccap_copay_exempt.py b/policyengine_us/variables/gov/states/az/hhs/ccap/copay/az_ccap_copay_exempt.py new file mode 100644 index 00000000000..60329944ed8 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/copay/az_ccap_copay_exempt.py @@ -0,0 +1,20 @@ +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): + # 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/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..b961c658dfb --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.py @@ -0,0 +1,49 @@ +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=26", + ) + + def formula(spm_unit, period, parameters): + # 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. + p = parameters(period).gov.states.az.hhs.ccap.eligibility + 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. + # Use pre-labor-supply-response hours so a reform's behavioral change in + # hours worked cannot feed back into this eligibility gate. + working = person("weekly_hours_worked_before_lsr", period.this_year) > 0 + # 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 (A)(4): a parent under + # the teen-parent age limit attending secondary school (high school / GED / + # ESOL / remedial). + teen_parent_in_school = ( + (person("age", period.this_year) < p.teen_parent_age_limit) + & person("is_in_secondary_school", period.this_year) + & person("is_parent", period.this_year) + ) + unable_to_care = person("is_disabled", period.this_year) + eligible_person = working | teen_parent_in_school | unable_to_care + all_parents_active = spm_unit.sum(head_or_spouse & ~eligible_person) == 0 + # R6-5-4912(A)(9): a CPS-referred or CPS/DDD foster case plan is itself an + # eligible NEED, satisfying the activity-or-need test for the family + # without an employment requirement. (R6-5-4914(A)(3) likewise serves + # these families without regard to income.) + protective_or_foster_need = spm_unit.any( + person("receives_or_needs_protective_services", period.this_year) + ) | spm_unit.any(person("is_in_foster_care", period)) + return all_parents_active | protective_or_foster_need 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..2c1df47dcad --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_categorically_eligible.py @@ -0,0 +1,36 @@ +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 + head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) + # Pre-labor-supply-response hours so a reform's behavioral change in hours + # worked cannot feed back into this eligibility gate. + employed = person("weekly_hours_worked_before_lsr", 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 cash_assistance_for_work | 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 new file mode 100644 index 00000000000..f93d6f31869 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible.py @@ -0,0 +1,29 @@ +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", + # 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 | 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 new file mode 100644 index 00000000000..e512f5f13b7 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible_child.py @@ -0,0 +1,29 @@ +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", + "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) + # 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 new file mode 100644 index 00000000000..6ae190707ec --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/income/az_ccap_countable_income.py @@ -0,0 +1,43 @@ +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 = ( + # 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) + + 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"]) + 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) 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/policyengine_us/variables/gov/states/az/hhs/ccap/reimbursement/az_ccap_age_group.py b/policyengine_us/variables/gov/states/az/hhs/ccap/reimbursement/az_ccap_age_group.py new file mode 100644 index 00000000000..df754adce72 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/reimbursement/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" + + def formula(person, period, parameters): + p = parameters(period).gov.states.az.hhs.ccap.reimbursement + 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/reimbursement/az_ccap_daily_rate.py b/policyengine_us/variables/gov/states/az/hhs/ccap/reimbursement/az_ccap_daily_rate.py new file mode 100644 index 00000000000..dfe3592c4f2 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/reimbursement/az_ccap_daily_rate.py @@ -0,0 +1,53 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.az.hhs.ccap.reimbursement.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", + "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.reimbursement.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) + # 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/reimbursement/az_ccap_max_reimbursement.py b/policyengine_us/variables/gov/states/az/hhs/ccap/reimbursement/az_ccap_max_reimbursement.py new file mode 100644 index 00000000000..04bfc4c5335 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/reimbursement/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", + "https://apps.azsos.gov/public_services/Title_06/6-05.pdf#page=40", + ) + + 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/reimbursement/az_ccap_provider_type.py b/policyengine_us/variables/gov/states/az/hhs/ccap/reimbursement/az_ccap_provider_type.py new file mode 100644 index 00000000000..8b5b7531ead --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/reimbursement/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" diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/reimbursement/az_ccap_quality_enhanced_provider.py b/policyengine_us/variables/gov/states/az/hhs/ccap/reimbursement/az_ccap_quality_enhanced_provider.py new file mode 100644 index 00000000000..45db05aa296 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/reimbursement/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", + ) diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/reimbursement/az_ccap_special_needs_child.py b/policyengine_us/variables/gov/states/az/hhs/ccap/reimbursement/az_ccap_special_needs_child.py new file mode 100644 index 00000000000..2ab9e8c48c5 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/reimbursement/az_ccap_special_needs_child.py @@ -0,0 +1,25 @@ +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=6", + "https://des.az.gov/sites/default/files/dl/CCA-1210B.pdf#page=14", + ) + + def formula(person, period, parameters): + # CCA-1210B item 14: a child with special needs has a documented disability + # via an IFSP (AzEIP / IDEA Part C), an IEP (special education / IDEA Part B), + # an ISP (Division of Developmental Disabilities), or a 504 Plan. We + # approximate those pathways with the available person-level flags. + has_documented_disability = ( + person("is_disabled", period.this_year) + | person("has_individualized_education_program", period.this_year) + | person("has_developmental_delay", period.this_year) + ) + return person("az_ccap_eligible_child", period) & has_documented_disability