diff --git a/changelog.d/vt-ccap.added.md b/changelog.d/vt-ccap.added.md new file mode 100644 index 00000000000..1c4693d2f19 --- /dev/null +++ b/changelog.d/vt-ccap.added.md @@ -0,0 +1 @@ +Add Vermont Child Care Financial Assistance Program (CCFAP). 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..2bfee7fa682 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 @@ -5,6 +5,7 @@ values: - co_child_care_subsidies # Colorado Child Care Assistance Program - ma_child_care_subsidies # Massachusetts Child Care Financial Assistance - ne_child_care_subsidies # Nebraska Child Care Subsidy + - vt_child_care_subsidies # Vermont Child Care Financial Assistance Program metadata: unit: list diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/months.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/months.yaml new file mode 100644 index 00000000000..c2977ba5b98 --- /dev/null +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/months.yaml @@ -0,0 +1,32 @@ +description: Vermont sets these age thresholds in months for child care age group classification under the Child Care Financial Assistance Program. + +brackets: + - threshold: + 2009-02-09: 0 + amount: + 2009-02-09: 0 # INFANT + - threshold: + 2009-02-09: 24 + amount: + 2009-02-09: 1 # TODDLER + - threshold: + 2009-02-09: 36 + amount: + 2009-02-09: 2 # PRESCHOOL + - threshold: + 2009-02-09: 60 + 2025-07-13: 72 + amount: + 2009-02-09: 3 # SCHOOL_AGE + +metadata: + type: single_amount + threshold_unit: month + amount_unit: /1 + period: year + label: Vermont CCFAP age group month thresholds + reference: + - title: CCFAP Regulations Section I B 1 + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=3 + - title: CCFAP Capped State Rates Important Definitions (July 13, 2025) + href: https://outside.vermont.gov/dept/DCF/Policies%20Procedures%20Guidance/CDD-Guidance-CCFAP-Capped-Rates.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_threshold/base.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_threshold/base.yaml new file mode 100644 index 00000000000..4ef3ada184a --- /dev/null +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_threshold/base.yaml @@ -0,0 +1,13 @@ +description: Vermont limits the Child Care Financial Assistance Program to children younger than this age. +values: + 2009-02-09: 13 + +metadata: + unit: year + period: year + label: Vermont CCFAP child age threshold + reference: + - title: CCFAP Regulations Section I B 6 + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=4 + - title: 33 V.S.A. § 3512 + href: https://legislature.vermont.gov/statutes/section/33/035/03512 diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_threshold/special_needs.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_threshold/special_needs.yaml new file mode 100644 index 00000000000..5ac5c6b306a --- /dev/null +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_threshold/special_needs.yaml @@ -0,0 +1,13 @@ +description: Vermont limits the Child Care Financial Assistance Program to children with special needs younger than this age. +values: + 2009-02-09: 19 + +metadata: + unit: year + period: year + label: Vermont CCFAP special needs child age threshold + reference: + - title: CCFAP Regulations Section I B 6 + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=4 + - title: 33 V.S.A. § 3512 + href: https://legislature.vermont.gov/statutes/section/33/035/03512 diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/hours.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/hours.yaml new file mode 100644 index 00000000000..3d50c3979e0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/hours.yaml @@ -0,0 +1,27 @@ +description: Vermont sets these weekly hour thresholds for child care schedule classification under the Child Care Financial Assistance Program. + +brackets: + - threshold: + 2009-02-09: 0 + amount: + 2009-02-09: 0 # PART_TIME + - threshold: + 2009-02-09: 25.0001 # Above 25 hours + amount: + 2009-02-09: 1 # FULL_TIME + - threshold: + 2009-02-09: 50.0001 # Above 50 hours + amount: + 2009-02-09: 2 # EXTENDED_CARE + +metadata: + type: single_amount + threshold_unit: hour + amount_unit: /1 + period: year + label: Vermont CCFAP care schedule hour thresholds + reference: + - title: CCFAP Regulations Section I B 3 + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=4 + - title: CCFAP Capped State Rates Important Definitions (July 13, 2025) + href: https://outside.vermont.gov/dept/DCF/Policies%20Procedures%20Guidance/CDD-Guidance-CCFAP-Capped-Rates.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/family_share/scale.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/family_share/scale.yaml new file mode 100644 index 00000000000..40de5718dc9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/family_share/scale.yaml @@ -0,0 +1,99 @@ +description: Vermont sets this amount as the weekly family share based on income as a share of the federal poverty guideline under the Child Care Financial Assistance Program. + +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + period: week + label: Vermont CCFAP weekly family share scale + reference: + - title: Report on Adjustment of CCFAP Rates (Jan 15, 2024) Family Contributions + href: https://legislature.vermont.gov/assets/Legislative-Reports/Act-76-CCFAP-Rates-Jan-2024.pdf#page=15 + - title: Act 76 Section 5 + href: https://legislature.vermont.gov/Documents/2024/Docs/ACTS/ACT076/ACT076%20As%20Enacted.pdf + - title: CCFAP Income Guidelines (effective October 6, 2024) + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/Benefits/CCFAP-Income-Guidelines.pdf + - title: CCFAP Regulations Section IX + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=17 + +brackets: + - threshold: + 2009-02-09: 0 + amount: + 2009-02-09: 0 + - threshold: + 2009-02-09: 1.5001 + amount: + 2009-02-09: 25 + 2024-04-07: 0 + - threshold: + 2009-02-09: 1.7501 + amount: + 2009-02-09: 50 + - threshold: + 2009-02-09: 2.0001 + amount: + 2009-02-09: 75 + - threshold: + 2009-02-09: 2.2501 + amount: + 2009-02-09: 100 + - threshold: + 2009-02-09: 2.5001 + amount: + 2009-02-09: 125 + - threshold: + 2009-02-09: 2.7501 + amount: + 2009-02-09: 150 + - threshold: + 2009-02-09: 3.0001 + amount: + 2009-02-09: 175 + - threshold: + 2009-02-09: 3.2501 + amount: + 2009-02-09: 200 + - threshold: + 2009-02-09: 3.5001 + amount: + 2009-02-09: 225 + - threshold: + 2009-02-09: 3.7501 + amount: + 2009-02-09: 250 + - threshold: + 2009-02-09: .inf + 2024-10-06: 4.0001 + amount: + 2009-02-09: 275 + - threshold: + 2009-02-09: .inf + 2024-10-06: 4.2501 + amount: + 2009-02-09: 300 + - threshold: + 2009-02-09: .inf + 2024-10-06: 4.5001 + amount: + 2009-02-09: 325 + - threshold: + 2009-02-09: .inf + 2024-10-06: 4.7501 + amount: + 2009-02-09: 350 + - threshold: + 2009-02-09: .inf + 2024-10-06: 5.0001 + amount: + 2009-02-09: 375 + - threshold: + 2009-02-09: .inf + 2024-10-06: 5.2501 + amount: + 2009-02-09: 400 + - threshold: + 2009-02-09: .inf + 2024-10-06: 5.5001 + amount: + 2009-02-09: 425 diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/fpl_limit.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/fpl_limit.yaml new file mode 100644 index 00000000000..9ed11207f3b --- /dev/null +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/fpl_limit.yaml @@ -0,0 +1,17 @@ +description: Vermont limits gross income to this share of the federal poverty guideline under the Child Care Financial Assistance Program. +values: + 2009-02-09: 3.5 + 2024-04-07: 4 + 2024-10-06: 5.75 + +metadata: + unit: /1 + period: year + label: Vermont CCFAP income limit FPL multiplier + reference: + - title: 33 V.S.A. Section 3512 (pre-Act 76) + href: https://legislature.vermont.gov/statutes/section/33/035/03512 + - title: Act 76 FAQs Section 2B + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/Act76/ACT-76-FAQs.pdf#page=7 + - title: CCFAP Income Guidelines (effective October 6, 2024) + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/Benefits/CCFAP-Income-Guidelines.pdf diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/sources.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/sources.yaml new file mode 100644 index 00000000000..e3afc512e91 --- /dev/null +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/sources.yaml @@ -0,0 +1,27 @@ +description: Vermont counts these income sources as gross income under the Child Care Financial Assistance Program. +values: + 2009-02-09: + - employment_income + - self_employment_income + - pension_income + - social_security + - alimony_income + - child_support_received + - dividend_income + - interest_income + - rental_income + - unemployment_compensation + - workers_compensation + - veterans_benefits + - military_retirement_pay + # Excluded: SSI, SNAP, Medicaid, Reach Up, EITC, tax refunds, + # education grants/scholarships, foster care payments, + # adoption assistance, child support paid out + +metadata: + unit: list + period: year + label: Vermont CCFAP countable income sources + reference: + - title: CCFAP Regulations Section II B 2 + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=9 diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/rates/licensed_center.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/rates/licensed_center.yaml new file mode 100644 index 00000000000..edb2b34b69f --- /dev/null +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/rates/licensed_center.yaml @@ -0,0 +1,64 @@ +description: Vermont provides these weekly reimbursement rates for licensed child care centers under the Child Care Financial Assistance Program. + +metadata: + period: week + unit: currency-USD + label: Vermont CCFAP licensed center weekly rates + breakdown: + - vt_ccfap_care_schedule + - vt_ccfap_age_group + reference: + - title: CCFAP Rate Increase Per Act 76 + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/Act76/CCFAP-Rate-Increase-Per-Act-76.pdf + - title: CCFAP State Rates (June 30, 2024) + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-State-Rates.pdf + - title: CCFAP Capped State Rates (July 13, 2025) + href: https://outside.vermont.gov/dept/DCF/Policies%20Procedures%20Guidance/CDD-Guidance-CCFAP-Capped-Rates.pdf + +FULL_TIME: + INFANT: + 2023-07-02: 349 + 2024-01-01: 471 + 2025-07-13: 495 + TODDLER: + 2023-07-02: 328 + 2024-01-01: 443 + 2025-07-13: 465 + PRESCHOOL: + 2023-07-02: 325 + 2024-01-01: 439 + SCHOOL_AGE: + 2023-07-02: 275 + 2024-01-01: 371 + +PART_TIME: + INFANT: + 2023-07-02: 191 + 2024-01-01: 258 + 2025-07-13: 271 + TODDLER: + 2023-07-02: 180 + 2024-01-01: 243 + 2025-07-13: 255 + PRESCHOOL: + 2023-07-02: 178 + 2024-01-01: 240 + SCHOOL_AGE: + 2023-07-02: 151 + 2024-01-01: 204 + +EXTENDED_CARE: + INFANT: + 2023-07-02: 474 + 2024-01-01: 640 + 2025-07-13: 672 + TODDLER: + 2023-07-02: 446 + 2024-01-01: 602 + 2025-07-13: 632 + PRESCHOOL: + 2023-07-02: 442 + 2024-01-01: 597 + SCHOOL_AGE: + 2023-07-02: 374 + 2024-01-01: 505 diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/rates/registered_home.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/rates/registered_home.yaml new file mode 100644 index 00000000000..6586f1b98c9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/rates/registered_home.yaml @@ -0,0 +1,76 @@ +description: Vermont provides these weekly reimbursement rates for registered family child care homes under the Child Care Financial Assistance Program. + +metadata: + period: week + unit: currency-USD + label: Vermont CCFAP registered home weekly rates + breakdown: + - vt_ccfap_care_schedule + - vt_ccfap_age_group + reference: + - title: CCFAP Rate Increase Per Act 76 + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/Act76/CCFAP-Rate-Increase-Per-Act-76.pdf + - title: CCFAP State Rates (June 30, 2024) + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-State-Rates.pdf + - title: CCFAP Capped State Rates (July 13, 2025) + href: https://outside.vermont.gov/dept/DCF/Policies%20Procedures%20Guidance/CDD-Guidance-CCFAP-Capped-Rates.pdf + +FULL_TIME: + INFANT: + 2023-07-02: 225 + 2024-01-01: 304 + 2024-06-30: 387 + 2025-07-13: 407 + TODDLER: + 2023-07-02: 211 + 2024-01-01: 285 + 2024-06-30: 364 + 2025-07-13: 382 + PRESCHOOL: + 2023-07-02: 210 + 2024-01-01: 284 + 2024-06-30: 361 + SCHOOL_AGE: + 2023-07-02: 200 + 2024-01-01: 270 + 2024-06-30: 321 + +PART_TIME: + INFANT: + 2023-07-02: 123 + 2024-01-01: 166 + 2024-06-30: 212 + 2025-07-13: 223 + TODDLER: + 2023-07-02: 116 + 2024-01-01: 157 + 2024-06-30: 200 + 2025-07-13: 210 + PRESCHOOL: + 2023-07-02: 115 + 2024-01-01: 155 + 2024-06-30: 198 + SCHOOL_AGE: + 2023-07-02: 110 + 2024-01-01: 149 + 2024-06-30: 176 + +EXTENDED_CARE: + INFANT: + 2023-07-02: 306 + 2024-01-01: 413 + 2024-06-30: 527 + 2025-07-13: 553 + TODDLER: + 2023-07-02: 286 + 2024-01-01: 386 + 2024-06-30: 494 + 2025-07-13: 519 + PRESCHOOL: + 2023-07-02: 285 + 2024-01-01: 385 + 2024-06-30: 491 + SCHOOL_AGE: + 2023-07-02: 272 + 2024-01-01: 367 + 2024-06-30: 436 diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/integration.yaml new file mode 100644 index 00000000000..df40271c036 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/integration.yaml @@ -0,0 +1,827 @@ +- name: Case 1, low income single parent with one infant in full time licensed center. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 28 + employment_income: 30_000 + person2: + age: 1 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 25_000 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # Child eligibility + vt_ccfap_eligible_child: [false, true] + # person1: age 28, not a dependent => false + # person2: age 1 < 13, dependent => true + + # Age group + vt_ccfap_age_group: [SCHOOL_AGE, INFANT] + # person2: age 1 => infant (< 24 months) + + # Care schedule + vt_ccfap_care_schedule: [PART_TIME, FULL_TIME] + # person2: 5 * 8 = 40 hours/week => full time (26-50) + + # Provider type + vt_ccfap_provider_type: [LICENSED_CENTER, LICENSED_CENTER] + # person2: DCC_SACC => licensed center + + # State rate (2024-06-30 rates apply at 2025-01-01) + vt_ccfap_state_rate: [0, 471] + # person2: licensed center, full time, infant = $471/wk + + # Income + # FPG for family of 2 = 15,650 + 5,500 = 21,150 + # FPL ratio = 30,000 / 21,150 = 1.418 + vt_ccfap_countable_income: 2_500.00 + # 30,000 / 12 = $2,500.00/mo + vt_ccfap_income_eligible: true + + # Family share + # FPL ratio 1.418 < 1.7501 => $0/wk + # Monthly: $0 * 52 / 12 = $0 + vt_ccfap_family_share: 0 + + # Overall eligibility + vt_ccfap_eligible: true + + # Benefit + # Weekly rate = $471/wk + # Monthly rate = $471 * 52 / 12 = $2,041.00 + # Benefit = max(2,041.00 - 0, 0) = $2,041.00 + vt_ccfap: 2_041.00 + +- name: Case 2, moderate income two parent family with two children in different settings. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 35 + employment_income: 70_000 + person2: + age: 33 + employment_income: 10_000 + person3: + age: 3 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 23_000 + person4: + age: 7 + is_tax_unit_dependent: true + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + pre_subsidy_childcare_expenses: 10_000 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3, person4] + state_code: VT + output: + # Child eligibility + vt_ccfap_eligible_child: [false, false, true, true] + + # Age groups + vt_ccfap_age_group: [SCHOOL_AGE, SCHOOL_AGE, PRESCHOOL, SCHOOL_AGE] + # person3: age 3 = preschool (36-59 months) + # person4: age 7 = school age (60+ months) + + # Care schedules + vt_ccfap_care_schedule: [PART_TIME, PART_TIME, FULL_TIME, PART_TIME] + # person3: 5 * 8 = 40 hrs/wk = full time + # person4: 5 * 4 = 20 hrs/wk = part time + + # Provider types + vt_ccfap_provider_type: [LICENSED_CENTER, LICENSED_CENTER, LICENSED_CENTER, REGISTERED_HOME] + + # State rates + vt_ccfap_state_rate: [0, 0, 439, 176] + # person3: licensed center, full time, preschool = $439/wk + # person4: registered home, part time, school age = $176/wk + + # Income + # Countable income = 70,000 + 10,000 = 80,000 + # FPG for family of 4 = 15,650 + 3 * 5,500 = 32,150 + # FPL ratio = 80,000 / 32,150 = 2.488 + vt_ccfap_countable_income: 6_666.67 + # 80,000 / 12 = $6,666.67/mo + vt_ccfap_income_eligible: true + + # Family share + # FPL ratio 2.488 > 2.2501 => $100/wk + # Monthly: $100 * 52 / 12 = $433.33 + vt_ccfap_family_share: 433.33 + + # Overall eligibility + vt_ccfap_eligible: true + + # Benefit + # Total weekly rate = ($439 + $176) = $615/wk + # Monthly rate = $615 * 52 / 12 = $2,665.00 + # Benefit = max(2,665.00 - 433.33, 0) = $2,231.67 + vt_ccfap: 2_231.67 + +- name: Case 3, high income family just below 575 percent FPL threshold. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 40 + employment_income: 145_000 + person2: + age: 38 + self_employment_income: 8_000 + person3: + age: 5 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 22_000 + spm_units: + spm_unit: + members: [person1, person2, person3] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # Child eligibility + vt_ccfap_eligible_child: [false, false, true] + + # Age group + vt_ccfap_age_group: [SCHOOL_AGE, SCHOOL_AGE, SCHOOL_AGE] + # person3: age 5 = school age (60+ months) + + # Care schedule + vt_ccfap_care_schedule: [PART_TIME, PART_TIME, FULL_TIME] + + # State rate + vt_ccfap_state_rate: [0, 0, 371] + # person3: licensed center, full time, school age = $371/wk + + # Income + # Countable income = 145,000 + 8,000 = 153,000 + # FPG for family of 3 = 26,650 + # FPL ratio = 153,000 / 26,650 = 5.741 + # 5.741 > 5.5001 => weekly share = $425 + vt_ccfap_countable_income: 12_750.00 + # 153,000 / 12 = $12,750.00/mo + vt_ccfap_income_eligible: true + + # Family share + # Monthly: $425 * 52 / 12 = $1,841.67 + vt_ccfap_family_share: 1_841.67 + + # Overall eligibility + vt_ccfap_eligible: true + + # Benefit + # Weekly rate = $371/wk + # Monthly rate = $371 * 52 / 12 = $1,607.67 + # Benefit = max(1,607.67 - 1,841.67, 0) = $0 + vt_ccfap: 0 + +- name: Case 4, foster child in registered home with high income parent. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 45 + employment_income: 200_000 + person2: + age: 4 + is_tax_unit_dependent: true + is_in_foster_care: true + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 20_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Child eligibility + vt_ccfap_eligible_child: [false, true] + + # Age group + vt_ccfap_age_group: [SCHOOL_AGE, PRESCHOOL] + # person2: age 4 = preschool (36-59 months) + + # Care schedule + vt_ccfap_care_schedule: [PART_TIME, FULL_TIME] + + # Provider type + vt_ccfap_provider_type: [LICENSED_CENTER, REGISTERED_HOME] + + # State rate + vt_ccfap_state_rate: [0, 361] + # person2: registered home, full time, preschool = $361/wk + + # Income eligibility + # FPG for family of 2 = 21,150 + # 575% FPL = 121,612.50 + # Income 200,000 > 121,612.50 but foster child = categorically eligible + vt_ccfap_income_eligible: false + + # Family share: foster child = exempt, $0 + vt_ccfap_family_share: 0 + + # Overall eligibility + # Foster child present => categorically eligible (bypasses income test) + vt_ccfap_eligible: true + + # Benefit + # Weekly rate = $361/wk + # Monthly rate = $361 * 52 / 12 = $1,564.33 + # Benefit = max(1,564.33 - 0, 0) = $1,564.33 + vt_ccfap: 1_564.33 + +- name: Case 5, disabled teenager eligible as special needs child. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 42 + employment_income: 60_000 + person2: + age: 16 + is_tax_unit_dependent: true + is_disabled: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 6 + pre_subsidy_childcare_expenses: 16_000 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # Child eligibility + vt_ccfap_eligible_child: [false, true] + # person2: age 16, disabled, age < 19 => eligible + + # Age group + vt_ccfap_age_group: [SCHOOL_AGE, SCHOOL_AGE] + + # Care schedule + vt_ccfap_care_schedule: [PART_TIME, FULL_TIME] + # person2: 5 * 6 = 30 hrs/wk = full time (26-50) + + # State rate + vt_ccfap_state_rate: [0, 371] + # person2: licensed center, full time, school age = $371/wk + + # Income + # FPG for family of 2 = 21,150 + # FPL ratio = 60,000 / 21,150 = 2.837 + vt_ccfap_countable_income: 5_000.00 + # 60,000 / 12 = $5,000.00/mo + vt_ccfap_income_eligible: true + + # Family share + # FPL ratio 2.837 > 2.7501 => $150/wk + # Monthly: $150 * 52 / 12 = $650.00 + vt_ccfap_family_share: 650.00 + + # Overall eligibility + vt_ccfap_eligible: true + + # Benefit + # Weekly rate = $371/wk + # Monthly rate = $371 * 52 / 12 = $1,607.67 + # Benefit = max(1,607.67 - 650.00, 0) = $957.67 + vt_ccfap: 957.67 + +- name: Case 6, extended care infant in registered home with two parents. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 25 + employment_income: 35_000 + person2: + age: 25 + employment_income: 10_000 + person3: + age: 0 + is_tax_unit_dependent: true + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + pre_subsidy_childcare_expenses: 30_000 + spm_units: + spm_unit: + members: [person1, person2, person3] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # Child eligibility + vt_ccfap_eligible_child: [false, false, true] + + # Age group + vt_ccfap_age_group: [SCHOOL_AGE, SCHOOL_AGE, INFANT] + + # Care schedule + vt_ccfap_care_schedule: [PART_TIME, PART_TIME, EXTENDED_CARE] + # person3: 6 * 10 = 60 hrs/wk > 50 = extended care + + # Provider type + vt_ccfap_provider_type: [LICENSED_CENTER, LICENSED_CENTER, REGISTERED_HOME] + + # State rate + vt_ccfap_state_rate: [0, 0, 527] + # person3: registered home, extended care, infant = $527/wk + + # Income + # Countable income = 35,000 + 10,000 = 45,000 + # FPG for family of 3 = 26,650 + # FPL ratio = 45,000 / 26,650 = 1.688 + vt_ccfap_countable_income: 3_750.00 + # 45,000 / 12 = $3,750.00/mo + vt_ccfap_income_eligible: true + + # Family share + # FPL ratio 1.688 < 1.7501 => $0/wk + # Monthly: $0 * 52 / 12 = $0 + vt_ccfap_family_share: 0 + + # Overall eligibility + vt_ccfap_eligible: true + + # Benefit + # Weekly rate = $527/wk + # Monthly rate = $527 * 52 / 12 = $2,283.67 + # Benefit = max(2,283.67 - 0, 0) = $2,283.67 + vt_ccfap: 2_283.67 + +- name: Case 7, ineligible family above 575 percent FPL gets zero benefit. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 40 + employment_income: 160_000 + person2: + age: 4 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 23_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Child eligibility + vt_ccfap_eligible_child: [false, true] + + # FPG for family of 2 = 21,150 + # 575% FPL = 121,612.50 + # Income 160,000 > 121,612.50 + vt_ccfap_income_eligible: false + + # Overall eligibility: income ineligible + vt_ccfap_eligible: false + + # Benefit: ineligible = $0 + vt_ccfap: 0 + +- name: Case 8, family at exactly 575 percent FPL boundary with maximum family share. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 35 + employment_income: 121_612.50 + person2: + age: 1 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + pre_subsidy_childcare_expenses: 35_000 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # Child eligibility + vt_ccfap_eligible_child: [false, true] + # person1: age 35, not dependent => false + # person2: age 1 < 13, dependent => true + + # Age group + vt_ccfap_age_group: [SCHOOL_AGE, INFANT] + # person2: age 1 = infant (< 24 months) + + # Care schedule + vt_ccfap_care_schedule: [PART_TIME, EXTENDED_CARE] + # person2: 6 * 10 = 60 hrs/wk > 50 = extended care + + # Provider type + vt_ccfap_provider_type: [LICENSED_CENTER, LICENSED_CENTER] + + # State rate + vt_ccfap_state_rate: [0, 640] + # person2: licensed center, extended care, infant = $640/wk + + # Income + # FPG for family of 2 = 21,150 + # FPL ratio = 121,612.50 / 21,150 = 5.75 + # 121,612.50 <= 121,612.50 + vt_ccfap_countable_income: 10_134.38 + # 121,612.50 / 12 = $10,134.38/mo + vt_ccfap_income_eligible: true + + # Family share + # FPL ratio 5.75 >= 5.5001 => $425/wk + # Monthly: $425 * 52 / 12 = $1,841.67 + vt_ccfap_family_share: 1_841.67 + + # Overall eligibility + vt_ccfap_eligible: true + + # Benefit + # Weekly rate = $640/wk + # Monthly rate = $640 * 52 / 12 = $2,773.33 + # Benefit = max(2,773.33 - 1,841.67, 0) = $931.67 + vt_ccfap: 931.67 + +- name: Case 9, large family of 8 with three eligible children in different settings. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 40 + employment_income: 80_000 + person2: + age: 38 + person3: + age: 14 + is_tax_unit_dependent: true + person4: + age: 0 + is_tax_unit_dependent: true + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 22_000 + person5: + age: 2 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 5 + pre_subsidy_childcare_expenses: 14_000 + person6: + age: 4 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 20_000 + person7: + age: 8 + is_tax_unit_dependent: true + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + pre_subsidy_childcare_expenses: 10_000 + person8: + age: 10 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + pre_subsidy_childcare_expenses: 10_000 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8] + state_code: VT + output: + # Child eligibility + vt_ccfap_eligible_child: [false, false, false, true, true, true, true, true] + # person3: age 14 >= 13, not disabled => false + # person4-8: all < 13 and dependents => true + + # Age groups + vt_ccfap_age_group: [SCHOOL_AGE, SCHOOL_AGE, SCHOOL_AGE, INFANT, TODDLER, PRESCHOOL, SCHOOL_AGE, SCHOOL_AGE] + + # Care schedules + vt_ccfap_care_schedule: [PART_TIME, PART_TIME, PART_TIME, FULL_TIME, PART_TIME, FULL_TIME, PART_TIME, PART_TIME] + # person4: 5*8=40 = full time + # person5: 5*5=25 = part time (<=25) + # person6: 5*8=40 = full time + # person7: 5*4=20 = part time + # person8: 5*4=20 = part time + + # Provider types + vt_ccfap_provider_type: [LICENSED_CENTER, LICENSED_CENTER, LICENSED_CENTER, REGISTERED_HOME, LICENSED_CENTER, LICENSED_CENTER, REGISTERED_HOME, LICENSED_CENTER] + + # State rates + vt_ccfap_state_rate: [0, 0, 0, 387, 243, 439, 176, 204] + # person4: registered home, full time, infant = $387/wk + # person5: licensed center, part time, toddler = $243/wk + # person6: licensed center, full time, preschool = $439/wk + # person7: registered home, part time, school age = $176/wk + # person8: licensed center, part time, school age = $204/wk + + # Income + # FPG for family of 8 = 15,650 + 7 * 5,500 = 54,150 + # FPL ratio = 80,000 / 54,150 = 1.477 + vt_ccfap_countable_income: 6_666.67 + # 80,000 / 12 = $6,666.67/mo + vt_ccfap_income_eligible: true + + # Family share + # FPL ratio 1.477 < 1.7501 => $0/wk + # Monthly: $0 * 52 / 12 = $0 + vt_ccfap_family_share: 0 + + # Overall eligibility + vt_ccfap_eligible: true + + # Benefit + # Total weekly rate = $387 + $243 + $439 + $176 + $204 = $1,449/wk + # Monthly rate = $1,449 * 52 / 12 = $6,279.00 + # Benefit = max(6,279.00 - 0, 0) = $6,279.00 + vt_ccfap: 6_279.00 + +- name: Case 10, enrollment based benefit with moderate family share. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 55_000 + person2: + age: 1 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # Child eligibility + vt_ccfap_eligible_child: [false, true] + + # Age group + vt_ccfap_age_group: [SCHOOL_AGE, INFANT] + + # Care schedule + vt_ccfap_care_schedule: [PART_TIME, EXTENDED_CARE] + # person2: 6 * 10 = 60 hrs/wk > 50 = extended care + + # State rate + vt_ccfap_state_rate: [0, 640] + # person2: licensed center, extended care, infant = $640/wk + + # Income + # FPG for family of 2 = 21,150 + # FPL ratio = 55,000 / 21,150 = 2.600 + vt_ccfap_countable_income: 4_583.33 + # 55,000 / 12 = $4,583.33/mo + vt_ccfap_income_eligible: true + + # Family share + # FPL ratio 2.600 >= 2.5001 => $125/wk + # Monthly: $125 * 52 / 12 = $541.67 + vt_ccfap_family_share: 541.67 + + # Overall eligibility + vt_ccfap_eligible: true + + # Benefit + # Weekly rate = $640/wk + # Monthly rate = $640 * 52 / 12 = $2,773.33 + # Benefit = max(2,773.33 - 541.67, 0) = $2,231.67 + vt_ccfap: 2_231.67 + +- name: Case 11, Jane Smith example from Understanding Payments guide. + # Source: CCFAP Understanding Payments (Rev Feb 7, 2025), page 2. + # Registered Family Child Home, infant, full-time, family share $50/wk. + # State rate = $387. State pays $387 - $50 = $337/wk. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 38_000 + person2: + age: 1 + is_tax_unit_dependent: true + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 13_000 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # Age group + vt_ccfap_age_group: [SCHOOL_AGE, INFANT] + + # Care schedule: 5 * 8 = 40 hrs/wk => full time + vt_ccfap_care_schedule: [PART_TIME, FULL_TIME] + + # Provider type: FDC_GFDC => registered home + vt_ccfap_provider_type: [LICENSED_CENTER, REGISTERED_HOME] + + # State rate: registered home, full time, infant = $387/wk + vt_ccfap_state_rate: [0, 387] + + # Income + # FPG for family of 2 = 21,150 + # FPL ratio = 38,000 / 21,150 = 1.797 + vt_ccfap_countable_income: 3_166.67 + vt_ccfap_income_eligible: true + + # Family share + # FPL ratio 1.797 >= 1.7501 => $50/wk (matches PDF example) + # Monthly: $50 * 52 / 12 = $216.67 + vt_ccfap_family_share: 216.67 + + # Benefit + # Weekly: $387 - $50 = $337/wk (matches PDF: "State will pay the provider $337") + # Monthly: $337 * 52 / 12 = $1,460.33 + vt_ccfap: 1_460.33 + +- name: Case 12, Honey Child Care example from Understanding Payments guide. + # Source: CCFAP Understanding Payments (Rev Feb 7, 2025), page 2. + # Center Based, toddler, part-time, family share $50/wk. + # State rate = $243. State pays $243 - $50 = $193/wk. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 38_000 + person2: + age: 2 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + pre_subsidy_childcare_expenses: 13_520 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # Age group: age 2 = 24 months => toddler (24-35 months) + vt_ccfap_age_group: [SCHOOL_AGE, TODDLER] + + # Care schedule: 5 * 4 = 20 hrs/wk => part time (<=25) + vt_ccfap_care_schedule: [PART_TIME, PART_TIME] + + # Provider type: DCC_SACC => licensed center + vt_ccfap_provider_type: [LICENSED_CENTER, LICENSED_CENTER] + + # State rate: licensed center, part time, toddler = $243/wk + vt_ccfap_state_rate: [0, 243] + + # Income + # FPG for family of 2 = 21,150 + # FPL ratio = 38,000 / 21,150 = 1.797 + vt_ccfap_countable_income: 3_166.67 + vt_ccfap_income_eligible: true + + # Family share + # FPL ratio 1.797 >= 1.7501 => $50/wk (matches PDF example) + # Monthly: $50 * 52 / 12 = $216.67 + vt_ccfap_family_share: 216.67 + + # Benefit + # Weekly: $243 - $50 = $193/wk (matches PDF: "State will pay the provider $193") + # Monthly: $193 * 52 / 12 = $836.33 + vt_ccfap: 836.33 + +- name: Case 13, protective services child with mixed eligible and ineligible children. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 35 + employment_income: 200_000 + person2: + age: 15 + is_tax_unit_dependent: true + person3: + age: 3 + is_tax_unit_dependent: true + receives_or_needs_protective_services: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 25_000 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # Child eligibility + vt_ccfap_eligible_child: [false, false, true] + # person2: age 15 >= 13, not disabled => false + # person3: age 3 < 13, dependent => true + + # Age group + vt_ccfap_age_group: [SCHOOL_AGE, SCHOOL_AGE, PRESCHOOL] + + # State rate + vt_ccfap_state_rate: [0, 0, 439] + # person3: licensed center, full time, preschool = $439/wk + + # Income + # FPG for family of 3 = 26,650 + # 575% FPL = 153,237.50 + # Income 200,000 > 153,237.50 + vt_ccfap_countable_income: 16_666.67 + # 200,000 / 12 = $16,666.67/mo + vt_ccfap_income_eligible: false + + # Protective services => categorically eligible + vt_ccfap_eligible: true + + # Family share: protective services = exempt + vt_ccfap_family_share: 0 + + # Benefit + # Weekly rate = $439/wk + # Monthly rate = $439 * 52 / 12 = $1,902.33 + # Benefit = max(1,902.33 - 0, 0) = $1,902.33 + vt_ccfap: 1_902.33 diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap.yaml new file mode 100644 index 00000000000..72e1e96ac7a --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap.yaml @@ -0,0 +1,337 @@ +- name: Case 1, single child full time licensed center at 250 percent FPL. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 52_875 + person2: + age: 3 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 25_000 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 15,650 + 5,500 = 21,150 + # FPL ratio = 52,875 / 21,150 = 2.50 + # Weekly family share at 2.50 > 2.2501 = $100/wk + # Monthly family share = $100 * 52 / 12 = $433.33 + # Child: age 3, preschool, full time, licensed center = $439/wk + # Monthly rate = $439 * 52 / 12 = $1,902.33 + # Benefit = max(1,902.33 - 433.33, 0) = $1,469.00 + vt_ccfap: 1_469.00 + +- name: Case 2, ineligible family gets zero benefit. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 125_000 + person2: + age: 5 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 25_000 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 21,150 + # 575% FPL = 121,612.50 + # Income 125,000 > 121,612.50, so ineligible + vt_ccfap: 0 + +- name: Case 3, Reach Up eligible family gets full subsidy with no copay. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 20_000 + person2: + age: 1 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 25_000 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: + 2025-01: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # Reach Up = categorically eligible, $0 family share + # Child: age 1, infant, full time, licensed center = $471/wk + # Monthly rate = $471 * 52 / 12 = $2,041.00 + # Benefit = max(2,041.00 - 0, 0) = $2,041.00 + vt_ccfap: 2_041.00 + +- name: Case 4, family share exceeds state rate results in zero benefit. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 150_000 + person2: + age: 30 + person3: + age: 7 + is_tax_unit_dependent: true + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + pre_subsidy_childcare_expenses: 10_000 + spm_units: + spm_unit: + members: [person1, person2, person3] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # FPG for family of 3 = 26,650 + # FPL ratio = 150,000 / 26,650 = 5.631 + # Weekly family share at 5.631 > 5.5001 = $425/wk + # Monthly family share = $425 * 52 / 12 = $1,841.67 + # Child: age 7, school age, part time, registered home = $176/wk + # Monthly rate = $176 * 52 / 12 = $762.67 + # Benefit = max(762.67 - 1,841.67, 0) = $0 + vt_ccfap: 0 + +- name: Case 5, zero income family gets full subsidy. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 2 + is_tax_unit_dependent: true + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 20_000 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # Zero income = 0% FPL, family share = $0/wk + # Child: age 2, toddler, full time, registered home = $364/wk + # Monthly rate = $364 * 52 / 12 = $1,577.33 + # Benefit = max(1,577.33 - 0, 0) = $1,577.33 + vt_ccfap: 1_577.33 + +- name: Case 6, negative self employment income does not inflate benefit. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + self_employment_income: -60_000_000 + person2: + age: 3 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 25_000 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # Negative income, family share = $0/wk + # Child: preschool, full time, licensed center = $439/wk + # Monthly rate = $439 * 52 / 12 = $1,902.33 + # Benefit capped at max(1,902.33 - 0, 0) = $1,902.33, NOT inflated + vt_ccfap: 1_902.33 + +- name: Case 7, enrollment based benefit equals state rate minus family share. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + person2: + age: 1 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 21,150 + # FPL ratio = 30,000 / 21,150 = 1.418 + # Weekly family share at 1.418 < 1.7501 = $0/wk + # Monthly family share = $0 + # Child: infant, full time, licensed center = $471/wk + # Monthly rate = $471 * 52 / 12 = $2,041.00 + # Benefit = max(2,041.00 - 0, 0) = $2,041.00 + vt_ccfap: 2_041.00 + +- name: Case 8, two children different age groups and provider types. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 55_000 + person2: + age: 1 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + person3: + age: 7 + is_tax_unit_dependent: true + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + spm_units: + spm_unit: + members: [person1, person2, person3] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # FPG for family of 3 = 26,650 + # FPL ratio = 55,000 / 26,650 = 2.064 + # Weekly family share at 2.064 >= 2.0001 = $75/wk + # Monthly family share = $75 * 52 / 12 = $325.00 + # person2: infant, full time, licensed center = $471/wk + # person3: school age, part time, registered home = $176/wk + # Total weekly rate = $471 + $176 = $647 + # Monthly rate = $647 * 52 / 12 = $2,803.67 + # Benefit = max(2,803.67 - 325.00, 0) = $2,478.67 + vt_ccfap: 2_478.67 + +- name: Case 9, three children in extended care at different ages. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 35 + employment_income: 40_000 + person2: + age: 0 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + person3: + age: 2 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + person4: + age: 4 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3, person4] + state_code: VT + output: + # FPG for family of 4 = 32,150 + # FPL ratio = 40,000 / 32,150 = 1.244 + # Weekly family share at 1.244 < 1.7501 = $0/wk + # Monthly family share = $0 + # person2: infant, extended care, licensed center = $640/wk + # person3: toddler, extended care, licensed center = $602/wk + # person4: preschool, extended care, licensed center = $597/wk + # Total weekly rate = $640 + $602 + $597 = $1,839 + # Monthly rate = $1,839 * 52 / 12 = $7,969.00 + # Benefit = max(7,969.00 - 0, 0) = $7,969.00 + vt_ccfap: 7_969.00 + +- name: Case 10, enrolled child receives enrollment based benefit. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + person2: + age: 3 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 21,150 + # FPL ratio = 30,000 / 21,150 = 1.418 + # Weekly family share at 1.418 < 1.7501 = $0/wk + # Monthly family share = $0 + # Child: preschool, full time, licensed center = $439/wk + # Monthly rate = $439 * 52 / 12 = $1,902.33 + # Benefit = max(1,902.33 - 0, 0) = $1,902.33 + vt_ccfap: 1_902.33 diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_age_group.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_age_group.yaml new file mode 100644 index 00000000000..4e89a234d05 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_age_group.yaml @@ -0,0 +1,90 @@ +- name: Case 1, infant under 24 months. + period: 2025-01 + input: + people: + person1: + age: 1 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_age_group: [INFANT] + +- name: Case 2, toddler at 2 years old. + period: 2025-01 + input: + people: + person1: + age: 2 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_age_group: [TODDLER] + +- name: Case 3, preschooler at 3 years old. + period: 2025-01 + input: + people: + person1: + age: 3 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_age_group: [PRESCHOOL] + +- name: Case 4, preschooler at 4 years old. + period: 2025-01 + input: + people: + person1: + age: 4 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_age_group: [PRESCHOOL] + +- name: Case 5, school age at 5 years old. + period: 2025-01 + input: + people: + person1: + age: 5 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_age_group: [SCHOOL_AGE] + +- name: Case 6, school age at 10 years old. + period: 2025-01 + input: + people: + person1: + age: 10 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_age_group: [SCHOOL_AGE] + +- name: Case 7, newborn is infant. + period: 2025-01 + input: + people: + person1: + age: 0 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_age_group: [INFANT] diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_care_schedule.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_care_schedule.yaml new file mode 100644 index 00000000000..c468a5b8eef --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_care_schedule.yaml @@ -0,0 +1,156 @@ +- name: Case 1, part time at 20 hours per week. + period: 2025-01 + input: + people: + person1: + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_care_schedule: [PART_TIME] + +- name: Case 2, part time at exactly 25 hours per week. + period: 2025-01 + input: + people: + person1: + childcare_days_per_week: 5 + childcare_hours_per_day: 5 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_care_schedule: [PART_TIME] + +- name: Case 3, full time at 26 hours per week. + period: 2025-01 + input: + people: + person1: + childcare_days_per_week: 5 + childcare_hours_per_day: 5.2 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_care_schedule: [FULL_TIME] + +- name: Case 4, full time at 40 hours per week. + period: 2025-01 + input: + people: + person1: + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_care_schedule: [FULL_TIME] + +- name: Case 5, full time at exactly 50 hours per week. + period: 2025-01 + input: + people: + person1: + childcare_days_per_week: 5 + childcare_hours_per_day: 10 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_care_schedule: [FULL_TIME] + +- name: Case 6, extended care at 51 hours per week. + period: 2025-01 + input: + people: + person1: + childcare_days_per_week: 5 + childcare_hours_per_day: 10.2 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_care_schedule: [EXTENDED_CARE] + +- name: Case 7, extended care at 60 hours per week. + period: 2025-01 + input: + people: + person1: + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_care_schedule: [EXTENDED_CARE] + +- name: Case 8, minimal part time at 1 hour per week. + period: 2025-01 + input: + people: + person1: + childcare_days_per_week: 1 + childcare_hours_per_day: 1 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_care_schedule: [PART_TIME] + +- name: Case 9, zero childcare hours per week. + period: 2025-01 + input: + people: + person1: + childcare_days_per_week: 0 + childcare_hours_per_day: 0 + households: + household: + members: [person1] + state_code: VT + output: + # 0 hours <= 25 = part time + vt_ccfap_care_schedule: [PART_TIME] + +- name: Case 10, fractional hours just above 25 boundary. + period: 2025-01 + input: + people: + person1: + childcare_days_per_week: 5 + childcare_hours_per_day: 5.1 + households: + household: + members: [person1] + state_code: VT + output: + # 5 * 5.1 = 25.5 hours > 25 = full time + vt_ccfap_care_schedule: [FULL_TIME] + +- name: Case 11, fractional hours just above 50 boundary. + period: 2025-01 + input: + people: + person1: + childcare_days_per_week: 5 + childcare_hours_per_day: 10.1 + households: + household: + members: [person1] + state_code: VT + output: + # 5 * 10.1 = 50.5 hours > 50 = extended care + vt_ccfap_care_schedule: [EXTENDED_CARE] diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_eligible.yaml new file mode 100644 index 00000000000..ce1be2b9734 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_eligible.yaml @@ -0,0 +1,270 @@ +- name: Case 1, basic eligible family with income below threshold. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 50_000 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # Has eligible child (age 5 < 13, dependent) + # FPG for size 2 = 15,650 + 5,500 = 21,150 + # 575% FPL = 21,150 * 5.75 = 121,612.50 + # Income 50,000 <= 121,612.50 + # Assets default to 0 < 1,000,000 + vt_ccfap_eligible: true + +- name: Case 2, income above 575 percent FPL is ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 125_000 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 21,150 + # 575% FPL = 121,612.50 + # Income 125,000 > 121,612.50 + vt_ccfap_eligible: false + +- name: Case 3, Reach Up eligible bypasses income test. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 125_000 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: + 2025-01: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # Reach Up eligible = categorically eligible (bypasses income test) + vt_ccfap_eligible: true + +- name: Case 4, protective services child bypasses income test. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 200_000 + person2: + age: 5 + is_tax_unit_dependent: true + receives_or_needs_protective_services: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Protective services = categorically eligible + vt_ccfap_eligible: true + +- name: Case 5, foster child bypasses income test. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 200_000 + person2: + age: 5 + is_tax_unit_dependent: true + is_in_foster_care: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Foster child present = categorically eligible + vt_ccfap_eligible: true + +- name: Case 6, no eligible child means ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 40_000 + person2: + age: 15 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Child is 15, not disabled, so age 15 >= 13 = not eligible child + vt_ccfap_eligible: false + +- name: Case 7, assets over 1 million means ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 50_000 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_assets: 1_500_000 + households: + household: + members: [person1, person2] + state_code: VT + output: + # Assets 1,500,000 > 1,000,000 limit + vt_ccfap_eligible: false + +- name: Case 8, single adult with no children is ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: VT + output: + # No eligible child + vt_ccfap_eligible: false + +- name: Case 9, income at exactly 575 percent FPL is eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 121_612.50 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 21,150 + # 575% FPL = 121,612.50 + # Income = 121,612.50 <= 121,612.50 + vt_ccfap_eligible: true + +- name: Case 10, income one dollar above 575 percent FPL is ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 121_613 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 21,150 + # 575% FPL = 121,612.50 + # Income 121,613 > 121,612.50 + vt_ccfap_eligible: false + +- name: Case 11, multiple categorical exemptions combined. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 200_000 + person2: + age: 5 + is_tax_unit_dependent: true + receives_or_needs_protective_services: true + is_in_foster_care: true + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: + 2025-01: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # All three categorical exemptions present + # Income way above threshold but categorically eligible + vt_ccfap_eligible: true + +- name: Case 12, child only household with disabled teenager. + period: 2025-01 + input: + people: + person1: + age: 18 + is_tax_unit_dependent: true + is_disabled: true + spm_units: + spm_unit: + members: [person1] + meets_ccdf_activity_test: true + households: + household: + members: [person1] + state_code: VT + output: + # age 18 < 19 (special needs), dependent => eligible child + # Zero income, zero assets => eligible + vt_ccfap_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_eligible_child.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_eligible_child.yaml new file mode 100644 index 00000000000..c82dd778375 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_eligible_child.yaml @@ -0,0 +1,158 @@ +- name: Case 1, child under 13 who is a dependent and citizen. + period: 2025-01 + input: + people: + person1: + age: 5 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_eligible_child: [true] + +- name: Case 2, child at age 13 is ineligible. + period: 2025-01 + input: + people: + person1: + age: 13 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_eligible_child: [false] + +- name: Case 3, child with special needs under 19 is eligible. + period: 2025-01 + input: + people: + person1: + age: 16 + is_tax_unit_dependent: true + is_disabled: true + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_eligible_child: [true] + +- name: Case 4, child with special needs at age 19 is ineligible. + period: 2025-01 + input: + people: + person1: + age: 19 + is_tax_unit_dependent: true + is_disabled: true + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_eligible_child: [false] + +- name: Case 5, child under 13 who is not a dependent is ineligible. + period: 2025-01 + input: + people: + person1: + age: 5 + is_tax_unit_dependent: false + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_eligible_child: [false] + +- name: Case 6, infant is eligible. + period: 2025-01 + input: + people: + person1: + age: 0 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_eligible_child: [true] + +- name: Case 7, child at age 12 is eligible. + period: 2025-01 + input: + people: + person1: + age: 12 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_eligible_child: [true] + +- name: Case 8, special needs child at age 18 is eligible. + period: 2025-01 + input: + people: + person1: + age: 18 + is_tax_unit_dependent: true + is_disabled: true + households: + household: + members: [person1] + state_code: VT + output: + # age 18 < 19 (special needs threshold) => eligible + vt_ccfap_eligible_child: [true] + +- name: Case 9, non-disabled child at age 12 who is not a dependent. + period: 2025-01 + input: + people: + person1: + age: 12 + is_tax_unit_dependent: false + households: + household: + members: [person1] + state_code: VT + output: + # age 12 < 13 but not a dependent => ineligible + vt_ccfap_eligible_child: [false] + +- name: Case 10, multiple children with mixed eligibility. + period: 2025-01 + input: + people: + person1: + age: 35 + is_tax_unit_dependent: false + person2: + age: 5 + is_tax_unit_dependent: true + person3: + age: 14 + is_tax_unit_dependent: true + person4: + age: 15 + is_tax_unit_dependent: true + is_disabled: true + households: + household: + members: [person1, person2, person3, person4] + state_code: VT + output: + # person1: age 35, not dependent => false + # person2: age 5 < 13, dependent => true + # person3: age 14 >= 13, not disabled => false + # person4: age 15, disabled, 15 < 19 => true + vt_ccfap_eligible_child: [false, true, false, true] diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_family_share.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_family_share.yaml new file mode 100644 index 00000000000..da147bdf3d8 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_family_share.yaml @@ -0,0 +1,388 @@ +- name: Case 1, income at 150 percent FPL has zero family share. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 39_975 + person2: + age: 5 + is_tax_unit_dependent: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # FPG for family of 3 = 26,650 + # FPL ratio = 39,975 / 26,650 = 1.50 + # 1.50 < 1.7501, so weekly family share = $0 + # Monthly: $0 * 52 / 12 = $0 + vt_ccfap_family_share: 0 + +- name: Case 2, income at 200 percent FPL has 50 dollar weekly share. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 53_300 + person2: + age: 5 + is_tax_unit_dependent: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # FPG for family of 3 = 26,650 + # FPL ratio = 53,300 / 26,650 = 2.00 + # 2.00 > 1.7501 threshold, so weekly family share = $50 + # Monthly: $50 * 52 / 12 = $216.67 + vt_ccfap_family_share: 216.67 + +- name: Case 3, income at 300 percent FPL has 150 dollar weekly share. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 79_950 + person2: + age: 5 + is_tax_unit_dependent: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # FPG for family of 3 = 26,650 + # FPL ratio = 79,950 / 26,650 = 3.00 + # 3.00 > 2.7501 threshold, so weekly family share = $150 + # Monthly: $150 * 52 / 12 = $650.00 + vt_ccfap_family_share: 650 + +- name: Case 4, income at 575 percent FPL has maximum 425 dollar weekly share. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 153_237.50 + person2: + age: 5 + is_tax_unit_dependent: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # FPG for family of 3 = 26,650 + # FPL ratio = 153,237.50 / 26,650 = 5.75 + # 5.75 > 5.5001 threshold, so weekly family share = $425 + # Monthly: $425 * 52 / 12 = $1,841.67 + vt_ccfap_family_share: 1_841.67 + +- name: Case 5, Reach Up eligible family has zero family share. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 60_000 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: + 2025-01: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # Reach Up eligible = exempt from family share + vt_ccfap_family_share: 0 + +- name: Case 6, foster child present has zero family share. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 80_000 + person2: + age: 5 + is_tax_unit_dependent: true + is_in_foster_care: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Foster child present = exempt from family share + vt_ccfap_family_share: 0 + +- name: Case 7, protective services child has zero family share. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 80_000 + person2: + age: 5 + is_tax_unit_dependent: true + receives_or_needs_protective_services: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Protective services = exempt from family share + vt_ccfap_family_share: 0 + +- name: Case 8, income at exactly 175 percent FPL has zero family share. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 46_637.50 + person2: + age: 5 + is_tax_unit_dependent: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # FPG for family of 3 = 26,650 + # FPL ratio = 46,637.50 / 26,650 = 1.75 + # 1.75 < 1.7501, so weekly family share = $0 + # Monthly: $0 + vt_ccfap_family_share: 0 + +- name: Case 9, income just above 175.01 percent FPL triggers 50 dollar share. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 46_640.17 + person2: + age: 5 + is_tax_unit_dependent: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # FPG for family of 3 = 26,650 + # FPL ratio = 46,640.17 / 26,650 = 1.75010... + # 1.7501+ >= 1.7501 threshold => weekly family share = $50 + # Monthly: $50 * 52 / 12 = $216.67 + vt_ccfap_family_share: 216.67 + +- name: Case 10, zero income has zero family share. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPL ratio = 0 / 21,150 = 0.0 + # 0.0 < 1.7501 => weekly family share = $0 + # Monthly: $0 + vt_ccfap_family_share: 0 + +- name: Case 11, income at 250 percent FPL has 100 dollar weekly share. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 52_875 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 21,150 + # FPL ratio = 52,875 / 21,150 = 2.50 + # 2.50 >= 2.2501 but < 2.5001 => weekly family share = $100 + # Monthly: $100 * 52 / 12 = $433.33 + vt_ccfap_family_share: 433.33 + +- name: Case 12, income at 400 percent FPL has 250 dollar weekly share. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 84_600 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 21,150 + # FPL ratio = 84,600 / 21,150 = 4.00 + # 4.00 >= 3.7501 but < 4.0001 => weekly family share = $250 + # Monthly: $250 * 52 / 12 = $1,083.33 + vt_ccfap_family_share: 1_083.33 + +- name: Case 13, income at 500 percent FPL has 350 dollar weekly share. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 105_750 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 21,150 + # FPL ratio = 105,750 / 21,150 = 5.00 + # 5.00 >= 4.7501 but < 5.0001 => weekly family share = $350 + # Monthly: $350 * 52 / 12 = $1,516.67 + vt_ccfap_family_share: 1_516.67 + +- name: Case 14, large family of 8 with low FPL ratio. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 35 + employment_income: 60_000 + person2: + age: 33 + person3: + age: 12 + is_tax_unit_dependent: true + person4: + age: 10 + is_tax_unit_dependent: true + person5: + age: 8 + is_tax_unit_dependent: true + person6: + age: 6 + is_tax_unit_dependent: true + person7: + age: 4 + is_tax_unit_dependent: true + person8: + age: 2 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8] + state_code: VT + output: + # FPG for family of 8 = 15,650 + 7 * 5,500 = 54,150 + # FPL ratio = 60,000 / 54,150 = 1.108 + # 1.108 < 1.7501 => weekly family share = $0 + # Monthly: $0 + vt_ccfap_family_share: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_income_eligible.yaml new file mode 100644 index 00000000000..30e432fd7bf --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_income_eligible.yaml @@ -0,0 +1,305 @@ +- name: Case 1, family of 3 with income below 575 percent FPL. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 100_000 + person2: + age: 5 + is_tax_unit_dependent: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # FPG for family of 3 = 15,650 + 2 * 5,500 = 26,650 + # 575% FPL = 26,650 * 5.75 = 153,237.50 + # Income 100,000 <= 153,237.50 + vt_ccfap_income_eligible: true + +- name: Case 2, family of 3 with income above 575 percent FPL. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 155_000 + person2: + age: 5 + is_tax_unit_dependent: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # FPG for family of 3 = 26,650 + # 575% FPL = 153,237.50 + # Income 155,000 > 153,237.50 + vt_ccfap_income_eligible: false + +- name: Case 3, family of 4 with income at 575 percent FPL. + period: 2025-01 + input: + people: + person1: + age: 35 + employment_income: 184_862.50 + person2: + age: 33 + person3: + age: 5 + is_tax_unit_dependent: true + person4: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3, person4] + state_code: VT + output: + # FPG for family of 4 = 15,650 + 3 * 5,500 = 32,150 + # 575% FPL = 32,150 * 5.75 = 184,862.50 + # Income 184,862.50 <= 184,862.50 + vt_ccfap_income_eligible: true + +- name: Case 4, family of 4 with income just above 575 percent FPL. + period: 2025-01 + input: + people: + person1: + age: 35 + employment_income: 184_863 + person2: + age: 33 + person3: + age: 5 + is_tax_unit_dependent: true + person4: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3, person4] + state_code: VT + output: + # FPG for family of 4 = 32,150 + # 575% FPL = 184,862.50 + # Income 184,863 > 184,862.50 + vt_ccfap_income_eligible: false + +- name: Case 5, zero income is eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # Zero income <= any FPL threshold + vt_ccfap_income_eligible: true + +- name: Case 6, single parent family of 2 at exactly 575 percent FPL. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 121_612.50 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 15,650 + 5,500 = 21,150 + # 575% FPL = 21,150 * 5.75 = 121,612.50 + # Income 121,612.50 <= 121,612.50 => eligible + vt_ccfap_income_eligible: true + +- name: Case 7, single parent family of 2 one dollar above 575 percent FPL. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 121_613 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 21,150 + # 575% FPL = 121,612.50 + # Income 121,613 > 121,612.50 => ineligible + vt_ccfap_income_eligible: false + +- name: Case 8, large family of 8 at 575 percent FPL. + period: 2025-01 + input: + people: + person1: + age: 35 + employment_income: 311_362.50 + person2: + age: 33 + person3: + age: 12 + is_tax_unit_dependent: true + person4: + age: 10 + is_tax_unit_dependent: true + person5: + age: 8 + is_tax_unit_dependent: true + person6: + age: 6 + is_tax_unit_dependent: true + person7: + age: 4 + is_tax_unit_dependent: true + person8: + age: 2 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8] + state_code: VT + output: + # FPG for family of 8 = 15,650 + 7 * 5,500 = 54,150 + # 575% FPL = 54,150 * 5.75 = 311,362.50 + # Income 311,362.50 <= 311,362.50 => eligible + vt_ccfap_income_eligible: true + +- name: Case 9, pre-Oct-2024 at 350 percent FPL limit, income above threshold. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 95_000 + person2: + age: 5 + is_tax_unit_dependent: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # 2024 FPG for family of 3 = 15,060 + 2 * 5,380 = 25,820 + # Pre-April 2024 FPL limit = 350% + # 350% FPL = 25,820 * 3.5 = 90,370 + # Income 95,000 > 90,370 => ineligible + vt_ccfap_income_eligible: false + +- name: Case 10, pre-Oct-2024 at 350 percent FPL limit, income below threshold. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 80_000 + person2: + age: 5 + is_tax_unit_dependent: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # 2024 FPG for family of 3 = 25,820 + # Pre-April 2024 FPL limit = 350% + # 350% FPL = 90,370 + # Income 80,000 <= 90,370 => eligible + vt_ccfap_income_eligible: true + +- name: Case 11, multiple income sources combined. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 50_000 + self_employment_income: 30_000 + pension_income: 10_000 + interest_income: 5_000 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # Countable income = 50,000 + 30,000 + 10,000 + 5,000 = 95,000 + # FPG for family of 2 = 21,150 + # 575% FPL = 121,612.50 + # 95,000 <= 121,612.50 => eligible + vt_ccfap_income_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_provider_type.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_provider_type.yaml new file mode 100644 index 00000000000..eaa7258a8a9 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_provider_type.yaml @@ -0,0 +1,64 @@ +- name: Case 1, day care center maps to licensed center. + period: 2025-01 + input: + people: + person1: + childcare_provider_type_group: DCC_SACC + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_provider_type: [LICENSED_CENTER] + +- name: Case 2, family day care maps to registered home. + period: 2025-01 + input: + people: + person1: + childcare_provider_type_group: FDC_GFDC + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_provider_type: [REGISTERED_HOME] + +- name: Case 3, legally exempt group maps to registered home. + period: 2025-01 + input: + people: + person1: + childcare_provider_type_group: LE_GC + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_provider_type: [REGISTERED_HOME] + +- name: Case 4, informal standard maps to registered home. + period: 2025-01 + input: + people: + person1: + childcare_provider_type_group: LE_STD + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_provider_type: [REGISTERED_HOME] + +- name: Case 5, informal enhanced maps to registered home. + period: 2025-01 + input: + people: + person1: + childcare_provider_type_group: LE_ENH + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_provider_type: [REGISTERED_HOME] diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_state_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_state_rate.yaml new file mode 100644 index 00000000000..3367aaa5356 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_state_rate.yaml @@ -0,0 +1,456 @@ +- name: Case 1, licensed center full time infant. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 1 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # 2025-01-01 is before 2025-07-13, so 2024-06-30 rates apply + # Licensed center, full time, infant = $471 + vt_ccfap_state_rate: [471] + +- name: Case 2, registered home part time school age. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 7 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, part time, school age = $176 + vt_ccfap_state_rate: [176] + +- name: Case 3, licensed center extended care toddler. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 2 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Licensed center, extended care, toddler = $602 + vt_ccfap_state_rate: [602] + +- name: Case 4, registered home full time preschool. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 4 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, full time, preschool = $361 + vt_ccfap_state_rate: [361] + +- name: Case 5, licensed center part time preschool. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 3 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Licensed center, part time, preschool = $240 + vt_ccfap_state_rate: [240] + +- name: Case 6, registered home extended care infant. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 0 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, extended care, infant = $527 + vt_ccfap_state_rate: [527] + +- name: Case 7, licensed center full time school age. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 8 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Licensed center, full time, school age = $371 + vt_ccfap_state_rate: [371] + +- name: Case 8, registered home full time toddler. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 2 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, full time, toddler = $364 + vt_ccfap_state_rate: [364] + +- name: Case 9, registered home part time infant. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 1 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, part time, infant = $212 + vt_ccfap_state_rate: [212] + +- name: Case 10, registered home part time toddler. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 2 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, part time, toddler = $200 + vt_ccfap_state_rate: [200] + +- name: Case 11, registered home part time preschool. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 4 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, part time, preschool = $198 + vt_ccfap_state_rate: [198] + +- name: Case 12, registered home extended care toddler. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 2 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, extended care, toddler = $494 + vt_ccfap_state_rate: [494] + +- name: Case 13, registered home extended care preschool. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 4 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, extended care, preschool = $491 + vt_ccfap_state_rate: [491] + +- name: Case 14, registered home extended care school age. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 8 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, extended care, school age = $436 + vt_ccfap_state_rate: [436] + +- name: Case 15, registered home full time school age. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 7 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, full time, school age = $321 + vt_ccfap_state_rate: [321] + +- name: Case 16, registered home full time infant. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 0 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, full time, infant = $387 + vt_ccfap_state_rate: [387] + +- name: Case 17, licensed center part time infant. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 1 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Licensed center, part time, infant = $258 + vt_ccfap_state_rate: [258] + +- name: Case 18, licensed center part time toddler. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 2 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Licensed center, part time, toddler = $243 + vt_ccfap_state_rate: [243] + +- name: Case 19, licensed center part time school age. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 8 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Licensed center, part time, school age = $204 + vt_ccfap_state_rate: [204] + +- name: Case 20, licensed center extended care preschool. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 4 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Licensed center, extended care, preschool = $597 + vt_ccfap_state_rate: [597] + +- name: Case 21, licensed center extended care school age. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 8 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Licensed center, extended care, school age = $505 + vt_ccfap_state_rate: [505] + +- name: Case 22, licensed center extended care infant. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 0 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Licensed center, extended care, infant = $640 + vt_ccfap_state_rate: [640] + +- name: Case 23, licensed center full time toddler. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 2 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Licensed center, full time, toddler = $443 + vt_ccfap_state_rate: [443] + +- name: Case 24, licensed center full time preschool. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 3 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Licensed center, full time, preschool = $439 + vt_ccfap_state_rate: [439] diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_categorically_exempt.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_categorically_exempt.py new file mode 100644 index 00000000000..f8922f79101 --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_categorically_exempt.py @@ -0,0 +1,29 @@ +from policyengine_us.model_api import * + + +class vt_ccfap_categorically_exempt(Variable): + value_type = bool + entity = SPMUnit + definition_period = MONTH + defined_for = StateCode.VT + label = "Categorically exempt from Vermont CCFAP income test" + reference = ( + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=11", + "https://legislature.vermont.gov/statutes/section/33/035/03512", + ) + + def formula(spm_unit, period, parameters): + # Reach Up (VT TANF) recipients — MONTH variable + reach_up = spm_unit("is_tanf_enrolled", period) + # Protective services — YEAR variable + protective = ( + add( + spm_unit, + period.this_year, + ["receives_or_needs_protective_services"], + ) + > 0 + ) + # Foster care — MONTH variable + foster = add(spm_unit, period, ["is_in_foster_care"]) > 0 + return reach_up | protective | foster diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_eligible.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_eligible.py new file mode 100644 index 00000000000..f3f2ad23c29 --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_eligible.py @@ -0,0 +1,34 @@ +from policyengine_us.model_api import * + + +class vt_ccfap_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = MONTH + defined_for = StateCode.VT + label = "Eligible for Vermont CCFAP" + reference = ( + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=4", + "https://legislature.vermont.gov/statutes/section/33/035/03512", + ) + + def formula(spm_unit, period, parameters): + has_eligible_child = add(spm_unit, period, ["vt_ccfap_eligible_child"]) > 0 + asset_eligible = spm_unit("is_ccdf_asset_eligible", period.this_year) + income_eligible = spm_unit("vt_ccfap_income_eligible", period) + activity_eligible = ( + add( + spm_unit, + period.this_year, + ["is_ccdf_reason_for_care_eligible"], + ) + > 0 + ) + categorically_exempt = spm_unit("vt_ccfap_categorically_exempt", period) + + return ( + has_eligible_child + & asset_eligible + & (activity_eligible | categorically_exempt) + & (income_eligible | categorically_exempt) + ) diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_eligible_child.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_eligible_child.py new file mode 100644 index 00000000000..410f9fa6e17 --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_eligible_child.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class vt_ccfap_eligible_child(Variable): + value_type = bool + entity = Person + definition_period = MONTH + defined_for = StateCode.VT + label = "Eligible child for Vermont CCFAP" + reference = ( + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=4", + "https://legislature.vermont.gov/statutes/section/33/035/03512", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.vt.dcf.ccfap.age_threshold + age = person("age", period.this_year) + has_special_needs = person("is_disabled", period.this_year) + age_limit = where(has_special_needs, p.special_needs, p.base) + 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/vt/dcf/ccfap/eligibility/vt_ccfap_income_eligible.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_income_eligible.py new file mode 100644 index 00000000000..7b41875d07f --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_income_eligible.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class vt_ccfap_income_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = MONTH + defined_for = StateCode.VT + label = "Income eligible for Vermont CCFAP" + reference = ( + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=9", + "https://dcf.vermont.gov/benefits/ccfap/act76-faqs", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.vt.dcf.ccfap.income + countable_income = spm_unit("vt_ccfap_countable_income", period) + fpg = spm_unit("spm_unit_fpg", period) + income_limit = fpg * p.fpl_limit + return countable_income <= income_limit diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap.py new file mode 100644 index 00000000000..d4b3f20fa30 --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class vt_ccfap(Variable): + value_type = float + entity = SPMUnit + unit = USD + definition_period = MONTH + defined_for = "vt_ccfap_eligible" + label = "Vermont Child Care Financial Assistance Program benefit" + reference = ( + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=17", + "https://legislature.vermont.gov/statutes/section/33/035/03512", + ) + + def formula(spm_unit, period, parameters): + person = spm_unit.members + eligible_child = person("vt_ccfap_eligible_child", period) + weekly_rate = person("vt_ccfap_state_rate", period) + total_weekly_rate = spm_unit.sum(weekly_rate * eligible_child) + monthly_rate = total_weekly_rate * WEEKS_IN_YEAR / MONTHS_IN_YEAR + family_share = spm_unit("vt_ccfap_family_share", period) + return max_(monthly_rate - family_share, 0) diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_age_group.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_age_group.py new file mode 100644 index 00000000000..e5fd35be90b --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_age_group.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class VTCCFAPAgeGroup(Enum): + INFANT = "Infant" + TODDLER = "Toddler" + PRESCHOOL = "Preschool" + SCHOOL_AGE = "School Age" + + +class vt_ccfap_age_group(Variable): + value_type = Enum + entity = Person + possible_values = VTCCFAPAgeGroup + default_value = VTCCFAPAgeGroup.INFANT + definition_period = MONTH + defined_for = StateCode.VT + label = "Vermont CCFAP age group" + reference = "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=3" + + def formula(person, period, parameters): + p = parameters(period).gov.states.vt.dcf.ccfap.age_group + age = person("age", period.this_year) + age_months = age * MONTHS_IN_YEAR + return p.months.calc(age_months) diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_care_schedule.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_care_schedule.py new file mode 100644 index 00000000000..cd327510166 --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_care_schedule.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class VTCCFAPCareSchedule(Enum): + PART_TIME = "Part Time" + FULL_TIME = "Full Time" + EXTENDED_CARE = "Extended Care" + + +class vt_ccfap_care_schedule(Variable): + value_type = Enum + entity = Person + possible_values = VTCCFAPCareSchedule + default_value = VTCCFAPCareSchedule.FULL_TIME + definition_period = MONTH + defined_for = StateCode.VT + label = "Vermont CCFAP care schedule" + reference = "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-State-Rates.pdf" + + def formula(person, period, parameters): + p = parameters(period).gov.states.vt.dcf.ccfap.care_schedule + hours = person("childcare_hours_per_week", period.this_year) + return p.hours.calc(hours) diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_countable_income.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_countable_income.py new file mode 100644 index 00000000000..db27a5ca910 --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_countable_income.py @@ -0,0 +1,13 @@ +from policyengine_us.model_api import * + + +class vt_ccfap_countable_income(Variable): + value_type = float + entity = SPMUnit + unit = USD + definition_period = MONTH + defined_for = StateCode.VT + label = "Vermont CCFAP countable income" + reference = "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=9" + + adds = "gov.states.vt.dcf.ccfap.income.sources" diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_family_share.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_family_share.py new file mode 100644 index 00000000000..70fee0721be --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_family_share.py @@ -0,0 +1,26 @@ +from policyengine_us.model_api import * + + +class vt_ccfap_family_share(Variable): + value_type = float + entity = SPMUnit + unit = USD + definition_period = MONTH + defined_for = StateCode.VT + label = "Vermont CCFAP monthly family share (copayment)" + reference = ( + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/Benefits/CCFAP-Income-Guidelines.pdf", + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=17", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.vt.dcf.ccfap + income = spm_unit("vt_ccfap_countable_income", period) + fpg = spm_unit("spm_unit_fpg", period) + fpl_ratio = income / fpg + + exempt = spm_unit("vt_ccfap_categorically_exempt", period) + + weekly_share = p.family_share.scale.calc(fpl_ratio) + monthly_share = weekly_share * WEEKS_IN_YEAR / MONTHS_IN_YEAR + return where(exempt, 0, monthly_share) diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_provider_type.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_provider_type.py new file mode 100644 index 00000000000..7d6e5bc3a05 --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_provider_type.py @@ -0,0 +1,26 @@ +from policyengine_us.model_api import * + + +class VTCCFAPProviderType(Enum): + LICENSED_CENTER = "Licensed Center" + REGISTERED_HOME = "Registered Family Child Care Home" + + +class vt_ccfap_provider_type(Variable): + value_type = Enum + entity = Person + possible_values = VTCCFAPProviderType + default_value = VTCCFAPProviderType.LICENSED_CENTER + definition_period = MONTH + defined_for = StateCode.VT + label = "Vermont CCFAP provider type" + reference = "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-State-Rates.pdf" + + def formula(person, period, parameters): + provider_group = person("childcare_provider_type_group", period.this_year) + is_center = provider_group == provider_group.possible_values.DCC_SACC + return where( + is_center, + VTCCFAPProviderType.LICENSED_CENTER, + VTCCFAPProviderType.REGISTERED_HOME, + ) diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_state_rate.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_state_rate.py new file mode 100644 index 00000000000..6857fdeadc5 --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_state_rate.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class vt_ccfap_state_rate(Variable): + value_type = float + entity = Person + unit = USD + definition_period = MONTH + defined_for = "vt_ccfap_eligible_child" + label = "Vermont CCFAP state reimbursement rate per child" + reference = ( + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-State-Rates.pdf", + "https://outside.vermont.gov/dept/DCF/Policies%20Procedures%20Guidance/CDD-Guidance-CCFAP-Capped-Rates.pdf", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.vt.dcf.ccfap.rates + provider_type = person("vt_ccfap_provider_type", period) + care_schedule = person("vt_ccfap_care_schedule", period) + age_group = person("vt_ccfap_age_group", period) + is_center = provider_type == provider_type.possible_values.LICENSED_CENTER + center_rate = p.licensed_center[care_schedule][age_group] + home_rate = p.registered_home[care_schedule][age_group] + return where(is_center, center_rate, home_rate) diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_child_care_subsidies.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_child_care_subsidies.py new file mode 100644 index 00000000000..bf9b450ac4f --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_child_care_subsidies.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class vt_child_care_subsidies(Variable): + value_type = float + entity = SPMUnit + label = "Vermont child care subsidies" + unit = USD + definition_period = YEAR + defined_for = StateCode.VT + adds = ["vt_ccfap"] diff --git a/uv.lock b/uv.lock index efec4d8555d..7adaf13620b 100644 --- a/uv.lock +++ b/uv.lock @@ -1492,7 +1492,7 @@ wheels = [ [[package]] name = "policyengine-us" -version = "1.592.1" +version = "1.598.0" source = { editable = "." } dependencies = [ { name = "microdf-python" },