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 e088954f857..0d3f08fc018 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 @@ -3,6 +3,7 @@ values: 2021-01-01: - ak_child_care_subsidies # Alaska Child Care Assistance Program (PASS) - ar_child_care_subsidies # Arkansas School Readiness Assistance + - 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 2bf546a0e07..f7df8f31fe7 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -40,6 +40,8 @@ values: - al_ssp # Alaska benefits - ak_ssp + # Arizona benefits + - az_child_care_subsidies # Florida benefits - fl_oss # Idaho benefits @@ -116,6 +118,8 @@ values: - al_ssp # Alaska benefits - ak_ssp + # Arizona benefits + - az_child_care_subsidies # Florida benefits - fl_oss # Idaho benefits diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/infant_max.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/infant_max.yaml new file mode 100644 index 00000000000..d113eecd01d --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/infant_max.yaml @@ -0,0 +1,12 @@ +description: Arizona limits child age to this threshold under the Child Care Assistance Program. +values: + 2025-11-01: 1 + +metadata: + unit: year + period: year + label: Arizona CCAP infant age group maximum age + reference: + - title: Arizona DES Maximum Reimbursement Rates for Child Care + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/preschool_max.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/preschool_max.yaml new file mode 100644 index 00000000000..349bc759df5 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/preschool_max.yaml @@ -0,0 +1,12 @@ +description: Arizona limits child age to this threshold under the Child Care Assistance Program. +values: + 2025-11-01: 6 + +metadata: + unit: year + period: year + label: Arizona CCAP age 3-5 age group maximum age + reference: + - title: Arizona DES Maximum Reimbursement Rates for Child Care + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/toddler_max.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/toddler_max.yaml new file mode 100644 index 00000000000..cecf8717076 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/age_group/toddler_max.yaml @@ -0,0 +1,12 @@ +description: Arizona limits child age to this threshold under the Child Care Assistance Program. +values: + 2025-11-01: 3 + +metadata: + unit: year + period: year + label: Arizona CCAP age 1-2 age group maximum age + reference: + - title: Arizona DES Maximum Reimbursement Rates for Child Care + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf + 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..a616796d549 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/copay/daily.yaml @@ -0,0 +1,29 @@ +description: Arizona provides this amount as the daily copay under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: day + label: Arizona CCAP daily copay by fee level + breakdown: + - range(0,8) + breakdown_labels: + - Fee level + reference: + - title: Arizona DES Child Care Assistance Gross Monthly Income Eligibility Chart and Fee Schedule FFY 2026 + href: https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1 +0: + 2025-10-01: 0 +1: + 2025-10-01: 0.5 +2: + 2025-10-01: 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..12f358296ec --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/eligibility/child_age_limit.yaml @@ -0,0 +1,14 @@ +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=25 + - title: Arizona DES How to Apply for Child Care Assistance + href: https://des.az.gov/services/child-and-family/child-care/how-apply-for-child-care-assistance + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/countable_income/sources.yaml new file mode 100644 index 00000000000..5bbdbca423d --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/countable_income/sources.yaml @@ -0,0 +1,33 @@ +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 + +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..06ef17aee17 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/max_family_size.yaml @@ -0,0 +1,12 @@ +description: Arizona limits family size to this threshold under the Child Care Assistance Program. +values: + 2025-10-01: 12 + +metadata: + unit: person + period: year + label: Arizona CCAP maximum income table family size + reference: + - title: Arizona DES Child Care Assistance Gross Monthly Income Eligibility Chart and Fee Schedule FFY 2026 + href: https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_1.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_1.yaml new file mode 100644 index 00000000000..f3bcb14e926 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_1.yaml @@ -0,0 +1,39 @@ +description: Arizona limits gross income to this amount under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: month + label: Arizona CCAP fee level 1 income threshold + breakdown: + - range(0,13) + breakdown_labels: + - Family size + reference: + - title: Arizona DES Child Care Assistance Gross Monthly Income Eligibility Chart and Fee Schedule FFY 2026 + href: https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1 +0: + 2025-10-01: 0 +1: + 2025-10-01: 1_110 +2: + 2025-10-01: 1_499 +3: + 2025-10-01: 1_888 +4: + 2025-10-01: 2_278 +5: + 2025-10-01: 2_668 +6: + 2025-10-01: 3_057 +7: + 2025-10-01: 3_447 +8: + 2025-10-01: 3_837 +9: + 2025-10-01: 4_226 +10: + 2025-10-01: 4_616 +11: + 2025-10-01: 5_005 +12: + 2025-10-01: 5_395 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_2.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_2.yaml new file mode 100644 index 00000000000..787b1870932 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_2.yaml @@ -0,0 +1,39 @@ +description: Arizona limits gross income to this amount under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: month + label: Arizona CCAP fee level 2 income threshold + breakdown: + - range(0,13) + breakdown_labels: + - Family size + reference: + - title: Arizona DES Child Care Assistance Gross Monthly Income Eligibility Chart and Fee Schedule FFY 2026 + href: https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1 +0: + 2025-10-01: 0 +1: + 2025-10-01: 1_305 +2: + 2025-10-01: 1_763 +3: + 2025-10-01: 2_221 +4: + 2025-10-01: 2_680 +5: + 2025-10-01: 3_138 +6: + 2025-10-01: 3_596 +7: + 2025-10-01: 4_055 +8: + 2025-10-01: 4_513 +9: + 2025-10-01: 4_971 +10: + 2025-10-01: 5_430 +11: + 2025-10-01: 5_888 +12: + 2025-10-01: 6_346 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_3.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_3.yaml new file mode 100644 index 00000000000..62f2d0f42d1 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_3.yaml @@ -0,0 +1,39 @@ +description: Arizona limits gross income to this amount under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: month + label: Arizona CCAP fee level 3 income threshold + breakdown: + - range(0,13) + breakdown_labels: + - Family size + reference: + - title: Arizona DES Child Care Assistance Gross Monthly Income Eligibility Chart and Fee Schedule FFY 2026 + href: https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1 +0: + 2025-10-01: 0 +1: + 2025-10-01: 1_762 +2: + 2025-10-01: 2_381 +3: + 2025-10-01: 2_999 +4: + 2025-10-01: 3_618 +5: + 2025-10-01: 4_237 +6: + 2025-10-01: 4_855 +7: + 2025-10-01: 5_475 +8: + 2025-10-01: 6_093 +9: + 2025-10-01: 6_711 +10: + 2025-10-01: 7_331 +11: + 2025-10-01: 7_949 +12: + 2025-10-01: 8_568 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_4.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_4.yaml new file mode 100644 index 00000000000..f6fd19ee667 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_4.yaml @@ -0,0 +1,39 @@ +description: Arizona limits gross income to this amount under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: month + label: Arizona CCAP fee level 4 income threshold + breakdown: + - range(0,13) + breakdown_labels: + - Family size + reference: + - title: Arizona DES Child Care Assistance Gross Monthly Income Eligibility Chart and Fee Schedule FFY 2026 + href: https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1 +0: + 2025-10-01: 0 +1: + 2025-10-01: 1_893 +2: + 2025-10-01: 2_557 +3: + 2025-10-01: 3_221 +4: + 2025-10-01: 3_886 +5: + 2025-10-01: 4_551 +6: + 2025-10-01: 5_215 +7: + 2025-10-01: 5_880 +8: + 2025-10-01: 6_544 +9: + 2025-10-01: 7_208 +10: + 2025-10-01: 7_874 +11: + 2025-10-01: 8_538 +12: + 2025-10-01: 9_202 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_5.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_5.yaml new file mode 100644 index 00000000000..3f5bba0e772 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_5.yaml @@ -0,0 +1,39 @@ +description: Arizona limits gross income to this amount under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: month + label: Arizona CCAP fee level 5 income threshold + breakdown: + - range(0,13) + breakdown_labels: + - Family size + reference: + - title: Arizona DES Child Care Assistance Gross Monthly Income Eligibility Chart and Fee Schedule FFY 2026 + href: https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1 +0: + 2025-10-01: 0 +1: + 2025-10-01: 2_023 +2: + 2025-10-01: 2_733 +3: + 2025-10-01: 3_443 +4: + 2025-10-01: 4_154 +5: + 2025-10-01: 4_864 +6: + 2025-10-01: 5_574 +7: + 2025-10-01: 6_286 +8: + 2025-10-01: 6_996 +9: + 2025-10-01: 7_706 +10: + 2025-10-01: 8_417 +11: + 2025-10-01: 9_127 +12: + 2025-10-01: 9_837 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_6.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_6.yaml new file mode 100644 index 00000000000..e0ca4e45098 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_6.yaml @@ -0,0 +1,39 @@ +description: Arizona limits gross income to this amount under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: month + label: Arizona CCAP fee level 6 income threshold + breakdown: + - range(0,13) + breakdown_labels: + - Family size + reference: + - title: Arizona DES Child Care Assistance Gross Monthly Income Eligibility Chart and Fee Schedule FFY 2026 + href: https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1 +0: + 2025-10-01: 0 +1: + 2025-10-01: 2_154 +2: + 2025-10-01: 2_909 +3: + 2025-10-01: 3_665 +4: + 2025-10-01: 4_422 +5: + 2025-10-01: 5_178 +6: + 2025-10-01: 5_934 +7: + 2025-10-01: 6_691 +8: + 2025-10-01: 7_447 +9: + 2025-10-01: 8_203 +10: + 2025-10-01: 8_960 +11: + 2025-10-01: 9_716 +12: + 2025-10-01: 10_471 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_7.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_7.yaml new file mode 100644 index 00000000000..d536774e5bf --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/income/threshold/level_7.yaml @@ -0,0 +1,39 @@ +description: Arizona limits gross income to this amount under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: month + label: Arizona CCAP fee level 7 income threshold + breakdown: + - range(0,13) + breakdown_labels: + - Family size + reference: + - title: Arizona DES Child Care Assistance Gross Monthly Income Eligibility Chart and Fee Schedule FFY 2026 + href: https://des.az.gov/sites/default/files/dl/CCA-0229AFY26.pdf#page=1 +0: + 2025-10-01: 0 +1: + 2025-10-01: 3_978 +2: + 2025-10-01: 5_202 +3: + 2025-10-01: 6_426 +4: + 2025-10-01: 7_649 +5: + 2025-10-01: 8_874 +6: + 2025-10-01: 10_098 +7: + 2025-10-01: 10_327 +8: + 2025-10-01: 10_557 +9: + 2025-10-01: 10_786 +10: + 2025-10-01: 11_015 +11: + 2025-10-01: 11_244 +12: + 2025-10-01: 11_474 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/center.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/center.yaml new file mode 100644 index 00000000000..81e48a4fc7c --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/center.yaml @@ -0,0 +1,21 @@ +description: Arizona provides this amount as the daily reimbursement rate under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: day + label: Arizona CCAP child care center daily reimbursement rate + breakdown: + - az_ccap_age_group + reference: + - title: Arizona DES Maximum Reimbursement Rates for Child Care + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf +INFANT: + 2025-11-01: 64.15 +TODDLER: + 2025-11-01: 48.70 +PRESCHOOL: + 2025-11-01: 42 +SCHOOL_AGE_SUMMER: + 2025-11-01: 35 +SCHOOL_AGE_SCHOOL_YEAR: + 2025-11-01: 25 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/certified_family.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/certified_family.yaml new file mode 100644 index 00000000000..3b6e5f7d072 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/certified_family.yaml @@ -0,0 +1,21 @@ +description: Arizona provides this amount as the daily reimbursement rate under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: day + label: Arizona CCAP certified family or in-home daily reimbursement rate + breakdown: + - az_ccap_age_group + reference: + - title: Arizona DES Maximum Reimbursement Rates for Child Care + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf +INFANT: + 2025-11-01: 40 +TODDLER: + 2025-11-01: 30 +PRESCHOOL: + 2025-11-01: 30 +SCHOOL_AGE_SUMMER: + 2025-11-01: 25 +SCHOOL_AGE_SCHOOL_YEAR: + 2025-11-01: 20 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/group_home.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/group_home.yaml new file mode 100644 index 00000000000..a957d4f8529 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/group_home.yaml @@ -0,0 +1,21 @@ +description: Arizona provides this amount as the daily reimbursement rate under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: day + label: Arizona CCAP group home daily reimbursement rate + breakdown: + - az_ccap_age_group + reference: + - title: Arizona DES Maximum Reimbursement Rates for Child Care + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf +INFANT: + 2025-11-01: 40 +TODDLER: + 2025-11-01: 36 +PRESCHOOL: + 2025-11-01: 35 +SCHOOL_AGE_SUMMER: + 2025-11-01: 30 +SCHOOL_AGE_SCHOOL_YEAR: + 2025-11-01: 21 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/quality_multiplier.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/quality_multiplier.yaml new file mode 100644 index 00000000000..e6e74a563c9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/quality_multiplier.yaml @@ -0,0 +1,14 @@ +description: Arizona uses this share to increase provider rates under the Child Care Assistance Program. +values: + 2025-11-01: 1.4 + +metadata: + unit: /1 + period: year + label: Arizona CCAP quality enhanced rate multiplier + reference: + - title: Arizona DES 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/rates/relative.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/relative.yaml new file mode 100644 index 00000000000..39e144f8b65 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/relative.yaml @@ -0,0 +1,21 @@ +description: Arizona provides this amount as the daily reimbursement rate under the Child Care Assistance Program. +metadata: + unit: currency-USD + period: day + label: Arizona CCAP non-certified relative daily reimbursement rate + breakdown: + - az_ccap_age_group + reference: + - title: Arizona DES Maximum Reimbursement Rates for Child Care + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf +INFANT: + 2025-11-01: 15 +TODDLER: + 2025-11-01: 15 +PRESCHOOL: + 2025-11-01: 15 +SCHOOL_AGE_SUMMER: + 2025-11-01: 15 +SCHOOL_AGE_SCHOOL_YEAR: + 2025-11-01: 15 + diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/special_needs.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/special_needs.yaml new file mode 100644 index 00000000000..33b36594710 --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/rates/special_needs.yaml @@ -0,0 +1,15 @@ +description: Arizona provides this amount as the daily special needs reimbursement rate under the Child Care Assistance Program. +values: + 2025-11-01: 89.81 + +metadata: + unit: currency-USD + period: day + label: Arizona CCAP special needs daily reimbursement rate + reference: + - title: Arizona DES Maximum Reimbursement Rates for Child Care + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf + - 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/school_age_summer/end_month.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/school_age_summer/end_month.yaml new file mode 100644 index 00000000000..32f26193bab --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/school_age_summer/end_month.yaml @@ -0,0 +1,11 @@ +description: Arizona sets this threshold as the end month under the Child Care Assistance Program. +values: + 2025-11-01: 7 + +metadata: + unit: month + period: year + label: Arizona CCAP school-age summer rate end month + reference: + - title: Arizona DES Maximum Reimbursement Rates for Child Care + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf diff --git a/policyengine_us/parameters/gov/states/az/hhs/ccap/school_age_summer/start_month.yaml b/policyengine_us/parameters/gov/states/az/hhs/ccap/school_age_summer/start_month.yaml new file mode 100644 index 00000000000..c52b2165e1e --- /dev/null +++ b/policyengine_us/parameters/gov/states/az/hhs/ccap/school_age_summer/start_month.yaml @@ -0,0 +1,12 @@ +description: Arizona sets this threshold as the start month under the Child Care Assistance Program. +values: + 2025-11-01: 5 + +metadata: + unit: month + period: year + label: Arizona CCAP school-age summer rate start month + reference: + - title: Arizona DES Maximum Reimbursement Rates for Child Care + href: https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf + diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index d66185d7f72..0087b4ae56b 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, CA, CO, CT, DE, DC, IL, MA, MD, ME, NC, NH, NJ, PA, RI, SC, TX, VA, VT, WA, WV + coverage: AK, AR, AZ, CA, CO, CT, DE, DC, IL, MA, MD, ME, NC, NH, NJ, PA, RI, SC, TX, VA, VT, WA, WV state_implementations: - state: AK status: complete @@ -474,6 +474,11 @@ programs: full_name: Arkansas School Readiness Assistance variable: ar_sra parameter_prefix: gov.states.ar.ade.oec.sra + - state: AZ + status: complete + name: CCAP + full_name: Arizona Child Care Assistance Program + variable: az_ccap - state: CA status: complete name: CalWORKs childcare diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap.yaml new file mode 100644 index 00000000000..d420c7112d7 --- /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: 0 + person2: + age: 0 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 20_000 + households: + household: + members: [person1, person2] + state_code: AZ + output: + # Eligible child, income eligible, and asset eligible, but the parent has no + # qualifying activity, so the binding failure is activity eligibility. + az_ccap_eligible_child: [false, true] + az_ccap_income_eligible: true + az_ccap_activity_eligible: false + az_ccap_eligible: false + az_ccap: 0 + +- name: Case 5, family above the CCDF asset limit is ineligible on assets. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 40 + person2: + age: 0 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 20_000 + spm_unit_assets: 2_000_000 + households: + household: + members: [person1, person2] + state_code: AZ + output: + # Eligible child, income eligible, and activity eligible, but assets exceed the + # $1,000,000 CCDF asset limit, so the binding failure is asset eligibility. + az_ccap_income_eligible: true + az_ccap_activity_eligible: true + is_ccdf_asset_eligible: false + az_ccap_eligible: false + az_ccap: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_age_group.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_age_group.yaml new file mode 100644 index 00000000000..d3da2c1e51d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_age_group.yaml @@ -0,0 +1,78 @@ +- name: Case 1, infant under age 1. + period: 2026-01 + input: + people: + person1: + age: 0 + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_age_group: INFANT + +- name: Case 2, toddler at age 1. + period: 2026-01 + input: + people: + person1: + age: 1 + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_age_group: TODDLER + +- name: Case 3, toddler at age 2. + period: 2026-01 + input: + people: + person1: + age: 2 + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_age_group: TODDLER + +- name: Case 4, preschool at age 3. + period: 2026-01 + input: + people: + person1: + age: 3 + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_age_group: PRESCHOOL + +- name: Case 5, preschool at age 4. + period: 2026-01 + input: + people: + person1: + age: 4 + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_age_group: PRESCHOOL + +- name: Case 6, school-age child in January uses the school-year group. + # January (month 1) is outside the May-July summer window. + period: 2026-01 + input: + people: + person1: + age: 8 + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_age_group: SCHOOL_AGE_SCHOOL_YEAR diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_copay.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_copay.yaml new file mode 100644 index 00000000000..bc19578565b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_copay.yaml @@ -0,0 +1,66 @@ +- name: Case 1, fee level 1 copay for one child. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 4 + childcare_attending_days_per_month: 20 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_copay: 10 + +- name: Case 2, fee level 5 copay for one child. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 48_000 + person2: + age: 4 + childcare_attending_days_per_month: 20 + person3: + age: 2 + person4: + age: 1 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: AZ + output: + az_ccap_copay: 30 + +- name: Case 3, copay exempt family has no copay. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 4 + childcare_attending_days_per_month: 20 + receives_or_needs_protective_services: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_copay_exempt: true + az_ccap_copay: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_copay_exempt.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_copay_exempt.yaml new file mode 100644 index 00000000000..daa2d05b5f3 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_copay_exempt.yaml @@ -0,0 +1,74 @@ +- name: Case 1, family with a foster child is copay exempt. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_in_foster_care: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_copay_exempt: true + +- name: Case 2, family needing protective services is copay exempt. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + receives_or_needs_protective_services: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_copay_exempt: true + +- name: Case 3, TANF-enrolled family is copay exempt. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_copay_exempt: true + +- name: Case 4, non-categorical family is not copay exempt. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_copay_exempt: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_daily_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_daily_rate.yaml new file mode 100644 index 00000000000..03c0932434b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_daily_rate.yaml @@ -0,0 +1,248 @@ +- 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 diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_max_reimbursement.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_max_reimbursement.yaml new file mode 100644 index 00000000000..61b13d0bc90 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/az_ccap_max_reimbursement.yaml @@ -0,0 +1,33 @@ +- name: Case 1, center infant maximum reimbursement. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 0 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + households: + household: + members: [person1] + state_code: AZ + output: + # $64.15 daily rate x 20 attending days = $1,283. + az_ccap_max_reimbursement: 1_283 + +- name: Case 2, center preschool maximum reimbursement with fewer days. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 4 + childcare_attending_days_per_month: 15 + az_ccap_provider_type: CENTER + households: + household: + members: [person1] + state_code: AZ + output: + # $42 daily rate x 15 attending days = $630. + az_ccap_max_reimbursement: 630 diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.yaml new file mode 100644 index 00000000000..6ace90a41b4 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.yaml @@ -0,0 +1,129 @@ +- name: Case 1, single working parent is activity eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 40 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_activity_eligible: true + +- name: Case 2, single non-working parent is not activity eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 0 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_activity_eligible: false + +- name: Case 3, adult full-time student with no work is not activity eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 0 + is_full_time_student: true + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + # 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: 0 + is_disabled: true + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_activity_eligible: true + +- name: Case 5, two-parent family with one non-active parent is not activity eligible. + period: 2026-01 + input: + people: + person1: + age: 35 + weekly_hours_worked: 40 + person2: + age: 33 + weekly_hours_worked: 0 + is_full_time_student: false + person3: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: AZ + output: + # person2 is a head/spouse with no qualifying activity, so the + # head_or_spouse & ~eligible_person sum is nonzero and the unit fails. + az_ccap_activity_eligible: false + +- name: Case 6, teen parent under 20 in school without work is activity eligible. + period: 2026-01 + input: + people: + person1: + age: 18 + weekly_hours_worked: 0 + is_full_time_student: true + person2: + age: 1 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + # R6-5-4912(A)(4): teen parents under age 20 qualify via education without work. + az_ccap_activity_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_categorically_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_categorically_eligible.yaml new file mode 100644 index 00000000000..e46a7274e59 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_categorically_eligible.yaml @@ -0,0 +1,74 @@ +- name: Case 1, family with a foster child is categorically eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_in_foster_care: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_categorically_eligible: true + +- name: Case 2, family needing protective services is categorically eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + receives_or_needs_protective_services: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_categorically_eligible: true + +- name: Case 3, TANF-enrolled family is categorically eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_categorically_eligible: true + +- name: Case 4, family with none of the categorical conditions is not categorically eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_ccap_categorically_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible_child.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible_child.yaml new file mode 100644 index 00000000000..7f43e767c5c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/eligibility/az_ccap_eligible_child.yaml @@ -0,0 +1,56 @@ +- name: Case 1, citizen child under 13 attending care is an eligible child. + period: 2026-01 + input: + people: + person1: + age: 4 + childcare_attending_days_per_month: 20 + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_eligible_child: true + +- name: Case 2, child aged 13 is not an eligible child. + period: 2026-01 + input: + people: + person1: + age: 13 + childcare_attending_days_per_month: 20 + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_eligible_child: false + +- name: Case 3, child not attending care is not an eligible child. + period: 2026-01 + input: + people: + person1: + age: 4 + childcare_attending_days_per_month: 0 + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_eligible_child: false + +- name: Case 4, immigration-ineligible child is not an eligible child. + period: 2026-01 + input: + people: + person1: + age: 4 + childcare_attending_days_per_month: 20 + immigration_status: UNDOCUMENTED + households: + household: + members: [person1] + state_code: AZ + output: + az_ccap_eligible_child: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_countable_income.yaml new file mode 100644 index 00000000000..334319b696f --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_countable_income.yaml @@ -0,0 +1,169 @@ +- 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 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..013a503968a --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_fee_level.yaml @@ -0,0 +1,162 @@ +- 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 diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_income_eligible.yaml new file mode 100644 index 00000000000..f398be8c779 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/income/az_ccap_income_eligible.yaml @@ -0,0 +1,65 @@ +- name: Case 1, non-enrolled family at initial threshold is income eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 43_980 + person2: + age: 4 + person3: + age: 2 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: AZ + output: + # $43,980/year = $3,665/month, the family-size-3 initial threshold. + az_ccap_income_eligible: true + +- name: Case 2, non-enrolled family above initial threshold is not income eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 44_000 + person2: + age: 4 + person3: + age: 2 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: AZ + output: + az_ccap_income_eligible: false + +- name: Case 3, enrolled family above initial threshold but below ongoing threshold is income eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 44_000 + person2: + age: 4 + person3: + age: 2 + spm_units: + spm_unit: + members: [person1, person2, person3] + az_ccap_enrolled: true + households: + household: + members: [person1, person2, person3] + state_code: AZ + output: + az_ccap_income_eligible: true + diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/hhs/ccap/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..548fb7a95b4 --- /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: 40 + employment_income: 60_000 + person2: + age: 0 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + is_in_foster_care: true + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 20_000 + households: + household: + members: [person1, person2] + state_code: AZ + output: + # $60,000/year = $5,000/month countable, above the family-size-2 level 6 + # limit ($2,909), so the family is income-ineligible. The foster child makes + # the family categorically eligible without regard to income, and copay exempt. + az_ccap_income_eligible: false + az_ccap_categorically_eligible: true + az_ccap_copay_exempt: true + az_ccap_eligible: true + # min($20,000 / 12, $64.15 * 20) - $0 = $1,283. + az_ccap: 1_283 + +- name: Case 7, monthly benefit rolls up to the annual federal child care subsidy total. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 40 + person2: + age: 0 + childcare_attending_days_per_month: 20 + az_ccap_provider_type: CENTER + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 20_000 + households: + household: + members: [person1, person2] + state_code: AZ + output: + # Monthly benefit min($20,000/12, $64.15 * 20) - ($0.50 * 20) = $1,273, + # summed over 12 months = $15,276. + az_ccap: 15_276 + az_child_care_subsidies: 15_276 + child_care_subsidies: 15_276 diff --git a/policyengine_us/variables/gov/states/az/hhs/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_age_group.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_age_group.py new file mode 100644 index 00000000000..09facb85c0d --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_age_group.py @@ -0,0 +1,43 @@ +from policyengine_us.model_api import * + + +class AZCCAPAgeGroup(Enum): + INFANT = "Under age 1" + TODDLER = "Age 1 or 2" + PRESCHOOL = "Age 3 through 5" + SCHOOL_AGE_SUMMER = "Age 6 through 12, May through July" + SCHOOL_AGE_SCHOOL_YEAR = "Age 6 through 12, August through April" + + +class az_ccap_age_group(Variable): + value_type = Enum + entity = Person + possible_values = AZCCAPAgeGroup + default_value = AZCCAPAgeGroup.PRESCHOOL + definition_period = MONTH + label = "Arizona Child Care Assistance Program age group" + defined_for = StateCode.AZ + reference = "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf" + + def formula(person, period, parameters): + p = parameters(period).gov.states.az.hhs.ccap + age = person("age", period.this_year) + month = period.start.month + is_summer = (month >= p.school_age_summer.start_month) & ( + month <= p.school_age_summer.end_month + ) + return select( + [ + age < p.age_group.infant_max, + age < p.age_group.toddler_max, + age < p.age_group.preschool_max, + is_summer, + ], + [ + AZCCAPAgeGroup.INFANT, + AZCCAPAgeGroup.TODDLER, + AZCCAPAgeGroup.PRESCHOOL, + AZCCAPAgeGroup.SCHOOL_AGE_SUMMER, + ], + default=AZCCAPAgeGroup.SCHOOL_AGE_SCHOOL_YEAR, + ) diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_copay.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_copay.py new file mode 100644 index 00000000000..b04ff6e30dc --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_copay.py @@ -0,0 +1,30 @@ +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. + per_child_copay = p.daily[fee_level] * attending_days * eligible_child + return where( + spm_unit("az_ccap_copay_exempt", period), + 0, + spm_unit.sum(per_child_copay), + ) diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_copay_exempt.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_copay_exempt.py new file mode 100644 index 00000000000..60329944ed8 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/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/az_ccap_daily_rate.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_daily_rate.py new file mode 100644 index 00000000000..c663138470c --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_daily_rate.py @@ -0,0 +1,53 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.az.hhs.ccap.az_ccap_provider_type import ( + AZCCAPProviderType, +) + + +class az_ccap_daily_rate(Variable): + value_type = float + entity = Person + unit = USD + label = "Arizona Child Care Assistance Program daily reimbursement rate" + definition_period = MONTH + defined_for = "az_ccap_eligible_child" + reference = ( + "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf", + "https://des.az.gov/services/child-and-family/child-care/des-contracted-child-care-provider-resources", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.az.hhs.ccap.rates + provider_type = person("az_ccap_provider_type", period) + age_group = person("az_ccap_age_group", period) + quality = person("az_ccap_quality_enhanced_provider", period) + special_needs = person("az_ccap_special_needs_child", period) + base_rate = select( + [ + provider_type == AZCCAPProviderType.CENTER, + provider_type == AZCCAPProviderType.GROUP_HOME, + provider_type == AZCCAPProviderType.CERTIFIED_FAMILY, + provider_type == AZCCAPProviderType.RELATIVE, + ], + [ + p.center[age_group], + p.group_home[age_group], + p.certified_family[age_group], + p.relative[age_group], + ], + default=p.center[age_group], + ) + quality_rate = where( + provider_type == AZCCAPProviderType.RELATIVE, + base_rate, + base_rate * p.quality_multiplier, + ) + regular_rate = where(quality, quality_rate, base_rate) + # CCA-1210B item 14: a disabled child (documented via IFSP/IEP/ISP/504 plan — + # we use is_disabled as a proxy) at a provider with a 3-5 star Quality First + # rating or national accreditation (the `quality` gate) receives the flat + # Special Needs Enhanced Rate, which replaces the base/age/provider rate. + # We don't model the separate +35% CDA tier for CDA-credentialed certified + # family / in-home providers at the moment (the +40% quality tier dominates + # it wherever a provider holds both credentials). + return where(special_needs & quality, p.special_needs, regular_rate) diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_enrolled.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_enrolled.py new file mode 100644 index 00000000000..378cecfa523 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_enrolled.py @@ -0,0 +1,9 @@ +from policyengine_us.model_api import * + + +class az_ccap_enrolled(Variable): + value_type = bool + entity = SPMUnit + label = "Enrolled in Arizona Child Care Assistance Program" + definition_period = MONTH + defined_for = StateCode.AZ diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_max_reimbursement.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_max_reimbursement.py new file mode 100644 index 00000000000..04bfc4c5335 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_max_reimbursement.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class az_ccap_max_reimbursement(Variable): + value_type = float + entity = Person + unit = USD + label = "Arizona Child Care Assistance Program maximum reimbursement" + definition_period = MONTH + defined_for = "az_ccap_eligible_child" + reference = ( + "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf", + "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/az_ccap_provider_type.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_provider_type.py new file mode 100644 index 00000000000..8b5b7531ead --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_provider_type.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class AZCCAPProviderType(Enum): + CENTER = "Child care center" + GROUP_HOME = "Group home" + CERTIFIED_FAMILY = "Certified family home or certified in-home provider" + RELATIVE = "Non-certified relative provider" + + +class az_ccap_provider_type(Variable): + value_type = Enum + entity = Person + possible_values = AZCCAPProviderType + default_value = AZCCAPProviderType.CENTER + definition_period = MONTH + label = "Arizona Child Care Assistance Program provider type" + defined_for = StateCode.AZ + reference = "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf" diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_quality_enhanced_provider.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_quality_enhanced_provider.py new file mode 100644 index 00000000000..45db05aa296 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_quality_enhanced_provider.py @@ -0,0 +1,13 @@ +from policyengine_us.model_api import * + + +class az_ccap_quality_enhanced_provider(Variable): + value_type = bool + entity = Person + label = "Arizona Child Care Assistance Program quality enhanced provider" + definition_period = MONTH + defined_for = StateCode.AZ + reference = ( + "https://des.az.gov/services/child-and-family/child-care/des-contracted-child-care-provider-resources", + "https://des.az.gov/sites/default/files/dl/CCA-1227A.pdf", + ) diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_special_needs_child.py b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_special_needs_child.py new file mode 100644 index 00000000000..a03051ac2d2 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/az_ccap_special_needs_child.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class az_ccap_special_needs_child(Variable): + value_type = bool + entity = Person + label = "Arizona Child Care Assistance Program special needs child" + definition_period = MONTH + defined_for = StateCode.AZ + reference = ( + "https://des.az.gov/sites/default/files/dl/CCA-1210B.pdf#page=6", + "https://des.az.gov/sites/default/files/dl/CCA-1210B.pdf#page=14", + ) + + def formula(person, period, parameters): + return person("az_ccap_eligible_child", period) & person( + "is_disabled", period.this_year + ) diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.py b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.py new file mode 100644 index 00000000000..96b25f2d215 --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_activity_eligible.py @@ -0,0 +1,35 @@ +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. + person = spm_unit.members + head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) + # R6-5-4912(A)(1): employment, full or part-time, is a qualifying activity. + working = person("weekly_hours_worked", period.this_year) > 0 + # R6-5-4912(A)(3) requires adults using education as their activity to also + # work an average of >=20 hours/week (already captured by `working`), so + # education on its own only qualifies teen parents under age 20 (A)(4). + age = person("age", period.this_year) + teen_parent_student = (age < 20) & person( + "is_full_time_student", period.this_year + ) + unable_to_care = person("is_disabled", period.this_year) + eligible_person = working | teen_parent_student | unable_to_care + return spm_unit.sum(head_or_spouse & ~eligible_person) == 0 diff --git a/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_categorically_eligible.py b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_categorically_eligible.py new file mode 100644 index 00000000000..fe58eabff1b --- /dev/null +++ b/policyengine_us/variables/gov/states/az/hhs/ccap/eligibility/az_ccap_categorically_eligible.py @@ -0,0 +1,34 @@ +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) + employed = person("weekly_hours_worked", period.this_year) > 0 + # R6-5-4914(A)(1)-(A)(2): Cash Assistance / Jobs participants qualify without + # regard to income only when they need child care to maintain employment, so + # we require an employed head/spouse. (Jobs-program participation is folded + # into Cash Assistance / TANF enrollment, as it is not separately tracked.) + cash_assistance_for_work = spm_unit("is_tanf_enrolled", period) & spm_unit.any( + head_or_spouse & employed + ) + # R6-5-4914(A)(3): DCS/DDD referrals and foster-care families qualify + # regardless of income or employment. + protective_services = spm_unit.any( + person("receives_or_needs_protective_services", period.this_year) + ) + foster_care = spm_unit.any(person("is_in_foster_care", period)) + return 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], + )