diff --git a/changelog.d/wv-ccap.added.md b/changelog.d/wv-ccap.added.md new file mode 100644 index 00000000000..a971ee4b859 --- /dev/null +++ b/changelog.d/wv-ccap.added.md @@ -0,0 +1 @@ +Implement West Virginia Child Care Assistance Program (CCAP). 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 c3805634a89..e088954f857 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 @@ -18,6 +18,7 @@ values: - sc_child_care_subsidies # South Carolina Child Care Scholarship Program - va_child_care_subsidies # Virginia Child Care Subsidy Program - wa_child_care_subsidies # Washington Working Connections Child Care + - wv_child_care_subsidies # West Virginia Child Care Assistance 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 7292771904c..106adc5f1ef 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -127,6 +127,8 @@ values: - tx_ssi_state_supplement # Virginia benefits - va_child_care_subsidies + # West Virginia benefits + - wv_child_care_subsidies # North Carolina benefits - nc_scca # South Carolina benefits diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/age_group/informal_months.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/age_group/informal_months.yaml new file mode 100644 index 00000000000..a50533c0169 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/age_group/informal_months.yaml @@ -0,0 +1,20 @@ +description: West Virginia defines these informal care age group boundaries in months under the Child Care Assistance Program. +metadata: + type: single_amount + threshold_unit: month + amount_unit: /1 + period: year + label: West Virginia CCAP informal care age group by months + reference: + - title: WV Child Care Subsidy Appendix B — Rate Structure (Oct 1, 2024) + href: https://bfa.wv.gov/media/6831/download?inline#page=1 + +brackets: + - threshold: + 2024-10-01: 0 + amount: + 2024-10-01: 0 + - threshold: + 2024-10-01: 25 + amount: + 2024-10-01: 1 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/age_group/months.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/age_group/months.yaml new file mode 100644 index 00000000000..4acb8a585f2 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/age_group/months.yaml @@ -0,0 +1,28 @@ +description: West Virginia defines these child age group boundaries in months under the Child Care Assistance Program. +metadata: + type: single_amount + threshold_unit: month + amount_unit: /1 + period: year + label: West Virginia CCAP child age group by months + reference: + - title: WV Child Care Subsidy Appendix B — Rate Structure (Oct 1, 2024) + href: https://bfa.wv.gov/media/6831/download?inline#page=1 + +brackets: + - threshold: + 2024-10-01: 0 + amount: + 2024-10-01: 0 + - threshold: + 2024-10-01: 25 + amount: + 2024-10-01: 1 + - threshold: + 2024-10-01: 37 + amount: + 2024-10-01: 2 + - threshold: + 2024-10-01: 60 + amount: + 2024-10-01: 3 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/billing/monthly_rate_max_days.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/billing/monthly_rate_max_days.yaml new file mode 100644 index 00000000000..89e061e463c --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/billing/monthly_rate_max_days.yaml @@ -0,0 +1,11 @@ +description: West Virginia bills child care at the monthly rate when attendance days per month do not exceed this threshold under the Child Care Assistance Program; this value also caps the monthly billed days. +values: + 2024-10-01: 20 + +metadata: + unit: day + period: year + label: West Virginia CCAP monthly rate billing maximum days + reference: + - title: WV Child Care Subsidy Policy & Procedures Manual, Chapter 7, Section 7.2.7.4 — The Monthly Rate + href: https://bfa.wv.gov/media/6766/download?inline#page=80 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/billing/monthly_rate_min_days.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/billing/monthly_rate_min_days.yaml new file mode 100644 index 00000000000..814d3cf0640 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/billing/monthly_rate_min_days.yaml @@ -0,0 +1,11 @@ +description: West Virginia bills child care at the monthly rate when attendance days per month equal or exceed this threshold under the Child Care Assistance Program. +values: + 2024-10-01: 13 + +metadata: + unit: day + period: year + label: West Virginia CCAP monthly rate billing minimum days + reference: + - title: WV Child Care Subsidy Policy & Procedures Manual, Chapter 7, Section 7.2.7.4 — The Monthly Rate + href: https://bfa.wv.gov/media/6766/download?inline#page=80 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/max_billed_children.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/max_billed_children.yaml new file mode 100644 index 00000000000..e9d9371d5c9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/max_billed_children.yaml @@ -0,0 +1,11 @@ +description: West Virginia caps the co-payment at this number of children under the Child Care Assistance Program. +values: + 2024-10-01: 3 + +metadata: + unit: /1 + period: year + label: West Virginia CCAP maximum billed children + reference: + - title: WV Child Care Subsidy Policy & Procedures Manual, Chapter 6, Section 6.4.3 — Family Fees + href: https://bfa.wv.gov/media/6766/download?inline#page=65 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/max_share.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/max_share.yaml new file mode 100644 index 00000000000..8bbd8a29bed --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/max_share.yaml @@ -0,0 +1,11 @@ +description: West Virginia limits the co-payment to this share of gross family income under the Child Care Assistance Program. +values: + 2024-01-01: 0.07 + +metadata: + unit: /1 + period: year + label: West Virginia CCAP maximum co-payment share + reference: + - title: WV CCDF State Plan FFY 2025-2027, Section 3.1.1 — Family Co-payment (7%) + href: https://bfa.wv.gov/media/39915/download?inline#page=39 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_1.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_1.yaml new file mode 100644 index 00000000000..0dd9f342088 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_1.yaml @@ -0,0 +1,76 @@ +description: West Virginia charges this daily co-payment per child for a one-person family under the Child Care Assistance Program. +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + threshold_period: year + label: West Virginia CCAP daily co-payment for one-person family + reference: + - title: WV Child Care Subsidy Appendix A — One Person Family Sliding Fee Scale + href: https://bfa.wv.gov/media/6826/download?inline#page=1 + +brackets: + - threshold: + 2024-10-01: 0 + amount: + 2024-10-01: 0 + - threshold: + 2024-10-01: 0.4001 + amount: + 2024-10-01: 1.5 + - threshold: + 2024-10-01: 0.5001 + amount: + 2024-10-01: 2 + - threshold: + 2024-10-01: 0.6001 + amount: + 2024-10-01: 2.25 + - threshold: + 2024-10-01: 0.7001 + amount: + 2024-10-01: 2.75 + - threshold: + 2024-10-01: 0.8001 + amount: + 2024-10-01: 3 + - threshold: + 2024-10-01: 0.9001 + amount: + 2024-10-01: 3.5 + - threshold: + 2024-10-01: 1.0001 + amount: + 2024-10-01: 3.75 + - threshold: + 2024-10-01: 1.1001 + amount: + 2024-10-01: 4.25 + - threshold: + 2024-10-01: 1.2001 + amount: + 2024-10-01: 4.5 + - threshold: + 2024-10-01: 1.3001 + amount: + 2024-10-01: 5 + - threshold: + 2024-10-01: 1.4001 + amount: + 2024-10-01: 5.25 + - threshold: + 2024-10-01: 1.5001 + amount: + 2024-10-01: 5.75 + - threshold: + 2024-10-01: 1.6001 + amount: + 2024-10-01: 6 + - threshold: + 2024-10-01: 1.7001 + amount: + 2024-10-01: 6.5 + - threshold: + 2024-10-01: 1.8001 + amount: + 2024-10-01: 7 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_10.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_10.yaml new file mode 100644 index 00000000000..4ec1570aa0a --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_10.yaml @@ -0,0 +1,74 @@ +description: West Virginia charges this daily co-payment per child for a ten-person family under the Child Care Assistance Program. +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + threshold_period: year + label: West Virginia CCAP daily co-payment for ten-person family + reference: + - title: WV Child Care Subsidy Appendix A — Ten Person Family Sliding Fee Scale + href: https://bfa.wv.gov/media/6826/download?inline#page=5 + +# Appendix A does not publish a 185% row for ten-person families; the 180% +# value carries forward to the intake cap. +brackets: + - threshold: + 2024-10-01: 0 + amount: + 2024-10-01: 0 + - threshold: + 2024-10-01: 0.4001 + amount: + 2024-10-01: 3 + - threshold: + 2024-10-01: 0.5001 + amount: + 2024-10-01: 3.75 + - threshold: + 2024-10-01: 0.6001 + amount: + 2024-10-01: 4.5 + - threshold: + 2024-10-01: 0.7001 + amount: + 2024-10-01: 5.25 + - threshold: + 2024-10-01: 0.8001 + amount: + 2024-10-01: 6.25 + - threshold: + 2024-10-01: 0.9001 + amount: + 2024-10-01: 7 + - threshold: + 2024-10-01: 1.0001 + amount: + 2024-10-01: 7.75 + - threshold: + 2024-10-01: 1.1001 + amount: + 2024-10-01: 8.5 + - threshold: + 2024-10-01: 1.2001 + amount: + 2024-10-01: 9.25 + - threshold: + 2024-10-01: 1.3001 + amount: + 2024-10-01: 10 + - threshold: + 2024-10-01: 1.4001 + amount: + 2024-10-01: 10.75 + - threshold: + 2024-10-01: 1.5001 + amount: + 2024-10-01: 11.5 + - threshold: + 2024-10-01: 1.6001 + amount: + 2024-10-01: 12.25 + - threshold: + 2024-10-01: 1.7001 + amount: + 2024-10-01: 13 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_11.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_11.yaml new file mode 100644 index 00000000000..610e820c89f --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_11.yaml @@ -0,0 +1,71 @@ +description: West Virginia charges this daily co-payment per child for an eleven-person (or larger) family under the Child Care Assistance Program. +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + threshold_period: year + label: West Virginia CCAP daily co-payment for eleven-person family + reference: + - title: WV Child Care Subsidy Appendix A — Eleven Person Family Sliding Fee Scale + href: https://bfa.wv.gov/media/6826/download?inline#page=6 + +# Appendix A publishes brackets through 165% FPL for eleven-person families; +# the 165% value carries forward to the intake cap. The 170%, 180%, and 185% +# rows are blank in the published table. +brackets: + - threshold: + 2024-10-01: 0 + amount: + 2024-10-01: 0 + - threshold: + 2024-10-01: 0.4001 + amount: + 2024-10-01: 2.25 + - threshold: + 2024-10-01: 0.5001 + amount: + 2024-10-01: 2.75 + - threshold: + 2024-10-01: 0.6001 + amount: + 2024-10-01: 3.5 + - threshold: + 2024-10-01: 0.7001 + amount: + 2024-10-01: 4 + - threshold: + 2024-10-01: 0.8001 + amount: + 2024-10-01: 4.5 + - threshold: + 2024-10-01: 0.9001 + amount: + 2024-10-01: 5.25 + - threshold: + 2024-10-01: 1.0001 + amount: + 2024-10-01: 5.75 + - threshold: + 2024-10-01: 1.1001 + amount: + 2024-10-01: 6.25 + - threshold: + 2024-10-01: 1.2001 + amount: + 2024-10-01: 7 + - threshold: + 2024-10-01: 1.3001 + amount: + 2024-10-01: 7.5 + - threshold: + 2024-10-01: 1.4001 + amount: + 2024-10-01: 8 + - threshold: + 2024-10-01: 1.5001 + amount: + 2024-10-01: 8.5 + - threshold: + 2024-10-01: 1.6001 + amount: + 2024-10-01: 9.25 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_2.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_2.yaml new file mode 100644 index 00000000000..c8a66cb363b --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_2.yaml @@ -0,0 +1,76 @@ +description: West Virginia charges this daily co-payment per child for a two-person family under the Child Care Assistance Program. +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + threshold_period: year + label: West Virginia CCAP daily co-payment for two-person family + reference: + - title: WV Child Care Subsidy Appendix A — Two Person Family Sliding Fee Scale + href: https://bfa.wv.gov/media/6826/download?inline#page=1 + +brackets: + - threshold: + 2024-10-01: 0 + amount: + 2024-10-01: 0 + - threshold: + 2024-10-01: 0.4001 + amount: + 2024-10-01: 2 + - threshold: + 2024-10-01: 0.5001 + amount: + 2024-10-01: 2.5 + - threshold: + 2024-10-01: 0.6001 + amount: + 2024-10-01: 3 + - threshold: + 2024-10-01: 0.7001 + amount: + 2024-10-01: 3.75 + - threshold: + 2024-10-01: 0.8001 + amount: + 2024-10-01: 4.25 + - threshold: + 2024-10-01: 0.9001 + amount: + 2024-10-01: 4.75 + - threshold: + 2024-10-01: 1.0001 + amount: + 2024-10-01: 5.25 + - threshold: + 2024-10-01: 1.1001 + amount: + 2024-10-01: 5.75 + - threshold: + 2024-10-01: 1.2001 + amount: + 2024-10-01: 6.25 + - threshold: + 2024-10-01: 1.3001 + amount: + 2024-10-01: 6.75 + - threshold: + 2024-10-01: 1.4001 + amount: + 2024-10-01: 7.25 + - threshold: + 2024-10-01: 1.5001 + amount: + 2024-10-01: 7.75 + - threshold: + 2024-10-01: 1.6001 + amount: + 2024-10-01: 8.25 + - threshold: + 2024-10-01: 1.7001 + amount: + 2024-10-01: 8.75 + - threshold: + 2024-10-01: 1.8001 + amount: + 2024-10-01: 9.25 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_3.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_3.yaml new file mode 100644 index 00000000000..24d79d3dea9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_3.yaml @@ -0,0 +1,76 @@ +description: West Virginia charges this daily co-payment per child for a three-person family under the Child Care Assistance Program. +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + threshold_period: year + label: West Virginia CCAP daily co-payment for three-person family + reference: + - title: WV Child Care Subsidy Appendix A — Three Person Family Sliding Fee Scale + href: https://bfa.wv.gov/media/6826/download?inline#page=2 + +brackets: + - threshold: + 2024-10-01: 0 + amount: + 2024-10-01: 0 + - threshold: + 2024-10-01: 0.4001 + amount: + 2024-10-01: 1.25 + - threshold: + 2024-10-01: 0.5001 + amount: + 2024-10-01: 1.75 + - threshold: + 2024-10-01: 0.6001 + amount: + 2024-10-01: 2 + - threshold: + 2024-10-01: 0.7001 + amount: + 2024-10-01: 2.25 + - threshold: + 2024-10-01: 0.8001 + amount: + 2024-10-01: 2.5 + - threshold: + 2024-10-01: 0.9001 + amount: + 2024-10-01: 3 + - threshold: + 2024-10-01: 1.0001 + amount: + 2024-10-01: 3.25 + - threshold: + 2024-10-01: 1.1001 + amount: + 2024-10-01: 3.5 + - threshold: + 2024-10-01: 1.2001 + amount: + 2024-10-01: 4 + - threshold: + 2024-10-01: 1.3001 + amount: + 2024-10-01: 4.25 + - threshold: + 2024-10-01: 1.4001 + amount: + 2024-10-01: 4.5 + - threshold: + 2024-10-01: 1.5001 + amount: + 2024-10-01: 5 + - threshold: + 2024-10-01: 1.6001 + amount: + 2024-10-01: 5.25 + - threshold: + 2024-10-01: 1.7001 + amount: + 2024-10-01: 5.5 + - threshold: + 2024-10-01: 1.8001 + amount: + 2024-10-01: 6 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_4.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_4.yaml new file mode 100644 index 00000000000..c39c4a3bf2b --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_4.yaml @@ -0,0 +1,76 @@ +description: West Virginia charges this daily co-payment per child for a four-person family under the Child Care Assistance Program. +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + threshold_period: year + label: West Virginia CCAP daily co-payment for four-person family + reference: + - title: WV Child Care Subsidy Appendix A — Four Person Family Sliding Fee Scale + href: https://bfa.wv.gov/media/6826/download?inline#page=2 + +brackets: + - threshold: + 2024-10-01: 0 + amount: + 2024-10-01: 0 + - threshold: + 2024-10-01: 0.4001 + amount: + 2024-10-01: 1 + - threshold: + 2024-10-01: 0.5001 + amount: + 2024-10-01: 1.25 + - threshold: + 2024-10-01: 0.6001 + amount: + 2024-10-01: 1.5 + - threshold: + 2024-10-01: 0.7001 + amount: + 2024-10-01: 1.75 + - threshold: + 2024-10-01: 0.8001 + amount: + 2024-10-01: 2 + - threshold: + 2024-10-01: 0.9001 + amount: + 2024-10-01: 2.25 + - threshold: + 2024-10-01: 1.0001 + amount: + 2024-10-01: 2.5 + - threshold: + 2024-10-01: 1.1001 + amount: + 2024-10-01: 2.75 + - threshold: + 2024-10-01: 1.2001 + amount: + 2024-10-01: 3 + - threshold: + 2024-10-01: 1.3001 + amount: + 2024-10-01: 3.5 + - threshold: + 2024-10-01: 1.4001 + amount: + 2024-10-01: 3.75 + - threshold: + 2024-10-01: 1.5001 + amount: + 2024-10-01: 4 + - threshold: + 2024-10-01: 1.6001 + amount: + 2024-10-01: 4.25 + - threshold: + 2024-10-01: 1.7001 + amount: + 2024-10-01: 4.5 + - threshold: + 2024-10-01: 1.8001 + amount: + 2024-10-01: 4.75 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_5.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_5.yaml new file mode 100644 index 00000000000..c189b8b0b37 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_5.yaml @@ -0,0 +1,76 @@ +description: West Virginia charges this daily co-payment per child for a five-person family under the Child Care Assistance Program. +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + threshold_period: year + label: West Virginia CCAP daily co-payment for five-person family + reference: + - title: WV Child Care Subsidy Appendix A — Five Person Family Sliding Fee Scale + href: https://bfa.wv.gov/media/6826/download?inline#page=3 + +brackets: + - threshold: + 2024-10-01: 0 + amount: + 2024-10-01: 0 + - threshold: + 2024-10-01: 0.4001 + amount: + 2024-10-01: 1.25 + - threshold: + 2024-10-01: 0.5001 + amount: + 2024-10-01: 1.5 + - threshold: + 2024-10-01: 0.6001 + amount: + 2024-10-01: 1.75 + - threshold: + 2024-10-01: 0.7001 + amount: + 2024-10-01: 2.25 + - threshold: + 2024-10-01: 0.8001 + amount: + 2024-10-01: 2.5 + - threshold: + 2024-10-01: 0.9001 + amount: + 2024-10-01: 2.75 + - threshold: + 2024-10-01: 1.0001 + amount: + 2024-10-01: 3 + - threshold: + 2024-10-01: 1.1001 + amount: + 2024-10-01: 3.25 + - threshold: + 2024-10-01: 1.2001 + amount: + 2024-10-01: 3.75 + - threshold: + 2024-10-01: 1.3001 + amount: + 2024-10-01: 4 + - threshold: + 2024-10-01: 1.4001 + amount: + 2024-10-01: 4.25 + - threshold: + 2024-10-01: 1.5001 + amount: + 2024-10-01: 4.5 + - threshold: + 2024-10-01: 1.6001 + amount: + 2024-10-01: 5 + - threshold: + 2024-10-01: 1.7001 + amount: + 2024-10-01: 5.25 + - threshold: + 2024-10-01: 1.8001 + amount: + 2024-10-01: 5.5 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_6.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_6.yaml new file mode 100644 index 00000000000..9dc7f110148 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_6.yaml @@ -0,0 +1,76 @@ +description: West Virginia charges this daily co-payment per child for a six-person family under the Child Care Assistance Program. +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + threshold_period: year + label: West Virginia CCAP daily co-payment for six-person family + reference: + - title: WV Child Care Subsidy Appendix A — Six Person Family Sliding Fee Scale + href: https://bfa.wv.gov/media/6826/download?inline#page=3 + +brackets: + - threshold: + 2024-10-01: 0 + amount: + 2024-10-01: 0 + - threshold: + 2024-10-01: 0.4001 + amount: + 2024-10-01: 1.5 + - threshold: + 2024-10-01: 0.5001 + amount: + 2024-10-01: 1.75 + - threshold: + 2024-10-01: 0.6001 + amount: + 2024-10-01: 2 + - threshold: + 2024-10-01: 0.7001 + amount: + 2024-10-01: 2.5 + - threshold: + 2024-10-01: 0.8001 + amount: + 2024-10-01: 2.75 + - threshold: + 2024-10-01: 0.9001 + amount: + 2024-10-01: 3.25 + - threshold: + 2024-10-01: 1.0001 + amount: + 2024-10-01: 3.5 + - threshold: + 2024-10-01: 1.1001 + amount: + 2024-10-01: 3.75 + - threshold: + 2024-10-01: 1.2001 + amount: + 2024-10-01: 4.25 + - threshold: + 2024-10-01: 1.3001 + amount: + 2024-10-01: 4.5 + - threshold: + 2024-10-01: 1.4001 + amount: + 2024-10-01: 5 + - threshold: + 2024-10-01: 1.5001 + amount: + 2024-10-01: 5.25 + - threshold: + 2024-10-01: 1.6001 + amount: + 2024-10-01: 5.5 + - threshold: + 2024-10-01: 1.7001 + amount: + 2024-10-01: 6 + - threshold: + 2024-10-01: 1.8001 + amount: + 2024-10-01: 6.25 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_7.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_7.yaml new file mode 100644 index 00000000000..9f9050ccaa1 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_7.yaml @@ -0,0 +1,76 @@ +description: West Virginia charges this daily co-payment per child for a seven-person family under the Child Care Assistance Program. +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + threshold_period: year + label: West Virginia CCAP daily co-payment for seven-person family + reference: + - title: WV Child Care Subsidy Appendix A — Seven Person Family Sliding Fee Scale + href: https://bfa.wv.gov/media/6826/download?inline#page=4 + +brackets: + - threshold: + 2024-10-01: 0 + amount: + 2024-10-01: 0 + - threshold: + 2024-10-01: 0.4001 + amount: + 2024-10-01: 2.25 + - threshold: + 2024-10-01: 0.5001 + amount: + 2024-10-01: 2.75 + - threshold: + 2024-10-01: 0.6001 + amount: + 2024-10-01: 3.5 + - threshold: + 2024-10-01: 0.7001 + amount: + 2024-10-01: 4 + - threshold: + 2024-10-01: 0.8001 + amount: + 2024-10-01: 4.5 + - threshold: + 2024-10-01: 0.9001 + amount: + 2024-10-01: 5.25 + - threshold: + 2024-10-01: 1.0001 + amount: + 2024-10-01: 5.75 + - threshold: + 2024-10-01: 1.1001 + amount: + 2024-10-01: 6.25 + - threshold: + 2024-10-01: 1.2001 + amount: + 2024-10-01: 6.75 + - threshold: + 2024-10-01: 1.3001 + amount: + 2024-10-01: 7.5 + - threshold: + 2024-10-01: 1.4001 + amount: + 2024-10-01: 8 + - threshold: + 2024-10-01: 1.5001 + amount: + 2024-10-01: 8.5 + - threshold: + 2024-10-01: 1.6001 + amount: + 2024-10-01: 9.25 + - threshold: + 2024-10-01: 1.7001 + amount: + 2024-10-01: 9.75 + - threshold: + 2024-10-01: 1.8001 + amount: + 2024-10-01: 10.25 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_8.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_8.yaml new file mode 100644 index 00000000000..eed0ba47e75 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_8.yaml @@ -0,0 +1,76 @@ +description: West Virginia charges this daily co-payment per child for an eight-person family under the Child Care Assistance Program. +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + threshold_period: year + label: West Virginia CCAP daily co-payment for eight-person family + reference: + - title: WV Child Care Subsidy Appendix A — Eight Person Family Sliding Fee Scale + href: https://bfa.wv.gov/media/6826/download?inline#page=4 + +brackets: + - threshold: + 2024-10-01: 0 + amount: + 2024-10-01: 0 + - threshold: + 2024-10-01: 0.4001 + amount: + 2024-10-01: 2.5 + - threshold: + 2024-10-01: 0.5001 + amount: + 2024-10-01: 3.25 + - threshold: + 2024-10-01: 0.6001 + amount: + 2024-10-01: 3.75 + - threshold: + 2024-10-01: 0.7001 + amount: + 2024-10-01: 4.5 + - threshold: + 2024-10-01: 0.8001 + amount: + 2024-10-01: 5 + - threshold: + 2024-10-01: 0.9001 + amount: + 2024-10-01: 5.75 + - threshold: + 2024-10-01: 1.0001 + amount: + 2024-10-01: 6.25 + - threshold: + 2024-10-01: 1.1001 + amount: + 2024-10-01: 7 + - threshold: + 2024-10-01: 1.2001 + amount: + 2024-10-01: 7.75 + - threshold: + 2024-10-01: 1.3001 + amount: + 2024-10-01: 8.25 + - threshold: + 2024-10-01: 1.4001 + amount: + 2024-10-01: 9 + - threshold: + 2024-10-01: 1.5001 + amount: + 2024-10-01: 9.5 + - threshold: + 2024-10-01: 1.6001 + amount: + 2024-10-01: 10.25 + - threshold: + 2024-10-01: 1.7001 + amount: + 2024-10-01: 10.75 + - threshold: + 2024-10-01: 1.8001 + amount: + 2024-10-01: 11.5 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_9.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_9.yaml new file mode 100644 index 00000000000..4c456873a13 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/copayment/rate/size_9.yaml @@ -0,0 +1,76 @@ +description: West Virginia charges this daily co-payment per child for a nine-person family under the Child Care Assistance Program. +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + threshold_period: year + label: West Virginia CCAP daily co-payment for nine-person family + reference: + - title: WV Child Care Subsidy Appendix A — Nine Person Family Sliding Fee Scale + href: https://bfa.wv.gov/media/6826/download?inline#page=5 + +brackets: + - threshold: + 2024-10-01: 0 + amount: + 2024-10-01: 0 + - threshold: + 2024-10-01: 0.4001 + amount: + 2024-10-01: 2.75 + - threshold: + 2024-10-01: 0.5001 + amount: + 2024-10-01: 3.5 + - threshold: + 2024-10-01: 0.6001 + amount: + 2024-10-01: 4.25 + - threshold: + 2024-10-01: 0.7001 + amount: + 2024-10-01: 5 + - threshold: + 2024-10-01: 0.8001 + amount: + 2024-10-01: 5.5 + - threshold: + 2024-10-01: 0.9001 + amount: + 2024-10-01: 6.25 + - threshold: + 2024-10-01: 1.0001 + amount: + 2024-10-01: 7 + - threshold: + 2024-10-01: 1.1001 + amount: + 2024-10-01: 7.75 + - threshold: + 2024-10-01: 1.2001 + amount: + 2024-10-01: 8.5 + - threshold: + 2024-10-01: 1.3001 + amount: + 2024-10-01: 9 + - threshold: + 2024-10-01: 1.4001 + amount: + 2024-10-01: 9.75 + - threshold: + 2024-10-01: 1.5001 + amount: + 2024-10-01: 10.5 + - threshold: + 2024-10-01: 1.6001 + amount: + 2024-10-01: 11.25 + - threshold: + 2024-10-01: 1.7001 + amount: + 2024-10-01: 12 + - threshold: + 2024-10-01: 1.8001 + amount: + 2024-10-01: 12.5 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/eligibility/activity_hours.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/eligibility/activity_hours.yaml new file mode 100644 index 00000000000..ffe50476e7e --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/eligibility/activity_hours.yaml @@ -0,0 +1,11 @@ +description: West Virginia sets this minimum weekly activity hours for parent eligibility under the Child Care Assistance Program. +values: + 2024-01-01: 20 + +metadata: + unit: hour + period: year + label: West Virginia CCAP minimum weekly activity hours + reference: + - title: WV Child Care Subsidy Policy & Procedures Manual, Chapter 3, Section 3.6.1 — Working Recipients + href: https://bfa.wv.gov/media/6766/download?inline#page=33 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/eligibility/child_age_limit.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/eligibility/child_age_limit.yaml new file mode 100644 index 00000000000..2cc703d23bc --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/eligibility/child_age_limit.yaml @@ -0,0 +1,13 @@ +description: West Virginia limits child eligibility to under this age under the Child Care Assistance Program. +values: + 2024-01-01: 13 + +metadata: + unit: year + period: year + label: West Virginia CCAP child age limit + reference: + - title: WV Child Care Subsidy Policy & Procedures Manual, Chapter 3, Section 3.1 — Child Age Requirement + href: https://bfa.wv.gov/media/6766/download?inline#page=25 + - title: WV CCDF State Plan FFY 2025-2027, Section 2.2 + href: https://bfa.wv.gov/media/39915/download?inline#page=16 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/eligibility/special_needs_child_age_limit.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/eligibility/special_needs_child_age_limit.yaml new file mode 100644 index 00000000000..64328a283b2 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/eligibility/special_needs_child_age_limit.yaml @@ -0,0 +1,13 @@ +description: West Virginia limits special needs child eligibility to under this age under the Child Care Assistance Program. +values: + 2024-01-01: 18 + +metadata: + unit: year + period: year + label: West Virginia CCAP special needs child age limit + reference: + - title: WV Child Care Subsidy Policy & Procedures Manual, Chapter 3, Section 3.1.2.2 — Special Needs Children + href: https://bfa.wv.gov/media/6766/download?inline#page=25 + - title: WV CCDF State Plan FFY 2025-2027, Section 2.2 + href: https://bfa.wv.gov/media/39915/download?inline#page=16 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/income/countable_income/sources.yaml new file mode 100644 index 00000000000..9bccce64e85 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/income/countable_income/sources.yaml @@ -0,0 +1,49 @@ +description: West Virginia counts these income sources under the Child Care Assistance Program. +values: + 2024-01-01: + - employment_income + - self_employment_income + - farm_operations_income + - social_security + - ssi + - unemployment_compensation + - workers_compensation + - pension_income + - alimony_income + - child_support_received + - dividend_income + - interest_income + - rental_income + - veterans_benefits + # PolicyEngine records military retirement separately from pension_income, + # so include it under Manual Sec. 5.2.4.4 pensions and annuities. + - military_retirement_pay + # TANF is countable per Manual Sec 5.2.4.3 but excluded here to avoid + # a circular dependency: + # wv_ccap_countable_income -> tanf -> wv_works + # -> wv_works_countable_earned_income (deducts childcare_expenses) + # -> childcare_expenses -> wv_ccap -> wv_ccap_income_eligible + # -> wv_ccap_countable_income + # The is_tanf_enrolled bypass in wv_ccap_income_eligible already + # makes TANF-active families categorically income-eligible. + # - tanf # would belong here + # + # Provisions we don't model at the moment: + # - §5.2.5.11 child-earnings exclusion (under-18 earnings of non-head/spouse) + # — we don't filter income sources by age of earner. + # - §5.2.4.3 sub-categories beyond TANF/SSI: Relative Caretaker Pay, WV + # Employment Assistance Program, WV Works Post-Employment Supplements + # — these don't have PolicyEngine variables at the moment. + # - §5.2.4.10 vocational-rehabilitation payments and §5.2.4.13 DoD + # Transitional Compensation (parent-directed portion) — no corresponding + # PolicyEngine variables at the moment. + # - §5.2.4.11 catch-all "any other monies received on a regular basis" + # — open-ended residual category we can't enumerate exhaustively. + +metadata: + unit: list + period: year + label: West Virginia CCAP countable income sources + reference: + - title: WV Child Care Subsidy Policy & Procedures Manual, Chapter 5, Sections 5.2.1-5.2.4 — Countable Income + href: https://bfa.wv.gov/media/6766/download?inline#page=51 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/income/fpl_limit.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/income/fpl_limit.yaml new file mode 100644 index 00000000000..d3e7bffb328 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/income/fpl_limit.yaml @@ -0,0 +1,13 @@ +description: West Virginia limits income to this share of the federal poverty guideline under the Child Care Assistance Program. +values: + 2024-10-01: 1.85 + +metadata: + unit: /1 + period: year + label: West Virginia CCAP income limit as share of federal poverty guideline + reference: + - title: WV Child Care Subsidy Policy & Procedures Manual, Chapter 3, Section 3.2.1 — Eligibility Guidelines + href: https://bfa.wv.gov/media/6766/download?inline#page=25 + - title: WV Child Care Subsidy Appendix A — Sliding Fee Scale (Oct 1, 2024) + href: https://bfa.wv.gov/media/6826/download?inline#page=1 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/rates/center.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/rates/center.yaml new file mode 100644 index 00000000000..a8b6e3ed954 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/rates/center.yaml @@ -0,0 +1,39 @@ +description: West Virginia provides these daily reimbursement rates for child care centers under the Child Care Assistance Program. +metadata: + period: day + unit: currency-USD + label: West Virginia CCAP child care center daily rates + breakdown: + - wv_ccap_quality_tier + - wv_ccap_child_age_category + reference: + - title: WV Child Care Subsidy Appendix B — Rate Structure (Oct 1, 2024) + href: https://bfa.wv.gov/media/6831/download?inline#page=1 + +TIER_I: + INFANT: + 2024-10-01: 39 + TODDLER: + 2024-10-01: 37 + PRESCHOOL: + 2024-10-01: 35 + SCHOOL_AGE: + 2024-10-01: 32 +TIER_II: + INFANT: + 2024-10-01: 42 + TODDLER: + 2024-10-01: 40 + PRESCHOOL: + 2024-10-01: 38 + SCHOOL_AGE: + 2024-10-01: 35 +TIER_III: + INFANT: + 2024-10-01: 45 + TODDLER: + 2024-10-01: 43 + PRESCHOOL: + 2024-10-01: 41 + SCHOOL_AGE: + 2024-10-01: 39 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/rates/family_facility.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/rates/family_facility.yaml new file mode 100644 index 00000000000..3c714ef3e0f --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/rates/family_facility.yaml @@ -0,0 +1,39 @@ +description: West Virginia provides these daily reimbursement rates for family child care facilities under the Child Care Assistance Program. +metadata: + period: day + unit: currency-USD + label: West Virginia CCAP family child care facility daily rates + breakdown: + - wv_ccap_quality_tier + - wv_ccap_child_age_category + reference: + - title: WV Child Care Subsidy Appendix B — Rate Structure (Oct 1, 2024) + href: https://bfa.wv.gov/media/6831/download?inline#page=1 + +TIER_I: + INFANT: + 2024-10-01: 35 + TODDLER: + 2024-10-01: 33 + PRESCHOOL: + 2024-10-01: 33 + SCHOOL_AGE: + 2024-10-01: 32 +TIER_II: + INFANT: + 2024-10-01: 38 + TODDLER: + 2024-10-01: 36 + PRESCHOOL: + 2024-10-01: 36 + SCHOOL_AGE: + 2024-10-01: 35 +TIER_III: + INFANT: + 2024-10-01: 41 + TODDLER: + 2024-10-01: 39 + PRESCHOOL: + 2024-10-01: 39 + SCHOOL_AGE: + 2024-10-01: 38 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/rates/family_home.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/rates/family_home.yaml new file mode 100644 index 00000000000..fcf74de6b48 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/rates/family_home.yaml @@ -0,0 +1,39 @@ +description: West Virginia provides these daily reimbursement rates for family child care homes under the Child Care Assistance Program. +metadata: + period: day + unit: currency-USD + label: West Virginia CCAP family child care home daily rates + breakdown: + - wv_ccap_quality_tier + - wv_ccap_child_age_category + reference: + - title: WV Child Care Subsidy Appendix B — Rate Structure (Oct 1, 2024) + href: https://bfa.wv.gov/media/6831/download?inline#page=1 + +TIER_I: + INFANT: + 2024-10-01: 30 + TODDLER: + 2024-10-01: 30 + PRESCHOOL: + 2024-10-01: 29 + SCHOOL_AGE: + 2024-10-01: 26 +TIER_II: + INFANT: + 2024-10-01: 33 + TODDLER: + 2024-10-01: 33 + PRESCHOOL: + 2024-10-01: 32 + SCHOOL_AGE: + 2024-10-01: 29 +TIER_III: + INFANT: + 2024-10-01: 36 + TODDLER: + 2024-10-01: 36 + PRESCHOOL: + 2024-10-01: 35 + SCHOOL_AGE: + 2024-10-01: 32 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/rates/informal_relative.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/rates/informal_relative.yaml new file mode 100644 index 00000000000..f4ef47e7f26 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/rates/informal_relative.yaml @@ -0,0 +1,15 @@ +description: West Virginia provides these daily reimbursement rates for informal or relative care under the Child Care Assistance Program. +metadata: + period: day + unit: currency-USD + label: West Virginia CCAP informal relative care daily rates + breakdown: + - wv_ccap_informal_age_group + reference: + - title: WV Child Care Subsidy Appendix B — Rate Structure (Oct 1, 2024) + href: https://bfa.wv.gov/media/6831/download?inline#page=1 + +UNDER_2: + 2024-10-01: 7.5 +AGE_2_AND_OVER: + 2024-10-01: 6 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/rates/out_of_school_time.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/rates/out_of_school_time.yaml new file mode 100644 index 00000000000..58ee26abb9a --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/rates/out_of_school_time.yaml @@ -0,0 +1,11 @@ +description: West Virginia provides this daily reimbursement rate for out of school time programs under the Child Care Assistance Program. +values: + 2024-10-01: 14.5 + +metadata: + period: day + unit: currency-USD + label: West Virginia CCAP out of school time daily rate + reference: + - title: WV Child Care Subsidy Appendix B — Rate Structure (Oct 1, 2024) + href: https://bfa.wv.gov/media/6831/download?inline#page=1 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/supplements/non_traditional_hours.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/supplements/non_traditional_hours.yaml new file mode 100644 index 00000000000..cac020199d3 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/supplements/non_traditional_hours.yaml @@ -0,0 +1,11 @@ +description: West Virginia provides this daily supplement for non-traditional hours care under the Child Care Assistance Program. +values: + 2024-10-01: 6 + +metadata: + period: day + unit: currency-USD + label: West Virginia CCAP non-traditional hours supplement + reference: + - title: WV Child Care Subsidy Appendix B — Rate Structure (Oct 1, 2024) + href: https://bfa.wv.gov/media/6831/download?inline#page=1 diff --git a/policyengine_us/parameters/gov/states/wv/dhhr/ccap/supplements/special_needs.yaml b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/supplements/special_needs.yaml new file mode 100644 index 00000000000..7fd7e8a8d8d --- /dev/null +++ b/policyengine_us/parameters/gov/states/wv/dhhr/ccap/supplements/special_needs.yaml @@ -0,0 +1,11 @@ +description: West Virginia provides this daily supplement for children with special needs under the Child Care Assistance Program. +values: + 2024-10-01: 3 + +metadata: + period: day + unit: currency-USD + label: West Virginia CCAP special needs supplement + reference: + - title: WV Child Care Subsidy Appendix B — Rate Structure (Oct 1, 2024) + href: https://bfa.wv.gov/media/6831/download?inline#page=1 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 444b3faa837..22423b096a6 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -567,9 +567,11 @@ programs: full_name: Washington Working Connections Child Care variable: wa_wccc - state: WV - status: in_progress + status: complete name: West Virginia CCAP full_name: West Virginia Child Care Assistance Program + variable: wv_ccap + parameter_prefix: gov.states.wv.dhhr.ccap - id: head_start name: Head Start diff --git a/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/edge_cases.yaml b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/edge_cases.yaml new file mode 100644 index 00000000000..a68fde6ee7e --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/edge_cases.yaml @@ -0,0 +1,1745 @@ +# WV CCAP Edge Case Tests +# Income test: 185% FPL initial intake cap (Manual §3.2.1, Appendix A). +# 2025 FPG (Contiguous US): first_person = 15_650, additional = 5_500. +# Family of 2 FPG = 21_150/yr = 1_762.50/mo; family of 3 = 26_650/yr. +# 185% FPL family of 2 = 21_150 * 1.85 = 39_127.50/yr +# 185% FPL family of 3 = 26_650 * 1.85 = 49_302.50/yr +# 185% FPL family of 11 = 70_650 * 1.85 = 130_702.50/yr + +# ============================================================ +# Income threshold boundaries (185% FPL) +# ============================================================ + +- name: Case 1, income well below 185% FPL eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + immigration_status: CITIZEN + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + childcare_attending_days_per_month: 22 + pre_subsidy_childcare_expenses: 10_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 10_000 + households: + household: + members: [person1, person2] + state_code: WV + output: + # $24,000/yr is well below 185% FPL family of 2 ($39,127.50/yr) → eligible. + wv_ccap_income_eligible: true + +- name: Case 2, income just below 185% FPL eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + # 185% FPL family of 2 = $39,127.50/yr + employment_income: 39_000 + immigration_status: CITIZEN + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + childcare_attending_days_per_month: 22 + pre_subsidy_childcare_expenses: 10_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 10_000 + households: + household: + members: [person1, person2] + state_code: WV + output: + # $39,000/yr ≤ $39,127.50 → eligible (just below boundary). + wv_ccap_income_eligible: true + +- name: Case 3, income just above 185% FPL ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + # Just above 185% FPL family of 2 ($39,127.50/yr) + employment_income: 39_200 + immigration_status: CITIZEN + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + childcare_attending_days_per_month: 22 + pre_subsidy_childcare_expenses: 10_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 10_000 + households: + household: + members: [person1, person2] + state_code: WV + output: + # $39,200/yr > $39,127.50 → ineligible (just above boundary). + wv_ccap_income_eligible: false + +# ============================================================ +# Family of 3 boundaries +# ============================================================ + +- name: Case 4, family of 3 income below 185% FPL eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + # 185% FPL family of 3 = $49,302.50/yr + employment_income: 48_000 + immigration_status: CITIZEN + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person3: + age: 5 + is_tax_unit_dependent: 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: WV + output: + # $48,000/yr ≤ $49,302.50 → eligible. + wv_ccap_income_eligible: true + +- name: Case 5, income well above 185% FPL ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 60_000 + immigration_status: CITIZEN + person2: + age: 3 + 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: WV + output: + # $60,000/yr > $39,127.50 → ineligible. + wv_ccap_income_eligible: false + +- name: Case 6, family of 3 income above 185% FPL ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + # Just above 185% FPL family of 3 ($49,302.50/yr) + employment_income: 50_000 + immigration_status: CITIZEN + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person3: + age: 5 + is_tax_unit_dependent: 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: WV + output: + # $50,000/yr > $49,302.50 → ineligible. + wv_ccap_income_eligible: false + +# ============================================================ +# Large family income boundaries +# ============================================================ + +- name: Case 7, large family income above 185% FPL ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + # 185% FPL family of 11 = $130,702.50/yr + employment_income: 131_000 + immigration_status: CITIZEN + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person3: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person4: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person5: + age: 9 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person6: + age: 11 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person7: + age: 32 + immigration_status: CITIZEN + person8: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person9: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person10: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person11: + age: 6 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11] + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11] + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11] + state_code: WV + output: + # $131,000/yr > $130,702.50 → ineligible. + wv_ccap_income_eligible: false + +- name: Case 8, large family income below 185% FPL eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + # Below 185% FPL family of 11 ($130,702.50/yr) + employment_income: 100_000 + immigration_status: CITIZEN + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person3: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person4: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person5: + age: 9 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person6: + age: 11 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person7: + age: 32 + immigration_status: CITIZEN + person8: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person9: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person10: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person11: + age: 6 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11] + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11] + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11] + state_code: WV + output: + # $100,000/yr ≤ $130,702.50 → eligible. + wv_ccap_income_eligible: true + +# ============================================================ +# Zero and very high income +# ============================================================ + +- name: Case 9, zero income eligible. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 0 + immigration_status: CITIZEN + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + childcare_attending_days_per_month: 22 + pre_subsidy_childcare_expenses: 5_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 5_000 + households: + household: + members: [person1, person2] + state_code: WV + output: + wv_ccap_income_eligible: true + # FPL ratio = 0 -> below 40% FPL -> $0 copay + wv_ccap_copay: 0 + # Zero income -> zero countable income + wv_ccap_countable_income: 0 + +- name: Case 10, very high income ineligible. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 500_000 + immigration_status: CITIZEN + person2: + age: 3 + 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: WV + output: + wv_ccap_income_eligible: false + wv_ccap: 0 + +# ============================================================ +# Child age boundaries +# ============================================================ + +- name: Case 11, child at exactly age 13 ineligible. + period: 2025-01 + input: + people: + person1: + age: 35 + employment_income: 24_000 + immigration_status: CITIZEN + person2: + # Age 13 -> NOT < 13 -> ineligible (normal child) + 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: WV + output: + wv_ccap_eligible_child: [false, false] + wv_ccap_eligible: false + wv_ccap: 0 + +- name: Case 12, child at age 12.99 eligible. + period: 2025-01 + input: + people: + person1: + age: 35 + employment_income: 24_000 + immigration_status: CITIZEN + person2: + # Age 12.99 -> < 13 -> eligible + age: 12.99 + 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: WV + output: + wv_ccap_eligible_child: [false, true] + +- name: Case 13, special needs child at age 17.99 eligible. + period: 2025-01 + input: + people: + person1: + age: 45 + employment_income: 24_000 + immigration_status: CITIZEN + person2: + # Disabled child age 17.99 -> < 18 -> eligible + age: 17.99 + is_tax_unit_dependent: true + has_developmental_delay: 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: WV + output: + wv_ccap_eligible_child: [false, true] + +- name: Case 14, special needs child at exactly age 18 ineligible. + period: 2025-01 + input: + people: + person1: + age: 45 + employment_income: 24_000 + immigration_status: CITIZEN + person2: + # Disabled child age 18 -> NOT < 18 -> ineligible + age: 18 + is_tax_unit_dependent: true + has_developmental_delay: 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: WV + output: + wv_ccap_eligible_child: [false, false] + wv_ccap_eligible: false + +# ============================================================ +# Family size boundaries +# ============================================================ + +- name: Case 15, family size 1 single parent only no eligible child. + period: 2025-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] + households: + household: + members: [person1] + state_code: WV + output: + # No eligible child -> not eligible + wv_ccap_eligible: false + wv_ccap: 0 + +# ============================================================ +# Copay at 40% FPL boundary (should be $0) +# ============================================================ + +- name: Case 16, income at exactly 40% FPL copay is zero. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + # 40% FPL family of 2 = 21_150 * 0.4 = 8_460/yr + employment_income: 8_460 + immigration_status: CITIZEN + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + childcare_attending_days_per_month: 22 + pre_subsidy_childcare_expenses: 8_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 8_000 + households: + household: + members: [person1, person2] + state_code: WV + output: + # monthly income = 8_460 / 12 = 705 + # FPL ratio = 705 / 1_762.50 = 0.4 + # Threshold for non-zero copay is 0.4001, so 0.4 -> 0% bracket + wv_ccap_copay: 0 + +- name: Case 17, income just above 40% FPL copay is non-zero. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + # Just above 40% FPL: need FPL ratio > 0.4001 + # 21_150 * 0.4001 = 8_462.12/yr; use 8_475 -> ratio ~0.4008 + employment_income: 8_475 + immigration_status: CITIZEN + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + childcare_attending_days_per_month: 22 + pre_subsidy_childcare_expenses: 8_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 8_000 + households: + household: + members: [person1, person2] + state_code: WV + output: + # Monthly income = 8_475 / 12 = $706.25. FPL ratio = 0.4007 > 0.4001 → bracket + # "above 40% up to 50%" → Appendix A 2-person "50%" row daily fee = $2.00/child. + # copay = $2.00 × 22 × 1 = $44. + # 7% cap = $706.25 × 0.07 = $49.44; cap does not bind. + wv_ccap_copay: 44 + +# ============================================================ +# Copay 7% cap behavior +# ============================================================ + +- name: Case 18, high FPL 2-person family copay below 7% cap. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + # ~170% FPL family of 2: 21_150 * 1.7 = 35_955/yr. + employment_income: 35_955 + immigration_status: CITIZEN + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + childcare_attending_days_per_month: 22 + pre_subsidy_childcare_expenses: 10_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 10_000 + households: + household: + members: [person1, person2] + state_code: WV + output: + # Monthly income = $2_996.25. FPL ratio = 1.7000 → bracket "above 160% up to 170%" + # → Appendix A 2-person "170%" row daily fee = $8.25/child. + # uncapped copay = $8.25 × 22 × 1 = $181.50. + # 7% cap = $2_996.25 × 0.07 = $209.74; cap does not bind. + wv_ccap_copay: 181.5 + +- name: Case 19, large family with three children triggers 7 percent cap. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 42_000 + immigration_status: CITIZEN + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + childcare_attending_days_per_month: 22 + pre_subsidy_childcare_expenses: 6_000 + person3: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + childcare_attending_days_per_month: 22 + pre_subsidy_childcare_expenses: 6_000 + person4: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + childcare_attending_days_per_month: 22 + pre_subsidy_childcare_expenses: 6_000 + person5: + age: 15 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person6: + age: 16 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person7: + age: 17 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3, person4, person5, person6, person7] + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7] + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7] + state_code: WV + output: + # 7-person family, monthly income $3_500. FPG family-of-7 = $3_945; ratio = 0.887. + # Appendix A 7-person "90%" row daily fee = $4.50/child. + # 3 eligible children × 22 monthly days = 66 monthly days total. + # uncapped copay = $4.50 × 66 × 1 = $297. + # 7% cap = $3_500 × 0.07 = $245; cap binds. + wv_ccap_copay: 245 + +# ============================================================ +# Activity hours boundary +# ============================================================ + +- name: Case 20, parent at exactly 20 hours per week activity eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 12_000 + immigration_status: CITIZEN + weekly_hours_worked: 20 + person2: + age: 3 + 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: WV + output: + # 20 >= 20 -> meets activity requirement + wv_ccap_activity_eligible: true + +- name: Case 21, parent at 19 hours per week activity ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 12_000 + immigration_status: CITIZEN + weekly_hours_worked: 19 + person2: + age: 3 + 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: WV + output: + # 19 < 20 -> does NOT meet activity requirement + # But person1 is head/spouse, and the formula checks: + # sum(is_head_or_spouse & ~individually_eligible) == 0 + # Person1 is head, not eligible -> sum = 1 != 0 -> false + wv_ccap_activity_eligible: false + +- name: Case 22, full time student bypasses activity hours. + period: 2025-01 + input: + people: + person1: + age: 22 + employment_income: 12_000 + immigration_status: CITIZEN + weekly_hours_worked: 0 + is_full_time_student: true + person2: + age: 3 + 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: WV + output: + # Full time student -> individually_eligible + wv_ccap_activity_eligible: true + +# ============================================================ +# Foster child copay always $0 +# ============================================================ + +- name: Case 23, foster child with income copay is zero. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 30_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + is_in_foster_care: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + childcare_attending_days_per_month: 22 + pre_subsidy_childcare_expenses: 8_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 8_000 + households: + household: + members: [person1, person2] + state_code: WV + output: + # Foster child -> copay = $0 regardless of income + # FPL ratio would be ~1.42 -> normally 3.5% bracket + # But foster child exemption overrides + wv_ccap_copay: 0 + +- name: Case 24, foster child high income copay still zero. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 31_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + is_in_foster_care: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + childcare_attending_days_per_month: 22 + pre_subsidy_childcare_expenses: 8_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 8_000 + households: + household: + members: [person1, person2] + state_code: WV + output: + wv_ccap_copay: 0 + +# ============================================================ +# Empty SPM unit (zero eligible children) +# ============================================================ + +- name: Case 25, adults only no eligible children. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 20_000 + immigration_status: CITIZEN + person2: + age: 28 + employment_income: 15_000 + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + wv_ccap_eligible_child: [false, false] + wv_ccap_eligible: false + wv_ccap: 0 + +# ============================================================ +# All 5 provider types +# ============================================================ + +- name: Case 26, family home provider rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 20_000 + immigration_status: CITIZEN + person2: + age: 3.25 + # 3.25 years = 39 months -> PRESCHOOL (37-59mo) + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: FAMILY_HOME + wv_ccap_quality_tier: TIER_I + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # Family Home Tier I Preschool = $29/day + wv_ccap_daily_rate: [0, 29] + +- name: Case 27, family facility provider rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 20_000 + immigration_status: CITIZEN + person2: + age: 3.25 + # 3.25 years = 39 months -> PRESCHOOL (37-59mo) + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: FAMILY_FACILITY + wv_ccap_quality_tier: TIER_I + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # Family Facility Tier I Preschool = $33/day + wv_ccap_daily_rate: [0, 33] + +- name: Case 28, center provider rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 20_000 + immigration_status: CITIZEN + person2: + age: 3.25 + # 3.25 years = 39 months -> PRESCHOOL (37-59mo) + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # Center Tier I Preschool = $35/day + wv_ccap_daily_rate: [0, 35] + +- name: Case 29, out of school time provider rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 20_000 + immigration_status: CITIZEN + person2: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: OUT_OF_SCHOOL_TIME + wv_ccap_quality_tier: TIER_I + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # Out of School Time = $14.50/day (flat, no tier/age variation) + wv_ccap_daily_rate: [0, 14.5] + +- name: Case 30, informal relative provider rate under 2. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 20_000 + immigration_status: CITIZEN + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: INFORMAL_RELATIVE + wv_ccap_quality_tier: TIER_I + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # Informal/Relative Under 2 = $7.50/day + wv_ccap_daily_rate: [0, 7.5] + +- name: Case 31, informal relative provider rate age 2 and over. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 20_000 + immigration_status: CITIZEN + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: INFORMAL_RELATIVE + wv_ccap_quality_tier: TIER_I + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # Informal/Relative 2+ = $6.00/day + wv_ccap_daily_rate: [0, 6] + +# ============================================================ +# All 3 quality tiers +# ============================================================ + +- name: Case 32, Tier II center rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 20_000 + immigration_status: CITIZEN + person2: + age: 3.25 + # 3.25 years = 39 months -> PRESCHOOL (37-59mo) + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_II + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # Center Tier II Preschool = $38/day + wv_ccap_daily_rate: [0, 38] + +- name: Case 33, Tier III center rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 20_000 + immigration_status: CITIZEN + person2: + age: 3.25 + # 3.25 years = 39 months -> PRESCHOOL (37-59mo) + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_III + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # Center Tier III Preschool = $41/day + wv_ccap_daily_rate: [0, 41] + +# ============================================================ +# All 4 age categories +# ============================================================ + +- name: Case 34, infant age category. + period: 2025-01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + # Age 0.5 = 6 months -> INFANT (0-24 months) + age: 0.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: WV + output: + wv_ccap_child_age_category: [SCHOOL_AGE, INFANT] + +- name: Case 35, toddler age category. + period: 2025-01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + # Age 2.5 = 30 months -> TODDLER (25-36 months) + age: 2.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: WV + output: + wv_ccap_child_age_category: [SCHOOL_AGE, TODDLER] + +- name: Case 36, preschool age category. + period: 2025-01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + # Age 3.25 = 39 months -> PRESCHOOL (37-59 months) + age: 3.25 + 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: WV + output: + wv_ccap_child_age_category: [SCHOOL_AGE, PRESCHOOL] + +- name: Case 37, school age category. + period: 2025-01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + # Age 6 = 72 months -> SCHOOL_AGE (60+ months) + age: 6 + 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: WV + output: + wv_ccap_child_age_category: [SCHOOL_AGE, SCHOOL_AGE] + +# ============================================================ +# TANF categorical eligibility +# ============================================================ + +- name: Case 38, TANF recipient categorically income eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + # Above 185% FPL family of 2 ($39,127.50/yr); TANF enrolled bypasses. + employment_income: 60_000 + immigration_status: CITIZEN + person2: + age: 3 + 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 + households: + household: + members: [person1, person2] + state_code: WV + output: + # TANF enrolled -> categorically income eligible regardless of income + wv_ccap_income_eligible: true + +# ============================================================ +# Non-traditional hours and special needs supplements +# ============================================================ + +- name: Case 39, non-traditional hours supplement adds to daily rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 20_000 + immigration_status: CITIZEN + person2: + age: 3 + # 3 years = 36 months -> TODDLER (25-36mo) + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + wv_ccap_non_traditional_hours: true + childcare_attending_days_per_month: 22 + pre_subsidy_childcare_expenses: 12_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 12_000 + households: + household: + members: [person1, person2] + state_code: WV + output: + # Center Tier I Toddler = $37 + $6 non-trad = $43 + # daily charge = (12_000/12) / 22 = 45.45 + # daily benefit = min(43, 45.45) = 43 + wv_ccap_daily_benefit: [0, 43] + +- name: Case 40, both special needs and non-traditional supplements. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 20_000 + immigration_status: CITIZEN + person2: + age: 8 + is_tax_unit_dependent: true + has_developmental_delay: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + wv_ccap_non_traditional_hours: true + childcare_attending_days_per_month: 22 + pre_subsidy_childcare_expenses: 15_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 15_000 + households: + household: + members: [person1, person2] + state_code: WV + output: + # Center Tier I School Age = $32 + $3 special needs + $6 non-trad = $41 + # daily charge = (15_000/12) / 22 = 56.82 + # daily benefit = min(41, 56.82) = 41 + wv_ccap_daily_benefit: [0, 41] + +# ============================================================ +# Two-parent family both must meet activity requirement +# ============================================================ + +- name: Case 41, two parents both working activity eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 15_000 + immigration_status: CITIZEN + weekly_hours_worked: 25 + person2: + age: 28 + employment_income: 10_000 + immigration_status: CITIZEN + weekly_hours_worked: 20 + 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] + households: + household: + members: [person1, person2, person3] + state_code: WV + output: + # Both parents >= 20 hours -> both individually eligible + wv_ccap_activity_eligible: true + +- name: Case 42, two parents one not meeting hours ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 15_000 + immigration_status: CITIZEN + weekly_hours_worked: 25 + person2: + age: 28 + employment_income: 5_000 + immigration_status: CITIZEN + weekly_hours_worked: 15 + 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] + households: + household: + members: [person1, person2, person3] + state_code: WV + output: + # Person2 only 15 hours < 20 and not a student -> not individually eligible + # sum(is_head_or_spouse & ~individually_eligible) = 1 != 0 -> false + wv_ccap_activity_eligible: false + +# ============================================================ +# Benefit capped at actual expenses +# ============================================================ + +- name: Case 43, benefit capped at pre-subsidy expenses minus copay. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + immigration_status: CITIZEN + person2: + age: 0.5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_III + childcare_attending_days_per_month: 22 + # Low childcare expenses: rate will exceed daily charge + pre_subsidy_childcare_expenses: 3_600 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 3_600 + households: + household: + members: [person1, person2] + state_code: WV + output: + # Center Tier III Infant = $45/day + wv_ccap_daily_rate: [0, 45] + + # daily charge = (3_600/12) / 22 = 13.64 + # daily benefit = min(45, 13.64) = 13.64 + wv_ccap_daily_benefit: [0, 13.64] + + # 2-person family, FPL ratio = 2_000 / 1_762.50 = 1.1348. + # Appendix A 2-person "120%" row daily fee = $5.75/child; 22 days. + # copay = $5.75 × 22 = $126.50. + # 22 days > 20 → per-day billing; per_child = min($45 × 22, $300) = $300. + # benefit = max($300 - $126.50, 0) = $173.50. + wv_ccap: 173.5 + +# ============================================================ +# Zero childcare days/expenses +# ============================================================ + +- name: Case 44, zero childcare days results in zero benefit. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + immigration_status: CITIZEN + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + childcare_attending_days_per_month: 0 + pre_subsidy_childcare_expenses: 0 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 0 + households: + household: + members: [person1, person2] + state_code: WV + output: + wv_ccap: 0 + +# ============================================================ +# Age category boundary: infant/toddler at 13 months +# ============================================================ + +- name: Case 45, child at exactly 12 months is infant. + period: 2025-01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + # Age 1.0 = 12 months -> INFANT (threshold at 25 months for TODDLER) + age: 1.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: WV + output: + # 12 months < 25 threshold -> INFANT + wv_ccap_child_age_category: [SCHOOL_AGE, INFANT] + +- name: Case 46, child at exactly 24 months is infant. + period: 2025-01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + # Age 2.0 = 24 months -> INFANT (threshold for TODDLER at 25 months) + age: 2.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: WV + output: + # 24 months < 25 threshold -> INFANT + wv_ccap_child_age_category: [SCHOOL_AGE, INFANT] + +- name: Case 47, child at 5 years is school age. + period: 2025-01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + # Age 5.0 = 60 months -> SCHOOL_AGE (threshold at 60 months) + age: 5.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: WV + output: + # 60 months >= 60 threshold -> SCHOOL_AGE + wv_ccap_child_age_category: [SCHOOL_AGE, SCHOOL_AGE] + +# ============================================================ +# Informal age group boundaries +# ============================================================ + +- name: Case 48, informal age under 2 group. + period: 2025-01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + # Age 1.5 = 18 months -> UNDER_2 + age: 1.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: WV + output: + # 18 months < 25 -> UNDER_2 + wv_ccap_informal_age_group: [AGE_2_AND_OVER, UNDER_2] + +- name: Case 49, informal age 24 months still in infant band. + period: 2025-01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + # Age 2.0 = 24 months; Appendix B INFANT covers 0-24 months + age: 2.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: WV + output: + # 24 months < 25 -> UNDER_2 (matches Appendix B INFANT 0-24mo at $7.50) + wv_ccap_informal_age_group: [AGE_2_AND_OVER, UNDER_2] + +# ============================================================ +# Multiple children in one family +# ============================================================ + +- name: Case 50, two eligible children different ages and providers. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 20_000 + immigration_status: CITIZEN + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: FAMILY_HOME + wv_ccap_quality_tier: TIER_II + childcare_attending_days_per_month: 22 + pre_subsidy_childcare_expenses: 6_000 + person3: + age: 6 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + childcare_attending_days_per_month: 13 + pre_subsidy_childcare_expenses: 4_000 + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_pre_subsidy_childcare_expenses: 10_000 + households: + household: + members: [person1, person2, person3] + state_code: WV + output: + wv_ccap_eligible_child: [false, true, true] + + # Person2: Family Home Tier II Infant = $33/day + # Person3: Center Tier I School Age = $32/day + wv_ccap_daily_rate: [0, 33, 32] + + # Person2 age 1 = 12 months -> INFANT + # Person3 age 6 = 72 months -> SCHOOL_AGE + wv_ccap_child_age_category: [SCHOOL_AGE, INFANT, SCHOOL_AGE] + + # 3-person family, FPL ratio = 1_666.67 / 2_151.67 = 0.7746 → bracket + # "above 70% up to 80%" → Appendix A 3-person "80%" row daily fee = $2.25/child. + # person2: 22 days/month; person3: 13 days/month → 35 monthly days. + # 2 eligible children in care → billed_share = 2/2 = 1. + # copay = $2.25 × 35 × 1 = $78.75. + wv_ccap_copay: 78.75 + + # Person2 (FAMILY_HOME Tier II Infant, 22 days/month, $6_000/yr expenses): + # monthly expenses $500; actual_days 22 (>20 → per-day billing). + # per_child = min($33 × 22, $500) = $500. + # Person3 (CENTER Tier I School-Age, 13 days/month, $4_000/yr expenses): + # monthly expenses $333.33; actual_days 13 (in 13-20 → monthly rate, 20 days). + # per_child = min($32 × 20, $333.33) = $333.33. + # total reimbursement = $500 + $333.33 = $833.33. + # benefit = max($833.33 - $78.75, 0) = $754.58. + wv_ccap: 754.58 + +# ============================================================ +# Child-only SPM unit cannot pass activity test +# ============================================================ + +- name: Case 51, child-only SPM unit fails activity test. + period: 2025-01 + input: + people: + person1: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1] + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: WV + output: + # No head/spouse caretaker present -> activity test must fail, + # otherwise child-only units would pass on income + assets alone. + wv_ccap_activity_eligible: false + wv_ccap_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/integration.yaml new file mode 100644 index 00000000000..824bf866a7e --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/integration.yaml @@ -0,0 +1,360 @@ +# WV CCAP Integration Tests +# 2025 FPG (Contiguous US): +# first_person = 15_650, additional = 5_500 +# Family of 2: 21_150 +# Family of 3: 26_650 + +- name: Case 1, basic eligible family with center care. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 24_000 + immigration_status: CITIZEN + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + childcare_attending_days_per_month: 22 + pre_subsidy_childcare_expenses: 8_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 8_000 + households: + household: + members: [person1, person2] + state_code: WV + output: + # === Eligibility === + wv_ccap_eligible_child: [false, true] + + # 185% FPL family of 2 = $39,127.50/yr; $24,000/yr → eligible. + wv_ccap_income_eligible: true + is_ccdf_asset_eligible: true + wv_ccap_eligible: true + + # === Age category === + # Person1 (age 35) = 420 months -> SCHOOL_AGE; Person2 (age 3) = 36 months -> TODDLER + wv_ccap_child_age_category: [SCHOOL_AGE, TODDLER] + + # === Daily rate === + # Center Tier I Toddler = $37/day + wv_ccap_daily_rate: [0, 37] + + # === Copay === + # 2-person family, FPL ratio = 2_000 / 1_762.50 = 1.1348. + # Appendix A 2-person "120%" row daily fee = $5.75/child. + # 1 eligible child × 22 monthly days. + # copay = $5.75 × 22 × 1 = $126.50. + wv_ccap_copay: 126.5 + + # === Daily benefit (view variable: rate + supplements capped at daily charge) === + # daily charge = (8_000/12) / 22 = 30.30; daily benefit = min(37, 30.30) = 30.30. + wv_ccap_daily_benefit: [0, 30.3] + + # === Monthly benefit === + # 22 days/month > 20 → per-day billing for base; no supplements. + # per_child reimbursement = min($37 × 22, $666.67) = $666.67. + # benefit = max($666.67 - $126.50, 0) = $540.17. + wv_ccap: 540.17 + +- name: Case 2, low income family with zero copay. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 28 + employment_income: 6_000 + immigration_status: CITIZEN + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: FAMILY_HOME + wv_ccap_quality_tier: TIER_I + childcare_attending_days_per_month: 22 + pre_subsidy_childcare_expenses: 6_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 6_000 + households: + household: + members: [person1, person2] + state_code: WV + output: + wv_ccap_eligible_child: [false, true] + wv_ccap_income_eligible: true + wv_ccap_eligible: true + + # Person1 (age 28) = 336 months -> SCHOOL_AGE; Person2 (age 1) = 12 months -> INFANT + wv_ccap_child_age_category: [SCHOOL_AGE, INFANT] + + # Family Home Tier I Infant = $30/day + wv_ccap_daily_rate: [0, 30] + + # FPL ratio = 500 / 1_762.50 = 0.2837 < 0.40 -> 0% copay + wv_ccap_copay: 0 + + # daily charge = 500 / 22 = 22.73 + # daily benefit = min(30, 22.73) = 22.73 + wv_ccap_daily_benefit: [0, 22.73] + + # total reimbursement = min($500 expense, $22.73 × 22) = $500 + wv_ccap: 500 + +- name: Case 3, ineligible family gets zero benefit. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + # Above 185% FPL family of 2 ($39,127.50/yr). + employment_income: 60_000 + immigration_status: CITIZEN + weekly_hours_worked: 40 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + childcare_attending_days_per_month: 22 + pre_subsidy_childcare_expenses: 10_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 10_000 + households: + household: + members: [person1, person2] + state_code: WV + output: + # $60,000/yr > 185% FPL family of 2 ($39,127.50/yr). + wv_ccap_income_eligible: false + wv_ccap_eligible: false + wv_ccap: 0 + +- name: Case 4, special needs child with supplement. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 24_000 + immigration_status: CITIZEN + person2: + age: 15 + is_tax_unit_dependent: true + has_developmental_delay: true + immigration_status: CITIZEN + ssi: 0 + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_II + childcare_attending_days_per_month: 22 + pre_subsidy_childcare_expenses: 10_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 10_000 + households: + household: + members: [person1, person2] + state_code: WV + output: + # Disabled child age 15 < 18 -> eligible + wv_ccap_eligible_child: [false, true] + wv_ccap_income_eligible: true + wv_ccap_eligible: true + + # Person1 (age 40) = 480 months -> SCHOOL_AGE; Person2 (age 15) = 180 months -> SCHOOL_AGE + wv_ccap_child_age_category: [SCHOOL_AGE, SCHOOL_AGE] + + # Center Tier II School Age = $35/day + wv_ccap_daily_rate: [0, 35] + + # Daily benefit (view): rate + supplement capped at daily charge. + # daily charge = (10_000/12) / 22 = 37.88; daily benefit = min(35+3, 37.88) = 37.88. + wv_ccap_daily_benefit: [0, 37.88] + + # Copay: same 2-person FPL 1.1348 → Appendix A "120%" row $5.75/day × 22 = $126.50. + wv_ccap_copay: 126.5 + + # 22 days/month > 20 → per-day billing for base. + # Manual §7.2.7.2: supplements bill for actual days only (same here, per-day billing). + # per_child = min($35 × 22 + $3 × 22, $833.33) = $833.33. + # benefit = max($833.33 - $126.50, 0) = $706.83. + wv_ccap: 706.83 + +- name: Case 5, non-WV family gets zero benefit. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 24_000 + person2: + age: 4 + is_tax_unit_dependent: true + childcare_attending_days_per_month: 22 + pre_subsidy_childcare_expenses: 8_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 8_000 + households: + household: + members: [person1, person2] + state_code: VA + output: + wv_ccap: 0 + +- name: Case 6, copay reduces capped provider reimbursement. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 24_000 + weekly_hours_worked: 40 + immigration_status: CITIZEN + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + childcare_attending_days_per_month: 17 + pre_subsidy_childcare_expenses: 12_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 12_000 + households: + household: + members: [person1, person2] + state_code: WV + output: + wv_ccap_eligible: true + # Center Tier I Toddler = $37/day. + wv_ccap_daily_rate: [0, 37] + # 17 days/month is in the 13-20 monthly-rate range. + # Base reimbursement (monthly rate): $37 × 20 = $740. + # Copay: 2-person FPL 1.1348 → Appendix A "120%" row $5.75/day × 17 = $97.75. + wv_ccap_copay: 97.75 + # benefit = max($740 - $97.75, 0) = $642.25. + wv_ccap: 642.25 + +# Manual §7.2.7.2: rate supplements are paid for actual days only — the monthly +# rate does NOT apply to rate supplements. This case is the regression guard. +- name: Case 7, supplement billed by actual days even when monthly rate applies. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 24_000 + weekly_hours_worked: 40 + immigration_status: CITIZEN + person2: + age: 3 + is_tax_unit_dependent: true + has_developmental_delay: true + ssi: 0 + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + childcare_attending_days_per_month: 17 + pre_subsidy_childcare_expenses: 12_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 12_000 + households: + household: + members: [person1, person2] + state_code: WV + output: + wv_ccap_eligible: true + # Center Tier I Toddler = $37/day base; special needs supplement = $3/day. + wv_ccap_daily_rate: [0, 37] + # 17 days/month is in the 13-20 monthly-rate range. + # Base reimbursement (monthly rate): $37 × 20 = $740. + # Supplement reimbursement (actual days, Manual §7.2.7.2): $3 × 17 = $51. + # Total reimbursement: $740 + $51 = $791 (under pre_subsidy $1_000). + # Copay: same as Case 6 (2-person FPL 1.1348, 17 days) = $97.75. + wv_ccap_copay: 97.75 + # benefit = max($791 - $97.75, 0) = $693.25. + wv_ccap: 693.25 + +- name: Case 8, less than thirteen monthly days uses per-day rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 24_000 + weekly_hours_worked: 40 + immigration_status: CITIZEN + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + childcare_attending_days_per_month: 9 + pre_subsidy_childcare_expenses: 12_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 12_000 + households: + household: + members: [person1, person2] + state_code: WV + output: + wv_ccap_eligible: true + # 9 days/month is below the 13-day monthly-rate threshold. + # Center Tier I Toddler = $37/day; daily charge = $1_000 / 9 = $111.11. + wv_ccap_daily_benefit: [0, 37] + # Copay: 2-person FPL 1.1348 → Appendix A "120%" row $5.75/day × 9 = $51.75. + wv_ccap_copay: 51.75 + # Per-child reimbursement is capped before copay: + # max(min($1_000 expense, $37 × 9 max rate) - $51.75, 0) = $281.25. + wv_ccap: 281.25 diff --git a/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_activity_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_activity_eligible.yaml new file mode 100644 index 00000000000..e988159fff6 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_activity_eligible.yaml @@ -0,0 +1,155 @@ +# WV CCAP activity eligibility tests +# Per Manual §3.6.1, all parents/heads/spouses must work ≥20 hours/week OR be +# in school/training. Single-parent units use the head's status; two-parent +# units require BOTH parents to qualify. + +- name: Case 1, single parent working 20 hours per week eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + 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: WV + output: + wv_ccap_activity_eligible: true + +- name: Case 2, single parent working under 20 hours per week ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 12_000 + weekly_hours_worked: 15 + is_full_time_student: 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: WV + output: + wv_ccap_activity_eligible: false + +- name: Case 3, single parent who is a full-time student eligible. + period: 2025-01 + input: + people: + person1: + age: 22 + employment_income: 0 + weekly_hours_worked: 0 + is_full_time_student: true + person2: + age: 3 + 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: WV + output: + wv_ccap_activity_eligible: true + +- name: Case 4, two-parent family with both parents meeting requirement eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + weekly_hours_worked: 30 + person2: + age: 28 + employment_income: 18_000 + weekly_hours_worked: 25 + person3: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: WV + output: + wv_ccap_activity_eligible: true + +- name: Case 5, two-parent family with one parent not meeting requirement ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + weekly_hours_worked: 30 + person2: + age: 28 + employment_income: 6_000 + weekly_hours_worked: 10 + is_full_time_student: false + person3: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: WV + output: + wv_ccap_activity_eligible: false + +- name: Case 6, child-only SPM unit has no caretaker and fails. + period: 2025-01 + input: + people: + person1: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1] + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: WV + output: + wv_ccap_activity_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_child_age_category.yaml b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_child_age_category.yaml new file mode 100644 index 00000000000..ca87599180d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_child_age_category.yaml @@ -0,0 +1,88 @@ +# WV CCAP child age category tests +# Infant (0-24mo), Toddler (25-36mo), Pre-School (37-59mo), School-Age (60+mo) +# Age group is derived from age in months via bracket parameter. +# age_in_months = age * 12 (since age is YEAR-defined float) + +- name: Case 1, infant at 6 months. + period: 2025-01 + input: + people: + person1: + age: 0.5 + # 0.5 years = 6 months -> INFANT (0-12mo bracket) + households: + household: + members: [person1] + state_code: WV + output: + wv_ccap_child_age_category: INFANT + +- name: Case 2, toddler at 30 months. + period: 2025-01 + input: + people: + person1: + age: 2.5 + # 2.5 years = 30 months -> TODDLER (25-36mo bracket) + households: + household: + members: [person1] + state_code: WV + output: + wv_ccap_child_age_category: TODDLER + +- name: Case 3, preschool at 40 months. + period: 2025-01 + input: + people: + person1: + age: 3.33 + # 3.33 years ~ 40 months -> PRESCHOOL (37-59mo bracket) + households: + household: + members: [person1] + state_code: WV + output: + wv_ccap_child_age_category: PRESCHOOL + +- name: Case 4, school-age at 72 months. + period: 2025-01 + input: + people: + person1: + age: 6 + # 6 years = 72 months -> SCHOOL_AGE (60+ months bracket) + households: + household: + members: [person1] + state_code: WV + output: + wv_ccap_child_age_category: SCHOOL_AGE + +- name: Case 5, boundary at exactly 25 months. + period: 2025-01 + input: + people: + person1: + age: 2.0834 + # 2.0834 years = 25.0008 months -> TODDLER (threshold at 25) + households: + household: + members: [person1] + state_code: WV + output: + wv_ccap_child_age_category: TODDLER + +- name: Case 6, boundary at exactly 37 months. + period: 2025-01 + input: + people: + person1: + age: 3.0834 + # 3.0834 years = 37.0008 months -> PRESCHOOL (threshold at 37) + households: + household: + members: [person1] + state_code: WV + output: + wv_ccap_child_age_category: PRESCHOOL diff --git a/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_copay.yaml b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_copay.yaml new file mode 100644 index 00000000000..0192752bd40 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_copay.yaml @@ -0,0 +1,200 @@ +# WV CCAP Co-payment Tests +# Appendix A is a 2D table: family size (1-11+) x FPL bracket -> daily fee per child. +# Manual §6.4.3.2: fees are daily, charged for each child in care. +# Manual §6.4.3.4: capped at the three youngest children. +# CCDF Plan §3.1.1: total family fee capped at 7% of gross income. +# 2025 FPG family of 2 monthly: $1_762.50. + +- name: Case 1, income below 40% FPL pays zero copay. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 6_000 + person2: + age: 5 + childcare_attending_days_per_month: 22 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # FPL ratio = 500 / 1_762.50 = 0.2837 < 0.40 -> fee = $0/day. + wv_ccap_copay: 0 + +- name: Case 2, mid-range income copay from Appendix A daily fee. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 5 + childcare_attending_days_per_month: 22 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # Monthly income $1_500; FPL ratio = 1_500 / 1_762.50 = 0.8511. + # Appendix A 2-person "90%" row daily fee = $4.25/child. + # 1 eligible child × 22 monthly days. + # copay = $4.25 × 22 × 1 = $93.50. + wv_ccap_copay: 93.5 + +- name: Case 3, high income 2-person family copay below 7% cap. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + person2: + age: 5 + childcare_attending_days_per_month: 22 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # Monthly income $3_000; FPL ratio = 3_000 / 1_762.50 = 1.7021. + # Appendix A 2-person "180%" row daily fee = $8.75/child. + # uncapped copay = $8.75 × 22 = $192.50. + # 7% cap = $3_000 × 0.07 = $210. Cap does not bind for 2-person, 1-child. + wv_ccap_copay: 192.5 + +- name: Case 4, foster family pays zero copay even when fee would otherwise apply. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + person2: + age: 5 + childcare_attending_days_per_month: 22 + is_in_foster_care: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # Without foster waiver this household would owe $192.50/month (see Case 3); + # Manual §6.4.1 / CCDF Plan §3.3.1 waives the family fee. + wv_ccap_copay: 0 + +- name: Case 5, family size above eleven uses eleven-person column. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 64_800 + person2: + age: 5 + childcare_attending_days_per_month: 22 + person3: + age: 4 + person4: + age: 4 + person5: + age: 4 + person6: + age: 4 + person7: + age: 4 + person8: + age: 4 + person9: + age: 4 + person10: + age: 4 + person11: + age: 4 + person12: + age: 4 + tax_units: + tax_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11, person12] + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11, person12] + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11, person12] + state_code: WV + output: + # Family size 12 defaults to the 11-person column. + # FPL ratio = 5_400 / 6_345.83 = 0.8511, so Appendix A 11-person "90%" row = $4.50/day. + # 1 eligible child × 22 monthly days. + # copay = $4.50 × 22 = $99. + wv_ccap_copay: 99 + +- name: Case 6, four children in care are capped at three billed children. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + person2: + age: 5 + childcare_attending_days_per_month: 22 + person3: + age: 4 + childcare_attending_days_per_month: 22 + person4: + age: 3 + childcare_attending_days_per_month: 22 + person5: + age: 2 + childcare_attending_days_per_month: 22 + tax_units: + tax_unit: + members: [person1, person2, person3, person4, person5] + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: WV + output: + # Family size 5, FPL ratio = 2_500 / 3_137.50 = 0.7968. + # Appendix A 5-person "80%" row daily fee = $2.25/child. + # 4 eligible children × 22 monthly days = 88 monthly days. + # Three-child cap scales billed days by 3/4: 88 × 3/4 = 66. + # copay = $2.25 × 66 = $148.50. + wv_ccap_copay: 148.5 diff --git a/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_countable_income.yaml new file mode 100644 index 00000000000..9e5f7dee1fe --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_countable_income.yaml @@ -0,0 +1,75 @@ +# WV CCAP countable income tests +# wv_ccap_countable_income uses adds = sources parameter list +# Sources: employment_income, self_employment_income, social_security, ssi, +# unemployment_compensation, workers_compensation, pension_income, +# alimony_income, child_support_received, dividend_income, interest_income, +# rental_income, veterans_benefits, military_retirement_pay +# Note: tanf excluded from sources to break circular dependency +# (TANF recipients are categorically eligible via is_tanf_enrolled) + +- name: Case 1, employment and unearned income counted. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + social_security: 6_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # Monthly: employment 24,000/12 = 2,000 + SS 6,000/12 = 500 + # Total monthly = 2,500 + wv_ccap_countable_income: 2_500 + +- name: Case 2, SNAP is excluded from countable income. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + snap: 2_400 + households: + household: + members: [person1, person2] + state_code: WV + output: + # Monthly: employment 18,000/12 = 1,500 + # SNAP (2,400/yr) is excluded -> not counted + wv_ccap_countable_income: 1_500 + +- name: Case 3, self-employment income counted. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + self_employment_income: 36_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # Monthly: self_employment 36,000/12 = 3,000 + wv_ccap_countable_income: 3_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_daily_benefit.yaml b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_daily_benefit.yaml new file mode 100644 index 00000000000..1cfd4c2e7c2 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_daily_benefit.yaml @@ -0,0 +1,96 @@ +# WV CCAP daily benefit tests +# Daily benefit per child = min(rate + supplements, daily_charge) + +- name: Case 1, daily benefit capped by provider charge. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + person2: + # Age 3 → 36 months → TODDLER. + age: 3 + is_tax_unit_dependent: true + childcare_attending_days_per_month: 22 + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + pre_subsidy_childcare_expenses: 8_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # Center Tier I Toddler = $37/day; daily_charge = (8_000/12)/22 = $30.30. + # daily_benefit = min(37, 30.30) = 30.30. + wv_ccap_daily_benefit: [0, 30.3] + +- name: Case 2, daily benefit pays full rate when charge exceeds rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 6_000 + person2: + age: 1 + is_tax_unit_dependent: true + childcare_attending_days_per_month: 22 + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_II + pre_subsidy_childcare_expenses: 15_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # Center Tier II Infant = $42/day; daily_charge = (15_000/12)/22 = $56.82. + # daily_benefit = min(42, 56.82) = 42. + wv_ccap_daily_benefit: [0, 42] + +- name: Case 3, non-traditional hours supplement adds 6 dollars per day. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 6_000 + person2: + # Age 3 → 36 months → TODDLER. + age: 3 + is_tax_unit_dependent: true + childcare_attending_days_per_month: 22 + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + wv_ccap_non_traditional_hours: true + pre_subsidy_childcare_expenses: 15_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # Center Tier I Toddler = $37/day; non-traditional supplement = $6/day. + # total_rate = 43; daily_charge = (15_000/12)/22 = $56.82. + # daily_benefit = min(43, 56.82) = 43. + wv_ccap_daily_benefit: [0, 43] diff --git a/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_daily_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_daily_rate.yaml new file mode 100644 index 00000000000..9f780474ef4 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_daily_rate.yaml @@ -0,0 +1,189 @@ +# WV CCAP Daily Provider Rate Tests + +- name: Case 1, center Tier I infant rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 0.5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # Infant (0-12 months), Center, Tier I = $39 + wv_ccap_daily_rate: [0, 39] + +- name: Case 2, family home Tier II toddler rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 2.5 + # 2.5 years = 30 months -> TODDLER (25-36mo) + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: FAMILY_HOME + wv_ccap_quality_tier: TIER_II + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # Toddler (25-36 months), Family Home, Tier II = $33 + wv_ccap_daily_rate: [0, 33] + +- name: Case 3, family facility Tier III preschool rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 3.25 + # 3.25 years = 39 months -> PRESCHOOL (37-59mo) + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: FAMILY_FACILITY + wv_ccap_quality_tier: TIER_III + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # Preschool (37-59 months), Family Facility, Tier III = $39 + wv_ccap_daily_rate: [0, 39] + +- name: Case 4, out of school time rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: OUT_OF_SCHOOL_TIME + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # Out of School Time Tier I = $14.50 + wv_ccap_daily_rate: [0, 14.5] + +- name: Case 5, informal relative under 2 rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: INFORMAL_RELATIVE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # Under 2, Informal/Relative = $7.50 + wv_ccap_daily_rate: [0, 7.5] + +- name: Case 6, informal relative age 2+ rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: INFORMAL_RELATIVE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # 2+, Informal/Relative = $6.00 + wv_ccap_daily_rate: [0, 6] + +- name: Case 7, center Tier III school age rate. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_III + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # School Age (60+ months), Center, Tier III = $39 + wv_ccap_daily_rate: [0, 39] diff --git a/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_eligible.yaml new file mode 100644 index 00000000000..49f49b3201e --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_eligible.yaml @@ -0,0 +1,141 @@ +# WV CCAP overall eligibility tests +# Combines: eligible child + income eligible + activity eligible + +- name: Case 1, eligible child and income and activity. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + weekly_hours_worked: 30 + person2: + age: 5 + is_tax_unit_dependent: true + childcare_hours_per_week: 40 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # Child age 5 is under the 13-year limit. + # Income $24,000 is below 185% FPL for a family of 2 ($39,127.50). + # Parent works 30 hours per week, meeting the 20-hour activity test. + wv_ccap_eligible: true + +- name: Case 2, no eligible child means not eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + weekly_hours_worked: 30 + person2: + age: 15 + 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: WV + output: + # Child age 15 >= 13, not disabled -> no eligible child + wv_ccap_eligible: false + +- name: Case 3, income too high means not eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + # Income above 185% FPL for family of 2 (185% × $21,150 = $39,127.50/yr). + employment_income: 60_000 + weekly_hours_worked: 40 + person2: + age: 5 + is_tax_unit_dependent: true + childcare_hours_per_week: 40 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # $60,000/yr is above 185% FPL for a family of 2 ($39,127.50) → not income eligible. + wv_ccap_eligible: false + +- name: Case 4, parent not meeting activity hours means not eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 12_000 + weekly_hours_worked: 10 + is_full_time_student: false + person2: + age: 5 + is_tax_unit_dependent: true + childcare_hours_per_week: 40 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # Parent works 10 hrs < 20 minimum, not student -> not activity eligible + wv_ccap_eligible: false + +- name: Case 5, two-parent family both meeting activity requirement. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 18_000 + weekly_hours_worked: 25 + person2: + age: 28 + employment_income: 12_000 + weekly_hours_worked: 20 + person3: + age: 3 + is_tax_unit_dependent: true + childcare_hours_per_week: 40 + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: WV + output: + # Both parents work 20 hours per week, meeting the activity test. + # Combined income $30,000 is below 185% FPL for a family of 3. + # Child age 3 is under the 13-year child age limit. + wv_ccap_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_eligible_child.yaml b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_eligible_child.yaml new file mode 100644 index 00000000000..1decd9bd8b7 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_eligible_child.yaml @@ -0,0 +1,118 @@ +- name: Case 1, child under 13 who is a citizen and dependent. + period: 2025-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: WV + output: + wv_ccap_eligible_child: [false, true] + +- name: Case 2, child age 13 ineligible without disability. + period: 2025-01 + input: + people: + person1: + age: 35 + 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: WV + output: + wv_ccap_eligible_child: [false, false] + +- name: Case 3, disabled child age 15 eligible. + period: 2025-01 + input: + people: + person1: + age: 40 + person2: + age: 15 + is_tax_unit_dependent: true + has_developmental_delay: 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: WV + output: + wv_ccap_eligible_child: [false, true] + +- name: Case 4, undocumented child ineligible. + period: 2025-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: WV + output: + wv_ccap_eligible_child: [false, false] + +- name: Case 5, non-tax-dependent child still eligible (residency, not tax dependency, governs). + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 8 + 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: WV + output: + # §3.2 requires the child to reside with the family, not to be a tax + # dependent. With the dependency filter removed, a co-resident child + # under 13 who is a citizen remains eligible. + wv_ccap_eligible_child: [false, true] diff --git a/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_income_eligible.yaml new file mode 100644 index 00000000000..0c1b030eda2 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_ccap_income_eligible.yaml @@ -0,0 +1,99 @@ +# WV CCAP Income Eligibility Tests +# Initial intake cap: 185% FPL (Manual §3.2.1, Appendix A) +# 185% FPL for a 2-person family (2025) = $39,127.50/yr + +- name: Case 1, income below 185% FPL eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + person2: + age: 5 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # $24,000/yr < $39,127.50 → eligible + wv_ccap_income_eligible: true + +- name: Case 2, income above 185% FPL ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 60_000 + person2: + age: 5 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # $60,000/yr > $39,127.50 → ineligible + wv_ccap_income_eligible: false + +- name: Case 3, income just below 185% FPL boundary eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + # 2-person family: 185% FPL ≈ $39,127.50 + employment_income: 39_000 + person2: + age: 5 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WV + output: + # $39,000/yr ≤ $39,127.50 → eligible + wv_ccap_income_eligible: true + +- name: Case 4, TANF recipients categorically eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 60_000 + person2: + age: 5 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: WV + output: + # Income above 185% FPL but TANF bypass applies per Manual §3.2.1. + # NOTE: we don't model "TANF children-only" cases (§3.2.1.4) that must + # still meet the income test at the moment. + wv_ccap_income_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_child_care_subsidies.yaml b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_child_care_subsidies.yaml new file mode 100644 index 00000000000..8d77a426fb5 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wv/dhhr/ccap/wv_child_care_subsidies.yaml @@ -0,0 +1,31 @@ +- name: Case 1, WV child care subsidies wrapper. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 24_000 + immigration_status: CITIZEN + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + wv_ccap_provider_type: CENTER + wv_ccap_quality_tier: TIER_I + childcare_attending_days_per_month: 22 + pre_subsidy_childcare_expenses: 8_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 8_000 + households: + household: + members: [person1, person2] + state_code: WV + output: + # Matches integration.yaml Case 1: wv_ccap monthly = $540.17 → annual = ~$6_482. + wv_child_care_subsidies: 6_482 diff --git a/policyengine_us/variables/gov/states/wv/dhhr/ccap/eligibility/wv_ccap_activity_eligible.py b/policyengine_us/variables/gov/states/wv/dhhr/ccap/eligibility/wv_ccap_activity_eligible.py new file mode 100644 index 00000000000..63378491454 --- /dev/null +++ b/policyengine_us/variables/gov/states/wv/dhhr/ccap/eligibility/wv_ccap_activity_eligible.py @@ -0,0 +1,28 @@ +from policyengine_us.model_api import * + + +class wv_ccap_activity_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for West Virginia CCAP based on activity requirements" + definition_period = MONTH + defined_for = StateCode.WV + reference = "https://bfa.wv.gov/media/6766/download?inline#page=33" + + def formula(spm_unit, period, parameters): + # NOTE: we use is_full_time_student as a proxy for Manual §3.6.3, which + # requires specific credit-hour minimums and excludes web-only courses. + # We don't track high-school students (§3.6.2.2 exempts them from the + # weekly-hours floor) or CPS Safety/Treatment Plan recipients + # (§3.6.4 exempts them from activity hours) at the moment. + p = parameters(period).gov.states.wv.dhhr.ccap.eligibility + 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_student = person("is_full_time_student", period.this_year) + individually_eligible = (hours_worked >= p.activity_hours) | is_student + has_caretaker = spm_unit.sum(is_head_or_spouse) > 0 + no_ineligible_caretaker = ( + spm_unit.sum(is_head_or_spouse & ~individually_eligible) == 0 + ) + return has_caretaker & no_ineligible_caretaker diff --git a/policyengine_us/variables/gov/states/wv/dhhr/ccap/eligibility/wv_ccap_eligible.py b/policyengine_us/variables/gov/states/wv/dhhr/ccap/eligibility/wv_ccap_eligible.py new file mode 100644 index 00000000000..41357b887b5 --- /dev/null +++ b/policyengine_us/variables/gov/states/wv/dhhr/ccap/eligibility/wv_ccap_eligible.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class wv_ccap_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for West Virginia CCAP" + definition_period = MONTH + defined_for = StateCode.WV + reference = ( + "https://bfa.wv.gov/media/6766/download?inline#page=25", + "https://bfa.wv.gov/media/39915/download?inline#page=16", + ) + + def formula(spm_unit, period, parameters): + # NOTE: we don't model minor-parent eligibility (Manual §1.1.10, §4.5.3.6, §4.5.6) + # because tax-unit head/spouse status excludes people under 18. + # We don't enforce the WV minimum-wage earnings floor (Manual §3.5) or + # split joint-custody households into two families (Manual §3.2.3) at + # the moment. + has_eligible_child = add(spm_unit, period, ["wv_ccap_eligible_child"]) > 0 + income_eligible = spm_unit("wv_ccap_income_eligible", period) + asset_eligible = spm_unit("is_ccdf_asset_eligible", period.this_year) + activity_eligible = spm_unit("wv_ccap_activity_eligible", period) + return has_eligible_child & income_eligible & asset_eligible & activity_eligible diff --git a/policyengine_us/variables/gov/states/wv/dhhr/ccap/eligibility/wv_ccap_eligible_child.py b/policyengine_us/variables/gov/states/wv/dhhr/ccap/eligibility/wv_ccap_eligible_child.py new file mode 100644 index 00000000000..7cbce8da5df --- /dev/null +++ b/policyengine_us/variables/gov/states/wv/dhhr/ccap/eligibility/wv_ccap_eligible_child.py @@ -0,0 +1,29 @@ +from policyengine_us.model_api import * + + +class wv_ccap_eligible_child(Variable): + value_type = bool + entity = Person + label = "Eligible child for West Virginia CCAP" + definition_period = MONTH + defined_for = StateCode.WV + reference = ( + "https://bfa.wv.gov/media/6766/download?inline#page=25", + "https://bfa.wv.gov/media/39915/download?inline#page=16", + ) + + def formula(person, period, parameters): + # NOTE: we don't track court-supervision (§3.1.2.1) at the moment, so the + # 13-17 extension applies only via the special-needs branch (§3.1.2.2). + p = parameters(period).gov.states.wv.dhhr.ccap.eligibility + age = person("age", period.this_year) + has_developmental_delay = person("has_developmental_delay", period.this_year) + age_eligible = where( + has_developmental_delay, + age < p.special_needs_child_age_limit, + age < p.child_age_limit, + ) + immigration_eligible = person( + "is_ccdf_immigration_eligible_child", period.this_year + ) + return age_eligible & immigration_eligible diff --git a/policyengine_us/variables/gov/states/wv/dhhr/ccap/eligibility/wv_ccap_income_eligible.py b/policyengine_us/variables/gov/states/wv/dhhr/ccap/eligibility/wv_ccap_income_eligible.py new file mode 100644 index 00000000000..2ff825bb907 --- /dev/null +++ b/policyengine_us/variables/gov/states/wv/dhhr/ccap/eligibility/wv_ccap_income_eligible.py @@ -0,0 +1,26 @@ +from policyengine_us.model_api import * + + +class wv_ccap_income_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for West Virginia CCAP based on income" + definition_period = MONTH + defined_for = StateCode.WV + reference = ( + "https://bfa.wv.gov/media/6766/download?inline#page=25", + "https://bfa.wv.gov/media/6826/download?inline#page=1", + ) + + def formula(spm_unit, period, parameters): + # NOTE: We model the Appendix A intake cap (~185% FPL). The 85% SMI + # "Over-Income Policy Exception" for enrolled recipients (Manual §4.7.1) + # is not modeled at the moment. We also don't distinguish child-only + # TANF cases (Manual §3.2.1.4 requires them to pass the FPL test) from + # full TANF — is_tanf_enrolled treats both as categorically eligible. + p = parameters(period).gov.states.wv.dhhr.ccap.income + countable_income = spm_unit("wv_ccap_countable_income", period) + fpg = spm_unit("spm_unit_fpg", period) + fpl_eligible = countable_income <= fpg * p.fpl_limit + is_tanf = spm_unit("is_tanf_enrolled", period) + return is_tanf | fpl_eligible diff --git a/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap.py b/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap.py new file mode 100644 index 00000000000..263aee8b0df --- /dev/null +++ b/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap.py @@ -0,0 +1,56 @@ +from policyengine_us.model_api import * + + +class wv_ccap(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "West Virginia CCAP benefit amount" + definition_period = MONTH + defined_for = "wv_ccap_eligible" + reference = ( + "https://bfa.wv.gov/media/6766/download?inline#page=80", + "https://bfa.wv.gov/media/39915/download?inline#page=41", + ) + + def formula(spm_unit, period, parameters): + # Manual §7.2.7.3-7.2.7.4: Monthly Rate = 20 × base daily rate when + # 13-20 days/month of attendance; per-day billing otherwise. + # Manual §7.2.7.2: rate supplements (special needs, shift differential) + # are paid for actual days of care only — the monthly rate does NOT + # apply to rate supplements. + # We don't track per-day attendance hours at the moment, so every + # attended day is paid at the full-day rate; the part-day conversion + # (§7.2.7.6 — 2/3 rate for 2-4 hrs, 1/3 for < 2 hrs), the full-day + # 4-hr minimum (§7.2.7.5), the 18-hour daily cap (§7.2.1), and the + # two-provider-per-child billing rule (§6.4.2, §7.2.3, §7.2.5) are + # not modeled. + p = parameters(period).gov.states.wv.dhhr.ccap + person = spm_unit.members + monthly_care_days = person( + "childcare_attending_days_per_month", period.this_year + ) + in_monthly_range = (monthly_care_days >= p.billing.monthly_rate_min_days) & ( + monthly_care_days <= p.billing.monthly_rate_max_days + ) + daily_rate = person("wv_ccap_daily_rate", period) + has_developmental_delay = person("has_developmental_delay", period.this_year) + special_needs_supplement = where( + has_developmental_delay, p.supplements.special_needs, 0 + ) + non_trad = person("wv_ccap_non_traditional_hours", period) + non_trad_supplement = where(non_trad, p.supplements.non_traditional_hours, 0) + daily_supplement = special_needs_supplement + non_trad_supplement + pre_subsidy_per_child = person("pre_subsidy_childcare_expenses", period) + monthly_rate_maximum = ( + daily_rate * p.billing.monthly_rate_max_days + + daily_supplement * monthly_care_days + ) + per_day_maximum = person("wv_ccap_daily_benefit", period) * monthly_care_days + per_child_reimbursement = min_( + pre_subsidy_per_child, + where(in_monthly_range, monthly_rate_maximum, per_day_maximum), + ) + total_reimbursement = spm_unit.sum(per_child_reimbursement) + copay = spm_unit("wv_ccap_copay", period) + return max_(total_reimbursement - copay, 0) diff --git a/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_child_age_category.py b/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_child_age_category.py new file mode 100644 index 00000000000..cb6db14bebc --- /dev/null +++ b/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_child_age_category.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class WVCCAPChildAgeCategory(Enum): + INFANT = "Infant (0-24 months)" + TODDLER = "Toddler (25-36 months)" + PRESCHOOL = "Preschool (37-59 months)" + SCHOOL_AGE = "School Age (60+ months)" + + +class wv_ccap_child_age_category(Variable): + value_type = Enum + entity = Person + possible_values = WVCCAPChildAgeCategory + default_value = WVCCAPChildAgeCategory.PRESCHOOL + definition_period = MONTH + label = "West Virginia CCAP child age category" + defined_for = StateCode.WV + reference = "https://bfa.wv.gov/media/6831/download?inline#page=1" + + def formula(person, period, parameters): + age_in_months = person("age", period.this_year) * MONTHS_IN_YEAR + p = parameters(period).gov.states.wv.dhhr.ccap.age_group + return p.months.calc(age_in_months) diff --git a/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_copay.py b/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_copay.py new file mode 100644 index 00000000000..5899b1d011b --- /dev/null +++ b/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_copay.py @@ -0,0 +1,83 @@ +from policyengine_us.model_api import * + + +class wv_ccap_copay(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "West Virginia CCAP family co-payment" + definition_period = MONTH + defined_for = StateCode.WV + reference = ( + "https://bfa.wv.gov/media/6826/download?inline#page=1", + "https://bfa.wv.gov/media/6766/download?inline#page=65", + "https://bfa.wv.gov/media/39915/download?inline#page=39", + ) + + def formula(spm_unit, period, parameters): + # Appendix A: daily co-payment per child looked up by family size and + # FPL ratio. Manual §6.4.3.2: fees are daily, assessed for each child + # in care. Manual §6.4.3.4: capped at three youngest children. + p = parameters(period).gov.states.wv.dhhr.ccap.copayment + countable_income = spm_unit("wv_ccap_countable_income", period) + fpg = spm_unit("spm_unit_fpg", period) + fpl_ratio = where(fpg > 0, countable_income / fpg, 0) + family_size = spm_unit("spm_unit_size", period.this_year) + # Look up daily fee per child from Appendix A by family size column. + # Families with twelve or more people use the eleven-person column. + rate = p.rate + daily_fee_per_child = select( + [ + family_size == 1, + family_size == 2, + family_size == 3, + family_size == 4, + family_size == 5, + family_size == 6, + family_size == 7, + family_size == 8, + family_size == 9, + family_size == 10, + ], + [ + rate.size_1.calc(fpl_ratio), + rate.size_2.calc(fpl_ratio), + rate.size_3.calc(fpl_ratio), + rate.size_4.calc(fpl_ratio), + rate.size_5.calc(fpl_ratio), + rate.size_6.calc(fpl_ratio), + rate.size_7.calc(fpl_ratio), + rate.size_8.calc(fpl_ratio), + rate.size_9.calc(fpl_ratio), + rate.size_10.calc(fpl_ratio), + ], + default=rate.size_11.calc(fpl_ratio), + ) + person = spm_unit.members + is_eligible_child = person("wv_ccap_eligible_child", period) + monthly_care_days = person( + "childcare_attending_days_per_month", period.this_year + ) + in_care = is_eligible_child & (monthly_care_days > 0) + num_in_care = spm_unit.sum(in_care) + total_monthly_days = spm_unit.sum(monthly_care_days * in_care) + # Per Manual §6.4.3.4: fee waived for any child beyond the three + # youngest. We don't track child ordering, so apply the cap as a + # uniform 3/N scaling across all eligible children in care. + billed_share = where( + num_in_care > 0, + min_(num_in_care, p.max_billed_children) / max_(num_in_care, 1), + 0, + ) + uncapped_copay = daily_fee_per_child * total_monthly_days * billed_share + # CCDF State Plan §3.1.1 caps the family fee at 7% of gross income. + capped_copay = min_(uncapped_copay, countable_income * p.max_share) + # Manual §6.4.1 / CCDF Plan §3.3.1: foster-care children pay no fee. + # We don't track per-child fee waivers at the moment, so we waive the + # whole family copay if any child is in foster care. + # We don't track kinship-care placements (CCDF Plan §3.3.1(vi)), + # CPS Safety/Treatment Plans (Manual §6.4.1), or protective-services + # status (CCDF Plan §3.3.1(vi)) at the moment, so the corresponding + # fee waivers are not applied. + has_foster_child = add(spm_unit, period, ["is_in_foster_care"]) > 0 + return where(has_foster_child, 0, capped_copay) diff --git a/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_countable_income.py b/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_countable_income.py new file mode 100644 index 00000000000..07818e2460b --- /dev/null +++ b/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_countable_income.py @@ -0,0 +1,13 @@ +from policyengine_us.model_api import * + + +class wv_ccap_countable_income(Variable): + value_type = float + entity = SPMUnit + label = "West Virginia CCAP countable income" + definition_period = MONTH + unit = USD + defined_for = StateCode.WV + reference = "https://bfa.wv.gov/media/6766/download?inline#page=51" + + adds = "gov.states.wv.dhhr.ccap.income.countable_income.sources" diff --git a/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_daily_benefit.py b/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_daily_benefit.py new file mode 100644 index 00000000000..26130fbaa51 --- /dev/null +++ b/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_daily_benefit.py @@ -0,0 +1,34 @@ +from policyengine_us.model_api import * + + +class wv_ccap_daily_benefit(Variable): + value_type = float + entity = Person + unit = USD + label = "West Virginia CCAP daily benefit per child" + definition_period = MONTH + defined_for = "wv_ccap_eligible_child" + reference = "https://bfa.wv.gov/media/6766/download?inline#page=80" + + def formula(person, period, parameters): + p = parameters(period).gov.states.wv.dhhr.ccap + daily_rate = person("wv_ccap_daily_rate", period) + has_developmental_delay = person("has_developmental_delay", period.this_year) + special_needs_supplement = where( + has_developmental_delay, p.supplements.special_needs, 0 + ) + non_trad = person("wv_ccap_non_traditional_hours", period) + non_trad_supplement = where(non_trad, p.supplements.non_traditional_hours, 0) + total_rate = daily_rate + special_needs_supplement + non_trad_supplement + pre_subsidy = person("pre_subsidy_childcare_expenses", period) + monthly_care_days = person( + "childcare_attending_days_per_month", period.this_year + ) + mask = monthly_care_days > 0 + daily_charge = np.divide( + pre_subsidy, + monthly_care_days, + out=np.zeros_like(pre_subsidy, dtype=float), + where=mask, + ) + return max_(min_(total_rate, daily_charge), 0) diff --git a/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_daily_rate.py b/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_daily_rate.py new file mode 100644 index 00000000000..6b0d054da16 --- /dev/null +++ b/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_daily_rate.py @@ -0,0 +1,45 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.wv.dhhr.ccap.wv_ccap_provider_type import ( + WVCCAPProviderType, +) + + +class wv_ccap_daily_rate(Variable): + value_type = float + entity = Person + unit = USD + label = "West Virginia CCAP daily provider reimbursement rate" + definition_period = MONTH + defined_for = "wv_ccap_eligible_child" + reference = "https://bfa.wv.gov/media/6831/download?inline#page=1" + + def formula(person, period, parameters): + p = parameters(period).gov.states.wv.dhhr.ccap.rates + provider_type = person("wv_ccap_provider_type", period) + quality_tier = person("wv_ccap_quality_tier", period) + age_category = person("wv_ccap_child_age_category", period) + informal_age = person("wv_ccap_informal_age_group", period) + + family_home_rate = p.family_home[quality_tier][age_category] + family_facility_rate = p.family_facility[quality_tier][age_category] + center_rate = p.center[quality_tier][age_category] + out_of_school_rate = p.out_of_school_time + informal_rate = p.informal_relative[informal_age] + + types = WVCCAPProviderType + return select( + [ + provider_type == types.FAMILY_HOME, + provider_type == types.FAMILY_FACILITY, + provider_type == types.CENTER, + provider_type == types.OUT_OF_SCHOOL_TIME, + provider_type == types.INFORMAL_RELATIVE, + ], + [ + family_home_rate, + family_facility_rate, + center_rate, + out_of_school_rate, + informal_rate, + ], + ) diff --git a/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_informal_age_group.py b/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_informal_age_group.py new file mode 100644 index 00000000000..ad0879ab0e0 --- /dev/null +++ b/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_informal_age_group.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class WVCCAPInformalAgeGroup(Enum): + UNDER_2 = "Under 2 years" + AGE_2_AND_OVER = "2 years and over" + + +class wv_ccap_informal_age_group(Variable): + value_type = Enum + entity = Person + possible_values = WVCCAPInformalAgeGroup + default_value = WVCCAPInformalAgeGroup.AGE_2_AND_OVER + definition_period = MONTH + label = "West Virginia CCAP informal care age group" + defined_for = StateCode.WV + reference = "https://bfa.wv.gov/media/6831/download?inline#page=1" + + def formula(person, period, parameters): + age_in_months = person("age", period.this_year) * MONTHS_IN_YEAR + p = parameters(period).gov.states.wv.dhhr.ccap.age_group + return p.informal_months.calc(age_in_months) diff --git a/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_non_traditional_hours.py b/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_non_traditional_hours.py new file mode 100644 index 00000000000..6299c79cb9b --- /dev/null +++ b/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_non_traditional_hours.py @@ -0,0 +1,10 @@ +from policyengine_us.model_api import * + + +class wv_ccap_non_traditional_hours(Variable): + value_type = bool + entity = Person + definition_period = MONTH + label = "Whether child receives care during non-traditional hours for West Virginia CCAP" + defined_for = StateCode.WV + reference = "https://bfa.wv.gov/media/6831/download?inline#page=1" diff --git a/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_provider_type.py b/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_provider_type.py new file mode 100644 index 00000000000..894adf243ee --- /dev/null +++ b/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_provider_type.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class WVCCAPProviderType(Enum): + FAMILY_HOME = "Family Child Care Home" + FAMILY_FACILITY = "Family Child Care Facility" + CENTER = "Child Care Center" + OUT_OF_SCHOOL_TIME = "Out of School Time" + INFORMAL_RELATIVE = "Informal/Relative Care" + + +class wv_ccap_provider_type(Variable): + value_type = Enum + entity = Person + possible_values = WVCCAPProviderType + default_value = WVCCAPProviderType.CENTER + definition_period = MONTH + label = "West Virginia CCAP child care provider type" + defined_for = StateCode.WV + reference = "https://bfa.wv.gov/media/6831/download?inline#page=1" diff --git a/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_quality_tier.py b/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_quality_tier.py new file mode 100644 index 00000000000..92f5dcd29b9 --- /dev/null +++ b/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_ccap_quality_tier.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class WVCCAPQualityTier(Enum): + TIER_I = "Tier I" + TIER_II = "Tier II" + TIER_III = "Tier III" + + +class wv_ccap_quality_tier(Variable): + value_type = Enum + entity = Person + possible_values = WVCCAPQualityTier + default_value = WVCCAPQualityTier.TIER_I + definition_period = MONTH + label = "West Virginia CCAP provider quality tier" + defined_for = StateCode.WV + reference = "https://bfa.wv.gov/media/6831/download?inline#page=1" diff --git a/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_child_care_subsidies.py b/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_child_care_subsidies.py new file mode 100644 index 00000000000..6730185a6cd --- /dev/null +++ b/policyengine_us/variables/gov/states/wv/dhhr/ccap/wv_child_care_subsidies.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class wv_child_care_subsidies(Variable): + value_type = float + entity = SPMUnit + label = "West Virginia child care subsidies" + unit = USD + definition_period = YEAR + defined_for = StateCode.WV + adds = ["wv_ccap"] diff --git a/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py b/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py index 8b547e04d1c..18dbbaae5e0 100644 --- a/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py +++ b/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py @@ -45,6 +45,8 @@ def formula(spm_unit, period, parameters): "sc_ssi_state_supplement", # Texas programs. "tx_ssi_state_supplement", + # West Virginia programs. + "wv_child_care_subsidies", "snap", "wic", "free_school_meals",