diff --git a/changelog.d/ct-ccap.added.md b/changelog.d/ct-ccap.added.md new file mode 100644 index 00000000000..9be0645adf7 --- /dev/null +++ b/changelog.d/ct-ccap.added.md @@ -0,0 +1 @@ +Add Connecticut Child Care Assistance Program (CCAP/Care 4 Kids). diff --git a/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml b/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml index 367612a52ae..5ecccb0350f 100644 --- a/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml +++ b/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml @@ -3,6 +3,7 @@ values: 2021-01-01: - ca_child_care_subsidies # California Child Care - co_child_care_subsidies # Colorado Child Care Assistance Program + - ct_child_care_subsidies # Connecticut Care 4 Kids - ma_child_care_subsidies # Massachusetts Child Care Financial Assistance - ne_child_care_subsidies # Nebraska Child Care Subsidy diff --git a/policyengine_us/parameters/gov/states/ct/oec/c4k/accreditation_bonus.yaml b/policyengine_us/parameters/gov/states/ct/oec/c4k/accreditation_bonus.yaml new file mode 100644 index 00000000000..d14c075031e --- /dev/null +++ b/policyengine_us/parameters/gov/states/ct/oec/c4k/accreditation_bonus.yaml @@ -0,0 +1,13 @@ +description: Connecticut provides this percentage increase for accredited providers under the Care 4 Kids program. +values: + 2020-01-01: 0.05 + +metadata: + unit: /1 + period: year + label: Connecticut C4K accreditation bonus rate + reference: + - title: RCSA 17b-749-13(d)(1) + href: https://eregulations.ct.gov/eRegsPortal/Browse/RCSA/Title_17bSubtitle_17b-749Section_17b-749-13/ + - title: CGA 2020-R-0274 + href: https://www.cga.ct.gov/2020/rpt/pdf/2020-R-0274.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ct/oec/c4k/age_threshold/age_group.yaml b/policyengine_us/parameters/gov/states/ct/oec/c4k/age_threshold/age_group.yaml new file mode 100644 index 00000000000..92440e7f6a3 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ct/oec/c4k/age_threshold/age_group.yaml @@ -0,0 +1,25 @@ +description: Connecticut determines the age group for the Care 4 Kids program based on child age. + +metadata: + type: single_amount + threshold_unit: year + amount_unit: /1 + period: year + label: Connecticut C4K age group thresholds + reference: + - title: C4K Weekly Payment Rates Jul 2025-Jun 2026 + href: https://www.ctcare4kids.com/wp-content/uploads/2024/12/Care-4-Kids-Weekly-Payment-Rates-jul-june.2026.pdf#page=1 + +brackets: + - threshold: + 2020-01-01: 0 + amount: + 2020-01-01: 0 + - threshold: + 2020-01-01: 3 + amount: + 2020-01-01: 1 + - threshold: + 2020-01-01: 6 + amount: + 2020-01-01: 2 diff --git a/policyengine_us/parameters/gov/states/ct/oec/c4k/age_threshold/child.yaml b/policyengine_us/parameters/gov/states/ct/oec/c4k/age_threshold/child.yaml new file mode 100644 index 00000000000..ec35d3f261a --- /dev/null +++ b/policyengine_us/parameters/gov/states/ct/oec/c4k/age_threshold/child.yaml @@ -0,0 +1,13 @@ +description: Connecticut limits the Care 4 Kids program to children younger than this age. +values: + 2020-01-01: 13 + +metadata: + unit: year + period: year + label: Connecticut C4K child age threshold + reference: + - title: CGS 17b-749(a) + href: https://www.cga.ct.gov/current/pub/chap_319t.htm#sec_17b-749 + - title: CGA 2020-R-0274 + href: https://www.cga.ct.gov/2020/rpt/pdf/2020-R-0274.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ct/oec/c4k/age_threshold/special_needs_child.yaml b/policyengine_us/parameters/gov/states/ct/oec/c4k/age_threshold/special_needs_child.yaml new file mode 100644 index 00000000000..b3545586b86 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ct/oec/c4k/age_threshold/special_needs_child.yaml @@ -0,0 +1,13 @@ +description: Connecticut limits the Care 4 Kids program to children with special needs younger than this age. +values: + 2020-01-01: 19 + +metadata: + unit: year + period: year + label: Connecticut C4K special needs child age threshold + reference: + - title: CGS 17b-749(a) + href: https://www.cga.ct.gov/current/pub/chap_319t.htm#sec_17b-749 + - title: CGA 2020-R-0274 + href: https://www.cga.ct.gov/2020/rpt/pdf/2020-R-0274.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ct/oec/c4k/age_threshold/teen_parent.yaml b/policyengine_us/parameters/gov/states/ct/oec/c4k/age_threshold/teen_parent.yaml new file mode 100644 index 00000000000..adbb640d7ca --- /dev/null +++ b/policyengine_us/parameters/gov/states/ct/oec/c4k/age_threshold/teen_parent.yaml @@ -0,0 +1,11 @@ +description: Connecticut limits teen parent eligibility for the Care 4 Kids program to parents under this age. +values: + 2020-01-01: 20 + +metadata: + unit: year + period: year + label: Connecticut C4K teen parent age threshold + reference: + - title: RCSA 17b-749-04 + href: https://eregulations.ct.gov/eRegsPortal/Browse/RCSA/Title_17bSubtitle_17b-749Section_17b-749-04/ diff --git a/policyengine_us/parameters/gov/states/ct/oec/c4k/care_level.yaml b/policyengine_us/parameters/gov/states/ct/oec/c4k/care_level.yaml new file mode 100644 index 00000000000..6fe5f21d886 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ct/oec/c4k/care_level.yaml @@ -0,0 +1,29 @@ +description: Connecticut determines the care level based on authorized hours per week under the Care 4 Kids program. + +metadata: + type: single_amount + threshold_unit: hour + amount_unit: /1 + period: year + label: Connecticut C4K care level by hours per week + reference: + - title: C4K Weekly Payment Rates Jul 2025-Jun 2026 + href: https://www.ctcare4kids.com/wp-content/uploads/2024/12/Care-4-Kids-Weekly-Payment-Rates-jul-june.2026.pdf#page=1 + +brackets: + - threshold: + 2020-01-01: 0 + amount: + 2020-01-01: 3 # QUARTER_TIME + - threshold: + 2020-01-01: 16 + amount: + 2020-01-01: 2 # HALF_TIME + - threshold: + 2020-01-01: 35 + amount: + 2020-01-01: 1 # FULL_TIME + - threshold: + 2020-01-01: 51 + amount: + 2020-01-01: 0 # FULL_TIME_PLUS diff --git a/policyengine_us/parameters/gov/states/ct/oec/c4k/family_fee/rate.yaml b/policyengine_us/parameters/gov/states/ct/oec/c4k/family_fee/rate.yaml new file mode 100644 index 00000000000..1980142d93e --- /dev/null +++ b/policyengine_us/parameters/gov/states/ct/oec/c4k/family_fee/rate.yaml @@ -0,0 +1,47 @@ +description: Connecticut sets the family fee as this share of gross countable income under the Care 4 Kids program. + +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: /1 + period: year + label: Connecticut C4K family fee rate + reference: + - title: RCSA 17b-749-13(f) + href: https://eregulations.ct.gov/eRegsPortal/Browse/RCSA/Title_17bSubtitle_17b-749Section_17b-749-13/ + - title: C4K-POL-24-01 FY 2024-2025 State Median Income Standards + href: https://www.ctoec.org/forms-documents/c4k-annual-state-median-incomes-transmittal-fy-2025.pdf#page=3 + - title: C4K-POL-24-02 Family Fee Scale Transmittal + href: https://www.ctoec.org/wp-content/uploads/2024/10/Family-Fee-Transmittal-Update.pdf#page=2 + +brackets: + - threshold: + 2020-01-01: 0 + 2025-01-01: 0 + amount: + 2020-01-01: 0.02 + 2025-01-01: 0 + - threshold: + 2020-01-01: 0.2 + 2025-01-01: 0.2 + amount: + 2020-01-01: 0.04 + 2025-01-01: 0.03 + - threshold: + 2020-01-01: 0.3 + 2025-01-01: 0.4 + amount: + 2020-01-01: 0.06 + 2025-01-01: 0.05 + - threshold: + 2020-01-01: 0.4 + 2025-01-01: 0.6 + amount: + 2020-01-01: 0.08 + 2025-01-01: 0.07 + - threshold: + 2020-01-01: 0.5 + 2025-01-01: .inf + amount: + 2020-01-01: 0.1 + 2025-01-01: 0 diff --git a/policyengine_us/parameters/gov/states/ct/oec/c4k/income/continuing_limit_smi.yaml b/policyengine_us/parameters/gov/states/ct/oec/c4k/income/continuing_limit_smi.yaml new file mode 100644 index 00000000000..100b79ad7e7 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ct/oec/c4k/income/continuing_limit_smi.yaml @@ -0,0 +1,17 @@ +description: Connecticut limits the Care 4 Kids program to continuing recipients with income below this share of the state median income. +values: + 2020-01-01: 0.5 + 2023-10-01: 0.65 + 2024-10-01: 0.85 + +metadata: + unit: /1 + period: year + label: Connecticut C4K continuing income limit SMI rate + reference: + - title: CGA 2023-R-0249 + href: https://www.cga.ct.gov/2023/rpt/pdf/2023-R-0249.pdf#page=3 + - title: C4K-POL-24-01 FY 2024-2025 State Median Income Standards + href: https://www.ctoec.org/forms-documents/c4k-annual-state-median-incomes-transmittal-fy-2025.pdf#page=1 + - title: 45 CFR 98.21(b) - Federal CCDF income eligibility ceiling + href: https://www.ecfr.gov/current/title-45/subtitle-A/subchapter-A/part-98/subpart-B/section-98.21 diff --git a/policyengine_us/parameters/gov/states/ct/oec/c4k/income/deductions.yaml b/policyengine_us/parameters/gov/states/ct/oec/c4k/income/deductions.yaml new file mode 100644 index 00000000000..06640aa8523 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ct/oec/c4k/income/deductions.yaml @@ -0,0 +1,12 @@ +description: Connecticut deducts these income sources from countable income under the Care 4 Kids program. +values: + 2020-01-01: + - child_support_expense + +metadata: + unit: list + period: year + label: Connecticut C4K countable income deductions + reference: + - title: RCSA 17b-749-05(c) + href: https://eregulations.ct.gov/eRegsPortal/Browse/RCSA/Title_17bSubtitle_17b-749Section_17b-749-05/ diff --git a/policyengine_us/parameters/gov/states/ct/oec/c4k/income/initial_limit_smi.yaml b/policyengine_us/parameters/gov/states/ct/oec/c4k/income/initial_limit_smi.yaml new file mode 100644 index 00000000000..c830a616482 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ct/oec/c4k/income/initial_limit_smi.yaml @@ -0,0 +1,14 @@ +description: Connecticut limits the Care 4 Kids program to new applicants with income below this share of the state median income. +values: + 2020-01-01: 0.5 + 2023-10-01: 0.6 + +metadata: + unit: /1 + period: year + label: Connecticut C4K initial income limit SMI rate + reference: + - title: RCSA 17b-749-05(a) + href: https://eregulations.ct.gov/eRegsPortal/Browse/RCSA/Title_17bSubtitle_17b-749Section_17b-749-05/ + - title: CGA 2023-R-0249 + href: https://www.cga.ct.gov/2023/rpt/pdf/2023-R-0249.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/ct/oec/c4k/income/sources.yaml b/policyengine_us/parameters/gov/states/ct/oec/c4k/income/sources.yaml new file mode 100644 index 00000000000..6c57143faab --- /dev/null +++ b/policyengine_us/parameters/gov/states/ct/oec/c4k/income/sources.yaml @@ -0,0 +1,22 @@ +description: Connecticut counts these income sources as countable income under the Care 4 Kids program. +values: + 2020-01-01: + - employment_income + - self_employment_income + - farm_income + - social_security + - pension_income + - unemployment_compensation + - workers_compensation + - alimony_income + - rental_income + - veterans_benefits + - disability_benefits + +metadata: + unit: list + period: year + label: Connecticut C4K countable income sources + reference: + - title: RCSA 17b-749-05(b) + href: https://eregulations.ct.gov/eRegsPortal/Browse/RCSA/Title_17bSubtitle_17b-749Section_17b-749-05/ diff --git a/policyengine_us/parameters/gov/states/ct/oec/c4k/rate/center.yaml b/policyengine_us/parameters/gov/states/ct/oec/c4k/rate/center.yaml new file mode 100644 index 00000000000..6051e90c512 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ct/oec/c4k/rate/center.yaml @@ -0,0 +1,286 @@ +description: Connecticut provides these weekly rates for center-based care under the Care 4 Kids program. +metadata: + period: week + unit: currency-USD + label: Connecticut C4K center weekly rates + breakdown: + - ct_c4k_care_level + - ct_c4k_region + - ct_c4k_age_group + reference: + - title: C4K Weekly Payment Rates Jan-Jun 2024 + href: https://www.ctcare4kids.com/wp-content/uploads/2024/01/Care-4-Kids-Weekly-Payment-Rates-Jan-1-Jun-30-2024.pdf#page=1 + - title: C4K Weekly Payment Rates Jul 2024 + href: https://www.ctcare4kids.com/wp-content/uploads/2024/01/Care-4-Kids-Weekly-Payment-Rates-2024.pdf#page=1 + - title: C4K Weekly Payment Rates Jan-Jun 2025 + href: https://www.ctcare4kids.com/wp-content/uploads/2024/12/Care-4-Kids-Weekly-Payment-Rates-jan-june.2025.pdf#page=1 + - title: C4K Weekly Payment Rates Jul 2025-Jun 2026 + href: https://www.ctcare4kids.com/wp-content/uploads/2024/12/Care-4-Kids-Weekly-Payment-Rates-jul-june.2026.pdf#page=1 + +FULL_TIME_PLUS: + EASTERN: + INFANT_TODDLER: + 2024-01-01: 344 + 2024-07-01: 382 + 2025-07-01: 424 + PRE_SCHOOL: + 2024-01-01: 275 + 2024-07-01: 305 + 2025-07-01: 339 + SCHOOL_AGE: + 2024-01-01: 193 + 2024-07-01: 214 + 2025-07-01: 238 + NORTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 454 + 2024-07-01: 504 + 2025-07-01: 559 + PRE_SCHOOL: + 2024-01-01: 302 + 2024-07-01: 335 + 2025-07-01: 372 + SCHOOL_AGE: + 2024-01-01: 213 + 2024-07-01: 236 + 2025-07-01: 262 + NORTHWEST: + INFANT_TODDLER: + 2024-01-01: 386 + 2024-07-01: 428 + 2025-07-01: 475 + PRE_SCHOOL: + 2024-01-01: 297 + 2024-07-01: 330 + 2025-07-01: 366 + SCHOOL_AGE: + 2024-01-01: 223 + 2024-07-01: 248 + 2025-07-01: 275 + SOUTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 446 + 2024-07-01: 495 + 2025-07-01: 549 + PRE_SCHOOL: + 2024-01-01: 312 + 2024-07-01: 346 + 2025-07-01: 384 + SCHOOL_AGE: + 2024-01-01: 245 + 2024-07-01: 272 + 2025-07-01: 302 + SOUTHWEST: + INFANT_TODDLER: + 2024-01-01: 565 + 2024-07-01: 627 + 2025-07-01: 696 + PRE_SCHOOL: + 2024-01-01: 363 + 2024-07-01: 403 + 2025-07-01: 447 + SCHOOL_AGE: + 2024-01-01: 255 + 2024-07-01: 283 + 2025-07-01: 314 + +FULL_TIME: + EASTERN: + INFANT_TODDLER: + 2024-01-01: 256 + 2024-07-01: 284 + 2025-07-01: 315 + PRE_SCHOOL: + 2024-01-01: 205 + 2024-07-01: 228 + 2025-07-01: 253 + SCHOOL_AGE: + 2024-01-01: 144 + 2024-07-01: 160 + 2025-07-01: 178 + NORTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 339 + 2024-07-01: 376 + 2025-07-01: 417 + PRE_SCHOOL: + 2024-01-01: 225 + 2024-07-01: 250 + 2025-07-01: 278 + SCHOOL_AGE: + 2024-01-01: 159 + 2024-07-01: 176 + 2025-07-01: 195 + NORTHWEST: + INFANT_TODDLER: + 2024-01-01: 289 + 2024-07-01: 321 + 2025-07-01: 356 + PRE_SCHOOL: + 2024-01-01: 222 + 2024-07-01: 246 + 2025-07-01: 273 + SCHOOL_AGE: + 2024-01-01: 167 + 2024-07-01: 185 + 2025-07-01: 205 + SOUTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 333 + 2024-07-01: 370 + 2025-07-01: 411 + PRE_SCHOOL: + 2024-01-01: 233 + 2024-07-01: 259 + 2025-07-01: 287 + SCHOOL_AGE: + 2024-01-01: 183 + 2024-07-01: 203 + 2025-07-01: 225 + SOUTHWEST: + INFANT_TODDLER: + 2024-01-01: 422 + 2024-07-01: 468 + 2025-07-01: 519 + PRE_SCHOOL: + 2024-01-01: 271 + 2024-07-01: 301 + 2025-07-01: 334 + SCHOOL_AGE: + 2024-01-01: 191 + 2024-07-01: 212 + 2025-07-01: 235 + +HALF_TIME: + EASTERN: + INFANT_TODDLER: + 2024-01-01: 174 + 2024-07-01: 193 + 2025-07-01: 214 + PRE_SCHOOL: + 2024-01-01: 140 + 2024-07-01: 155 + 2025-07-01: 172 + SCHOOL_AGE: + 2024-01-01: 93 + 2024-07-01: 103 + 2025-07-01: 114 + NORTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 230 + 2024-07-01: 255 + 2025-07-01: 283 + PRE_SCHOOL: + 2024-01-01: 153 + 2024-07-01: 170 + 2025-07-01: 189 + SCHOOL_AGE: + 2024-01-01: 105 + 2024-07-01: 117 + 2025-07-01: 130 + NORTHWEST: + INFANT_TODDLER: + 2024-01-01: 196 + 2024-07-01: 218 + 2025-07-01: 242 + PRE_SCHOOL: + 2024-01-01: 151 + 2024-07-01: 168 + 2025-07-01: 186 + SCHOOL_AGE: + 2024-01-01: 111 + 2024-07-01: 123 + 2025-07-01: 137 + SOUTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 226 + 2024-07-01: 251 + 2025-07-01: 279 + PRE_SCHOOL: + 2024-01-01: 159 + 2024-07-01: 176 + 2025-07-01: 195 + SCHOOL_AGE: + 2024-01-01: 122 + 2024-07-01: 135 + 2025-07-01: 150 + SOUTHWEST: + INFANT_TODDLER: + 2024-01-01: 286 + 2024-07-01: 317 + 2025-07-01: 352 + PRE_SCHOOL: + 2024-01-01: 184 + 2024-07-01: 204 + 2025-07-01: 226 + SCHOOL_AGE: + 2024-01-01: 125 + 2024-07-01: 139 + 2025-07-01: 154 + +QUARTER_TIME: + EASTERN: + INFANT_TODDLER: + 2024-01-01: 88 + 2024-07-01: 98 + 2025-07-01: 109 + PRE_SCHOOL: + 2024-01-01: 70 + 2024-07-01: 78 + 2025-07-01: 87 + SCHOOL_AGE: + 2024-01-01: 49 + 2024-07-01: 54 + 2025-07-01: 60 + NORTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 115 + 2024-07-01: 128 + 2025-07-01: 142 + PRE_SCHOOL: + 2024-01-01: 77 + 2024-07-01: 85 + 2025-07-01: 94 + SCHOOL_AGE: + 2024-01-01: 54 + 2024-07-01: 60 + 2025-07-01: 67 + NORTHWEST: + INFANT_TODDLER: + 2024-01-01: 98 + 2024-07-01: 109 + 2025-07-01: 121 + PRE_SCHOOL: + 2024-01-01: 75 + 2024-07-01: 83 + 2025-07-01: 92 + SCHOOL_AGE: + 2024-01-01: 57 + 2024-07-01: 63 + 2025-07-01: 70 + SOUTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 113 + 2024-07-01: 125 + 2025-07-01: 139 + PRE_SCHOOL: + 2024-01-01: 79 + 2024-07-01: 88 + 2025-07-01: 98 + SCHOOL_AGE: + 2024-01-01: 62 + 2024-07-01: 69 + 2025-07-01: 77 + SOUTHWEST: + INFANT_TODDLER: + 2024-01-01: 143 + 2024-07-01: 159 + 2025-07-01: 176 + PRE_SCHOOL: + 2024-01-01: 92 + 2024-07-01: 102 + 2025-07-01: 113 + SCHOOL_AGE: + 2024-01-01: 64 + 2024-07-01: 71 + 2025-07-01: 79 diff --git a/policyengine_us/parameters/gov/states/ct/oec/c4k/rate/family.yaml b/policyengine_us/parameters/gov/states/ct/oec/c4k/rate/family.yaml new file mode 100644 index 00000000000..649b461ed3a --- /dev/null +++ b/policyengine_us/parameters/gov/states/ct/oec/c4k/rate/family.yaml @@ -0,0 +1,286 @@ +description: Connecticut provides these weekly rates for licensed family child care under the Care 4 Kids program. +metadata: + period: week + unit: currency-USD + label: Connecticut C4K family weekly rates + breakdown: + - ct_c4k_care_level + - ct_c4k_region + - ct_c4k_age_group + reference: + - title: C4K Weekly Payment Rates Jan-Jun 2024 + href: https://www.ctcare4kids.com/wp-content/uploads/2024/01/Care-4-Kids-Weekly-Payment-Rates-Jan-1-Jun-30-2024.pdf#page=1 + - title: C4K Weekly Payment Rates Jul 2024 + href: https://www.ctcare4kids.com/wp-content/uploads/2024/01/Care-4-Kids-Weekly-Payment-Rates-2024.pdf#page=1 + - title: C4K Weekly Payment Rates Jan-Jun 2025 + href: https://www.ctcare4kids.com/wp-content/uploads/2024/12/Care-4-Kids-Weekly-Payment-Rates-jan-june.2025.pdf#page=1 + - title: C4K Weekly Payment Rates Jul 2025-Jun 2026 + href: https://www.ctcare4kids.com/wp-content/uploads/2024/12/Care-4-Kids-Weekly-Payment-Rates-jul-june.2026.pdf#page=1 + +FULL_TIME_PLUS: + EASTERN: + INFANT_TODDLER: + 2024-01-01: 302 + 2024-07-01: 335 + 2025-07-01: 372 + PRE_SCHOOL: + 2024-01-01: 236 + 2024-07-01: 262 + 2025-07-01: 291 + SCHOOL_AGE: + 2024-01-01: 219 + 2024-07-01: 243 + 2025-07-01: 270 + NORTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 335 + 2024-07-01: 372 + 2025-07-01: 413 + PRE_SCHOOL: + 2024-01-01: 262 + 2024-07-01: 291 + 2025-07-01: 323 + SCHOOL_AGE: + 2024-01-01: 242 + 2024-07-01: 269 + 2025-07-01: 299 + NORTHWEST: + INFANT_TODDLER: + 2024-01-01: 354 + 2024-07-01: 393 + 2025-07-01: 436 + PRE_SCHOOL: + 2024-01-01: 276 + 2024-07-01: 306 + 2025-07-01: 340 + SCHOOL_AGE: + 2024-01-01: 254 + 2024-07-01: 282 + 2025-07-01: 313 + SOUTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 371 + 2024-07-01: 412 + 2025-07-01: 457 + PRE_SCHOOL: + 2024-01-01: 289 + 2024-07-01: 321 + 2025-07-01: 356 + SCHOOL_AGE: + 2024-01-01: 269 + 2024-07-01: 299 + 2025-07-01: 332 + SOUTHWEST: + INFANT_TODDLER: + 2024-01-01: 403 + 2024-07-01: 447 + 2025-07-01: 496 + PRE_SCHOOL: + 2024-01-01: 314 + 2024-07-01: 349 + 2025-07-01: 387 + SCHOOL_AGE: + 2024-01-01: 289 + 2024-07-01: 321 + 2025-07-01: 356 + +FULL_TIME: + EASTERN: + INFANT_TODDLER: + 2024-01-01: 229 + 2024-07-01: 254 + 2025-07-01: 282 + PRE_SCHOOL: + 2024-01-01: 176 + 2024-07-01: 195 + 2025-07-01: 216 + SCHOOL_AGE: + 2024-01-01: 165 + 2024-07-01: 183 + 2025-07-01: 203 + NORTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 252 + 2024-07-01: 280 + 2025-07-01: 311 + PRE_SCHOOL: + 2024-01-01: 194 + 2024-07-01: 215 + 2025-07-01: 239 + SCHOOL_AGE: + 2024-01-01: 181 + 2024-07-01: 201 + 2025-07-01: 223 + NORTHWEST: + INFANT_TODDLER: + 2024-01-01: 262 + 2024-07-01: 291 + 2025-07-01: 323 + PRE_SCHOOL: + 2024-01-01: 205 + 2024-07-01: 228 + 2025-07-01: 253 + SCHOOL_AGE: + 2024-01-01: 191 + 2024-07-01: 212 + 2025-07-01: 235 + SOUTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 276 + 2024-07-01: 306 + 2025-07-01: 340 + PRE_SCHOOL: + 2024-01-01: 216 + 2024-07-01: 240 + 2025-07-01: 266 + SCHOOL_AGE: + 2024-01-01: 200 + 2024-07-01: 222 + 2025-07-01: 246 + SOUTHWEST: + INFANT_TODDLER: + 2024-01-01: 300 + 2024-07-01: 333 + 2025-07-01: 370 + PRE_SCHOOL: + 2024-01-01: 232 + 2024-07-01: 258 + 2025-07-01: 286 + SCHOOL_AGE: + 2024-01-01: 219 + 2024-07-01: 243 + 2025-07-01: 270 + +HALF_TIME: + EASTERN: + INFANT_TODDLER: + 2024-01-01: 153 + 2024-07-01: 170 + 2025-07-01: 189 + PRE_SCHOOL: + 2024-01-01: 123 + 2024-07-01: 137 + 2025-07-01: 152 + SCHOOL_AGE: + 2024-01-01: 107 + 2024-07-01: 119 + 2025-07-01: 132 + NORTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 172 + 2024-07-01: 191 + 2025-07-01: 212 + PRE_SCHOOL: + 2024-01-01: 134 + 2024-07-01: 149 + 2025-07-01: 165 + SCHOOL_AGE: + 2024-01-01: 122 + 2024-07-01: 135 + 2025-07-01: 150 + NORTHWEST: + INFANT_TODDLER: + 2024-01-01: 180 + 2024-07-01: 200 + 2025-07-01: 222 + PRE_SCHOOL: + 2024-01-01: 140 + 2024-07-01: 155 + 2025-07-01: 172 + SCHOOL_AGE: + 2024-01-01: 128 + 2024-07-01: 142 + 2025-07-01: 158 + SOUTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 190 + 2024-07-01: 211 + 2025-07-01: 234 + PRE_SCHOOL: + 2024-01-01: 147 + 2024-07-01: 163 + 2025-07-01: 181 + SCHOOL_AGE: + 2024-01-01: 133 + 2024-07-01: 148 + 2025-07-01: 164 + SOUTHWEST: + INFANT_TODDLER: + 2024-01-01: 205 + 2024-07-01: 228 + 2025-07-01: 253 + PRE_SCHOOL: + 2024-01-01: 162 + 2024-07-01: 180 + 2025-07-01: 200 + SCHOOL_AGE: + 2024-01-01: 142 + 2024-07-01: 158 + 2025-07-01: 175 + +QUARTER_TIME: + EASTERN: + INFANT_TODDLER: + 2024-01-01: 78 + 2024-07-01: 87 + 2025-07-01: 97 + PRE_SCHOOL: + 2024-01-01: 58 + 2024-07-01: 64 + 2025-07-01: 71 + SCHOOL_AGE: + 2024-01-01: 52 + 2024-07-01: 58 + 2025-07-01: 64 + NORTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 85 + 2024-07-01: 94 + 2025-07-01: 104 + PRE_SCHOOL: + 2024-01-01: 69 + 2024-07-01: 77 + 2025-07-01: 85 + SCHOOL_AGE: + 2024-01-01: 58 + 2024-07-01: 64 + 2025-07-01: 71 + NORTHWEST: + INFANT_TODDLER: + 2024-01-01: 91 + 2024-07-01: 101 + 2025-07-01: 112 + PRE_SCHOOL: + 2024-01-01: 74 + 2024-07-01: 82 + 2025-07-01: 91 + SCHOOL_AGE: + 2024-01-01: 61 + 2024-07-01: 68 + 2025-07-01: 75 + SOUTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 93 + 2024-07-01: 103 + 2025-07-01: 114 + PRE_SCHOOL: + 2024-01-01: 77 + 2024-07-01: 85 + 2025-07-01: 94 + SCHOOL_AGE: + 2024-01-01: 65 + 2024-07-01: 72 + 2025-07-01: 80 + SOUTHWEST: + INFANT_TODDLER: + 2024-01-01: 103 + 2024-07-01: 114 + 2025-07-01: 127 + PRE_SCHOOL: + 2024-01-01: 82 + 2024-07-01: 91 + 2025-07-01: 101 + SCHOOL_AGE: + 2024-01-01: 74 + 2024-07-01: 82 + 2025-07-01: 91 diff --git a/policyengine_us/parameters/gov/states/ct/oec/c4k/rate/recreational.yaml b/policyengine_us/parameters/gov/states/ct/oec/c4k/rate/recreational.yaml new file mode 100644 index 00000000000..5e821bc3edd --- /dev/null +++ b/policyengine_us/parameters/gov/states/ct/oec/c4k/rate/recreational.yaml @@ -0,0 +1,286 @@ +description: Connecticut provides these weekly rates for recreational summer program care under the Care 4 Kids program. +metadata: + period: week + unit: currency-USD + label: Connecticut C4K recreational weekly rates + breakdown: + - ct_c4k_care_level + - ct_c4k_region + - ct_c4k_age_group + reference: + - title: C4K Weekly Payment Rates Jan-Jun 2024 + href: https://www.ctcare4kids.com/wp-content/uploads/2024/01/Care-4-Kids-Weekly-Payment-Rates-Jan-1-Jun-30-2024.pdf#page=1 + - title: C4K Weekly Payment Rates Jul 2024 + href: https://www.ctcare4kids.com/wp-content/uploads/2024/01/Care-4-Kids-Weekly-Payment-Rates-2024.pdf#page=1 + - title: C4K Weekly Payment Rates Jan-Jun 2025 + href: https://www.ctcare4kids.com/wp-content/uploads/2024/12/Care-4-Kids-Weekly-Payment-Rates-jan-june.2025.pdf#page=1 + - title: C4K Weekly Payment Rates Jul 2025-Jun 2026 + href: https://www.ctcare4kids.com/wp-content/uploads/2024/12/Care-4-Kids-Weekly-Payment-Rates-jul-june.2026.pdf#page=1 + +FULL_TIME_PLUS: + EASTERN: + INFANT_TODDLER: + 2024-01-01: 344 + 2024-07-01: 382 + 2025-07-01: 424 + PRE_SCHOOL: + 2024-01-01: 275 + 2024-07-01: 305 + 2025-07-01: 339 + SCHOOL_AGE: + 2024-01-01: 198 + 2024-07-01: 214 + 2025-07-01: 238 + NORTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 454 + 2024-07-01: 504 + 2025-07-01: 559 + PRE_SCHOOL: + 2024-01-01: 302 + 2024-07-01: 335 + 2025-07-01: 372 + SCHOOL_AGE: + 2024-01-01: 213 + 2024-07-01: 236 + 2025-07-01: 262 + NORTHWEST: + INFANT_TODDLER: + 2024-01-01: 386 + 2024-07-01: 428 + 2025-07-01: 475 + PRE_SCHOOL: + 2024-01-01: 297 + 2024-07-01: 330 + 2025-07-01: 366 + SCHOOL_AGE: + 2024-01-01: 223 + 2024-07-01: 248 + 2025-07-01: 275 + SOUTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 446 + 2024-07-01: 495 + 2025-07-01: 549 + PRE_SCHOOL: + 2024-01-01: 312 + 2024-07-01: 346 + 2025-07-01: 384 + SCHOOL_AGE: + 2024-01-01: 245 + 2024-07-01: 272 + 2025-07-01: 302 + SOUTHWEST: + INFANT_TODDLER: + 2024-01-01: 565 + 2024-07-01: 627 + 2025-07-01: 696 + PRE_SCHOOL: + 2024-01-01: 363 + 2024-07-01: 403 + 2025-07-01: 447 + SCHOOL_AGE: + 2024-01-01: 255 + 2024-07-01: 283 + 2025-07-01: 314 + +FULL_TIME: + EASTERN: + INFANT_TODDLER: + 2024-01-01: 256 + 2024-07-01: 284 + 2025-07-01: 315 + PRE_SCHOOL: + 2024-01-01: 205 + 2024-07-01: 228 + 2025-07-01: 253 + SCHOOL_AGE: + 2024-01-01: 144 + 2024-07-01: 160 + 2025-07-01: 178 + NORTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 339 + 2024-07-01: 376 + 2025-07-01: 417 + PRE_SCHOOL: + 2024-01-01: 225 + 2024-07-01: 250 + 2025-07-01: 278 + SCHOOL_AGE: + 2024-01-01: 159 + 2024-07-01: 176 + 2025-07-01: 195 + NORTHWEST: + INFANT_TODDLER: + 2024-01-01: 289 + 2024-07-01: 321 + 2025-07-01: 356 + PRE_SCHOOL: + 2024-01-01: 222 + 2024-07-01: 246 + 2025-07-01: 273 + SCHOOL_AGE: + 2024-01-01: 167 + 2024-07-01: 185 + 2025-07-01: 205 + SOUTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 333 + 2024-07-01: 370 + 2025-07-01: 411 + PRE_SCHOOL: + 2024-01-01: 233 + 2024-07-01: 259 + 2025-07-01: 287 + SCHOOL_AGE: + 2024-01-01: 183 + 2024-07-01: 203 + 2025-07-01: 225 + SOUTHWEST: + INFANT_TODDLER: + 2024-01-01: 422 + 2024-07-01: 468 + 2025-07-01: 519 + PRE_SCHOOL: + 2024-01-01: 271 + 2024-07-01: 301 + 2025-07-01: 334 + SCHOOL_AGE: + 2024-01-01: 191 + 2024-07-01: 212 + 2025-07-01: 235 + +HALF_TIME: + EASTERN: + INFANT_TODDLER: + 2024-01-01: 174 + 2024-07-01: 193 + 2025-07-01: 214 + PRE_SCHOOL: + 2024-01-01: 140 + 2024-07-01: 155 + 2025-07-01: 172 + SCHOOL_AGE: + 2024-01-01: 93 + 2024-07-01: 103 + 2025-07-01: 114 + NORTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 230 + 2024-07-01: 255 + 2025-07-01: 283 + PRE_SCHOOL: + 2024-01-01: 153 + 2024-07-01: 170 + 2025-07-01: 189 + SCHOOL_AGE: + 2024-01-01: 105 + 2024-07-01: 117 + 2025-07-01: 130 + NORTHWEST: + INFANT_TODDLER: + 2024-01-01: 196 + 2024-07-01: 218 + 2025-07-01: 242 + PRE_SCHOOL: + 2024-01-01: 151 + 2024-07-01: 168 + 2025-07-01: 186 + SCHOOL_AGE: + 2024-01-01: 111 + 2024-07-01: 123 + 2025-07-01: 137 + SOUTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 226 + 2024-07-01: 251 + 2025-07-01: 279 + PRE_SCHOOL: + 2024-01-01: 159 + 2024-07-01: 176 + 2025-07-01: 195 + SCHOOL_AGE: + 2024-01-01: 122 + 2024-07-01: 135 + 2025-07-01: 150 + SOUTHWEST: + INFANT_TODDLER: + 2024-01-01: 286 + 2024-07-01: 317 + 2025-07-01: 352 + PRE_SCHOOL: + 2024-01-01: 184 + 2024-07-01: 204 + 2025-07-01: 226 + SCHOOL_AGE: + 2024-01-01: 125 + 2024-07-01: 139 + 2025-07-01: 154 + +QUARTER_TIME: + EASTERN: + INFANT_TODDLER: + 2024-01-01: 88 + 2024-07-01: 98 + 2025-07-01: 109 + PRE_SCHOOL: + 2024-01-01: 70 + 2024-07-01: 78 + 2025-07-01: 87 + SCHOOL_AGE: + 2024-01-01: 49 + 2024-07-01: 54 + 2025-07-01: 60 + NORTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 115 + 2024-07-01: 128 + 2025-07-01: 142 + PRE_SCHOOL: + 2024-01-01: 77 + 2024-07-01: 85 + 2025-07-01: 94 + SCHOOL_AGE: + 2024-01-01: 54 + 2024-07-01: 60 + 2025-07-01: 67 + NORTHWEST: + INFANT_TODDLER: + 2024-01-01: 98 + 2024-07-01: 109 + 2025-07-01: 121 + PRE_SCHOOL: + 2024-01-01: 75 + 2024-07-01: 83 + 2025-07-01: 92 + SCHOOL_AGE: + 2024-01-01: 57 + 2024-07-01: 63 + 2025-07-01: 70 + SOUTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 113 + 2024-07-01: 125 + 2025-07-01: 139 + PRE_SCHOOL: + 2024-01-01: 79 + 2024-07-01: 88 + 2025-07-01: 98 + SCHOOL_AGE: + 2024-01-01: 62 + 2024-07-01: 69 + 2025-07-01: 77 + SOUTHWEST: + INFANT_TODDLER: + 2024-01-01: 143 + 2024-07-01: 159 + 2025-07-01: 176 + PRE_SCHOOL: + 2024-01-01: 92 + 2024-07-01: 102 + 2025-07-01: 113 + SCHOOL_AGE: + 2024-01-01: 64 + 2024-07-01: 71 + 2025-07-01: 79 diff --git a/policyengine_us/parameters/gov/states/ct/oec/c4k/rate/relative.yaml b/policyengine_us/parameters/gov/states/ct/oec/c4k/rate/relative.yaml new file mode 100644 index 00000000000..8e8cbf23fa6 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ct/oec/c4k/rate/relative.yaml @@ -0,0 +1,346 @@ +description: Connecticut provides these weekly rates for unlicensed relative care under the Care 4 Kids program. +metadata: + period: week + unit: currency-USD + label: Connecticut C4K relative weekly rates + breakdown: + - ct_c4k_care_level + - ct_c4k_region + - ct_c4k_age_group + reference: + - title: C4K Weekly Payment Rates Jan-Jun 2024 + href: https://www.ctcare4kids.com/wp-content/uploads/2024/01/Care-4-Kids-Weekly-Payment-Rates-Jan-1-Jun-30-2024.pdf#page=1 + - title: C4K Weekly Payment Rates Jul 2024 + href: https://www.ctcare4kids.com/wp-content/uploads/2024/01/Care-4-Kids-Weekly-Payment-Rates-2024.pdf#page=1 + - title: C4K Weekly Payment Rates Jan-Jun 2025 + href: https://www.ctcare4kids.com/wp-content/uploads/2024/12/Care-4-Kids-Weekly-Payment-Rates-jan-june.2025.pdf#page=1 + - title: C4K Weekly Payment Rates Jul 2025-Jun 2026 + href: https://www.ctcare4kids.com/wp-content/uploads/2024/12/Care-4-Kids-Weekly-Payment-Rates-jul-june.2026.pdf#page=1 + +FULL_TIME_PLUS: + EASTERN: + INFANT_TODDLER: + 2024-01-01: 294 + 2024-07-01: 298 + 2025-01-01: 325 + 2025-07-01: 345 + PRE_SCHOOL: + 2024-01-01: 294 + 2024-07-01: 298 + 2025-01-01: 325 + 2025-07-01: 345 + SCHOOL_AGE: + 2024-01-01: 294 + 2024-07-01: 298 + 2025-01-01: 325 + 2025-07-01: 345 + NORTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 294 + 2024-07-01: 298 + 2025-01-01: 325 + 2025-07-01: 345 + PRE_SCHOOL: + 2024-01-01: 294 + 2024-07-01: 298 + 2025-01-01: 325 + 2025-07-01: 345 + SCHOOL_AGE: + 2024-01-01: 294 + 2024-07-01: 298 + 2025-01-01: 325 + 2025-07-01: 345 + NORTHWEST: + INFANT_TODDLER: + 2024-01-01: 294 + 2024-07-01: 298 + 2025-01-01: 325 + 2025-07-01: 345 + PRE_SCHOOL: + 2024-01-01: 294 + 2024-07-01: 298 + 2025-01-01: 325 + 2025-07-01: 345 + SCHOOL_AGE: + 2024-01-01: 294 + 2024-07-01: 298 + 2025-01-01: 325 + 2025-07-01: 345 + SOUTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 294 + 2024-07-01: 298 + 2025-01-01: 325 + 2025-07-01: 345 + PRE_SCHOOL: + 2024-01-01: 294 + 2024-07-01: 298 + 2025-01-01: 325 + 2025-07-01: 345 + SCHOOL_AGE: + 2024-01-01: 294 + 2024-07-01: 298 + 2025-01-01: 325 + 2025-07-01: 345 + SOUTHWEST: + INFANT_TODDLER: + 2024-01-01: 294 + 2024-07-01: 298 + 2025-01-01: 325 + 2025-07-01: 345 + PRE_SCHOOL: + 2024-01-01: 294 + 2024-07-01: 298 + 2025-01-01: 325 + 2025-07-01: 345 + SCHOOL_AGE: + 2024-01-01: 294 + 2024-07-01: 298 + 2025-01-01: 325 + 2025-07-01: 345 + +FULL_TIME: + EASTERN: + INFANT_TODDLER: + 2024-01-01: 222 + 2024-07-01: 225 + 2025-01-01: 245 + 2025-07-01: 260 + PRE_SCHOOL: + 2024-01-01: 222 + 2024-07-01: 225 + 2025-01-01: 245 + 2025-07-01: 260 + SCHOOL_AGE: + 2024-01-01: 222 + 2024-07-01: 225 + 2025-01-01: 245 + 2025-07-01: 260 + NORTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 222 + 2024-07-01: 225 + 2025-01-01: 245 + 2025-07-01: 260 + PRE_SCHOOL: + 2024-01-01: 222 + 2024-07-01: 225 + 2025-01-01: 245 + 2025-07-01: 260 + SCHOOL_AGE: + 2024-01-01: 222 + 2024-07-01: 225 + 2025-01-01: 245 + 2025-07-01: 260 + NORTHWEST: + INFANT_TODDLER: + 2024-01-01: 222 + 2024-07-01: 225 + 2025-01-01: 245 + 2025-07-01: 260 + PRE_SCHOOL: + 2024-01-01: 222 + 2024-07-01: 225 + 2025-01-01: 245 + 2025-07-01: 260 + SCHOOL_AGE: + 2024-01-01: 222 + 2024-07-01: 225 + 2025-01-01: 245 + 2025-07-01: 260 + SOUTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 222 + 2024-07-01: 225 + 2025-01-01: 245 + 2025-07-01: 260 + PRE_SCHOOL: + 2024-01-01: 222 + 2024-07-01: 225 + 2025-01-01: 245 + 2025-07-01: 260 + SCHOOL_AGE: + 2024-01-01: 222 + 2024-07-01: 225 + 2025-01-01: 245 + 2025-07-01: 260 + SOUTHWEST: + INFANT_TODDLER: + 2024-01-01: 222 + 2024-07-01: 225 + 2025-01-01: 245 + 2025-07-01: 260 + PRE_SCHOOL: + 2024-01-01: 222 + 2024-07-01: 225 + 2025-01-01: 245 + 2025-07-01: 260 + SCHOOL_AGE: + 2024-01-01: 222 + 2024-07-01: 225 + 2025-01-01: 245 + 2025-07-01: 260 + +HALF_TIME: + EASTERN: + INFANT_TODDLER: + 2024-01-01: 134 + 2024-07-01: 135 + 2025-01-01: 148 + 2025-07-01: 157 + PRE_SCHOOL: + 2024-01-01: 134 + 2024-07-01: 135 + 2025-01-01: 148 + 2025-07-01: 157 + SCHOOL_AGE: + 2024-01-01: 134 + 2024-07-01: 135 + 2025-01-01: 148 + 2025-07-01: 157 + NORTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 134 + 2024-07-01: 135 + 2025-01-01: 148 + 2025-07-01: 157 + PRE_SCHOOL: + 2024-01-01: 134 + 2024-07-01: 135 + 2025-01-01: 148 + 2025-07-01: 157 + SCHOOL_AGE: + 2024-01-01: 134 + 2024-07-01: 135 + 2025-01-01: 148 + 2025-07-01: 157 + NORTHWEST: + INFANT_TODDLER: + 2024-01-01: 134 + 2024-07-01: 135 + 2025-01-01: 148 + 2025-07-01: 157 + PRE_SCHOOL: + 2024-01-01: 134 + 2024-07-01: 135 + 2025-01-01: 148 + 2025-07-01: 157 + SCHOOL_AGE: + 2024-01-01: 134 + 2024-07-01: 135 + 2025-01-01: 148 + 2025-07-01: 157 + SOUTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 134 + 2024-07-01: 135 + 2025-01-01: 148 + 2025-07-01: 157 + PRE_SCHOOL: + 2024-01-01: 134 + 2024-07-01: 135 + 2025-01-01: 148 + 2025-07-01: 157 + SCHOOL_AGE: + 2024-01-01: 134 + 2024-07-01: 135 + 2025-01-01: 148 + 2025-07-01: 157 + SOUTHWEST: + INFANT_TODDLER: + 2024-01-01: 134 + 2024-07-01: 135 + 2025-01-01: 148 + 2025-07-01: 157 + PRE_SCHOOL: + 2024-01-01: 134 + 2024-07-01: 135 + 2025-01-01: 148 + 2025-07-01: 157 + SCHOOL_AGE: + 2024-01-01: 134 + 2024-07-01: 135 + 2025-01-01: 148 + 2025-07-01: 157 + +QUARTER_TIME: + EASTERN: + INFANT_TODDLER: + 2024-01-01: 67 + 2024-07-01: 68 + 2025-01-01: 74 + 2025-07-01: 78 + PRE_SCHOOL: + 2024-01-01: 67 + 2024-07-01: 68 + 2025-01-01: 74 + 2025-07-01: 78 + SCHOOL_AGE: + 2024-01-01: 67 + 2024-07-01: 68 + 2025-01-01: 74 + 2025-07-01: 78 + NORTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 67 + 2024-07-01: 68 + 2025-01-01: 74 + 2025-07-01: 78 + PRE_SCHOOL: + 2024-01-01: 67 + 2024-07-01: 68 + 2025-01-01: 74 + 2025-07-01: 78 + SCHOOL_AGE: + 2024-01-01: 67 + 2024-07-01: 68 + 2025-01-01: 74 + 2025-07-01: 78 + NORTHWEST: + INFANT_TODDLER: + 2024-01-01: 67 + 2024-07-01: 68 + 2025-01-01: 74 + 2025-07-01: 78 + PRE_SCHOOL: + 2024-01-01: 67 + 2024-07-01: 68 + 2025-01-01: 74 + 2025-07-01: 78 + SCHOOL_AGE: + 2024-01-01: 67 + 2024-07-01: 68 + 2025-01-01: 74 + 2025-07-01: 78 + SOUTH_CENTRAL: + INFANT_TODDLER: + 2024-01-01: 67 + 2024-07-01: 68 + 2025-01-01: 74 + 2025-07-01: 78 + PRE_SCHOOL: + 2024-01-01: 67 + 2024-07-01: 68 + 2025-01-01: 74 + 2025-07-01: 78 + SCHOOL_AGE: + 2024-01-01: 67 + 2024-07-01: 68 + 2025-01-01: 74 + 2025-07-01: 78 + SOUTHWEST: + INFANT_TODDLER: + 2024-01-01: 67 + 2024-07-01: 68 + 2025-01-01: 74 + 2025-07-01: 78 + PRE_SCHOOL: + 2024-01-01: 67 + 2024-07-01: 68 + 2025-01-01: 74 + 2025-07-01: 78 + SCHOOL_AGE: + 2024-01-01: 67 + 2024-07-01: 68 + 2025-01-01: 74 + 2025-07-01: 78 diff --git a/policyengine_us/parameters/gov/states/ct/oec/c4k/region/eastern.yaml b/policyengine_us/parameters/gov/states/ct/oec/c4k/region/eastern.yaml new file mode 100644 index 00000000000..fdb4c0e661e --- /dev/null +++ b/policyengine_us/parameters/gov/states/ct/oec/c4k/region/eastern.yaml @@ -0,0 +1,13 @@ +description: Connecticut defines these counties as the Eastern region under the Care 4 Kids program. +values: + 2020-01-01: + - NEW_LONDON_COUNTY_CT + - WINDHAM_COUNTY_CT + +metadata: + unit: list + period: year + label: Connecticut C4K Eastern region counties + reference: + - title: C4K Weekly Payment Rates Jul 2025-Jun 2026 - Towns Served by Region + href: https://www.ctcare4kids.com/wp-content/uploads/2024/12/Care-4-Kids-Weekly-Payment-Rates-jul-june.2026.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/ct/oec/c4k/region/north_central.yaml b/policyengine_us/parameters/gov/states/ct/oec/c4k/region/north_central.yaml new file mode 100644 index 00000000000..6011ea6ad6f --- /dev/null +++ b/policyengine_us/parameters/gov/states/ct/oec/c4k/region/north_central.yaml @@ -0,0 +1,13 @@ +description: Connecticut defines these counties as the North Central region under the Care 4 Kids program. +values: + 2020-01-01: + - HARTFORD_COUNTY_CT + - TOLLAND_COUNTY_CT + +metadata: + unit: list + period: year + label: Connecticut C4K North Central region counties + reference: + - title: C4K Weekly Payment Rates Jul 2025-Jun 2026 - Towns Served by Region + href: https://www.ctcare4kids.com/wp-content/uploads/2024/12/Care-4-Kids-Weekly-Payment-Rates-jul-june.2026.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/ct/oec/c4k/region/northwest.yaml b/policyengine_us/parameters/gov/states/ct/oec/c4k/region/northwest.yaml new file mode 100644 index 00000000000..5abe141a3b3 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ct/oec/c4k/region/northwest.yaml @@ -0,0 +1,12 @@ +description: Connecticut defines these counties as the Northwest region under the Care 4 Kids program. +values: + 2020-01-01: + - LITCHFIELD_COUNTY_CT + +metadata: + unit: list + period: year + label: Connecticut C4K Northwest region counties + reference: + - title: C4K Weekly Payment Rates Jul 2025-Jun 2026 - Towns Served by Region + href: https://www.ctcare4kids.com/wp-content/uploads/2024/12/Care-4-Kids-Weekly-Payment-Rates-jul-june.2026.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/ct/oec/c4k/region/south_central.yaml b/policyengine_us/parameters/gov/states/ct/oec/c4k/region/south_central.yaml new file mode 100644 index 00000000000..de4cc1b3d15 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ct/oec/c4k/region/south_central.yaml @@ -0,0 +1,13 @@ +description: Connecticut defines these counties as the South Central region under the Care 4 Kids program. +values: + 2020-01-01: + - MIDDLESEX_COUNTY_CT + - NEW_HAVEN_COUNTY_CT + +metadata: + unit: list + period: year + label: Connecticut C4K South Central region counties + reference: + - title: C4K Weekly Payment Rates Jul 2025-Jun 2026 - Towns Served by Region + href: https://www.ctcare4kids.com/wp-content/uploads/2024/12/Care-4-Kids-Weekly-Payment-Rates-jul-june.2026.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/ct/oec/c4k/region/southwest.yaml b/policyengine_us/parameters/gov/states/ct/oec/c4k/region/southwest.yaml new file mode 100644 index 00000000000..f774aa2a80e --- /dev/null +++ b/policyengine_us/parameters/gov/states/ct/oec/c4k/region/southwest.yaml @@ -0,0 +1,12 @@ +description: Connecticut defines these counties as the Southwest region under the Care 4 Kids program. +values: + 2020-01-01: + - FAIRFIELD_COUNTY_CT + +metadata: + unit: list + period: year + label: Connecticut C4K Southwest region counties + reference: + - title: C4K Weekly Payment Rates Jul 2025-Jun 2026 - Towns Served by Region + href: https://www.ctcare4kids.com/wp-content/uploads/2024/12/Care-4-Kids-Weekly-Payment-Rates-jul-june.2026.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/ct/oec/c4k/special_needs_supplement.yaml b/policyengine_us/parameters/gov/states/ct/oec/c4k/special_needs_supplement.yaml new file mode 100644 index 00000000000..f003768b566 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ct/oec/c4k/special_needs_supplement.yaml @@ -0,0 +1,11 @@ +description: Connecticut provides this percentage increase for children with special needs under the Care 4 Kids program. +values: + 2020-01-01: 0.15 + +metadata: + unit: /1 + period: year + label: Connecticut C4K special needs supplement rate + reference: + - title: RCSA 17b-749-13(c)(11) + href: https://eregulations.ct.gov/eRegsPortal/Browse/RCSA/Title_17bSubtitle_17b-749Section_17b-749-13/ diff --git a/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k.yaml b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k.yaml new file mode 100644 index 00000000000..a06496b2e92 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k.yaml @@ -0,0 +1,182 @@ +- name: Case 1, basic eligible family, subsidy equals rate minus fee. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + person2: + age: 5 + ct_c4k_eligible_child: true + ct_c4k_payment_rate: 228 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_eligible: true + ct_c4k_family_fee: 75 + spm_unit_pre_subsidy_childcare_expenses: 20_000 + households: + household: + members: [person1, person2] + state_code: CT + county_str: NEW_LONDON_COUNTY_CT + output: + # Monthly approved cost: 228 * 52 / 12 = 988 + # Expenses at month: 20,000 / 12 = 1,666.67 + # Capped: min(988, 1,666.67) = 988 + # Subsidy: max(988 - 75, 0) = 913 + ct_c4k: 913 + +- name: Case 2, ineligible family, zero subsidy. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_eligible: false + spm_unit_pre_subsidy_childcare_expenses: 20_000 + households: + household: + members: [person1, person2] + state_code: CT + output: + ct_c4k: 0 + +- name: Case 3, expenses less than fee, subsidy is zero. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 5 + ct_c4k_eligible_child: true + ct_c4k_payment_rate: 300 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_eligible: true + ct_c4k_family_fee: 1_250 + spm_unit_pre_subsidy_childcare_expenses: 10_000 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Monthly approved: 300 * 52 / 12 = 1,300 + # Expenses at month: 10,000 / 12 = 833.33 + # Capped: min(1,300, 833.33) = 833.33 + # max(833.33 - 1,250, 0) = 0 + ct_c4k: 0 + +- name: Case 4, fee exactly equals expenses, subsidy is zero. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 5 + ct_c4k_eligible_child: true + ct_c4k_payment_rate: 300 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_eligible: true + ct_c4k_family_fee: 833.33 + spm_unit_pre_subsidy_childcare_expenses: 10_000 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Monthly approved: 1,300; Expenses at month: 833.33 + # Capped: 833.33; max(833.33 - 833.33, 0) = 0 + ct_c4k: 0 + +- name: Case 5, zero expenses, subsidy is zero. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_eligible: true + ct_c4k_family_fee: 0 + spm_unit_pre_subsidy_childcare_expenses: 0 + households: + household: + members: [person1, person2] + state_code: CT + output: + ct_c4k: 0 + +- name: Case 6, expenses lower than approved cost, capped at expenses minus fee. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 5 + ct_c4k_eligible_child: true + ct_c4k_payment_rate: 300 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_eligible: true + ct_c4k_family_fee: 83.33 + spm_unit_pre_subsidy_childcare_expenses: 10_000 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Monthly approved: 300 * 52 / 12 = 1,300 + # Expenses at month: 10,000 / 12 = 833.33 + # Capped: min(1,300, 833.33) = 833.33 + # Subsidy: max(833.33 - 83.33, 0) = 750 + ct_c4k: 750 + +- name: Case 7, zero fee, full subsidy equals capped cost. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 5 + ct_c4k_eligible_child: true + ct_c4k_payment_rate: 200 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_eligible: true + ct_c4k_family_fee: 0 + spm_unit_pre_subsidy_childcare_expenses: 50_000 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Monthly approved: 200 * 52 / 12 = 866.67 + # Expenses at month: 50,000 / 12 = 4,166.67 + # Capped: min(866.67, 4,166.67) = 866.67 + # Subsidy: max(866.67 - 0, 0) = 866.67 + ct_c4k: 866.67 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_age_group.yaml b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_age_group.yaml new file mode 100644 index 00000000000..915642ec76c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_age_group.yaml @@ -0,0 +1,63 @@ +- name: Case 1, infant age 1, infant/toddler. + period: 2025-01 + input: + age: 1 + state_code: CT + output: + ct_c4k_age_group: INFANT_TODDLER + +- name: Case 2, toddler age 2, infant/toddler. + period: 2025-01 + input: + age: 2 + state_code: CT + output: + ct_c4k_age_group: INFANT_TODDLER + +- name: Case 3, preschool age 4, preschool. + period: 2025-01 + input: + age: 4 + state_code: CT + output: + ct_c4k_age_group: PRE_SCHOOL + +- name: Case 4, school-age 7, school-age. + period: 2025-01 + input: + age: 7 + state_code: CT + output: + ct_c4k_age_group: SCHOOL_AGE + +- name: Case 5, school-age 12, school-age. + period: 2025-01 + input: + age: 12 + state_code: CT + output: + ct_c4k_age_group: SCHOOL_AGE + +- name: Case 6, age 3, transitions to preschool. + period: 2025-01 + input: + age: 3 + state_code: CT + output: + ct_c4k_age_group: PRE_SCHOOL + +- name: Case 7, age 5, still preschool. + period: 2025-01 + input: + age: 5 + state_code: CT + output: + ct_c4k_age_group: PRE_SCHOOL + +- name: Case 8, age 6, transitions to school-age. + period: 2025-01 + input: + age: 6 + state_code: CT + output: + ct_c4k_age_group: SCHOOL_AGE diff --git a/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_care_level.yaml b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_care_level.yaml new file mode 100644 index 00000000000..9ec62fb5a10 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_care_level.yaml @@ -0,0 +1,103 @@ +- name: Case 1, 10 hours per week, quarter-time. + period: 2025-01 + input: + childcare_hours_per_week: 10 + state_code: CT + output: + ct_c4k_care_level: QUARTER_TIME + +- name: Case 2, 15 hours per week, quarter-time boundary. + period: 2025-01 + input: + childcare_hours_per_week: 15 + state_code: CT + output: + ct_c4k_care_level: QUARTER_TIME + +- name: Case 3, 16 hours per week, half-time boundary. + period: 2025-01 + input: + childcare_hours_per_week: 16 + state_code: CT + output: + ct_c4k_care_level: HALF_TIME + +- name: Case 4, 25 hours per week, half-time. + period: 2025-01 + input: + childcare_hours_per_week: 25 + state_code: CT + output: + ct_c4k_care_level: HALF_TIME + +- name: Case 5, 35 hours per week, full-time boundary. + period: 2025-01 + input: + childcare_hours_per_week: 35 + state_code: CT + output: + ct_c4k_care_level: FULL_TIME + +- name: Case 6, 40 hours per week, full-time. + period: 2025-01 + input: + childcare_hours_per_week: 40 + state_code: CT + output: + ct_c4k_care_level: FULL_TIME + +- name: Case 7, 51 hours per week, full-time plus boundary. + period: 2025-01 + input: + childcare_hours_per_week: 51 + state_code: CT + output: + ct_c4k_care_level: FULL_TIME_PLUS + +- name: Case 8, 60 hours per week, full-time plus. + period: 2025-01 + input: + childcare_hours_per_week: 60 + state_code: CT + output: + ct_c4k_care_level: FULL_TIME_PLUS + +- name: Case 9, 0 hours per week, quarter-time. + period: 2025-01 + input: + childcare_hours_per_week: 0 + state_code: CT + output: + ct_c4k_care_level: QUARTER_TIME + +- name: Case 10, 1 hour per week, quarter-time minimum. + period: 2025-01 + input: + childcare_hours_per_week: 1 + state_code: CT + output: + ct_c4k_care_level: QUARTER_TIME + +- name: Case 11, 34 hours per week, half-time upper boundary. + period: 2025-01 + input: + childcare_hours_per_week: 34 + state_code: CT + output: + ct_c4k_care_level: HALF_TIME + +- name: Case 12, 50 hours per week, full-time upper boundary. + period: 2025-01 + input: + childcare_hours_per_week: 50 + state_code: CT + output: + ct_c4k_care_level: FULL_TIME + +- name: Case 13, 65 hours per week, full-time plus maximum. + period: 2025-01 + input: + childcare_hours_per_week: 65 + state_code: CT + output: + ct_c4k_care_level: FULL_TIME_PLUS diff --git a/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_countable_income.yaml new file mode 100644 index 00000000000..eab3d77d5c9 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_countable_income.yaml @@ -0,0 +1,211 @@ +- name: Case 1, employment income only. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 40_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + output: + # 40,000 / 12 = 3,333.33 + ct_c4k_countable_income: 3_333.33 + +- name: Case 2, employment plus unearned income. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + social_security: 5_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + output: + # (30,000 + 5,000) / 12 = 2,916.67 + ct_c4k_countable_income: 2_916.67 + +- name: Case 3, child support paid deducted. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 50_000 + child_support_expense: 6_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + output: + # (50,000 - 6,000) / 12 = 3,666.67 + ct_c4k_countable_income: 3_666.67 + +- name: Case 4, multiple income types. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 25_000 + self_employment_income: 10_000 + pension_income: 3_000 + child_support_expense: 2_400 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + output: + # (25,000 + 10,000 + 3,000 - 2,400) / 12 = 2,966.67 + ct_c4k_countable_income: 2_966.67 + +- name: Case 5, child support received excluded. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 20_000 + child_support_received: 12_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + output: + # child_support_received is excluded (not in sources list) + # 20,000 / 12 = 1,666.67 + ct_c4k_countable_income: 1_666.67 + +- name: Case 6, zero income. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + output: + ct_c4k_countable_income: 0 + +- name: Case 7, all counted income types combined. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 20_000 + self_employment_income: 5_000 + farm_income: 2_000 + social_security: 3_000 + pension_income: 1_000 + unemployment_compensation: 500 + alimony_income: 1_200 + rental_income: 800 + veterans_benefits: 600 + disability_benefits: 400 + child_support_expense: 3_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + output: + # Sources: 20,000 + 5,000 + 2,000 + 3,000 + 1,000 + 500 + 1,200 + 800 + 600 + 400 = 34,500 + # Deductions: 3,000 child support paid + # Annual countable: 34,500 - 3,000 = 31,500 + # Monthly: 31,500 / 12 = 2,625 + ct_c4k_countable_income: 2_625 + +- name: Case 8, SNAP and EITC excluded. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 15_000 + ssi: 9_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + snap: 3_600 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Only employment_income is counted (15,000) + # SSI, SNAP are excluded (not in sources list) + # 15,000 / 12 = 1,250 + ct_c4k_countable_income: 1_250 + +- name: Case 9, child support paid exceeds income, countable floored at zero. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 5_000 + child_support_expense: 8_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + output: + # (5,000 - 8,000) / 12 = -250, floored at 0 by max_(income - deductions, 0) + ct_c4k_countable_income: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_eligible.yaml new file mode 100644 index 00000000000..681a673d4cc --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_eligible.yaml @@ -0,0 +1,220 @@ +- name: Case 1, all criteria met, eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + is_ccdf_immigration_eligible_child: true + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_income_eligible: true + is_ccdf_asset_eligible: true + ct_c4k_meets_activity_test: true + households: + household: + members: [person1, person2] + state_code: CT + output: + ct_c4k_eligible: true + +- name: Case 2, no eligible child, ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 14 + is_tax_unit_dependent: true + is_ccdf_immigration_eligible_child: true + is_disabled: false + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_income_eligible: true + is_ccdf_asset_eligible: true + ct_c4k_meets_activity_test: true + ct_tfa_eligible: false + households: + household: + members: [person1, person2] + state_code: CT + output: + ct_c4k_eligible: false + +- name: Case 3, income ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + is_ccdf_immigration_eligible_child: true + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_income_eligible: false + is_ccdf_asset_eligible: true + ct_c4k_meets_activity_test: true + ct_tfa_eligible: false + households: + household: + members: [person1, person2] + state_code: CT + output: + ct_c4k_eligible: false + +- name: Case 4, asset ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + is_ccdf_immigration_eligible_child: true + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_income_eligible: true + is_ccdf_asset_eligible: false + ct_c4k_meets_activity_test: true + ct_tfa_eligible: false + households: + household: + members: [person1, person2] + state_code: CT + output: + ct_c4k_eligible: false + +- name: Case 5, activity test failed. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + is_ccdf_immigration_eligible_child: true + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_income_eligible: true + is_ccdf_asset_eligible: true + ct_c4k_meets_activity_test: false + ct_tfa_eligible: false + households: + household: + members: [person1, person2] + state_code: CT + output: + ct_c4k_eligible: false + +- name: Case 6, TFA categorical eligibility. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + is_ccdf_immigration_eligible_child: true + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_income_eligible: true + is_ccdf_asset_eligible: true + ct_c4k_meets_activity_test: true + ct_tfa_eligible: true + households: + household: + members: [person1, person2] + state_code: CT + output: + ct_c4k_eligible: true + +- name: Case 7, TFA eligible overrides all other failures. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + is_ccdf_immigration_eligible_child: true + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_income_eligible: false + is_ccdf_asset_eligible: false + ct_c4k_meets_activity_test: false + ct_tfa_eligible: true + households: + household: + members: [person1, person2] + state_code: CT + output: + # TFA categorical eligibility bypasses regular requirements + ct_c4k_eligible: true + +- name: Case 8, adults only, no eligible child, ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 25 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_income_eligible: true + is_ccdf_asset_eligible: true + ct_c4k_meets_activity_test: true + households: + household: + members: [person1, person2] + state_code: CT + output: + # No child under 13 => no eligible child => ineligible + ct_c4k_eligible: false + +- name: Case 9, multiple children, only one eligible, still eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 14 + is_tax_unit_dependent: true + is_ccdf_immigration_eligible_child: true + is_disabled: false + person3: + age: 5 + is_tax_unit_dependent: true + is_ccdf_immigration_eligible_child: true + spm_units: + spm_unit: + members: [person1, person2, person3] + ct_c4k_income_eligible: true + is_ccdf_asset_eligible: true + ct_c4k_meets_activity_test: true + households: + household: + members: [person1, person2, person3] + state_code: CT + output: + # person2 age 14 > 13 and not disabled => ineligible child + # person3 age 5 < 13 => eligible child => family eligible + ct_c4k_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_eligible_child.yaml b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_eligible_child.yaml new file mode 100644 index 00000000000..90a5078289f --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_eligible_child.yaml @@ -0,0 +1,145 @@ +- name: Case 1, child age 5, eligible. + period: 2025-01 + input: + age: 5 + is_disabled: false + is_tax_unit_dependent: true + is_ccdf_immigration_eligible_child: true + state_code: CT + output: + ct_c4k_eligible_child: true + +- name: Case 2, child age 13, not disabled, ineligible. + period: 2025-01 + input: + age: 13 + is_disabled: false + is_tax_unit_dependent: true + is_ccdf_immigration_eligible_child: true + state_code: CT + output: + ct_c4k_eligible_child: false + +- name: Case 3, child age 13, disabled, eligible. + period: 2025-01 + input: + age: 13 + is_disabled: true + is_tax_unit_dependent: true + is_ccdf_immigration_eligible_child: true + state_code: CT + output: + ct_c4k_eligible_child: true + +- name: Case 4, child age 19, disabled, ineligible. + period: 2025-01 + input: + age: 19 + is_disabled: true + is_tax_unit_dependent: true + is_ccdf_immigration_eligible_child: true + state_code: CT + output: + ct_c4k_eligible_child: false + +- name: Case 5, child age 12, at boundary, eligible. + period: 2025-01 + input: + age: 12 + is_disabled: false + is_tax_unit_dependent: true + is_ccdf_immigration_eligible_child: true + state_code: CT + output: + ct_c4k_eligible_child: true + +- name: Case 6, child not a dependent, ineligible. + period: 2025-01 + input: + age: 5 + is_disabled: false + is_tax_unit_dependent: false + is_ccdf_immigration_eligible_child: true + state_code: CT + output: + ct_c4k_eligible_child: false + +- name: Case 7, child not immigration eligible, ineligible. + period: 2025-01 + input: + age: 5 + is_disabled: false + is_tax_unit_dependent: true + is_ccdf_immigration_eligible_child: false + state_code: CT + output: + ct_c4k_eligible_child: false + +- name: Case 8, adult age 30, ineligible. + period: 2025-01 + input: + age: 30 + is_disabled: false + is_tax_unit_dependent: false + is_ccdf_immigration_eligible_child: true + state_code: CT + output: + ct_c4k_eligible_child: false + +- name: Case 9, disabled child age 18, at boundary, eligible. + period: 2025-01 + input: + age: 18 + is_disabled: true + is_tax_unit_dependent: true + is_ccdf_immigration_eligible_child: true + state_code: CT + output: + ct_c4k_eligible_child: true + +- name: Case 10, age zero infant, eligible. + period: 2025-01 + input: + age: 0 + is_disabled: false + is_tax_unit_dependent: true + is_ccdf_immigration_eligible_child: true + state_code: CT + output: + ct_c4k_eligible_child: true + +- name: Case 11, disabled child age 15, between regular and special needs thresholds. + period: 2025-01 + input: + age: 15 + is_disabled: true + is_tax_unit_dependent: true + is_ccdf_immigration_eligible_child: true + state_code: CT + output: + # age 15 < 19 (special needs threshold) => eligible + ct_c4k_eligible_child: true + +- name: Case 12, disabled child exactly at special needs threshold age 19, ineligible. + period: 2025-01 + input: + age: 19 + is_disabled: true + is_tax_unit_dependent: true + is_ccdf_immigration_eligible_child: true + state_code: CT + output: + # age 19 < 19 is false => ineligible (at threshold) + ct_c4k_eligible_child: false + +- name: Case 13, non-disabled child exactly at regular threshold age 13, ineligible. + period: 2025-01 + input: + age: 13 + is_disabled: false + is_tax_unit_dependent: true + is_ccdf_immigration_eligible_child: true + state_code: CT + output: + # age 13 < 13 is false => ineligible (at threshold) + ct_c4k_eligible_child: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_family_fee.yaml b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_family_fee.yaml new file mode 100644 index 00000000000..25007c84f35 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_family_fee.yaml @@ -0,0 +1,347 @@ +- name: Case 1, income below 20% SMI, post-2025, fee waived. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_countable_income: 1_250 + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Monthly income: 1,250; SMI at month: 99,180/12 = 8,265 + # Ratio: 1,250/8,265 = 0.1512 (< 0.20 SMI) + # Fee rate = 0% + ct_c4k_family_fee: 0 + +- name: Case 2, income 25% SMI, post-2025, 3% fee. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 25_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_countable_income: 2_083.33 + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Monthly income: 2,083.33; SMI at month: 8,265 + # Ratio: 2,083.33/8,265 = 0.2520 (20%-40% SMI bracket) + # Fee rate = 3% + # Fee = 2,083.33 * 0.03 = 62.50 + ct_c4k_family_fee: 62.50 + +- name: Case 3, income 45% SMI, post-2025, 5% fee. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 45_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_countable_income: 3_750 + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Monthly income: 3,750; SMI at month: 8,265 + # Ratio: 3,750/8,265 = 0.4537 (40%-60% SMI bracket) + # Fee rate = 5% + # Fee = 3,750 * 0.05 = 187.50 + ct_c4k_family_fee: 187.50 + +- name: Case 4, income 70% SMI, post-2025, 7% fee. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 70_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_countable_income: 5_833.33 + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Monthly income: 5,833.33; SMI at month: 8,265 + # Ratio: 5,833.33/8,265 = 0.7058 (60%-85% SMI bracket) + # Fee rate = 7% + # Fee = 5,833.33 * 0.07 = 408.33 + ct_c4k_family_fee: 408.33 + +- name: Case 5, unearned income only, fee waived. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + social_security: 30_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Families with only unearned income have no fee (REQ-017) + ct_c4k_family_fee: 0 + +- name: Case 6, zero income, fee is zero. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_countable_income: 0 + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # 0% of 0 = 0 + ct_c4k_family_fee: 0 + +- name: Case 7, income at exactly 20% SMI boundary, post-2025, transitions to 3%. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 19_836 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Monthly income: 19,836/12 = 1,653; SMI at month: 8,265 + # Ratio: 1,653/8,265 = 0.2000 (exactly at 20% boundary) + # Fee rate: 20%-40% bracket => 3% + # Fee = 1,653 * 0.03 = 49.59 + ct_c4k_family_fee: 49.59 + +- name: Case 8, income just below 20% SMI, post-2025, fee waived. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 19_835 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Monthly income: 19,835/12 = 1,652.92; SMI at month: 8,265 + # Ratio: 1,652.92/8,265 = 0.19999 (just below 20%) + # Fee rate: <20% => 0% + ct_c4k_family_fee: 0 + +- name: Case 9, income at exactly 40% SMI boundary, post-2025, transitions to 5%. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 39_672 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Monthly income: 39,672/12 = 3,306; SMI at month: 8,265 + # Ratio: 3,306/8,265 = 0.4000 (exactly at 40% boundary) + # Fee rate: 40%-60% => 5% + # Fee = 3,306 * 0.05 = 165.30 + ct_c4k_family_fee: 165.30 + +- name: Case 10, income at exactly 60% SMI boundary, post-2025, transitions to 7%. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 59_508 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Monthly income: 59,508/12 = 4,959; SMI at month: 8,265 + # Ratio: 4,959/8,265 = 0.6000 (exactly at 60% boundary) + # Fee rate: 60%+ => 7% + # Fee = 4,959 * 0.07 = 347.13 + ct_c4k_family_fee: 347.13 + +- name: Case 11, mixed earned and unearned income, fee applies. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 10_000 + social_security: 10_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Has earned income => fee applies + # Monthly countable: (10,000 + 10,000) / 12 = 1,666.67 + # SMI at month: 8,265 + # Ratio: 1,666.67/8,265 = 0.2016 (20%-40% bracket) + # Fee = 1,666.67 * 0.03 = 50.00 + ct_c4k_family_fee: 50.00 + +- name: Case 12, self-employment income only, fee applies. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + self_employment_income: 30_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Self-employment is earned income => fee applies + # Monthly countable: 30,000/12 = 2,500 + # SMI at month: 8,265 + # Ratio: 2,500/8,265 = 0.3024 (20%-40% bracket) + # Fee = 2,500 * 0.03 = 75.00 + ct_c4k_family_fee: 75.00 + +- name: Case 13, zero SMI, fee is zero. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + hhs_smi: 0 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Division by zero protection: smi_ratio = 0 when smi = 0 + # Fee rate for 0 ratio = 0% (first bracket) + # Fee = 0 + ct_c4k_family_fee: 0 + +- name: Case 14, pre-2025 fee brackets, income 25% SMI, 4% fee. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 25_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_countable_income: 2_083.33 + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Monthly income: 2,083.33; SMI at month: 8,265 + # Ratio: 2,083.33/8,265 = 0.2520 (20%-30% SMI bracket, pre-2025) + # Pre-2025 fee rate = 4% + # Fee = 2,083.33 * 0.04 = 83.33 + ct_c4k_family_fee: 83.33 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_income_eligible.yaml new file mode 100644 index 00000000000..10ae831606d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_income_eligible.yaml @@ -0,0 +1,279 @@ +- name: Case 1, new applicant, income below 60% SMI, eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + is_enrolled_in_ccdf: false + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_countable_income: 4_166.67 + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Monthly income: 4,166.67; SMI at month: 99,180/12 = 8,265 + # 60% of 8,265 = 4,959; 4,166.67 < 4,959 => eligible + ct_c4k_income_eligible: true + +- name: Case 2, new applicant, income above 60% SMI, ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + is_enrolled_in_ccdf: false + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_countable_income: 5_416.67 + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Monthly income: 5,416.67; SMI at month: 8,265 + # 60% of 8,265 = 4,959; 5,416.67 > 4,959 => ineligible + ct_c4k_income_eligible: false + +- name: Case 3, continuing recipient, income below 85% SMI, eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + is_enrolled_in_ccdf: true + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_countable_income: 6_666.67 + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Monthly income: 6,666.67; SMI at month: 8,265 + # 85% of 8,265 = 7,025.25; 6,666.67 < 7,025.25 => eligible + ct_c4k_income_eligible: true + +- name: Case 4, continuing recipient, income above 85% SMI, ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + is_enrolled_in_ccdf: true + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_countable_income: 7_500 + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Monthly income: 7,500; SMI at month: 8,265 + # 85% of 8,265 = 7,025.25; 7,500 > 7,025.25 => ineligible + ct_c4k_income_eligible: false + +- name: Case 5, new applicant, income at boundary of 60% SMI. + period: 2025-01 + input: + people: + person1: + age: 30 + is_enrolled_in_ccdf: false + person2: + age: 5 + is_tax_unit_dependent: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + ct_c4k_countable_income: 6_125.75 + hhs_smi: 122_516 + households: + household: + members: [person1, person2, person3] + state_code: CT + output: + # Family of 3: SMI at month: 122,516/12 = 10,209.67 + # 60% of 10,209.67 = 6,125.80 + # 6,125.75 < 6,125.80 => eligible (just below) + ct_c4k_income_eligible: true + +- name: Case 6, continuing recipient between 60% and 85% SMI, eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + is_enrolled_in_ccdf: true + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_countable_income: 5_833.33 + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Monthly income: 5,833.33; SMI at month: 8,265 + # 85% of 8,265 = 7,025.25; 5,833.33 < 7,025.25 => eligible + ct_c4k_income_eligible: true + +- name: Case 7, new applicant, income exactly at 60% SMI boundary, ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + is_enrolled_in_ccdf: false + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_countable_income: 4_959 + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Monthly income: 4,959; SMI at month: 8,265 + # 60% of 8,265 = 4,959; 4,959 < 4,959 is false => ineligible (strict <) + ct_c4k_income_eligible: false + +- name: Case 8, new applicant, income one dollar below 60% SMI, eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + is_enrolled_in_ccdf: false + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_countable_income: 4_958.92 + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Monthly income: 4,958.92; SMI at month: 8,265 + # 60% of 8,265 = 4,959; 4,958.92 < 4,959 => eligible + ct_c4k_income_eligible: true + +- name: Case 9, continuing recipient, income exactly at 85% SMI boundary, ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + is_enrolled_in_ccdf: true + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_countable_income: 7_025.25 + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Monthly income: 7,025.25; SMI at month: 8,265 + # 85% of 8,265 = 7,025.25; 7,025.25 < 7,025.25 is false => ineligible (strict <) + ct_c4k_income_eligible: false + +- name: Case 10, continuing recipient, income one dollar below 85% SMI, eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + is_enrolled_in_ccdf: true + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_countable_income: 7_025.17 + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Monthly income: 7,025.17; SMI at month: 8,265 + # 85% of 8,265 = 7,025.25; 7,025.17 < 7,025.25 => eligible + ct_c4k_income_eligible: true + +- name: Case 11, zero income, new applicant, eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + is_enrolled_in_ccdf: false + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_countable_income: 0 + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # 0 < 4,959 => eligible + ct_c4k_income_eligible: true + +- name: Case 12, maximum income, continuing recipient, ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + is_enrolled_in_ccdf: true + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + ct_c4k_countable_income: 16_666.67 + hhs_smi: 99_180 + households: + household: + members: [person1, person2] + state_code: CT + output: + # Monthly income: 16,666.67; SMI at month: 8,265 + # 85% of 8,265 = 7,025.25; 16,666.67 > 7,025.25 => ineligible + ct_c4k_income_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_payment_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_payment_rate.yaml new file mode 100644 index 00000000000..01f9d6502ba --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_payment_rate.yaml @@ -0,0 +1,338 @@ +- name: Case 1, center, full-time, infant/toddler, Eastern. + period: 2025-01 + absolute_error_margin: 0.01 + input: + ct_c4k_eligible_child: true + ct_c4k_provider_type: CENTER + ct_c4k_care_level: FULL_TIME + ct_c4k_age_group: INFANT_TODDLER + ct_c4k_region: EASTERN + is_disabled: false + ct_c4k_provider_accredited: false + state_code: CT + output: + ct_c4k_payment_rate: 284 + +- name: Case 2, center, full-time, infant/toddler, Southwest. + period: 2025-01 + absolute_error_margin: 0.01 + input: + ct_c4k_eligible_child: true + ct_c4k_provider_type: CENTER + ct_c4k_care_level: FULL_TIME + ct_c4k_age_group: INFANT_TODDLER + ct_c4k_region: SOUTHWEST + is_disabled: false + ct_c4k_provider_accredited: false + state_code: CT + output: + # Jan 2025 center FT Southwest infant/toddler = $468 + ct_c4k_payment_rate: 468 + +- name: Case 3, family, half-time, preschool, North Central. + period: 2025-01 + absolute_error_margin: 0.01 + input: + ct_c4k_eligible_child: true + ct_c4k_provider_type: FAMILY + ct_c4k_care_level: HALF_TIME + ct_c4k_age_group: PRE_SCHOOL + ct_c4k_region: NORTH_CENTRAL + is_disabled: false + ct_c4k_provider_accredited: false + state_code: CT + output: + ct_c4k_payment_rate: 149 + +- name: Case 4, relative, full-time plus, Eastern. + period: 2025-01 + absolute_error_margin: 0.01 + input: + ct_c4k_eligible_child: true + ct_c4k_provider_type: RELATIVE + ct_c4k_care_level: FULL_TIME_PLUS + ct_c4k_age_group: INFANT_TODDLER + ct_c4k_region: EASTERN + is_disabled: false + ct_c4k_provider_accredited: false + state_code: CT + output: + ct_c4k_payment_rate: 325 + +- name: Case 5, center, quarter-time, school-age, Northwest. + period: 2025-01 + absolute_error_margin: 0.01 + input: + ct_c4k_eligible_child: true + ct_c4k_provider_type: CENTER + ct_c4k_care_level: QUARTER_TIME + ct_c4k_age_group: SCHOOL_AGE + ct_c4k_region: NORTHWEST + is_disabled: false + ct_c4k_provider_accredited: false + state_code: CT + output: + # Jan 2025 center QT Northwest school-age = $63 + ct_c4k_payment_rate: 63 + +- name: Case 6, center, full-time, infant/toddler, special needs supplement. + period: 2025-01 + absolute_error_margin: 0.01 + input: + ct_c4k_eligible_child: true + ct_c4k_provider_type: CENTER + ct_c4k_care_level: FULL_TIME + ct_c4k_age_group: INFANT_TODDLER + ct_c4k_region: NORTH_CENTRAL + is_disabled: true + ct_c4k_provider_accredited: false + state_code: CT + output: + # 376 * 1.15 = 432.40 + ct_c4k_payment_rate: 432.40 + +- name: Case 7, center, full-time, preschool, accreditation bonus. + period: 2025-01 + absolute_error_margin: 0.01 + input: + ct_c4k_eligible_child: true + ct_c4k_provider_type: CENTER + ct_c4k_care_level: FULL_TIME + ct_c4k_age_group: PRE_SCHOOL + ct_c4k_region: SOUTH_CENTRAL + is_disabled: false + ct_c4k_provider_accredited: true + state_code: CT + output: + # 259 * 1.05 = 271.95 + ct_c4k_payment_rate: 271.95 + +- name: Case 8, center, full-time, infant/toddler, special needs AND accreditation. + period: 2025-01 + absolute_error_margin: 0.01 + input: + ct_c4k_eligible_child: true + ct_c4k_provider_type: CENTER + ct_c4k_care_level: FULL_TIME + ct_c4k_age_group: INFANT_TODDLER + ct_c4k_region: EASTERN + is_disabled: true + ct_c4k_provider_accredited: true + state_code: CT + output: + # 284 * (1 + 0.15 + 0.05) = 284 * 1.20 = 340.80 + ct_c4k_payment_rate: 340.80 + +- name: Case 9, recreational, full-time, preschool, Southwest. + period: 2025-01 + absolute_error_margin: 0.01 + input: + ct_c4k_eligible_child: true + ct_c4k_provider_type: RECREATIONAL + ct_c4k_care_level: FULL_TIME + ct_c4k_age_group: PRE_SCHOOL + ct_c4k_region: SOUTHWEST + is_disabled: false + ct_c4k_provider_accredited: false + state_code: CT + output: + ct_c4k_payment_rate: 301 + +- name: Case 10, relative, quarter-time, flat rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + ct_c4k_eligible_child: true + ct_c4k_provider_type: RELATIVE + ct_c4k_care_level: QUARTER_TIME + ct_c4k_age_group: SCHOOL_AGE + ct_c4k_region: SOUTHWEST + is_disabled: false + ct_c4k_provider_accredited: false + state_code: CT + output: + ct_c4k_payment_rate: 74 + +- name: Case 11, relative, half-time, flat rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + ct_c4k_eligible_child: true + ct_c4k_provider_type: RELATIVE + ct_c4k_care_level: HALF_TIME + ct_c4k_age_group: PRE_SCHOOL + ct_c4k_region: NORTH_CENTRAL + is_disabled: false + ct_c4k_provider_accredited: false + state_code: CT + output: + ct_c4k_payment_rate: 148 + +- name: Case 12, family, quarter-time, infant/toddler, Southwest. + period: 2025-01 + absolute_error_margin: 0.01 + input: + ct_c4k_eligible_child: true + ct_c4k_provider_type: FAMILY + ct_c4k_care_level: QUARTER_TIME + ct_c4k_age_group: INFANT_TODDLER + ct_c4k_region: SOUTHWEST + is_disabled: false + ct_c4k_provider_accredited: false + state_code: CT + output: + ct_c4k_payment_rate: 114 + +- name: Case 13, center, full-time plus, school-age, South Central. + period: 2025-01 + absolute_error_margin: 0.01 + input: + ct_c4k_eligible_child: true + ct_c4k_provider_type: CENTER + ct_c4k_care_level: FULL_TIME_PLUS + ct_c4k_age_group: SCHOOL_AGE + ct_c4k_region: SOUTH_CENTRAL + is_disabled: false + ct_c4k_provider_accredited: false + state_code: CT + output: + ct_c4k_payment_rate: 272 + +- name: Case 14, family, full-time plus, infant/toddler, Eastern. + period: 2025-01 + absolute_error_margin: 0.01 + input: + ct_c4k_eligible_child: true + ct_c4k_provider_type: FAMILY + ct_c4k_care_level: FULL_TIME_PLUS + ct_c4k_age_group: INFANT_TODDLER + ct_c4k_region: EASTERN + is_disabled: false + ct_c4k_provider_accredited: false + state_code: CT + output: + ct_c4k_payment_rate: 335 + +- name: Case 15, recreational, quarter-time, school-age, Eastern. + period: 2025-01 + absolute_error_margin: 0.01 + input: + ct_c4k_eligible_child: true + ct_c4k_provider_type: RECREATIONAL + ct_c4k_care_level: QUARTER_TIME + ct_c4k_age_group: SCHOOL_AGE + ct_c4k_region: EASTERN + is_disabled: false + ct_c4k_provider_accredited: false + state_code: CT + output: + ct_c4k_payment_rate: 54 + +- name: Case 16, family, full-time, special needs, accreditation, Northwest. + period: 2025-01 + absolute_error_margin: 0.01 + input: + ct_c4k_eligible_child: true + ct_c4k_provider_type: FAMILY + ct_c4k_care_level: FULL_TIME + ct_c4k_age_group: INFANT_TODDLER + ct_c4k_region: NORTHWEST + is_disabled: true + ct_c4k_provider_accredited: true + state_code: CT + output: + # 291 * (1 + 0.15 + 0.05) = 291 * 1.20 = 349.20 + ct_c4k_payment_rate: 349.20 + +- name: Case 17, relative, full-time, special needs only. + period: 2025-01 + absolute_error_margin: 0.01 + input: + ct_c4k_eligible_child: true + ct_c4k_provider_type: RELATIVE + ct_c4k_care_level: FULL_TIME + ct_c4k_age_group: INFANT_TODDLER + ct_c4k_region: EASTERN + is_disabled: true + ct_c4k_provider_accredited: false + state_code: CT + output: + # 245 * 1.15 = 281.75 + ct_c4k_payment_rate: 281.75 + +- name: Case 18, center, half-time, infant/toddler, Southwest. + period: 2025-01 + absolute_error_margin: 0.01 + input: + ct_c4k_eligible_child: true + ct_c4k_provider_type: CENTER + ct_c4k_care_level: HALF_TIME + ct_c4k_age_group: INFANT_TODDLER + ct_c4k_region: SOUTHWEST + is_disabled: false + ct_c4k_provider_accredited: false + state_code: CT + output: + ct_c4k_payment_rate: 317 + +- name: Case 19, center, full-time plus, infant/toddler, Southwest, highest rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + ct_c4k_eligible_child: true + ct_c4k_provider_type: CENTER + ct_c4k_care_level: FULL_TIME_PLUS + ct_c4k_age_group: INFANT_TODDLER + ct_c4k_region: SOUTHWEST + is_disabled: false + ct_c4k_provider_accredited: false + state_code: CT + output: + ct_c4k_payment_rate: 627 + +- name: Case 20, center, quarter-time, school-age, Eastern, lowest center rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + ct_c4k_eligible_child: true + ct_c4k_provider_type: CENTER + ct_c4k_care_level: QUARTER_TIME + ct_c4k_age_group: SCHOOL_AGE + ct_c4k_region: EASTERN + is_disabled: false + ct_c4k_provider_accredited: false + state_code: CT + output: + ct_c4k_payment_rate: 54 + +- name: Case 21, Jul 2025 rate period, center, full-time plus, infant/toddler, Eastern. + period: 2026-01 + absolute_error_margin: 0.01 + input: + ct_c4k_eligible_child: true + ct_c4k_provider_type: CENTER + ct_c4k_care_level: FULL_TIME_PLUS + ct_c4k_age_group: INFANT_TODDLER + ct_c4k_region: EASTERN + is_disabled: false + ct_c4k_provider_accredited: false + state_code: CT + output: + # Jul 2025 center FTP Eastern infant/toddler = $424 + ct_c4k_payment_rate: 424 + +- name: Case 22, pre-2025 rate period, center, full-time plus, infant/toddler, Eastern. + period: 2024-01 + absolute_error_margin: 0.01 + input: + ct_c4k_eligible_child: true + ct_c4k_provider_type: CENTER + ct_c4k_care_level: FULL_TIME_PLUS + ct_c4k_age_group: INFANT_TODDLER + ct_c4k_region: EASTERN + is_disabled: false + ct_c4k_provider_accredited: false + state_code: CT + output: + # Jan 2024 center FTP Eastern infant/toddler = $344 + ct_c4k_payment_rate: 344 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_region.yaml b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_region.yaml new file mode 100644 index 00000000000..d72d88020ac --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/ct_c4k_region.yaml @@ -0,0 +1,63 @@ +- name: Case 1, Fairfield County maps to Southwest. + period: 2025-01 + input: + state_code: CT + county_str: FAIRFIELD_COUNTY_CT + output: + ct_c4k_region: SOUTHWEST + +- name: Case 2, Hartford County maps to North Central. + period: 2025-01 + input: + state_code: CT + county_str: HARTFORD_COUNTY_CT + output: + ct_c4k_region: NORTH_CENTRAL + +- name: Case 3, Tolland County maps to North Central. + period: 2025-01 + input: + state_code: CT + county_str: TOLLAND_COUNTY_CT + output: + ct_c4k_region: NORTH_CENTRAL + +- name: Case 4, Litchfield County maps to Northwest. + period: 2025-01 + input: + state_code: CT + county_str: LITCHFIELD_COUNTY_CT + output: + ct_c4k_region: NORTHWEST + +- name: Case 5, Middlesex County maps to South Central. + period: 2025-01 + input: + state_code: CT + county_str: MIDDLESEX_COUNTY_CT + output: + ct_c4k_region: SOUTH_CENTRAL + +- name: Case 6, New Haven County maps to South Central. + period: 2025-01 + input: + state_code: CT + county_str: NEW_HAVEN_COUNTY_CT + output: + ct_c4k_region: SOUTH_CENTRAL + +- name: Case 7, New London County maps to Eastern. + period: 2025-01 + input: + state_code: CT + county_str: NEW_LONDON_COUNTY_CT + output: + ct_c4k_region: EASTERN + +- name: Case 8, Windham County maps to Eastern. + period: 2025-01 + input: + state_code: CT + county_str: WINDHAM_COUNTY_CT + output: + ct_c4k_region: EASTERN diff --git a/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/eligibility/ct_c4k_meets_activity_test.yaml b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/eligibility/ct_c4k_meets_activity_test.yaml new file mode 100644 index 00000000000..792567f0b85 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/eligibility/ct_c4k_meets_activity_test.yaml @@ -0,0 +1,119 @@ +- name: Case 1, employed parent with part-time job. + period: 2025-01 + input: + people: + person1: + age: 32 + employment_income: 36_000 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + output: + ct_c4k_meets_activity_test: true + +- name: Case 2, self-employed parent running home business. + period: 2025-01 + input: + people: + person1: + age: 35 + self_employment_income: 24_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + output: + ct_c4k_meets_activity_test: true + +- name: Case 3, teen parent attending high school. + period: 2025-01 + input: + people: + person1: + age: 17 + is_parent: true + is_in_k12_school: true + person2: + age: 1 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + output: + ct_c4k_meets_activity_test: true + +- name: Case 4, parent receiving TFA benefits. + period: 2025-01 + input: + people: + person1: + age: 28 + person2: + age: 3 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + output: + # No earned income, but TFA eligible (low income parent with child) + ct_c4k_meets_activity_test: true + +- name: Case 5, high-income parent with only unearned income and no activity. + period: 2025-01 + input: + people: + person1: + age: 45 + pension_income: 200_000 + person2: + age: 8 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + output: + # No employment, no self-employment, not TFA eligible (income too high), + # not a teen parent in school + ct_c4k_meets_activity_test: false + +- name: Case 6, parent age 20 in school exceeds teen parent age threshold. + period: 2025-01 + input: + people: + person1: + age: 20 + is_parent: true + is_in_k12_school: true + pension_income: 200_000 + person2: + age: 2 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + output: + # Age 20 is NOT < 20 threshold, no employment, high income prevents TFA + ct_c4k_meets_activity_test: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/integration.yaml new file mode 100644 index 00000000000..48863f0c3b7 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ct/oec/c4k/integration.yaml @@ -0,0 +1,562 @@ +- name: Case 1, low-income single parent, center care, Eastern. + period: 2025-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 28 + employment_income: 30_000 + is_enrolled_in_ccdf: false + person2: + age: 3 + is_tax_unit_dependent: true + childcare_hours_per_week: 40 + ct_c4k_provider_type: CENTER + ct_c4k_provider_accredited: false + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 15_000 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + county_str: NEW_LONDON_COUNTY_CT + output: + ct_c4k_eligible_child: [false, true] + ct_c4k_region: EASTERN + ct_c4k_age_group: [SCHOOL_AGE, PRE_SCHOOL] + ct_c4k_care_level: [QUARTER_TIME, FULL_TIME] + # Monthly countable: 30,000 / 12 = 2,500 + ct_c4k_countable_income: 2_500 + ct_c4k_income_eligible: true + ct_c4k_eligible: true + # Jan 2025 center FT Eastern preschool = $228/week + ct_c4k_payment_rate: [0, 228] + # SMI ratio: 2,500 / 8,265 = 0.302 => 20%-40% bracket => 3% + # Monthly fee: 2,500 * 0.03 = 75 + ct_c4k_family_fee: 75 + # Monthly approved: 228 * 52/12 = 988 + # Monthly expenses: 15,000/12 = 1,250 + # Capped: min(988, 1,250) = 988 + # Subsidy: max(988 - 75, 0) = 913 + ct_c4k: 913 + +- name: Case 2, moderate-income continuing recipient, family care, Southwest. + period: 2025-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 35 + employment_income: 60_000 + is_enrolled_in_ccdf: true + person2: + age: 1 + is_tax_unit_dependent: true + childcare_hours_per_week: 45 + ct_c4k_provider_type: FAMILY + ct_c4k_provider_accredited: false + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 22_000 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + county_str: FAIRFIELD_COUNTY_CT + output: + ct_c4k_eligible_child: [false, true] + ct_c4k_region: SOUTHWEST + ct_c4k_age_group: [SCHOOL_AGE, INFANT_TODDLER] + ct_c4k_care_level: [QUARTER_TIME, FULL_TIME] + # Continuing: 85% of 99,180 = 84,303; 60,000 < 84,303 => eligible + ct_c4k_income_eligible: true + ct_c4k_eligible: true + # Jan 2025 family FT Southwest infant/toddler = $333 + ct_c4k_payment_rate: [0, 333] + # SMI ratio: 5,000 / 8,265 = 0.605 => 60%+ bracket => 7% + # Monthly fee: 5,000 * 0.07 = 350 + ct_c4k_family_fee: 350 + # Monthly approved: 333 * 52/12 = 1,443 + # Monthly expenses: 22,000/12 = 1,833 + # Capped: min(1,443, 1,833) = 1,443 + # Subsidy: max(1,443 - 350, 0) = 1,093 + ct_c4k: 1_093 + +- name: Case 3, two children, special needs, center care, North Central. + period: 2025-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 32 + employment_income: 36_000 + is_enrolled_in_ccdf: false + person2: + age: 2 + is_tax_unit_dependent: true + is_disabled: true + childcare_hours_per_week: 50 + ct_c4k_provider_type: CENTER + ct_c4k_provider_accredited: false + person3: + age: 7 + is_tax_unit_dependent: true + childcare_hours_per_week: 20 + ct_c4k_provider_type: CENTER + ct_c4k_provider_accredited: false + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_pre_subsidy_childcare_expenses: 25_000 + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: CT + county_str: HARTFORD_COUNTY_CT + output: + ct_c4k_eligible_child: [false, true, true] + ct_c4k_region: NORTH_CENTRAL + ct_c4k_age_group: [SCHOOL_AGE, INFANT_TODDLER, SCHOOL_AGE] + ct_c4k_care_level: [QUARTER_TIME, FULL_TIME, HALF_TIME] + ct_c4k_countable_income: 3_000 + ct_c4k_income_eligible: true + ct_c4k_eligible: true + # person2: center FT NC infant/toddler $376 * 1.15 (special needs) = $432.40 + # person3: center HT NC school-age = $117 + ct_c4k_payment_rate: [0, 432.4, 117] + # SMI ratio: 3,000 / 10,210 = 0.294 => 20%-40% => 3% + # Monthly fee: 3,000 * 0.03 = 90 + ct_c4k_family_fee: 90 + # Monthly approved: (432.40 + 117) * 52/12 = 2,381.07 + # Monthly expenses: 25,000/12 = 2,083.33 + # Capped: min(2,381.07, 2,083.33) = 2,083.33 + # Subsidy: max(2,083.33 - 90, 0) = 1,993.33 + ct_c4k: 1_993.33 + +- name: Case 4, new applicant income above 60% SMI, ineligible. + period: 2025-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 40 + employment_income: 80_000 + is_enrolled_in_ccdf: false + person2: + age: 4 + is_tax_unit_dependent: true + childcare_hours_per_week: 40 + ct_c4k_provider_type: CENTER + ct_c4k_provider_accredited: false + spm_units: + spm_unit: + members: [person1, person2] + ct_tfa_eligible: false + spm_unit_pre_subsidy_childcare_expenses: 18_000 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + county_str: MIDDLESEX_COUNTY_CT + output: + # 60% of 99,180 = 59,508; 80,000 > 59,508 => ineligible + ct_c4k_income_eligible: false + ct_c4k_eligible: false + ct_c4k: 0 + +- name: Case 5, unlicensed relative care, low income, fee waived. + period: 2025-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 25 + employment_income: 18_000 + is_enrolled_in_ccdf: false + person2: + age: 6 + is_tax_unit_dependent: true + childcare_hours_per_week: 35 + ct_c4k_provider_type: RELATIVE + ct_c4k_provider_accredited: false + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 12_000 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + county_str: WINDHAM_COUNTY_CT + output: + ct_c4k_eligible_child: [false, true] + ct_c4k_region: EASTERN + ct_c4k_care_level: [QUARTER_TIME, FULL_TIME] + ct_c4k_countable_income: 1_500 + ct_c4k_income_eligible: true + ct_c4k_eligible: true + # Relative FT flat: $245/week + ct_c4k_payment_rate: [0, 245] + # SMI ratio: 1,500 / 8,265 = 0.181 => <20% => 0% + ct_c4k_family_fee: 0 + # Monthly approved: 245 * 52/12 = 1,062 + # Monthly expenses: 12,000/12 = 1,000 + # Capped: min(1,062, 1,000) = 1,000 + # Subsidy: max(1,000 - 0, 0) = 1,000 + ct_c4k: 1_000 + +- name: Case 6, accredited provider, moderate income, two-parent family. + period: 2025-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 33 + employment_income: 30_000 + is_enrolled_in_ccdf: false + person2: + age: 31 + employment_income: 20_000 + person3: + age: 1 + is_tax_unit_dependent: true + childcare_hours_per_week: 55 + ct_c4k_provider_type: CENTER + ct_c4k_provider_accredited: true + spm_units: + spm_unit: + members: [person1, person2, person3] + + spm_unit_pre_subsidy_childcare_expenses: 30_000 + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: CT + county_str: NEW_HAVEN_COUNTY_CT + output: + ct_c4k_eligible_child: [false, false, true] + ct_c4k_region: SOUTH_CENTRAL + ct_c4k_care_level: [QUARTER_TIME, QUARTER_TIME, FULL_TIME_PLUS] + # (30,000 + 20,000) / 12 = 4,166.67 + ct_c4k_countable_income: 4_166.67 + ct_c4k_income_eligible: true + ct_c4k_eligible: true + # Center FTP South Central infant/toddler = $495 * 1.05 = $519.75 + ct_c4k_payment_rate: [0, 0, 519.75] + # SMI ratio: 4,166.67 / 10,210 = 0.408 => 40%-60% => 5% + # Monthly fee: 4,166.67 * 0.05 = 208.33 + ct_c4k_family_fee: 208.33 + # Monthly approved: 519.75 * 52/12 = 2,252.25 + # Monthly expenses: 30,000/12 = 2,500 + # Capped: min(2,252.25, 2,500) = 2,252.25 + # Subsidy: max(2,252.25 - 208.33, 0) = 2,043.92 + ct_c4k: 2_043.92 + +- name: Case 7, continuing recipient between initial and continuing thresholds. + period: 2025-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 29 + employment_income: 72_000 + is_enrolled_in_ccdf: true + person2: + age: 4 + is_tax_unit_dependent: true + childcare_hours_per_week: 40 + ct_c4k_provider_type: FAMILY + ct_c4k_provider_accredited: false + person3: + age: 8 + is_tax_unit_dependent: true + childcare_hours_per_week: 15 + ct_c4k_provider_type: FAMILY + ct_c4k_provider_accredited: false + spm_units: + spm_unit: + members: [person1, person2, person3] + + spm_unit_pre_subsidy_childcare_expenses: 20_000 + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: CT + county_str: LITCHFIELD_COUNTY_CT + output: + ct_c4k_eligible_child: [false, true, true] + ct_c4k_region: NORTHWEST + ct_c4k_age_group: [SCHOOL_AGE, PRE_SCHOOL, SCHOOL_AGE] + ct_c4k_care_level: [QUARTER_TIME, FULL_TIME, QUARTER_TIME] + ct_c4k_countable_income: 6_000 + # Continuing: 85% of monthly SMI 10,210 = 8,678; 6,000 < 8,678 => eligible + ct_c4k_income_eligible: true + ct_c4k_eligible: true + # person2: family FT Northwest preschool = $228 + # person3: family QT Northwest school-age = $68 + ct_c4k_payment_rate: [0, 228, 68] + # SMI ratio: 6,000 / 10,210 = 0.588 => 40%-60% => 5% + # Monthly fee: 6,000 * 0.05 = 300 + ct_c4k_family_fee: 300 + # Monthly approved: (228 + 68) * 52/12 = 1,282.67 + # Monthly expenses: 20,000/12 = 1,666.67 + # Capped: min(1,282.67, 1,666.67) = 1,282.67 + # Subsidy: max(1,282.67 - 300, 0) = 982.67 + ct_c4k: 982.67 + +- name: Case 8, special needs child with accredited provider, highest rate region. + period: 2025-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 28 + employment_income: 24_000 + is_enrolled_in_ccdf: false + person2: + age: 1 + is_tax_unit_dependent: true + is_disabled: true + childcare_hours_per_week: 55 + ct_c4k_provider_type: CENTER + ct_c4k_provider_accredited: true + spm_units: + spm_unit: + members: [person1, person2] + + spm_unit_pre_subsidy_childcare_expenses: 50_000 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + county_str: FAIRFIELD_COUNTY_CT + output: + ct_c4k_eligible_child: [false, true] + ct_c4k_region: SOUTHWEST + ct_c4k_age_group: [SCHOOL_AGE, INFANT_TODDLER] + ct_c4k_care_level: [QUARTER_TIME, FULL_TIME_PLUS] + ct_c4k_countable_income: 2_000 + ct_c4k_income_eligible: true + ct_c4k_eligible: true + # Center FTP SW infant/toddler $627 * (1+0.15+0.05) = $627 * 1.20 = $752.40 + ct_c4k_payment_rate: [0, 752.4] + # SMI ratio: 2,000 / 8,265 = 0.242 => 20%-40% => 3% + # Monthly fee: 2,000 * 0.03 = 60 + ct_c4k_family_fee: 60 + # Monthly approved: 752.40 * 52/12 = 3,260.40 + # Monthly expenses: 50,000/12 = 4,166.67 + # Capped: min(3,260.40, 4,166.67) = 3,260.40 + # Subsidy: max(3,260.40 - 60, 0) = 3,200.40 + ct_c4k: 3_200.40 + +- name: Case 9, zero income family, fee waived, full subsidy. + period: 2025-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 22 + is_enrolled_in_ccdf: false + person2: + age: 2 + is_tax_unit_dependent: true + childcare_hours_per_week: 40 + ct_c4k_provider_type: RELATIVE + ct_c4k_provider_accredited: false + spm_units: + spm_unit: + members: [person1, person2] + + spm_unit_pre_subsidy_childcare_expenses: 10_000 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + county_str: HARTFORD_COUNTY_CT + output: + ct_c4k_eligible_child: [false, true] + ct_c4k_region: NORTH_CENTRAL + ct_c4k_care_level: [QUARTER_TIME, FULL_TIME] + ct_c4k_countable_income: 0 + ct_c4k_income_eligible: true + ct_c4k_eligible: true + # Relative FT flat: $245/week + ct_c4k_payment_rate: [0, 245] + ct_c4k_family_fee: 0 + # Monthly approved: 245 * 52/12 = 1,061.67 + # Monthly expenses: 10,000/12 = 833.33 + # Capped: min(1,061.67, 833.33) = 833.33 + # Subsidy: max(833.33 - 0, 0) = 833.33 + ct_c4k: 833.33 + +- name: Case 10, TFA-eligible parent with only unearned income, fee waived. + period: 2025-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + social_security: 9_600 + is_enrolled_in_ccdf: false + person2: + age: 4 + is_tax_unit_dependent: true + childcare_hours_per_week: 20 + ct_c4k_provider_type: CENTER + ct_c4k_provider_accredited: false + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 8_000 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + county_str: MIDDLESEX_COUNTY_CT + output: + ct_c4k_eligible_child: [false, true] + ct_c4k_region: SOUTH_CENTRAL + ct_c4k_care_level: [QUARTER_TIME, HALF_TIME] + # Monthly countable: 9,600 / 12 = 800 + ct_c4k_countable_income: 800 + ct_c4k_income_eligible: true + # TFA eligible (low unearned income) => passes activity test + ct_c4k_eligible: true + # Center HT South Central preschool = $176/week (2024-07-01 rate) + ct_c4k_payment_rate: [0, 176] + # No earned income => fee waived + ct_c4k_family_fee: 0 + # Monthly approved: 176 * 52/12 = 762.67 + # Monthly expenses: 8,000/12 = 666.67 + # Capped: min(762.67, 666.67) = 666.67 + # Subsidy: max(666.67 - 0, 0) = 666.67 + ct_c4k: 666.67 + +- name: Case 11, fee exceeds approved cost, subsidy reduced. + period: 2025-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 35 + employment_income: 55_000 + is_enrolled_in_ccdf: true + person2: + age: 10 + is_tax_unit_dependent: true + childcare_hours_per_week: 5 + ct_c4k_provider_type: RELATIVE + ct_c4k_provider_accredited: false + spm_units: + spm_unit: + members: [person1, person2] + + spm_unit_pre_subsidy_childcare_expenses: 5_000 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + county_str: NEW_HAVEN_COUNTY_CT + output: + ct_c4k_eligible_child: [false, true] + ct_c4k_region: SOUTH_CENTRAL + ct_c4k_care_level: [QUARTER_TIME, QUARTER_TIME] + # 55,000 / 12 = 4,583.33 + ct_c4k_countable_income: 4_583.33 + # Continuing: 85% of monthly SMI 8,265 = 7,025; 4,583.33 < 7,025 + ct_c4k_income_eligible: true + ct_c4k_eligible: true + # Relative QT flat: $74/week + ct_c4k_payment_rate: [0, 74] + # SMI ratio: 4,583.33 / 8,265 = 0.555 => 40%-60% => 5% + # Monthly fee: 4,583.33 * 0.05 = 229.17 + ct_c4k_family_fee: 229.17 + # Monthly approved: 74 * 52/12 = 320.67 + # Monthly expenses: 5,000/12 = 416.67 + # Capped: min(320.67, 416.67) = 320.67 + # Subsidy: max(320.67 - 229.17, 0) = 91.50 + ct_c4k: 91.50 + +- name: Case 12, disabled child age 16, special needs eligibility. + period: 2025-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 40 + employment_income: 30_000 + is_enrolled_in_ccdf: false + person2: + age: 16 + is_tax_unit_dependent: true + is_disabled: true + childcare_hours_per_week: 35 + ct_c4k_provider_type: FAMILY + ct_c4k_provider_accredited: false + spm_units: + spm_unit: + members: [person1, person2] + + spm_unit_pre_subsidy_childcare_expenses: 15_000 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + county_str: WINDHAM_COUNTY_CT + output: + # age 16 < 19 (special needs) & disabled => eligible + ct_c4k_eligible_child: [false, true] + ct_c4k_region: EASTERN + ct_c4k_care_level: [QUARTER_TIME, FULL_TIME] + ct_c4k_countable_income: 2_500 + ct_c4k_income_eligible: true + ct_c4k_eligible: true + # Family FT Eastern school-age = $183 * 1.15 = $210.45 + ct_c4k_payment_rate: [0, 210.45] + # SMI ratio: 2,500 / 8,265 = 0.302 => 20%-40% => 3% + # Monthly fee: 2,500 * 0.03 = 75 + ct_c4k_family_fee: 75 + # Monthly approved: 210.45 * 52/12 = 911.95 + # Monthly expenses: 15,000/12 = 1,250 + # Capped: min(911.95, 1,250) = 911.95 + # Subsidy: max(911.95 - 75, 0) = 836.95 + ct_c4k: 836.95 diff --git a/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k.py b/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k.py new file mode 100644 index 00000000000..6ca9a6242a5 --- /dev/null +++ b/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class ct_c4k(Variable): + value_type = float + entity = SPMUnit + unit = USD + definition_period = MONTH + defined_for = "ct_c4k_eligible" + label = "Connecticut Care 4 Kids subsidy amount" + reference = ( + "https://eregulations.ct.gov/eRegsPortal/Browse/RCSA/Title_17bSubtitle_17b-749Section_17b-749-13/", + "https://www.ctoec.org/care-4-kids/c4k-providers/c4k-rates/", + ) + + def formula(spm_unit, period, parameters): + weekly_rate_total = add(spm_unit, period, ["ct_c4k_payment_rate"]) + monthly_approved_cost = weekly_rate_total * WEEKS_IN_YEAR / MONTHS_IN_YEAR + + actual_expenses = spm_unit("spm_unit_pre_subsidy_childcare_expenses", period) + capped_cost = min_(monthly_approved_cost, actual_expenses) + + family_fee = spm_unit("ct_c4k_family_fee", period) + return max_(capped_cost - family_fee, 0) diff --git a/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_age_group.py b/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_age_group.py new file mode 100644 index 00000000000..ddac9311a2c --- /dev/null +++ b/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_age_group.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class CTC4KAgeGroup(Enum): + INFANT_TODDLER = "Infant/Toddler" + PRE_SCHOOL = "Pre-School" + SCHOOL_AGE = "School-Age" + + +class ct_c4k_age_group(Variable): + value_type = Enum + entity = Person + possible_values = CTC4KAgeGroup + default_value = CTC4KAgeGroup.SCHOOL_AGE + definition_period = MONTH + defined_for = StateCode.CT + label = "Connecticut Care 4 Kids age group" + reference = "https://www.ctoec.org/care-4-kids/c4k-providers/c4k-rates/" + + def formula(person, period, parameters): + age = person("age", period.this_year) + p = parameters(period).gov.states.ct.oec.c4k.age_threshold.age_group + return p.calc(age) diff --git a/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_care_level.py b/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_care_level.py new file mode 100644 index 00000000000..f87cd8ab089 --- /dev/null +++ b/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_care_level.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class CTC4KCareLevel(Enum): + FULL_TIME_PLUS = "Full-Time Plus (51-65 hrs/wk)" + FULL_TIME = "Full-Time (35-50 hrs/wk)" + HALF_TIME = "Half-Time (16-34 hrs/wk)" + QUARTER_TIME = "Quarter-Time (1-15 hrs/wk)" + + +class ct_c4k_care_level(Variable): + value_type = Enum + entity = Person + possible_values = CTC4KCareLevel + default_value = CTC4KCareLevel.FULL_TIME + definition_period = MONTH + defined_for = StateCode.CT + label = "Connecticut Care 4 Kids care level" + reference = "https://www.ctoec.org/care-4-kids/c4k-providers/c4k-rates/" + + def formula(person, period, parameters): + hours = person("childcare_hours_per_week", period.this_year) + p = parameters(period).gov.states.ct.oec.c4k.care_level + return p.calc(hours) diff --git a/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_countable_income.py b/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_countable_income.py new file mode 100644 index 00000000000..18dc96c92b5 --- /dev/null +++ b/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_countable_income.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class ct_c4k_countable_income(Variable): + value_type = float + entity = SPMUnit + unit = USD + definition_period = MONTH + defined_for = StateCode.CT + label = "Connecticut Care 4 Kids countable income" + reference = "https://eregulations.ct.gov/eRegsPortal/Browse/RCSA/Title_17bSubtitle_17b-749Section_17b-749-05/" + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ct.oec.c4k.income + income = add(spm_unit, period, p.sources) + deductions = add(spm_unit, period, p.deductions) + return max_(income - deductions, 0) diff --git a/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_family_fee.py b/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_family_fee.py new file mode 100644 index 00000000000..6ed363bcfae --- /dev/null +++ b/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_family_fee.py @@ -0,0 +1,35 @@ +from policyengine_us.model_api import * + + +class ct_c4k_family_fee(Variable): + value_type = float + entity = SPMUnit + unit = USD + definition_period = MONTH + defined_for = StateCode.CT + label = "Connecticut Care 4 Kids family fee" + reference = ( + "https://eregulations.ct.gov/eRegsPortal/Browse/RCSA/Title_17bSubtitle_17b-749Section_17b-749-13/", + "https://www.ctoec.org/care-4-kids/c4k-policies/", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ct.oec.c4k.family_fee + countable_income = spm_unit("ct_c4k_countable_income", period) + smi = spm_unit("hhs_smi", period) + mask = smi > 0 + smi_ratio = np.divide( + countable_income, + smi, + out=np.zeros_like(countable_income), + where=mask, + ) + fee_rate = p.rate.calc(smi_ratio) + + earned_income = add( + spm_unit, + period, + ["employment_income", "self_employment_income", "farm_income"], + ) + has_earned_income = earned_income > 0 + return where(has_earned_income, countable_income * fee_rate, 0) diff --git a/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_payment_rate.py b/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_payment_rate.py new file mode 100644 index 00000000000..09112b6baac --- /dev/null +++ b/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_payment_rate.py @@ -0,0 +1,41 @@ +from policyengine_us.model_api import * + + +class ct_c4k_payment_rate(Variable): + value_type = float + entity = Person + unit = USD + definition_period = MONTH + defined_for = "ct_c4k_eligible_child" + label = "Connecticut Care 4 Kids weekly payment rate per child" + reference = "https://www.ctoec.org/care-4-kids/c4k-providers/c4k-rates/" + + def formula(person, period, parameters): + p = parameters(period).gov.states.ct.oec.c4k + provider_type = person("ct_c4k_provider_type", period) + types = provider_type.possible_values + care_level = person("ct_c4k_care_level", period) + region = person.household("ct_c4k_region", period) + age_group = person("ct_c4k_age_group", period) + + weekly_rate = select( + [ + provider_type == types.CENTER, + provider_type == types.FAMILY, + provider_type == types.RELATIVE, + provider_type == types.RECREATIONAL, + ], + [ + p.rate.center[care_level][region][age_group], + p.rate.family[care_level][region][age_group], + p.rate.relative[care_level][region][age_group], + p.rate.recreational[care_level][region][age_group], + ], + default=p.rate.center[care_level][region][age_group], + ) + + is_disabled = person("is_disabled", period.this_year) + special_needs_add = where(is_disabled, p.special_needs_supplement, 0) + is_accredited = person("ct_c4k_provider_accredited", period) + accreditation_add = where(is_accredited, p.accreditation_bonus, 0) + return weekly_rate * (1 + special_needs_add + accreditation_add) diff --git a/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_provider_accredited.py b/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_provider_accredited.py new file mode 100644 index 00000000000..5385c30a4e1 --- /dev/null +++ b/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_provider_accredited.py @@ -0,0 +1,13 @@ +from policyengine_us.model_api import * + + +class ct_c4k_provider_accredited(Variable): + value_type = bool + entity = Person + definition_period = MONTH + defined_for = StateCode.CT + label = "Whether the child's Care 4 Kids provider is accredited" + reference = ( + "https://eregulations.ct.gov/eRegsPortal/Browse/RCSA/Title_17bSubtitle_17b-749Section_17b-749-13/", + "https://www.cga.ct.gov/2020/rpt/pdf/2020-R-0274.pdf#page=1", + ) diff --git a/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_provider_type.py b/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_provider_type.py new file mode 100644 index 00000000000..6b2803ea7ad --- /dev/null +++ b/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_provider_type.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class CTC4KProviderType(Enum): + CENTER = "Centers/Group Homes/School Programs" + FAMILY = "Licensed Family Child Care Homes" + RELATIVE = "Unlicensed Relative Care" + RECREATIONAL = "Recreational Programs (Summer)" + + +class ct_c4k_provider_type(Variable): + value_type = Enum + entity = Person + possible_values = CTC4KProviderType + default_value = CTC4KProviderType.CENTER + definition_period = MONTH + defined_for = StateCode.CT + label = "Connecticut Care 4 Kids provider type" + reference = "https://www.ctoec.org/care-4-kids/c4k-providers/c4k-rates/" diff --git a/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_region.py b/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_region.py new file mode 100644 index 00000000000..81f156d24a4 --- /dev/null +++ b/policyengine_us/variables/gov/states/ct/oec/c4k/ct_c4k_region.py @@ -0,0 +1,41 @@ +from policyengine_us.model_api import * + + +class CTC4KRegion(Enum): + EASTERN = "Eastern" + NORTH_CENTRAL = "North Central" + NORTHWEST = "Northwest" + SOUTH_CENTRAL = "South Central" + SOUTHWEST = "Southwest" + + +class ct_c4k_region(Variable): + value_type = Enum + entity = Household + possible_values = CTC4KRegion + default_value = CTC4KRegion.NORTH_CENTRAL + definition_period = MONTH + defined_for = StateCode.CT + label = "Connecticut Care 4 Kids geographic region" + reference = "https://www.ctoec.org/care-4-kids/c4k-providers/c4k-rates/" + + def formula(household, period, parameters): + # NOTE: Uses county approximation; CT C4K regions are town-based. + county = household("county_str", period) + p = parameters(period).gov.states.ct.oec.c4k.region + + eastern = np.isin(county, p.eastern) + northwest = np.isin(county, p.northwest) + south_central = np.isin(county, p.south_central) + southwest = np.isin(county, p.southwest) + + return select( + [eastern, northwest, south_central, southwest], + [ + CTC4KRegion.EASTERN, + CTC4KRegion.NORTHWEST, + CTC4KRegion.SOUTH_CENTRAL, + CTC4KRegion.SOUTHWEST, + ], + default=CTC4KRegion.NORTH_CENTRAL, + ) diff --git a/policyengine_us/variables/gov/states/ct/oec/c4k/ct_child_care_subsidies.py b/policyengine_us/variables/gov/states/ct/oec/c4k/ct_child_care_subsidies.py new file mode 100644 index 00000000000..14290eb3c85 --- /dev/null +++ b/policyengine_us/variables/gov/states/ct/oec/c4k/ct_child_care_subsidies.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class ct_child_care_subsidies(Variable): + value_type = float + entity = SPMUnit + label = "Connecticut child care subsidies" + unit = USD + definition_period = YEAR + defined_for = StateCode.CT + adds = ["ct_c4k"] diff --git a/policyengine_us/variables/gov/states/ct/oec/c4k/eligibility/ct_c4k_eligible.py b/policyengine_us/variables/gov/states/ct/oec/c4k/eligibility/ct_c4k_eligible.py new file mode 100644 index 00000000000..776643f244a --- /dev/null +++ b/policyengine_us/variables/gov/states/ct/oec/c4k/eligibility/ct_c4k_eligible.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class ct_c4k_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = MONTH + defined_for = StateCode.CT + label = "Eligible for Connecticut Care 4 Kids" + reference = "https://eregulations.ct.gov/eRegsPortal/Browse/RCSA/Title_17bSubtitle_17b-749Section_17b-749-04/" + + def formula(spm_unit, period, parameters): + has_eligible_child = add(spm_unit, period, ["ct_c4k_eligible_child"]) > 0 + income_eligible = spm_unit("ct_c4k_income_eligible", period) + asset_eligible = spm_unit("is_ccdf_asset_eligible", period.this_year) + activity_eligible = spm_unit("ct_c4k_meets_activity_test", period) + + regular_eligible = ( + has_eligible_child & income_eligible & asset_eligible & activity_eligible + ) + tfa_eligible = spm_unit("ct_tfa_eligible", period) + return regular_eligible | tfa_eligible diff --git a/policyengine_us/variables/gov/states/ct/oec/c4k/eligibility/ct_c4k_eligible_child.py b/policyengine_us/variables/gov/states/ct/oec/c4k/eligibility/ct_c4k_eligible_child.py new file mode 100644 index 00000000000..790f4561011 --- /dev/null +++ b/policyengine_us/variables/gov/states/ct/oec/c4k/eligibility/ct_c4k_eligible_child.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class ct_c4k_eligible_child(Variable): + value_type = bool + entity = Person + definition_period = MONTH + defined_for = StateCode.CT + label = "Eligible child for Connecticut Care 4 Kids" + reference = ( + "https://eregulations.ct.gov/eRegsPortal/Browse/RCSA/Title_17bSubtitle_17b-749Section_17b-749-04/", + "https://www.cga.ct.gov/2020/rpt/pdf/2020-R-0274.pdf#page=1", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.ct.oec.c4k.age_threshold + age = person("age", period.this_year) + is_disabled = person("is_disabled", period.this_year) + age_limit = where(is_disabled, p.special_needs_child, p.child) + age_eligible = age < age_limit + is_dependent = person("is_tax_unit_dependent", period.this_year) + immigration_eligible = person( + "is_ccdf_immigration_eligible_child", period.this_year + ) + return age_eligible & is_dependent & immigration_eligible diff --git a/policyengine_us/variables/gov/states/ct/oec/c4k/eligibility/ct_c4k_income_eligible.py b/policyengine_us/variables/gov/states/ct/oec/c4k/eligibility/ct_c4k_income_eligible.py new file mode 100644 index 00000000000..3fc02975b38 --- /dev/null +++ b/policyengine_us/variables/gov/states/ct/oec/c4k/eligibility/ct_c4k_income_eligible.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class ct_c4k_income_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = MONTH + defined_for = StateCode.CT + label = "Income eligible for Connecticut Care 4 Kids" + reference = ( + "https://eregulations.ct.gov/eRegsPortal/Browse/RCSA/Title_17bSubtitle_17b-749Section_17b-749-05/", + "https://www.cga.ct.gov/2023/rpt/pdf/2023-R-0249.pdf#page=3", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ct.oec.c4k.income + countable_income = spm_unit("ct_c4k_countable_income", period) + smi = spm_unit("hhs_smi", period) + is_enrolled = add(spm_unit, period.this_year, ["is_enrolled_in_ccdf"]) > 0 + smi_limit = where( + is_enrolled, + p.continuing_limit_smi, + p.initial_limit_smi, + ) + return countable_income < smi * smi_limit diff --git a/policyengine_us/variables/gov/states/ct/oec/c4k/eligibility/ct_c4k_meets_activity_test.py b/policyengine_us/variables/gov/states/ct/oec/c4k/eligibility/ct_c4k_meets_activity_test.py new file mode 100644 index 00000000000..7c2588ad671 --- /dev/null +++ b/policyengine_us/variables/gov/states/ct/oec/c4k/eligibility/ct_c4k_meets_activity_test.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class ct_c4k_meets_activity_test(Variable): + value_type = bool + entity = SPMUnit + definition_period = MONTH + defined_for = StateCode.CT + label = "Meets Connecticut Care 4 Kids activity test" + reference = "https://eregulations.ct.gov/eRegsPortal/Browse/RCSA/Title_17bSubtitle_17b-749Section_17b-749-04/" + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ct.oec.c4k.age_threshold + person = spm_unit.members + employed = spm_unit.any(person("employment_income", period) > 0) + self_employed = spm_unit.any(person("self_employment_income", period) > 0) + in_tfa = spm_unit("ct_tfa_eligible", period) + teen_parent_in_school = spm_unit.any( + person("is_parent", period.this_year) + & person("is_in_k12_school", period.this_year) + & (person("age", period.this_year) < p.teen_parent) + ) + return employed | self_employed | in_tfa | teen_parent_in_school