From fc18240af4d708141f172828ebe625dfc8495c6a Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 11 Nov 2026 18:55:16 -0500 Subject: [PATCH 1/3] Add South Dakota CCA hourly county schedules Co-Authored-By: Claude Opus 5.5 --- changelog.d/sd-cca-hourly-rates.fixed.md | 1 + .../age_group/infant_toddler_age_limit.yaml | 11 + .../hourly/age_group/preschool_age_limit.yaml | 11 + .../sd/dss/cca/rates/hourly/available.yaml | 14 + .../cca/rates/hourly/before_after_school.yaml | 146 +++++ .../sd/dss/cca/rates/hourly/counties.yaml | 77 +++ .../dss/cca/rates/hourly/family_day_care.yaml | 481 ++++++++++++++++ .../sd/dss/cca/rates/hourly/informal.yaml | 12 + .../dss/cca/rates/hourly/licensed_center.yaml | 481 ++++++++++++++++ .../rates/hourly/special_needs_maximum.yaml | 18 + ...specialized_infant_toddler_multiplier.yaml | 11 + .../dss/cca/rates/hourly/weeks_per_month.yaml | 11 + .../sd/dss/cca/rates/uses_weekly_rates.yaml | 12 +- policyengine_us/programs.yaml | 2 +- .../test_sd_cca_hourly_rates_invariants.py | 200 +++++++ .../sd/dss/cca/rates/sd_cca_hourly_rate.yaml | 516 ++++++++++++++++++ .../sd/dss/cca/rates/sd_cca_weekly_rate.yaml | 44 ++ .../gov/states/sd/dss/cca/sd_cca.yaml | 414 +++++++++++++- .../sd/dss/cca/rates/sd_cca_hourly_rate.py | 59 ++ .../sd/dss/cca/rates/sd_cca_provider_type.py | 9 +- .../sd_cca_special_needs_rate_approved.py | 12 + ...pecialized_infant_toddler_rate_eligible.py | 12 + .../variables/gov/states/sd/dss/cca/sd_cca.py | 50 +- source_conflicts/candidates.yaml | 37 ++ 24 files changed, 2591 insertions(+), 50 deletions(-) create mode 100644 changelog.d/sd-cca-hourly-rates.fixed.md create mode 100644 policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/age_group/infant_toddler_age_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/age_group/preschool_age_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/available.yaml create mode 100644 policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/before_after_school.yaml create mode 100644 policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/counties.yaml create mode 100644 policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/family_day_care.yaml create mode 100644 policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/informal.yaml create mode 100644 policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/licensed_center.yaml create mode 100644 policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/special_needs_maximum.yaml create mode 100644 policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/specialized_infant_toddler_multiplier.yaml create mode 100644 policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/weeks_per_month.yaml create mode 100644 policyengine_us/tests/core/test_sd_cca_hourly_rates_invariants.py create mode 100644 policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/rates/sd_cca_hourly_rate.yaml create mode 100644 policyengine_us/variables/gov/states/sd/dss/cca/rates/sd_cca_hourly_rate.py create mode 100644 policyengine_us/variables/gov/states/sd/dss/cca/rates/sd_cca_special_needs_rate_approved.py create mode 100644 policyengine_us/variables/gov/states/sd/dss/cca/rates/sd_cca_specialized_infant_toddler_rate_eligible.py diff --git a/changelog.d/sd-cca-hourly-rates.fixed.md b/changelog.d/sd-cca-hourly-rates.fixed.md new file mode 100644 index 00000000000..ee99fd5b989 --- /dev/null +++ b/changelog.d/sd-cca-hourly-rates.fixed.md @@ -0,0 +1 @@ +Added South Dakota child care assistance payments from the July 2024 hourly county rates before the August 2026 weekly schedule. diff --git a/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/age_group/infant_toddler_age_limit.yaml b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/age_group/infant_toddler_age_limit.yaml new file mode 100644 index 00000000000..a7f949de120 --- /dev/null +++ b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/age_group/infant_toddler_age_limit.yaml @@ -0,0 +1,11 @@ +description: South Dakota reimburses care for children younger than this age at the infant and toddler hourly rate under the Child Care Assistance program. +values: + 2024-07-01: 3 + +metadata: + unit: year + period: year + label: South Dakota CCA hourly infant and toddler age limit + reference: + - title: South Dakota family child care reimbursement rates, effective July 1, 2024 + href: https://dss.sd.gov/docs/childcare/assistance/Reimbursement_Rates/Family_Child_Care.pdf diff --git a/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/age_group/preschool_age_limit.yaml b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/age_group/preschool_age_limit.yaml new file mode 100644 index 00000000000..cca83a5f1a7 --- /dev/null +++ b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/age_group/preschool_age_limit.yaml @@ -0,0 +1,11 @@ +description: South Dakota reimburses care from the infant and toddler age limit up to this age at the preschool hourly rate under the Child Care Assistance program. +values: + 2024-07-01: 6 + +metadata: + unit: year + period: year + label: South Dakota CCA hourly preschool age limit + reference: + - title: South Dakota family child care reimbursement rates, effective July 1, 2024 + href: https://dss.sd.gov/docs/childcare/assistance/Reimbursement_Rates/Family_Child_Care.pdf diff --git a/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/available.yaml b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/available.yaml new file mode 100644 index 00000000000..29faaf3b547 --- /dev/null +++ b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/available.yaml @@ -0,0 +1,14 @@ +description: South Dakota has a sourced hourly Child Care Assistance reimbursement schedule for periods when this indicator applies. + +# The model pays no hourly benefit before the earliest sourced schedule. +values: + 2015-01-01: false + 2024-07-01: true + +metadata: + unit: bool + period: year + label: South Dakota CCA hourly reimbursement schedule available + reference: + - title: South Dakota family child care reimbursement rates, effective July 1, 2024 + href: https://dss.sd.gov/docs/childcare/assistance/Reimbursement_Rates/Family_Child_Care.pdf diff --git a/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/before_after_school.yaml b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/before_after_school.yaml new file mode 100644 index 00000000000..d8be4e04816 --- /dev/null +++ b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/before_after_school.yaml @@ -0,0 +1,146 @@ +description: South Dakota provides these hourly maximum reimbursement rates for before-and-after school providers under the Child Care Assistance program. + +# For an unknown county, use the lowest published rate in each age group. +AURORA_COUNTY_SD: + 2024-07-01: 3.85 +BEADLE_COUNTY_SD: + 2024-07-01: 3.85 +BENNETT_COUNTY_SD: + 2024-07-01: 3.85 +BON_HOMME_COUNTY_SD: + 2024-07-01: 3.85 +BROOKINGS_COUNTY_SD: + 2024-07-01: 4.1 +BROWN_COUNTY_SD: + 2024-07-01: 4.1 +BRULE_COUNTY_SD: + 2024-07-01: 3.85 +BUFFALO_COUNTY_SD: + 2024-07-01: 3.85 +BUTTE_COUNTY_SD: + 2024-07-01: 3.85 +CAMPBELL_COUNTY_SD: + 2024-07-01: 3.85 +CHARLES_MIX_COUNTY_SD: + 2024-07-01: 3.85 +CLARK_COUNTY_SD: + 2024-07-01: 3.85 +CLAY_COUNTY_SD: + 2024-07-01: 4.1 +CODINGTON_COUNTY_SD: + 2024-07-01: 4.1 +CORSON_COUNTY_SD: + 2024-07-01: 3.85 +CUSTER_COUNTY_SD: + 2024-07-01: 3.85 +DAVISON_COUNTY_SD: + 2024-07-01: 4.1 +DAY_COUNTY_SD: + 2024-07-01: 3.85 +DEUEL_COUNTY_SD: + 2024-07-01: 3.85 +DEWEY_COUNTY_SD: + 2024-07-01: 3.85 +DOUGLAS_COUNTY_SD: + 2024-07-01: 3.85 +EDMUNDS_COUNTY_SD: + 2024-07-01: 3.85 +FALL_RIVER_COUNTY_SD: + 2024-07-01: 3.85 +FAULK_COUNTY_SD: + 2024-07-01: 3.85 +GRANT_COUNTY_SD: + 2024-07-01: 3.85 +GREGORY_COUNTY_SD: + 2024-07-01: 3.85 +HAAKON_COUNTY_SD: + 2024-07-01: 3.85 +HAMLIN_COUNTY_SD: + 2024-07-01: 3.85 +HAND_COUNTY_SD: + 2024-07-01: 3.85 +HANSON_COUNTY_SD: + 2024-07-01: 3.85 +HARDING_COUNTY_SD: + 2024-07-01: 3.85 +HUGHES_COUNTY_SD: + 2024-07-01: 4.1 +HUTCHINSON_COUNTY_SD: + 2024-07-01: 3.85 +HYDE_COUNTY_SD: + 2024-07-01: 3.85 +JACKSON_COUNTY_SD: + 2024-07-01: 3.85 +JERAULD_COUNTY_SD: + 2024-07-01: 3.85 +JONES_COUNTY_SD: + 2024-07-01: 3.85 +KINGSBURY_COUNTY_SD: + 2024-07-01: 3.85 +LAKE_COUNTY_SD: + 2024-07-01: 4.1 +LAWRENCE_COUNTY_SD: + 2024-07-01: 4.1 +LINCOLN_COUNTY_SD: + 2024-07-01: 5 +LYMAN_COUNTY_SD: + 2024-07-01: 3.85 +MARSHALL_COUNTY_SD: + 2024-07-01: 3.85 +MCCOOK_COUNTY_SD: + 2024-07-01: 3.85 +MCPHERSON_COUNTY_SD: + 2024-07-01: 3.85 +MEADE_COUNTY_SD: + 2024-07-01: 3.85 +MELLETTE_COUNTY_SD: + 2024-07-01: 3.85 +MINER_COUNTY_SD: + 2024-07-01: 3.85 +MINNEHAHA_COUNTY_SD: + 2024-07-01: 5 +MOODY_COUNTY_SD: + 2024-07-01: 3.85 +OGLALA_LAKOTA_COUNTY_SD: + 2024-07-01: 3.85 +PENNINGTON_COUNTY_SD: + 2024-07-01: 5 +PERKINS_COUNTY_SD: + 2024-07-01: 3.85 +POTTER_COUNTY_SD: + 2024-07-01: 3.85 +ROBERTS_COUNTY_SD: + 2024-07-01: 3.85 +SANBORN_COUNTY_SD: + 2024-07-01: 3.85 +SPINK_COUNTY_SD: + 2024-07-01: 3.85 +STANLEY_COUNTY_SD: + 2024-07-01: 3.85 +SULLY_COUNTY_SD: + 2024-07-01: 3.85 +TODD_COUNTY_SD: + 2024-07-01: 3.85 +TRIPP_COUNTY_SD: + 2024-07-01: 3.85 +TURNER_COUNTY_SD: + 2024-07-01: 3.85 +UNION_COUNTY_SD: + 2024-07-01: 4.1 +WALWORTH_COUNTY_SD: + 2024-07-01: 3.85 +YANKTON_COUNTY_SD: + 2024-07-01: 4.1 +ZIEBACH_COUNTY_SD: + 2024-07-01: 3.85 +UNKNOWN: + 2024-07-01: 3.85 + +metadata: + propagate_metadata_to_children: true + period: hour + unit: currency-USD + label: South Dakota CCA before-and-after school hourly rates + reference: + - title: South Dakota before-and-after school reimbursement rates, effective July 1, 2024 + href: https://dss.sd.gov/docs/childcare/assistance/Reimbursement_Rates/Before_After_School_Programs.pdf diff --git a/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/counties.yaml b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/counties.yaml new file mode 100644 index 00000000000..9fab9f9b694 --- /dev/null +++ b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/counties.yaml @@ -0,0 +1,77 @@ +description: South Dakota publishes hourly Child Care Assistance reimbursement rates for these counties. +values: + 2024-07-01: + - AURORA_COUNTY_SD + - BEADLE_COUNTY_SD + - BENNETT_COUNTY_SD + - BON_HOMME_COUNTY_SD + - BROOKINGS_COUNTY_SD + - BROWN_COUNTY_SD + - BRULE_COUNTY_SD + - BUFFALO_COUNTY_SD + - BUTTE_COUNTY_SD + - CAMPBELL_COUNTY_SD + - CHARLES_MIX_COUNTY_SD + - CLARK_COUNTY_SD + - CLAY_COUNTY_SD + - CODINGTON_COUNTY_SD + - CORSON_COUNTY_SD + - CUSTER_COUNTY_SD + - DAVISON_COUNTY_SD + - DAY_COUNTY_SD + - DEUEL_COUNTY_SD + - DEWEY_COUNTY_SD + - DOUGLAS_COUNTY_SD + - EDMUNDS_COUNTY_SD + - FALL_RIVER_COUNTY_SD + - FAULK_COUNTY_SD + - GRANT_COUNTY_SD + - GREGORY_COUNTY_SD + - HAAKON_COUNTY_SD + - HAMLIN_COUNTY_SD + - HAND_COUNTY_SD + - HANSON_COUNTY_SD + - HARDING_COUNTY_SD + - HUGHES_COUNTY_SD + - HUTCHINSON_COUNTY_SD + - HYDE_COUNTY_SD + - JACKSON_COUNTY_SD + - JERAULD_COUNTY_SD + - JONES_COUNTY_SD + - KINGSBURY_COUNTY_SD + - LAKE_COUNTY_SD + - LAWRENCE_COUNTY_SD + - LINCOLN_COUNTY_SD + - LYMAN_COUNTY_SD + - MARSHALL_COUNTY_SD + - MCCOOK_COUNTY_SD + - MCPHERSON_COUNTY_SD + - MEADE_COUNTY_SD + - MELLETTE_COUNTY_SD + - MINER_COUNTY_SD + - MINNEHAHA_COUNTY_SD + - MOODY_COUNTY_SD + - OGLALA_LAKOTA_COUNTY_SD + - PENNINGTON_COUNTY_SD + - PERKINS_COUNTY_SD + - POTTER_COUNTY_SD + - ROBERTS_COUNTY_SD + - SANBORN_COUNTY_SD + - SPINK_COUNTY_SD + - STANLEY_COUNTY_SD + - SULLY_COUNTY_SD + - TODD_COUNTY_SD + - TRIPP_COUNTY_SD + - TURNER_COUNTY_SD + - UNION_COUNTY_SD + - WALWORTH_COUNTY_SD + - YANKTON_COUNTY_SD + - ZIEBACH_COUNTY_SD + +metadata: + unit: list + period: year + label: South Dakota CCA hourly rate counties + reference: + - title: South Dakota family child care reimbursement rates, effective July 1, 2024 + href: https://dss.sd.gov/docs/childcare/assistance/Reimbursement_Rates/Family_Child_Care.pdf diff --git a/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/family_day_care.yaml b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/family_day_care.yaml new file mode 100644 index 00000000000..09065dc71ef --- /dev/null +++ b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/family_day_care.yaml @@ -0,0 +1,481 @@ +description: South Dakota provides these hourly maximum reimbursement rates for family child care providers under the Child Care Assistance program. + +# For an unknown county, use the lowest published rate in each age group. +AURORA_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +BEADLE_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +BENNETT_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +BON_HOMME_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +BROOKINGS_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3.15 + SIX_AND_OVER: + 2024-07-01: 3 +BROWN_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 2.95 + THREE_TO_FIVE: + 2024-07-01: 3.15 + SIX_AND_OVER: + 2024-07-01: 3 +BRULE_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +BUFFALO_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +BUTTE_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +CAMPBELL_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +CHARLES_MIX_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +CLARK_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +CLAY_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 2.95 + THREE_TO_FIVE: + 2024-07-01: 3.15 + SIX_AND_OVER: + 2024-07-01: 3 +CODINGTON_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 2.95 + THREE_TO_FIVE: + 2024-07-01: 3.15 + SIX_AND_OVER: + 2024-07-01: 3 +CORSON_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +CUSTER_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +DAVISON_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 2.95 + THREE_TO_FIVE: + 2024-07-01: 3.15 + SIX_AND_OVER: + 2024-07-01: 3 +DAY_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +DEUEL_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +DEWEY_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +DOUGLAS_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +EDMUNDS_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +FALL_RIVER_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +FAULK_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +GRANT_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +GREGORY_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +HAAKON_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +HAMLIN_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +HAND_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +HANSON_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +HARDING_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +HUGHES_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 2.95 + THREE_TO_FIVE: + 2024-07-01: 3.15 + SIX_AND_OVER: + 2024-07-01: 3 +HUTCHINSON_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +HYDE_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +JACKSON_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +JERAULD_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +JONES_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +KINGSBURY_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +LAKE_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 2.95 + THREE_TO_FIVE: + 2024-07-01: 3.15 + SIX_AND_OVER: + 2024-07-01: 3 +LAWRENCE_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 2.95 + THREE_TO_FIVE: + 2024-07-01: 3.15 + SIX_AND_OVER: + 2024-07-01: 3 +LINCOLN_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.8 + THREE_TO_FIVE: + 2024-07-01: 3.7 + SIX_AND_OVER: + 2024-07-01: 3.7 +LYMAN_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +MARSHALL_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +MCCOOK_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +MCPHERSON_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +MEADE_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +MELLETTE_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +MINER_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +MINNEHAHA_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.8 + THREE_TO_FIVE: + 2024-07-01: 3.7 + SIX_AND_OVER: + 2024-07-01: 3.7 +MOODY_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +OGLALA_LAKOTA_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +PENNINGTON_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.55 + THREE_TO_FIVE: + 2024-07-01: 3.4 + SIX_AND_OVER: + 2024-07-01: 3.7 +PERKINS_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +POTTER_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +ROBERTS_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +SANBORN_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +SPINK_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +STANLEY_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +SULLY_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +TODD_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +TRIPP_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +TURNER_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +UNION_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 2.95 + THREE_TO_FIVE: + 2024-07-01: 3.15 + SIX_AND_OVER: + 2024-07-01: 3 +WALWORTH_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +YANKTON_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 2.95 + THREE_TO_FIVE: + 2024-07-01: 3.15 + SIX_AND_OVER: + 2024-07-01: 3 +ZIEBACH_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.15 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 +UNKNOWN: + UNDER_THREE: + 2024-07-01: 2.95 + THREE_TO_FIVE: + 2024-07-01: 3 + SIX_AND_OVER: + 2024-07-01: 3 + +metadata: + propagate_metadata_to_children: true + period: hour + unit: currency-USD + label: South Dakota CCA family child care hourly rates + reference: + - title: South Dakota family child care reimbursement rates, effective July 1, 2024 + href: https://dss.sd.gov/docs/childcare/assistance/Reimbursement_Rates/Family_Child_Care.pdf diff --git a/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/informal.yaml b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/informal.yaml new file mode 100644 index 00000000000..7e276cff523 --- /dev/null +++ b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/informal.yaml @@ -0,0 +1,12 @@ +description: South Dakota provides this hourly maximum reimbursement rate for informal, in-home, or relative providers under the Child Care Assistance program. +values: + 2024-07-01: 2.3 + +metadata: + propagate_metadata_to_children: true + period: hour + unit: currency-USD + label: South Dakota CCA informal hourly rate + reference: + - title: South Dakota informal, in-home, relative child care reimbursement rate, effective July 1, 2024 + href: https://dss.sd.gov/docs/childcare/assistance/Reimbursement_Rates/Relative_In-Home_and_Informal_Care.pdf diff --git a/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/licensed_center.yaml b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/licensed_center.yaml new file mode 100644 index 00000000000..8338b83e63e --- /dev/null +++ b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/licensed_center.yaml @@ -0,0 +1,481 @@ +description: South Dakota provides these hourly maximum reimbursement rates for center care providers under the Child Care Assistance program. + +# For an unknown county, use the lowest published rate in each age group. +AURORA_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +BEADLE_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +BENNETT_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +BON_HOMME_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +BROOKINGS_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 4.75 + THREE_TO_FIVE: + 2024-07-01: 4.55 + SIX_AND_OVER: + 2024-07-01: 3.9 +BROWN_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 4.75 + THREE_TO_FIVE: + 2024-07-01: 4.55 + SIX_AND_OVER: + 2024-07-01: 3.9 +BRULE_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +BUFFALO_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +BUTTE_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +CAMPBELL_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +CHARLES_MIX_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +CLARK_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +CLAY_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 4.75 + THREE_TO_FIVE: + 2024-07-01: 4.55 + SIX_AND_OVER: + 2024-07-01: 3.9 +CODINGTON_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 4.75 + THREE_TO_FIVE: + 2024-07-01: 4.55 + SIX_AND_OVER: + 2024-07-01: 3.9 +CORSON_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +CUSTER_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +DAVISON_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 4.75 + THREE_TO_FIVE: + 2024-07-01: 4.55 + SIX_AND_OVER: + 2024-07-01: 3.9 +DAY_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +DEUEL_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +DEWEY_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +DOUGLAS_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +EDMUNDS_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +FALL_RIVER_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +FAULK_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +GRANT_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +GREGORY_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +HAAKON_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +HAMLIN_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +HAND_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +HANSON_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +HARDING_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +HUGHES_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 4.75 + THREE_TO_FIVE: + 2024-07-01: 4.55 + SIX_AND_OVER: + 2024-07-01: 3.9 +HUTCHINSON_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +HYDE_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +JACKSON_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +JERAULD_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +JONES_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +KINGSBURY_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +LAKE_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 4.75 + THREE_TO_FIVE: + 2024-07-01: 4.55 + SIX_AND_OVER: + 2024-07-01: 3.9 +LAWRENCE_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 4.75 + THREE_TO_FIVE: + 2024-07-01: 4.55 + SIX_AND_OVER: + 2024-07-01: 3.9 +LINCOLN_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 6 + THREE_TO_FIVE: + 2024-07-01: 5.65 + SIX_AND_OVER: + 2024-07-01: 4.6 +LYMAN_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +MARSHALL_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +MCCOOK_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +MCPHERSON_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +MEADE_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +MELLETTE_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +MINER_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +MINNEHAHA_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 6 + THREE_TO_FIVE: + 2024-07-01: 5.65 + SIX_AND_OVER: + 2024-07-01: 4.6 +MOODY_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +OGLALA_LAKOTA_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +PENNINGTON_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 4.8 + THREE_TO_FIVE: + 2024-07-01: 4.4 + SIX_AND_OVER: + 2024-07-01: 4.45 +PERKINS_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +POTTER_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +ROBERTS_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +SANBORN_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +SPINK_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +STANLEY_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +SULLY_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +TODD_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +TRIPP_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +TURNER_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +UNION_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 4.75 + THREE_TO_FIVE: + 2024-07-01: 4.55 + SIX_AND_OVER: + 2024-07-01: 3.9 +WALWORTH_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +YANKTON_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 4.75 + THREE_TO_FIVE: + 2024-07-01: 4.55 + SIX_AND_OVER: + 2024-07-01: 3.9 +ZIEBACH_COUNTY_SD: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 +UNKNOWN: + UNDER_THREE: + 2024-07-01: 3.9 + THREE_TO_FIVE: + 2024-07-01: 3.85 + SIX_AND_OVER: + 2024-07-01: 3.7 + +metadata: + propagate_metadata_to_children: true + period: hour + unit: currency-USD + label: South Dakota CCA center care hourly rates + reference: + - title: South Dakota center care reimbursement rates, effective July 1, 2024 + href: https://dss.sd.gov/docs/childcare/assistance/Reimbursement_Rates/Center_Care.pdf diff --git a/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/special_needs_maximum.yaml b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/special_needs_maximum.yaml new file mode 100644 index 00000000000..6e6c65284c7 --- /dev/null +++ b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/special_needs_maximum.yaml @@ -0,0 +1,18 @@ +description: South Dakota reimburses approved special-needs child care at up to this hourly maximum under the Child Care Assistance program. +values: + 2024-07-01: 6.8 + +metadata: + propagate_metadata_to_children: true + period: hour + unit: currency-USD + label: South Dakota CCA hourly special-needs maximum + reference: + - title: South Dakota family child care reimbursement rates, effective July 1, 2024 + href: https://dss.sd.gov/docs/childcare/assistance/Reimbursement_Rates/Family_Child_Care.pdf + - title: South Dakota FY 2025-2027 Child Care and Development Fund State Plan, Section 4.3.3 + href: https://dss.sd.gov/docs/childcare/state_plan/2025-2027/2025-2027_State_Plan_original.pdf#page=60 + - title: South Dakota FY 2025-2027 Child Care and Development Fund State Plan Amendment 1, Section 4.3.3 + href: https://dss.sd.gov/docs/childcare/state_plan/2025-2027/Amendment_1.pdf#page=60 + - title: South Dakota Relative, In-Home and Informal Child Care Provider Guide + href: https://dss.sd.gov/docs/childcare/assistance/Relative_In-Home_and_Informal_Care.pdf#page=16 diff --git a/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/specialized_infant_toddler_multiplier.yaml b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/specialized_infant_toddler_multiplier.yaml new file mode 100644 index 00000000000..b33b418e7ec --- /dev/null +++ b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/specialized_infant_toddler_multiplier.yaml @@ -0,0 +1,11 @@ +description: South Dakota multiplies the county hourly rate by this amount for children under three whose family child care provider registers for six or fewer children. +values: + 2024-07-01: 1.25 + +metadata: + unit: /1 + period: year + label: South Dakota CCA specialized infant and toddler hourly rate multiplier + reference: + - title: South Dakota family child care reimbursement rates, effective July 1, 2024 + href: https://dss.sd.gov/docs/childcare/assistance/Reimbursement_Rates/Family_Child_Care.pdf diff --git a/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/weeks_per_month.yaml b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/weeks_per_month.yaml new file mode 100644 index 00000000000..8d3ccb42cc3 --- /dev/null +++ b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/hourly/weeks_per_month.yaml @@ -0,0 +1,11 @@ +description: South Dakota converts weekly authorized child care hours to monthly hours using this factor under the Child Care Assistance program. +values: + 2024-07-01: 4.3 + +metadata: + unit: /1 + period: month + label: South Dakota CCA hourly schedule weeks per month + reference: + - title: South Dakota Child Care Subsidy Policy Manual, Section 8, June 1, 2025 + href: https://web.archive.org/web/20251031171652/https://dss.sd.gov/docs/childcare/assistance/Subsidy_Manual.pdf#page=18 diff --git a/policyengine_us/parameters/gov/states/sd/dss/cca/rates/uses_weekly_rates.yaml b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/uses_weekly_rates.yaml index 2db22eccc4e..461fd3ff458 100644 --- a/policyengine_us/parameters/gov/states/sd/dss/cca/rates/uses_weekly_rates.yaml +++ b/policyengine_us/parameters/gov/states/sd/dss/cca/rates/uses_weekly_rates.yaml @@ -1,12 +1,10 @@ description: South Dakota uses this indicator to determine whether the weekly reimbursement rate schedule applies under the Child Care Assistance program. -# The weekly region-based rate schedule takes effect August 3, 2026, replacing -# the earlier hourly county-based schedule. Because the benefit is modeled -# monthly, August 1 is used as the monthly approximation of that effective -# date, and every CCA parameter is dated 2026-08-01 under the same convention. -# Only the weekly era is modeled; the hourly era is a separate follow-up. The -# 2024-07-01 date on the false-era entry is a modeling-start placeholder, not -# a sourced effective date for the earlier hourly schedule. +# DSS replaced hourly county rates with weekly region rates on August 3, +# 2026. The monthly model starts the weekly schedule on August 1. The false +# entry starts with the sourced July 1, 2024 hourly sheets; hourly.available +# keeps benefits at zero before that schedule because earlier rates remain +# unsourced. values: 2024-07-01: false 2026-08-01: true diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 0f74596fd68..0840f56147b 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -984,7 +984,7 @@ programs: full_name: South Dakota Child Care Assistance variable: sd_cca parameter_prefix: gov.states.sd.dss.cca - notes: Models the weekly region-based rate schedule effective 2026-08-03 with the billed-expense cap and co-payment, the income and asset tests, the citizen or lawful-permanent-resident child test, and the reason-for-care test. For a child under court supervision or incapable of self-care, the model applies South Dakota's age extension, which raises the age limit from under 13 to under 18, or under 19 while in school. The model pays no benefit before August 2026 because it lacks the earlier hourly county-based schedule. + notes: Models the hourly county-based rate schedule effective 2024-07-01 and the weekly region-based rate schedule effective 2026-08-03 with the billed-expense cap and co-payment, the income and asset tests, the citizen or lawful-permanent-resident child test, and the reason-for-care test. For a child under court supervision or incapable of self-care, the model applies South Dakota's age extension, which raises the age limit from under 13 to under 18, or under 19 while in school. The model pays no benefit before July 2024 because earlier rates remain unsourced. When callers omit county, the model uses Aurora County, which can overstate or understate hourly rates. For an unrecognized county, the model uses the lowest hourly rate for each provider type and age group, which can understate rates. The model uses reported care hours for authorized need and leaves out negotiated special-needs rates above the published ceiling. - state: UT status: complete name: Utah CCAP diff --git a/policyengine_us/tests/core/test_sd_cca_hourly_rates_invariants.py b/policyengine_us/tests/core/test_sd_cca_hourly_rates_invariants.py new file mode 100644 index 00000000000..69102d459a2 --- /dev/null +++ b/policyengine_us/tests/core/test_sd_cca_hourly_rates_invariants.py @@ -0,0 +1,200 @@ +"""Check hourly CCA bounds, monotonicity, and weekly compatibility. + +Hypothesis changes hours and billed expenses in independent simulations. YAML +cases pin the county tables and rate modifiers. The weekly check evaluates the +main-branch benefit formula with independently aggregated per-child rates. +""" + +import numpy as np +from hypothesis import HealthCheck, given, settings +from hypothesis import strategies as st + +from policyengine_us import Simulation + +PROVIDERS = [ + "FAMILY_DAY_CARE", + "LICENSED_CENTER", + "INFORMAL", + "BEFORE_AFTER_SCHOOL", +] +COUNTIES = [ + "AURORA_COUNTY_SD", + "MINNEHAHA_COUNTY_SD", + "PENNINGTON_COUNTY_SD", + "UNKNOWN", +] +HOURLY_MONTHS = ["2024-07", "2025-01", "2026-07"] +TOLERANCE = 0.01 +SETTINGS = dict( + max_examples=4, + deadline=None, + derandomize=True, + suppress_health_check=[HealthCheck.too_slow, HealthCheck.data_too_large], +) + + +@st.composite +def children(draw): + return { + "age": draw(st.sampled_from([0.5, 2.5, 3, 5, 6, 8, 12, 15])), + "provider": draw(st.sampled_from(PROVIDERS)), + "hours": draw(st.integers(0, 70)), + "hours_raise": draw(st.integers(0, 20)), + "disabled": draw(st.booleans()), + "specialized": draw(st.booleans()), + "approved_special_needs": draw(st.booleans()), + } + + +@st.composite +def families(draw): + return { + "county": draw(st.sampled_from(COUNTIES)), + "wages": draw(st.sampled_from([0, 12_000, 36_000, 80_000])), + "expenses": draw(st.integers(0, 60_000)), + "expense_raise": draw(st.integers(0, 24_000)), + "children": draw(st.lists(children(), min_size=1, max_size=2)), + } + + +def _situation(units, month, *, raise_hours=False, raise_expenses=False): + year = month[:4] + people = {} + groups = { + name: {} + for name in [ + "tax_units", + "spm_units", + "families", + "marital_units", + "households", + ] + } + for i, unit in enumerate(units): + parent = f"parent_{i}" + members = [parent] + people[parent] = { + "age": {year: 30}, + "employment_income": {year: unit["wages"]}, + "is_tax_unit_head": {year: True}, + "is_tax_unit_dependent": {year: False}, + "childcare_hours_per_week": {year: 0}, + } + groups["marital_units"][f"parent_unit_{i}"] = {"members": [parent]} + for j, child in enumerate(unit["children"]): + name = f"child_{i}_{j}" + members.append(name) + people[name] = { + "age": {year: child["age"]}, + "is_tax_unit_head": {year: False}, + "is_tax_unit_dependent": {year: True}, + "is_disabled": {year: child["disabled"]}, + "childcare_hours_per_week": { + year: child["hours"] + raise_hours * child["hours_raise"] + }, + "sd_cca_provider_type": {month: child["provider"]}, + "sd_cca_specialized_infant_toddler_rate_eligible": { + month: child["specialized"] + }, + "sd_cca_special_needs_rate_approved": { + month: child["approved_special_needs"] + }, + } + groups["marital_units"][f"child_unit_{i}_{j}"] = {"members": [name]} + for group in ["tax_units", "spm_units", "families"]: + groups[group][f"{group}_{i}"] = {"members": members} + groups["spm_units"][f"spm_units_{i}"].update( + { + "meets_ccdf_activity_test": {year: True}, + "is_tanf_enrolled": {month: False}, + "spm_unit_pre_subsidy_childcare_expenses": { + year: unit["expenses"] + raise_expenses * unit["expense_raise"] + }, + } + ) + groups["households"][f"household_{i}"] = { + "members": members, + "state_code": {year: "SD"}, + "county_str": {year: unit["county"]}, + } + return {"people": people, **groups} + + +def _run(units, month, **changes): + sim = Simulation(situation=_situation(units, month, **changes)) + benefit = np.asarray(sim.calculate("sd_cca", month), dtype=float) + expenses = np.asarray( + sim.calculate("spm_unit_pre_subsidy_childcare_expenses", month), dtype=float + ) + assert np.isfinite(benefit).all() + assert (benefit >= -TOLERANCE).all() + assert (benefit <= expenses + TOLERANCE).all() + return sim, benefit + + +def _positive_case(): + # A low-income family owes no co-payment. At 40 hours per week, DSS pays + # min(ceil(40 * 4.3) * $3.80, $24,000 / 12) = $653.60 per month. + return { + "county": "MINNEHAHA_COUNTY_SD", + "wages": 12_000, + "expenses": 24_000, + "expense_raise": 12_000, + "children": [ + { + "age": 0.5, + "provider": "FAMILY_DAY_CARE", + "hours": 40, + "hours_raise": 5, + "disabled": False, + "specialized": False, + "approved_special_needs": False, + } + ], + } + + +@settings(**SETTINGS) +@given( + st.sampled_from(HOURLY_MONTHS), + st.lists(families(), min_size=3, max_size=7), +) +def test_hourly_bounds_monotonicity_and_positive_payment(month, units): + units = units + [_positive_case()] + sim, base = _run(units, month) + _, more_hours = _run(units, month, raise_hours=True) + _, more_expenses = _run(units, month, raise_expenses=True) + assert (more_hours >= base - TOLERANCE).all() + assert (more_expenses >= base - TOLERANCE).all() + assert sim.calculate("sd_cca_eligible", month)[-1] + assert sim.calculate("sd_cca_copay", month)[-1] == 0 + assert base[-1] > 0 + + +@settings(**SETTINGS) +@given( + st.integers(2026 * 12 + 7, 2030 * 12 + 11), + st.lists(families(), min_size=3, max_size=7), +) +def test_weekly_formula_matches_main(month_index, units): + month = f"{month_index // 12}-{month_index % 12 + 1:02d}" + units = units + [_positive_case()] + sim, benefit = _run(units, month) + eligible_child = np.asarray(sim.calculate("sd_cca_eligible_child", month)) + in_care = np.asarray(sim.calculate("childcare_hours_per_week", month[:4])) > 0 + weekly_rate = np.asarray(sim.calculate("sd_cca_weekly_rate", month)) + spm_unit_ids = sim.populations["spm_unit"].members_entity_id + maximum = np.bincount( + spm_unit_ids, + weights=weekly_rate * eligible_child * in_care, + minlength=len(units), + ) * (52 / 12) + expenses = np.asarray( + sim.calculate("spm_unit_pre_subsidy_childcare_expenses", month) + ) + copay = np.asarray(sim.calculate("sd_cca_copay", month)) + eligible = np.asarray(sim.calculate("sd_cca_eligible", month)) + expected = np.where( + eligible, np.maximum(np.minimum(expenses, maximum) - copay, 0), 0 + ) + np.testing.assert_allclose(benefit, expected, atol=TOLERANCE, rtol=0) diff --git a/policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/rates/sd_cca_hourly_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/rates/sd_cca_hourly_rate.yaml new file mode 100644 index 00000000000..d006a192fc6 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/rates/sd_cca_hourly_rate.yaml @@ -0,0 +1,516 @@ +# DSS published these maximum hourly rates effective July 1, 2024. +# The family sheet computes $3.80 * 1.25 = $4.75 for a qualifying infant. +# DSS caps ordinary approved special needs care at $6.80 per hour. +# Each case establishes an approved activity; the formulas determine eligibility. +# Unknown county strings use each provider and age band's lowest county rate. + +- name: DSS pays the Minnehaha family infant rate. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + sd_cca_hourly_rate: 3.8 + +- name: DSS pays the Aurora family infant rate. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: AURORA_COUNTY_SD + output: + sd_cca_hourly_rate: 3.15 + +- name: DSS keeps children below age three in the first family band. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 2.99 + sd_cca_provider_type: FAMILY_DAY_CARE + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + sd_cca_hourly_rate: 3.8 + +- name: DSS moves three-year-olds to the second family band. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 3 + sd_cca_provider_type: FAMILY_DAY_CARE + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + sd_cca_hourly_rate: 3.7 + +- name: DSS pays the Minnehaha center infant rate. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 0.5 + sd_cca_provider_type: LICENSED_CENTER + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + sd_cca_hourly_rate: 6 + +- name: DSS moves three-year-olds to the second center band. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 3 + sd_cca_provider_type: LICENSED_CENTER + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + sd_cca_hourly_rate: 5.65 + +- name: DSS keeps five-year-old students in the second hourly center band. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 5 + sd_cca_provider_type: LICENSED_CENTER + is_in_k12_school: true + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + sd_cca_hourly_rate: 5.65 + +- name: DSS moves six-year-olds to the third center band. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 6 + sd_cca_provider_type: LICENSED_CENTER + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + sd_cca_hourly_rate: 4.6 + +- name: DSS pays the Aurora center infant rate. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 0.5 + sd_cca_provider_type: LICENSED_CENTER + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: AURORA_COUNTY_SD + output: + sd_cca_hourly_rate: 3.9 + +- name: DSS pays informal providers the statewide hourly rate. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 0.5 + sd_cca_provider_type: INFORMAL + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + sd_cca_hourly_rate: 2.3 + +- name: DSS pays Aurora school programs their separate hourly rate. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 8 + sd_cca_provider_type: BEFORE_AFTER_SCHOOL + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: AURORA_COUNTY_SD + output: + sd_cca_hourly_rate: 3.85 + +- name: DSS pays Minnehaha school programs their separate hourly rate. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 8 + sd_cca_provider_type: BEFORE_AFTER_SCHOOL + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + sd_cca_hourly_rate: 5 + +- name: DSS raises an eligible family infant rate by 25 percent. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + sd_cca_specialized_infant_toddler_rate_eligible: true + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + sd_cca_hourly_rate: 4.75 + +- name: DSS stops the specialized infant rate at age three. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 3 + sd_cca_provider_type: FAMILY_DAY_CARE + sd_cca_specialized_infant_toddler_rate_eligible: true + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + sd_cca_hourly_rate: 3.7 + +- name: DSS limits the specialized infant rate to family providers. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 0.5 + sd_cca_provider_type: LICENSED_CENTER + sd_cca_specialized_infant_toddler_rate_eligible: true + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + sd_cca_hourly_rate: 6 + +- name: DSS requires approval before paying the special needs ceiling. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + is_disabled: true + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + sd_cca_hourly_rate: 3.8 + +- name: DSS pays the approved family special needs ceiling. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + sd_cca_special_needs_rate_approved: true + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + sd_cca_hourly_rate: 6.8 + +- name: DSS pays the approved center special needs ceiling. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 0.5 + sd_cca_provider_type: LICENSED_CENTER + sd_cca_special_needs_rate_approved: true + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + sd_cca_hourly_rate: 6.8 + +- name: DSS pays the approved school program special needs ceiling. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 8 + sd_cca_provider_type: BEFORE_AFTER_SCHOOL + sd_cca_special_needs_rate_approved: true + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + sd_cca_hourly_rate: 6.8 + +- name: DSS pays the approved informal special needs ceiling. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 0.5 + sd_cca_provider_type: INFORMAL + sd_cca_special_needs_rate_approved: true + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + sd_cca_hourly_rate: 6.8 + +- name: DSS applies the special needs ceiling without stacking the infant increase. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + sd_cca_specialized_infant_toddler_rate_eligible: true + sd_cca_special_needs_rate_approved: true + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + sd_cca_hourly_rate: 6.8 + +- name: The model uses the lowest county infant rate for UNKNOWN. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: UNKNOWN + output: + sd_cca_hourly_rate: 2.95 + +- name: The model uses the lowest county infant rate for unrecognized strings. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: NOT_A_COUNTY + output: + sd_cca_hourly_rate: 2.95 + +- name: The model uses Aurora when the household omits its county. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + output: + sd_cca_hourly_rate: 3.15 + +- name: DSS pays no hourly reimbursement for an ineligible adult. + period: 2025-01 + absolute_error_margin: 0.0001 + input: + people: + child: + age: 30 + sd_cca_provider_type: FAMILY_DAY_CARE + sd_cca_special_needs_rate_approved: true + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + sd_cca_hourly_rate: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/rates/sd_cca_weekly_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/rates/sd_cca_weekly_rate.yaml index 0783b2e94d0..94f58b8ef29 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/rates/sd_cca_weekly_rate.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/rates/sd_cca_weekly_rate.yaml @@ -335,3 +335,47 @@ sd_cca_reason_for_care_eligible: true sd_cca_eligible_child: false sd_cca_weekly_rate: 0 + +- name: DSS maps school programs to the licensed center category in the weekly era. + period: 2026-08 + absolute_error_margin: 0.01 + input: + people: + child: + age: 8 + sd_cca_provider_type: BEFORE_AFTER_SCHOOL + childcare_hours_per_week: 40 + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + # The weekly sheet groups licensed centers and school age programs. + # The urban school age full-time ceiling equals $185 per week. + sd_cca_weekly_rate: 185 + +- name: DSS pays the same weekly school age rate at a licensed center. + period: 2026-08 + absolute_error_margin: 0.01 + input: + people: + child: + age: 8 + sd_cca_provider_type: LICENSED_CENTER + childcare_hours_per_week: 40 + spm_units: + unit: + members: [child] + meets_ccdf_activity_test: true + households: + household: + members: [child] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + sd_cca_weekly_rate: 185 diff --git a/policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/sd_cca.yaml b/policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/sd_cca.yaml index d4051929f68..c7c0837d87f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/sd_cca.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/sd_cca.yaml @@ -1,14 +1,10 @@ -# Tests for sd_cca (SPMUnit, MONTH, USD), the South Dakota Child Care -# Assistance benefit. The benefit is the lesser of the summed per-child weekly -# maximum rates (converted to a monthly amount with WEEKS_IN_YEAR / -# MONTHS_IN_YEAR = 52/12 = 4.3333) and the family's billed child care expenses, -# minus the monthly co-payment, floored at zero (ARSD 67:47:01:16). Only -# eligible children with positive care hours contribute to the rate cap (the -# limited-time rate tier starts at one hour per week). There are -# no separate additive bonuses. sd_child_care_subsidies is the YEAR aggregator -# (adds sd_cca); read at a month period it reports the monthly value, and -# sd_cca is registered in the federal child_care_subsidies total. -# Urban family day care full-time infant weekly rate 180 -> 180 x 52/12 = 780. +# Tests for monthly South Dakota Child Care Assistance. +# DSS caps a family's payment at billed expenses and summed eligible-child +# reimbursement ceilings, subtracts the co-payment, and floors the result at zero. +# Before August 2026, the model multiplies hourly county rates by +# ceil(weekly care hours * 4.3). The hourly schedules start July 1, 2024. +# From August 2026, weekly rates convert to months with 52 / 12. +# sd_child_care_subsidies aggregates monthly payments over the year. - name: Case 1, rate-limited benefit, co-payment zero. period: 2027-01 @@ -271,14 +267,14 @@ # protective-services children. Benefit = 780. sd_cca: 780 -- name: Case 10, pre-effective period, weekly rate era not yet in effect, no benefit. +- name: Case 10, DSS pays the Minnehaha hourly rate before August 2026. period: 2025-01 - absolute_error_margin: 0.1 + absolute_error_margin: 0.01 input: people: person1: age: 30 - employment_income: 24_000 + employment_income: 24000 person2: age: 0.5 sd_cca_provider_type: FAMILY_DAY_CARE @@ -287,16 +283,394 @@ spm_unit: members: [person1, person2] meets_ccdf_activity_test: true - spm_unit_pre_subsidy_childcare_expenses: 24_000 + spm_unit_pre_subsidy_childcare_expenses: 24000 + households: + household: + members: [person1, person2] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + # ceil(40 * 4.3) = 172 hours; 172 * $3.80 = $653.60. + # Expenses $24,000 / 12 = $2,000 exceed the ceiling; co-payment = $0. + sd_cca: 653.6 + sd_child_care_subsidies: 653.6 + +- name: Case 11, DSS pays the lower Aurora hourly rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24000 + person2: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + childcare_hours_per_week: 40 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + spm_unit_pre_subsidy_childcare_expenses: 24000 + households: + household: + members: [person1, person2] + state_code: SD + county_str: AURORA_COUNTY_SD + output: + # ceil(40 * 4.3) * $3.15 = 172 * $3.15 = $541.80. + sd_cca: 541.8 + +- name: Case 12, DSS caps the hourly payment at billed expenses. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24000 + person2: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + childcare_hours_per_week: 40 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + spm_unit_pre_subsidy_childcare_expenses: 3600 + households: + household: + members: [person1, person2] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + # min(172 * $3.80, $3,600 / 12) = min($653.60, $300) = $300. + sd_cca: 300 + +- name: Case 13, DSS pays no hourly benefit without care hours. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24000 + person2: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + childcare_hours_per_week: 0 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + spm_unit_pre_subsidy_childcare_expenses: 24000 households: household: members: [person1, person2] state_code: SD county_str: MINNEHAHA_COUNTY_SD output: - # Same household as Case 1, evaluated before the weekly rate schedule - # takes effect in August 2026: the uses_weekly_rates gate zeroes the - # benefit even though the family is otherwise eligible. Only the weekly - # rate era is modeled; the earlier hourly schedule is a follow-up. + # ceil(0 * 4.3) * $3.80 = $0, despite positive expenses. sd_cca: 0 - sd_child_care_subsidies: 0 + +- name: Case 14, DSS pays no hourly benefit without billed expenses. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24000 + person2: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + childcare_hours_per_week: 40 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + spm_unit_pre_subsidy_childcare_expenses: 0 + households: + household: + members: [person1, person2] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + # min(172 * $3.80, $0) = $0. + sd_cca: 0 + +- name: Case 15, DSS subtracts the co-payment after the hourly expense cap. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 47500 + person2: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + childcare_hours_per_week: 40 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + spm_unit_pre_subsidy_childcare_expenses: 24000 + spm_unit_fpg: 24000 + households: + household: + members: [person1, person2] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + # Countable income = $47,500 / 12 * 0.96 = $3,800. + # Co-payment = ($3,800 - 1.7 * $24,000 / 12) * 0.05 = $20. + # Benefit = min($653.60, $2,000) - $20 = $633.60. + sd_cca: 633.6 + +- name: Case 16, DSS floors the hourly payment at zero after the co-payment. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 100000 + person2: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + childcare_hours_per_week: 40 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + spm_unit_pre_subsidy_childcare_expenses: 1200 + spm_unit_fpg: 24000 + hhs_smi: 120000 + is_sd_cca_enrolled: true + households: + household: + members: [person1, person2] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + # Countable income = $100,000 / 12 * 0.96 = $8,000. + # Co-payment = ($8,000 - $3,400) * 0.05 = $230. + # Benefit = max(min($653.60, $100) - $230, 0) = $0. + sd_cca: 0 + +- name: Case 17, DSS sums the hourly ceilings for both eligible children. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24000 + person2: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + childcare_hours_per_week: 40 + person3: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + childcare_hours_per_week: 40 + spm_units: + spm_unit: + members: [person1, person2, person3] + meets_ccdf_activity_test: true + spm_unit_pre_subsidy_childcare_expenses: 36000 + households: + household: + members: [person1, person2, person3] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + # Two children * 172 hours * $3.80 = $1,307.20; expenses = $3,000. + sd_cca: 1307.2 + +- name: Case 18, DSS still uses hourly rates in July 2026. + period: 2026-07 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24000 + person2: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + childcare_hours_per_week: 40 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + spm_unit_pre_subsidy_childcare_expenses: 24000 + households: + household: + members: [person1, person2] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + # 172 * $3.80 = $653.60 before the weekly schedule starts. + sd_cca: 653.6 + +- name: Case 19, DSS switches to weekly rates in August 2026. + period: 2026-08 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24000 + person2: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + childcare_hours_per_week: 40 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + spm_unit_pre_subsidy_childcare_expenses: 24000 + households: + household: + members: [person1, person2] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + # The weekly infant rate gives $180 * 52 / 12 = $780. + sd_cca: 780 + +- name: Case 20, The model pays zero before the first sourced hourly schedule. + period: 2024-06 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24000 + person2: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + childcare_hours_per_week: 40 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + spm_unit_pre_subsidy_childcare_expenses: 24000 + households: + household: + members: [person1, person2] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + # No sourced schedule covers June 2024, so hourly availability remains false. + sd_cca: 0 + +- name: Case 21, DSS pays hourly rates from July 2024. + period: 2024-07 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24000 + person2: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + childcare_hours_per_week: 40 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + spm_unit_pre_subsidy_childcare_expenses: 24000 + households: + household: + members: [person1, person2] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + # 172 * $3.80 = $653.60 from the sheet effective July 1, 2024. + sd_cca: 653.6 + +- name: Case 22, The model rounds monthly authorized hours up. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24000 + person2: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + childcare_hours_per_week: 45 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + spm_unit_pre_subsidy_childcare_expenses: 24000 + households: + household: + members: [person1, person2] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + # The manual converts 45 * 4.3 = 193.5 to 194 monthly hours. + # 194 * $3.80 = $737.20. + sd_cca: 737.2 + +- name: Case 23, DSS caps the specialized infant payment at billed expenses. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24000 + person2: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + childcare_hours_per_week: 40 + sd_cca_specialized_infant_toddler_rate_eligible: true + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + spm_unit_pre_subsidy_childcare_expenses: 7200 + households: + household: + members: [person1, person2] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + # The specialized rate = $3.80 * 1.25 = $4.75. + # min(172 * $4.75, $7,200 / 12) = min($817, $600) = $600. + sd_cca: 600 + +- name: Case 24, DSS caps the approved special needs payment at billed expenses. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24000 + person2: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + childcare_hours_per_week: 40 + sd_cca_special_needs_rate_approved: true + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + spm_unit_pre_subsidy_childcare_expenses: 10800 + households: + household: + members: [person1, person2] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + # min(172 * $6.80, $10,800 / 12) = min($1,169.60, $900) = $900. + sd_cca: 900 diff --git a/policyengine_us/variables/gov/states/sd/dss/cca/rates/sd_cca_hourly_rate.py b/policyengine_us/variables/gov/states/sd/dss/cca/rates/sd_cca_hourly_rate.py new file mode 100644 index 00000000000..f3fc9ed00d0 --- /dev/null +++ b/policyengine_us/variables/gov/states/sd/dss/cca/rates/sd_cca_hourly_rate.py @@ -0,0 +1,59 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.sd.dss.cca.rates.sd_cca_provider_type import ( + SDCCAProviderType, +) + + +class sd_cca_hourly_rate(Variable): + value_type = float + entity = Person + unit = USD + label = "South Dakota CCA hourly maximum reimbursement rate per child" + documentation = "Computes the hourly ceiling from the July 2024 county rate sheets, including approved special-needs care and qualified specialized infant and toddler care." + definition_period = MONTH + defined_for = "sd_cca_eligible_child" + reference = ( + "https://dss.sd.gov/docs/childcare/assistance/Reimbursement_Rates/Family_Child_Care.pdf", + "https://dss.sd.gov/docs/childcare/assistance/Reimbursement_Rates/Center_Care.pdf", + "https://dss.sd.gov/docs/childcare/assistance/Reimbursement_Rates/Before_After_School_Programs.pdf", + "https://dss.sd.gov/docs/childcare/assistance/Reimbursement_Rates/Relative_In-Home_and_Informal_Care.pdf", + ) + + def formula_2024_07_01(person, period, parameters): + p = parameters(period).gov.states.sd.dss.cca.rates.hourly + county = person.household("county_str", period.this_year) + county = where(np.isin(county, p.counties), county, "UNKNOWN") + age = person("age", period.this_year) + # DSS uses three age bands in the hourly sheets. School enrollment + # does not move a five-year-old into the six-and-over band. + age_group = select( + [ + age < p.age_group.infant_toddler_age_limit, + age < p.age_group.preschool_age_limit, + ], + ["UNDER_THREE", "THREE_TO_FIVE"], + default="SIX_AND_OVER", + ) + provider_type = person("sd_cca_provider_type", period) + family_rate = p.family_day_care[county][age_group] + specialized = person("sd_cca_specialized_infant_toddler_rate_eligible", period) + family_rate = family_rate * where( + specialized & (age < p.age_group.infant_toddler_age_limit), + p.specialized_infant_toddler_multiplier, + 1, + ) + center_rate = p.licensed_center[county][age_group] + base_rate = select( + [ + provider_type == SDCCAProviderType.FAMILY_DAY_CARE, + provider_type == SDCCAProviderType.INFORMAL, + provider_type == SDCCAProviderType.BEFORE_AFTER_SCHOOL, + ], + [family_rate, p.informal, p.before_after_school[county]], + default=center_rate, + ) + # DSS approves enhanced services separately from disability status. + # The published special-needs ceiling replaces the ordinary ceiling; + # it does not multiply the specialized infant and toddler rate. + approved = person("sd_cca_special_needs_rate_approved", period) + return where(approved, p.special_needs_maximum, base_rate) diff --git a/policyengine_us/variables/gov/states/sd/dss/cca/rates/sd_cca_provider_type.py b/policyengine_us/variables/gov/states/sd/dss/cca/rates/sd_cca_provider_type.py index c027dc41a04..228b800be4e 100644 --- a/policyengine_us/variables/gov/states/sd/dss/cca/rates/sd_cca_provider_type.py +++ b/policyengine_us/variables/gov/states/sd/dss/cca/rates/sd_cca_provider_type.py @@ -3,8 +3,9 @@ class SDCCAProviderType(Enum): FAMILY_DAY_CARE = "Family day care" - LICENSED_CENTER = "Licensed center or school age program" + LICENSED_CENTER = "Licensed center" INFORMAL = "Informal, in-home, or relative" + BEFORE_AFTER_SCHOOL = "Licensed before-and-after-school program" class sd_cca_provider_type(Variable): @@ -15,4 +16,8 @@ class sd_cca_provider_type(Variable): definition_period = MONTH defined_for = StateCode.SD label = "South Dakota CCA child care provider type" - reference = "https://dss.sd.gov/docs/childcare/assistance/CCA_Weekly_Reimbursement_Rates.pdf" + documentation = "Records the provider category. The hourly schedule distinguishes licensed centers from before-and-after-school programs; the weekly schedule pays both from the licensed-center table." + reference = ( + "https://dss.sd.gov/docs/childcare/assistance/CCA_Weekly_Reimbursement_Rates.pdf", + "https://dss.sd.gov/docs/childcare/assistance/Reimbursement_Rates/Before_After_School_Programs.pdf", + ) diff --git a/policyengine_us/variables/gov/states/sd/dss/cca/rates/sd_cca_special_needs_rate_approved.py b/policyengine_us/variables/gov/states/sd/dss/cca/rates/sd_cca_special_needs_rate_approved.py new file mode 100644 index 00000000000..e8902b8c8f2 --- /dev/null +++ b/policyengine_us/variables/gov/states/sd/dss/cca/rates/sd_cca_special_needs_rate_approved.py @@ -0,0 +1,12 @@ +from policyengine_us.model_api import * + + +class sd_cca_special_needs_rate_approved(Variable): + value_type = bool + entity = Person + default_value = False + definition_period = MONTH + defined_for = StateCode.SD + label = "South Dakota CCA special-needs reimbursement rate approved" + documentation = "Records whether DSS approved enhanced reimbursement for the child after reviewing medical documentation and the provider's enhanced services. Subsidy Manual Section 19 requires this review separately from child eligibility." + reference = "https://web.archive.org/web/20251031171652/https://dss.sd.gov/docs/childcare/assistance/Subsidy_Manual.pdf#page=39" diff --git a/policyengine_us/variables/gov/states/sd/dss/cca/rates/sd_cca_specialized_infant_toddler_rate_eligible.py b/policyengine_us/variables/gov/states/sd/dss/cca/rates/sd_cca_specialized_infant_toddler_rate_eligible.py new file mode 100644 index 00000000000..587ece08fb7 --- /dev/null +++ b/policyengine_us/variables/gov/states/sd/dss/cca/rates/sd_cca_specialized_infant_toddler_rate_eligible.py @@ -0,0 +1,12 @@ +from policyengine_us.model_api import * + + +class sd_cca_specialized_infant_toddler_rate_eligible(Variable): + value_type = bool + entity = Person + default_value = False + definition_period = MONTH + defined_for = StateCode.SD + label = "South Dakota CCA provider qualifies for the specialized infant and toddler rate" + documentation = "Records whether a registered family child care provider qualifies for the specialized rate by registering to care for six or fewer children. DSS limits this rate to children under age three in its July 2024 Family Child Care rate sheet." + reference = "https://dss.sd.gov/docs/childcare/assistance/Reimbursement_Rates/Family_Child_Care.pdf" diff --git a/policyengine_us/variables/gov/states/sd/dss/cca/sd_cca.py b/policyengine_us/variables/gov/states/sd/dss/cca/sd_cca.py index d4b756e3592..34b8a4b282e 100644 --- a/policyengine_us/variables/gov/states/sd/dss/cca/sd_cca.py +++ b/policyengine_us/variables/gov/states/sd/dss/cca/sd_cca.py @@ -8,31 +8,41 @@ class sd_cca(Variable): label = "South Dakota Child Care Assistance benefit amount" definition_period = MONTH defined_for = "sd_cca_eligible" - reference = "https://web.archive.org/web/20251031171652/https://dss.sd.gov/docs/childcare/assistance/Subsidy_Manual.pdf#page=21" + reference = ( + "https://sdlegislature.gov/Rules/Administrative/67:47:01:15", + "https://sdlegislature.gov/Rules/Administrative/67:47:01:16", + # PDF pages 18-24. + "https://web.archive.org/web/20251031171652/https://dss.sd.gov/docs/childcare/assistance/Subsidy_Manual.pdf#page=18", + ) def formula(spm_unit, period, parameters): p = parameters(period).gov.states.sd.dss.cca.rates - # Only the weekly region-based rate schedule (effective 2026-08-03) is - # modeled. The monthly model starts it in August 2026; the earlier - # hourly county-based schedule is deferred to a follow-up implementation. - if not p.uses_weekly_rates: - return 0 - # The benefit is the lesser of the summed per-child weekly maximum rates - # (converted to a monthly amount) and the family's billed child care - # expenses, minus the monthly co-payment, floored at zero. The - # special-needs multiplier is already folded into sd_cca_weekly_rate, so - # it sits inside the expense cap. Billed expenses are a single SPM-unit - # input, so the per-child maximum rates are pooled across the unit. person = spm_unit.members is_eligible_child = person("sd_cca_eligible_child", period) - # The rate schedule's limited-time tier starts at one hour of care per - # week, so a child with no care hours generates no reimbursement. - in_care = person("childcare_hours_per_week", period.this_year) > 0 - weekly_rate = person("sd_cca_weekly_rate", period) - weekly_to_monthly = WEEKS_IN_YEAR / MONTHS_IN_YEAR - max_reimbursement = ( - spm_unit.sum(weekly_rate * is_eligible_child * in_care) * weekly_to_monthly - ) + if p.uses_weekly_rates: + # The weekly schedule starts at one hour of care per week. + in_care = person("childcare_hours_per_week", period.this_year) > 0 + weekly_rate = person("sd_cca_weekly_rate", period) + weekly_to_monthly = WEEKS_IN_YEAR / MONTHS_IN_YEAR + max_reimbursement = ( + spm_unit.sum(weekly_rate * is_eligible_child * in_care) + * weekly_to_monthly + ) + else: + if not p.hourly.available: + return 0 + hourly_rate = person("sd_cca_hourly_rate", period) + # Care hours stand in for DSS-authorized weekly need. Section 8 + # converts weekly need with 4.3; rounding up matches its example + # of 45 weekly hours becoming 194 monthly hours. DSS imposes no + # general monthly cap on ordinary CCA authorized hours. + hours = max_(person("childcare_hours_per_week", period.this_year), 0) + monthly_hours = np.ceil(hours * p.hourly.weeks_per_month) + max_reimbursement = spm_unit.sum( + hourly_rate * monthly_hours * is_eligible_child + ) + # Family expenses pool the per-child ceilings. Both eras subtract the + # co-payment after applying the billed-expense ceiling. actual_expenses = spm_unit("spm_unit_pre_subsidy_childcare_expenses", period) capped_expenses = min_(actual_expenses, max_reimbursement) copay = spm_unit("sd_cca_copay", period) diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index 2674b4e9be5..d80750e5b48 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -14148,3 +14148,40 @@ candidates: - https://github.com/PolicyEngine/policyengine-us/pull/10053 state: ruled note: Neither source prescribes a fallback when residence data are missing. Keep the existing false default. +- id: us-sd:cca-hourly-private-pay-cap + program: ccdf + years: + from: 2024 + to: 2026 + type: calendar + note: The hourly schedule applies from July 2024 through July 2026. + question: Does South Dakota cap hourly child care assistance at the provider's public charge when the state reimbursement ceiling exceeds that charge? + sources: + - kind: regulation + citation: ARSD 67:47:01:15, last amended September 12, 2016 + url: https://sdlegislature.gov/Rules/Administrative/67:47:01:15 + - kind: regulation + citation: ARSD 67:47:01:16, last amended January 18, 1993 + url: https://sdlegislature.gov/Rules/Administrative/67:47:01:16 + - kind: manual + citation: Child Care Provider Reimbursement Guide, pages 3, 7 and 18 + url: https://dss.sd.gov/docs/childcare/assistance/regulated_manual.pdf + - kind: guidance + citation: Family Child Care maximum reimbursement rates, effective July 1, 2024, page 1 + url: https://dss.sd.gov/docs/childcare/assistance/Reimbursement_Rates/Family_Child_Care.pdf + - kind: plan + citation: FFY 2025-2027 CCDF State Plan, initial plan certified September 24, 2024, sections 4.3.3 and 4.4.2, pages 60-63 + url: https://dss.sd.gov/docs/childcare/state_plan/2025-2027/2025-2027_State_Plan_original.pdf + - kind: plan + citation: FFY 2025-2027 CCDF State Plan, Amendment 1 approved July 9, 2025, sections 4.3.3 and 4.4.2, pages 60-63 + url: https://dss.sd.gov/docs/childcare/state_plan/2025-2027/Amendment_1.pdf + readings: + statute: No statute supplied; providers bill their usual public charge under ARSD 67:47:01:15. DSS pays at most actual allowable costs less the household contribution under section 67:47:01:16. DSS caps reimbursement at the public hourly charge or the provider's weekly bill in its provider guide. DSS applies that ceiling to the infant and toddler enhancement on its family rate sheet. + other: DSS checked no when asked whether it reduces payments if the private charge falls below its reimbursement ceiling. DSS also caps the infant and toddler enhancement at the public charge and describes hourly payments before its future weekly system in the same plan. + pe_us: + follows: statute + code: + - policyengine_us/variables/gov/states/sd/dss/cca/sd_cca.py + prs: [] + state: ruled + note: Follow the regulation and operational payment instructions over the plan's checkbox. The model caps summed hourly ceilings at the family's billed expenses because it records expenses for the SPM unit rather than separately for each child or provider. From 56a6d6d19d5b9176b08c8939a5fa8d74d60e63a6 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 11 Nov 2026 20:14:30 -0500 Subject: [PATCH 2/3] Pin annual inputs in South Dakota rate transition tests Set calendar-year inputs for the hourly start and weekly transition cases. Link the private-charge source conflict to its draft pull request. Co-Authored-By: Claude Opus 5.5 --- .../sd/dss/cca/rates/sd_cca_weekly_rate.yaml | 30 ++++-- .../gov/states/sd/dss/cca/sd_cca.yaml | 96 ++++++++++++------- source_conflicts/candidates.yaml | 3 +- 3 files changed, 86 insertions(+), 43 deletions(-) diff --git a/policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/rates/sd_cca_weekly_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/rates/sd_cca_weekly_rate.yaml index 94f58b8ef29..f6049a727f8 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/rates/sd_cca_weekly_rate.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/rates/sd_cca_weekly_rate.yaml @@ -342,18 +342,23 @@ input: people: child: - age: 8 + age: + 2026: 8 sd_cca_provider_type: BEFORE_AFTER_SCHOOL - childcare_hours_per_week: 40 + childcare_hours_per_week: + 2026: 40 spm_units: unit: members: [child] - meets_ccdf_activity_test: true + meets_ccdf_activity_test: + 2026: true households: household: members: [child] - state_code: SD - county_str: MINNEHAHA_COUNTY_SD + state_code: + 2026: SD + county_str: + 2026: MINNEHAHA_COUNTY_SD output: # The weekly sheet groups licensed centers and school age programs. # The urban school age full-time ceiling equals $185 per week. @@ -365,17 +370,22 @@ input: people: child: - age: 8 + age: + 2026: 8 sd_cca_provider_type: LICENSED_CENTER - childcare_hours_per_week: 40 + childcare_hours_per_week: + 2026: 40 spm_units: unit: members: [child] - meets_ccdf_activity_test: true + meets_ccdf_activity_test: + 2026: true households: household: members: [child] - state_code: SD - county_str: MINNEHAHA_COUNTY_SD + state_code: + 2026: SD + county_str: + 2026: MINNEHAHA_COUNTY_SD output: sd_cca_weekly_rate: 185 diff --git a/policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/sd_cca.yaml b/policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/sd_cca.yaml index c7c0837d87f..e4fb7616c1d 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/sd_cca.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/sd_cca.yaml @@ -495,22 +495,30 @@ input: people: person1: - age: 30 - employment_income: 24000 + age: + 2026: 30 + employment_income: + 2026: 24000 person2: - age: 0.5 + age: + 2026: 0.5 sd_cca_provider_type: FAMILY_DAY_CARE - childcare_hours_per_week: 40 + childcare_hours_per_week: + 2026: 40 spm_units: spm_unit: members: [person1, person2] - meets_ccdf_activity_test: true - spm_unit_pre_subsidy_childcare_expenses: 24000 + meets_ccdf_activity_test: + 2026: true + spm_unit_pre_subsidy_childcare_expenses: + 2026: 24000 households: household: members: [person1, person2] - state_code: SD - county_str: MINNEHAHA_COUNTY_SD + state_code: + 2026: SD + county_str: + 2026: MINNEHAHA_COUNTY_SD output: # 172 * $3.80 = $653.60 before the weekly schedule starts. sd_cca: 653.6 @@ -521,22 +529,30 @@ input: people: person1: - age: 30 - employment_income: 24000 + age: + 2026: 30 + employment_income: + 2026: 24000 person2: - age: 0.5 + age: + 2026: 0.5 sd_cca_provider_type: FAMILY_DAY_CARE - childcare_hours_per_week: 40 + childcare_hours_per_week: + 2026: 40 spm_units: spm_unit: members: [person1, person2] - meets_ccdf_activity_test: true - spm_unit_pre_subsidy_childcare_expenses: 24000 + meets_ccdf_activity_test: + 2026: true + spm_unit_pre_subsidy_childcare_expenses: + 2026: 24000 households: household: members: [person1, person2] - state_code: SD - county_str: MINNEHAHA_COUNTY_SD + state_code: + 2026: SD + county_str: + 2026: MINNEHAHA_COUNTY_SD output: # The weekly infant rate gives $180 * 52 / 12 = $780. sd_cca: 780 @@ -547,22 +563,30 @@ input: people: person1: - age: 30 - employment_income: 24000 + age: + 2024: 30 + employment_income: + 2024: 24000 person2: - age: 0.5 + age: + 2024: 0.5 sd_cca_provider_type: FAMILY_DAY_CARE - childcare_hours_per_week: 40 + childcare_hours_per_week: + 2024: 40 spm_units: spm_unit: members: [person1, person2] - meets_ccdf_activity_test: true - spm_unit_pre_subsidy_childcare_expenses: 24000 + meets_ccdf_activity_test: + 2024: true + spm_unit_pre_subsidy_childcare_expenses: + 2024: 24000 households: household: members: [person1, person2] - state_code: SD - county_str: MINNEHAHA_COUNTY_SD + state_code: + 2024: SD + county_str: + 2024: MINNEHAHA_COUNTY_SD output: # No sourced schedule covers June 2024, so hourly availability remains false. sd_cca: 0 @@ -573,22 +597,30 @@ input: people: person1: - age: 30 - employment_income: 24000 + age: + 2024: 30 + employment_income: + 2024: 24000 person2: - age: 0.5 + age: + 2024: 0.5 sd_cca_provider_type: FAMILY_DAY_CARE - childcare_hours_per_week: 40 + childcare_hours_per_week: + 2024: 40 spm_units: spm_unit: members: [person1, person2] - meets_ccdf_activity_test: true - spm_unit_pre_subsidy_childcare_expenses: 24000 + meets_ccdf_activity_test: + 2024: true + spm_unit_pre_subsidy_childcare_expenses: + 2024: 24000 households: household: members: [person1, person2] - state_code: SD - county_str: MINNEHAHA_COUNTY_SD + state_code: + 2024: SD + county_str: + 2024: MINNEHAHA_COUNTY_SD output: # 172 * $3.80 = $653.60 from the sheet effective July 1, 2024. sd_cca: 653.6 diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index d80750e5b48..530ba7322f6 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -14182,6 +14182,7 @@ candidates: follows: statute code: - policyengine_us/variables/gov/states/sd/dss/cca/sd_cca.py - prs: [] + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10815 state: ruled note: Follow the regulation and operational payment instructions over the plan's checkbox. The model caps summed hourly ceilings at the family's billed expenses because it records expenses for the SPM unit rather than separately for each child or provider. From 0eb611de13a3913ad3234389b49f0c5e5415791e Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Fri, 13 Nov 2026 17:37:50 -0500 Subject: [PATCH 3/3] Round South Dakota CCA monthly hours from exact products Multiply weekly care hours by 4.3 in float64. In float32, 50 weekly hours times 4.3 gave 215.0000153, and rounding up paid 216 hours instead of 215. The same error added an hour at 90, 100 and 110 weekly hours. Add cases at 15, 50, 90 and 100 weekly hours, and check every quarter hour from 0 to 100 weekly hours against integer arithmetic. Note in the coverage entry that the hourly special-needs ceiling needs the DSS approval input. Co-Authored-By: Claude Opus 5.5 --- policyengine_us/programs.yaml | 2 +- .../test_sd_cca_hourly_rates_invariants.py | 28 ++++- .../gov/states/sd/dss/cca/sd_cca.yaml | 107 ++++++++++++++++++ .../variables/gov/states/sd/dss/cca/sd_cca.py | 4 +- 4 files changed, 136 insertions(+), 5 deletions(-) diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 0840f56147b..8f2bcee3eb5 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -984,7 +984,7 @@ programs: full_name: South Dakota Child Care Assistance variable: sd_cca parameter_prefix: gov.states.sd.dss.cca - notes: Models the hourly county-based rate schedule effective 2024-07-01 and the weekly region-based rate schedule effective 2026-08-03 with the billed-expense cap and co-payment, the income and asset tests, the citizen or lawful-permanent-resident child test, and the reason-for-care test. For a child under court supervision or incapable of self-care, the model applies South Dakota's age extension, which raises the age limit from under 13 to under 18, or under 19 while in school. The model pays no benefit before July 2024 because earlier rates remain unsourced. When callers omit county, the model uses Aurora County, which can overstate or understate hourly rates. For an unrecognized county, the model uses the lowest hourly rate for each provider type and age group, which can understate rates. The model uses reported care hours for authorized need and leaves out negotiated special-needs rates above the published ceiling. + notes: Models the hourly county-based rate schedule effective 2024-07-01 and the weekly region-based rate schedule effective 2026-08-03 with the billed-expense cap and co-payment, the income and asset tests, the citizen or lawful-permanent-resident child test, and the reason-for-care test. For a child under court supervision or incapable of self-care, the model applies South Dakota's age extension, which raises the age limit from under 13 to under 18, or under 19 while in school. The model pays no benefit before July 2024 because earlier rates remain unsourced. When callers omit county, the model uses Aurora County, which can overstate or understate hourly rates. For an unrecognized county, the model uses the lowest hourly rate for each provider type and age group, which can understate rates. The model uses reported care hours for authorized need and leaves out negotiated special-needs rates above the published ceiling. Before August 2026, the model applies the special-needs ceiling only when the caller records DSS approval; from August 2026, it treats a disabled child as having special needs. - state: UT status: complete name: Utah CCAP diff --git a/policyengine_us/tests/core/test_sd_cca_hourly_rates_invariants.py b/policyengine_us/tests/core/test_sd_cca_hourly_rates_invariants.py index 69102d459a2..1afee54a9e2 100644 --- a/policyengine_us/tests/core/test_sd_cca_hourly_rates_invariants.py +++ b/policyengine_us/tests/core/test_sd_cca_hourly_rates_invariants.py @@ -1,8 +1,10 @@ -"""Check hourly CCA bounds, monotonicity, and weekly compatibility. +"""Check hourly CCA bounds, monotonicity, hour conversion, and weekly compatibility. Hypothesis changes hours and billed expenses in independent simulations. YAML -cases pin the county tables and rate modifiers. The weekly check evaluates the -main-branch benefit formula with independently aggregated per-child rates. +cases pin the county tables and rate modifiers. The conversion check compares +every quarter hour from 0 to 100 weekly hours with integer arithmetic. The +weekly check evaluates the main-branch benefit formula with independently +aggregated per-child rates. """ import numpy as np @@ -171,6 +173,26 @@ def test_hourly_bounds_monotonicity_and_positive_payment(month, units): assert base[-1] > 0 +def test_monthly_hours_round_exact_products_up(): + # DSS multiplies weekly need by 4.3 and rounds up, so q quarter hours a + # week give ceil(43q / 40) = (43q + 39) // 40 monthly hours. Multiples of + # 10 weekly hours give whole products, such as 50 * 4.3 = 215, and + # odd multiples of 5 give half hours, such as 15 * 4.3 = 64.5 -> 65. + # The Minnehaha family-care rate for children under 3 is $3.80, and + # $24,000 / 12 = $2,000 of monthly expenses exceeds 430 * $3.80. + quarters = range(401) + family = _positive_case() + child = family["children"][0] + units = [ + {**family, "children": [{**child, "hours": quarter / 4}]} + for quarter in quarters + ] + sim, benefit = _run(units, "2025-01") + assert (sim.calculate("sd_cca_copay", "2025-01") == 0).all() + monthly_hours = np.array([(43 * quarter + 39) // 40 for quarter in quarters]) + np.testing.assert_allclose(benefit, monthly_hours * 3.80, atol=TOLERANCE, rtol=0) + + @settings(**SETTINGS) @given( st.integers(2026 * 12 + 7, 2030 * 12 + 11), diff --git a/policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/sd_cca.yaml b/policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/sd_cca.yaml index e4fb7616c1d..711e9e98c37 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/sd_cca.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/sd/dss/cca/sd_cca.yaml @@ -706,3 +706,110 @@ output: # min(172 * $6.80, $10,800 / 12) = min($1,169.60, $900) = $900. sd_cca: 900 + +- name: Case 25, The model rounds a half monthly hour up. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24000 + person2: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + childcare_hours_per_week: 15 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + spm_unit_pre_subsidy_childcare_expenses: 24000 + households: + household: + members: [person1, person2] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + # 15 * 4.3 = 64.5, rounded up to 65 monthly hours; rounding half to + # even would give 64. 65 * $3.80 = $247.00. + sd_cca: 247 + +- name: Case 26, The model keeps a whole number of monthly hours at 50 weekly hours. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24000 + person2: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + childcare_hours_per_week: 50 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + spm_unit_pre_subsidy_childcare_expenses: 24000 + households: + household: + members: [person1, person2] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + # 50 * 4.3 = 215 monthly hours exactly. 215 * $3.80 = $817.00. + # Expenses $24,000 / 12 = $2,000 exceed the ceiling; co-payment = $0. + sd_cca: 817 + +- name: Case 27, The model keeps a whole number of monthly hours at 90 weekly hours. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24000 + person2: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + childcare_hours_per_week: 90 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + spm_unit_pre_subsidy_childcare_expenses: 24000 + households: + household: + members: [person1, person2] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + # 90 * 4.3 = 387 monthly hours exactly. 387 * $3.80 = $1,470.60. + sd_cca: 1_470.6 + +- name: Case 28, The model keeps a whole number of monthly hours at 100 weekly hours. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24000 + person2: + age: 0.5 + sd_cca_provider_type: FAMILY_DAY_CARE + childcare_hours_per_week: 100 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + spm_unit_pre_subsidy_childcare_expenses: 24000 + households: + household: + members: [person1, person2] + state_code: SD + county_str: MINNEHAHA_COUNTY_SD + output: + # 100 * 4.3 = 430 monthly hours exactly. 430 * $3.80 = $1,634.00, + # under the $2,000 monthly expenses. + sd_cca: 1_634 diff --git a/policyengine_us/variables/gov/states/sd/dss/cca/sd_cca.py b/policyengine_us/variables/gov/states/sd/dss/cca/sd_cca.py index 34b8a4b282e..728b1f183d0 100644 --- a/policyengine_us/variables/gov/states/sd/dss/cca/sd_cca.py +++ b/policyengine_us/variables/gov/states/sd/dss/cca/sd_cca.py @@ -37,7 +37,9 @@ def formula(spm_unit, period, parameters): # of 45 weekly hours becoming 194 monthly hours. DSS imposes no # general monthly cap on ordinary CCA authorized hours. hours = max_(person("childcare_hours_per_week", period.this_year), 0) - monthly_hours = np.ceil(hours * p.hourly.weeks_per_month) + # Multiply in float64. In float32, 50 * 4.3 gives 215.0000153, + # and rounding up would add an hour to DSS's 215. + monthly_hours = np.ceil(hours.astype(np.float64) * p.hourly.weeks_per_month) max_reimbursement = spm_unit.sum( hourly_rate * monthly_hours * is_eligible_child )