From 121a68d7cdddb5ad6dc5f6a20adcecd1415b16ca Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 6 Apr 2026 13:49:48 -0400 Subject: [PATCH 01/10] Add changelog entry for Virginia CCAP Co-Authored-By: Claude Opus 4.6 (1M context) --- changelog.d/va-ccap.added.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/va-ccap.added.md diff --git a/changelog.d/va-ccap.added.md b/changelog.d/va-ccap.added.md new file mode 100644 index 00000000000..9713f142a02 --- /dev/null +++ b/changelog.d/va-ccap.added.md @@ -0,0 +1 @@ +Add Virginia Child Care Assistance Program (CCAP). From 2ad922cd07326cc280fa4ab883bde54ef13e4ede Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 6 Apr 2026 15:07:25 -0400 Subject: [PATCH 02/10] Implement Virginia CCSP (ref #7932) Co-Authored-By: Claude Opus 4.6 (1M context) --- .../hhs/ccdf/child_care_subsidy_programs.yaml | 1 + .../household/household_state_benefits.yaml | 4 + .../dss/ccsp/activity/min_hours_per_week.yaml | 13 + .../va/dss/ccsp/age_threshold/child.yaml | 13 + .../ccsp/age_threshold/disabled_child.yaml | 13 + .../va/dss/ccsp/copay/income_cap_rate.yaml | 14 + .../va/dss/ccsp/copay/max_children.yaml | 11 + .../va/dss/ccsp/copay/per_child_scale.yaml | 67 +++ .../ccsp/income/countable_income/sources.yaml | 33 ++ .../income/countable_income/subtracts.yaml | 12 + .../va/dss/ccsp/income/exit_smi_rate.yaml | 13 + .../income/initial_eligibility_fpg_rate.yaml | 20 + .../income/young_child_age_threshold.yaml | 13 + .../dss/ccsp/income/young_child_smi_rate.yaml | 13 + .../ccsp/qualified_immigration_statuses.yaml | 19 + .../dss/ccsp/edge_cases/integration_edge.yaml | 378 +++++++++++++ .../va_ccsp_activity_eligible_edge.yaml | 166 ++++++ .../va_ccsp_child_eligible_edge.yaml | 179 ++++++ .../edge_cases/va_ccsp_copay_2025_07.yaml | 187 +++++++ .../ccsp/edge_cases/va_ccsp_copay_edge.yaml | 522 ++++++++++++++++++ .../va/dss/ccsp/edge_cases/va_ccsp_edge.yaml | 217 ++++++++ .../va_ccsp_income_eligible_edge.yaml | 408 ++++++++++++++ .../gov/states/va/dss/ccsp/integration.yaml | 364 ++++++++++++ .../gov/states/va/dss/ccsp/va_ccsp.yaml | 134 +++++ .../dss/ccsp/va_ccsp_activity_eligible.yaml | 132 +++++ .../va/dss/ccsp/va_ccsp_child_eligible.yaml | 186 +++++++ .../gov/states/va/dss/ccsp/va_ccsp_copay.yaml | 204 +++++++ .../va/dss/ccsp/va_ccsp_countable_income.yaml | 114 ++++ .../states/va/dss/ccsp/va_ccsp_eligible.yaml | 130 +++++ .../va/dss/ccsp/va_ccsp_income_eligible.yaml | 213 +++++++ .../gov/states/va/dss/ccsp/va_ccsp.py | 19 + .../va/dss/ccsp/va_ccsp_activity_eligible.py | 23 + .../va/dss/ccsp/va_ccsp_child_eligible.py | 25 + .../gov/states/va/dss/ccsp/va_ccsp_copay.py | 45 ++ .../va/dss/ccsp/va_ccsp_countable_income.py | 17 + .../states/va/dss/ccsp/va_ccsp_eligible.py | 21 + .../states/va/dss/ccsp/va_ccsp_enrolled.py | 13 + .../va/dss/ccsp/va_ccsp_income_eligible.py | 48 ++ .../va/dss/ccsp/va_ccsp_income_test_waived.py | 19 + .../va/dss/ccsp/va_ccsp_locality_group.py | 21 + .../va/dss/ccsp/va_child_care_subsidies.py | 11 + sources/working_references.md | 483 +++++++++------- 42 files changed, 4326 insertions(+), 212 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/activity/min_hours_per_week.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/child.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/disabled_child.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/copay/income_cap_rate.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/copay/max_children.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/copay/per_child_scale.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/sources.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/subtracts.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/income/exit_smi_rate.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/income/initial_eligibility_fpg_rate.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_age_threshold.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_smi_rate.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/qualified_immigration_statuses.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/integration_edge.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_activity_eligible_edge.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_child_eligible_edge.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_2025_07.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_edge.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_edge.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_income_eligible_edge.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/integration.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_child_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_copay.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_countable_income.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_income_eligible.yaml create mode 100644 policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp.py create mode 100644 policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.py create mode 100644 policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_child_eligible.py create mode 100644 policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_copay.py create mode 100644 policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_countable_income.py create mode 100644 policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_eligible.py create mode 100644 policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_enrolled.py create mode 100644 policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_eligible.py create mode 100644 policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_test_waived.py create mode 100644 policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_locality_group.py create mode 100644 policyengine_us/variables/gov/states/va/dss/ccsp/va_child_care_subsidies.py 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 4050e47c83e..e7d7a987760 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 @@ -11,6 +11,7 @@ values: - nh_child_care_subsidies # New Hampshire Child Care Scholarship Program - pa_child_care_subsidies # Pennsylvania Child Care Works - ri_child_care_subsidies # Rhode Island Child Care Assistance Program + - va_child_care_subsidies # Virginia Child Care Subsidy Program metadata: unit: list diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index eb8c9cd5676..af75169ee46 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -26,6 +26,8 @@ values: - ak_ssp # Nebraska benefits - ne_child_care_subsidies + # Virginia benefits + - va_child_care_subsidies # Massachusetts benefits - ma_eaedc - ma_tafdc @@ -55,6 +57,8 @@ values: - ak_ssp # Nebraska benefits - ne_child_care_subsidies + # Virginia benefits + - va_child_care_subsidies # North Carolina benefits - nc_scca # Massachusetts benefits diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/activity/min_hours_per_week.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/activity/min_hours_per_week.yaml new file mode 100644 index 00000000000..c67285d379f --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/activity/min_hours_per_week.yaml @@ -0,0 +1,13 @@ +description: Virginia sets this amount as the minimum weekly hours of approved activity under the Child Care Subsidy Program. +values: + 2023-08-01: 20 + +metadata: + unit: hour + period: year + label: Virginia CCSP minimum weekly activity hours + reference: + - title: 8VAC20-790-30 + href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section30/ + - title: Child Care Subsidy Program Guidance Manual Section 2 + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=22 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/child.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/child.yaml new file mode 100644 index 00000000000..d4e43c69c7f --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/child.yaml @@ -0,0 +1,13 @@ +description: Virginia limits the Child Care Subsidy Program to children younger than this age. +values: + 2023-01-01: 13 + +metadata: + unit: year + period: year + label: Virginia CCSP child age threshold + reference: + - title: 8VAC20-790-20(A) + href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section20/ + - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.3.1 + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=82 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/disabled_child.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/disabled_child.yaml new file mode 100644 index 00000000000..7f4bceb1bc6 --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/disabled_child.yaml @@ -0,0 +1,13 @@ +description: Virginia limits the Child Care Subsidy Program to children with special needs younger than this age. +values: + 2023-01-01: 18 + +metadata: + unit: year + period: year + label: Virginia CCSP disabled child age threshold + reference: + - title: 8VAC20-790-20(B) + href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section20/ + - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.3.1 + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=82 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/income_cap_rate.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/income_cap_rate.yaml new file mode 100644 index 00000000000..a963694f0ed --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/income_cap_rate.yaml @@ -0,0 +1,14 @@ +description: Virginia limits the family copayment to this share of gross countable income under the Child Care Subsidy Program. +values: + 2023-01-01: 0.07 + 2025-07-01: 0.05 + +metadata: + unit: /1 + period: year + label: Virginia CCSP copayment income cap rate + reference: + - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.5 + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=100 + - title: Budget Amendment HB30 Item 126 #2h + href: https://budget.lis.virginia.gov/amendment/2024/2/HB30/Enrolled/CR/126/2h/ diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/max_children.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/max_children.yaml new file mode 100644 index 00000000000..3b749bda586 --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/max_children.yaml @@ -0,0 +1,11 @@ +description: Virginia sets this maximum number of children assessed copayments under the Child Care Subsidy Program. +values: + 2023-01-01: 3 + +metadata: + unit: person + period: year + label: Virginia CCSP maximum children assessed copayment + reference: + - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.5 + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=100 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/per_child_scale.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/per_child_scale.yaml new file mode 100644 index 00000000000..b34d979e9b4 --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/per_child_scale.yaml @@ -0,0 +1,67 @@ +description: Virginia sets this per-child monthly copayment based on the family's income as a share of the federal poverty guideline under the Child Care Subsidy Program. + +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + period: month + label: Virginia CCSP per-child copayment scale + reference: + - title: Virginia Child Care Subsidy Program Guidance Manual Appendix B + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=137 + - title: FY26 Copayment One Pager + href: https://childcare.virginia.gov/practitioners/subsidy-program + +brackets: + # 0% FPG (income = $0): $0 copay in both eras + - threshold: + 2023-01-01: 0 + amount: + 2023-01-01: 0 + # >$0 to 100% FPG: $0 (2023), $5 (2025-07-01) + # Use .inf in 2023 so this bracket is unreachable (0-100% stays $0) + - threshold: + 2023-01-01: .inf + 2025-07-01: 0.0001 + amount: + 2023-01-01: 0 + 2025-07-01: 5 + # >100% FPG: $60 (2023), split into two brackets in 2025 + - threshold: + 2023-01-01: 1.0001 + amount: + 2023-01-01: 60 + 2025-07-01: 125 + # >150% FPG: new bracket in 2025 + - threshold: + 2023-01-01: .inf + 2025-07-01: 1.5001 + amount: + 2023-01-01: 0 + 2025-07-01: 175 + # >200% FPG + - threshold: + 2023-01-01: 2.0001 + amount: + 2023-01-01: 120 + 2025-07-01: 225 + # >250% FPG: new bracket in 2025 + - threshold: + 2023-01-01: .inf + 2025-07-01: 2.5001 + amount: + 2023-01-01: 0 + 2025-07-01: 275 + # >300% FPG + - threshold: + 2023-01-01: 3.0001 + amount: + 2023-01-01: 180 + 2025-07-01: 325 + # >350% FPG: new bracket in 2025 + - threshold: + 2023-01-01: .inf + 2025-07-01: 3.5001 + amount: + 2023-01-01: 0 + 2025-07-01: 375 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/sources.yaml new file mode 100644 index 00000000000..9fcc5444a95 --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/sources.yaml @@ -0,0 +1,33 @@ +description: Virginia counts these income sources as countable income under the Child Care Subsidy Program. +values: + 2023-01-01: + - employment_income + - self_employment_income + - child_support_received + - social_security + - pension_income + - unemployment_compensation + - workers_compensation + - veterans_benefits + - disability_benefits + - interest_income + - dividend_income + - rental_income + - alimony_income + # The following are excluded income per 8VAC20-790-40(C)(1): + # ssi, tanf, snap, school meals, eitc, lump sums, + # education scholarships/loans/grants, tax refunds, + # monetary gifts, vendor payments, loans, capital gains, + # GI Bill benefits, reimbursements, Holocaust restitution, + # Agent Orange settlements, temporary census earnings, + # earnings of child under 18, earnings under $25/month + +metadata: + unit: list + period: year + label: Virginia CCSP countable income sources + reference: + - title: 8VAC20-790-40(C)(1) + href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/ + - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.4.1 + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=86 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/subtracts.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/subtracts.yaml new file mode 100644 index 00000000000..f15f9161e17 --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/subtracts.yaml @@ -0,0 +1,12 @@ +description: Virginia deducts these income sources from countable income under the Child Care Subsidy Program. +values: + 2023-01-01: + - child_support_expense + +metadata: + unit: list + period: year + label: Virginia CCSP countable income deductions + reference: + - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.4.1 + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=86 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/exit_smi_rate.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/exit_smi_rate.yaml new file mode 100644 index 00000000000..d536b62f3ad --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/exit_smi_rate.yaml @@ -0,0 +1,13 @@ +description: Virginia limits income at redetermination to this share of the state median income under the Child Care Subsidy Program. +values: + 2023-01-01: 0.85 + +metadata: + unit: /1 + period: year + label: Virginia CCSP exit income SMI rate + reference: + - title: 8VAC20-790-40(D) + href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/ + - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.4.5 + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=98 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/initial_eligibility_fpg_rate.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/initial_eligibility_fpg_rate.yaml new file mode 100644 index 00000000000..e91060e7988 --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/initial_eligibility_fpg_rate.yaml @@ -0,0 +1,20 @@ +description: Virginia limits initial income eligibility to this share of the federal poverty guideline by locality group under the Child Care Subsidy Program. + +metadata: + unit: /1 + period: year + label: Virginia CCSP initial eligibility FPG rate by locality group + breakdown: + - va_ccsp_locality_group + reference: + - title: 8VAC20-790-40(C)(1) + href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/ + - title: Virginia Child Care Subsidy Program Guidance Manual Appendix A + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=136 + +GROUP_I: + 2023-01-01: 1.5 +GROUP_II: + 2023-01-01: 1.6 +GROUP_III: + 2023-01-01: 1.85 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_age_threshold.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_age_threshold.yaml new file mode 100644 index 00000000000..ce1a77826ea --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_age_threshold.yaml @@ -0,0 +1,13 @@ +description: Virginia sets this age threshold for the young child income eligibility exception under the Child Care Subsidy Program. +values: + 2023-01-01: 5 + +metadata: + unit: year + period: year + label: Virginia CCSP young child age threshold + reference: + - title: 8VAC20-790-40(C)(2) + href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/ + - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.4.2 + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=92 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_smi_rate.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_smi_rate.yaml new file mode 100644 index 00000000000..dbec2656bec --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_smi_rate.yaml @@ -0,0 +1,13 @@ +description: Virginia limits income to this share of the state median income for families with a child age five or younger under the Child Care Subsidy Program. +values: + 2023-01-01: 0.85 + +metadata: + unit: /1 + period: year + label: Virginia CCSP young child SMI rate + reference: + - title: 8VAC20-790-40(C)(2) + href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/ + - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.4.2 + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=92 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/qualified_immigration_statuses.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/qualified_immigration_statuses.yaml new file mode 100644 index 00000000000..570e06bc5bd --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/qualified_immigration_statuses.yaml @@ -0,0 +1,19 @@ +description: Virginia limits the Child Care Subsidy Program to children of these immigration statuses. +values: + 2023-01-01: + - CITIZEN + - LEGAL_PERMANENT_RESIDENT + - REFUGEE + - ASYLEE + - PAROLED_ONE_YEAR + - DEPORTATION_WITHHELD + +metadata: + label: Virginia CCSP qualified immigration statuses + period: year + unit: list + reference: + - title: 8VAC20-790-40(B)(1) + href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/ + - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.3.3 + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=84 diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/integration_edge.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/integration_edge.yaml new file mode 100644 index 00000000000..15a674fd85e --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/integration_edge.yaml @@ -0,0 +1,378 @@ +# Virginia CCSP edge case integration tests +# Full pipeline verification with boundary conditions +# +# 2024 FPG: first_person = 15,060, additional = 5,380 +# Family of 2: 20,440 Family of 3: 25,820 +# 2024 VA SMI base: 121,130 (effective 2023-10-01) +# SMI size adj: first_person=0.52, second_to_sixth=0.16 +# Size 2: 121,130*0.68 = 82,368.40 +# 85% SMI size 2: 70,013.14 +# +# Current copay: $0/$0/$60/$60/$120/$120/$180/$180 +# Income cap: 7%, max children: 3 + +- name: Case 1, Group I boundary income $1 below 150% FPG with young child SMI fallback. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 30_659 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 12_000 + va_ccsp_locality_group: GROUP_I + households: + household: + members: [person1, person2] + state_code: VA + output: + # === Child eligibility === + va_ccsp_child_eligible: [false, true] + + # === Income === + # Countable: 30,659/12 = 2,554.92/month + va_ccsp_countable_income: 2_554.92 + + # Group I: 150% FPG = 30,660 + # Young child (age 4 <= 5): also check 85% SMI = 70,013.14 + # Use max(30,660, 70,013.14) = 70,013.14 + # 30,659 <= 70,013.14 -> eligible + va_ccsp_income_eligible: true + va_ccsp_eligible: true + + # === Copay === + # Monthly FPG: 20,440/12 = 1,703.33 + # FPG ratio: 2,554.92/1,703.33 = 1.5000 -> $60/child + # 1 child, scale total = $60 + # Income cap: 30,659 * 0.07/12 = 178.84 + # Copay: min(60, 178.84) = $60 + va_ccsp_copay: 60 + + # === Benefit === + # Monthly expenses: 12,000/12 = 1,000 + # Benefit: max(1,000 - 60, 0) = $940 + va_ccsp: 940 + +- name: Case 2, Group I $1 above 150% FPG with older child, no SMI fallback. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 30_661 + immigration_status: CITIZEN + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 10_000 + va_ccsp_locality_group: GROUP_I + households: + household: + members: [person1, person2] + state_code: VA + output: + va_ccsp_child_eligible: [false, true] + + # Group I: 150% FPG = 30,660 + # No young child -> no SMI fallback + # 30,661 > 30,660 -> ineligible + va_ccsp_income_eligible: false + va_ccsp_eligible: false + + # Ineligible -> $0 + va_ccsp: 0 + +- name: Case 3, enrolled family at exact 85% SMI boundary. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 70_013 + immigration_status: CITIZEN + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 18_000 + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_I + households: + household: + members: [person1, person2] + state_code: VA + output: + va_ccsp_child_eligible: [false, true] + + # === Income === + # Countable: 70,013/12 = 5,834.42/month + va_ccsp_countable_income: 5_834.42 + + # Enrolled -> 85% SMI = 70,013.14 + # 70,013 <= 70,013.14 -> eligible + va_ccsp_income_eligible: true + va_ccsp_eligible: true + + # === Copay === + # FPG ratio: 5,834.42/1,703.33 = 3.4253 -> $180/child + # 1 child * $180 = $180 + # Income cap: 70,013 * 0.07/12 = 408.41 + # Copay: min(180, 408.41) = $180 + va_ccsp_copay: 180 + + # === Benefit === + # Monthly expenses: 18,000/12 = 1,500 + # Benefit: max(1,500 - 180, 0) = $1,320 + va_ccsp: 1_320 + +- name: Case 4, 4 children copay capped at 3 with income cap binding. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 72_000 + immigration_status: CITIZEN + person2: + age: 11 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person3: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person4: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person5: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3, person4, person5] + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + spm_unit_pre_subsidy_childcare_expenses: 30_000 + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: VA + output: + # === Child eligibility === + # All 4 children: ages 11,8,5,3 all < 13, citizen -> eligible + va_ccsp_child_eligible: [false, true, true, true, true] + + # === Income === + # Countable: 72,000/12 = 6,000/month + va_ccsp_countable_income: 6_000 + + # Enrolled -> 85% SMI + # FPG size 5: 36,580 + # SMI size 5: 121,130 * 1.16 = 140,510.80 + # 85% SMI = 119,434.18 + # 72,000 <= 119,434.18 -> eligible + va_ccsp_income_eligible: true + va_ccsp_eligible: true + + # === Copay === + # Monthly FPG size 5: 36,580/12 = 3,048.33 + # FPG ratio: 6,000/3,048.33 = 1.9683 -> $60/child (still in 100-200% bracket) + # 4 eligible children, capped at 3 + # Scale total: $60 * 3 = $180 + # Income cap: 72,000 * 0.07/12 = 420 + # Copay: min(180, 420) = $180 + va_ccsp_copay: 180 + + # === Benefit === + # Monthly expenses: 30,000/12 = 2,500 + # Benefit: max(2,500 - 180, 0) = $2,320 + va_ccsp: 2_320 + +- name: Case 5, young child age 5 vs age 6 sibling difference. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 48_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person3: + age: 6 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_pre_subsidy_childcare_expenses: 18_000 + va_ccsp_locality_group: GROUP_I + households: + household: + members: [person1, person2, person3] + state_code: VA + output: + va_ccsp_child_eligible: [false, true, true] + + # === Income === + # Countable: 48,000/12 = 4,000/month + va_ccsp_countable_income: 4_000 + + # Group I: 150% FPG size 3 = 25,820 * 1.5 = 38,730 + # Has young child (age 5 <= 5): 85% SMI + # SMI size 3: 121,130 * 0.84 = 101,749.20 + # 85% SMI = 86,486.82 + # Use max(38,730, 86,486.82) = 86,486.82 + # 48,000 <= 86,486.82 -> eligible + va_ccsp_income_eligible: true + va_ccsp_eligible: true + + # === Copay === + # Monthly FPG size 3: 25,820/12 = 2,151.67 + # FPG ratio: 4,000/2,151.67 = 1.8590 -> $60/child + # 2 children, scale total = $60 * 2 = $120 + # Income cap: 48,000 * 0.07/12 = 280 + # Copay: min(120, 280) = $120 + va_ccsp_copay: 120 + + # === Benefit === + # Monthly expenses: 18,000/12 = 1,500 + # Benefit: max(1,500 - 120, 0) = $1,380 + va_ccsp: 1_380 + +- name: Case 6, disabled child age 15 still eligible. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + employment_income: 24_000 + immigration_status: CITIZEN + person2: + age: 15 + is_tax_unit_dependent: true + is_disabled: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 12_000 + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Disabled child age 15 < 18 -> eligible child + va_ccsp_child_eligible: [false, true] + + va_ccsp_countable_income: 2_000 + va_ccsp_income_eligible: true + va_ccsp_eligible: true + + # Monthly FPG: 20,440/12 = 1,703.33 + # FPG ratio: 2,000/1,703.33 = 1.1741 -> $60/child + # 1 child * $60 = $60 + # Income cap: 24,000 * 0.07/12 = 140 + # Copay: min(60, 140) = $60 + va_ccsp_copay: 60 + + # Monthly expenses: 12,000/12 = 1,000 + # Benefit: max(1,000 - 60, 0) = $940 + va_ccsp: 940 + +- name: Case 7, WIC-eligible child waives income test for high-income family. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 120_000 + immigration_status: CITIZEN + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + receives_wic: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 18_000 + va_ccsp_locality_group: GROUP_I + households: + household: + members: [person1, person2] + state_code: VA + output: + va_ccsp_child_eligible: [false, true] + + # === Income === + va_ccsp_countable_income: 10_000 + + # Group I: 150% FPG = 30,660 + # Young child exception: 85% SMI = 70,013.14 + # max(30,660, 70,013.14) = 70,013.14 + # 120,000 > 70,013.14 -> income test fails + # BUT WIC eligible -> income waived + va_ccsp_income_test_waived: true + va_ccsp_income_eligible: true + va_ccsp_eligible: true + + # === Copay === + # Monthly income: 120,000/12 = 10,000 + # Monthly FPG: 20,440/12 = 1,703.33 + # FPG ratio: 10,000/1,703.33 = 5.8708 -> $180/child (highest bracket) + # 1 child * $180 = $180 + # Income cap: 120,000 * 0.07/12 = 700 + # Copay: min(180, 700) = $180 + va_ccsp_copay: 180 + + # Monthly expenses: 18,000/12 = 1,500 + # Benefit: max(1,500 - 180, 0) = $1,320 + va_ccsp: 1_320 diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_activity_eligible_edge.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_activity_eligible_edge.yaml new file mode 100644 index 00000000000..c524a6ba3d1 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_activity_eligible_edge.yaml @@ -0,0 +1,166 @@ +# Virginia CCSP activity eligibility edge case tests +# Focus: zero hours worked, exactly 1 hour, two-parent mixed, child hours ignored +# +# Activity test: all heads/spouses must have (weekly_hours_worked >= 20) OR is_in_k12_school + +- name: Case 1, parent with exactly 20 hours worked (at threshold). + period: 2024-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 20 + person2: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + # 20 >= 20 -> meets activity requirement + va_ccsp_activity_eligible: true + +- name: Case 2, parent with zero hours and not in school. + period: 2024-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 0 + is_in_k12_school: false + person2: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + # 0 hours, not in school -> fails + va_ccsp_activity_eligible: false + +- name: Case 3, two parents where one works and one is in school. + period: 2024-01 + input: + people: + person1: + age: 35 + weekly_hours_worked: 40 + is_in_k12_school: false + person2: + age: 30 + weekly_hours_worked: 0 + is_in_k12_school: true + person3: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: VA + output: + # Person1: works 40hrs -> active + # Person2: in school -> active + # Both parents active -> eligible + va_ccsp_activity_eligible: true + +- name: Case 4, child hours do not affect activity test. + period: 2024-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 20 + person2: + age: 10 + is_tax_unit_dependent: true + weekly_hours_worked: 0 + is_in_k12_school: false + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + # Only heads/spouses matter for activity test + # Child's zero hours are irrelevant + # Person1 works 20hrs -> active + va_ccsp_activity_eligible: true + +- name: Case 5, two parents both zero hours both not in school. + period: 2024-01 + input: + people: + person1: + age: 35 + weekly_hours_worked: 0 + is_in_k12_school: false + person2: + age: 33 + weekly_hours_worked: 0 + is_in_k12_school: false + person3: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: VA + output: + # Both parents fail activity test + va_ccsp_activity_eligible: false + +- name: Case 6, single parent in school with zero work hours. + period: 2024-01 + input: + people: + person1: + age: 22 + weekly_hours_worked: 0 + is_in_k12_school: true + person2: + age: 1 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + # In school -> active, even with zero work hours + va_ccsp_activity_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_child_eligible_edge.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_child_eligible_edge.yaml new file mode 100644 index 00000000000..5318810593f --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_child_eligible_edge.yaml @@ -0,0 +1,179 @@ +# Virginia CCSP child eligibility edge case tests +# Focus: age boundaries (12/13 for normal, 17/18 for disabled), newborn, non-dependent + +- name: Case 1, child age 12 just under threshold. + period: 2024-01 + input: + people: + person1: + age: 35 + person2: + age: 12 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + # age 12 < 13 -> eligible + va_ccsp_child_eligible: [false, true] + +- name: Case 2, newborn age 0. + period: 2024-01 + input: + people: + person1: + age: 25 + person2: + age: 0 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + # age 0 < 13 -> eligible + va_ccsp_child_eligible: [false, true] + +- name: Case 3, disabled child age 17 just under threshold. + period: 2024-01 + input: + people: + person1: + age: 45 + person2: + age: 17 + is_tax_unit_dependent: true + is_disabled: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + # disabled, age 17 < 18 -> eligible + va_ccsp_child_eligible: [false, true] + +- name: Case 4, disabled child age 13 still eligible. + period: 2024-01 + input: + people: + person1: + age: 40 + person2: + age: 13 + is_tax_unit_dependent: true + is_disabled: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + # disabled, age 13 < 18 -> eligible (would be ineligible if not disabled) + va_ccsp_child_eligible: [false, true] + +- name: Case 5, non-disabled child age 13 is ineligible but disabled same-age is eligible. + period: 2024-01 + input: + people: + person1: + age: 40 + person2: + age: 13 + is_tax_unit_dependent: true + is_disabled: false + immigration_status: CITIZEN + person3: + age: 13 + is_tax_unit_dependent: true + is_disabled: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: VA + output: + # person2: age 13, not disabled -> 13 >= 13 -> ineligible + # person3: age 13, disabled -> 13 < 18 -> eligible + va_ccsp_child_eligible: [false, false, true] + +- name: Case 6, dependent child who is a legal permanent resident. + period: 2024-01 + input: + people: + person1: + age: 35 + person2: + age: 6 + is_tax_unit_dependent: true + immigration_status: LEGAL_PERMANENT_RESIDENT + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + # LPR is a qualified immigrant -> eligible + va_ccsp_child_eligible: [false, true] + +- name: Case 7, child under 13 but not a dependent. + period: 2024-01 + input: + people: + person1: + age: 35 + person2: + age: 10 + is_tax_unit_dependent: false + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + # Not a dependent -> ineligible even though age < 13 + va_ccsp_child_eligible: [false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_2025_07.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_2025_07.yaml new file mode 100644 index 00000000000..8feb0656fa2 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_2025_07.yaml @@ -0,0 +1,187 @@ +# Virginia CCSP copay tests for 2025-07-01 new scale +# The new copay scale takes effect 2025-07-01 (HB30 Item 126 #2h) +# We test with period 2025-01 which uses the OLD scale parameters +# because YAML tests can only use YYYY-01 or YYYY period formats. +# +# The 2025-07-01 scale has new bracket thresholds: +# 0: $0, >0-100%: $5, >100-150%: $125, >150-200%: $175, +# >200-250%: $225, >250-300%: $275, >300-350%: $325, >350%+: $375 +# Income cap changes from 7% to 5% on 2025-07-01 +# +# Since test periods are limited to 2025-01 (old scale) or 2025 (annual), +# the 2025-07-01 parameters are NOT testable via standard YAML period format. +# These tests verify the OLD scale still applies correctly at 2025-01. +# +# 2025 FPG: first_person = 15,650, additional = 5,500 +# Family of 2: 21,150 +# Monthly FPG: 21,150/12 = 1,762.50 + +- name: Case 1, 2025 old scale zero income. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Zero income -> FPG ratio = 0 -> $0/child + va_ccsp_copay: 0 + +- name: Case 2, 2025 old scale above 100% FPG. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Monthly income: 24,000/12 = 2,000 + # Monthly FPG: 21,150/12 = 1,762.50 + # FPG ratio: 2,000/1,762.50 = 1.1348 -> old scale >100% = $60 + # 1 child * $60 = $60 + # Income cap: 24,000 * 0.07 / 12 = 140 + # Copay: min(60, 140) = $60 + va_ccsp_copay: 60 + +- name: Case 3, 2025 old scale above 200% FPG. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 48_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Monthly income: 48,000/12 = 4,000 + # Monthly FPG: 21,150/12 = 1,762.50 + # FPG ratio: 4,000/1,762.50 = 2.2695 -> old scale >200% = $120 + # 1 child * $120 = $120 + # Income cap: 48,000 * 0.07 / 12 = 280 + # Copay: min(120, 280) = $120 + va_ccsp_copay: 120 + +- name: Case 4, 2025 old scale above 300% FPG. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 72_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Monthly income: 72,000/12 = 6,000 + # Monthly FPG: 21,150/12 = 1,762.50 + # FPG ratio: 6,000/1,762.50 = 3.4043 -> old scale >300% = $180 + # 1 child * $180 = $180 + # Income cap: 72,000 * 0.07 / 12 = 420 + # Copay: min(180, 420) = $180 + va_ccsp_copay: 180 + +- name: Case 5, 2025 old scale 5% income cap NOT yet in effect. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 84_000 + immigration_status: CITIZEN + person2: + age: 10 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person3: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person4: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2, person3, person4] + state_code: VA + output: + # Monthly income: 84,000/12 = 7,000 + # FPG size 4: 32,150, monthly = 2,679.17 + # FPG ratio: 7,000/2,679.17 = 2.6128 -> old scale >200% = $120 + # 3 eligible children, scale total: $120 * 3 = $360 + # Income cap: 84,000 * 0.07 / 12 = 490 (still 7% in Jan 2025) + # Copay: min(360, 490) = $360 + va_ccsp_copay: 360 diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_edge.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_edge.yaml new file mode 100644 index 00000000000..bfc2e9d532b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_edge.yaml @@ -0,0 +1,522 @@ +# Virginia CCSP copay edge case tests +# Focus: copay bracket boundaries, income cap binding vs not, max children cap, +# 2025-07 new copay scale tests +# +# 2024 FPG (contiguous US): Family of 2: 20,440 +# Monthly FPG: 20,440/12 = 1,703.333... +# +# Current copay scale (2023-01-01): +# 0: $0, >0-100%: $0, >100-200%: $60, >200-300%: $120, >300%+: $180 +# Income cap: 7% +# Max children: 3 +# +# New copay scale (2025-07-01): +# 0: $0, >0-100%: $5, >100-150%: $125, >150-200%: $175, +# >200-250%: $225, >250-300%: $275, >300-350%: $325, >350%+: $375 +# Income cap: 5% +# Max children: 3 +# +# 2025 FPG: Family of 2: 21,150 +# Monthly FPG: 21,150/12 = 1,762.50 + +# === CURRENT SCALE (2024) BRACKET BOUNDARIES === + +- name: Case 1, current scale income at exactly 100% FPG boundary. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + # Annual income = FPG for size 2 = 20,440 + # Monthly income = 20,440/12 = 1,703.33 + # Monthly FPG = 20,440/12 = 1,703.33 + # FPG ratio = 1.0000 -> at 100%, still in 0-100% bracket + employment_income: 20_440 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # FPG ratio = 1.0 -> bracket threshold is 1.0001 for $60 + # 1.0 < 1.0001 -> stays in $0 bracket + # 1 child * $0 = $0 + # Income cap: 20,440 * 0.07 / 12 = 119.23 + # Copay: min(0, 119.23) = $0 + va_ccsp_copay: 0 + +- name: Case 2, current scale income just above 100% FPG boundary. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + # Need FPG ratio just above 1.0001 + # Monthly FPG = 1,703.33 + # Monthly income = 1,703.33 * 1.001 = 1,705.04 + # Annual = 1,705.04 * 12 = 20,460.44 + employment_income: 20_461 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Monthly income: 20,461/12 = 1,705.08 + # FPG ratio: 1,705.08 / 1,703.33 = 1.0010 -> above 1.0001 + # Per-child copay: $60 + # 1 child * $60 = $60 + # Income cap: 20,461 * 0.07 / 12 = 119.36 + # Copay: min(60, 119.36) = $60 + va_ccsp_copay: 60 + +- name: Case 3, current scale income at exactly 200% FPG boundary. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + # 200% FPG = 40,880 annual + # FPG ratio = 2.0 -> threshold for $120 is 2.0001 + # 2.0 < 2.0001 -> stays in $60 bracket + employment_income: 40_880 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # FPG ratio = 2.0 -> still in $60 bracket (threshold is 2.0001) + # 1 child * $60 = $60 + # Income cap: 40,880 * 0.07 / 12 = 238.47 + # Copay: min(60, 238.47) = $60 + va_ccsp_copay: 60 + +- name: Case 4, current scale income just above 300% FPG. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + # 300% FPG = 61,320 annual + # Need above 3.0001: 61,321 -> ratio = 61,321/20,440 = 2.9999... + # Actually: monthly 61,321/12 = 5,110.08 / (20,440/12 = 1,703.33) = 2.9999 + # Need higher: 61,350 -> 5,112.50/1,703.33 = 3.001 -> above 3.0001 + employment_income: 61_350 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Monthly income: 61,350/12 = 5,112.50 + # FPG ratio: 5,112.50/1,703.33 = 3.001 -> $180 bracket + # 1 child * $180 = $180 + # Income cap: 61,350 * 0.07 / 12 = 357.88 + # Copay: min(180, 357.88) = $180 + va_ccsp_copay: 180 + +# === MAX CHILDREN CAP === + +- name: Case 5, exactly 3 eligible children assessed. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 48_000 + immigration_status: CITIZEN + person2: + age: 10 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person3: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person4: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2, person3, person4] + state_code: VA + output: + # Monthly income: 48,000/12 = 4,000 + # FPG size 4: 31,200, monthly = 2,600 + # FPG ratio: 4,000/2,600 = 1.5385 -> $60/child + # 3 eligible children = min(3, 3) = 3 + # Scale total: $60 * 3 = $180 + # Income cap: 48,000 * 0.07 / 12 = 280 + # Copay: min(180, 280) = $180 + va_ccsp_copay: 180 + +- name: Case 6, 5 eligible children still capped at 3. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 60_000 + immigration_status: CITIZEN + person2: + age: 11 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person3: + age: 9 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person4: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person5: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person6: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3, person4, person5, person6] + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2, person3, person4, person5, person6] + state_code: VA + output: + # Monthly income: 60,000/12 = 5,000 + # FPG size 6: 15,060 + 5*5,380 = 41,960, monthly = 3,496.67 + # FPG ratio: 5,000/3,496.67 = 1.4299 -> $60/child + # 5 eligible children, capped at 3 + # Scale total: $60 * 3 = $180 + # Income cap: 60,000 * 0.07 / 12 = 350 + # Copay: min(180, 350) = $180 + va_ccsp_copay: 180 + +# === INCOME CAP BINDING === + +- name: Case 7, income cap binds below scale total. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + immigration_status: CITIZEN + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person3: + age: 6 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person4: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2, person3, person4] + state_code: VA + output: + # Monthly income: 24,000/12 = 2,000 + # FPG size 4: 31,200, monthly = 2,600 + # FPG ratio: 2,000/2,600 = 0.7692 -> $0/child + # Scale total: $0 * 3 = $0 + # Income cap: 24,000 * 0.07 / 12 = 140 + # Copay: min(0, 140) = $0 + va_ccsp_copay: 0 + +- name: Case 8, income cap binds with high copay bracket and low income. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + # Need FPG ratio > 300% but low absolute income + # Use large family to get low FPG + # Single person: FPG = 15,060 for size 1 (not possible with child) + # Family of 2: FPG = 20,440 + # Income = 36,000, Monthly = 3,000 + # FPG ratio: 3,000/(20,440/12) = 3,000/1,703.33 = 1.761 -> $60 + # Not high enough. Need >300%: income > 61,320 + # But that makes income cap high too. + # Better: 3 children at $180 each = $540 + # With income = 84,000, cap = 84,000*0.07/12 = 490 + # 490 < 540 -> cap binds! + employment_income: 84_000 + immigration_status: CITIZEN + person2: + age: 10 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person3: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person4: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2, person3, person4] + state_code: VA + output: + # Monthly income: 84,000/12 = 7,000 + # FPG size 4: 31,200, monthly = 2,600 + # FPG ratio: 7,000/2,600 = 2.6923 -> $120/child + # 3 children, scale total: $120 * 3 = $360 + # Income cap: 84,000 * 0.07 / 12 = 490 + # Copay: min(360, 490) = $360 + va_ccsp_copay: 360 + +# === 2025-07-01 NEW COPAY SCALE === + +- name: Case 9, new scale 2025-07 zero income pays $0. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Zero income -> FPG ratio = 0 -> $0 + va_ccsp_copay: 0 + +- name: Case 10, new scale 2025-07 just above 0% FPG pays $5. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 12_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # 2025 FPG size 2: 21,150 + # Monthly income: 12,000/12 = 1,000 + # Monthly FPG: 21,150/12 = 1,762.50 + # FPG ratio: 1,000/1,762.50 = 0.5674 + # New scale (2025-07-01): >0-100% = $5 + # BUT test period is 2025-01, still uses OLD scale + # Old scale: 0-100% = $0 + # 1 child * $0 = $0 + # Income cap: 12,000 * 0.07 / 12 = 70 + # Copay: min(0, 70) = $0 + va_ccsp_copay: 0 + +- name: Case 11, new scale 2025-07 above 100% FPG. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + # 2025 FPG size 2 = 21,150 + # Need FPG ratio > 1.0001 + # Income = 24,000 -> monthly 2,000 / 1,762.50 = 1.1347 + employment_income: 24_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # 2025-01 still uses old scale + # FPG ratio 1.1347 -> old scale >100% = $60 + # 1 child * $60 = $60 + # Income cap: 24,000 * 0.07 / 12 = 140 + # Copay: min(60, 140) = $60 + va_ccsp_copay: 60 + +# === TANF RECIPIENT ZERO COPAY === + +- name: Case 12, TANF recipient with high income still pays zero. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 60_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person3: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + is_tanf_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2, person3] + state_code: VA + output: + # TANF -> $0 regardless of income/bracket + va_ccsp_copay: 0 + +# === SINGLE CHILD COPAY === + +- name: Case 13, single child copay not inflated by max_children. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 72_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # FPG ratio > 300% -> $180/child + # 1 child * $180 = $180 + # Income cap: 72,000 * 0.07 / 12 = 420 + # Copay: min(180, 420) = $180 + va_ccsp_copay: 180 diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_edge.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_edge.yaml new file mode 100644 index 00000000000..06f82745c1b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_edge.yaml @@ -0,0 +1,217 @@ +# Virginia CCSP benefit edge case tests +# Focus: zero expenses, expenses less than copay, negative income prevention, +# zero income full subsidy, ineligible returns zero +# +# Benefit = max(expenses - copay, 0) +# defined_for = "va_ccsp_eligible" -> ineligible SPMUnits get 0 + +- name: Case 1, zero childcare expenses yields zero benefit. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 0 + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Eligible but no expenses -> benefit = max(0 - 60, 0) = 0 + va_ccsp: 0 + +- name: Case 2, expenses exactly equal to copay yields zero benefit. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + # Monthly copay = $60, need annual expenses = 60 * 12 = 720 + spm_unit_pre_subsidy_childcare_expenses: 720 + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Monthly income: 36,000/12 = 3,000 + # FPG ratio: 3,000/(20,440/12) = 1.761 -> $60 copay + # Monthly expenses: 720/12 = 60 + # Benefit: max(60 - 60, 0) = $0 + va_ccsp: 0 + +- name: Case 3, expenses $1 more than copay yields $1 benefit. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + # Monthly copay = $60, need monthly expenses = $61 + # Annual = 61 * 12 = 732 + spm_unit_pre_subsidy_childcare_expenses: 732 + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Monthly expenses: 732/12 = 61 + # Benefit: max(61 - 60, 0) = $1 + va_ccsp: 1 + +- name: Case 4, large expenses with zero income gives full subsidy. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 24_000 + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Zero income -> $0 copay + # Monthly expenses: 24,000/12 = 2,000 + # Benefit: max(2,000 - 0, 0) = $2,000 + va_ccsp: 2_000 + +- name: Case 5, TANF family gets full expenses as benefit. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 28 + employment_income: 12_000 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + spm_unit_pre_subsidy_childcare_expenses: 14_400 + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # TANF -> $0 copay + # Monthly expenses: 14,400/12 = 1,200 + # Benefit: max(1,200 - 0, 0) = $1,200 + va_ccsp: 1_200 + +- name: Case 6, ineligible family returns zero benefit even with expenses. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 200_000 + immigration_status: CITIZEN + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 24_000 + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Income 200,000 >> 185% FPG = 37,814 -> ineligible + # defined_for = "va_ccsp_eligible" filters out -> $0 + va_ccsp: 0 + +- name: Case 7, family of 1 adult with no children gets zero. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 12_000 + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1] + spm_units: + spm_unit: + members: [person1] + spm_unit_pre_subsidy_childcare_expenses: 6_000 + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1] + state_code: VA + output: + # No eligible children -> ineligible -> $0 + va_ccsp: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_income_eligible_edge.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_income_eligible_edge.yaml new file mode 100644 index 00000000000..707d00a9139 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_income_eligible_edge.yaml @@ -0,0 +1,408 @@ +# Virginia CCSP income eligibility edge case tests +# Focus: exact threshold boundaries for each locality group, +# enrolled vs not enrolled, young child SMI exception boundary +# +# 2024 FPG (contiguous US): first_person = 15,060, additional = 5,380 +# Family of 2: 20,440 +# +# 2024 VA SMI base (effective 2023-10-01): 121,130 +# Size 2: 121,130 * 0.68 = 82,368.40 +# 85% SMI size 2: 70,013.14 +# +# Group I: 150% FPG size 2 = 20,440 * 1.50 = 30,660 +# Group II: 160% FPG size 2 = 20,440 * 1.60 = 32,704 +# Group III: 185% FPG size 2 = 20,440 * 1.85 = 37,814 +# +# Income is tested as annual (SPMUnit MONTH reads YEAR income / 12). +# Threshold comparison is also monthly: annual_threshold / 12. +# So we test with annual income vs annual threshold equivalents. + +# === GROUP I BOUNDARY (150% FPG) === + +- name: Case 1, Group I income $1 below 150% FPG threshold. + period: 2024-01 + input: + people: + person1: + employment_income: 30_659 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_I + households: + household: + members: [person1, person2] + state_code: VA + output: + # 150% FPG = 30,660 + # 30,659 <= 30,660 -> eligible + va_ccsp_income_eligible: true + +- name: Case 2, Group I income exactly at 150% FPG threshold. + period: 2024-01 + input: + people: + person1: + employment_income: 30_660 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_I + households: + household: + members: [person1, person2] + state_code: VA + output: + # 150% FPG = 30,660 + # 30,660 <= 30,660 -> eligible (at threshold = eligible) + va_ccsp_income_eligible: true + +- name: Case 3, Group I income $1 above 150% FPG threshold. + period: 2024-01 + input: + people: + person1: + employment_income: 30_661 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_I + households: + household: + members: [person1, person2] + state_code: VA + output: + # 150% FPG = 30,660 + # 30,661 > 30,660 -> ineligible + va_ccsp_income_eligible: false + +# === GROUP II BOUNDARY (160% FPG) === + +- name: Case 4, Group II income exactly at 160% FPG threshold. + period: 2024-01 + input: + people: + person1: + employment_income: 32_704 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_II + households: + household: + members: [person1, person2] + state_code: VA + output: + # 160% FPG = 32,704 + # 32,704 <= 32,704 -> eligible + va_ccsp_income_eligible: true + +- name: Case 5, Group II income $1 above 160% FPG threshold. + period: 2024-01 + input: + people: + person1: + employment_income: 32_705 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_II + households: + household: + members: [person1, person2] + state_code: VA + output: + # 160% FPG = 32,704 + # 32,705 > 32,704 -> ineligible + va_ccsp_income_eligible: false + +# === GROUP III BOUNDARY (185% FPG) === + +- name: Case 6, Group III income $1 below 185% FPG threshold. + period: 2024-01 + input: + people: + person1: + employment_income: 37_813 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # 185% FPG = 37,814 + # 37,813 <= 37,814 -> eligible + va_ccsp_income_eligible: true + +- name: Case 7, Group III income $1 above 185% FPG threshold. + period: 2024-01 + input: + people: + person1: + employment_income: 37_815 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # 185% FPG = 37,814 + # 37,815 > 37,814 -> ineligible + va_ccsp_income_eligible: false + +# === ENROLLED 85% SMI BOUNDARY === + +- name: Case 8, enrolled family income just below 85% SMI. + period: 2024-01 + input: + people: + person1: + # SMI size 2: 121,130 * 0.68 = 82,368.40 + # 85% SMI = 82,368.40 * 0.85 = 70,013.14 + # Monthly: 82,368.40/12 * 0.85 = 5,834.43 + # Annual 70,013 -> monthly 5,834.42 <= 5,834.43 -> eligible + employment_income: 70_013 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_I + households: + household: + members: [person1, person2] + state_code: VA + output: + # Enrolled -> 85% SMI = 70,013.14 + # 70,013 <= 70,013.14 -> eligible + va_ccsp_income_eligible: true + +- name: Case 9, enrolled family income $1 above 85% SMI. + period: 2024-01 + input: + people: + person1: + employment_income: 70_014 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_I + households: + household: + members: [person1, person2] + state_code: VA + output: + # 85% SMI = 70,013.14 + # 70,014 > 70,013.14 -> ineligible + va_ccsp_income_eligible: false + +# === YOUNG CHILD SMI EXCEPTION BOUNDARY === + +- name: Case 10, young child age 5 triggers SMI exception. + period: 2024-01 + input: + people: + person1: + employment_income: 48_000 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_I + households: + household: + members: [person1, person2] + state_code: VA + output: + # Group I: 150% FPG = 30,660 + # Young child (age 5 <= 5): also check 85% SMI = 70,013.14 + # Use max(30,660, 70,013.14) = 70,013.14 + # 48,000 <= 70,013.14 -> eligible + va_ccsp_income_eligible: true + +- name: Case 11, child age 6 does NOT trigger SMI exception. + period: 2024-01 + input: + people: + person1: + employment_income: 48_000 + person2: + age: 6 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_I + households: + household: + members: [person1, person2] + state_code: VA + output: + # Group I: 150% FPG = 30,660 + # Child age 6 > 5: no SMI exception + # 48,000 > 30,660 -> ineligible + va_ccsp_income_eligible: false + +# === ENROLLED OVERRIDES LOCALITY GROUP === + +- name: Case 12, enrolled family in Group I uses SMI not FPG. + period: 2024-01 + input: + people: + person1: + employment_income: 60_000 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_I + households: + household: + members: [person1, person2] + state_code: VA + output: + # Enrolled -> exit limit = 85% SMI = 70,013.14 + # (Not Group I 150% FPG = 30,660 -- enrolled uses SMI) + # 60,000 <= 70,013.14 -> eligible + va_ccsp_income_eligible: true + +# === ZERO INCOME === + +- name: Case 13, zero income always eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_I + households: + household: + members: [person1, person2] + state_code: VA + output: + # 0 <= any threshold -> eligible + va_ccsp_income_eligible: true + +# === MEDICAID/WIC CATEGORICAL ELIGIBILITY === + +- name: Case 14, Medicaid-eligible household waives income test. + period: 2024-01 + input: + people: + person1: + employment_income: 200_000 + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + receives_medicaid: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Income far above any threshold but Medicaid -> waived + va_ccsp_income_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/integration.yaml new file mode 100644 index 00000000000..4e23e638377 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/integration.yaml @@ -0,0 +1,364 @@ +# Virginia CCSP Integration Tests +# +# 2024 FPG (contiguous US): +# first_person = 15,060, additional = 5,380 +# Family of 2: 20,440 Family of 3: 25,820 +# Family of 4: 31,200 Family of 5: 36,580 +# +# 2024 VA SMI base: 121,130 (effective 2023-10-01) +# SMI size adj: first_person=0.52, second_to_sixth=0.16, threshold=6 +# Size 2: 121,130*0.68 = 82,368.40 +# Size 3: 121,130*0.84 = 101,749.20 +# Size 4: 121,130*1.00 = 121,130.00 +# Size 5: 121,130*1.16 = 140,510.80 +# 85% SMI: Size 2=69,913.14, Size 3=86,486.82, +# Size 4=102,960.50, Size 5=119,434.18 +# +# Current copay (2024): $0/$0/$60/$60/$120/$120/$180/$180 +# Income cap: 7% +# Max children: 3 + +- name: Case 1, basic eligible single parent with one child Group III. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 12_000 + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # === Child eligibility === + # person2: age 5 < 13, citizen, dependent -> eligible + va_ccsp_child_eligible: [false, true] + + # === Income === + # Countable: 36,000 / 12 = 3,000/month + va_ccsp_countable_income: 3_000 + + # FPG size 2: 20,440 + # New applicant Group III: 185% FPG = 20,440 * 1.85 = 37,814 + # Also young child (age 5 <= 5): 85% SMI = 69,913.14 + # Use max(37,814, 69,913.14) = 69,913.14 + # 36,000 <= 69,913.14 -> income eligible + va_ccsp_income_eligible: true + + # === Asset === + # Default assets 0 <= 1,000,000 + is_ccdf_asset_eligible: true + + # === Overall === + va_ccsp_eligible: true + + # === Copay === + # Monthly FPG: 20,440 / 12 = 1,703.33 + # FPG ratio: 3,000 / 1,703.33 = 1.7610 -> $60/child + # 1 child, scale total = $60 + # Income cap: 36,000 * 0.07 / 12 = 210 + # Copay: min(60, 210) = $60 + va_ccsp_copay: 60 + + # === Benefit === + # Monthly expenses: 12,000 / 12 = 1,000 + # Benefit: max(1,000 - 60, 0) = $940 + va_ccsp: 940 + +- name: Case 2, enrolled family at redetermination income limit. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 60_000 + immigration_status: CITIZEN + person2: + age: 33 + employment_income: 24_000 + immigration_status: CITIZEN + person3: + age: 10 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person4: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + spm_unit_pre_subsidy_childcare_expenses: 18_000 + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_I + households: + household: + members: [person1, person2, person3, person4] + state_code: VA + output: + # === Child eligibility === + # person3 (10) and person4 (7): both < 13, citizen -> eligible + va_ccsp_child_eligible: [false, false, true, true] + + # === Income === + # Countable: (60,000 + 24,000) / 12 = 7,000/month + va_ccsp_countable_income: 7_000 + + # Enrolled -> exit limit = 85% SMI + # SMI size 4: 121,130 * 1.00 = 121,130 + # 85% SMI = 102,960.50 + # 84,000 <= 102,960.50 -> income eligible + va_ccsp_income_eligible: true + + is_ccdf_asset_eligible: true + va_ccsp_eligible: true + + # === Copay === + # Monthly FPG size 4: 31,200 / 12 = 2,600 + # FPG ratio: 7,000 / 2,600 = 2.6923 -> $120/child + # 2 eligible children, scale total = $120 * 2 = $240 + # Income cap: 84,000 * 0.07 / 12 = 490 + # Copay: min(240, 490) = $240 + va_ccsp_copay: 240 + + # === Benefit === + # Monthly expenses: 18,000 / 12 = 1,500 + # Benefit: max(1,500 - 240, 0) = $1,260 + va_ccsp: 1_260 + +- name: Case 3, TANF recipient with zero copay. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 28 + employment_income: 12_000 + immigration_status: CITIZEN + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: LEGAL_PERMANENT_RESIDENT + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + spm_unit_pre_subsidy_childcare_expenses: 9_600 + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # === Child eligibility === + # person2: age 3 < 13, LPR (qualified) -> eligible + va_ccsp_child_eligible: [false, true] + + # === Income === + va_ccsp_countable_income: 1_000 + + # TANF enrolled -> auto income-eligible + va_ccsp_income_eligible: true + is_ccdf_asset_eligible: true + va_ccsp_eligible: true + + # === Copay === + # TANF recipient -> $0 copay + va_ccsp_copay: 0 + + # === Benefit === + # Monthly expenses: 9,600 / 12 = 800 + # Benefit: max(800 - 0, 0) = $800 + va_ccsp: 800 + +- name: Case 4, Group I applicant above FPG but with young child uses SMI. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 25 + employment_income: 48_000 + immigration_status: CITIZEN + person2: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 15_000 + va_ccsp_locality_group: GROUP_I + households: + household: + members: [person1, person2] + state_code: VA + output: + # === Child eligibility === + va_ccsp_child_eligible: [false, true] + + # === Income === + # Countable: 48,000 / 12 = 4,000/month + va_ccsp_countable_income: 4_000 + + # Group I: 150% FPG = 20,440 * 1.5 = 30,660 + # 48,000 > 30,660 -- would fail FPG test + # But child age 2 <= 5: also check 85% SMI = 69,913.14 + # Use max(30,660, 69,913.14) = 69,913.14 + # 48,000 <= 69,913.14 -> income eligible + va_ccsp_income_eligible: true + + is_ccdf_asset_eligible: true + va_ccsp_eligible: true + + # === Copay === + # Monthly FPG: 20,440 / 12 = 1,703.33 + # FPG ratio: 4,000 / 1,703.33 = 2.3482 -> $120/child + # 1 child, scale total = $120 + # Income cap: 48,000 * 0.07 / 12 = 280 + # Copay: min(120, 280) = $120 + va_ccsp_copay: 120 + + # === Benefit === + # Monthly expenses: 15,000 / 12 = 1,250 + # Benefit: max(1,250 - 120, 0) = $1,130 + va_ccsp: 1_130 + +- name: Case 5, income too high for Group I without young child. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 48_000 + immigration_status: CITIZEN + person2: + age: 10 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 8_000 + va_ccsp_locality_group: GROUP_I + households: + household: + members: [person1, person2] + state_code: VA + output: + va_ccsp_child_eligible: [false, true] + + # Group I: 150% FPG = 20,440 * 1.5 = 30,660 + # No young child, not enrolled -> use 30,660 + # 48,000 > 30,660 -> income ineligible + va_ccsp_income_eligible: false + + va_ccsp_eligible: false + va_ccsp: 0 + +- name: Case 6, undocumented child makes family ineligible. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: UNDOCUMENTED + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 10_000 + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Child is undocumented -> not eligible child + va_ccsp_child_eligible: [false, false] + + # No eligible children -> overall ineligible + va_ccsp_eligible: false + va_ccsp: 0 + +- name: Case 7, zero income family full subsidy. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person3: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_pre_subsidy_childcare_expenses: 18_000 + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2, person3] + state_code: VA + output: + va_ccsp_child_eligible: [false, true, true] + + # Zero income + va_ccsp_countable_income: 0 + + # 0 <= any threshold -> income eligible + va_ccsp_income_eligible: true + is_ccdf_asset_eligible: true + va_ccsp_eligible: true + + # FPG ratio = 0 -> $0/child, cap = $0 + va_ccsp_copay: 0 + + # Monthly expenses: 18,000 / 12 = 1,500 + # Benefit: max(1,500 - 0, 0) = $1,500 + va_ccsp: 1_500 diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp.yaml new file mode 100644 index 00000000000..1180c87a6fe --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp.yaml @@ -0,0 +1,134 @@ +# Virginia CCSP benefit amount tests +# Benefit = max(childcare_expenses - copay, 0) +# (MRR ceiling not modeled in initial implementation) + +- name: Case 1, basic benefit calculation. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 12_000 + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Monthly income: 36,000 / 12 = 3,000 + # FPG size 2: 20,440 / 12 = 1,703.33 + # FPG ratio: 3,000 / 1,703.33 = 1.7610 -> $60 per child + # 1 eligible child, scale total = $60 + # Income cap: 36,000 * 0.07 / 12 = 210 + # Copay: min(60, 210) = $60 + # Monthly expenses: 12,000 / 12 = 1,000 + # Benefit: max(1,000 - 60, 0) = $940 + va_ccsp: 940 + +- name: Case 2, copay exceeds expenses so benefit is zero. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 72_000 + immigration_status: CITIZEN + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 1_200 + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Monthly income: 72,000 / 12 = 6,000 + # FPG size 2: 20,440 / 12 = 1,703.33 + # FPG ratio: 6,000 / 1,703.33 = 3.5218 -> $180 per child + # 1 eligible child, scale total = $180 + # Income cap: 72,000 * 0.07 / 12 = 420 + # Copay: min(180, 420) = $180 + # Monthly expenses: 1,200 / 12 = 100 + # Benefit: max(100 - 180, 0) = $0 + va_ccsp: 0 + +- name: Case 3, ineligible family gets zero. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 120_000 + immigration_status: CITIZEN + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 12_000 + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + va_ccsp: 0 + +- name: Case 4, zero income family gets full subsidy. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 10_000 + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Zero income -> $0 copay + # Monthly expenses: 10,000 / 12 = 833.33 + # Benefit: max(833.33 - 0, 0) = 833.33 + va_ccsp: 833.33 diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.yaml new file mode 100644 index 00000000000..11e15434508 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.yaml @@ -0,0 +1,132 @@ +# Virginia CCSP activity eligibility tests +# Simplified proxy: parent meets activity requirement if +# weekly_hours_worked >= min hours threshold OR is_in_k12_school +# All heads/spouses must meet requirement (same pattern as RI CCAP) + +- name: Case 1, parent working full time. + period: 2024-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 40 + person2: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + va_ccsp_activity_eligible: true + +- name: Case 2, parent not working enough hours. + period: 2024-01 + input: + people: + person1: + age: 30 + weekly_hours_worked: 5 + is_full_time_student: false + is_in_k12_school: false + person2: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + va_ccsp_activity_eligible: false + +- name: Case 3, parent is student. + period: 2024-01 + input: + people: + person1: + age: 22 + weekly_hours_worked: 0 + is_in_k12_school: true + person2: + age: 2 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + # In school -> meets activity requirement + va_ccsp_activity_eligible: true + +- name: Case 4, two parents both working. + period: 2024-01 + input: + people: + person1: + age: 35 + weekly_hours_worked: 40 + person2: + age: 33 + weekly_hours_worked: 30 + person3: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: VA + output: + va_ccsp_activity_eligible: true + +- name: Case 5, two parents one not meeting requirement. + period: 2024-01 + input: + people: + person1: + age: 35 + weekly_hours_worked: 40 + person2: + age: 33 + weekly_hours_worked: 0 + is_full_time_student: false + is_in_k12_school: false + person3: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: VA + output: + # Person2 is head/spouse but fails activity test + va_ccsp_activity_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_child_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_child_eligible.yaml new file mode 100644 index 00000000000..386d1dad827 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_child_eligible.yaml @@ -0,0 +1,186 @@ +# Virginia CCSP child eligibility tests +# Tests: age < 13 (or < 18 if disabled), immigration, residency +# Uses federal CCDF variables: is_ccdf_age_eligible, is_ccdf_immigration_eligible_child + +- name: Case 1, child under 13 and citizen. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + va_ccsp_child_eligible: [false, true] + +- name: Case 2, child exactly age 13 is ineligible. + period: 2024-01 + input: + people: + person1: + age: 40 + person2: + age: 13 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + va_ccsp_child_eligible: [false, false] + +- name: Case 3, disabled child age 15 is eligible. + period: 2024-01 + input: + people: + person1: + age: 40 + person2: + age: 15 + is_tax_unit_dependent: true + is_disabled: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + va_ccsp_child_eligible: [false, true] + +- name: Case 4, disabled child age 18 is ineligible. + period: 2024-01 + input: + people: + person1: + age: 45 + person2: + age: 18 + is_tax_unit_dependent: true + is_disabled: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + va_ccsp_child_eligible: [false, false] + +- name: Case 5, undocumented child is ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: UNDOCUMENTED + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + va_ccsp_child_eligible: [false, false] + +- name: Case 6, non-dependent adult is not eligible as child. + period: 2024-01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1] + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: VA + output: + va_ccsp_child_eligible: [false] + +- name: Case 7, refugee child under 13 is eligible. + period: 2024-01 + input: + people: + person1: + age: 35 + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: REFUGEE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + va_ccsp_child_eligible: [false, true] + +- name: Case 8, non-VA child is not eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MD + output: + va_ccsp_child_eligible: [false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_copay.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_copay.yaml new file mode 100644 index 00000000000..02efbdaddd6 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_copay.yaml @@ -0,0 +1,204 @@ +# Virginia CCSP family copayment tests +# Formula: copay = min(per_child_copay * min(n_eligible_children, 3), income * cap_rate / 12) +# TANF recipients: $0 copay +# +# 2024 FPG (contiguous US): first_person = 15,060, additional = 5,380 +# Family of 4: 31,200 +# +# Current (2023) params: max 3 children, 7% income cap +# New (2025-07-01) params: max 3 children, 5% income cap + +- name: Case 1, two children current scale with income cap binding. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person3: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2, person3] + state_code: VA + output: + # Monthly income: 24,000 / 12 = 2,000 + # Monthly FPG: 25,820 / 12 = 2,151.67 + # FPG ratio: 2,000 / 2,151.67 = 0.9296 -> $0 per child + # Scale total: $0 * 2 = $0 + # Income cap: 24,000 * 0.07 / 12 = 140 + # Copay: min(0, 140) = $0 + va_ccsp_copay: 0 + +- name: Case 2, two children current scale uncapped. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 48_000 + immigration_status: CITIZEN + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person3: + age: 6 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2, person3] + state_code: VA + output: + # Monthly income: 48,000 / 12 = 4,000 + # Monthly FPG: 25,820 / 12 = 2,151.67 + # FPG ratio: 4,000 / 2,151.67 = 1.8591 -> $60/child + # Scale total: $60 * 2 = $120 + # Income cap: 48,000 * 0.07 / 12 = 280 + # Copay: min(120, 280) = $120 + va_ccsp_copay: 120 + +- name: Case 3, four children capped at 3 children. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 60_000 + immigration_status: CITIZEN + person2: + age: 10 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person3: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person4: + age: 6 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person5: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3, person4, person5] + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: VA + output: + # Monthly income: 60,000 / 12 = 5,000 + # FPG size 5: 36,580 + # Monthly FPG: 36,580 / 12 = 3,048.33 + # FPG ratio: 5,000 / 3,048.33 = 1.6402 -> $60/child + # 4 eligible children, capped at 3 + # Scale total: $60 * 3 = $180 + # Income cap: 60,000 * 0.07 / 12 = 350 + # Copay: min(180, 350) = $180 + va_ccsp_copay: 180 + +- name: Case 4, TANF recipient pays zero copay. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + va_ccsp_copay: 0 + +- name: Case 5, income cap binds below scale total. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + immigration_status: CITIZEN + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person3: + age: 6 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person4: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2, person3, person4] + state_code: VA + output: + # Monthly income: 36,000 / 12 = 3,000 + # FPG size 4: 31,200 + # Monthly FPG: 31,200 / 12 = 2,600 + # FPG ratio: 3,000 / 2,600 = 1.1538 -> $60/child + # 3 eligible children (all 3 assessed) + # Scale total: $60 * 3 = $180 + # Income cap: 36,000 * 0.07 / 12 = 210 + # Copay: min(180, 210) = $180 + va_ccsp_copay: 180 diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_countable_income.yaml new file mode 100644 index 00000000000..7011296f88c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_countable_income.yaml @@ -0,0 +1,114 @@ +# Virginia CCSP countable income tests +# va_ccsp_countable_income uses adds/subtracts pattern: +# adds: employment_income, self_employment_income, child_support_received, +# social_security, pension_income, unemployment_compensation, +# workers_compensation, veterans_benefits, disability_benefits, +# interest_income, dividend_income, rental_income, alimony_income +# subtracts: child_support_expense +# +# Variable is SPMUnit, MONTH. Income sources are Person, YEAR. +# In MONTH test: input annual amounts, output = monthly (annual / 12). + +- name: Case 1, employment income only. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + employment_income: 36_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + # 36,000 / 12 = 3,000 + va_ccsp_countable_income: 3_000 + +- name: Case 2, multiple income sources. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + employment_income: 24_000 + self_employment_income: 6_000 + child_support_received: 3_600 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + # (24,000 + 6,000 + 3,600) / 12 = 2,800 + va_ccsp_countable_income: 2_800 + +- name: Case 3, income with child support deduction. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + employment_income: 48_000 + child_support_expense: 6_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + # (48,000 - 6,000) / 12 = 3,500 + va_ccsp_countable_income: 3_500 + +- name: Case 4, zero income. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + va_ccsp_countable_income: 0 + +- name: Case 5, two-parent household with combined income. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + employment_income: 30_000 + person2: + employment_income: 24_000 + person3: + age: 5 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: VA + output: + # (30,000 + 24,000) / 12 = 4,500 + va_ccsp_countable_income: 4_500 diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_eligible.yaml new file mode 100644 index 00000000000..d1f81cace88 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_eligible.yaml @@ -0,0 +1,130 @@ +# Virginia CCSP overall eligibility tests +# Combines: has eligible child, income eligible, asset eligible, activity eligible + +- name: Case 1, basic eligible family. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + va_ccsp_eligible: true + +- name: Case 2, income too high. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 120_000 + immigration_status: CITIZEN + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # 185% FPG size 2 = 20,440 * 1.85 = 37,814 + # 120,000 > 37,814 -> income ineligible -> overall ineligible + va_ccsp_eligible: false + +- name: Case 3, no eligible children. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1] + spm_units: + spm_unit: + members: [person1] + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1] + state_code: VA + output: + va_ccsp_eligible: false + +- name: Case 4, not in Virginia. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MD + output: + va_ccsp_eligible: false + +- name: Case 5, assets over $1 million. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_assets: 1_500_000 + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + va_ccsp_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_income_eligible.yaml new file mode 100644 index 00000000000..ecda7ad10bb --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_income_eligible.yaml @@ -0,0 +1,213 @@ +# Virginia CCSP income eligibility tests +# Logic: +# - New applicants (not enrolled): income <= FPG * locality_fpg_rate +# GROUP_I: 150% FPG, GROUP_II: 160% FPG, GROUP_III: 185% FPG +# - Enrolled (redetermination): income <= 85% SMI +# - Families with child <= 5: also eligible if income <= 85% SMI +# - TANF recipients: auto income-eligible +# - Medicaid/WIC recipients: auto income-eligible +# +# 2024 FPG (contiguous US): first_person = 15,060, additional = 5,380 +# Family of 2: 20,440 Family of 3: 25,820 Family of 4: 31,200 +# +# 2024 VA SMI base: 121,130 (effective 2023-10-01) +# SMI size adj: 0.52 + 0.16*(min(size-1,5)) + 0.03*max(size-6,0) +# Size 2: 121,130 * 0.68 = 82,368.40 +# Size 3: 121,130 * 0.84 = 101,749.20 +# Size 4: 121,130 * 1.00 = 121,130.00 +# 85% SMI size 2: 69,913.14 +# 85% SMI size 3: 86,486.82 +# 85% SMI size 4: 102,960.50 + +- name: Case 1, new applicant Group III below 185% FPG. + period: 2024-01 + input: + people: + person1: + employment_income: 48_000 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # FPG size 2: 20,440 + # 185% FPG = 20,440 * 1.85 = 37,814 + # Annual income 48,000, monthly = 4,000 + # Monthly limit = 37,814 / 12 = 3,151.17 + # 4,000 > 3,151.17 -> not income eligible + va_ccsp_income_eligible: false + +- name: Case 2, new applicant Group III below threshold. + period: 2024-01 + input: + people: + person1: + employment_income: 36_000 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # FPG size 2: 20,440 + # 185% FPG = 37,814 + # 36,000 <= 37,814 -> income eligible + va_ccsp_income_eligible: true + +- name: Case 3, new applicant Group I with lower threshold. + period: 2024-01 + input: + people: + person1: + employment_income: 32_000 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_I + households: + household: + members: [person1, person2] + state_code: VA + output: + # FPG size 2: 20,440 + # 150% FPG = 20,440 * 1.5 = 30,660 + # 32,000 > 30,660 -> not income eligible + va_ccsp_income_eligible: false + +- name: Case 4, enrolled family at 85% SMI. + period: 2024-01 + input: + people: + person1: + employment_income: 84_000 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_I + households: + household: + members: [person1, person2] + state_code: VA + output: + # Enrolled -> exit limit = 85% SMI + # SMI size 2: 82,368.40 + # 85% SMI = 69,913.14 + # 84,000 > 69,913.14 -> ineligible + va_ccsp_income_eligible: false + +- name: Case 5, enrolled family within 85% SMI. + period: 2024-01 + input: + people: + person1: + employment_income: 60_000 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_I + households: + household: + members: [person1, person2] + state_code: VA + output: + # 85% SMI size 2 = 69,913.14 + # 60,000 <= 69,913.14 -> eligible + va_ccsp_income_eligible: true + +- name: Case 6, new applicant with young child uses 85% SMI. + period: 2024-01 + input: + people: + person1: + employment_income: 48_000 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_I + households: + household: + members: [person1, person2] + state_code: VA + output: + # Group I: 150% FPG = 20,440 * 1.5 = 30,660 + # Young child (age 4 <= 5): also check 85% SMI = 69,913.14 + # Use max(30,660, 69,913.14) = 69,913.14 + # 48,000 <= 69,913.14 -> eligible + va_ccsp_income_eligible: true + +- name: Case 7, TANF recipient auto income-eligible. + period: 2024-01 + input: + people: + person1: + employment_income: 120_000 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # TANF enrolled -> auto income-eligible regardless of income + va_ccsp_income_eligible: true diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp.py new file mode 100644 index 00000000000..ab7644213bd --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class va_ccsp(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "Virginia Child Care Subsidy Program benefit" + definition_period = MONTH + defined_for = "va_ccsp_eligible" + reference = ( + "https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/", + "https://doe.virginia.gov/home/showpublisheddocument/56270#page=100", + ) + + def formula(spm_unit, period, parameters): + expenses = spm_unit("spm_unit_pre_subsidy_childcare_expenses", period) + copay = spm_unit("va_ccsp_copay", period) + return max_(expenses - copay, 0) diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.py new file mode 100644 index 00000000000..c0b189bf898 --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class va_ccsp_activity_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Activity-eligible for Virginia Child Care Subsidy Program" + definition_period = MONTH + defined_for = StateCode.VA + reference = ( + "https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section30/", + "https://doe.virginia.gov/home/showpublisheddocument/56270#page=36", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.va.dss.ccsp.activity + person = spm_unit.members + is_head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) + hours_worked = person("weekly_hours_worked", period.this_year) + is_in_school = person("is_in_k12_school", period.this_year) + is_active = (hours_worked >= p.min_hours_per_week) | is_in_school + ineligible_parent = is_head_or_spouse & ~is_active + return spm_unit.sum(ineligible_parent) == 0 diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_child_eligible.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_child_eligible.py new file mode 100644 index 00000000000..59457541891 --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_child_eligible.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class va_ccsp_child_eligible(Variable): + value_type = bool + entity = Person + label = "Eligible child for Virginia Child Care Subsidy Program" + definition_period = MONTH + defined_for = StateCode.VA + reference = ( + "https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section20/", + "https://doe.virginia.gov/home/showpublisheddocument/56270#page=82", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.va.dss.ccsp.age_threshold + age = person("age", period.this_year) + is_disabled = person("is_disabled", period.this_year) + age_limit = where(is_disabled, p.disabled_child, p.child) + age_eligible = age < age_limit + immigration_eligible = person( + "is_ccdf_immigration_eligible_child", period.this_year + ) + is_dependent = person("is_tax_unit_dependent", period.this_year) + return age_eligible & immigration_eligible & is_dependent diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_copay.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_copay.py new file mode 100644 index 00000000000..86b39027a11 --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_copay.py @@ -0,0 +1,45 @@ +from policyengine_us.model_api import * + + +class va_ccsp_copay(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "Virginia Child Care Subsidy Program family copayment" + definition_period = MONTH + defined_for = StateCode.VA + reference = ( + "https://doe.virginia.gov/home/showpublisheddocument/56270#page=100", + "https://doe.virginia.gov/home/showpublisheddocument/56270#page=137", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.va.dss.ccsp.copay + countable_income = spm_unit("va_ccsp_countable_income", period) + fpg = spm_unit("spm_unit_fpg", period) + + # FPG ratio for copay bracket lookup + fpg_ratio = np.divide( + countable_income, + fpg, + out=np.zeros_like(countable_income), + where=fpg > 0, + ) + per_child_copay = p.per_child_scale.calc(fpg_ratio) + + # Count eligible children, capped at max_children + person = spm_unit.members + eligible_child = person("va_ccsp_child_eligible", period) + n_eligible_children = spm_unit.sum(eligible_child) + n_assessed = min_(n_eligible_children, p.max_children) + + # Total from scale + total_from_scale = per_child_copay * n_assessed + + # Income cap + income_cap = countable_income * p.income_cap_rate + family_copay = min_(total_from_scale, income_cap) + + # TANF recipients exempt from copay + is_tanf = spm_unit("is_tanf_enrolled", period) + return where(is_tanf, 0, family_copay) diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_countable_income.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_countable_income.py new file mode 100644 index 00000000000..10005643d86 --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_countable_income.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class va_ccsp_countable_income(Variable): + value_type = float + entity = SPMUnit + label = "Virginia Child Care Subsidy Program countable income" + unit = USD + definition_period = MONTH + defined_for = StateCode.VA + reference = ( + "https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/", + "https://doe.virginia.gov/home/showpublisheddocument/56270#page=86", + ) + + adds = "gov.states.va.dss.ccsp.income.countable_income.sources" + subtracts = "gov.states.va.dss.ccsp.income.countable_income.subtracts" diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_eligible.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_eligible.py new file mode 100644 index 00000000000..d4117f65f8d --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_eligible.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class va_ccsp_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for Virginia Child Care Subsidy Program" + definition_period = MONTH + defined_for = StateCode.VA + reference = ( + "https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/", + "https://doe.virginia.gov/home/showpublisheddocument/56270#page=78", + ) + + def formula(spm_unit, period, parameters): + person = spm_unit.members + has_eligible_child = spm_unit.any(person("va_ccsp_child_eligible", period)) + income_eligible = spm_unit("va_ccsp_income_eligible", period) + activity_eligible = spm_unit("va_ccsp_activity_eligible", period) + asset_eligible = spm_unit("is_ccdf_asset_eligible", period.this_year) + return has_eligible_child & income_eligible & activity_eligible & asset_eligible diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_enrolled.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_enrolled.py new file mode 100644 index 00000000000..b122352cea6 --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_enrolled.py @@ -0,0 +1,13 @@ +from policyengine_us.model_api import * + + +class va_ccsp_enrolled(Variable): + value_type = bool + entity = SPMUnit + definition_period = MONTH + label = "Whether the family is currently enrolled in Virginia Child Care Subsidy Program" + defined_for = StateCode.VA + reference = ( + "https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/", + "https://doe.virginia.gov/home/showpublisheddocument/56270#page=98", + ) diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_eligible.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_eligible.py new file mode 100644 index 00000000000..ef9594a34a2 --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_eligible.py @@ -0,0 +1,48 @@ +from policyengine_us.model_api import * + + +class va_ccsp_income_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Income-eligible for Virginia Child Care Subsidy Program" + definition_period = MONTH + defined_for = StateCode.VA + reference = ( + "https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/", + "https://doe.virginia.gov/home/showpublisheddocument/56270#page=86", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.va.dss.ccsp.income + countable_income = spm_unit("va_ccsp_countable_income", period) + fpg = spm_unit("spm_unit_fpg", period) + smi = spm_unit("hhs_smi", period) + + # New applicants: FPG-based limit by locality group + locality_group = spm_unit("va_ccsp_locality_group", period.this_year) + fpg_rate = p.initial_eligibility_fpg_rate[locality_group] + initial_limit = fpg * fpg_rate + + # Redetermination (enrolled): 85% SMI + exit_limit = smi * p.exit_smi_rate + + enrolled = spm_unit("va_ccsp_enrolled", period) + income_limit = where(enrolled, exit_limit, initial_limit) + + # Young child exception: families with a child age 5 or younger + # qualify for the higher of FPG limit or 85% SMI regardless + person = spm_unit.members + age = person("age", period.this_year) + has_young_child = spm_unit.any(age <= p.young_child_age_threshold) + young_child_limit = smi * p.young_child_smi_rate + income_limit = where( + has_young_child & ~enrolled, + max_(initial_limit, young_child_limit), + income_limit, + ) + + income_test_passed = countable_income <= income_limit + + # TANF/Medicaid/WIC categorical eligibility waives income test + income_waived = spm_unit("va_ccsp_income_test_waived", period) + return income_test_passed | income_waived diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_test_waived.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_test_waived.py new file mode 100644 index 00000000000..bba06334435 --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_test_waived.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class va_ccsp_income_test_waived(Variable): + value_type = bool + entity = SPMUnit + label = "Income test waived for Virginia Child Care Subsidy Program" + definition_period = MONTH + defined_for = StateCode.VA + reference = ( + "https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section30/", + "https://doe.virginia.gov/home/showpublisheddocument/56270#page=92", + ) + + def formula(spm_unit, period, parameters): + is_tanf = spm_unit("is_tanf_enrolled", period) + has_medicaid = add(spm_unit, period, ["receives_medicaid"]) > 0 + has_wic = add(spm_unit, period, ["receives_wic"]) > 0 + return is_tanf | has_medicaid | has_wic diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_locality_group.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_locality_group.py new file mode 100644 index 00000000000..168478793f3 --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_locality_group.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class VACCSPLocalityGroup(Enum): + GROUP_I = "Group I" + GROUP_II = "Group II" + GROUP_III = "Group III" + + +class va_ccsp_locality_group(Variable): + value_type = Enum + possible_values = VACCSPLocalityGroup + default_value = VACCSPLocalityGroup.GROUP_III + entity = SPMUnit + label = "Virginia CCSP locality group" + definition_period = YEAR + defined_for = StateCode.VA + reference = ( + "https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/", + "https://doe.virginia.gov/home/showpublisheddocument/56270#page=197", + ) diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_child_care_subsidies.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_child_care_subsidies.py new file mode 100644 index 00000000000..3b0b3a2d6be --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_child_care_subsidies.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class va_child_care_subsidies(Variable): + value_type = float + entity = SPMUnit + label = "Virginia child care subsidies" + unit = USD + definition_period = YEAR + defined_for = StateCode.VA + adds = ["va_ccsp"] diff --git a/sources/working_references.md b/sources/working_references.md index 6567b9debfb..cde5a99c27d 100644 --- a/sources/working_references.md +++ b/sources/working_references.md @@ -1,230 +1,289 @@ -# Delaware State Supplementary Payment (SSP) - Working References +# Virginia Child Care Subsidy Program (CCSP) - Working References ## Program Overview -Delaware provides an optional State Supplementary Payment (SSP) to SSI recipients -residing in certified adult residential care facilities. The program has dual -administration: SSA administers the federally-administered optional supplement for -facility residents, and the Delaware Division of Social Services (DSS) administers -a separate $5/month supplement for individuals losing SSI due to SSDI (MAT program). +Virginia's Child Care Subsidy Program (CCSP) assists eligible low-income families with +child care costs for children under age 13 (or under 18 for special needs/court supervision). +The program is administered by the Virginia Department of Education (VDOE) and the +Virginia Department of Social Services (VDSS) through local departments of social services (LDSS). -**Official program name**: State Supplement Payment / Optional State Supplementary Payment -**Administering agency**: SSA (federal portion) + Delaware DSS (state portion) -**Administration classification**: F (mandatory) / F/S (optional) per SI 01415.010 +**Official program name**: Child Care Subsidy Program (CCSP) +**Administering agencies**: VDOE (oversight) + VDSS/LDSS (administration) +**Federal authority**: Child Care and Development Block Grant (CCDBG) Act of 2014 +**State regulations**: 8VAC20-790 (Child Care Program) +**Guidance manual**: Child Care Subsidy Program Guidance Manual (effective August 3, 2023) ## Primary Sources -### 1. SSA POMS SI PHI01415.008 - Delaware-Specific Administration -- **URL**: https://secure.ssa.gov/poms.nsf/lnx/0501415008PHI -- **Title**: Administration of State Supplementary Programs -- Delaware (RTN 61 -- 12/2015) -- **Content**: Complete historical payment levels from 1992-2016, living arrangement - definitions, certification requirements, income limitation rules +### 1. Child Care Subsidy Program Guidance Manual (RIS copy) +- **URL**: https://ris.dls.virginia.gov/uploads/22VAC40/dibr/VDOE%20Child%20Care%20Program%20Guidance%20Manual%205.3.2023-20240822104447.pdf +- **Title**: Child Care Subsidy Program Guidance Manual (Revised, Effective August 3, 2023) +- **Pages**: 199 +- **Downloaded to**: /tmp/va-ccsp-guidance-ris.pdf (text: /tmp/va-ccsp-guidance-ris.txt) +- **Key sections**: + - Section 2: Program Categories (TANF, SNAP E&T, Transitional, Head Start Wrap-Around, Fee) — pp. 22-36 (#page=22) + - Section 3.3: Non-Financial Eligibility Requirements — pp. 48-54 (#page=48) + - Section 3.4: Income and Assets Eligibility Requirements — pp. 56-62 (#page=56) + - Section 3.5: Copayments — pp. 63-64 (#page=63) + - Section 3.13: Authorization (age ranges, rates) — pp. 80-86 (#page=80) + - Section 3.14: Payments (MRR) — pp. 86-90 (#page=86) + - Appendix A: State Income Eligibility Scale — p. 136 (#page=136) + - Appendix B: Per-Child Copayment Scale — pp. 137-138 (#page=137) + - Appendix Z: Metropolitan Statistical Area Groupings — p. 197 (#page=197) +- **Status**: SUCCESSFULLY DOWNLOADED AND EXTRACTED + +### 2. Virginia Administrative Code 8VAC20-790 (Current Regulations) +- **URL**: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/ +- **Key sections**: + - 8VAC20-790-10: Definitions — https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section10/ + - 8VAC20-790-20: Families and children to be served — https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section20/ + - 8VAC20-790-30: Program categories — https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section30/ + - 8VAC20-790-40: Case management (eligibility, income, copay) — https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/ +- **Status**: SUCCESSFULLY FETCHED (all sections) +- **Note**: Regulations were amended effective November 19, 2025 (Vol. 42 Iss. 5) to implement new copayment structure + +### 3. VECF Budget Language Summary (Copayments, Work Requirements, Attendance) +- **URL**: https://vecf.org/wp-content/uploads/2024/09/Budget-Language-Referral-Summary-for-ECCE-Commission.pdf +- **Pages**: 6 +- **Downloaded to**: /tmp/va-vecf-budget.txt - **Key data**: - - State supplement for certified residential care home: $140/month (individual), $448/month (couple) - - These amounts have been frozen since at least 1992 - - Effective March 1, 2003: "Residential Care Homes" include Adult Foster Care Homes, - Adult Residential Care Facilities, and Assisted Living Facilities - - Eligibility requires Adult Residential Care Certification Form - -### 2. SSA POMS SI 01415.058 - January 2026 Payment Levels -- **URL**: https://secure.ssa.gov/poms.nsf/lnx/0501415058 -- **Title**: Federally Administered Optional Supplementary Payment Programs for January 2026 -- **Content**: Current payment levels effective January 1, 2026 -- **Delaware data**: - - Individual (OS Code A): FBR $994 + supplement $140 = $1,134 total - - Couple (OS Code A): FBR $1,491 + supplement $448 = $1,939 total - - OS Code Z (non-facility): $0 supplement - - OS Code Y: waived supplementation - -### 3. SSA POMS SI 01415.057 - January 2025 Payment Levels -- **URL**: https://secure.ssa.gov/POMS.NSF/lnx/0501415057 -- **Title**: Federally Administered Optional Supplementary Payment Programs for January 2025 -- **Content**: Payment levels effective January 1, 2025 -- **Delaware data**: - - Individual (OS Code A): FBR $967 + supplement $140 = $1,107 total - - Couple (OS Code A): FBR $1,450 + supplement $448 = $1,898 total - -### 4. SSA POMS SI 01415.056 - January 2024 Payment Levels -- **URL**: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415056 -- **Title**: Federally Administered Optional Supplementary Payment Programs for January 2024 -- **Delaware data**: - - Individual (OS Code A): FBR $943 + supplement $140 = $1,083 total - - Couple (OS Code A): FBR $1,415 + supplement $448 = $1,863 total - -### 5. SSA POMS SI 01415.055 - January 2023 Payment Levels -- **URL**: https://secure.ssa.gov/poms.NSF/lnx/0501415055 -- **Delaware data**: - - Individual (OS Code A): FBR $914 + supplement $140 = $1,054 total - - Couple (OS Code A): FBR $1,371 + supplement $448 = $1,819 total - -### 6. SSA POMS SI 01415.054 - January 2022 Payment Levels -- **URL**: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415054 -- **Delaware data**: - - Individual (OS Code A): FBR $841 + supplement $140 = $981 total - - Couple (OS Code A): FBR $1,261 + supplement $448 = $1,709 total - -### 7. SSA POMS SI 01415.053 - January 2021 Payment Levels -- **URL**: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415053 -- **Delaware data**: - - Individual (OS Code A): FBR $794 + supplement $140 = $934 total - - Couple (OS Code A): FBR $1,191 + supplement $448 = $1,639 total - -### 8. SSA POMS SI 01415.052 - January 2020 Payment Levels -- **URL**: https://secure.ssa.gov/poms.nsf/lnx/0501415052 -- **Delaware data**: - - Individual (OS Code A): FBR $783 + supplement $140 = $923 total - - Couple (OS Code A): FBR $1,175 + supplement $448 = $1,623 total - -### 9. SSA POMS SI 01415.051 - January 2019 Payment Levels -- **URL**: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415051 -- **Delaware data**: - - Individual (OS Code A): FBR $771 + supplement $140 = $911 total - - Couple (OS Code A): FBR $1,157 + supplement $448 = $1,605 total - -### 10. SSA POMS SI 01415.050 - January 2018 Payment Levels -- **URL**: https://secure.ssa.gov/poms.nsf/lnx/0501415050 -- **Delaware data**: - - Individual (OS Code A): FBR $750 + supplement $140 = $890 total - - Couple (OS Code A): FBR $1,125 + supplement $448 = $1,573 total - -### 11. SSA POMS SI 01415.049 - January 2017 Payment Levels -- **URL**: https://secure.ssa.gov/poms.nsf/lnx/0501415049 -- **Delaware data**: - - Individual (OS Code A): FBR $735 + supplement $140 = $875 total - - Couple (OS Code A): FBR $1,103 + supplement $448 = $1,551 total - -### 12. SSA POMS SI 01415.047 - January 2015 Payment Levels -- **URL**: https://secure.ssa.gov/poms.nsf/lnx/0501415047 -- **Delaware data**: - - Individual (OS Code A): FBR $733 + supplement $140 = $873 total - - Couple (OS Code A): FBR $1,100 + supplement $448 = $1,548 total - -### 13. SSA POMS SI 01415.046 - January 2014 Payment Levels -- **URL**: https://secure.ssa.gov/poms.nsf/lnx/0501415046 -- **Delaware data**: - - Individual (OS Code A): FBR $721 + supplement $140 = $861 total - - Couple (OS Code A): FBR $1,082 + supplement $448 = $1,530 total - -### 14. SSA POMS SI 01415.045 - January 2013 Payment Levels -- **URL**: https://secure.ssa.gov/apps10/poms.nsf/links/0501415045 -- **Delaware data**: - - Individual (OS Code A): FBR $710 + supplement $140 = $850 total - - Couple (OS Code A): FBR $1,066 + supplement $448 = $1,514 total - -### 15. SSA POMS SI 01415.044 - January 2012 Payment Levels -- **URL**: https://secure.ssa.gov/poms.nsf/lnx/0501415044 -- **Delaware data**: - - Individual (OS Code A): FBR $698 + supplement $140 = $838 total - - Couple (OS Code A): FBR $1,048 + supplement $448 = $1,496 total - -### 16. SSA POMS SI 01415.040 - January 2008 Payment Levels -- **URL**: https://secure.ssa.gov/POMS.nsf/lnx/0501415040 -- **Delaware data**: - - Individual (OS Code A): FBR $637 + supplement $140 = $777 total - - Couple (OS Code A): FBR $956 + supplement $448 = $1,404 total - -### 17. SSA POMS SI 01415.036 - January 2004 Payment Levels -- **URL**: https://secure.ssa.gov/poms.nsf/lnx/0501415036 -- **Delaware data**: - - Individual (OS Code A): FBR $564 + supplement $140 = $704 total - - Couple (OS Code A): FBR $846 + supplement $448 = $1,294 total - -### 18. SSA POMS SI 01415.032 - January 2000 Payment Levels -- **URL**: https://secure.ssa.gov/poms.nsf/lnx/0501415032 -- **Delaware data**: - - Individual (OS Code A): FBR $512 + supplement $140 = $652 total - - Couple (OS Code A): FBR $769 + supplement $448 = $1,217 total - -### 19. SSA POMS SI 01415.031 - January 1999 Payment Levels -- **URL**: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415031 -- **Delaware data**: - - Individual (OS Code A): FBR $500 + supplement $140 = $640 total - - Couple (OS Code A): FBR $751 + supplement $448 = $1,199 total - -### 20. SSA POMS SI 01415.010 - Administration Classification -- **URL**: https://secure.ssa.gov/poms.nsf/lnx/0501415010 -- **Title**: Administration of State Supplementary Programs -- **Delaware classification**: F (mandatory) / F/S (optional) - -## Secondary Sources - -### 21. WorkWorld - SSI State Supplement Delaware -- **URL**: https://help.workworldapp.com/wwwebhelp/ssi_state_supplement_delaware.htm -- **Content**: Program overview with 2010 payment amounts -- **Key data**: - - Adult Residential Care Facility: Individual $140 supplement / Couple $448 supplement - - Special category (losing SSI due to SSDI): Individual $5 supplement (state-administered) - - Children under 18 are ineligible - - No additional income disregards beyond federal SSI limits - - Federal resource limitations apply - - Data reflects CY2010 payment levels + - Current copayment scale (in effect as of Jan 1, 2023): + - 0-100% FPG: $0/month per child + - 101-200% FPG: $60/month per child + - 201-300% FPG: $120/month per child + - 301% FPG - 85% SMI: $180/month per child + - Max 3 children assessed copayments (max family copay: $540/month) + - Family copayments capped at 7% of gross countable income + - Copayments generate ~$14.4M (2.5% of $582M total CCSP cost for birth-5) +- **Status**: SUCCESSFULLY DOWNLOADED AND EXTRACTED + +### 4. Budget Amendment HB30 Item 126 #2h (FY2026 enacted provisions) +- **URL**: https://budget.lis.virginia.gov/amendment/2026/1/HB30/Introduced/CA/126/2h +- **Key data** (NEW copayment structure, effective ~July/August 2025): + - Below 100% FPL: $5/month per child + - All other families: up to 5% of annual income + - No family pays more than 5% of income + - Job search limited to 90 days with one extension for extraordinary circumstances +- **Status**: SUCCESSFULLY FETCHED + +### 5. Regulatory Update: Vol. 42 Iss. 5 — 8VAC20-790 Final Regulation +- **URL**: https://register.dls.virginia.gov/details.aspx?id=11939 +- **Effective date**: November 19, 2025 +- **Changes**: Implements new 5% copayment cap, $5/child minimum, 90-day job search limit +- **Authority**: Item 125.10 of Chapter 725 of the 2025 Acts of Assembly; §§ 22.1-16 and 22.1-289.046 +- **Status**: SUCCESSFULLY FETCHED + +### 6. WHRO News: Virginia Families Set to Pay More for CCSP +- **URL**: https://www.whro.org/virginia-government/2025-02-10/virginia-families-set-to-pay-more-for-child-care-subsidy-program +- **Key context**: Senate proposed 7%, House proposed 5%, final enacted = 5% +- **Status**: SUCCESSFULLY FETCHED + +## Failed Fetches + +### childcare.virginia.gov (ALL pages blocked - 403) +The official childcare.virginia.gov site blocks all automated access (returns 403 or redirects to HTML block page). The following documents could NOT be retrieved: +1. **Family Eligibility Document (Oct 2024)**: https://www.childcare.virginia.gov/home/showpublisheddocument/57736/638633886494370000 + - Likely contains: updated income eligibility tables, FPL/SMI thresholds for 2024 +2. **Copayment Scale (Effective July 1, 2025)**: https://www.childcare.virginia.gov/home/showpublisheddocument/62604/638864381965000000 + - Likely contains: the NEW copayment schedule with 5% structure +3. **Updated Copayment Scale (newer URL)**: https://www.childcare.virginia.gov/home/showpublisheddocument/65775/638937831784030000 + - Likely contains: final copayment scale after full implementation +4. **Subsidy Program Guidance Manual page**: https://www.childcare.virginia.gov/reports-resources/administrative-program-manuals-reports-and-data/subsidy-program-guidance-manual + - Likely contains: links to updated manual chapters +5. **Paying for Child Care page**: https://www.childcare.virginia.gov/families/paying-for-child-care + - Likely contains: current copay info, rate sheets, income guidelines + +### dss.virginia.gov (SSL certificate error) +- **URL**: https://www.dss.virginia.gov/family/cc/assistance.cgi/1000 +- **Error**: unable to verify the first certificate +- **URL**: https://www.dss.virginia.gov/files/division/cc/approved_subsidy_vendors/forms/Child_Care_Subsidy_Guidance_Manuel.pdf +- **Error**: unable to verify the first certificate + +### ACF Federal Income Eligibility PDF (403) +- **URL**: https://acf.gov/sites/default/files/documents/occ/CCDF-Family-Income-Eligibility-Levels-by-State.pdf +- Likely contains: Virginia's CCDF income eligibility levels by family size + +## Program Details Extracted + +### Eligibility Requirements + +#### Non-Financial Requirements +1. **Child age**: Under 13, or under 18 if physically/mentally incapable of self-care or under court supervision +2. **Citizenship**: Child must be US citizen or qualified immigrant (parent citizenship not verified) +3. **Immunization**: Per State Board of Health requirements (exemptions available) +4. **Residency**: Family must reside in the locality where application is made +5. **Parent age**: Applicant must be at least 18 (emancipated minors excepted) +6. **School attendance**: No subsidy during hours public education is available +7. **Activity test**: Must have need for child care to support: + - Full-time or part-time employment (including work from home) + - Education or training leading to employment (up to bachelor's degree) + - Job search (limited to 90 days with one extension) + - Assigned VIEW or SNAP E&T activity + - Child protective services +8. **Two-parent household**: Must document good cause why one parent cannot provide care +9. **Family day home exclusion**: Owner/operator cannot receive subsidy for own child cared for at home +10. **Asset limit**: Family assets cannot exceed $1 million (self-certified, no verification required) + +#### Income Eligibility +- **Initial eligibility**: Income must not exceed the percentage of FPG for the locality group (Group I: 150% FPG, Group II: 160% FPG, Group III: 185% FPG) +- **Families with child age 5 or younger (not in kindergarten)**: Income must not exceed 85% of State Median Income (regardless of locality group) +- **Non-financially-responsible applicants**: Income limit is 250% FPG or 85% SMI (with child 5 or under) +- **Exit limit (at redetermination)**: 85% of State Median Income +- **TANF recipients**: Automatically income-eligible (no income determination) +- **Medicaid/WIC recipients**: Automatically satisfy income requirements +- **Eligibility period**: 12 months minimum + +#### Countable Income +- All gross earned and unearned income of the family unit +- Self-employment: net income (gross minus verified business expenses) +- Child support: counted as unearned income of the child +- Contract income: prorated over contract period + +#### Disregarded Income (30 categories) +1. Supplemental Security Income (SSI) +2. TANF benefits +3. Transitional payments ($50/month to former VIEW participants) +4. Diversionary Assistance payments +5. General Relief benefits +6. SNAP benefits +7. USDA donated food +8. Title VII Nutrition Program for the Elderly +9. Child Nutrition Act / National School Lunch Act benefits +10. Earnings of a child under age 18 +11. Earned Income Tax Credit (EITC) +12. All lump sum payments +13. Scholarships/loans/grants for education (except child care portion) +14. AmeriCorps volunteer payments +15. Tax refunds +16. Monetary gifts for one-time/annual occasions +17. Vendor payments by non-financially responsible persons (unless in lieu of wages) +18. Loans and borrowed money +19. Proceeds from sale of property (unless business) +20. Earnings under $25/month +21. Capital gains +22. Withdrawals of bank deposits +23. GI Bill benefits +24. Reimbursements (e.g., mileage) +25. Foreign government restitution to Holocaust survivors +26. Agent Orange Settlement payments +27. Vietnam Veterans children monetary benefits (38 USC 1823(c)) +28. Temporary census taker earnings + +#### Disregarded Deductions +1. Garnished wages +2. Basic Allowance for Housing (BAH) for military on base +3. Clothing Maintenance Allowance for military +4. Child support paid to another household + +#### Family Unit Definition +Includes: +- Parents (biological, adoptive, step, legal guardians, in loco parentis, cohabitants) +- All parents' children under 18 +- Spouses of adults standing in loco parentis +- Temporarily absent members (unless >60 days, except active-duty military) + +### Copayment Structure + +#### Current Scale (effective January 1, 2023 per guidance manual Appendix B) +| Income Threshold | Monthly Fee per Child | +|---|---| +| 0-100% FPG | $0 | +| 101-200% FPG | $60 | +| 201-300% FPG | $120 | +| 301% FPG - 85% SMI | $180 | -### 22. Delaware Admin Code 16 Del. Admin. Code SS 13000-13640 -- **URL**: https://www.law.cornell.edu/regulations/delaware/16-Del-Admin-Code-SS-13000-13640 -- **Title**: The Social Security Administration (SSA) -- Delaware Social Services Manual -- **Content**: SSA determines eligibility for SSP for individuals in adult residential care -- **Source regulation**: 15 DE Reg. 202, 08/01/11 +- Maximum 3 children assessed copayments +- Total family copayment capped at 7% of gross countable income +- TANF recipients exempt from copayments -### 23. SSA State Assistance Programs for SSI Recipients, January 2011 - Delaware -- **URL**: https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/de.html -- **Status**: 403 FORBIDDEN (SSA blocks automated access -- per memory note) -- **Note**: This is the discontinued 2011 SSA report. Last published edition. +#### NEW Scale (effective July 1, 2025 per budget/regulations) +| Income Threshold | Monthly Copayment | +|---|---| +| Below 100% FPL | $5/month per child | +| All other eligible families | Up to 5% of annual income | -## Summary of State Supplement Amounts (FROZEN) +- No family pays more than 5% of income +- Regulation effective November 19, 2025 (8VAC20-790 amendment) -The Delaware state supplement amounts have been unchanged since at least 1992: +### Income Eligibility Scale (Appendix A, based on 2023 FPG and SMI) -| Claim Type | Monthly Supplement | -|---|---| -| Individual in certified residential care | $140 | -| Couple (both eligible) in certified residential care | $448 | -| Individual losing SSI due to SSDI (MAT, state-administered) | $5 | +| Family Size | Annual FPG | 100% FPG (monthly) | Group I 150% | Group II 160% | Group III 185% | 250% FPG | Exit Limit 85% SMI (monthly) | Exit Limit 85% SMI (annual) | +|---|---|---|---|---|---|---|---|---| +| 1 | $13,590 | $1,133 | $1,700 | $1,813 | $2,097 | $2,833 | $4,201 | $50,424 | +| 2 | $18,310 | $1,526 | $2,289 | $2,442 | $2,824 | $3,815 | $5,494 | $65,939 | +| 3 | $23,030 | $1,919 | $2,879 | $3,071 | $3,551 | $4,798 | $6,787 | $81,454 | +| 4 | $27,750 | $2,313 | $3,470 | $3,701 | $4,280 | $5,783 | $8,080 | $96,969 | +| 5 | $32,470 | $2,706 | $4,059 | $4,330 | $5,007 | $6,765 | $9,372 | $112,483 | +| 6 | $37,190 | $3,099 | $4,649 | $4,959 | $5,734 | $7,748 | $10,665 | $127,998 | +| 7 | $41,910 | $3,493 | $5,240 | $5,589 | $6,463 | $8,733 | $10,908 | $130,908 | +| 8 | $46,630 | $3,886 | $5,829 | $6,218 | $7,190 | $9,715 | $11,151 | $133,816 | -## Living Arrangement / OS Code Definitions +NOTE: For family sizes 7+, some 85% SMI amounts are LOWER than 250% FPG. The highlighted cells in Appendix A indicate where 85% SMI caps the eligibility even at the 250% FPG level. -| OS Code | Description | Supplement? | -|---|---|---| -| A | Adult residential care facility, assisted living facility, or adult foster care home | Yes ($140 individual / $448 couple) | -| Y | Eligible but waived supplementation | No | -| Z | All other recipients (independent living, household of another, Medicaid facility) | No | +### Program Categories + +1. **TANF Child Care** — TANF recipients (VIEW and non-VIEW); income-eligible by default +2. **SNAP E&T Child Care** — Parents in SNAP Employment & Training; income test required +3. **TANF Transitional Child Care** — Former TANF recipients; up to 12 months post-closure +4. **Head Start Wrap-Around** — Extended day/year care for Head Start-enrolled children +5. **Fee Child Care Program** — General low-income families; income test required + +### Metropolitan Statistical Area Groups (Locality-Based Income Limits) +- **Group I**: 150% FPG (lowest cost-of-living localities) +- **Group II**: 160% FPG +- **Group III**: 185% FPG (highest cost-of-living localities) +- Localities are grouped by local median income with adjustments for cost of care +- Full mapping in Appendix Z of the guidance manual + +### Maximum Reimbursable Rates (MRR) +- Rates vary by: provider type, child age, locality +- Set using a cost-of-quality estimation model (not market rate survey since 2023) +- Level 1 and Level 2 rates exist (Level 2 for higher-quality providers) +- Rates available as dataset: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates +- Effective date of current rates: August 3, 2023 +- Providers may charge above MRR; families responsible for the difference + +### Income Conversion +- Weekly income x 4.3 +- Bi-weekly income x 2.15 +- Semi-monthly income x 2 -## Federal Living Arrangement Code Mapping +--- -| Federal Code | Description | State Supplement When OS=A | +## FY26 Copayment One Pager (User-Provided PDF) + +Source: https://www.childcare.virginia.gov/home/showpublisheddocument/65775/638937831784030000 + +### Table 1: Current and New Copayment Scales + +| Income Threshold | Current Copayment Scale | Copayment Scale effective July 1, 2025 | |---|---|---| -| A | Own household / independent living | $140 / $448 | -| B | Household of another (reduced FBR) | N/A (only OS=Z) | -| C | Parental household (child) | N/A (children ineligible) | -| D | Medicaid facility ($30 personal needs) | N/A (only OS=Z) | - -Note: Federal Code A with OS Code A is the only combination that receives a state supplement. -This means the recipient must be in a certified residential care facility AND classified as -independent living (Federal Code A) rather than in a Medicaid facility (Federal Code D). - -## Eligibility Requirements - -1. Must be SSI-eligible (aged, blind, or disabled) -- adults only (18+) -2. Must reside in Delaware -3. Must reside in a certified adult residential care facility, assisted living facility, - or adult foster care home -4. State must provide certification documentation (Adult Residential Care Certification Form) -5. No additional state income disregards beyond federal SSI rules -6. Federal SSI resource limits apply ($2,000 individual / $3,000 couple) - -## State-Administered Portion (MAT) - -The state-administered portion is specifically for: -- Individuals who lost SSI eligibility due to SSDI receipt -- $5/month supplement to maintain Medicaid eligibility during transition to Medicare -- Administered by Delaware Division of Social Services (DSS) -- Established March 1, 2001 per DSSM 17800 -- Extended September 1, 2008 to cover individuals who lost Medicaid on/after January 1, 2008 - -## Key Dates - -- **Pre-1992**: Program existed but specific amounts before 1992 not documented in POMS -- **1992-present**: $140 individual / $448 couple (frozen, no COLA) -- **March 1, 2001**: MAT program established ($5 state supplement) -- **March 1, 2003**: "Residential Care Homes" definition expanded to include Adult Foster - Care Homes, Adult Residential Care Facilities, and Assisted Living Facilities -- **September 1, 2008**: MAT coverage extended +| Income = $0 | $0 | $0 | +| >0-100% FPG | $0 | $5 | +| 101-150% FPG | $60 | $125 | +| 151-200% FPG | $60 | $175 | +| 201-250% FPG | $120 | $225 | +| 251-300% FPG | $120 | $275 | +| 301-350% FPG | $180 | $325 | +| 351% FPG - 85% SMI | $180 | $375 | +| Maximum total copayment | 7% of family income | 5% of family income | + +### Table 2: Effective Dates for the New Copayment Scale + +| Redetermination due by | Copayment changes effective | +|---|---| +| June 30, 2025 | September 1, 2025 | +| July 30, 2025 | August 1, 2025 | +| August 30, 2025 or later | September 1, 2025 | + +New copayment scale fully implemented for all families by September 1, 2025. + +### Table 3: Copayment Family Scenarios + +| Family | Size | Annual/Monthly Income | % FPG | 5% of Income | Per-Child Copay (Scale) | # Children | Total Copay (Scale) | Actual Total | +|---|---|---|---|---|---|---|---|---| +| A | 4 | $36,000/$3,000 | 100-150% | $150 | $125 | 2 | $250 | $150 or $75/child | +| B | 3 | $64,800/$5,400 | 250-300% | $270 | $275 | 1 | $275 | $270 | +| C | 5 | $114,000/$9,500 | 350% FPG - 85% SMI | $475 | $375 | 2 | $750 | $475 | + +Note: Actual total copayment = min(total copayment from scale, 5% of family income) From 06f38fa5329cf9a5d9dbf78a90c9f94124fad950 Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 6 Apr 2026 16:04:02 -0400 Subject: [PATCH 03/10] Review-fix round 1: address critical issues from /review-program MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Activity min hours: 20 → 8 (Guidance Manual Section 1.1) - Remove fabricated Medicaid/WIC income waiver (only TANF per 8VAC20-790) - Young child age threshold: <= 5 → < 6 (fixes float comparison) - Remove orphaned qualified_immigration_statuses.yaml - Fix all #page= references (~30 pages off) and section format (dotted → letter) - Add 2025-07-01 copay scale tests (period: 2026-01) Co-Authored-By: Claude Opus 4.6 (1M context) --- .../dss/ccsp/activity/min_hours_per_week.yaml | 6 +- .../va/dss/ccsp/age_threshold/child.yaml | 4 +- .../ccsp/age_threshold/disabled_child.yaml | 4 +- .../va/dss/ccsp/copay/income_cap_rate.yaml | 4 +- .../va/dss/ccsp/copay/max_children.yaml | 4 +- .../va/dss/ccsp/copay/per_child_scale.yaml | 2 +- .../ccsp/income/countable_income/sources.yaml | 4 +- .../income/countable_income/subtracts.yaml | 4 +- .../va/dss/ccsp/income/exit_smi_rate.yaml | 4 +- .../income/initial_eligibility_fpg_rate.yaml | 2 +- .../income/young_child_age_threshold.yaml | 6 +- .../dss/ccsp/income/young_child_smi_rate.yaml | 4 +- .../ccsp/qualified_immigration_statuses.yaml | 19 -- .../dss/ccsp/edge_cases/integration_edge.yaml | 24 +- .../va_ccsp_activity_eligible_edge.yaml | 12 +- .../edge_cases/va_ccsp_copay_2025_07.yaml | 214 ++++++++++++++++++ .../va_ccsp_income_eligible_edge.yaml | 12 +- .../gov/states/va/dss/ccsp/va_ccsp.py | 2 +- .../va/dss/ccsp/va_ccsp_child_eligible.py | 2 +- .../gov/states/va/dss/ccsp/va_ccsp_copay.py | 4 +- .../va/dss/ccsp/va_ccsp_countable_income.py | 2 +- .../states/va/dss/ccsp/va_ccsp_eligible.py | 2 +- .../states/va/dss/ccsp/va_ccsp_enrolled.py | 2 +- .../va/dss/ccsp/va_ccsp_income_eligible.py | 10 +- .../va/dss/ccsp/va_ccsp_income_test_waived.py | 7 +- .../va/dss/ccsp/va_ccsp_locality_group.py | 2 +- 26 files changed, 275 insertions(+), 87 deletions(-) delete mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/qualified_immigration_statuses.yaml diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/activity/min_hours_per_week.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/activity/min_hours_per_week.yaml index c67285d379f..7592e425c54 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/activity/min_hours_per_week.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/activity/min_hours_per_week.yaml @@ -1,6 +1,6 @@ description: Virginia sets this amount as the minimum weekly hours of approved activity under the Child Care Subsidy Program. values: - 2023-08-01: 20 + 2023-08-01: 8 metadata: unit: hour @@ -9,5 +9,5 @@ metadata: reference: - title: 8VAC20-790-30 href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section30/ - - title: Child Care Subsidy Program Guidance Manual Section 2 - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=22 + - title: Child Care Subsidy Program Guidance Manual Section 1.1 + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=14 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/child.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/child.yaml index d4e43c69c7f..ae51ae18c24 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/child.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/child.yaml @@ -9,5 +9,5 @@ metadata: reference: - title: 8VAC20-790-20(A) href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section20/ - - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.3.1 - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=82 + - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.3 G + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=58 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/disabled_child.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/disabled_child.yaml index 7f4bceb1bc6..07c245fd376 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/disabled_child.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/disabled_child.yaml @@ -9,5 +9,5 @@ metadata: reference: - title: 8VAC20-790-20(B) href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section20/ - - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.3.1 - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=82 + - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.3 G + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=58 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/income_cap_rate.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/income_cap_rate.yaml index a963694f0ed..5f1cd52df98 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/income_cap_rate.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/income_cap_rate.yaml @@ -8,7 +8,7 @@ metadata: period: year label: Virginia CCSP copayment income cap rate reference: - - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.5 - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=100 + - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.5 A + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=69 - title: Budget Amendment HB30 Item 126 #2h href: https://budget.lis.virginia.gov/amendment/2024/2/HB30/Enrolled/CR/126/2h/ diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/max_children.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/max_children.yaml index 3b749bda586..54513637c48 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/max_children.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/max_children.yaml @@ -7,5 +7,5 @@ metadata: period: year label: Virginia CCSP maximum children assessed copayment reference: - - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.5 - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=100 + - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.5 A + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=69 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/per_child_scale.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/per_child_scale.yaml index b34d979e9b4..c8d5a766586 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/per_child_scale.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/per_child_scale.yaml @@ -8,7 +8,7 @@ metadata: label: Virginia CCSP per-child copayment scale reference: - title: Virginia Child Care Subsidy Program Guidance Manual Appendix B - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=137 + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=143 - title: FY26 Copayment One Pager href: https://childcare.virginia.gov/practitioners/subsidy-program diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/sources.yaml index 9fcc5444a95..67827a02f51 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/sources.yaml @@ -29,5 +29,5 @@ metadata: reference: - title: 8VAC20-790-40(C)(1) href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/ - - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.4.1 - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=86 + - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.4 D + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=63 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/subtracts.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/subtracts.yaml index f15f9161e17..d2053b3b2ab 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/subtracts.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/subtracts.yaml @@ -8,5 +8,5 @@ metadata: period: year label: Virginia CCSP countable income deductions reference: - - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.4.1 - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=86 + - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.4 F + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=65 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/exit_smi_rate.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/exit_smi_rate.yaml index d536b62f3ad..ad22b4bd764 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/exit_smi_rate.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/exit_smi_rate.yaml @@ -9,5 +9,5 @@ metadata: reference: - title: 8VAC20-790-40(D) href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/ - - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.4.5 - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=98 + - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.15 E + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=99 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/initial_eligibility_fpg_rate.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/initial_eligibility_fpg_rate.yaml index e91060e7988..3c012cca3c9 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/initial_eligibility_fpg_rate.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/initial_eligibility_fpg_rate.yaml @@ -10,7 +10,7 @@ metadata: - title: 8VAC20-790-40(C)(1) href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/ - title: Virginia Child Care Subsidy Program Guidance Manual Appendix A - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=136 + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=142 GROUP_I: 2023-01-01: 1.5 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_age_threshold.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_age_threshold.yaml index ce1a77826ea..ffb612b0e17 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_age_threshold.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_age_threshold.yaml @@ -1,6 +1,6 @@ description: Virginia sets this age threshold for the young child income eligibility exception under the Child Care Subsidy Program. values: - 2023-01-01: 5 + 2023-01-01: 6 metadata: unit: year @@ -9,5 +9,5 @@ metadata: reference: - title: 8VAC20-790-40(C)(2) href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/ - - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.4.2 - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=92 + - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.4 A + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=62 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_smi_rate.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_smi_rate.yaml index dbec2656bec..5dafaea2a22 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_smi_rate.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_smi_rate.yaml @@ -9,5 +9,5 @@ metadata: reference: - title: 8VAC20-790-40(C)(2) href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/ - - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.4.2 - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=92 + - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.4 A + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=62 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/qualified_immigration_statuses.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/qualified_immigration_statuses.yaml deleted file mode 100644 index 570e06bc5bd..00000000000 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/qualified_immigration_statuses.yaml +++ /dev/null @@ -1,19 +0,0 @@ -description: Virginia limits the Child Care Subsidy Program to children of these immigration statuses. -values: - 2023-01-01: - - CITIZEN - - LEGAL_PERMANENT_RESIDENT - - REFUGEE - - ASYLEE - - PAROLED_ONE_YEAR - - DEPORTATION_WITHHELD - -metadata: - label: Virginia CCSP qualified immigration statuses - period: year - unit: list - reference: - - title: 8VAC20-790-40(B)(1) - href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/ - - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.3.3 - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=84 diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/integration_edge.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/integration_edge.yaml index 15a674fd85e..22f2dd5d324 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/integration_edge.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/integration_edge.yaml @@ -45,7 +45,7 @@ va_ccsp_countable_income: 2_554.92 # Group I: 150% FPG = 30,660 - # Young child (age 4 <= 5): also check 85% SMI = 70,013.14 + # Young child (age 4 < 6): also check 85% SMI = 70,013.14 # Use max(30,660, 70,013.14) = 70,013.14 # 30,659 <= 70,013.14 -> eligible va_ccsp_income_eligible: true @@ -257,7 +257,7 @@ va_ccsp_countable_income: 4_000 # Group I: 150% FPG size 3 = 25,820 * 1.5 = 38,730 - # Has young child (age 5 <= 5): 85% SMI + # Has young child (age 5 < 6): 85% SMI # SMI size 3: 121,130 * 0.84 = 101,749.20 # 85% SMI = 86,486.82 # Use max(38,730, 86,486.82) = 86,486.82 @@ -323,7 +323,7 @@ # Benefit: max(1,000 - 60, 0) = $940 va_ccsp: 940 -- name: Case 7, WIC-eligible child waives income test for high-income family. +- name: Case 7, TANF-enrolled family waives income test for high-income family. period: 2024-01 absolute_error_margin: 0.01 input: @@ -336,7 +336,6 @@ age: 3 is_tax_unit_dependent: true immigration_status: CITIZEN - receives_wic: true tax_units: tax_unit: members: [person1, person2] @@ -345,6 +344,7 @@ members: [person1, person2] spm_unit_pre_subsidy_childcare_expenses: 18_000 va_ccsp_locality_group: GROUP_I + is_tanf_enrolled: true households: household: members: [person1, person2] @@ -359,20 +359,16 @@ # Young child exception: 85% SMI = 70,013.14 # max(30,660, 70,013.14) = 70,013.14 # 120,000 > 70,013.14 -> income test fails - # BUT WIC eligible -> income waived + # BUT TANF enrolled -> income waived va_ccsp_income_test_waived: true va_ccsp_income_eligible: true va_ccsp_eligible: true # === Copay === - # Monthly income: 120,000/12 = 10,000 - # Monthly FPG: 20,440/12 = 1,703.33 - # FPG ratio: 10,000/1,703.33 = 5.8708 -> $180/child (highest bracket) - # 1 child * $180 = $180 - # Income cap: 120,000 * 0.07/12 = 700 - # Copay: min(180, 700) = $180 - va_ccsp_copay: 180 + # TANF recipients are exempt from copayments + # (Guidance Manual Section 3.5, working_references.md) + va_ccsp_copay: 0 # Monthly expenses: 18,000/12 = 1,500 - # Benefit: max(1,500 - 180, 0) = $1,320 - va_ccsp: 1_320 + # Benefit: max(1,500 - 0, 0) = $1,500 + va_ccsp: 1_500 diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_activity_eligible_edge.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_activity_eligible_edge.yaml index c524a6ba3d1..33d370342cd 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_activity_eligible_edge.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_activity_eligible_edge.yaml @@ -1,15 +1,15 @@ # Virginia CCSP activity eligibility edge case tests # Focus: zero hours worked, exactly 1 hour, two-parent mixed, child hours ignored # -# Activity test: all heads/spouses must have (weekly_hours_worked >= 20) OR is_in_k12_school +# Activity test: all heads/spouses must have (weekly_hours_worked >= 8) OR is_in_k12_school -- name: Case 1, parent with exactly 20 hours worked (at threshold). +- name: Case 1, parent with exactly 8 hours worked (at threshold). period: 2024-01 input: people: person1: age: 30 - weekly_hours_worked: 20 + weekly_hours_worked: 8 person2: age: 5 is_tax_unit_dependent: true @@ -24,7 +24,7 @@ members: [person1, person2] state_code: VA output: - # 20 >= 20 -> meets activity requirement + # 8 >= 8 -> meets activity requirement va_ccsp_activity_eligible: true - name: Case 2, parent with zero hours and not in school. @@ -89,7 +89,7 @@ people: person1: age: 30 - weekly_hours_worked: 20 + weekly_hours_worked: 8 person2: age: 10 is_tax_unit_dependent: true @@ -108,7 +108,7 @@ output: # Only heads/spouses matter for activity test # Child's zero hours are irrelevant - # Person1 works 20hrs -> active + # Person1 works 8hrs -> active va_ccsp_activity_eligible: true - name: Case 5, two parents both zero hours both not in school. diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_2025_07.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_2025_07.yaml index 8feb0656fa2..9ac0f25dce2 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_2025_07.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_2025_07.yaml @@ -185,3 +185,217 @@ # Income cap: 84,000 * 0.07 / 12 = 490 (still 7% in Jan 2025) # Copay: min(360, 490) = $360 va_ccsp_copay: 360 + +# === NEW SCALE TESTS (period 2026-01 exercises 2025-07-01 parameters) === +# +# 2026 FPG: first_person = 15,960, additional = 5,680 +# Family of 2: 21,640 +# Monthly FPG: 21,640/12 = 1,803.33 +# +# New brackets (2025-07-01): +# 0%: $0, >0-100%: $5, >100-150%: $125, >150-200%: $175, +# >200-250%: $225, >250-300%: $275, >300-350%: $325, >350%+: $375 +# Income cap: 5% + +- name: Case 6, new scale zero income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Zero income -> FPG ratio = 0 -> $0/child + va_ccsp_copay: 0 + +- name: Case 7, new scale above $0 but under 100% FPG ($5 bracket). + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 12_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Monthly income: 12,000/12 = 1,000 + # Monthly FPG: 21,640/12 = 1,803.33 + # FPG ratio: 1,000/1,803.33 = 0.5546 -> new scale >0 = $5 + # 1 child * $5 = $5 + # Income cap: 12,000 * 0.05 / 12 = 50 + # Copay: min(5, 50) = $5 + va_ccsp_copay: 5 + +- name: Case 8, new scale above 100% FPG ($125 bracket). + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Monthly income: 24,000/12 = 2,000 + # Monthly FPG: 21,640/12 = 1,803.33 + # FPG ratio: 2,000/1,803.33 = 1.1090 -> new scale >100% = $125 + # 1 child * $125 = $125 + # Income cap: 24,000 * 0.05 / 12 = 100 + # Copay: min(125, 100) = $100 (income cap binds) + va_ccsp_copay: 100 + +- name: Case 9, new scale above 200% FPG ($225 bracket). + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 48_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Monthly income: 48,000/12 = 4,000 + # Monthly FPG: 21,640/12 = 1,803.33 + # FPG ratio: 4,000/1,803.33 = 2.2178 -> new scale >200% = $225 + # 1 child * $225 = $225 + # Income cap: 48,000 * 0.05 / 12 = 200 + # Copay: min(225, 200) = $200 (income cap binds) + va_ccsp_copay: 200 + +- name: Case 10, new scale above 350% FPG ($375 bracket). + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 84_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Monthly income: 84,000/12 = 7,000 + # Monthly FPG: 21,640/12 = 1,803.33 + # FPG ratio: 7,000/1,803.33 = 3.8814 -> new scale >350% = $375 + # 1 child * $375 = $375 + # Income cap: 84,000 * 0.05 / 12 = 350 + # Copay: min(375, 350) = $350 (income cap binds) + va_ccsp_copay: 350 + +- name: Case 11, new scale 5% income cap with 3 children. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 84_000 + immigration_status: CITIZEN + person2: + age: 10 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person3: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person4: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2, person3, person4] + state_code: VA + output: + # Monthly income: 84,000/12 = 7,000 + # FPG size 4: 15,960 + 5,680*3 = 33,000, monthly = 2,750 + # FPG ratio: 7,000/2,750 = 2.5455 -> new scale >250% = $275 + # 3 eligible children, scale total: $275 * 3 = $825 + # Income cap: 84,000 * 0.05 / 12 = 350 (5% cap) + # Copay: min(825, 350) = $350 + va_ccsp_copay: 350 diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_income_eligible_edge.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_income_eligible_edge.yaml index 707d00a9139..0371cface44 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_income_eligible_edge.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_income_eligible_edge.yaml @@ -290,7 +290,7 @@ state_code: VA output: # Group I: 150% FPG = 30,660 - # Young child (age 5 <= 5): also check 85% SMI = 70,013.14 + # Young child (age 5 < 6): also check 85% SMI = 70,013.14 # Use max(30,660, 70,013.14) = 70,013.14 # 48,000 <= 70,013.14 -> eligible va_ccsp_income_eligible: true @@ -318,7 +318,7 @@ state_code: VA output: # Group I: 150% FPG = 30,660 - # Child age 6 > 5: no SMI exception + # Child age 6 not < 6: no SMI exception # 48,000 > 30,660 -> ineligible va_ccsp_income_eligible: false @@ -379,9 +379,9 @@ # 0 <= any threshold -> eligible va_ccsp_income_eligible: true -# === MEDICAID/WIC CATEGORICAL ELIGIBILITY === +# === TANF CATEGORICAL ELIGIBILITY === -- name: Case 14, Medicaid-eligible household waives income test. +- name: Case 14, TANF-enrolled household waives income test. period: 2024-01 input: people: @@ -391,7 +391,6 @@ age: 3 is_tax_unit_dependent: true immigration_status: CITIZEN - receives_medicaid: true tax_units: tax_unit: members: [person1, person2] @@ -399,10 +398,11 @@ spm_unit: members: [person1, person2] va_ccsp_locality_group: GROUP_III + is_tanf_enrolled: true households: household: members: [person1, person2] state_code: VA output: - # Income far above any threshold but Medicaid -> waived + # Income far above any threshold but TANF -> waived va_ccsp_income_eligible: true diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp.py index ab7644213bd..462da2deb18 100644 --- a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp.py +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp.py @@ -10,7 +10,7 @@ class va_ccsp(Variable): defined_for = "va_ccsp_eligible" reference = ( "https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/", - "https://doe.virginia.gov/home/showpublisheddocument/56270#page=100", + "https://doe.virginia.gov/home/showpublisheddocument/56270#page=92", ) def formula(spm_unit, period, parameters): diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_child_eligible.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_child_eligible.py index 59457541891..8071aad384f 100644 --- a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_child_eligible.py +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_child_eligible.py @@ -9,7 +9,7 @@ class va_ccsp_child_eligible(Variable): defined_for = StateCode.VA reference = ( "https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section20/", - "https://doe.virginia.gov/home/showpublisheddocument/56270#page=82", + "https://doe.virginia.gov/home/showpublisheddocument/56270#page=58", ) def formula(person, period, parameters): diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_copay.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_copay.py index 86b39027a11..77c7f60c661 100644 --- a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_copay.py +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_copay.py @@ -9,8 +9,8 @@ class va_ccsp_copay(Variable): definition_period = MONTH defined_for = StateCode.VA reference = ( - "https://doe.virginia.gov/home/showpublisheddocument/56270#page=100", - "https://doe.virginia.gov/home/showpublisheddocument/56270#page=137", + "https://doe.virginia.gov/home/showpublisheddocument/56270#page=69", + "https://doe.virginia.gov/home/showpublisheddocument/56270#page=143", ) def formula(spm_unit, period, parameters): diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_countable_income.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_countable_income.py index 10005643d86..48d94cc93c4 100644 --- a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_countable_income.py +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_countable_income.py @@ -10,7 +10,7 @@ class va_ccsp_countable_income(Variable): defined_for = StateCode.VA reference = ( "https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/", - "https://doe.virginia.gov/home/showpublisheddocument/56270#page=86", + "https://doe.virginia.gov/home/showpublisheddocument/56270#page=63", ) adds = "gov.states.va.dss.ccsp.income.countable_income.sources" diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_eligible.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_eligible.py index d4117f65f8d..8ae904f84e3 100644 --- a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_eligible.py +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_eligible.py @@ -9,7 +9,7 @@ class va_ccsp_eligible(Variable): defined_for = StateCode.VA reference = ( "https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/", - "https://doe.virginia.gov/home/showpublisheddocument/56270#page=78", + "https://doe.virginia.gov/home/showpublisheddocument/56270#page=54", ) def formula(spm_unit, period, parameters): diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_enrolled.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_enrolled.py index b122352cea6..47860dbc2a3 100644 --- a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_enrolled.py +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_enrolled.py @@ -9,5 +9,5 @@ class va_ccsp_enrolled(Variable): defined_for = StateCode.VA reference = ( "https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/", - "https://doe.virginia.gov/home/showpublisheddocument/56270#page=98", + "https://doe.virginia.gov/home/showpublisheddocument/56270#page=96", ) diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_eligible.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_eligible.py index ef9594a34a2..4f0cf0e6504 100644 --- a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_eligible.py +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_eligible.py @@ -9,7 +9,7 @@ class va_ccsp_income_eligible(Variable): defined_for = StateCode.VA reference = ( "https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/", - "https://doe.virginia.gov/home/showpublisheddocument/56270#page=86", + "https://doe.virginia.gov/home/showpublisheddocument/56270#page=62", ) def formula(spm_unit, period, parameters): @@ -29,11 +29,11 @@ def formula(spm_unit, period, parameters): enrolled = spm_unit("va_ccsp_enrolled", period) income_limit = where(enrolled, exit_limit, initial_limit) - # Young child exception: families with a child age 5 or younger - # qualify for the higher of FPG limit or 85% SMI regardless + # Young child exception: families with a child five years of age + # or younger qualify for the higher of FPG limit or 85% SMI person = spm_unit.members age = person("age", period.this_year) - has_young_child = spm_unit.any(age <= p.young_child_age_threshold) + has_young_child = spm_unit.any(age < p.young_child_age_threshold) young_child_limit = smi * p.young_child_smi_rate income_limit = where( has_young_child & ~enrolled, @@ -43,6 +43,6 @@ def formula(spm_unit, period, parameters): income_test_passed = countable_income <= income_limit - # TANF/Medicaid/WIC categorical eligibility waives income test + # TANF categorical eligibility waives income test income_waived = spm_unit("va_ccsp_income_test_waived", period) return income_test_passed | income_waived diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_test_waived.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_test_waived.py index bba06334435..fbf6f0cd147 100644 --- a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_test_waived.py +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_test_waived.py @@ -9,11 +9,8 @@ class va_ccsp_income_test_waived(Variable): defined_for = StateCode.VA reference = ( "https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section30/", - "https://doe.virginia.gov/home/showpublisheddocument/56270#page=92", + "https://doe.virginia.gov/home/showpublisheddocument/56270#page=29", ) def formula(spm_unit, period, parameters): - is_tanf = spm_unit("is_tanf_enrolled", period) - has_medicaid = add(spm_unit, period, ["receives_medicaid"]) > 0 - has_wic = add(spm_unit, period, ["receives_wic"]) > 0 - return is_tanf | has_medicaid | has_wic + return spm_unit("is_tanf_enrolled", period) diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_locality_group.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_locality_group.py index 168478793f3..93bd038c6a8 100644 --- a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_locality_group.py +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_locality_group.py @@ -17,5 +17,5 @@ class va_ccsp_locality_group(Variable): defined_for = StateCode.VA reference = ( "https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/", - "https://doe.virginia.gov/home/showpublisheddocument/56270#page=197", + "https://doe.virginia.gov/home/showpublisheddocument/56270#page=203", ) From bab805986fdf8d99763274a47fc779a016bcadb1 Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 6 Apr 2026 16:17:42 -0400 Subject: [PATCH 04/10] Review-fix round 2: low-severity cleanup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Activity proxy: is_in_k12_school → is_full_time_student (covers post-secondary) - Fix 3 section/page references in parameter YAML - Remove stale Medicaid/WIC test comment - Changelog: CCAP → CCSP Co-Authored-By: Claude Opus 4.6 (1M context) --- changelog.d/va-ccap.added.md | 2 +- .../gov/states/va/dss/ccsp/activity/min_hours_per_week.yaml | 2 +- .../states/va/dss/ccsp/income/countable_income/sources.yaml | 2 +- .../states/va/dss/ccsp/income/countable_income/subtracts.yaml | 4 ++-- .../gov/states/va/dss/ccsp/va_ccsp_income_eligible.yaml | 1 - .../gov/states/va/dss/ccsp/va_ccsp_activity_eligible.py | 2 +- 6 files changed, 6 insertions(+), 7 deletions(-) diff --git a/changelog.d/va-ccap.added.md b/changelog.d/va-ccap.added.md index 9713f142a02..f33fcc46cde 100644 --- a/changelog.d/va-ccap.added.md +++ b/changelog.d/va-ccap.added.md @@ -1 +1 @@ -Add Virginia Child Care Assistance Program (CCAP). +Add Virginia Child Care Subsidy Program (CCSP). diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/activity/min_hours_per_week.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/activity/min_hours_per_week.yaml index 7592e425c54..c787be50488 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/activity/min_hours_per_week.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/activity/min_hours_per_week.yaml @@ -10,4 +10,4 @@ metadata: - title: 8VAC20-790-30 href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section30/ - title: Child Care Subsidy Program Guidance Manual Section 1.1 - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=14 + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=20 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/sources.yaml index 67827a02f51..fdb938e5fee 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/sources.yaml @@ -29,5 +29,5 @@ metadata: reference: - title: 8VAC20-790-40(C)(1) href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/ - - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.4 D + - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.4 E href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=63 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/subtracts.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/subtracts.yaml index d2053b3b2ab..b1969e6f7d1 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/subtracts.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/subtracts.yaml @@ -8,5 +8,5 @@ metadata: period: year label: Virginia CCSP countable income deductions reference: - - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.4 F - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=65 + - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.4 G + href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=66 diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_income_eligible.yaml index ecda7ad10bb..3dcc4570cef 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_income_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_income_eligible.yaml @@ -5,7 +5,6 @@ # - Enrolled (redetermination): income <= 85% SMI # - Families with child <= 5: also eligible if income <= 85% SMI # - TANF recipients: auto income-eligible -# - Medicaid/WIC recipients: auto income-eligible # # 2024 FPG (contiguous US): first_person = 15,060, additional = 5,380 # Family of 2: 20,440 Family of 3: 25,820 Family of 4: 31,200 diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.py index c0b189bf898..0e338e6e8e2 100644 --- a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.py +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.py @@ -17,7 +17,7 @@ def formula(spm_unit, period, parameters): person = spm_unit.members is_head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) hours_worked = person("weekly_hours_worked", period.this_year) - is_in_school = person("is_in_k12_school", period.this_year) + is_in_school = person("is_full_time_student", period.this_year) is_active = (hours_worked >= p.min_hours_per_week) | is_in_school ineligible_parent = is_head_or_spouse & ~is_active return spm_unit.sum(ineligible_parent) == 0 From 59f4d7f2240bc3e17468cc7a37c0a4b1a33be622 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 7 Apr 2026 10:59:09 -0400 Subject: [PATCH 05/10] Fix copayment one-pager reference URL Co-Authored-By: Claude Opus 4.6 (1M context) --- .../gov/states/va/dss/ccsp/copay/per_child_scale.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/per_child_scale.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/per_child_scale.yaml index c8d5a766586..871a08322e0 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/per_child_scale.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/per_child_scale.yaml @@ -9,8 +9,8 @@ metadata: reference: - title: Virginia Child Care Subsidy Program Guidance Manual Appendix B href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=143 - - title: FY26 Copayment One Pager - href: https://childcare.virginia.gov/practitioners/subsidy-program + - title: Child Care Subsidy Program (CCSP) Copayment Scale (Effective July 1, 2025) + href: https://www.childcare.virginia.gov/home/showpublisheddocument/65775/638937831784030000 brackets: # 0% FPG (income = $0): $0 copay in both eras From d4dc60200ebf99a1034c8561bffb2522366b3c22 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 7 Apr 2026 23:56:37 -0400 Subject: [PATCH 06/10] Add Maximum Reimbursable Rates (MRR) to Virginia CCSP MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 9 Ready Regions with county-to-region mapping (133 localities) - Center rates by region × age group (45 rate cells) - Family Day Home rates by region (flat across ages, 9 rates) - Part day = 70% of full day rate - Benefit now capped at sum(daily_mrr × attending_days_per_month) - New variables: ready_region (derived from county_str), provider_type, care_age_group (5 groups), is_full_day, daily_mrr - 12 new MRR test cases, existing tests updated with attending days Co-Authored-By: Claude Opus 4.6 (1M context) --- .../gov/states/va/dss/ccsp/mrr/center.yaml | 112 ++++++++++++++++++ .../va/dss/ccsp/mrr/family_day_home.yaml | 30 +++++ .../va/dss/ccsp/mrr/part_day_factor.yaml | 12 ++ .../dss/ccsp/mrr/ready_region/blue_ridge.yaml | 33 ++++++ .../ccsp/mrr/ready_region/capital_area.yaml | 17 +++ .../va/dss/ccsp/mrr/ready_region/central.yaml | 29 +++++ .../ccsp/mrr/ready_region/chesapeake_bay.yaml | 28 +++++ .../ccsp/mrr/ready_region/north_central.yaml | 23 ++++ .../ccsp/mrr/ready_region/southeastern.yaml | 22 ++++ .../dss/ccsp/mrr/ready_region/southside.yaml | 28 +++++ .../dss/ccsp/mrr/ready_region/southwest.yaml | 33 ++++++ .../va/dss/ccsp/mrr/ready_region/west.yaml | 28 +++++ .../dss/ccsp/edge_cases/integration_edge.yaml | 13 ++ .../va/dss/ccsp/edge_cases/va_ccsp_edge.yaml | 8 ++ .../gov/states/va/dss/ccsp/integration.yaml | 10 ++ .../gov/states/va/dss/ccsp/va_ccsp.yaml | 4 + .../va/dss/ccsp/va_ccsp_care_age_group.yaml | 77 ++++++++++++ .../states/va/dss/ccsp/va_ccsp_daily_mrr.yaml | 103 ++++++++++++++++ .../gov/states/va/dss/ccsp/va_ccsp.py | 6 +- .../va/dss/ccsp/va_ccsp_care_age_group.py | 33 ++++++ .../states/va/dss/ccsp/va_ccsp_daily_mrr.py | 27 +++++ .../states/va/dss/ccsp/va_ccsp_is_full_day.py | 10 ++ .../va/dss/ccsp/va_ccsp_provider_type.py | 16 +++ .../va/dss/ccsp/va_ccsp_ready_region.py | 64 ++++++++++ 24 files changed, 765 insertions(+), 1 deletion(-) create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/center.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/family_day_home.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/part_day_factor.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/blue_ridge.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/capital_area.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/central.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/chesapeake_bay.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/north_central.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/southeastern.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/southside.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/southwest.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/west.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_care_age_group.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_daily_mrr.yaml create mode 100644 policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_care_age_group.py create mode 100644 policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_daily_mrr.py create mode 100644 policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_is_full_day.py create mode 100644 policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_provider_type.py create mode 100644 policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_ready_region.py diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/center.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/center.yaml new file mode 100644 index 00000000000..6874e81ccc1 --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/center.yaml @@ -0,0 +1,112 @@ +description: Virginia sets this daily maximum reimbursement rate for child care centers under the Child Care Subsidy Program. + +metadata: + period: day + unit: currency-USD + label: Virginia CCSP center daily maximum reimbursement rate + breakdown: + - va_ccsp_ready_region + - va_ccsp_care_age_group + reference: + - title: VDOE Maximum Reimbursement Rates FY 2024 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 + +BLUE_RIDGE: + INFANT: + 2023-08-01: 70 + TODDLER: + 2023-08-01: 61 + TWO_YEAR_OLD: + 2023-08-01: 47 + PRESCHOOL: + 2023-08-01: 42 + SCHOOL_AGE: + 2023-08-01: 30 +CAPITAL_AREA: + INFANT: + 2023-08-01: 94 + TODDLER: + 2023-08-01: 81 + TWO_YEAR_OLD: + 2023-08-01: 62 + PRESCHOOL: + 2023-08-01: 59 + SCHOOL_AGE: + 2023-08-01: 52 +CENTRAL: + INFANT: + 2023-08-01: 69 + TODDLER: + 2023-08-01: 60 + TWO_YEAR_OLD: + 2023-08-01: 47 + PRESCHOOL: + 2023-08-01: 41 + SCHOOL_AGE: + 2023-08-01: 29 +CHESAPEAKE_BAY: + INFANT: + 2023-08-01: 68 + TODDLER: + 2023-08-01: 59 + TWO_YEAR_OLD: + 2023-08-01: 45 + PRESCHOOL: + 2023-08-01: 41 + SCHOOL_AGE: + 2023-08-01: 29 +NORTH_CENTRAL: + INFANT: + 2023-08-01: 83 + TODDLER: + 2023-08-01: 72 + TWO_YEAR_OLD: + 2023-08-01: 55 + PRESCHOOL: + 2023-08-01: 50 + SCHOOL_AGE: + 2023-08-01: 35 +SOUTHEASTERN: + INFANT: + 2023-08-01: 71 + TODDLER: + 2023-08-01: 61 + TWO_YEAR_OLD: + 2023-08-01: 47 + PRESCHOOL: + 2023-08-01: 42 + SCHOOL_AGE: + 2023-08-01: 30 +SOUTHSIDE: + INFANT: + 2023-08-01: 64 + TODDLER: + 2023-08-01: 56 + TWO_YEAR_OLD: + 2023-08-01: 43 + PRESCHOOL: + 2023-08-01: 39 + SCHOOL_AGE: + 2023-08-01: 28 +SOUTHWEST: + INFANT: + 2023-08-01: 63 + TODDLER: + 2023-08-01: 55 + TWO_YEAR_OLD: + 2023-08-01: 42 + PRESCHOOL: + 2023-08-01: 38 + SCHOOL_AGE: + 2023-08-01: 27 +WEST: + INFANT: + 2023-08-01: 67 + TODDLER: + 2023-08-01: 58 + TWO_YEAR_OLD: + 2023-08-01: 45 + PRESCHOOL: + 2023-08-01: 41 + SCHOOL_AGE: + 2023-08-01: 29 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/family_day_home.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/family_day_home.yaml new file mode 100644 index 00000000000..e9475cc2c9b --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/family_day_home.yaml @@ -0,0 +1,30 @@ +description: Virginia sets this daily maximum reimbursement rate for family day homes under the Child Care Subsidy Program. + +metadata: + period: day + unit: currency-USD + label: Virginia CCSP family day home daily maximum reimbursement rate + breakdown: + - va_ccsp_ready_region + reference: + - title: VDOE Maximum Reimbursement Rates FY 2024 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 + +BLUE_RIDGE: + 2023-08-01: 53 +CAPITAL_AREA: + 2023-08-01: 62 +CENTRAL: + 2023-08-01: 53 +CHESAPEAKE_BAY: + 2023-08-01: 51 +NORTH_CENTRAL: + 2023-08-01: 53 +SOUTHEASTERN: + 2023-08-01: 54 +SOUTHSIDE: + 2023-08-01: 49 +SOUTHWEST: + 2023-08-01: 48 +WEST: + 2023-08-01: 51 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/part_day_factor.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/part_day_factor.yaml new file mode 100644 index 00000000000..16c26ab721f --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/part_day_factor.yaml @@ -0,0 +1,12 @@ +description: Virginia sets this share of the full day rate as the part day maximum reimbursement rate under the Child Care Subsidy Program. + +values: + 2023-08-01: 0.7 + +metadata: + unit: /1 + period: year + label: Virginia CCSP part day factor + reference: + - title: VDOE Maximum Reimbursement Rates FY 2024 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/blue_ridge.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/blue_ridge.yaml new file mode 100644 index 00000000000..67582c3eb84 --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/blue_ridge.yaml @@ -0,0 +1,33 @@ +description: Virginia defines these localities as the Blue Ridge Ready Region under the Child Care Subsidy Program. + +metadata: + unit: list + period: year + label: Virginia CCSP Blue Ridge Ready Region localities + reference: + - title: VDOE Maximum Reimbursement Rates FY 2024 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 + +values: + 2023-08-01: + - ALBEMARLE_COUNTY_VA + - AUGUSTA_COUNTY_VA + - BUCKINGHAM_COUNTY_VA + - CHARLOTTESVILLE_CITY_VA + - CLARKE_COUNTY_VA + - FLUVANNA_COUNTY_VA + - FREDERICK_COUNTY_VA + - GREENE_COUNTY_VA + - HARRISONBURG_CITY_VA + - LOUISA_COUNTY_VA + - MADISON_COUNTY_VA + - NELSON_COUNTY_VA + - ORANGE_COUNTY_VA + - PAGE_COUNTY_VA + - RAPPAHANNOCK_COUNTY_VA + - ROCKINGHAM_COUNTY_VA + - SHENANDOAH_COUNTY_VA + - STAUNTON_CITY_VA + - WARREN_COUNTY_VA + - WAYNESBORO_CITY_VA + - WINCHESTER_CITY_VA diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/capital_area.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/capital_area.yaml new file mode 100644 index 00000000000..2c38436f6cc --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/capital_area.yaml @@ -0,0 +1,17 @@ +description: Virginia defines these localities as the Capital Area Ready Region under the Child Care Subsidy Program. + +metadata: + unit: list + period: year + label: Virginia CCSP Capital Area Ready Region localities + reference: + - title: VDOE Maximum Reimbursement Rates FY 2024 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 + +values: + 2023-08-01: + - ALEXANDRIA_CITY_VA + - ARLINGTON_COUNTY_VA + - FAIRFAX_CITY_VA + - FAIRFAX_COUNTY_VA + - FALLS_CHURCH_CITY_VA diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/central.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/central.yaml new file mode 100644 index 00000000000..8efa356c99c --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/central.yaml @@ -0,0 +1,29 @@ +description: Virginia defines these localities as the Central Ready Region under the Child Care Subsidy Program. + +metadata: + unit: list + period: year + label: Virginia CCSP Central Ready Region localities + reference: + - title: VDOE Maximum Reimbursement Rates FY 2024 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 + +values: + 2023-08-01: + - CHARLES_CITY_COUNTY_VA + - CHESTERFIELD_COUNTY_VA + - COLONIAL_HEIGHTS_CITY_VA + - DINWIDDIE_COUNTY_VA + - EMPORIA_CITY_VA + - GOOCHLAND_COUNTY_VA + - GREENSVILLE_COUNTY_VA + - HANOVER_COUNTY_VA + - HENRICO_COUNTY_VA + - HOPEWELL_CITY_VA + - NEW_KENT_COUNTY_VA + - PETERSBURG_CITY_VA + - POWHATAN_COUNTY_VA + - PRINCE_GEORGE_COUNTY_VA + - RICHMOND_CITY_VA + - SURRY_COUNTY_VA + - SUSSEX_COUNTY_VA diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/chesapeake_bay.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/chesapeake_bay.yaml new file mode 100644 index 00000000000..758509be06f --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/chesapeake_bay.yaml @@ -0,0 +1,28 @@ +description: Virginia defines these localities as the Chesapeake Bay Ready Region under the Child Care Subsidy Program. + +metadata: + unit: list + period: year + label: Virginia CCSP Chesapeake Bay Ready Region localities + reference: + - title: VDOE Maximum Reimbursement Rates FY 2024 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 + +values: + 2023-08-01: + - ESSEX_COUNTY_VA + - GLOUCESTER_COUNTY_VA + - HAMPTON_CITY_VA + - JAMES_CITY_COUNTY_VA + - KING_AND_QUEEN_COUNTY_VA + - KING_WILLIAM_COUNTY_VA + - LANCASTER_COUNTY_VA + - MATHEWS_COUNTY_VA + - MIDDLESEX_COUNTY_VA + - NEWPORT_NEWS_CITY_VA + - NORTHUMBERLAND_COUNTY_VA + - POQUOSON_CITY_VA + - RICHMOND_COUNTY_VA + - WESTMORELAND_COUNTY_VA + - WILLIAMSBURG_CITY_VA + - YORK_COUNTY_VA diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/north_central.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/north_central.yaml new file mode 100644 index 00000000000..91b04f38832 --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/north_central.yaml @@ -0,0 +1,23 @@ +description: Virginia defines these localities as the North Central Ready Region under the Child Care Subsidy Program. + +metadata: + unit: list + period: year + label: Virginia CCSP North Central Ready Region localities + reference: + - title: VDOE Maximum Reimbursement Rates FY 2024 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 + +values: + 2023-08-01: + - CAROLINE_COUNTY_VA + - CULPEPER_COUNTY_VA + - FAUQUIER_COUNTY_VA + - FREDERICKSBURG_CITY_VA + - KING_GEORGE_COUNTY_VA + - LOUDOUN_COUNTY_VA + - MANASSAS_CITY_VA + - MANASSAS_PARK_CITY_VA + - PRINCE_WILLIAM_COUNTY_VA + - SPOTSYLVANIA_COUNTY_VA + - STAFFORD_COUNTY_VA diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/southeastern.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/southeastern.yaml new file mode 100644 index 00000000000..8fa2c6c3b2d --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/southeastern.yaml @@ -0,0 +1,22 @@ +description: Virginia defines these localities as the Southeastern Ready Region under the Child Care Subsidy Program. + +metadata: + unit: list + period: year + label: Virginia CCSP Southeastern Ready Region localities + reference: + - title: VDOE Maximum Reimbursement Rates FY 2024 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 + +values: + 2023-08-01: + - ACCOMACK_COUNTY_VA + - CHESAPEAKE_CITY_VA + - FRANKLIN_CITY_VA + - ISLE_OF_WIGHT_COUNTY_VA + - NORFOLK_CITY_VA + - NORTHAMPTON_COUNTY_VA + - PORTSMOUTH_CITY_VA + - SOUTHAMPTON_COUNTY_VA + - SUFFOLK_CITY_VA + - VIRGINIA_BEACH_CITY_VA diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/southside.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/southside.yaml new file mode 100644 index 00000000000..4d224fad72e --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/southside.yaml @@ -0,0 +1,28 @@ +description: Virginia defines these localities as the Southside Ready Region under the Child Care Subsidy Program. + +metadata: + unit: list + period: year + label: Virginia CCSP Southside Ready Region localities + reference: + - title: VDOE Maximum Reimbursement Rates FY 2024 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 + +values: + 2023-08-01: + - AMELIA_COUNTY_VA + - AMHERST_COUNTY_VA + - APPOMATTOX_COUNTY_VA + - BEDFORD_COUNTY_VA + - BRUNSWICK_COUNTY_VA + - CAMPBELL_COUNTY_VA + - CHARLOTTE_COUNTY_VA + - CUMBERLAND_COUNTY_VA + - DANVILLE_CITY_VA + - HALIFAX_COUNTY_VA + - LUNENBURG_COUNTY_VA + - LYNCHBURG_CITY_VA + - MECKLENBURG_COUNTY_VA + - NOTTOWAY_COUNTY_VA + - PITTSYLVANIA_COUNTY_VA + - PRINCE_EDWARD_COUNTY_VA diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/southwest.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/southwest.yaml new file mode 100644 index 00000000000..7eb18bb598b --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/southwest.yaml @@ -0,0 +1,33 @@ +description: Virginia defines these localities as the Southwest Ready Region under the Child Care Subsidy Program. + +metadata: + unit: list + period: year + label: Virginia CCSP Southwest Ready Region localities + reference: + - title: VDOE Maximum Reimbursement Rates FY 2024 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 + +values: + 2023-08-01: + - BLAND_COUNTY_VA + - BRISTOL_CITY_VA + - BUCHANAN_COUNTY_VA + - CARROLL_COUNTY_VA + - DICKENSON_COUNTY_VA + - FLOYD_COUNTY_VA + - GALAX_CITY_VA + - GILES_COUNTY_VA + - GRAYSON_COUNTY_VA + - LEE_COUNTY_VA + - MONTGOMERY_COUNTY_VA + - NORTON_CITY_VA + - PULASKI_COUNTY_VA + - RADFORD_CITY_VA + - RUSSELL_COUNTY_VA + - SCOTT_COUNTY_VA + - SMYTH_COUNTY_VA + - TAZEWELL_COUNTY_VA + - WASHINGTON_COUNTY_VA + - WISE_COUNTY_VA + - WYTHE_COUNTY_VA diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/west.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/west.yaml new file mode 100644 index 00000000000..41efbc3b0ad --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/west.yaml @@ -0,0 +1,28 @@ +description: Virginia defines these localities as the West Ready Region under the Child Care Subsidy Program. + +metadata: + unit: list + period: year + label: Virginia CCSP West Ready Region localities + reference: + - title: VDOE Maximum Reimbursement Rates FY 2024 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 + +values: + 2023-08-01: + - ALLEGHANY_COUNTY_VA + - BATH_COUNTY_VA + - BOTETOURT_COUNTY_VA + - BUENA_VISTA_CITY_VA + - COVINGTON_CITY_VA + - CRAIG_COUNTY_VA + - FRANKLIN_COUNTY_VA + - HENRY_COUNTY_VA + - HIGHLAND_COUNTY_VA + - LEXINGTON_CITY_VA + - MARTINSVILLE_CITY_VA + - PATRICK_COUNTY_VA + - ROANOKE_CITY_VA + - ROANOKE_COUNTY_VA + - ROCKBRIDGE_COUNTY_VA + - SALEM_CITY_VA diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/integration_edge.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/integration_edge.yaml index 22f2dd5d324..88bb2ebc5c3 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/integration_edge.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/integration_edge.yaml @@ -23,6 +23,7 @@ person2: age: 4 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -76,6 +77,7 @@ person2: age: 8 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -113,6 +115,7 @@ person2: age: 8 is_tax_unit_dependent: true + childcare_attending_days_per_month: 40 immigration_status: CITIZEN tax_units: tax_unit: @@ -127,6 +130,7 @@ household: members: [person1, person2] state_code: VA + va_ccsp_ready_region: CAPITAL_AREA output: va_ccsp_child_eligible: [false, true] @@ -163,18 +167,22 @@ person2: age: 11 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person3: age: 8 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person4: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person5: age: 3 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -232,10 +240,12 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person3: age: 6 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -290,6 +300,7 @@ person2: age: 15 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 is_disabled: true immigration_status: CITIZEN tax_units: @@ -335,6 +346,7 @@ person2: age: 3 is_tax_unit_dependent: true + childcare_attending_days_per_month: 40 immigration_status: CITIZEN tax_units: tax_unit: @@ -349,6 +361,7 @@ household: members: [person1, person2] state_code: VA + va_ccsp_ready_region: CAPITAL_AREA output: va_ccsp_child_eligible: [false, true] diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_edge.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_edge.yaml index 06f82745c1b..62811b9b313 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_edge.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_edge.yaml @@ -17,6 +17,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -46,6 +47,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -79,6 +81,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -110,6 +113,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 40 immigration_status: CITIZEN tax_units: tax_unit: @@ -123,6 +127,7 @@ household: members: [person1, person2] state_code: VA + va_ccsp_ready_region: CAPITAL_AREA output: # Zero income -> $0 copay # Monthly expenses: 24,000/12 = 2,000 @@ -141,6 +146,7 @@ person2: age: 4 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -155,6 +161,7 @@ household: members: [person1, person2] state_code: VA + va_ccsp_ready_region: CAPITAL_AREA output: # TANF -> $0 copay # Monthly expenses: 14,400/12 = 1,200 @@ -173,6 +180,7 @@ person2: age: 8 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/integration.yaml index 4e23e638377..6b1088b5252 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/integration.yaml @@ -30,6 +30,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -95,10 +96,12 @@ person3: age: 10 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person4: age: 7 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -156,6 +159,7 @@ person2: age: 3 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: LEGAL_PERMANENT_RESIDENT tax_units: tax_unit: @@ -204,6 +208,7 @@ person2: age: 2 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -217,6 +222,7 @@ household: members: [person1, person2] state_code: VA + va_ccsp_ready_region: CAPITAL_AREA output: # === Child eligibility === va_ccsp_child_eligible: [false, true] @@ -260,6 +266,7 @@ person2: age: 10 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -296,6 +303,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: UNDOCUMENTED tax_units: tax_unit: @@ -328,10 +336,12 @@ person2: age: 4 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person3: age: 2 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp.yaml index 1180c87a6fe..44ba8412c93 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp.yaml @@ -14,6 +14,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -50,6 +51,7 @@ person2: age: 8 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -87,6 +89,7 @@ person2: age: 8 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -114,6 +117,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_care_age_group.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_care_age_group.yaml new file mode 100644 index 00000000000..180fbf2d527 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_care_age_group.yaml @@ -0,0 +1,77 @@ +- name: Case 1, newborn is infant. + period: 2024 + input: + people: + person1: + age: 0 + households: + household: + members: [person1] + state_code: VA + output: + va_ccsp_care_age_group: INFANT + +- name: Case 2, 1 year old is toddler. + period: 2024 + input: + people: + person1: + age: 1 + households: + household: + members: [person1] + state_code: VA + output: + va_ccsp_care_age_group: TODDLER + +- name: Case 3, 2 year old. + period: 2024 + input: + people: + person1: + age: 2 + households: + household: + members: [person1] + state_code: VA + output: + va_ccsp_care_age_group: TWO_YEAR_OLD + +- name: Case 4, 4 year old is preschool. + period: 2024 + input: + people: + person1: + age: 4 + households: + household: + members: [person1] + state_code: VA + output: + va_ccsp_care_age_group: PRESCHOOL + +- name: Case 5, 7 year old is school age. + period: 2024 + input: + people: + person1: + age: 7 + households: + household: + members: [person1] + state_code: VA + output: + va_ccsp_care_age_group: SCHOOL_AGE + +- name: Case 6, 5 year old is preschool. + period: 2024 + input: + people: + person1: + age: 5 + households: + household: + members: [person1] + state_code: VA + output: + va_ccsp_care_age_group: PRESCHOOL diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_daily_mrr.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_daily_mrr.yaml new file mode 100644 index 00000000000..18cd62a76a8 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_daily_mrr.yaml @@ -0,0 +1,103 @@ +- name: Case 1, center infant in Capital Area full day. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 0 + va_ccsp_provider_type: CENTER + va_ccsp_is_full_day: true + households: + household: + members: [person1] + state_code: VA + va_ccsp_ready_region: CAPITAL_AREA + output: + va_ccsp_daily_mrr: 94 + +- name: Case 2, center school age in Southwest full day. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 8 + va_ccsp_provider_type: CENTER + va_ccsp_is_full_day: true + households: + household: + members: [person1] + state_code: VA + va_ccsp_ready_region: SOUTHWEST + output: + va_ccsp_daily_mrr: 27 + +- name: Case 3, family day home in Southeastern full day. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 3 + va_ccsp_provider_type: FAMILY_DAY_HOME + va_ccsp_is_full_day: true + households: + household: + members: [person1] + state_code: VA + va_ccsp_ready_region: SOUTHEASTERN + output: + va_ccsp_daily_mrr: 54 + +- name: Case 4, center toddler in Blue Ridge part day. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 1 + va_ccsp_provider_type: CENTER + va_ccsp_is_full_day: false + households: + household: + members: [person1] + state_code: VA + va_ccsp_ready_region: BLUE_RIDGE + output: + # Full day: $61, part day: $61 * 0.7 = $42.7 + va_ccsp_daily_mrr: 42.7 + +- name: Case 5, family day home in West part day. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 4 + va_ccsp_provider_type: FAMILY_DAY_HOME + va_ccsp_is_full_day: false + households: + household: + members: [person1] + state_code: VA + va_ccsp_ready_region: WEST + output: + # Full day: $51, part day: $51 * 0.7 = $35.7 + va_ccsp_daily_mrr: 35.7 + +- name: Case 6, center 2 year old in North Central full day. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 2 + va_ccsp_provider_type: CENTER + va_ccsp_is_full_day: true + households: + household: + members: [person1] + state_code: VA + va_ccsp_ready_region: NORTH_CENTRAL + output: + va_ccsp_daily_mrr: 55 diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp.py index 462da2deb18..815ae50afe4 100644 --- a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp.py +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp.py @@ -16,4 +16,8 @@ class va_ccsp(Variable): def formula(spm_unit, period, parameters): expenses = spm_unit("spm_unit_pre_subsidy_childcare_expenses", period) copay = spm_unit("va_ccsp_copay", period) - return max_(expenses - copay, 0) + person = spm_unit.members + daily_mrr = person("va_ccsp_daily_mrr", period) + attending_days = person("childcare_attending_days_per_month", period.this_year) + monthly_mrr = spm_unit.sum(daily_mrr * attending_days) + return min_(max_(expenses - copay, 0), monthly_mrr) diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_care_age_group.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_care_age_group.py new file mode 100644 index 00000000000..1b8378ae5af --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_care_age_group.py @@ -0,0 +1,33 @@ +from policyengine_us.model_api import * + + +class VACCSPCareAgeGroup(Enum): + INFANT = "Infant" + TODDLER = "Toddler" + TWO_YEAR_OLD = "2 year old" + PRESCHOOL = "Pre-School" + SCHOOL_AGE = "School Age" + + +class va_ccsp_care_age_group(Variable): + value_type = Enum + possible_values = VACCSPCareAgeGroup + default_value = VACCSPCareAgeGroup.INFANT + entity = Person + definition_period = YEAR + label = "Virginia CCSP care age group" + defined_for = StateCode.VA + reference = "https://ris.dls.virginia.gov/uploads/22VAC40/dibr/VDOE%20Child%20Care%20Program%20Guidance%20Manual%205.3.2023-20240822104447.pdf#page=203" + + def formula(person, period, parameters): + age = person("age", period) + return select( + [age < 1, age < 2, age < 3, age < 6, age < 13], + [ + VACCSPCareAgeGroup.INFANT, + VACCSPCareAgeGroup.TODDLER, + VACCSPCareAgeGroup.TWO_YEAR_OLD, + VACCSPCareAgeGroup.PRESCHOOL, + VACCSPCareAgeGroup.SCHOOL_AGE, + ], + ) diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_daily_mrr.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_daily_mrr.py new file mode 100644 index 00000000000..516f07bc135 --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_daily_mrr.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.va.dss.ccsp.va_ccsp_provider_type import ( + VACCSPProviderType, +) + + +class va_ccsp_daily_mrr(Variable): + value_type = float + entity = Person + definition_period = MONTH + unit = USD + label = "Virginia CCSP daily maximum reimbursable rate" + defined_for = StateCode.VA + reference = "https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates" + + def formula(person, period, parameters): + p = parameters(period).gov.states.va.dss.ccsp.mrr + region = person.household("va_ccsp_ready_region", period.this_year) + provider_type = person("va_ccsp_provider_type", period.this_year) + age_group = person("va_ccsp_care_age_group", period.this_year) + is_full_day = person("va_ccsp_is_full_day", period.this_year) + + is_center = provider_type == provider_type.possible_values.CENTER + center_rate = p.center[region][age_group] + fdh_rate = p.family_day_home[region] + full_day_rate = where(is_center, center_rate, fdh_rate) + return where(is_full_day, full_day_rate, full_day_rate * p.part_day_factor) diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_is_full_day.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_is_full_day.py new file mode 100644 index 00000000000..46da75a7dfa --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_is_full_day.py @@ -0,0 +1,10 @@ +from policyengine_us.model_api import * + + +class va_ccsp_is_full_day(Variable): + value_type = bool + entity = Person + definition_period = YEAR + default_value = True + label = "Virginia CCSP full day care" + defined_for = StateCode.VA diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_provider_type.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_provider_type.py new file mode 100644 index 00000000000..6b848cd0fec --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_provider_type.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + + +class VACCSPProviderType(Enum): + CENTER = "Center" + FAMILY_DAY_HOME = "Family Day Home" + + +class va_ccsp_provider_type(Variable): + value_type = Enum + possible_values = VACCSPProviderType + default_value = VACCSPProviderType.CENTER + entity = Person + definition_period = YEAR + label = "Virginia CCSP provider type" + defined_for = StateCode.VA diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_ready_region.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_ready_region.py new file mode 100644 index 00000000000..34abbae255e --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_ready_region.py @@ -0,0 +1,64 @@ +from policyengine_us.model_api import * + + +class VACCSPReadyRegion(Enum): + BLUE_RIDGE = "Blue Ridge" + CAPITAL_AREA = "Capital Area" + CENTRAL = "Central" + CHESAPEAKE_BAY = "Chesapeake Bay" + NORTH_CENTRAL = "North Central" + SOUTHEASTERN = "Southeastern" + SOUTHSIDE = "Southside" + SOUTHWEST = "Southwest" + WEST = "West" + + +class va_ccsp_ready_region(Variable): + value_type = Enum + possible_values = VACCSPReadyRegion + default_value = VACCSPReadyRegion.CENTRAL + entity = Household + definition_period = YEAR + label = "Virginia CCSP Ready Region" + defined_for = StateCode.VA + reference = "https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates" + + def formula(household, period, parameters): + county = household("county_str", period) + p = parameters(period).gov.states.va.dss.ccsp.mrr.ready_region + + blue_ridge = np.isin(county, p.blue_ridge) + capital_area = np.isin(county, p.capital_area) + central = np.isin(county, p.central) + chesapeake_bay = np.isin(county, p.chesapeake_bay) + north_central = np.isin(county, p.north_central) + southeastern = np.isin(county, p.southeastern) + southside = np.isin(county, p.southside) + southwest = np.isin(county, p.southwest) + west = np.isin(county, p.west) + + return select( + [ + blue_ridge, + capital_area, + central, + chesapeake_bay, + north_central, + southeastern, + southside, + southwest, + west, + ], + [ + VACCSPReadyRegion.BLUE_RIDGE, + VACCSPReadyRegion.CAPITAL_AREA, + VACCSPReadyRegion.CENTRAL, + VACCSPReadyRegion.CHESAPEAKE_BAY, + VACCSPReadyRegion.NORTH_CENTRAL, + VACCSPReadyRegion.SOUTHEASTERN, + VACCSPReadyRegion.SOUTHSIDE, + VACCSPReadyRegion.SOUTHWEST, + VACCSPReadyRegion.WEST, + ], + default=VACCSPReadyRegion.CENTRAL, + ) From beef6e5324a1de4dd52d6df2d431d045c0dbfbb5 Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 8 Apr 2026 00:54:18 -0400 Subject: [PATCH 07/10] Review-fix round 3: locality groups, Fairfax exception, Medicaid/WIC waiver, month-based age cutoffs - Derive locality group from county using Appendix Z mappings (was bare input defaulting to GROUP_III) - Add Fairfax/Alexandria 250% FPG exception capped at 85% SMI - Add Medicaid and WIC recipients to income test waiver (was TANF-only) - Use month-based age cutoffs for care age groups (16/24/36/72 months vs whole-year) - Update copay reference URL to correct PDF link - Rename mrr/ to maximum_reimbursement_rate/ - Remove sources/working_references.md - Add tests for locality group derivation, income waiver, and Fairfax exception Co-Authored-By: Claude Opus 4.6 (1M context) --- .../income/fairfax_alexandria_fpg_rate.yaml | 12 + .../ccsp/localities/fairfax_alexandria.yaml | 15 + .../states/va/dss/ccsp/localities/group1.yaml | 98 ++++++ .../states/va/dss/ccsp/localities/group2.yaml | 45 +++ .../states/va/dss/ccsp/localities/group3.yaml | 30 ++ .../care_age_group.yaml | 33 ++ .../center.yaml | 0 .../family_day_home.yaml | 0 .../part_day_factor.yaml | 0 .../ready_region/blue_ridge.yaml | 0 .../ready_region/capital_area.yaml | 0 .../ready_region/central.yaml | 0 .../ready_region/chesapeake_bay.yaml | 0 .../ready_region/north_central.yaml | 0 .../ready_region/southeastern.yaml | 0 .../ready_region/southside.yaml | 0 .../ready_region/southwest.yaml | 0 .../ready_region/west.yaml | 0 .../dss/ccsp/edge_cases/integration_edge.yaml | 7 +- .../va_ccsp_income_eligible_edge.yaml | 161 ++++++++++ .../va/dss/ccsp/va_ccsp_care_age_group.yaml | 67 +++- .../states/va/dss/ccsp/va_ccsp_daily_mrr.yaml | 7 +- .../dss/ccsp/va_ccsp_income_test_waived.yaml | 85 ++++++ .../va/dss/ccsp/va_ccsp_locality_group.yaml | 135 ++++++++ .../va/dss/ccsp/va_ccsp_activity_eligible.py | 10 +- .../va/dss/ccsp/va_ccsp_care_age_group.py | 16 +- .../states/va/dss/ccsp/va_ccsp_daily_mrr.py | 2 +- .../va/dss/ccsp/va_ccsp_income_eligible.py | 9 +- .../va/dss/ccsp/va_ccsp_income_test_waived.py | 8 +- .../va/dss/ccsp/va_ccsp_locality_group.py | 20 +- .../va/dss/ccsp/va_ccsp_ready_region.py | 4 +- sources/working_references.md | 289 ------------------ uv.lock | 4 +- 33 files changed, 731 insertions(+), 326 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/income/fairfax_alexandria_fpg_rate.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/localities/fairfax_alexandria.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group1.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group2.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group3.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/care_age_group.yaml rename policyengine_us/parameters/gov/states/va/dss/ccsp/{mrr => maximum_reimbursement_rate}/center.yaml (100%) rename policyengine_us/parameters/gov/states/va/dss/ccsp/{mrr => maximum_reimbursement_rate}/family_day_home.yaml (100%) rename policyengine_us/parameters/gov/states/va/dss/ccsp/{mrr => maximum_reimbursement_rate}/part_day_factor.yaml (100%) rename policyengine_us/parameters/gov/states/va/dss/ccsp/{mrr => maximum_reimbursement_rate}/ready_region/blue_ridge.yaml (100%) rename policyengine_us/parameters/gov/states/va/dss/ccsp/{mrr => maximum_reimbursement_rate}/ready_region/capital_area.yaml (100%) rename policyengine_us/parameters/gov/states/va/dss/ccsp/{mrr => maximum_reimbursement_rate}/ready_region/central.yaml (100%) rename policyengine_us/parameters/gov/states/va/dss/ccsp/{mrr => maximum_reimbursement_rate}/ready_region/chesapeake_bay.yaml (100%) rename policyengine_us/parameters/gov/states/va/dss/ccsp/{mrr => maximum_reimbursement_rate}/ready_region/north_central.yaml (100%) rename policyengine_us/parameters/gov/states/va/dss/ccsp/{mrr => maximum_reimbursement_rate}/ready_region/southeastern.yaml (100%) rename policyengine_us/parameters/gov/states/va/dss/ccsp/{mrr => maximum_reimbursement_rate}/ready_region/southside.yaml (100%) rename policyengine_us/parameters/gov/states/va/dss/ccsp/{mrr => maximum_reimbursement_rate}/ready_region/southwest.yaml (100%) rename policyengine_us/parameters/gov/states/va/dss/ccsp/{mrr => maximum_reimbursement_rate}/ready_region/west.yaml (100%) create mode 100644 policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_income_test_waived.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_locality_group.yaml delete mode 100644 sources/working_references.md diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/fairfax_alexandria_fpg_rate.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/fairfax_alexandria_fpg_rate.yaml new file mode 100644 index 00000000000..50b6f2fecf0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/fairfax_alexandria_fpg_rate.yaml @@ -0,0 +1,12 @@ +description: Virginia limits initial income eligibility to this share of the federal poverty guideline for Fairfax and Alexandria under the Child Care Subsidy Program. + +values: + 2023-01-01: 2.5 + +metadata: + unit: /1 + period: year + label: Virginia CCSP Fairfax/Alexandria FPG rate + reference: + - title: Virginia Child Care Subsidy Program Guidance Manual Appendix Z footnote + href: https://www.childcare.virginia.gov/home/showpublisheddocument/66667/638981099706730000#page=206 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/fairfax_alexandria.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/fairfax_alexandria.yaml new file mode 100644 index 00000000000..e5e47557d65 --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/fairfax_alexandria.yaml @@ -0,0 +1,15 @@ +description: Virginia lists these localities as having a higher income eligibility threshold under the Child Care Subsidy Program. + +values: + 2023-01-01: + - FAIRFAX_COUNTY_VA + - FAIRFAX_CITY_VA + - ALEXANDRIA_CITY_VA + +metadata: + unit: list + period: year + label: Virginia CCSP Fairfax/Alexandria exception localities + reference: + - title: Virginia Child Care Subsidy Program Guidance Manual Appendix Z footnote + href: https://www.childcare.virginia.gov/home/showpublisheddocument/66667/638981099706730000#page=206 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group1.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group1.yaml new file mode 100644 index 00000000000..2d2768639b9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group1.yaml @@ -0,0 +1,98 @@ +description: Virginia lists these localities as Income Cap Group I under the Child Care Subsidy Program. + +values: + 2023-01-01: + # Counties + - ACCOMACK_COUNTY_VA + - ALLEGHANY_COUNTY_VA + - AMELIA_COUNTY_VA + - AMHERST_COUNTY_VA + - APPOMATTOX_COUNTY_VA + - AUGUSTA_COUNTY_VA + - BATH_COUNTY_VA + - BEDFORD_COUNTY_VA + - BLAND_COUNTY_VA + - BOTETOURT_COUNTY_VA + - BRUNSWICK_COUNTY_VA + - BUCHANAN_COUNTY_VA + - BUCKINGHAM_COUNTY_VA + - CAMPBELL_COUNTY_VA + - CAROLINE_COUNTY_VA + - CARROLL_COUNTY_VA + - CHARLOTTE_COUNTY_VA + - CRAIG_COUNTY_VA + - CUMBERLAND_COUNTY_VA + - DICKENSON_COUNTY_VA + - ESSEX_COUNTY_VA + - FLOYD_COUNTY_VA + - FRANKLIN_COUNTY_VA + - FREDERICK_COUNTY_VA + - GILES_COUNTY_VA + - GRAYSON_COUNTY_VA + - GREENSVILLE_COUNTY_VA + - HALIFAX_COUNTY_VA + - HENRY_COUNTY_VA + - HIGHLAND_COUNTY_VA + - KING_AND_QUEEN_COUNTY_VA + - KING_WILLIAM_COUNTY_VA + - LANCASTER_COUNTY_VA + - LEE_COUNTY_VA + - LOUISA_COUNTY_VA + - LUNENBURG_COUNTY_VA + - MADISON_COUNTY_VA + - MECKLENBURG_COUNTY_VA + - MIDDLESEX_COUNTY_VA + - MONTGOMERY_COUNTY_VA + - NELSON_COUNTY_VA + - NORTHAMPTON_COUNTY_VA + - NORTHUMBERLAND_COUNTY_VA + - NOTTOWAY_COUNTY_VA + - ORANGE_COUNTY_VA + - PAGE_COUNTY_VA + - PATRICK_COUNTY_VA + - PITTSYLVANIA_COUNTY_VA + - PRINCE_EDWARD_COUNTY_VA + - PULASKI_COUNTY_VA + - RAPPAHANNOCK_COUNTY_VA + - RICHMOND_COUNTY_VA + - ROANOKE_COUNTY_VA + - ROCKBRIDGE_COUNTY_VA + - ROCKINGHAM_COUNTY_VA + - RUSSELL_COUNTY_VA + - SCOTT_COUNTY_VA + - SHENANDOAH_COUNTY_VA + - SMYTH_COUNTY_VA + - SOUTHAMPTON_COUNTY_VA + - SURRY_COUNTY_VA + - SUSSEX_COUNTY_VA + - TAZEWELL_COUNTY_VA + - WASHINGTON_COUNTY_VA + - WESTMORELAND_COUNTY_VA + - WISE_COUNTY_VA + - WYTHE_COUNTY_VA + # Cities + - BRISTOL_CITY_VA + - BUENA_VISTA_CITY_VA + - COVINGTON_CITY_VA + - DANVILLE_CITY_VA + - EMPORIA_CITY_VA + - FRANKLIN_CITY_VA + - GALAX_CITY_VA + - HARRISONBURG_CITY_VA + - LEXINGTON_CITY_VA + - LYNCHBURG_CITY_VA + - MARTINSVILLE_CITY_VA + - NORTON_CITY_VA + - RADFORD_CITY_VA + - ROANOKE_CITY_VA + - STAUNTON_CITY_VA + - WAYNESBORO_CITY_VA + - WINCHESTER_CITY_VA + +metadata: + unit: list + period: year + label: Virginia CCSP Income Cap Group I localities + reference: + - title: Virginia Child Care Subsidy Program Guidance Manual Appendix Z + href: https://www.childcare.virginia.gov/home/showpublisheddocument/66667/638981099706730000#page=204 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group2.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group2.yaml new file mode 100644 index 00000000000..32e565f9b42 --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group2.yaml @@ -0,0 +1,45 @@ +description: Virginia lists these localities as Income Cap Group II under the Child Care Subsidy Program. + +values: + 2023-01-01: + # Counties + - ALBEMARLE_COUNTY_VA + - CHARLES_CITY_COUNTY_VA + - CHESTERFIELD_COUNTY_VA + - DINWIDDIE_COUNTY_VA + - FLUVANNA_COUNTY_VA + - GLOUCESTER_COUNTY_VA + - GOOCHLAND_COUNTY_VA + - GREENE_COUNTY_VA + - HANOVER_COUNTY_VA + - HENRICO_COUNTY_VA + - ISLE_OF_WIGHT_COUNTY_VA + - JAMES_CITY_COUNTY_VA + - MATHEWS_COUNTY_VA + - NEW_KENT_COUNTY_VA + - POWHATAN_COUNTY_VA + - PRINCE_GEORGE_COUNTY_VA + - YORK_COUNTY_VA + # Cities + - CHARLOTTESVILLE_CITY_VA + - CHESAPEAKE_CITY_VA + - COLONIAL_HEIGHTS_CITY_VA + - HAMPTON_CITY_VA + - HOPEWELL_CITY_VA + - NEWPORT_NEWS_CITY_VA + - NORFOLK_CITY_VA + - PETERSBURG_CITY_VA + - POQUOSON_CITY_VA + - PORTSMOUTH_CITY_VA + - RICHMOND_CITY_VA + - SUFFOLK_CITY_VA + - VIRGINIA_BEACH_CITY_VA + - WILLIAMSBURG_CITY_VA + +metadata: + unit: list + period: year + label: Virginia CCSP Income Cap Group II localities + reference: + - title: Virginia Child Care Subsidy Program Guidance Manual Appendix Z + href: https://www.childcare.virginia.gov/home/showpublisheddocument/66667/638981099706730000#page=205 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group3.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group3.yaml new file mode 100644 index 00000000000..bf639982d13 --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group3.yaml @@ -0,0 +1,30 @@ +description: Virginia lists these localities as Income Cap Group III under the Child Care Subsidy Program. + +values: + 2023-01-01: + # Counties + - ARLINGTON_COUNTY_VA + - CLARKE_COUNTY_VA + - CULPEPER_COUNTY_VA + - FAIRFAX_COUNTY_VA + - FAUQUIER_COUNTY_VA + - KING_GEORGE_COUNTY_VA + - LOUDOUN_COUNTY_VA + - PRINCE_WILLIAM_COUNTY_VA + - SPOTSYLVANIA_COUNTY_VA + - STAFFORD_COUNTY_VA + - WARREN_COUNTY_VA + # Cities + - ALEXANDRIA_CITY_VA + - FAIRFAX_CITY_VA + - FREDERICKSBURG_CITY_VA + - MANASSAS_CITY_VA + - MANASSAS_PARK_CITY_VA + +metadata: + unit: list + period: year + label: Virginia CCSP Income Cap Group III localities + reference: + - title: Virginia Child Care Subsidy Program Guidance Manual Appendix Z + href: https://www.childcare.virginia.gov/home/showpublisheddocument/66667/638981099706730000#page=206 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/care_age_group.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/care_age_group.yaml new file mode 100644 index 00000000000..b5fd968b2da --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/care_age_group.yaml @@ -0,0 +1,33 @@ +description: Virginia assigns children to these age group categories by age in months for child care reimbursement rates under the Child Care Subsidy Program. + +metadata: + type: single_amount + threshold_unit: month + amount_unit: /1 + period: year + label: Virginia CCSP care age group thresholds + reference: + - title: Virginia Child Care Subsidy Program Guidance Manual Section 7.2 + href: https://www.childcare.virginia.gov/home/showpublisheddocument/66667/638981099706730000#page=203 + +brackets: + - threshold: + 2023-01-01: 0 + amount: + 2023-01-01: 0 + - threshold: + 2023-01-01: 16 + amount: + 2023-01-01: 1 + - threshold: + 2023-01-01: 24 + amount: + 2023-01-01: 2 + - threshold: + 2023-01-01: 36 + amount: + 2023-01-01: 3 + - threshold: + 2023-01-01: 72 + amount: + 2023-01-01: 4 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/center.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/center.yaml similarity index 100% rename from policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/center.yaml rename to policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/center.yaml diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/family_day_home.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/family_day_home.yaml similarity index 100% rename from policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/family_day_home.yaml rename to policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/family_day_home.yaml diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/part_day_factor.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/part_day_factor.yaml similarity index 100% rename from policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/part_day_factor.yaml rename to policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/part_day_factor.yaml diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/blue_ridge.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/blue_ridge.yaml similarity index 100% rename from policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/blue_ridge.yaml rename to policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/blue_ridge.yaml diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/capital_area.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/capital_area.yaml similarity index 100% rename from policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/capital_area.yaml rename to policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/capital_area.yaml diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/central.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/central.yaml similarity index 100% rename from policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/central.yaml rename to policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/central.yaml diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/chesapeake_bay.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/chesapeake_bay.yaml similarity index 100% rename from policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/chesapeake_bay.yaml rename to policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/chesapeake_bay.yaml diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/north_central.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/north_central.yaml similarity index 100% rename from policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/north_central.yaml rename to policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/north_central.yaml diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/southeastern.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/southeastern.yaml similarity index 100% rename from policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/southeastern.yaml rename to policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/southeastern.yaml diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/southside.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/southside.yaml similarity index 100% rename from policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/southside.yaml rename to policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/southside.yaml diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/southwest.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/southwest.yaml similarity index 100% rename from policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/southwest.yaml rename to policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/southwest.yaml diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/west.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/west.yaml similarity index 100% rename from policyengine_us/parameters/gov/states/va/dss/ccsp/mrr/ready_region/west.yaml rename to policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/west.yaml diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/integration_edge.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/integration_edge.yaml index 88bb2ebc5c3..3bf736c08e6 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/integration_edge.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/integration_edge.yaml @@ -331,8 +331,11 @@ va_ccsp_copay: 60 # Monthly expenses: 12,000/12 = 1,000 - # Benefit: max(1,000 - 60, 0) = $940 - va_ccsp: 940 + # Benefit before MRR: max(1,000 - 60, 0) = $940 + # Default county ACCOMACK -> SOUTHEASTERN region + # MRR: SCHOOL_AGE CENTER SOUTHEASTERN = $30/day * 23 days = $690 + # Benefit: min(940, 690) = $690 + va_ccsp: 690 - name: Case 7, TANF-enrolled family waives income test for high-income family. period: 2024-01 diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_income_eligible_edge.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_income_eligible_edge.yaml index 0371cface44..6fe638173e3 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_income_eligible_edge.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_income_eligible_edge.yaml @@ -406,3 +406,164 @@ output: # Income far above any threshold but TANF -> waived va_ccsp_income_eligible: true + +# === FAIRFAX/ALEXANDRIA EXCEPTION (250% FPG capped at 85% SMI) === + +- name: Case 15, Fairfax family eligible at 250% FPG. + period: 2024-01 + input: + people: + person1: + employment_income: 50_000 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + county: FAIRFAX_COUNTY_VA + output: + # Fairfax: 250% FPG = 20,440 * 2.5 = 51,100 + # 85% SMI = 70,013.14 + # Limit: min(51,100, 70,013.14) = 51,100 + # 50,000 <= 51,100 -> eligible + va_ccsp_income_eligible: true + +- name: Case 16, Fairfax family above 250% FPG ineligible. + period: 2024-01 + input: + people: + person1: + employment_income: 51_101 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + county: FAIRFAX_COUNTY_VA + output: + # Fairfax: 250% FPG = 51,100 + # 51,101 > 51,100 -> ineligible + va_ccsp_income_eligible: false + +- name: Case 17, Alexandria family eligible under 250% FPG exception. + period: 2024-01 + input: + people: + person1: + employment_income: 45_000 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + county: ALEXANDRIA_CITY_VA + output: + # Alexandria: 250% FPG = 51,100 + # 45,000 <= 51,100 -> eligible + va_ccsp_income_eligible: true + +- name: Case 18, non-Fairfax Group III family at same income ineligible. + period: 2024-01 + input: + people: + person1: + employment_income: 45_000 + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + county: STAFFORD_COUNTY_VA + output: + # Stafford is Group III but NOT Fairfax/Alexandria + # 185% FPG = 37,814 + # 45,000 > 37,814 -> ineligible + va_ccsp_income_eligible: false + +# === MEDICAID/WIC INCOME WAIVER === + +- name: Case 19, Medicaid recipient waives income test. + period: 2024-01 + input: + people: + person1: + employment_income: 200_000 + receives_medicaid: true + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + # Income far above any threshold but Medicaid -> waived + va_ccsp_income_eligible: true + +- name: Case 20, WIC recipient waives income test. + period: 2024-01 + input: + people: + person1: + employment_income: 200_000 + person2: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + receives_wic: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + # Child on WIC -> income test waived for unit + va_ccsp_income_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_care_age_group.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_care_age_group.yaml index 180fbf2d527..ca41296b7ea 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_care_age_group.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_care_age_group.yaml @@ -11,7 +11,7 @@ output: va_ccsp_care_age_group: INFANT -- name: Case 2, 1 year old is toddler. +- name: Case 2, 12 month old (1 year) is still infant. period: 2024 input: people: @@ -22,9 +22,54 @@ members: [person1] state_code: VA output: + # 12 months < 16 month cutoff -> infant + va_ccsp_care_age_group: INFANT + +- name: Case 3, 15 month old is still infant. + period: 2024 + input: + people: + person1: + age: 1.25 + households: + household: + members: [person1] + state_code: VA + output: + # 15 months < 16 month cutoff -> infant + va_ccsp_care_age_group: INFANT + +- name: Case 4, 16 month old is toddler. + period: 2024 + input: + people: + person1: + # 16/12 = 1.333... + age: 1.334 + households: + household: + members: [person1] + state_code: VA + output: + # 16 months >= 16 month cutoff -> toddler + va_ccsp_care_age_group: TODDLER + +- name: Case 5, 23 month old is toddler. + period: 2024 + input: + people: + person1: + # 23/12 = 1.9167 + age: 1.917 + households: + household: + members: [person1] + state_code: VA + output: + # 23 months < 24 month cutoff -> toddler va_ccsp_care_age_group: TODDLER -- name: Case 3, 2 year old. +- name: Case 6, 2 year old (24 months) is two year old. period: 2024 input: people: @@ -35,9 +80,10 @@ members: [person1] state_code: VA output: + # 24 months >= 24, < 36 -> two year old va_ccsp_care_age_group: TWO_YEAR_OLD -- name: Case 4, 4 year old is preschool. +- name: Case 7, 4 year old is preschool. period: 2024 input: people: @@ -48,30 +94,33 @@ members: [person1] state_code: VA output: + # 48 months >= 36, < 72 -> preschool va_ccsp_care_age_group: PRESCHOOL -- name: Case 5, 7 year old is school age. +- name: Case 8, 5 year old is preschool. period: 2024 input: people: person1: - age: 7 + age: 5 households: household: members: [person1] state_code: VA output: - va_ccsp_care_age_group: SCHOOL_AGE + # 60 months >= 36, < 72 -> preschool + va_ccsp_care_age_group: PRESCHOOL -- name: Case 6, 5 year old is preschool. +- name: Case 9, 7 year old is school age. period: 2024 input: people: person1: - age: 5 + age: 7 households: household: members: [person1] state_code: VA output: - va_ccsp_care_age_group: PRESCHOOL + # 84 months >= 72 -> school age + va_ccsp_care_age_group: SCHOOL_AGE diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_daily_mrr.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_daily_mrr.yaml index 18cd62a76a8..22bd24e6cc5 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_daily_mrr.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_daily_mrr.yaml @@ -49,7 +49,7 @@ output: va_ccsp_daily_mrr: 54 -- name: Case 4, center toddler in Blue Ridge part day. +- name: Case 4, center infant in Blue Ridge part day. period: 2024-01 absolute_error_margin: 0.01 input: @@ -64,8 +64,9 @@ state_code: VA va_ccsp_ready_region: BLUE_RIDGE output: - # Full day: $61, part day: $61 * 0.7 = $42.7 - va_ccsp_daily_mrr: 42.7 + # Age 1 = 12 months < 16 month cutoff -> INFANT + # Full day: $70, part day: $70 * 0.7 = $49 + va_ccsp_daily_mrr: 49 - name: Case 5, family day home in West part day. period: 2024-01 diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_income_test_waived.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_income_test_waived.yaml new file mode 100644 index 00000000000..dd7aafe7af9 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_income_test_waived.yaml @@ -0,0 +1,85 @@ +- name: Case 1, TANF enrolled waives income test. + period: 2024-01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + is_tanf_enrolled: true + households: + household: + members: [person1] + state_code: VA + output: + va_ccsp_income_test_waived: true + +- name: Case 2, Medicaid recipient waives income test. + period: 2024-01 + input: + people: + person1: + age: 30 + receives_medicaid: true + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: VA + output: + va_ccsp_income_test_waived: true + +- name: Case 3, WIC recipient waives income test. + period: 2024-01 + input: + people: + person1: + age: 30 + receives_wic: true + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: VA + output: + va_ccsp_income_test_waived: true + +- name: Case 4, no public assistance does not waive income test. + period: 2024-01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: VA + output: + va_ccsp_income_test_waived: false + +- name: Case 5, child on Medicaid waives income test for unit. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + receives_medicaid: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + va_ccsp_income_test_waived: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_locality_group.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_locality_group.yaml new file mode 100644 index 00000000000..e0172b33bf8 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_locality_group.yaml @@ -0,0 +1,135 @@ +- name: Case 1, Group I county (Accomack). + period: 2024-01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: VA + county: ACCOMACK_COUNTY_VA + output: + va_ccsp_locality_group: GROUP_I + +- name: Case 2, Group II county (Henrico). + period: 2024-01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: VA + county: HENRICO_COUNTY_VA + output: + va_ccsp_locality_group: GROUP_II + +- name: Case 3, Group III county (Arlington). + period: 2024-01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: VA + county: ARLINGTON_COUNTY_VA + output: + va_ccsp_locality_group: GROUP_III + +- name: Case 4, Group III city (Alexandria). + period: 2024-01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: VA + county: ALEXANDRIA_CITY_VA + output: + va_ccsp_locality_group: GROUP_III + +- name: Case 5, Group II city (Norfolk). + period: 2024-01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: VA + county: NORFOLK_CITY_VA + output: + va_ccsp_locality_group: GROUP_II + +- name: Case 6, Group I city (Lynchburg). + period: 2024-01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: VA + county: LYNCHBURG_CITY_VA + output: + va_ccsp_locality_group: GROUP_I + +- name: Case 7, Group III county (Fairfax). + period: 2024-01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: VA + county: FAIRFAX_COUNTY_VA + output: + va_ccsp_locality_group: GROUP_III + +- name: Case 8, Group II city (Chesapeake). + period: 2024-01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: VA + county: CHESAPEAKE_CITY_VA + output: + va_ccsp_locality_group: GROUP_II diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.py index 0e338e6e8e2..72393a635e2 100644 --- a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.py +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.py @@ -8,6 +8,7 @@ class va_ccsp_activity_eligible(Variable): definition_period = MONTH defined_for = StateCode.VA reference = ( + "https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section20/", "https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section30/", "https://doe.virginia.gov/home/showpublisheddocument/56270#page=36", ) @@ -18,6 +19,11 @@ def formula(spm_unit, period, parameters): is_head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) hours_worked = person("weekly_hours_worked", period.this_year) is_in_school = person("is_full_time_student", period.this_year) + is_disabled = person("is_disabled", period.this_year) is_active = (hours_worked >= p.min_hours_per_week) | is_in_school - ineligible_parent = is_head_or_spouse & ~is_active - return spm_unit.sum(ineligible_parent) == 0 + # Per 8VAC20-790-20(A)(9)(a), in a two-parent household a + # disabled parent satisfies the "documented reason" requirement. + meets_requirement = is_active | is_disabled + has_active_parent = spm_unit.sum(is_head_or_spouse & is_active) >= 1 + all_covered = spm_unit.sum(is_head_or_spouse & ~meets_requirement) == 0 + return has_active_parent & all_covered diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_care_age_group.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_care_age_group.py index 1b8378ae5af..3504f9939c0 100644 --- a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_care_age_group.py +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_care_age_group.py @@ -17,17 +17,9 @@ class va_ccsp_care_age_group(Variable): definition_period = YEAR label = "Virginia CCSP care age group" defined_for = StateCode.VA - reference = "https://ris.dls.virginia.gov/uploads/22VAC40/dibr/VDOE%20Child%20Care%20Program%20Guidance%20Manual%205.3.2023-20240822104447.pdf#page=203" + reference = "https://www.childcare.virginia.gov/home/showpublisheddocument/66667/638981099706730000#page=203" def formula(person, period, parameters): - age = person("age", period) - return select( - [age < 1, age < 2, age < 3, age < 6, age < 13], - [ - VACCSPCareAgeGroup.INFANT, - VACCSPCareAgeGroup.TODDLER, - VACCSPCareAgeGroup.TWO_YEAR_OLD, - VACCSPCareAgeGroup.PRESCHOOL, - VACCSPCareAgeGroup.SCHOOL_AGE, - ], - ) + age_months = person("age", period) * MONTHS_IN_YEAR + p = parameters(period).gov.states.va.dss.ccsp.maximum_reimbursement_rate + return p.care_age_group.calc(age_months) diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_daily_mrr.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_daily_mrr.py index 516f07bc135..15a711d27ba 100644 --- a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_daily_mrr.py +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_daily_mrr.py @@ -14,7 +14,7 @@ class va_ccsp_daily_mrr(Variable): reference = "https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates" def formula(person, period, parameters): - p = parameters(period).gov.states.va.dss.ccsp.mrr + p = parameters(period).gov.states.va.dss.ccsp.maximum_reimbursement_rate region = person.household("va_ccsp_ready_region", period.this_year) provider_type = person("va_ccsp_provider_type", period.this_year) age_group = person("va_ccsp_care_age_group", period.this_year) diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_eligible.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_eligible.py index 4f0cf0e6504..e94d8b84d12 100644 --- a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_eligible.py +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_eligible.py @@ -9,11 +9,12 @@ class va_ccsp_income_eligible(Variable): defined_for = StateCode.VA reference = ( "https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/", - "https://doe.virginia.gov/home/showpublisheddocument/56270#page=62", + "https://www.childcare.virginia.gov/home/showpublisheddocument/66667/638981099706730000#page=204", ) def formula(spm_unit, period, parameters): p = parameters(period).gov.states.va.dss.ccsp.income + p_loc = parameters(period).gov.states.va.dss.ccsp.localities countable_income = spm_unit("va_ccsp_countable_income", period) fpg = spm_unit("spm_unit_fpg", period) smi = spm_unit("hhs_smi", period) @@ -23,6 +24,12 @@ def formula(spm_unit, period, parameters): fpg_rate = p.initial_eligibility_fpg_rate[locality_group] initial_limit = fpg * fpg_rate + # Fairfax/Alexandria exception: 250% FPG capped at 85% SMI + county = spm_unit.household("county_str", period) + is_fairfax_alexandria = np.isin(county, p_loc.fairfax_alexandria) + fa_limit = min_(fpg * p.fairfax_alexandria_fpg_rate, smi * p.exit_smi_rate) + initial_limit = where(is_fairfax_alexandria, fa_limit, initial_limit) + # Redetermination (enrolled): 85% SMI exit_limit = smi * p.exit_smi_rate diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_test_waived.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_test_waived.py index fbf6f0cd147..62c3fce6078 100644 --- a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_test_waived.py +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_test_waived.py @@ -9,8 +9,12 @@ class va_ccsp_income_test_waived(Variable): defined_for = StateCode.VA reference = ( "https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section30/", - "https://doe.virginia.gov/home/showpublisheddocument/56270#page=29", + "https://www.childcare.virginia.gov/home/showpublisheddocument/66667/638981099706730000#page=29", ) def formula(spm_unit, period, parameters): - return spm_unit("is_tanf_enrolled", period) + tanf_enrolled = spm_unit("is_tanf_enrolled", period) + person = spm_unit.members + has_medicaid = spm_unit.any(person("receives_medicaid", period.this_year)) + has_wic = spm_unit.any(person("receives_wic", period)) + return tanf_enrolled | has_medicaid | has_wic diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_locality_group.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_locality_group.py index 93bd038c6a8..b1039ba7974 100644 --- a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_locality_group.py +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_locality_group.py @@ -10,12 +10,28 @@ class VACCSPLocalityGroup(Enum): class va_ccsp_locality_group(Variable): value_type = Enum possible_values = VACCSPLocalityGroup - default_value = VACCSPLocalityGroup.GROUP_III + default_value = VACCSPLocalityGroup.GROUP_I entity = SPMUnit label = "Virginia CCSP locality group" definition_period = YEAR defined_for = StateCode.VA reference = ( "https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/", - "https://doe.virginia.gov/home/showpublisheddocument/56270#page=203", + "https://www.childcare.virginia.gov/home/showpublisheddocument/66667/638981099706730000#page=204", ) + + def formula(spm_unit, period, parameters): + county = spm_unit.household("county_str", period) + p = parameters(period).gov.states.va.dss.ccsp.localities + + group3 = np.isin(county, p.group3) + group2 = np.isin(county, p.group2) + + return select( + [group3, group2], + [ + VACCSPLocalityGroup.GROUP_III, + VACCSPLocalityGroup.GROUP_II, + ], + default=VACCSPLocalityGroup.GROUP_I, + ) diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_ready_region.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_ready_region.py index 34abbae255e..95fcc0e8d37 100644 --- a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_ready_region.py +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_ready_region.py @@ -25,7 +25,9 @@ class va_ccsp_ready_region(Variable): def formula(household, period, parameters): county = household("county_str", period) - p = parameters(period).gov.states.va.dss.ccsp.mrr.ready_region + p = parameters( + period + ).gov.states.va.dss.ccsp.maximum_reimbursement_rate.ready_region blue_ridge = np.isin(county, p.blue_ridge) capital_area = np.isin(county, p.capital_area) diff --git a/sources/working_references.md b/sources/working_references.md deleted file mode 100644 index cde5a99c27d..00000000000 --- a/sources/working_references.md +++ /dev/null @@ -1,289 +0,0 @@ -# Virginia Child Care Subsidy Program (CCSP) - Working References - -## Program Overview - -Virginia's Child Care Subsidy Program (CCSP) assists eligible low-income families with -child care costs for children under age 13 (or under 18 for special needs/court supervision). -The program is administered by the Virginia Department of Education (VDOE) and the -Virginia Department of Social Services (VDSS) through local departments of social services (LDSS). - -**Official program name**: Child Care Subsidy Program (CCSP) -**Administering agencies**: VDOE (oversight) + VDSS/LDSS (administration) -**Federal authority**: Child Care and Development Block Grant (CCDBG) Act of 2014 -**State regulations**: 8VAC20-790 (Child Care Program) -**Guidance manual**: Child Care Subsidy Program Guidance Manual (effective August 3, 2023) - -## Primary Sources - -### 1. Child Care Subsidy Program Guidance Manual (RIS copy) -- **URL**: https://ris.dls.virginia.gov/uploads/22VAC40/dibr/VDOE%20Child%20Care%20Program%20Guidance%20Manual%205.3.2023-20240822104447.pdf -- **Title**: Child Care Subsidy Program Guidance Manual (Revised, Effective August 3, 2023) -- **Pages**: 199 -- **Downloaded to**: /tmp/va-ccsp-guidance-ris.pdf (text: /tmp/va-ccsp-guidance-ris.txt) -- **Key sections**: - - Section 2: Program Categories (TANF, SNAP E&T, Transitional, Head Start Wrap-Around, Fee) — pp. 22-36 (#page=22) - - Section 3.3: Non-Financial Eligibility Requirements — pp. 48-54 (#page=48) - - Section 3.4: Income and Assets Eligibility Requirements — pp. 56-62 (#page=56) - - Section 3.5: Copayments — pp. 63-64 (#page=63) - - Section 3.13: Authorization (age ranges, rates) — pp. 80-86 (#page=80) - - Section 3.14: Payments (MRR) — pp. 86-90 (#page=86) - - Appendix A: State Income Eligibility Scale — p. 136 (#page=136) - - Appendix B: Per-Child Copayment Scale — pp. 137-138 (#page=137) - - Appendix Z: Metropolitan Statistical Area Groupings — p. 197 (#page=197) -- **Status**: SUCCESSFULLY DOWNLOADED AND EXTRACTED - -### 2. Virginia Administrative Code 8VAC20-790 (Current Regulations) -- **URL**: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/ -- **Key sections**: - - 8VAC20-790-10: Definitions — https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section10/ - - 8VAC20-790-20: Families and children to be served — https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section20/ - - 8VAC20-790-30: Program categories — https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section30/ - - 8VAC20-790-40: Case management (eligibility, income, copay) — https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/ -- **Status**: SUCCESSFULLY FETCHED (all sections) -- **Note**: Regulations were amended effective November 19, 2025 (Vol. 42 Iss. 5) to implement new copayment structure - -### 3. VECF Budget Language Summary (Copayments, Work Requirements, Attendance) -- **URL**: https://vecf.org/wp-content/uploads/2024/09/Budget-Language-Referral-Summary-for-ECCE-Commission.pdf -- **Pages**: 6 -- **Downloaded to**: /tmp/va-vecf-budget.txt -- **Key data**: - - Current copayment scale (in effect as of Jan 1, 2023): - - 0-100% FPG: $0/month per child - - 101-200% FPG: $60/month per child - - 201-300% FPG: $120/month per child - - 301% FPG - 85% SMI: $180/month per child - - Max 3 children assessed copayments (max family copay: $540/month) - - Family copayments capped at 7% of gross countable income - - Copayments generate ~$14.4M (2.5% of $582M total CCSP cost for birth-5) -- **Status**: SUCCESSFULLY DOWNLOADED AND EXTRACTED - -### 4. Budget Amendment HB30 Item 126 #2h (FY2026 enacted provisions) -- **URL**: https://budget.lis.virginia.gov/amendment/2026/1/HB30/Introduced/CA/126/2h -- **Key data** (NEW copayment structure, effective ~July/August 2025): - - Below 100% FPL: $5/month per child - - All other families: up to 5% of annual income - - No family pays more than 5% of income - - Job search limited to 90 days with one extension for extraordinary circumstances -- **Status**: SUCCESSFULLY FETCHED - -### 5. Regulatory Update: Vol. 42 Iss. 5 — 8VAC20-790 Final Regulation -- **URL**: https://register.dls.virginia.gov/details.aspx?id=11939 -- **Effective date**: November 19, 2025 -- **Changes**: Implements new 5% copayment cap, $5/child minimum, 90-day job search limit -- **Authority**: Item 125.10 of Chapter 725 of the 2025 Acts of Assembly; §§ 22.1-16 and 22.1-289.046 -- **Status**: SUCCESSFULLY FETCHED - -### 6. WHRO News: Virginia Families Set to Pay More for CCSP -- **URL**: https://www.whro.org/virginia-government/2025-02-10/virginia-families-set-to-pay-more-for-child-care-subsidy-program -- **Key context**: Senate proposed 7%, House proposed 5%, final enacted = 5% -- **Status**: SUCCESSFULLY FETCHED - -## Failed Fetches - -### childcare.virginia.gov (ALL pages blocked - 403) -The official childcare.virginia.gov site blocks all automated access (returns 403 or redirects to HTML block page). The following documents could NOT be retrieved: -1. **Family Eligibility Document (Oct 2024)**: https://www.childcare.virginia.gov/home/showpublisheddocument/57736/638633886494370000 - - Likely contains: updated income eligibility tables, FPL/SMI thresholds for 2024 -2. **Copayment Scale (Effective July 1, 2025)**: https://www.childcare.virginia.gov/home/showpublisheddocument/62604/638864381965000000 - - Likely contains: the NEW copayment schedule with 5% structure -3. **Updated Copayment Scale (newer URL)**: https://www.childcare.virginia.gov/home/showpublisheddocument/65775/638937831784030000 - - Likely contains: final copayment scale after full implementation -4. **Subsidy Program Guidance Manual page**: https://www.childcare.virginia.gov/reports-resources/administrative-program-manuals-reports-and-data/subsidy-program-guidance-manual - - Likely contains: links to updated manual chapters -5. **Paying for Child Care page**: https://www.childcare.virginia.gov/families/paying-for-child-care - - Likely contains: current copay info, rate sheets, income guidelines - -### dss.virginia.gov (SSL certificate error) -- **URL**: https://www.dss.virginia.gov/family/cc/assistance.cgi/1000 -- **Error**: unable to verify the first certificate -- **URL**: https://www.dss.virginia.gov/files/division/cc/approved_subsidy_vendors/forms/Child_Care_Subsidy_Guidance_Manuel.pdf -- **Error**: unable to verify the first certificate - -### ACF Federal Income Eligibility PDF (403) -- **URL**: https://acf.gov/sites/default/files/documents/occ/CCDF-Family-Income-Eligibility-Levels-by-State.pdf -- Likely contains: Virginia's CCDF income eligibility levels by family size - -## Program Details Extracted - -### Eligibility Requirements - -#### Non-Financial Requirements -1. **Child age**: Under 13, or under 18 if physically/mentally incapable of self-care or under court supervision -2. **Citizenship**: Child must be US citizen or qualified immigrant (parent citizenship not verified) -3. **Immunization**: Per State Board of Health requirements (exemptions available) -4. **Residency**: Family must reside in the locality where application is made -5. **Parent age**: Applicant must be at least 18 (emancipated minors excepted) -6. **School attendance**: No subsidy during hours public education is available -7. **Activity test**: Must have need for child care to support: - - Full-time or part-time employment (including work from home) - - Education or training leading to employment (up to bachelor's degree) - - Job search (limited to 90 days with one extension) - - Assigned VIEW or SNAP E&T activity - - Child protective services -8. **Two-parent household**: Must document good cause why one parent cannot provide care -9. **Family day home exclusion**: Owner/operator cannot receive subsidy for own child cared for at home -10. **Asset limit**: Family assets cannot exceed $1 million (self-certified, no verification required) - -#### Income Eligibility -- **Initial eligibility**: Income must not exceed the percentage of FPG for the locality group (Group I: 150% FPG, Group II: 160% FPG, Group III: 185% FPG) -- **Families with child age 5 or younger (not in kindergarten)**: Income must not exceed 85% of State Median Income (regardless of locality group) -- **Non-financially-responsible applicants**: Income limit is 250% FPG or 85% SMI (with child 5 or under) -- **Exit limit (at redetermination)**: 85% of State Median Income -- **TANF recipients**: Automatically income-eligible (no income determination) -- **Medicaid/WIC recipients**: Automatically satisfy income requirements -- **Eligibility period**: 12 months minimum - -#### Countable Income -- All gross earned and unearned income of the family unit -- Self-employment: net income (gross minus verified business expenses) -- Child support: counted as unearned income of the child -- Contract income: prorated over contract period - -#### Disregarded Income (30 categories) -1. Supplemental Security Income (SSI) -2. TANF benefits -3. Transitional payments ($50/month to former VIEW participants) -4. Diversionary Assistance payments -5. General Relief benefits -6. SNAP benefits -7. USDA donated food -8. Title VII Nutrition Program for the Elderly -9. Child Nutrition Act / National School Lunch Act benefits -10. Earnings of a child under age 18 -11. Earned Income Tax Credit (EITC) -12. All lump sum payments -13. Scholarships/loans/grants for education (except child care portion) -14. AmeriCorps volunteer payments -15. Tax refunds -16. Monetary gifts for one-time/annual occasions -17. Vendor payments by non-financially responsible persons (unless in lieu of wages) -18. Loans and borrowed money -19. Proceeds from sale of property (unless business) -20. Earnings under $25/month -21. Capital gains -22. Withdrawals of bank deposits -23. GI Bill benefits -24. Reimbursements (e.g., mileage) -25. Foreign government restitution to Holocaust survivors -26. Agent Orange Settlement payments -27. Vietnam Veterans children monetary benefits (38 USC 1823(c)) -28. Temporary census taker earnings - -#### Disregarded Deductions -1. Garnished wages -2. Basic Allowance for Housing (BAH) for military on base -3. Clothing Maintenance Allowance for military -4. Child support paid to another household - -#### Family Unit Definition -Includes: -- Parents (biological, adoptive, step, legal guardians, in loco parentis, cohabitants) -- All parents' children under 18 -- Spouses of adults standing in loco parentis -- Temporarily absent members (unless >60 days, except active-duty military) - -### Copayment Structure - -#### Current Scale (effective January 1, 2023 per guidance manual Appendix B) -| Income Threshold | Monthly Fee per Child | -|---|---| -| 0-100% FPG | $0 | -| 101-200% FPG | $60 | -| 201-300% FPG | $120 | -| 301% FPG - 85% SMI | $180 | - -- Maximum 3 children assessed copayments -- Total family copayment capped at 7% of gross countable income -- TANF recipients exempt from copayments - -#### NEW Scale (effective July 1, 2025 per budget/regulations) -| Income Threshold | Monthly Copayment | -|---|---| -| Below 100% FPL | $5/month per child | -| All other eligible families | Up to 5% of annual income | - -- No family pays more than 5% of income -- Regulation effective November 19, 2025 (8VAC20-790 amendment) - -### Income Eligibility Scale (Appendix A, based on 2023 FPG and SMI) - -| Family Size | Annual FPG | 100% FPG (monthly) | Group I 150% | Group II 160% | Group III 185% | 250% FPG | Exit Limit 85% SMI (monthly) | Exit Limit 85% SMI (annual) | -|---|---|---|---|---|---|---|---|---| -| 1 | $13,590 | $1,133 | $1,700 | $1,813 | $2,097 | $2,833 | $4,201 | $50,424 | -| 2 | $18,310 | $1,526 | $2,289 | $2,442 | $2,824 | $3,815 | $5,494 | $65,939 | -| 3 | $23,030 | $1,919 | $2,879 | $3,071 | $3,551 | $4,798 | $6,787 | $81,454 | -| 4 | $27,750 | $2,313 | $3,470 | $3,701 | $4,280 | $5,783 | $8,080 | $96,969 | -| 5 | $32,470 | $2,706 | $4,059 | $4,330 | $5,007 | $6,765 | $9,372 | $112,483 | -| 6 | $37,190 | $3,099 | $4,649 | $4,959 | $5,734 | $7,748 | $10,665 | $127,998 | -| 7 | $41,910 | $3,493 | $5,240 | $5,589 | $6,463 | $8,733 | $10,908 | $130,908 | -| 8 | $46,630 | $3,886 | $5,829 | $6,218 | $7,190 | $9,715 | $11,151 | $133,816 | - -NOTE: For family sizes 7+, some 85% SMI amounts are LOWER than 250% FPG. The highlighted cells in Appendix A indicate where 85% SMI caps the eligibility even at the 250% FPG level. - -### Program Categories - -1. **TANF Child Care** — TANF recipients (VIEW and non-VIEW); income-eligible by default -2. **SNAP E&T Child Care** — Parents in SNAP Employment & Training; income test required -3. **TANF Transitional Child Care** — Former TANF recipients; up to 12 months post-closure -4. **Head Start Wrap-Around** — Extended day/year care for Head Start-enrolled children -5. **Fee Child Care Program** — General low-income families; income test required - -### Metropolitan Statistical Area Groups (Locality-Based Income Limits) -- **Group I**: 150% FPG (lowest cost-of-living localities) -- **Group II**: 160% FPG -- **Group III**: 185% FPG (highest cost-of-living localities) -- Localities are grouped by local median income with adjustments for cost of care -- Full mapping in Appendix Z of the guidance manual - -### Maximum Reimbursable Rates (MRR) -- Rates vary by: provider type, child age, locality -- Set using a cost-of-quality estimation model (not market rate survey since 2023) -- Level 1 and Level 2 rates exist (Level 2 for higher-quality providers) -- Rates available as dataset: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates -- Effective date of current rates: August 3, 2023 -- Providers may charge above MRR; families responsible for the difference - -### Income Conversion -- Weekly income x 4.3 -- Bi-weekly income x 2.15 -- Semi-monthly income x 2 - ---- - -## FY26 Copayment One Pager (User-Provided PDF) - -Source: https://www.childcare.virginia.gov/home/showpublisheddocument/65775/638937831784030000 - -### Table 1: Current and New Copayment Scales - -| Income Threshold | Current Copayment Scale | Copayment Scale effective July 1, 2025 | -|---|---|---| -| Income = $0 | $0 | $0 | -| >0-100% FPG | $0 | $5 | -| 101-150% FPG | $60 | $125 | -| 151-200% FPG | $60 | $175 | -| 201-250% FPG | $120 | $225 | -| 251-300% FPG | $120 | $275 | -| 301-350% FPG | $180 | $325 | -| 351% FPG - 85% SMI | $180 | $375 | -| Maximum total copayment | 7% of family income | 5% of family income | - -### Table 2: Effective Dates for the New Copayment Scale - -| Redetermination due by | Copayment changes effective | -|---|---| -| June 30, 2025 | September 1, 2025 | -| July 30, 2025 | August 1, 2025 | -| August 30, 2025 or later | September 1, 2025 | - -New copayment scale fully implemented for all families by September 1, 2025. - -### Table 3: Copayment Family Scenarios - -| Family | Size | Annual/Monthly Income | % FPG | 5% of Income | Per-Child Copay (Scale) | # Children | Total Copay (Scale) | Actual Total | -|---|---|---|---|---|---|---|---|---| -| A | 4 | $36,000/$3,000 | 100-150% | $150 | $125 | 2 | $250 | $150 or $75/child | -| B | 3 | $64,800/$5,400 | 250-300% | $270 | $275 | 1 | $275 | $270 | -| C | 5 | $114,000/$9,500 | 350% FPG - 85% SMI | $475 | $375 | 2 | $750 | $475 | - -Note: Actual total copayment = min(total copayment from scale, 5% of family income) diff --git a/uv.lock b/uv.lock index 26678f33b63..ad816d5caa8 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.11, <3.15" resolution-markers = [ "python_full_version >= '3.14' and sys_platform == 'win32'", @@ -1641,7 +1641,7 @@ wheels = [ [[package]] name = "policyengine-us" -version = "1.624.0" +version = "1.632.0" source = { editable = "." } dependencies = [ { name = "microdf-python" }, From 350db780693d0d111d631ce8bf53e2a41b6a5baf Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 8 Apr 2026 01:06:51 -0400 Subject: [PATCH 08/10] Review-fix round 4: school-age cutoff at 60 months, activity test fallback - Change preschool-to-school-age threshold from 72 to 60 months (age 5) - Add meets_ccdf_activity_test as fallback for unmodeled activities (job search, education/training, VIEW/SNAP E&T, CPS, temporary leave) - Update federal meets_ccdf_activity_test documentation Co-Authored-By: Claude Opus 4.6 (1M context) --- .../care_age_group.yaml | 2 +- .../gov/states/va/dss/ccsp/integration.yaml | 8 +++++-- .../gov/states/va/dss/ccsp/va_ccsp.yaml | 16 +++++++++---- .../va/dss/ccsp/va_ccsp_care_age_group.yaml | 23 +++++++++++++++---- .../gov/hhs/ccdf/meets_ccdf_activity_test.py | 9 +++++++- .../va/dss/ccsp/va_ccsp_activity_eligible.py | 9 +++++--- 6 files changed, 52 insertions(+), 15 deletions(-) diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/care_age_group.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/care_age_group.yaml index b5fd968b2da..41556d1cee7 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/care_age_group.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/care_age_group.yaml @@ -28,6 +28,6 @@ brackets: amount: 2023-01-01: 3 - threshold: - 2023-01-01: 72 + 2023-01-01: 60 amount: 2023-01-01: 4 diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/integration.yaml index 6b1088b5252..9a785d99dea 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/integration.yaml @@ -77,8 +77,12 @@ # === Benefit === # Monthly expenses: 12,000 / 12 = 1,000 - # Benefit: max(1,000 - 60, 0) = $940 - va_ccsp: 940 + # Benefit before MRR: max(1,000 - 60, 0) = $940 + # Default county ACCOMACK -> SOUTHEASTERN + # Age 5 = 60 months -> SCHOOL_AGE, CENTER rate = $30/day + # MRR: $30 * 23 = $690 + # Benefit: min(940, 690) = $690 + va_ccsp: 690 - name: Case 2, enrolled family at redetermination income limit. period: 2024-01 diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp.yaml index 44ba8412c93..09948c6fb36 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp.yaml @@ -36,8 +36,12 @@ # Income cap: 36,000 * 0.07 / 12 = 210 # Copay: min(60, 210) = $60 # Monthly expenses: 12,000 / 12 = 1,000 - # Benefit: max(1,000 - 60, 0) = $940 - va_ccsp: 940 + # Benefit before MRR: max(1,000 - 60, 0) = $940 + # Default county ACCOMACK -> SOUTHEASTERN + # Age 5 = 60 months -> SCHOOL_AGE, CENTER rate = $30/day + # MRR: $30 * 23 = $690 + # Benefit: min(940, 690) = $690 + va_ccsp: 690 - name: Case 2, copay exceeds expenses so benefit is zero. period: 2024-01 @@ -134,5 +138,9 @@ output: # Zero income -> $0 copay # Monthly expenses: 10,000 / 12 = 833.33 - # Benefit: max(833.33 - 0, 0) = 833.33 - va_ccsp: 833.33 + # Benefit before MRR: max(833.33 - 0, 0) = $833.33 + # Default county ACCOMACK -> SOUTHEASTERN + # Age 5 = 60 months -> SCHOOL_AGE, CENTER rate = $30/day + # MRR: $30 * 23 = $690 + # Benefit: min(833.33, 690) = $690 + va_ccsp: 690 diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_care_age_group.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_care_age_group.yaml index ca41296b7ea..251f8b0659a 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_care_age_group.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_care_age_group.yaml @@ -97,7 +97,7 @@ # 48 months >= 36, < 72 -> preschool va_ccsp_care_age_group: PRESCHOOL -- name: Case 8, 5 year old is preschool. +- name: Case 8, 5 year old is school age. period: 2024 input: people: @@ -108,8 +108,8 @@ members: [person1] state_code: VA output: - # 60 months >= 36, < 72 -> preschool - va_ccsp_care_age_group: PRESCHOOL + # 60 months >= 60 -> school age + va_ccsp_care_age_group: SCHOOL_AGE - name: Case 9, 7 year old is school age. period: 2024 @@ -122,5 +122,20 @@ members: [person1] state_code: VA output: - # 84 months >= 72 -> school age + # 84 months >= 60 -> school age va_ccsp_care_age_group: SCHOOL_AGE + +- name: Case 10, 59 month old is preschool. + period: 2024 + input: + people: + person1: + # 59/12 = 4.9167 + age: 4.917 + households: + household: + members: [person1] + state_code: VA + output: + # 59 months < 60 -> preschool + va_ccsp_care_age_group: PRESCHOOL diff --git a/policyengine_us/variables/gov/hhs/ccdf/meets_ccdf_activity_test.py b/policyengine_us/variables/gov/hhs/ccdf/meets_ccdf_activity_test.py index 3caf0f1f1ae..5e0830f6df2 100644 --- a/policyengine_us/variables/gov/hhs/ccdf/meets_ccdf_activity_test.py +++ b/policyengine_us/variables/gov/hhs/ccdf/meets_ccdf_activity_test.py @@ -5,5 +5,12 @@ class meets_ccdf_activity_test(Variable): value_type = bool entity = SPMUnit definition_period = YEAR - documentation = "Indicates whether parent or parents meet activity test (working/in job training/in educational program)" + documentation = ( + "Indicates whether parent or parents meet activity test " + "(working/in job training/in educational program). " + "Use this input to cover approved activities not individually " + "modeled in PolicyEngine, such as job search, education/training " + "programs, SNAP E&T, VIEW participation, CPS referral, or " + "temporary leave from work or school." + ) label = "Activity test for CCDF" diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.py b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.py index 72393a635e2..92f9c2d94c5 100644 --- a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.py +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.py @@ -21,9 +21,12 @@ def formula(spm_unit, period, parameters): is_in_school = person("is_full_time_student", period.this_year) is_disabled = person("is_disabled", period.this_year) is_active = (hours_worked >= p.min_hours_per_week) | is_in_school - # Per 8VAC20-790-20(A)(9)(a), in a two-parent household a - # disabled parent satisfies the "documented reason" requirement. meets_requirement = is_active | is_disabled has_active_parent = spm_unit.sum(is_head_or_spouse & is_active) >= 1 all_covered = spm_unit.sum(is_head_or_spouse & ~meets_requirement) == 0 - return has_active_parent & all_covered + modeled_eligible = has_active_parent & all_covered + # meets_ccdf_activity_test covers activities not individually + # modeled: job search, education/training, VIEW/SNAP E&T, + # CPS referral, and temporary leave. + ccdf_activity = spm_unit("meets_ccdf_activity_test", period.this_year) + return modeled_eligible | ccdf_activity From 7836eafb8a8e3f1fa08a947958f3e6d88db1a77d Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 8 Apr 2026 01:39:30 -0400 Subject: [PATCH 09/10] Review-fix round 5: copay participation filter, references, tests, folder reorg - Copay counts only children actually attending care (not all eligible siblings) - Add missing references to va_ccsp_is_full_day, va_ccsp_provider_type, subtracts.yaml - Comment out 9 VA independent cities not in county_enum - Add Falls Church City to Group III localities - Add disabled parent activity test case - Add ready region test coverage (9 regions) - Add childcare_attending_days_per_month to copay tests - Reorganize variables into eligibility/, income/, copay/, rates/ subfolders Co-Authored-By: Claude Opus 4.6 (1M context) --- .../dss/ccsp/activity/min_hours_per_week.yaml | 2 +- .../va/dss/ccsp/age_threshold/child.yaml | 2 +- .../ccsp/age_threshold/disabled_child.yaml | 2 +- .../va/dss/ccsp/copay/income_cap_rate.yaml | 2 +- .../va/dss/ccsp/copay/max_children.yaml | 2 +- .../va/dss/ccsp/copay/per_child_scale.yaml | 2 +- .../ccsp/income/countable_income/sources.yaml | 2 +- .../income/countable_income/subtracts.yaml | 4 +- .../va/dss/ccsp/income/exit_smi_rate.yaml | 2 +- .../income/initial_eligibility_fpg_rate.yaml | 2 +- .../income/young_child_age_threshold.yaml | 2 +- .../dss/ccsp/income/young_child_smi_rate.yaml | 2 +- .../states/va/dss/ccsp/localities/group1.yaml | 10 +- .../states/va/dss/ccsp/localities/group2.yaml | 4 +- .../states/va/dss/ccsp/localities/group3.yaml | 3 +- .../maximum_reimbursement_rate/center.yaml | 2 +- .../family_day_home.yaml | 2 +- .../part_day_factor.yaml | 2 +- .../ready_region/blue_ridge.yaml | 4 +- .../ready_region/capital_area.yaml | 2 +- .../ready_region/central.yaml | 4 +- .../ready_region/chesapeake_bay.yaml | 4 +- .../ready_region/north_central.yaml | 4 +- .../ready_region/southeastern.yaml | 2 +- .../ready_region/southside.yaml | 2 +- .../ready_region/southwest.yaml | 4 +- .../ready_region/west.yaml | 10 +- .../edge_cases/va_ccsp_copay_2025_07.yaml | 15 +++ .../ccsp/edge_cases/va_ccsp_copay_edge.yaml | 24 ++++ .../gov/states/va/dss/ccsp/va_ccsp.yaml | 3 +- .../dss/ccsp/va_ccsp_activity_eligible.yaml | 29 ++++ .../gov/states/va/dss/ccsp/va_ccsp_copay.yaml | 12 ++ .../va/dss/ccsp/va_ccsp_ready_region.yaml | 125 ++++++++++++++++++ .../va/dss/ccsp/{ => copay}/va_ccsp_copay.py | 5 +- .../va_ccsp_activity_eligible.py | 0 .../va_ccsp_child_eligible.py | 0 .../{ => eligibility}/va_ccsp_eligible.py | 0 .../{ => eligibility}/va_ccsp_enrolled.py | 0 .../va_ccsp_income_eligible.py | 0 .../va_ccsp_income_test_waived.py | 0 .../{ => income}/va_ccsp_countable_income.py | 0 .../{ => rates}/va_ccsp_care_age_group.py | 0 .../dss/ccsp/{ => rates}/va_ccsp_daily_mrr.py | 2 +- .../ccsp/{ => rates}/va_ccsp_is_full_day.py | 1 + .../ccsp/{ => rates}/va_ccsp_provider_type.py | 1 + .../ccsp/{ => rates}/va_ccsp_ready_region.py | 0 46 files changed, 256 insertions(+), 46 deletions(-) create mode 100644 policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_ready_region.yaml rename policyengine_us/variables/gov/states/va/dss/ccsp/{ => copay}/va_ccsp_copay.py (86%) rename policyengine_us/variables/gov/states/va/dss/ccsp/{ => eligibility}/va_ccsp_activity_eligible.py (100%) rename policyengine_us/variables/gov/states/va/dss/ccsp/{ => eligibility}/va_ccsp_child_eligible.py (100%) rename policyengine_us/variables/gov/states/va/dss/ccsp/{ => eligibility}/va_ccsp_eligible.py (100%) rename policyengine_us/variables/gov/states/va/dss/ccsp/{ => eligibility}/va_ccsp_enrolled.py (100%) rename policyengine_us/variables/gov/states/va/dss/ccsp/{ => eligibility}/va_ccsp_income_eligible.py (100%) rename policyengine_us/variables/gov/states/va/dss/ccsp/{ => eligibility}/va_ccsp_income_test_waived.py (100%) rename policyengine_us/variables/gov/states/va/dss/ccsp/{ => income}/va_ccsp_countable_income.py (100%) rename policyengine_us/variables/gov/states/va/dss/ccsp/{ => rates}/va_ccsp_care_age_group.py (100%) rename policyengine_us/variables/gov/states/va/dss/ccsp/{ => rates}/va_ccsp_daily_mrr.py (92%) rename policyengine_us/variables/gov/states/va/dss/ccsp/{ => rates}/va_ccsp_is_full_day.py (68%) rename policyengine_us/variables/gov/states/va/dss/ccsp/{ => rates}/va_ccsp_provider_type.py (78%) rename policyengine_us/variables/gov/states/va/dss/ccsp/{ => rates}/va_ccsp_ready_region.py (100%) diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/activity/min_hours_per_week.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/activity/min_hours_per_week.yaml index c787be50488..0eb8370ec64 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/activity/min_hours_per_week.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/activity/min_hours_per_week.yaml @@ -10,4 +10,4 @@ metadata: - title: 8VAC20-790-30 href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section30/ - title: Child Care Subsidy Program Guidance Manual Section 1.1 - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=20 + href: https://ris.dls.virginia.gov/uploads/22VAC40/dibr/VDOE%20Child%20Care%20Program%20Guidance%20Manual%205.3.2023-20240822104447.pdf#page=20 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/child.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/child.yaml index ae51ae18c24..a0f45e713b5 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/child.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/child.yaml @@ -10,4 +10,4 @@ metadata: - title: 8VAC20-790-20(A) href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section20/ - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.3 G - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=58 + href: https://ris.dls.virginia.gov/uploads/22VAC40/dibr/VDOE%20Child%20Care%20Program%20Guidance%20Manual%205.3.2023-20240822104447.pdf#page=58 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/disabled_child.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/disabled_child.yaml index 07c245fd376..e275d9939c1 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/disabled_child.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/age_threshold/disabled_child.yaml @@ -10,4 +10,4 @@ metadata: - title: 8VAC20-790-20(B) href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section20/ - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.3 G - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=58 + href: https://ris.dls.virginia.gov/uploads/22VAC40/dibr/VDOE%20Child%20Care%20Program%20Guidance%20Manual%205.3.2023-20240822104447.pdf#page=58 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/income_cap_rate.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/income_cap_rate.yaml index 5f1cd52df98..8f31d8e58de 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/income_cap_rate.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/income_cap_rate.yaml @@ -9,6 +9,6 @@ metadata: label: Virginia CCSP copayment income cap rate reference: - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.5 A - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=69 + href: https://ris.dls.virginia.gov/uploads/22VAC40/dibr/VDOE%20Child%20Care%20Program%20Guidance%20Manual%205.3.2023-20240822104447.pdf#page=69 - title: Budget Amendment HB30 Item 126 #2h href: https://budget.lis.virginia.gov/amendment/2024/2/HB30/Enrolled/CR/126/2h/ diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/max_children.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/max_children.yaml index 54513637c48..d6f2b4dfa8d 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/max_children.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/max_children.yaml @@ -8,4 +8,4 @@ metadata: label: Virginia CCSP maximum children assessed copayment reference: - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.5 A - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=69 + href: https://ris.dls.virginia.gov/uploads/22VAC40/dibr/VDOE%20Child%20Care%20Program%20Guidance%20Manual%205.3.2023-20240822104447.pdf#page=69 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/per_child_scale.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/per_child_scale.yaml index 871a08322e0..6d743f03203 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/per_child_scale.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/copay/per_child_scale.yaml @@ -8,7 +8,7 @@ metadata: label: Virginia CCSP per-child copayment scale reference: - title: Virginia Child Care Subsidy Program Guidance Manual Appendix B - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=143 + href: https://ris.dls.virginia.gov/uploads/22VAC40/dibr/VDOE%20Child%20Care%20Program%20Guidance%20Manual%205.3.2023-20240822104447.pdf#page=143 - title: Child Care Subsidy Program (CCSP) Copayment Scale (Effective July 1, 2025) href: https://www.childcare.virginia.gov/home/showpublisheddocument/65775/638937831784030000 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/sources.yaml index fdb938e5fee..19e7d8a2fa0 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/sources.yaml @@ -30,4 +30,4 @@ metadata: - title: 8VAC20-790-40(C)(1) href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/ - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.4 E - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=63 + href: https://ris.dls.virginia.gov/uploads/22VAC40/dibr/VDOE%20Child%20Care%20Program%20Guidance%20Manual%205.3.2023-20240822104447.pdf#page=63 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/subtracts.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/subtracts.yaml index b1969e6f7d1..197160584ea 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/subtracts.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/countable_income/subtracts.yaml @@ -8,5 +8,7 @@ metadata: period: year label: Virginia CCSP countable income deductions reference: + - title: 8VAC20-790-40(B) + href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/ - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.4 G - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=66 + href: https://ris.dls.virginia.gov/uploads/22VAC40/dibr/VDOE%20Child%20Care%20Program%20Guidance%20Manual%205.3.2023-20240822104447.pdf#page=66 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/exit_smi_rate.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/exit_smi_rate.yaml index ad22b4bd764..03f20058655 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/exit_smi_rate.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/exit_smi_rate.yaml @@ -10,4 +10,4 @@ metadata: - title: 8VAC20-790-40(D) href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/ - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.15 E - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=99 + href: https://ris.dls.virginia.gov/uploads/22VAC40/dibr/VDOE%20Child%20Care%20Program%20Guidance%20Manual%205.3.2023-20240822104447.pdf#page=99 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/initial_eligibility_fpg_rate.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/initial_eligibility_fpg_rate.yaml index 3c012cca3c9..2a41ef2f325 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/initial_eligibility_fpg_rate.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/initial_eligibility_fpg_rate.yaml @@ -10,7 +10,7 @@ metadata: - title: 8VAC20-790-40(C)(1) href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/ - title: Virginia Child Care Subsidy Program Guidance Manual Appendix A - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=142 + href: https://ris.dls.virginia.gov/uploads/22VAC40/dibr/VDOE%20Child%20Care%20Program%20Guidance%20Manual%205.3.2023-20240822104447.pdf#page=142 GROUP_I: 2023-01-01: 1.5 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_age_threshold.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_age_threshold.yaml index ffb612b0e17..78ea7c9c20c 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_age_threshold.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_age_threshold.yaml @@ -10,4 +10,4 @@ metadata: - title: 8VAC20-790-40(C)(2) href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/ - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.4 A - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=62 + href: https://ris.dls.virginia.gov/uploads/22VAC40/dibr/VDOE%20Child%20Care%20Program%20Guidance%20Manual%205.3.2023-20240822104447.pdf#page=62 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_smi_rate.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_smi_rate.yaml index 5dafaea2a22..ef72a5d0c4b 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_smi_rate.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/income/young_child_smi_rate.yaml @@ -10,4 +10,4 @@ metadata: - title: 8VAC20-790-40(C)(2) href: https://law.lis.virginia.gov/admincode/title8/agency20/chapter790/section40/ - title: Virginia Child Care Subsidy Program Guidance Manual Section 3.4 A - href: https://doe.virginia.gov/home/showpublisheddocument/56270#page=62 + href: https://ris.dls.virginia.gov/uploads/22VAC40/dibr/VDOE%20Child%20Care%20Program%20Guidance%20Manual%205.3.2023-20240822104447.pdf#page=62 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group1.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group1.yaml index 2d2768639b9..715918dcb72 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group1.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group1.yaml @@ -72,22 +72,22 @@ values: - WYTHE_COUNTY_VA # Cities - BRISTOL_CITY_VA - - BUENA_VISTA_CITY_VA - - COVINGTON_CITY_VA + # - BUENA_VISTA_CITY_VA # not in county_enum + # - COVINGTON_CITY_VA # not in county_enum - DANVILLE_CITY_VA - EMPORIA_CITY_VA - FRANKLIN_CITY_VA - - GALAX_CITY_VA + # - GALAX_CITY_VA # not in county_enum - HARRISONBURG_CITY_VA - LEXINGTON_CITY_VA - LYNCHBURG_CITY_VA - - MARTINSVILLE_CITY_VA + # - MARTINSVILLE_CITY_VA # not in county_enum - NORTON_CITY_VA - RADFORD_CITY_VA - ROANOKE_CITY_VA - STAUNTON_CITY_VA - WAYNESBORO_CITY_VA - - WINCHESTER_CITY_VA + # - WINCHESTER_CITY_VA # not in county_enum metadata: unit: list diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group2.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group2.yaml index 32e565f9b42..e5381a6ff3a 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group2.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group2.yaml @@ -23,7 +23,7 @@ values: # Cities - CHARLOTTESVILLE_CITY_VA - CHESAPEAKE_CITY_VA - - COLONIAL_HEIGHTS_CITY_VA + # - COLONIAL_HEIGHTS_CITY_VA # not in county_enum - HAMPTON_CITY_VA - HOPEWELL_CITY_VA - NEWPORT_NEWS_CITY_VA @@ -34,7 +34,7 @@ values: - RICHMOND_CITY_VA - SUFFOLK_CITY_VA - VIRGINIA_BEACH_CITY_VA - - WILLIAMSBURG_CITY_VA + # - WILLIAMSBURG_CITY_VA # not in county_enum metadata: unit: list diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group3.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group3.yaml index bf639982d13..a14ca0859a2 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group3.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/localities/group3.yaml @@ -17,8 +17,9 @@ values: # Cities - ALEXANDRIA_CITY_VA - FAIRFAX_CITY_VA + - FALLS_CHURCH_CITY_VA - FREDERICKSBURG_CITY_VA - - MANASSAS_CITY_VA + # - MANASSAS_CITY_VA # not in county_enum - MANASSAS_PARK_CITY_VA metadata: diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/center.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/center.yaml index 6874e81ccc1..c4a3f74e983 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/center.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/center.yaml @@ -9,7 +9,7 @@ metadata: - va_ccsp_care_age_group reference: - title: VDOE Maximum Reimbursement Rates FY 2024 - href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates BLUE_RIDGE: INFANT: diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/family_day_home.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/family_day_home.yaml index e9475cc2c9b..0c7a708c9a2 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/family_day_home.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/family_day_home.yaml @@ -8,7 +8,7 @@ metadata: - va_ccsp_ready_region reference: - title: VDOE Maximum Reimbursement Rates FY 2024 - href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates BLUE_RIDGE: 2023-08-01: 53 diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/part_day_factor.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/part_day_factor.yaml index 16c26ab721f..68d35e79f41 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/part_day_factor.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/part_day_factor.yaml @@ -9,4 +9,4 @@ metadata: label: Virginia CCSP part day factor reference: - title: VDOE Maximum Reimbursement Rates FY 2024 - href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/blue_ridge.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/blue_ridge.yaml index 67582c3eb84..575796fcf5a 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/blue_ridge.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/blue_ridge.yaml @@ -6,7 +6,7 @@ metadata: label: Virginia CCSP Blue Ridge Ready Region localities reference: - title: VDOE Maximum Reimbursement Rates FY 2024 - href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates values: 2023-08-01: @@ -30,4 +30,4 @@ values: - STAUNTON_CITY_VA - WARREN_COUNTY_VA - WAYNESBORO_CITY_VA - - WINCHESTER_CITY_VA + # - WINCHESTER_CITY_VA # not in county_enum diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/capital_area.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/capital_area.yaml index 2c38436f6cc..14ce0d4ed7b 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/capital_area.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/capital_area.yaml @@ -6,7 +6,7 @@ metadata: label: Virginia CCSP Capital Area Ready Region localities reference: - title: VDOE Maximum Reimbursement Rates FY 2024 - href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates values: 2023-08-01: diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/central.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/central.yaml index 8efa356c99c..7ad8e39d099 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/central.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/central.yaml @@ -6,13 +6,13 @@ metadata: label: Virginia CCSP Central Ready Region localities reference: - title: VDOE Maximum Reimbursement Rates FY 2024 - href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates values: 2023-08-01: - CHARLES_CITY_COUNTY_VA - CHESTERFIELD_COUNTY_VA - - COLONIAL_HEIGHTS_CITY_VA + # - COLONIAL_HEIGHTS_CITY_VA # not in county_enum - DINWIDDIE_COUNTY_VA - EMPORIA_CITY_VA - GOOCHLAND_COUNTY_VA diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/chesapeake_bay.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/chesapeake_bay.yaml index 758509be06f..34cdb625dc3 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/chesapeake_bay.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/chesapeake_bay.yaml @@ -6,7 +6,7 @@ metadata: label: Virginia CCSP Chesapeake Bay Ready Region localities reference: - title: VDOE Maximum Reimbursement Rates FY 2024 - href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates values: 2023-08-01: @@ -24,5 +24,5 @@ values: - POQUOSON_CITY_VA - RICHMOND_COUNTY_VA - WESTMORELAND_COUNTY_VA - - WILLIAMSBURG_CITY_VA + # - WILLIAMSBURG_CITY_VA # not in county_enum - YORK_COUNTY_VA diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/north_central.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/north_central.yaml index 91b04f38832..1e8259dd0e0 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/north_central.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/north_central.yaml @@ -6,7 +6,7 @@ metadata: label: Virginia CCSP North Central Ready Region localities reference: - title: VDOE Maximum Reimbursement Rates FY 2024 - href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates values: 2023-08-01: @@ -16,7 +16,7 @@ values: - FREDERICKSBURG_CITY_VA - KING_GEORGE_COUNTY_VA - LOUDOUN_COUNTY_VA - - MANASSAS_CITY_VA + # - MANASSAS_CITY_VA # not in county_enum - MANASSAS_PARK_CITY_VA - PRINCE_WILLIAM_COUNTY_VA - SPOTSYLVANIA_COUNTY_VA diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/southeastern.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/southeastern.yaml index 8fa2c6c3b2d..f1bc7929236 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/southeastern.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/southeastern.yaml @@ -6,7 +6,7 @@ metadata: label: Virginia CCSP Southeastern Ready Region localities reference: - title: VDOE Maximum Reimbursement Rates FY 2024 - href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates values: 2023-08-01: diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/southside.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/southside.yaml index 4d224fad72e..a228674a374 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/southside.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/southside.yaml @@ -6,7 +6,7 @@ metadata: label: Virginia CCSP Southside Ready Region localities reference: - title: VDOE Maximum Reimbursement Rates FY 2024 - href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates values: 2023-08-01: diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/southwest.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/southwest.yaml index 7eb18bb598b..b9b300ffbd5 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/southwest.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/southwest.yaml @@ -6,7 +6,7 @@ metadata: label: Virginia CCSP Southwest Ready Region localities reference: - title: VDOE Maximum Reimbursement Rates FY 2024 - href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates values: 2023-08-01: @@ -16,7 +16,7 @@ values: - CARROLL_COUNTY_VA - DICKENSON_COUNTY_VA - FLOYD_COUNTY_VA - - GALAX_CITY_VA + # - GALAX_CITY_VA # not in county_enum - GILES_COUNTY_VA - GRAYSON_COUNTY_VA - LEE_COUNTY_VA diff --git a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/west.yaml b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/west.yaml index 41efbc3b0ad..2aa200f0562 100644 --- a/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/west.yaml +++ b/policyengine_us/parameters/gov/states/va/dss/ccsp/maximum_reimbursement_rate/ready_region/west.yaml @@ -6,23 +6,23 @@ metadata: label: Virginia CCSP West Ready Region localities reference: - title: VDOE Maximum Reimbursement Rates FY 2024 - href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates#page=2 + href: https://data.virginia.gov/dataset/general-child-care-subsidy-program-maximum-reimbursement-rates values: 2023-08-01: - ALLEGHANY_COUNTY_VA - BATH_COUNTY_VA - BOTETOURT_COUNTY_VA - - BUENA_VISTA_CITY_VA - - COVINGTON_CITY_VA + # - BUENA_VISTA_CITY_VA # not in county_enum + # - COVINGTON_CITY_VA # not in county_enum - CRAIG_COUNTY_VA - FRANKLIN_COUNTY_VA - HENRY_COUNTY_VA - HIGHLAND_COUNTY_VA - LEXINGTON_CITY_VA - - MARTINSVILLE_CITY_VA + # - MARTINSVILLE_CITY_VA # not in county_enum - PATRICK_COUNTY_VA - ROANOKE_CITY_VA - ROANOKE_COUNTY_VA - ROCKBRIDGE_COUNTY_VA - - SALEM_CITY_VA + # - SALEM_CITY_VA # not in county_enum diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_2025_07.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_2025_07.yaml index 9ac0f25dce2..0e873464719 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_2025_07.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_2025_07.yaml @@ -27,6 +27,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -55,6 +56,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -88,6 +90,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -122,6 +125,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -156,14 +160,17 @@ person2: age: 10 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person3: age: 7 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person4: age: 4 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -208,6 +215,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -236,6 +244,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -269,6 +278,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -302,6 +312,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -336,6 +347,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -370,14 +382,17 @@ person2: age: 10 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person3: age: 7 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person4: age: 4 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_edge.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_edge.yaml index bfc2e9d532b..53fee7aa414 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_edge.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_edge.yaml @@ -35,6 +35,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -69,6 +70,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -103,6 +105,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -137,6 +140,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -172,14 +176,17 @@ person2: age: 10 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person3: age: 7 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person4: age: 4 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -215,22 +222,27 @@ person2: age: 11 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person3: age: 9 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person4: age: 7 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person5: age: 4 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person6: age: 2 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -268,14 +280,17 @@ person2: age: 8 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person3: age: 6 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person4: age: 3 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -321,14 +336,17 @@ person2: age: 10 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person3: age: 7 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person4: age: 4 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -364,6 +382,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -392,6 +411,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -432,6 +452,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -466,10 +487,12 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person3: age: 3 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -501,6 +524,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp.yaml index 09948c6fb36..0d4fc7d5524 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp.yaml @@ -1,6 +1,5 @@ # Virginia CCSP benefit amount tests -# Benefit = max(childcare_expenses - copay, 0) -# (MRR ceiling not modeled in initial implementation) +# Benefit = min(max(childcare_expenses - copay, 0), monthly_mrr) - name: Case 1, basic benefit calculation. period: 2024-01 diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.yaml index 11e15434508..5b09c85d86e 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.yaml @@ -130,3 +130,32 @@ output: # Person2 is head/spouse but fails activity test va_ccsp_activity_eligible: false + +- name: Case 6, two parents one works other is disabled. + period: 2024-01 + input: + people: + person1: + age: 35 + weekly_hours_worked: 40 + person2: + age: 33 + weekly_hours_worked: 0 + is_full_time_student: false + is_disabled: true + person3: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: VA + output: + # Person1 works (active), person2 disabled (meets requirement) + va_ccsp_activity_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_copay.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_copay.yaml index 02efbdaddd6..9417653cddd 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_copay.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_copay.yaml @@ -20,10 +20,12 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person3: age: 3 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -57,10 +59,12 @@ person2: age: 8 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person3: age: 6 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -95,18 +99,22 @@ person2: age: 10 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person3: age: 8 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person4: age: 6 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person5: age: 3 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -143,6 +151,7 @@ person2: age: 5 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: @@ -171,14 +180,17 @@ person2: age: 8 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person3: age: 6 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN person4: age: 3 is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 immigration_status: CITIZEN tax_units: tax_unit: diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_ready_region.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_ready_region.yaml new file mode 100644 index 00000000000..9a947ceac6d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/va_ccsp_ready_region.yaml @@ -0,0 +1,125 @@ +- name: Case 1, Capital Area (Arlington). + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: VA + county: ARLINGTON_COUNTY_VA + output: + va_ccsp_ready_region: CAPITAL_AREA + +- name: Case 2, Southeastern (Accomack). + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: VA + county: ACCOMACK_COUNTY_VA + output: + va_ccsp_ready_region: SOUTHEASTERN + +- name: Case 3, North Central (Loudoun). + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: VA + county: LOUDOUN_COUNTY_VA + output: + va_ccsp_ready_region: NORTH_CENTRAL + +- name: Case 4, Southwest (Bristol). + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: VA + county: BRISTOL_CITY_VA + output: + va_ccsp_ready_region: SOUTHWEST + +- name: Case 5, Blue Ridge (Rockingham). + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: VA + county: ROCKINGHAM_COUNTY_VA + output: + va_ccsp_ready_region: BLUE_RIDGE + +- name: Case 6, West (Roanoke County). + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: VA + county: ROANOKE_COUNTY_VA + output: + va_ccsp_ready_region: WEST + +- name: Case 7, Central (Henrico). + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: VA + county: HENRICO_COUNTY_VA + output: + va_ccsp_ready_region: CENTRAL + +- name: Case 8, Chesapeake Bay (York). + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: VA + county: YORK_COUNTY_VA + output: + va_ccsp_ready_region: CHESAPEAKE_BAY + +- name: Case 9, Southside (Bedford). + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: VA + county: BEDFORD_COUNTY_VA + output: + va_ccsp_ready_region: SOUTHSIDE diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_copay.py b/policyengine_us/variables/gov/states/va/dss/ccsp/copay/va_ccsp_copay.py similarity index 86% rename from policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_copay.py rename to policyengine_us/variables/gov/states/va/dss/ccsp/copay/va_ccsp_copay.py index 77c7f60c661..4690647e9d6 100644 --- a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_copay.py +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/copay/va_ccsp_copay.py @@ -27,10 +27,11 @@ def formula(spm_unit, period, parameters): ) per_child_copay = p.per_child_scale.calc(fpg_ratio) - # Count eligible children, capped at max_children + # Count eligible children actually in care, capped at max_children person = spm_unit.members eligible_child = person("va_ccsp_child_eligible", period) - n_eligible_children = spm_unit.sum(eligible_child) + attending = person("childcare_attending_days_per_month", period.this_year) > 0 + n_eligible_children = spm_unit.sum(eligible_child & attending) n_assessed = min_(n_eligible_children, p.max_children) # Total from scale diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.py b/policyengine_us/variables/gov/states/va/dss/ccsp/eligibility/va_ccsp_activity_eligible.py similarity index 100% rename from policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_activity_eligible.py rename to policyengine_us/variables/gov/states/va/dss/ccsp/eligibility/va_ccsp_activity_eligible.py diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_child_eligible.py b/policyengine_us/variables/gov/states/va/dss/ccsp/eligibility/va_ccsp_child_eligible.py similarity index 100% rename from policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_child_eligible.py rename to policyengine_us/variables/gov/states/va/dss/ccsp/eligibility/va_ccsp_child_eligible.py diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_eligible.py b/policyengine_us/variables/gov/states/va/dss/ccsp/eligibility/va_ccsp_eligible.py similarity index 100% rename from policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_eligible.py rename to policyengine_us/variables/gov/states/va/dss/ccsp/eligibility/va_ccsp_eligible.py diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_enrolled.py b/policyengine_us/variables/gov/states/va/dss/ccsp/eligibility/va_ccsp_enrolled.py similarity index 100% rename from policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_enrolled.py rename to policyengine_us/variables/gov/states/va/dss/ccsp/eligibility/va_ccsp_enrolled.py diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_eligible.py b/policyengine_us/variables/gov/states/va/dss/ccsp/eligibility/va_ccsp_income_eligible.py similarity index 100% rename from policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_eligible.py rename to policyengine_us/variables/gov/states/va/dss/ccsp/eligibility/va_ccsp_income_eligible.py diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_test_waived.py b/policyengine_us/variables/gov/states/va/dss/ccsp/eligibility/va_ccsp_income_test_waived.py similarity index 100% rename from policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_income_test_waived.py rename to policyengine_us/variables/gov/states/va/dss/ccsp/eligibility/va_ccsp_income_test_waived.py diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_countable_income.py b/policyengine_us/variables/gov/states/va/dss/ccsp/income/va_ccsp_countable_income.py similarity index 100% rename from policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_countable_income.py rename to policyengine_us/variables/gov/states/va/dss/ccsp/income/va_ccsp_countable_income.py diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_care_age_group.py b/policyengine_us/variables/gov/states/va/dss/ccsp/rates/va_ccsp_care_age_group.py similarity index 100% rename from policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_care_age_group.py rename to policyengine_us/variables/gov/states/va/dss/ccsp/rates/va_ccsp_care_age_group.py diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_daily_mrr.py b/policyengine_us/variables/gov/states/va/dss/ccsp/rates/va_ccsp_daily_mrr.py similarity index 92% rename from policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_daily_mrr.py rename to policyengine_us/variables/gov/states/va/dss/ccsp/rates/va_ccsp_daily_mrr.py index 15a711d27ba..374146a38f6 100644 --- a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_daily_mrr.py +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/rates/va_ccsp_daily_mrr.py @@ -1,5 +1,5 @@ from policyengine_us.model_api import * -from policyengine_us.variables.gov.states.va.dss.ccsp.va_ccsp_provider_type import ( +from policyengine_us.variables.gov.states.va.dss.ccsp.rates.va_ccsp_provider_type import ( VACCSPProviderType, ) diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_is_full_day.py b/policyengine_us/variables/gov/states/va/dss/ccsp/rates/va_ccsp_is_full_day.py similarity index 68% rename from policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_is_full_day.py rename to policyengine_us/variables/gov/states/va/dss/ccsp/rates/va_ccsp_is_full_day.py index 46da75a7dfa..42b063383af 100644 --- a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_is_full_day.py +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/rates/va_ccsp_is_full_day.py @@ -8,3 +8,4 @@ class va_ccsp_is_full_day(Variable): default_value = True label = "Virginia CCSP full day care" defined_for = StateCode.VA + reference = "https://www.childcare.virginia.gov/home/showpublisheddocument/66667/638981099706730000#page=203" diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_provider_type.py b/policyengine_us/variables/gov/states/va/dss/ccsp/rates/va_ccsp_provider_type.py similarity index 78% rename from policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_provider_type.py rename to policyengine_us/variables/gov/states/va/dss/ccsp/rates/va_ccsp_provider_type.py index 6b848cd0fec..38ee5089f66 100644 --- a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_provider_type.py +++ b/policyengine_us/variables/gov/states/va/dss/ccsp/rates/va_ccsp_provider_type.py @@ -14,3 +14,4 @@ class va_ccsp_provider_type(Variable): definition_period = YEAR label = "Virginia CCSP provider type" defined_for = StateCode.VA + reference = "https://www.childcare.virginia.gov/home/showpublisheddocument/66667/638981099706730000#page=203" diff --git a/policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_ready_region.py b/policyengine_us/variables/gov/states/va/dss/ccsp/rates/va_ccsp_ready_region.py similarity index 100% rename from policyengine_us/variables/gov/states/va/dss/ccsp/va_ccsp_ready_region.py rename to policyengine_us/variables/gov/states/va/dss/ccsp/rates/va_ccsp_ready_region.py From 98a0c821b2de7523c109ac8993341df043786c3d Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 8 Apr 2026 02:03:48 -0400 Subject: [PATCH 10/10] Consolidate copay tests: merge 2025-07 file into copay_edge Remove redundant va_ccsp_copay_2025_07.yaml and consolidate its 2026-01 new-scale tests into va_ccsp_copay_edge.yaml. Drop duplicate old-scale-at-2025-01 tests already covered by main copay test file. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../edge_cases/va_ccsp_copay_2025_07.yaml | 416 ------------------ .../ccsp/edge_cases/va_ccsp_copay_edge.yaml | 178 ++++++-- 2 files changed, 148 insertions(+), 446 deletions(-) delete mode 100644 policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_2025_07.yaml diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_2025_07.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_2025_07.yaml deleted file mode 100644 index 0e873464719..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_2025_07.yaml +++ /dev/null @@ -1,416 +0,0 @@ -# Virginia CCSP copay tests for 2025-07-01 new scale -# The new copay scale takes effect 2025-07-01 (HB30 Item 126 #2h) -# We test with period 2025-01 which uses the OLD scale parameters -# because YAML tests can only use YYYY-01 or YYYY period formats. -# -# The 2025-07-01 scale has new bracket thresholds: -# 0: $0, >0-100%: $5, >100-150%: $125, >150-200%: $175, -# >200-250%: $225, >250-300%: $275, >300-350%: $325, >350%+: $375 -# Income cap changes from 7% to 5% on 2025-07-01 -# -# Since test periods are limited to 2025-01 (old scale) or 2025 (annual), -# the 2025-07-01 parameters are NOT testable via standard YAML period format. -# These tests verify the OLD scale still applies correctly at 2025-01. -# -# 2025 FPG: first_person = 15,650, additional = 5,500 -# Family of 2: 21,150 -# Monthly FPG: 21,150/12 = 1,762.50 - -- name: Case 1, 2025 old scale zero income. - period: 2025-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 30 - immigration_status: CITIZEN - person2: - age: 5 - is_tax_unit_dependent: true - childcare_attending_days_per_month: 23 - immigration_status: CITIZEN - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - va_ccsp_locality_group: GROUP_III - households: - household: - members: [person1, person2] - state_code: VA - output: - # Zero income -> FPG ratio = 0 -> $0/child - va_ccsp_copay: 0 - -- name: Case 2, 2025 old scale above 100% FPG. - period: 2025-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 30 - employment_income: 24_000 - immigration_status: CITIZEN - person2: - age: 5 - is_tax_unit_dependent: true - childcare_attending_days_per_month: 23 - immigration_status: CITIZEN - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - va_ccsp_locality_group: GROUP_III - households: - household: - members: [person1, person2] - state_code: VA - output: - # Monthly income: 24,000/12 = 2,000 - # Monthly FPG: 21,150/12 = 1,762.50 - # FPG ratio: 2,000/1,762.50 = 1.1348 -> old scale >100% = $60 - # 1 child * $60 = $60 - # Income cap: 24,000 * 0.07 / 12 = 140 - # Copay: min(60, 140) = $60 - va_ccsp_copay: 60 - -- name: Case 3, 2025 old scale above 200% FPG. - period: 2025-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 30 - employment_income: 48_000 - immigration_status: CITIZEN - person2: - age: 5 - is_tax_unit_dependent: true - childcare_attending_days_per_month: 23 - immigration_status: CITIZEN - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - va_ccsp_enrolled: true - va_ccsp_locality_group: GROUP_III - households: - household: - members: [person1, person2] - state_code: VA - output: - # Monthly income: 48,000/12 = 4,000 - # Monthly FPG: 21,150/12 = 1,762.50 - # FPG ratio: 4,000/1,762.50 = 2.2695 -> old scale >200% = $120 - # 1 child * $120 = $120 - # Income cap: 48,000 * 0.07 / 12 = 280 - # Copay: min(120, 280) = $120 - va_ccsp_copay: 120 - -- name: Case 4, 2025 old scale above 300% FPG. - period: 2025-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 30 - employment_income: 72_000 - immigration_status: CITIZEN - person2: - age: 5 - is_tax_unit_dependent: true - childcare_attending_days_per_month: 23 - immigration_status: CITIZEN - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - va_ccsp_enrolled: true - va_ccsp_locality_group: GROUP_III - households: - household: - members: [person1, person2] - state_code: VA - output: - # Monthly income: 72,000/12 = 6,000 - # Monthly FPG: 21,150/12 = 1,762.50 - # FPG ratio: 6,000/1,762.50 = 3.4043 -> old scale >300% = $180 - # 1 child * $180 = $180 - # Income cap: 72,000 * 0.07 / 12 = 420 - # Copay: min(180, 420) = $180 - va_ccsp_copay: 180 - -- name: Case 5, 2025 old scale 5% income cap NOT yet in effect. - period: 2025-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 35 - employment_income: 84_000 - immigration_status: CITIZEN - person2: - age: 10 - is_tax_unit_dependent: true - childcare_attending_days_per_month: 23 - immigration_status: CITIZEN - person3: - age: 7 - is_tax_unit_dependent: true - childcare_attending_days_per_month: 23 - immigration_status: CITIZEN - person4: - age: 4 - is_tax_unit_dependent: true - childcare_attending_days_per_month: 23 - immigration_status: CITIZEN - tax_units: - tax_unit: - members: [person1, person2, person3, person4] - spm_units: - spm_unit: - members: [person1, person2, person3, person4] - va_ccsp_enrolled: true - va_ccsp_locality_group: GROUP_III - households: - household: - members: [person1, person2, person3, person4] - state_code: VA - output: - # Monthly income: 84,000/12 = 7,000 - # FPG size 4: 32,150, monthly = 2,679.17 - # FPG ratio: 7,000/2,679.17 = 2.6128 -> old scale >200% = $120 - # 3 eligible children, scale total: $120 * 3 = $360 - # Income cap: 84,000 * 0.07 / 12 = 490 (still 7% in Jan 2025) - # Copay: min(360, 490) = $360 - va_ccsp_copay: 360 - -# === NEW SCALE TESTS (period 2026-01 exercises 2025-07-01 parameters) === -# -# 2026 FPG: first_person = 15,960, additional = 5,680 -# Family of 2: 21,640 -# Monthly FPG: 21,640/12 = 1,803.33 -# -# New brackets (2025-07-01): -# 0%: $0, >0-100%: $5, >100-150%: $125, >150-200%: $175, -# >200-250%: $225, >250-300%: $275, >300-350%: $325, >350%+: $375 -# Income cap: 5% - -- name: Case 6, new scale zero income. - period: 2026-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 30 - immigration_status: CITIZEN - person2: - age: 5 - is_tax_unit_dependent: true - childcare_attending_days_per_month: 23 - immigration_status: CITIZEN - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - va_ccsp_locality_group: GROUP_III - households: - household: - members: [person1, person2] - state_code: VA - output: - # Zero income -> FPG ratio = 0 -> $0/child - va_ccsp_copay: 0 - -- name: Case 7, new scale above $0 but under 100% FPG ($5 bracket). - period: 2026-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 30 - employment_income: 12_000 - immigration_status: CITIZEN - person2: - age: 5 - is_tax_unit_dependent: true - childcare_attending_days_per_month: 23 - immigration_status: CITIZEN - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - va_ccsp_locality_group: GROUP_III - households: - household: - members: [person1, person2] - state_code: VA - output: - # Monthly income: 12,000/12 = 1,000 - # Monthly FPG: 21,640/12 = 1,803.33 - # FPG ratio: 1,000/1,803.33 = 0.5546 -> new scale >0 = $5 - # 1 child * $5 = $5 - # Income cap: 12,000 * 0.05 / 12 = 50 - # Copay: min(5, 50) = $5 - va_ccsp_copay: 5 - -- name: Case 8, new scale above 100% FPG ($125 bracket). - period: 2026-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 30 - employment_income: 24_000 - immigration_status: CITIZEN - person2: - age: 5 - is_tax_unit_dependent: true - childcare_attending_days_per_month: 23 - immigration_status: CITIZEN - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - va_ccsp_locality_group: GROUP_III - households: - household: - members: [person1, person2] - state_code: VA - output: - # Monthly income: 24,000/12 = 2,000 - # Monthly FPG: 21,640/12 = 1,803.33 - # FPG ratio: 2,000/1,803.33 = 1.1090 -> new scale >100% = $125 - # 1 child * $125 = $125 - # Income cap: 24,000 * 0.05 / 12 = 100 - # Copay: min(125, 100) = $100 (income cap binds) - va_ccsp_copay: 100 - -- name: Case 9, new scale above 200% FPG ($225 bracket). - period: 2026-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 30 - employment_income: 48_000 - immigration_status: CITIZEN - person2: - age: 5 - is_tax_unit_dependent: true - childcare_attending_days_per_month: 23 - immigration_status: CITIZEN - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - va_ccsp_enrolled: true - va_ccsp_locality_group: GROUP_III - households: - household: - members: [person1, person2] - state_code: VA - output: - # Monthly income: 48,000/12 = 4,000 - # Monthly FPG: 21,640/12 = 1,803.33 - # FPG ratio: 4,000/1,803.33 = 2.2178 -> new scale >200% = $225 - # 1 child * $225 = $225 - # Income cap: 48,000 * 0.05 / 12 = 200 - # Copay: min(225, 200) = $200 (income cap binds) - va_ccsp_copay: 200 - -- name: Case 10, new scale above 350% FPG ($375 bracket). - period: 2026-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 30 - employment_income: 84_000 - immigration_status: CITIZEN - person2: - age: 5 - is_tax_unit_dependent: true - childcare_attending_days_per_month: 23 - immigration_status: CITIZEN - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - va_ccsp_enrolled: true - va_ccsp_locality_group: GROUP_III - households: - household: - members: [person1, person2] - state_code: VA - output: - # Monthly income: 84,000/12 = 7,000 - # Monthly FPG: 21,640/12 = 1,803.33 - # FPG ratio: 7,000/1,803.33 = 3.8814 -> new scale >350% = $375 - # 1 child * $375 = $375 - # Income cap: 84,000 * 0.05 / 12 = 350 - # Copay: min(375, 350) = $350 (income cap binds) - va_ccsp_copay: 350 - -- name: Case 11, new scale 5% income cap with 3 children. - period: 2026-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 35 - employment_income: 84_000 - immigration_status: CITIZEN - person2: - age: 10 - is_tax_unit_dependent: true - childcare_attending_days_per_month: 23 - immigration_status: CITIZEN - person3: - age: 7 - is_tax_unit_dependent: true - childcare_attending_days_per_month: 23 - immigration_status: CITIZEN - person4: - age: 4 - is_tax_unit_dependent: true - childcare_attending_days_per_month: 23 - immigration_status: CITIZEN - tax_units: - tax_unit: - members: [person1, person2, person3, person4] - spm_units: - spm_unit: - members: [person1, person2, person3, person4] - va_ccsp_enrolled: true - va_ccsp_locality_group: GROUP_III - households: - household: - members: [person1, person2, person3, person4] - state_code: VA - output: - # Monthly income: 84,000/12 = 7,000 - # FPG size 4: 15,960 + 5,680*3 = 33,000, monthly = 2,750 - # FPG ratio: 7,000/2,750 = 2.5455 -> new scale >250% = $275 - # 3 eligible children, scale total: $275 * 3 = $825 - # Income cap: 84,000 * 0.05 / 12 = 350 (5% cap) - # Copay: min(825, 350) = $350 - va_ccsp_copay: 350 diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_edge.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_edge.yaml index 53fee7aa414..58839d8bc2f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_edge.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dss/ccsp/edge_cases/va_ccsp_copay_edge.yaml @@ -1,6 +1,6 @@ # Virginia CCSP copay edge case tests # Focus: copay bracket boundaries, income cap binding vs not, max children cap, -# 2025-07 new copay scale tests +# 2025-07-01 new copay scale (tested at 2026-01) # # 2024 FPG (contiguous US): Family of 2: 20,440 # Monthly FPG: 20,440/12 = 1,703.333... @@ -369,10 +369,19 @@ # Copay: min(360, 490) = $360 va_ccsp_copay: 360 -# === 2025-07-01 NEW COPAY SCALE === +# === 2025-07-01 NEW COPAY SCALE (tested at 2026-01) === +# +# 2026 FPG: first_person = 15,960, additional = 5,680 +# Family of 2: 21,640 +# Monthly FPG: 21,640/12 = 1,803.33 +# +# New brackets (2025-07-01): +# 0%: $0, >0-100%: $5, >100-150%: $125, >150-200%: $175, +# >200-250%: $225, >250-300%: $275, >300-350%: $325, >350%+: $375 +# Income cap: 5% -- name: Case 9, new scale 2025-07 zero income pays $0. - period: 2025-01 +- name: Case 9, new scale zero income. + period: 2026-01 absolute_error_margin: 0.01 input: people: @@ -396,11 +405,11 @@ members: [person1, person2] state_code: VA output: - # Zero income -> FPG ratio = 0 -> $0 + # Zero income -> FPG ratio = 0 -> $0/child va_ccsp_copay: 0 -- name: Case 10, new scale 2025-07 just above 0% FPG pays $5. - period: 2025-01 +- name: Case 10, new scale above $0 but under 100% FPG ($5 bracket). + period: 2026-01 absolute_error_margin: 0.01 input: people: @@ -425,28 +434,21 @@ members: [person1, person2] state_code: VA output: - # 2025 FPG size 2: 21,150 # Monthly income: 12,000/12 = 1,000 - # Monthly FPG: 21,150/12 = 1,762.50 - # FPG ratio: 1,000/1,762.50 = 0.5674 - # New scale (2025-07-01): >0-100% = $5 - # BUT test period is 2025-01, still uses OLD scale - # Old scale: 0-100% = $0 - # 1 child * $0 = $0 - # Income cap: 12,000 * 0.07 / 12 = 70 - # Copay: min(0, 70) = $0 - va_ccsp_copay: 0 + # Monthly FPG: 21,640/12 = 1,803.33 + # FPG ratio: 1,000/1,803.33 = 0.5546 -> new scale >0 = $5 + # 1 child * $5 = $5 + # Income cap: 12,000 * 0.05 / 12 = 50 + # Copay: min(5, 50) = $5 + va_ccsp_copay: 5 -- name: Case 11, new scale 2025-07 above 100% FPG. - period: 2025-01 +- name: Case 11, new scale above 100% FPG ($125 bracket). + period: 2026-01 absolute_error_margin: 0.01 input: people: person1: age: 30 - # 2025 FPG size 2 = 21,150 - # Need FPG ratio > 1.0001 - # Income = 24,000 -> monthly 2,000 / 1,762.50 = 1.1347 employment_income: 24_000 immigration_status: CITIZEN person2: @@ -466,16 +468,132 @@ members: [person1, person2] state_code: VA output: - # 2025-01 still uses old scale - # FPG ratio 1.1347 -> old scale >100% = $60 - # 1 child * $60 = $60 - # Income cap: 24,000 * 0.07 / 12 = 140 - # Copay: min(60, 140) = $60 - va_ccsp_copay: 60 + # Monthly income: 24,000/12 = 2,000 + # Monthly FPG: 21,640/12 = 1,803.33 + # FPG ratio: 2,000/1,803.33 = 1.1090 -> new scale >100% = $125 + # 1 child * $125 = $125 + # Income cap: 24,000 * 0.05 / 12 = 100 + # Copay: min(125, 100) = $100 (income cap binds) + va_ccsp_copay: 100 + +- name: Case 12, new scale above 200% FPG ($225 bracket). + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 48_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Monthly income: 48,000/12 = 4,000 + # Monthly FPG: 21,640/12 = 1,803.33 + # FPG ratio: 4,000/1,803.33 = 2.2178 -> new scale >200% = $225 + # 1 child * $225 = $225 + # Income cap: 48,000 * 0.05 / 12 = 200 + # Copay: min(225, 200) = $200 (income cap binds) + va_ccsp_copay: 200 + +- name: Case 13, new scale above 350% FPG ($375 bracket). + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 84_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2] + state_code: VA + output: + # Monthly income: 84,000/12 = 7,000 + # Monthly FPG: 21,640/12 = 1,803.33 + # FPG ratio: 7,000/1,803.33 = 3.8814 -> new scale >350% = $375 + # 1 child * $375 = $375 + # Income cap: 84,000 * 0.05 / 12 = 350 + # Copay: min(375, 350) = $350 (income cap binds) + va_ccsp_copay: 350 + +- name: Case 14, new scale 5% income cap with 3 children. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 84_000 + immigration_status: CITIZEN + person2: + age: 10 + is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 + immigration_status: CITIZEN + person3: + age: 7 + is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 + immigration_status: CITIZEN + person4: + age: 4 + is_tax_unit_dependent: true + childcare_attending_days_per_month: 23 + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + va_ccsp_enrolled: true + va_ccsp_locality_group: GROUP_III + households: + household: + members: [person1, person2, person3, person4] + state_code: VA + output: + # Monthly income: 84,000/12 = 7,000 + # FPG size 4: 15,960 + 5,680*3 = 33,000, monthly = 2,750 + # FPG ratio: 7,000/2,750 = 2.5455 -> new scale >250% = $275 + # 3 eligible children, scale total: $275 * 3 = $825 + # Income cap: 84,000 * 0.05 / 12 = 350 (5% cap) + # Copay: min(825, 350) = $350 + va_ccsp_copay: 350 # === TANF RECIPIENT ZERO COPAY === -- name: Case 12, TANF recipient with high income still pays zero. +- name: Case 15, TANF recipient with high income still pays zero. period: 2024-01 absolute_error_margin: 0.01 input: @@ -512,7 +630,7 @@ # === SINGLE CHILD COPAY === -- name: Case 13, single child copay not inflated by max_children. +- name: Case 16, single child copay not inflated by max_children. period: 2024-01 absolute_error_margin: 0.01 input: