diff --git a/changelog.d/ok-ccs.added.md b/changelog.d/ok-ccs.added.md new file mode 100644 index 00000000000..0613069e34f --- /dev/null +++ b/changelog.d/ok-ccs.added.md @@ -0,0 +1 @@ +Add Oklahoma Child Care Subsidy 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 acd03170470..91fd60bf73a 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 @@ -39,6 +39,7 @@ values: - wa_child_care_subsidies # Washington Working Connections Child Care - wv_child_care_subsidies # West Virginia Child Care Assistance Program - nd_child_care_subsidies # North Dakota Child Care Assistance Program + - ok_child_care_subsidies # Oklahoma Child Care Subsidy Program metadata: unit: list diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index 2aacc287a1c..21ae16c17fb 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -60,6 +60,8 @@ values: - ne_child_care_subsidies # Nevada benefits - nv_child_care_subsidies + # Oklahoma benefits + - ok_child_care_subsidies # South Carolina benefits - sc_child_care_subsidies # New Mexico benefits @@ -150,6 +152,8 @@ values: - ne_child_care_subsidies # Nevada benefits - nv_child_care_subsidies + # Oklahoma benefits + - ok_child_care_subsidies # New Mexico benefits - nm_ssi_state_supplement # South Carolina benefits @@ -246,6 +250,8 @@ values: - ne_child_care_subsidies # Nevada benefits - nv_child_care_subsidies + # Oklahoma benefits + - ok_child_care_subsidies # New Mexico benefits - nm_ssi_state_supplement # South Carolina benefits diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ccs/age_group/center.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/age_group/center.yaml new file mode 100644 index 00000000000..388630b8af8 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/age_group/center.yaml @@ -0,0 +1,35 @@ +description: Oklahoma assigns children to these child care center rate age groups, by age in months, under the Child Care Subsidy Program. +# The amount is the OKCCSCenterAgeGroup enum index: 0 = MONTHS_0_TO_12, +# 1 = MONTHS_13_TO_24, 2 = MONTHS_25_TO_48, 3 = MONTHS_49_TO_72, +# 4 = MONTHS_73_PLUS. +metadata: + type: single_amount + threshold_unit: month + amount_unit: /1 + period: year + label: Oklahoma Child Care Subsidy center age group + reference: + - title: OKDHS Appendix C-4-B, Child Care Provider Rate Schedule + href: https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4-b.pdf#page=3 + +brackets: + - threshold: + 2023-01-01: 0 + amount: + 2023-01-01: 0 + - threshold: + 2023-01-01: 13 + amount: + 2023-01-01: 1 + - threshold: + 2023-01-01: 25 + amount: + 2023-01-01: 2 + - threshold: + 2023-01-01: 49 + amount: + 2023-01-01: 3 + - threshold: + 2023-01-01: 73 + amount: + 2023-01-01: 4 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ccs/age_group/home.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/age_group/home.yaml new file mode 100644 index 00000000000..5e581b6a3dd --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/age_group/home.yaml @@ -0,0 +1,30 @@ +description: Oklahoma assigns children to these child care home rate age groups, by age in months, under the Child Care Subsidy Program. +# The amount is the OKCCSHomeAgeGroup enum index: 0 = MONTHS_0_TO_24, +# 1 = MONTHS_25_TO_48, 2 = MONTHS_49_TO_72, 3 = MONTHS_73_PLUS. +metadata: + type: single_amount + threshold_unit: month + amount_unit: /1 + period: year + label: Oklahoma Child Care Subsidy home age group + reference: + - title: OKDHS Appendix C-4-B, Child Care Provider Rate Schedule + href: https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4-b.pdf#page=3 + +brackets: + - threshold: + 2023-01-01: 0 + amount: + 2023-01-01: 0 + - threshold: + 2023-01-01: 25 + amount: + 2023-01-01: 1 + - threshold: + 2023-01-01: 49 + amount: + 2023-01-01: 2 + - threshold: + 2023-01-01: 73 + amount: + 2023-01-01: 3 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_1.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_1.yaml new file mode 100644 index 00000000000..082499cf3c0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_1.yaml @@ -0,0 +1,61 @@ +description: Oklahoma sets this monthly family share copayment, by adjusted monthly income, for a household of one under the Child Care Subsidy Program. +# Thresholds are the lower bounds of the Appendix C-4 income bands; contiguous +# $0 bands are merged into the first bracket. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + threshold_period: month + period: month + label: Oklahoma Child Care Subsidy family share copayment for a household of one + reference: + - title: OKDHS Appendix C-4, Child Care Eligibility/Copayment Chart + href: https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4.pdf#page=2 + - title: OAC 340:40-5-1(8)-(9) + href: https://okrules.elaws.us/oac/340:40-5-1 + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1_074 + amount: + 2025-10-01: 27 + - threshold: + 2025-10-01: 1_183 + amount: + 2025-10-01: 54 + - threshold: + 2025-10-01: 1_331 + amount: + 2025-10-01: 77 + - threshold: + 2025-10-01: 1_479 + amount: + 2025-10-01: 105 + - threshold: + 2025-10-01: 1_627 + amount: + 2025-10-01: 119 + - threshold: + 2025-10-01: 1_775 + amount: + 2025-10-01: 129 + - threshold: + 2025-10-01: 1_922 + amount: + 2025-10-01: 140 + - threshold: + 2025-10-01: 2_070 + amount: + 2025-10-01: 150 + - threshold: + 2025-10-01: 2_218 + amount: + 2025-10-01: 160 + - threshold: + 2025-10-01: 2_366 + amount: + 2025-10-01: 171 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_10.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_10.yaml new file mode 100644 index 00000000000..e434eb329f0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_10.yaml @@ -0,0 +1,49 @@ +description: Oklahoma sets this monthly family share copayment, by adjusted monthly income, for a household of ten under the Child Care Subsidy Program. +# Thresholds are the lower bounds of the Appendix C-4 income bands; contiguous +# $0 bands are merged into the first bracket. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + threshold_period: month + period: month + label: Oklahoma Child Care Subsidy family share copayment for a household of ten + reference: + - title: OKDHS Appendix C-4, Child Care Eligibility/Copayment Chart + href: https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4.pdf#page=2 + - title: OAC 340:40-5-1(8)-(9) + href: https://okrules.elaws.us/oac/340:40-5-1 + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 4_479 + amount: + 2025-10-01: 306 + - threshold: + 2025-10-01: 4_503 + amount: + 2025-10-01: 330 + - threshold: + 2025-10-01: 4_913 + amount: + 2025-10-01: 358 + - threshold: + 2025-10-01: 5_322 + amount: + 2025-10-01: 387 + - threshold: + 2025-10-01: 5_731 + amount: + 2025-10-01: 415 + - threshold: + 2025-10-01: 6_141 + amount: + 2025-10-01: 444 + - threshold: + 2025-10-01: 6_550 + amount: + 2025-10-01: 473 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_2.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_2.yaml new file mode 100644 index 00000000000..be3d8bd7d9e --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_2.yaml @@ -0,0 +1,61 @@ +description: Oklahoma sets this monthly family share copayment, by adjusted monthly income, for a household of two under the Child Care Subsidy Program. +# Thresholds are the lower bounds of the Appendix C-4 income bands; contiguous +# $0 bands are merged into the first bracket. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + threshold_period: month + period: month + label: Oklahoma Child Care Subsidy family share copayment for a household of two + reference: + - title: OKDHS Appendix C-4, Child Care Eligibility/Copayment Chart + href: https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4.pdf#page=2 + - title: OAC 340:40-5-1(8)-(9) + href: https://okrules.elaws.us/oac/340:40-5-1 + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1_453 + amount: + 2025-10-01: 90 + - threshold: + 2025-10-01: 1_547 + amount: + 2025-10-01: 115 + - threshold: + 2025-10-01: 1_740 + amount: + 2025-10-01: 129 + - threshold: + 2025-10-01: 1_934 + amount: + 2025-10-01: 142 + - threshold: + 2025-10-01: 2_127 + amount: + 2025-10-01: 156 + - threshold: + 2025-10-01: 2_320 + amount: + 2025-10-01: 169 + - threshold: + 2025-10-01: 2_513 + amount: + 2025-10-01: 183 + - threshold: + 2025-10-01: 2_707 + amount: + 2025-10-01: 196 + - threshold: + 2025-10-01: 2_900 + amount: + 2025-10-01: 210 + - threshold: + 2025-10-01: 3_093 + amount: + 2025-10-01: 223 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_3.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_3.yaml new file mode 100644 index 00000000000..3dfbacf2cde --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_3.yaml @@ -0,0 +1,61 @@ +description: Oklahoma sets this monthly family share copayment, by adjusted monthly income, for a household of three under the Child Care Subsidy Program. +# Thresholds are the lower bounds of the Appendix C-4 income bands; contiguous +# $0 bands are merged into the first bracket. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + threshold_period: month + period: month + label: Oklahoma Child Care Subsidy family share copayment for a household of three + reference: + - title: OKDHS Appendix C-4, Child Care Eligibility/Copayment Chart + href: https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4.pdf#page=2 + - title: OAC 340:40-5-1(8)-(9) + href: https://okrules.elaws.us/oac/340:40-5-1 + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1_831 + amount: + 2025-10-01: 128 + - threshold: + 2025-10-01: 1_911 + amount: + 2025-10-01: 142 + - threshold: + 2025-10-01: 2_150 + amount: + 2025-10-01: 159 + - threshold: + 2025-10-01: 2_389 + amount: + 2025-10-01: 176 + - threshold: + 2025-10-01: 2_627 + amount: + 2025-10-01: 192 + - threshold: + 2025-10-01: 2_866 + amount: + 2025-10-01: 209 + - threshold: + 2025-10-01: 3_105 + amount: + 2025-10-01: 226 + - threshold: + 2025-10-01: 3_344 + amount: + 2025-10-01: 242 + - threshold: + 2025-10-01: 3_582 + amount: + 2025-10-01: 259 + - threshold: + 2025-10-01: 3_821 + amount: + 2025-10-01: 276 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_4.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_4.yaml new file mode 100644 index 00000000000..236b11e790a --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_4.yaml @@ -0,0 +1,61 @@ +description: Oklahoma sets this monthly family share copayment, by adjusted monthly income, for a household of four under the Child Care Subsidy Program. +# Thresholds are the lower bounds of the Appendix C-4 income bands; contiguous +# $0 bands are merged into the first bracket. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + threshold_period: month + period: month + label: Oklahoma Child Care Subsidy family share copayment for a household of four + reference: + - title: OKDHS Appendix C-4, Child Care Eligibility/Copayment Chart + href: https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4.pdf#page=2 + - title: OAC 340:40-5-1(8)-(9) + href: https://okrules.elaws.us/oac/340:40-5-1 + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 2_209 + amount: + 2025-10-01: 153 + - threshold: + 2025-10-01: 2_275 + amount: + 2025-10-01: 169 + - threshold: + 2025-10-01: 2_559 + amount: + 2025-10-01: 189 + - threshold: + 2025-10-01: 2_843 + amount: + 2025-10-01: 209 + - threshold: + 2025-10-01: 3_127 + amount: + 2025-10-01: 229 + - threshold: + 2025-10-01: 3_411 + amount: + 2025-10-01: 249 + - threshold: + 2025-10-01: 3_696 + amount: + 2025-10-01: 269 + - threshold: + 2025-10-01: 3_980 + amount: + 2025-10-01: 289 + - threshold: + 2025-10-01: 4_264 + amount: + 2025-10-01: 308 + - threshold: + 2025-10-01: 4_548 + amount: + 2025-10-01: 328 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_5.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_5.yaml new file mode 100644 index 00000000000..13320d23acb --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_5.yaml @@ -0,0 +1,61 @@ +description: Oklahoma sets this monthly family share copayment, by adjusted monthly income, for a household of five under the Child Care Subsidy Program. +# Thresholds are the lower bounds of the Appendix C-4 income bands; contiguous +# $0 bands are merged into the first bracket. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + threshold_period: month + period: month + label: Oklahoma Child Care Subsidy family share copayment for a household of five + reference: + - title: OKDHS Appendix C-4, Child Care Eligibility/Copayment Chart + href: https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4.pdf#page=2 + - title: OAC 340:40-5-1(8)-(9) + href: https://okrules.elaws.us/oac/340:40-5-1 + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 2_588 + amount: + 2025-10-01: 178 + - threshold: + 2025-10-01: 2_639 + amount: + 2025-10-01: 196 + - threshold: + 2025-10-01: 2_968 + amount: + 2025-10-01: 219 + - threshold: + 2025-10-01: 3_298 + amount: + 2025-10-01: 242 + - threshold: + 2025-10-01: 3_628 + amount: + 2025-10-01: 265 + - threshold: + 2025-10-01: 3_957 + amount: + 2025-10-01: 289 + - threshold: + 2025-10-01: 4_287 + amount: + 2025-10-01: 312 + - threshold: + 2025-10-01: 4_617 + amount: + 2025-10-01: 335 + - threshold: + 2025-10-01: 4_947 + amount: + 2025-10-01: 358 + - threshold: + 2025-10-01: 5_276 + amount: + 2025-10-01: 381 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_6.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_6.yaml new file mode 100644 index 00000000000..9db9153b737 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_6.yaml @@ -0,0 +1,61 @@ +description: Oklahoma sets this monthly family share copayment, by adjusted monthly income, for a household of six under the Child Care Subsidy Program. +# Thresholds are the lower bounds of the Appendix C-4 income bands; contiguous +# $0 bands are merged into the first bracket. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + threshold_period: month + period: month + label: Oklahoma Child Care Subsidy family share copayment for a household of six + reference: + - title: OKDHS Appendix C-4, Child Care Eligibility/Copayment Chart + href: https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4.pdf#page=2 + - title: OAC 340:40-5-1(8)-(9) + href: https://okrules.elaws.us/oac/340:40-5-1 + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 2_966 + amount: + 2025-10-01: 203 + - threshold: + 2025-10-01: 3_002 + amount: + 2025-10-01: 223 + - threshold: + 2025-10-01: 3_377 + amount: + 2025-10-01: 250 + - threshold: + 2025-10-01: 3_753 + amount: + 2025-10-01: 276 + - threshold: + 2025-10-01: 4_128 + amount: + 2025-10-01: 302 + - threshold: + 2025-10-01: 4_503 + amount: + 2025-10-01: 328 + - threshold: + 2025-10-01: 4_878 + amount: + 2025-10-01: 355 + - threshold: + 2025-10-01: 5_253 + amount: + 2025-10-01: 381 + - threshold: + 2025-10-01: 5_628 + amount: + 2025-10-01: 407 + - threshold: + 2025-10-01: 6_003 + amount: + 2025-10-01: 433 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_7.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_7.yaml new file mode 100644 index 00000000000..f0212d74215 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_7.yaml @@ -0,0 +1,57 @@ +description: Oklahoma sets this monthly family share copayment, by adjusted monthly income, for a household of seven under the Child Care Subsidy Program. +# Thresholds are the lower bounds of the Appendix C-4 income bands; contiguous +# $0 bands are merged into the first bracket. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + threshold_period: month + period: month + label: Oklahoma Child Care Subsidy family share copayment for a household of seven + reference: + - title: OKDHS Appendix C-4, Child Care Eligibility/Copayment Chart + href: https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4.pdf#page=2 + - title: OAC 340:40-5-1(8)-(9) + href: https://okrules.elaws.us/oac/340:40-5-1 + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 3_344 + amount: + 2025-10-01: 232 + - threshold: + 2025-10-01: 3_454 + amount: + 2025-10-01: 255 + - threshold: + 2025-10-01: 3_838 + amount: + 2025-10-01: 282 + - threshold: + 2025-10-01: 4_222 + amount: + 2025-10-01: 309 + - threshold: + 2025-10-01: 4_605 + amount: + 2025-10-01: 336 + - threshold: + 2025-10-01: 4_989 + amount: + 2025-10-01: 363 + - threshold: + 2025-10-01: 5_373 + amount: + 2025-10-01: 390 + - threshold: + 2025-10-01: 5_757 + amount: + 2025-10-01: 416 + - threshold: + 2025-10-01: 6_140 + amount: + 2025-10-01: 443 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_8.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_8.yaml new file mode 100644 index 00000000000..1bdf431a9d6 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_8.yaml @@ -0,0 +1,53 @@ +description: Oklahoma sets this monthly family share copayment, by adjusted monthly income, for a household of eight under the Child Care Subsidy Program. +# Thresholds are the lower bounds of the Appendix C-4 income bands; contiguous +# $0 bands are merged into the first bracket. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + threshold_period: month + period: month + label: Oklahoma Child Care Subsidy family share copayment for a household of eight + reference: + - title: OKDHS Appendix C-4, Child Care Eligibility/Copayment Chart + href: https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4.pdf#page=2 + - title: OAC 340:40-5-1(8)-(9) + href: https://okrules.elaws.us/oac/340:40-5-1 + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 3_723 + amount: + 2025-10-01: 261 + - threshold: + 2025-10-01: 3_923 + amount: + 2025-10-01: 288 + - threshold: + 2025-10-01: 4_315 + amount: + 2025-10-01: 316 + - threshold: + 2025-10-01: 4_707 + amount: + 2025-10-01: 343 + - threshold: + 2025-10-01: 5_100 + amount: + 2025-10-01: 371 + - threshold: + 2025-10-01: 5_492 + amount: + 2025-10-01: 398 + - threshold: + 2025-10-01: 5_884 + amount: + 2025-10-01: 426 + - threshold: + 2025-10-01: 6_276 + amount: + 2025-10-01: 453 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_9.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_9.yaml new file mode 100644 index 00000000000..c1964af36eb --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_9.yaml @@ -0,0 +1,49 @@ +description: Oklahoma sets this monthly family share copayment, by adjusted monthly income, for a household of nine under the Child Care Subsidy Program. +# Thresholds are the lower bounds of the Appendix C-4 income bands; contiguous +# $0 bands are merged into the first bracket. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + threshold_period: month + period: month + label: Oklahoma Child Care Subsidy family share copayment for a household of nine + reference: + - title: OKDHS Appendix C-4, Child Care Eligibility/Copayment Chart + href: https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4.pdf#page=2 + - title: OAC 340:40-5-1(8)-(9) + href: https://okrules.elaws.us/oac/340:40-5-1 + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 4_101 + amount: + 2025-10-01: 295 + - threshold: + 2025-10-01: 4_409 + amount: + 2025-10-01: 323 + - threshold: + 2025-10-01: 4_810 + amount: + 2025-10-01: 351 + - threshold: + 2025-10-01: 5_211 + amount: + 2025-10-01: 379 + - threshold: + 2025-10-01: 5_612 + amount: + 2025-10-01: 407 + - threshold: + 2025-10-01: 6_012 + amount: + 2025-10-01: 435 + - threshold: + 2025-10-01: 6_413 + amount: + 2025-10-01: 463 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ccs/eligibility/child_age_limit.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/eligibility/child_age_limit.yaml new file mode 100644 index 00000000000..552c7515d1d --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/eligibility/child_age_limit.yaml @@ -0,0 +1,13 @@ +description: Oklahoma provides child care subsidies to children below this age under the Child Care Subsidy Program. +values: + 2017-10-01: 13 + +metadata: + unit: year + period: year + label: Oklahoma Child Care Subsidy child age limit + reference: + - title: OAC 340:40-7-3(a) + href: https://okrules.elaws.us/oac/340:40-7-3 + - title: OKDHS Appendix C-4-B, Child Care Provider Rate Schedule + href: https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4-b.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ccs/eligibility/disabled_child_age_limit.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/eligibility/disabled_child_age_limit.yaml new file mode 100644 index 00000000000..ef1a1aa38c0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/eligibility/disabled_child_age_limit.yaml @@ -0,0 +1,13 @@ +description: Oklahoma provides child care subsidies to children with disabilities or under court supervision below this age under the Child Care Subsidy Program. +values: + 2017-10-01: 19 + +metadata: + unit: year + period: year + label: Oklahoma Child Care Subsidy disabled child age limit + reference: + - title: OAC 340:40-7-3(b)-(c) + href: https://okrules.elaws.us/oac/340:40-7-3 + - title: OKDHS Appendix C-4-B, Child Care Provider Rate Schedule + href: https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4-b.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ccs/eligibility/minimum_weekly_work_hours.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/eligibility/minimum_weekly_work_hours.yaml new file mode 100644 index 00000000000..268623058d8 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/eligibility/minimum_weekly_work_hours.yaml @@ -0,0 +1,11 @@ +description: Oklahoma sets this threshold as the minimum weekly work hours under the Child Care Subsidy Program. +values: + 2025-02-10: 20 + +metadata: + unit: hour + period: week + label: Oklahoma CCS minimum weekly work hours + reference: + - title: OAC 340:40-7-8(a)(1) Employment + href: https://www.law.cornell.edu/regulations/oklahoma/OAC-340-40-7-8 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/child_earned_income_exclusion_age.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/child_earned_income_exclusion_age.yaml new file mode 100644 index 00000000000..98aae406fa2 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/child_earned_income_exclusion_age.yaml @@ -0,0 +1,11 @@ +description: Oklahoma excludes the earned income of children below this age who attend school from countable income under the Child Care Subsidy Program. +values: + 2023-01-01: 18 + +metadata: + unit: year + period: year + label: Oklahoma Child Care Subsidy child earned income exclusion age + reference: + - title: OAC 340:40-7-12(8) + href: https://okrules.elaws.us/oac/340:40-7-12 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/limit.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/limit.yaml new file mode 100644 index 00000000000..4c954923351 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/limit.yaml @@ -0,0 +1,57 @@ +description: Oklahoma limits adjusted monthly income to this amount, by household size, under the Child Care Subsidy Program. +# The limit is the top of the highest family share copayment band in +# Appendix C-4 for each family size; income above it closes the case. +# Households larger than ten use the ten-person threshold. +metadata: + type: single_amount + threshold_unit: person + amount_unit: currency-USD + period: month + label: Oklahoma Child Care Subsidy income limit + reference: + - title: OKDHS Appendix C-4, Child Care Eligibility/Copayment Chart + href: https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4.pdf#page=2 + - title: OAC 340:40-7-13 + href: https://okrules.elaws.us/oac/340:40-7-13 + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 3_460 + - threshold: + 2025-10-01: 2 + amount: + 2025-10-01: 4_525 + - threshold: + 2025-10-01: 3 + amount: + 2025-10-01: 5_589 + - threshold: + 2025-10-01: 4 + amount: + 2025-10-01: 6_654 + - threshold: + 2025-10-01: 5 + amount: + 2025-10-01: 7_718 + - threshold: + 2025-10-01: 6 + amount: + 2025-10-01: 8_783 + - threshold: + 2025-10-01: 7 + amount: + 2025-10-01: 8_983 + - threshold: + 2025-10-01: 8 + amount: + 2025-10-01: 9_182 + - threshold: + 2025-10-01: 9 + amount: + 2025-10-01: 9_382 + - threshold: + 2025-10-01: 10 + amount: + 2025-10-01: 9_582 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/sources.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/sources.yaml new file mode 100644 index 00000000000..df50f7aa8ff --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/sources.yaml @@ -0,0 +1,57 @@ +description: Oklahoma counts these income sources as countable income under the Child Care Subsidy Program. +values: + 2023-01-01: + # Earned income (OAC 340:40-7-11(b)): wages, including armed forces pay, + # commissions, tips, piece-rate payments, longevity payments, and cash + # bonuses, and self-employment income. Each tracked business income source + # is floored at zero per person because a business loss is not deducted + # from other household income (OAC 340:40-7-11(b)(3)(B)). The 50 percent + # business-expense standard deduction in the same subsection is not + # applied: self_employment_income is already net of actual expenses, and + # gross self-employment receipts are not tracked at the moment. + - ok_ccs_countable_earned_income + # Unearned income (OAC 340:40-7-11(c)). + # social_security already includes the disability, retirement, survivors, + # and dependents components. + - social_security + - unemployment_compensation + - workers_compensation + - child_support_received + - alimony_income + - dividend_income + - interest_income + # Annuities, pensions, retirement benefits, and disability benefits from + # government or private sources are unearned income (OAC + # 340:40-7-11(c)(2)). disability_benefits excludes Social Security + # disability (inside social_security) and workers' compensation, so the + # sources do not double-count. + - pension_income + - disability_benefits + # Veterans' compensation, pensions, and military allotments + # (OAC 340:40-7-11(c)(6)). + - veterans_benefits + # S corporation, limited partnership, and LLC profit shares are unearned + # income (OAC 340:40-7-11(c)(11)). ok_ccs_gross_income adds this source + # separately so each person's business loss is floored at zero. + # Temporary Assistance for Needy Families cash assistance is countable per + # OAC 340:40-7-11(c)(1) but is omitted here: TANF recipients are + # predetermined eligible with no family share copayment (OAC 340:40-7-1), + # so counting the TANF dollars has no effect on their eligibility, and + # including them would create a circular dependency with the TANF + # dependent care deduction. Oklahoma State Supplemental Payments and + # Refugee Resettlement Program cash assistance are not tracked at the + # moment. Supplemental Security Income is likewise countable unearned + # income (OAC 340:40-7-11(c)(3)) but omitted for the same reason: SSI + # recipients are predetermined eligible with no family share copayment, + # so the SSI dollars can never reach the income test or copayment lookup. + # Mineral and royalty payments (OAC 340:40-7-11(c)(8)), cash contributions + # over $30 per quarter (c)(7), and recurring lump sum or irregular income + # (c)(9)-(10) have no corresponding tracked income source at the moment. + +metadata: + unit: list + period: year + label: Oklahoma Child Care Subsidy countable income sources + reference: + - title: OAC 340:40-7-11 + href: https://www.law.cornell.edu/regulations/oklahoma/OAC-340-40-7-11 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ccs/rates/center.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/rates/center.yaml new file mode 100644 index 00000000000..e73a09867da --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/rates/center.yaml @@ -0,0 +1,143 @@ +description: Oklahoma provides these daily reimbursement rates for licensed child care centers under the Child Care Subsidy Program. +metadata: + period: day + unit: currency-USD + label: Oklahoma Child Care Subsidy child care center daily rates + breakdown: + - ok_ccs_star_level + - ok_ccs_center_age_group + - ok_ccs_time_category + reference: + - title: OKDHS Appendix C-4-B, Child Care Provider Rate Schedule + href: https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4-b.pdf#page=3 + +STAR_1: + MONTHS_0_TO_12: + FULL_TIME: + 2023-01-01: 20 + PART_TIME: + 2023-01-01: 14.5 + MONTHS_13_TO_24: + FULL_TIME: + 2023-01-01: 20 + PART_TIME: + 2023-01-01: 14.5 + MONTHS_25_TO_48: + FULL_TIME: + 2023-01-01: 17.2 + PART_TIME: + 2023-01-01: 11.5 + MONTHS_49_TO_72: + FULL_TIME: + 2023-01-01: 17 + PART_TIME: + 2023-01-01: 11.5 + MONTHS_73_PLUS: + FULL_TIME: + 2023-01-01: 13.8 + PART_TIME: + 2023-01-01: 9.5 +STAR_2: + MONTHS_0_TO_12: + FULL_TIME: + 2023-01-01: 22.8 + PART_TIME: + 2023-01-01: 15 + MONTHS_13_TO_24: + FULL_TIME: + 2023-01-01: 21.8 + PART_TIME: + 2023-01-01: 15 + MONTHS_25_TO_48: + FULL_TIME: + 2023-01-01: 19.6 + PART_TIME: + 2023-01-01: 12.8 + MONTHS_49_TO_72: + FULL_TIME: + 2023-01-01: 18.5 + PART_TIME: + 2023-01-01: 12.8 + MONTHS_73_PLUS: + FULL_TIME: + 2023-01-01: 16.1 + PART_TIME: + 2023-01-01: 10.7 +STAR_3: + MONTHS_0_TO_12: + FULL_TIME: + 2023-01-01: 38 + PART_TIME: + 2023-01-01: 23.4 + MONTHS_13_TO_24: + FULL_TIME: + 2023-01-01: 33.6 + PART_TIME: + 2023-01-01: 20.2 + MONTHS_25_TO_48: + FULL_TIME: + 2023-01-01: 31.5 + PART_TIME: + 2023-01-01: 18.9 + MONTHS_49_TO_72: + FULL_TIME: + 2023-01-01: 22.8 + PART_TIME: + 2023-01-01: 15 + MONTHS_73_PLUS: + FULL_TIME: + 2023-01-01: 18.8 + PART_TIME: + 2023-01-01: 12.8 +STAR_4: + MONTHS_0_TO_12: + FULL_TIME: + 2023-01-01: 44 + PART_TIME: + 2023-01-01: 26.4 + MONTHS_13_TO_24: + FULL_TIME: + 2023-01-01: 41.8 + PART_TIME: + 2023-01-01: 25.2 + MONTHS_25_TO_48: + FULL_TIME: + 2023-01-01: 35.9 + PART_TIME: + 2023-01-01: 21.9 + MONTHS_49_TO_72: + FULL_TIME: + 2023-01-01: 25.2 + PART_TIME: + 2023-01-01: 16.1 + MONTHS_73_PLUS: + FULL_TIME: + 2023-01-01: 20.7 + PART_TIME: + 2023-01-01: 12.8 +STAR_5: + MONTHS_0_TO_12: + FULL_TIME: + 2023-01-01: 50.6 + PART_TIME: + 2023-01-01: 30.4 + MONTHS_13_TO_24: + FULL_TIME: + 2023-01-01: 48.1 + PART_TIME: + 2023-01-01: 29 + MONTHS_25_TO_48: + FULL_TIME: + 2023-01-01: 41.3 + PART_TIME: + 2023-01-01: 25.2 + MONTHS_49_TO_72: + FULL_TIME: + 2023-01-01: 29 + PART_TIME: + 2023-01-01: 18.5 + MONTHS_73_PLUS: + FULL_TIME: + 2023-01-01: 23.8 + PART_TIME: + 2023-01-01: 14.7 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ccs/rates/home.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/rates/home.yaml new file mode 100644 index 00000000000..a4c8aa4bcca --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/rates/home.yaml @@ -0,0 +1,118 @@ +description: Oklahoma provides these daily reimbursement rates for licensed child care homes under the Child Care Subsidy Program. +metadata: + period: day + unit: currency-USD + label: Oklahoma Child Care Subsidy child care home daily rates + breakdown: + - ok_ccs_star_level + - ok_ccs_home_age_group + - ok_ccs_time_category + reference: + - title: OKDHS Appendix C-4-B, Child Care Provider Rate Schedule + href: https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4-b.pdf#page=3 + +STAR_1: + MONTHS_0_TO_24: + FULL_TIME: + 2023-01-01: 20 + PART_TIME: + 2023-01-01: 13.7 + MONTHS_25_TO_48: + FULL_TIME: + 2023-01-01: 17.2 + PART_TIME: + 2023-01-01: 11.2 + MONTHS_49_TO_72: + FULL_TIME: + 2023-01-01: 16.2 + PART_TIME: + 2023-01-01: 11.2 + MONTHS_73_PLUS: + FULL_TIME: + 2023-01-01: 13 + PART_TIME: + 2023-01-01: 8 +STAR_2: + MONTHS_0_TO_24: + FULL_TIME: + 2023-01-01: 20.7 + PART_TIME: + 2023-01-01: 13.9 + MONTHS_25_TO_48: + FULL_TIME: + 2023-01-01: 18.5 + PART_TIME: + 2023-01-01: 12.8 + MONTHS_49_TO_72: + FULL_TIME: + 2023-01-01: 18.5 + PART_TIME: + 2023-01-01: 12.8 + MONTHS_73_PLUS: + FULL_TIME: + 2023-01-01: 13.7 + PART_TIME: + 2023-01-01: 9.6 +STAR_3: + MONTHS_0_TO_24: + FULL_TIME: + 2023-01-01: 28.6 + PART_TIME: + 2023-01-01: 18.2 + MONTHS_25_TO_48: + FULL_TIME: + 2023-01-01: 26.5 + PART_TIME: + 2023-01-01: 16.7 + MONTHS_49_TO_72: + FULL_TIME: + 2023-01-01: 22.8 + PART_TIME: + 2023-01-01: 15 + MONTHS_73_PLUS: + FULL_TIME: + 2023-01-01: 18.2 + PART_TIME: + 2023-01-01: 11.8 +STAR_4: + MONTHS_0_TO_24: + FULL_TIME: + 2023-01-01: 39.5 + PART_TIME: + 2023-01-01: 25.7 + MONTHS_25_TO_48: + FULL_TIME: + 2023-01-01: 36 + PART_TIME: + 2023-01-01: 22.1 + MONTHS_49_TO_72: + FULL_TIME: + 2023-01-01: 26.6 + PART_TIME: + 2023-01-01: 17.1 + MONTHS_73_PLUS: + FULL_TIME: + 2023-01-01: 20.7 + PART_TIME: + 2023-01-01: 12.8 +STAR_5: + MONTHS_0_TO_24: + FULL_TIME: + 2023-01-01: 45.4 + PART_TIME: + 2023-01-01: 29.6 + MONTHS_25_TO_48: + FULL_TIME: + 2023-01-01: 41.4 + PART_TIME: + 2023-01-01: 25.4 + MONTHS_49_TO_72: + FULL_TIME: + 2023-01-01: 30.6 + PART_TIME: + 2023-01-01: 19.7 + MONTHS_73_PLUS: + FULL_TIME: + 2023-01-01: 23.8 + PART_TIME: + 2023-01-01: 14.7 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ccs/rates/in_home_rate_ratio.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/rates/in_home_rate_ratio.yaml new file mode 100644 index 00000000000..258bddc249c --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/rates/in_home_rate_ratio.yaml @@ -0,0 +1,11 @@ +description: Oklahoma pays this share of the one-star child care home rate for care provided in the child's own home under the Child Care Subsidy Program. +values: + 2023-01-01: 0.9 + +metadata: + unit: /1 + period: year + label: Oklahoma Child Care Subsidy in-home care rate ratio + reference: + - title: OKDHS Appendix C-4-B, Child Care Provider Rate Schedule + href: https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4-b.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ok/dhs/ccs/time_category/max_part_time_hours.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/time_category/max_part_time_hours.yaml new file mode 100644 index 00000000000..9ed6585ffb7 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/time_category/max_part_time_hours.yaml @@ -0,0 +1,11 @@ +description: Oklahoma approves the part-time daily unit type when the child needs care for at most this number of hours per day under the Child Care Subsidy Program. +values: + 2023-01-01: 4 + +metadata: + unit: hour + period: day + label: Oklahoma Child Care Subsidy maximum part-time hours per day + reference: + - title: OKDHS Appendix C-4-B, Child Care Provider Rate Schedule + href: https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4-b.pdf#page=1 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index a5114d95d5e..45ae5e49dd2 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -460,7 +460,7 @@ programs: category: Benefits agency: HHS status: partial - coverage: AK, AR, AL, AZ, CA, CO, CT, DE, DC, FL, GA, HI, IA, ID, IL, IN, KS, KY, LA, MA, MD, ME, MI, MN, MO, MS, MT, NC, ND, NE, NH, NJ, NM, NV, PA, RI, SC, TX, VA, VT, WA, WV + coverage: AK, AR, AL, AZ, CA, CO, CT, DE, DC, FL, GA, HI, IA, ID, IL, IN, KS, KY, LA, MA, MD, ME, MI, MN, MO, MS, MT, NC, ND, NE, NH, NJ, NM, NV, OK, PA, RI, SC, TX, VA, VT, WA, WV state_implementations: - state: AK status: complete @@ -702,6 +702,12 @@ programs: full_name: New Mexico Child Care Assistance Program variable: nm_ccap parameter_prefix: gov.states.nm.ececd.ccap + - state: OK + status: complete + name: Oklahoma Child Care Subsidy + full_name: Oklahoma Child Care Subsidy Program + variable: ok_ccs + parameter_prefix: gov.states.ok.dhs.ccs - id: head_start name: Head Start diff --git a/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/integration.yaml new file mode 100644 index 00000000000..fbeee1e3851 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/integration.yaml @@ -0,0 +1,303 @@ +- name: Case 1, single working parent with one child in a three-star center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 30_000 # $2,500/month. + person2: + age: 3 + ok_ccs_star_level: STAR_3 + childcare_hours_per_day: 8 + childcare_attending_days_per_month: 20 + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 12_000 # $1,000/month. + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_countable_income: 2_500 + ok_ccs_income_eligible: true + ok_ccs_eligible: true + # Household of two, $2,320-$2,512 band. + ok_ccs_copay: 169 + # Daily rate 31.50 (25-48 months, full-time) * 20 days = 630. + # min(630, 1,000 expenses) - 169 copay = 461. + ok_ccs: 461 + +- name: Case 2, TANF household pays no copayment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 1 + ok_ccs_provider_setting: CHILD_CARE_HOME + childcare_hours_per_day: 8 + childcare_attending_days_per_month: 15 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + meets_ccdf_activity_test: true # Approved TANF Work activity. + spm_unit_pre_subsidy_childcare_expenses: 6_000 # $500/month. + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_predetermined_eligible: true + ok_ccs_eligible: true + ok_ccs_copay: 0 + # One-star home rate 20.00 (0-24 months, full-time) * 15 days = 300. + # min(300, 500 expenses) - 0 copay = 300. + ok_ccs: 300 + +- name: Case 3, household above the income threshold is ineligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 60_000 # $5,000/month, above $4,525. + person2: + age: 3 + childcare_hours_per_day: 8 + childcare_attending_days_per_month: 20 + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 12_000 + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_income_eligible: false + ok_ccs_eligible: false + ok_ccs: 0 + +- name: Case 4, benefit is capped at the family's child care expenses. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 30_000 # $2,500/month. + person2: + age: 3 + ok_ccs_star_level: STAR_3 + childcare_hours_per_day: 8 + childcare_attending_days_per_month: 20 + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 2_400 # $200/month. + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_copay: 169 + # min(630 rate, 200 expenses) - 169 copay = 31. + ok_ccs: 31 + +- name: Case 5, a self-employment loss does not inflate the benefit. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + self_employment_income: -60_000 # -$5,000/month. + person2: + age: 3 + childcare_hours_per_day: 8 + childcare_attending_days_per_month: 20 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true # Isolates the business-loss calculation. + spm_unit_pre_subsidy_childcare_expenses: 6_000 # $500/month. + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_countable_income: 0 + ok_ccs_copay: 0 + ok_ccs_eligible: true + # One-star center rate 17.20 (25-48 months, full-time) * 20 days = 344. + # min(344, 500 expenses) - 0 copay = 344, not inflated by negative income. + ok_ccs: 344 + +- name: Case 6, two-parent household with one parent not in an activity is ineligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + person2: + age: 28 + person3: + age: 3 + childcare_hours_per_day: 8 + childcare_attending_days_per_month: 20 + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_pre_subsidy_childcare_expenses: 12_000 + households: + household: + members: [person1, person2, person3] + state_code: OK + output: + ok_ccs_activity_eligible: false + ok_ccs_eligible: false + ok_ccs: 0 + +- name: Case 7, household with only a 13-year-old child is ineligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + person2: + age: 13 + childcare_hours_per_day: 8 + childcare_attending_days_per_month: 20 + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 12_000 + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_eligible: false + ok_ccs: 0 + +- name: Case 8, non-Oklahoma household receives nothing. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + person2: + age: 3 + childcare_hours_per_day: 8 + childcare_attending_days_per_month: 20 + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 12_000 + households: + household: + members: [person1, person2] + state_code: TX + output: + ok_ccs_eligible: false + ok_ccs: 0 + +- name: Case 9, the expense cap applies at the family level across two children. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 30_000 # $2,500/month. + person2: + age: 3 + ok_ccs_star_level: STAR_1 + childcare_hours_per_day: 8 + childcare_attending_days_per_month: 20 + person3: + age: 0 + ok_ccs_star_level: STAR_5 + childcare_hours_per_day: 8 + childcare_attending_days_per_month: 20 + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_pre_subsidy_childcare_expenses: 12_000 # $1,000/month. + households: + household: + members: [person1, person2, person3] + state_code: OK + output: + # Household of three, $2,389-$2,626 band. + ok_ccs_copay: 176 + # Rates: 17.20 * 20 = 344 (person2) + 50.60 * 20 = 1,012 (person3) + # = 1,356. The cap binds on the family's $1,000 total expenses, not on + # each child's even $500 share (which would give 344 + 500 = 844). + # min(1,356, 1,000) - 176 copay = 824. + ok_ccs: 824 + +- name: Case 10, predetermined eligibility overrides a failing income test. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 72_000 # $6,000/month, above the $4,525 size-2 limit. + person2: + age: 3 + ok_ccs_star_level: STAR_3 + childcare_hours_per_day: 8 + childcare_attending_days_per_month: 20 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + spm_unit_pre_subsidy_childcare_expenses: 12_000 # $1,000/month. + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_countable_income: 6_000 + ok_ccs_income_eligible: false + ok_ccs_predetermined_eligible: true + # TANF enrollment keeps the household eligible despite failing the + # income test (OAC 340:40-7-1), with no family share copayment. + ok_ccs_eligible: true + ok_ccs_copay: 0 + # Daily rate 31.50 (25-48 months, full-time) * 20 days = 630. + # min(630, 1,000 expenses) - 0 copay = 630. + ok_ccs: 630 + +- name: Case 11, household with no children is ineligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: OK + output: + ok_ccs_eligible: false + ok_ccs: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_activity_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_activity_eligible.yaml new file mode 100644 index 00000000000..a3e6941dc7d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_activity_eligible.yaml @@ -0,0 +1,291 @@ +# Need factor per OAC 340:40-7-8: each parent or caretaker must be employed +# or attending an education or training program, with TANF, protective or +# preventive child care, and CCDF activity-test pathways. +- name: Case 1, single working parent meets the need factor. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 24_000 # $2,000/month. + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_activity_eligible: true + +- name: Case 2, two-parent household where one parent is not in an activity. + period: 2026-01 + input: + people: + person1: + age: 30 + is_tax_unit_head: true + employment_income: 24_000 # $2,000/month. + person2: + age: 28 + is_tax_unit_spouse: true + person3: + age: 4 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: OK + output: + ok_ccs_activity_eligible: false + +- name: Case 3, working parent and full-time student spouse both meet the need factor. + period: 2026-01 + input: + people: + person1: + age: 30 + is_tax_unit_head: true + employment_income: 24_000 # $2,000/month. + person2: + age: 28 + is_tax_unit_spouse: true + is_full_time_student: true + person3: + age: 4 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: OK + output: + ok_ccs_activity_eligible: true + +- name: Case 4, a self-employment loss does not establish employment. + period: 2026-01 + input: + people: + person1: + age: 30 + self_employment_income: -6_000 # -$500/month. + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_activity_eligible: false + +- name: Case 5, TANF enrollment without an approved activity does not meet the need factor. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_activity_eligible: false + +- name: Case 6, non-working parent receiving protective services meets the need factor. + period: 2026-01 + input: + people: + person1: + age: 30 + receives_or_needs_protective_services: true + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_activity_eligible: true + +- name: Case 7, non-working household meeting the CCDF activity test meets the need factor. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_activity_eligible: true + +- name: Case 8, non-working single parent with no qualifying pathway. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_activity_eligible: false + +- name: Case 9, employment at the hours and minimum-wage boundaries qualifies. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 7_540 # 20 hours/week * 52 weeks * $7.25/hour. + weekly_hours_worked_before_lsr: 20 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_activity_eligible: true + +- name: Case 10, employment below 20 hours per week does not qualify. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + weekly_hours_worked_before_lsr: 19 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_activity_eligible: false + +- name: Case 11, earnings below minimum wage do not establish employment. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 7_280 # 20 hours/week * 52 weeks * $7/hour. + weekly_hours_worked_before_lsr: 20 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_activity_eligible: false + +- name: Case 12, two non-working college-student parents do not qualify. + period: 2026-01 + input: + people: + person1: + age: 30 + is_tax_unit_head: true + is_full_time_college_student: true + person2: + age: 28 + is_tax_unit_spouse: true + is_full_time_college_student: true + person3: + age: 4 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: OK + output: + ok_ccs_activity_eligible: false + +- name: Case 13, an inactive dependent minor parent must meet a need factor. + period: 2026-01 + input: + people: + person1: + age: 45 + is_tax_unit_head: true + employment_income: 24_000 + person2: + age: 16 + is_parent: true + is_in_k12_school: false + is_full_time_student: false + person3: + age: 1 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: OK + output: + ok_ccs_activity_eligible: false + +- name: Case 14, qualifying farm earnings establish employment. + period: 2026-01 + input: + people: + person1: + age: 30 + farm_operations_income: 7_540 + weekly_hours_worked_before_lsr: 20 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_activity_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_copay.yaml b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_copay.yaml new file mode 100644 index 00000000000..5f5a282555c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_copay.yaml @@ -0,0 +1,205 @@ +# Family share copayments per OKDHS Appendix C-4 (10/1/2025). +- name: Case 1, household of two with $2,000 adjusted monthly income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 # $2,000/month. + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + # $1,934-$2,126 band for a household of two. + ok_ccs_copay: 142 + +- name: Case 2, low-income household of two pays no copayment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 14_400 # $1,200/month, below $1,453. + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_copay: 0 + +- name: Case 3, household of four with $3,000 adjusted monthly income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 36_000 # $3,000/month. + person2: + age: 28 + person3: + age: 4 + person4: + age: 2 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: OK + output: + # $2,843-$3,126 band for a household of four. + ok_ccs_copay: 209 + +- name: Case 4, TANF household is predetermined eligible with no copayment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_copay: 0 + +- name: Case 5, SSI recipient household is predetermined eligible with no copayment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + ssi: 500 + employment_income: 24_000 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_copay: 0 + +- name: Case 6, income just below a band boundary rounds up into the higher band. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 17_431.2 # $1,452.60/month, rounds to $1,453. + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + # $1,453-$1,546 band for a household of two. + ok_ccs_copay: 90 + +- name: Case 7, household of ten with $5,000 adjusted monthly income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 60_000 # $5,000/month. + person2: + age: 28 + person3: + age: 12 + person4: + age: 10 + person5: + age: 9 + person6: + age: 8 + person7: + age: 7 + person8: + age: 6 + person9: + age: 5 + person10: + age: 4 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10] + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10] + state_code: OK + output: + # $4,913-$5,321 band for a household of ten. + ok_ccs_copay: 358 + +- name: Case 8, household of eleven uses the ten-person copayment schedule. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 60_000 # $5,000/month. + person2: + age: 28 + person3: + age: 12 + person4: + age: 11 + person5: + age: 10 + person6: + age: 9 + person7: + age: 8 + person8: + age: 7 + person9: + age: 6 + person10: + age: 5 + person11: + age: 4 + 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: OK + output: + # $4,913-$5,321 band on the ten-person schedule. + ok_ccs_copay: 358 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_countable_income.yaml new file mode 100644 index 00000000000..fbec6d05468 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_countable_income.yaml @@ -0,0 +1,258 @@ +- name: Case 1, child support paid is deducted from gross income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 # $2,000/month. + child_support_expense: 2_400 # $200/month. + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + # 2,000 - 200 = 1,800. + ok_ccs_countable_income: 1_800 + +- name: Case 2, earnings of a minor child are excluded. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 # $2,000/month. + person2: + age: 16 + employment_income: 12_000 # $1,000/month, excluded. + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + # 3,000 - 1,000 = 2,000. + ok_ccs_countable_income: 2_000 + +- name: Case 3, a self-employment loss cannot produce negative income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + self_employment_income: -12_000 # -$1,000/month. + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_countable_income: 0 + +- name: Case 4, unearned income counts. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + social_security: 12_000 # $1,000/month. + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_countable_income: 1_000 + +- name: Case 5, pension, veterans, and rental income count. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pension_income: 6_000 # $500/month. + veterans_benefits: 3_600 # $300/month. + rental_income: 2_400 # $200/month. + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + # 500 + 300 + 200 = 1,000. + ok_ccs_countable_income: 1_000 + +- name: Case 6, adjusted monthly income is rounded to the nearest dollar. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 17_431.2 # $1,452.60/month. + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_countable_income: 1_453 + +- name: Case 7, an exact half dollar rounds up, not to the even dollar. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 17_430 # $1,452.50/month. + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_countable_income: 1_453 + +- name: Case 8, a self-employment loss does not reduce other household income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 # $2,000/month. + person2: + age: 28 + self_employment_income: -12_000 # -$1,000/month loss, floored to $0. + person3: + age: 4 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: OK + output: + # 2,000 + 0 = 2,000; the loss is not deducted per OAC 340:40-7-11(b)(3)(B). + ok_ccs_countable_income: 2_000 + +- name: Case 9, a rental loss does not reduce other household income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 # $2,000/month. + person2: + age: 28 + rental_income: -12_000 # -$1,000/month loss, floored to $0. + person3: + age: 4 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: OK + output: + ok_ccs_countable_income: 2_000 + +- name: Case 10, a partnership loss does not reduce other household income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 # $2,000/month. + person2: + age: 28 + partnership_s_corp_income: -12_000 # -$1,000/month loss. + person3: + age: 4 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: OK + output: + ok_ccs_countable_income: 2_000 + +- name: Case 11, SSTB and farm operations profits count as earned income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + sstb_self_employment_income: 6_000 # $500/month. + farm_operations_income: 8_400 # $700/month. + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_countable_income: 1_200 + +- name: Case 12, one business loss does not offset another business profit. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + sstb_self_employment_income: -6_000 # -$500/month loss. + farm_operations_income: 8_400 # $700/month profit. + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_countable_income: 700 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_daily_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_daily_rate.yaml new file mode 100644 index 00000000000..8a712bf7946 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_daily_rate.yaml @@ -0,0 +1,206 @@ +# Daily rates per OKDHS Appendix C-4-B (1/1/2023). +- name: Case 1, three-star center full-time rate for a three-year-old. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 3 + ok_ccs_star_level: STAR_3 + childcare_hours_per_day: 8 + households: + household: + members: [person1] + state_code: OK + output: + # 25-48 months, full-time. + ok_ccs_daily_rate: 31.5 + +- name: Case 2, three-star center part-time rate for a three-year-old. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 3 + ok_ccs_star_level: STAR_3 + childcare_hours_per_day: 4 + households: + household: + members: [person1] + state_code: OK + output: + # 25-48 months, part-time (four or fewer hours per day). + ok_ccs_daily_rate: 18.9 + +- name: Case 3, five-star home full-time rate for an infant. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 0 + ok_ccs_star_level: STAR_5 + ok_ccs_provider_setting: CHILD_CARE_HOME + childcare_hours_per_day: 8 + households: + household: + members: [person1] + state_code: OK + output: + # 0-24 months, full-time. + ok_ccs_daily_rate: 45.4 + +- name: Case 4, two-star home full-time rate for a school-age child. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 8 + ok_ccs_star_level: STAR_2 + ok_ccs_provider_setting: CHILD_CARE_HOME + childcare_hours_per_day: 8 + households: + household: + members: [person1] + state_code: OK + output: + # 73 months to 13 years, full-time. + ok_ccs_daily_rate: 13.7 + +- name: Case 5, in-home care pays 90 percent of the one-star home rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 8 + ok_ccs_provider_setting: IN_HOME + childcare_hours_per_day: 8 + households: + household: + members: [person1] + state_code: OK + output: + # 0.9 * 13.00 = 11.70. + ok_ccs_daily_rate: 11.7 + +- name: Case 6, four-star center full-time rate for an 18-month-old. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 1.5 + ok_ccs_star_level: STAR_4 + childcare_hours_per_day: 8 + households: + household: + members: [person1] + state_code: OK + output: + # 13-24 months, full-time. + ok_ccs_daily_rate: 41.8 + +- name: Case 7, unset hours per day default to the full-time rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 3 + ok_ccs_star_level: STAR_3 + households: + household: + members: [person1] + state_code: OK + output: + # 25-48 months, full-time (zero hours means unset, not part-time). + ok_ccs_daily_rate: 31.5 + +- name: Case 8, a child aged 13 receives no rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 13 + ok_ccs_star_level: STAR_3 + childcare_hours_per_day: 8 + households: + household: + members: [person1] + state_code: OK + output: + ok_ccs_daily_rate: 0 + +- name: Case 9, three-star center full-time rate for a five-year-old. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 5 + ok_ccs_star_level: STAR_3 + childcare_hours_per_day: 8 + households: + household: + members: [person1] + state_code: OK + output: + # 49-72 months, full-time. + ok_ccs_daily_rate: 22.8 + +- name: Case 10, three-star center full-time rate for an eight-year-old. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 8 + ok_ccs_star_level: STAR_3 + childcare_hours_per_day: 8 + households: + household: + members: [person1] + state_code: OK + output: + # 73 months to 13 years, full-time. + ok_ccs_daily_rate: 18.8 + +- name: Case 11, three-star home full-time rate for a three-year-old. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 3 + ok_ccs_star_level: STAR_3 + ok_ccs_provider_setting: CHILD_CARE_HOME + childcare_hours_per_day: 8 + households: + household: + members: [person1] + state_code: OK + output: + # 25-48 months, full-time. + ok_ccs_daily_rate: 26.5 + +- name: Case 12, three-star home full-time rate for a five-year-old. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 5 + ok_ccs_star_level: STAR_3 + ok_ccs_provider_setting: CHILD_CARE_HOME + childcare_hours_per_day: 8 + households: + household: + members: [person1] + state_code: OK + output: + # 49-72 months, full-time. + ok_ccs_daily_rate: 22.8 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_eligible_child.yaml b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_eligible_child.yaml new file mode 100644 index 00000000000..4e2c1a77009 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_eligible_child.yaml @@ -0,0 +1,67 @@ +- name: Case 1, child under 13 is eligible. + period: 2026-01 + input: + people: + person1: + age: 12 + households: + household: + members: [person1] + state_code: OK + output: + ok_ccs_eligible_child: true + +- name: Case 2, child aged 13 is not eligible. + period: 2026-01 + input: + people: + person1: + age: 13 + households: + household: + members: [person1] + state_code: OK + output: + ok_ccs_eligible_child: false + +- name: Case 3, disabled child aged 18 is eligible. + period: 2026-01 + input: + people: + person1: + age: 18 + is_disabled: true + households: + household: + members: [person1] + state_code: OK + output: + ok_ccs_eligible_child: true + +- name: Case 4, disabled child aged 19 is not eligible. + period: 2026-01 + input: + people: + person1: + age: 19 + is_disabled: true + households: + household: + members: [person1] + state_code: OK + output: + ok_ccs_eligible_child: false + +- name: Case 5, undocumented child is not eligible. + period: 2026-01 + input: + people: + person1: + age: 5 + immigration_status: UNDOCUMENTED + households: + household: + members: [person1] + state_code: OK + output: + ok_ccs_eligible_child: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_income_eligible.yaml new file mode 100644 index 00000000000..7f838d34a51 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_income_eligible.yaml @@ -0,0 +1,151 @@ +# Income thresholds per OKDHS Appendix C-4 (10/1/2025): $4,525/month for a +# household of two, $5,589 for a household of three. +- name: Case 1, household of two below the threshold is eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 54_000 # $4,500/month, below $4,525. + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_income_eligible: true + +- name: Case 2, household of two above the threshold is not eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 55_200 # $4,600/month, above $4,525. + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_income_eligible: false + +- name: Case 3, household of three below the threshold is eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 66_000 # $5,500/month, below $5,589. + person2: + age: 28 + person3: + age: 4 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: OK + output: + ok_ccs_income_eligible: true + +- name: Case 4, household of two exactly at the threshold is eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 54_300 # $4,525/month, exactly at $4,525. + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_income_eligible: true + +- name: Case 5, household of ten exactly at the ten-person threshold is eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 114_984 # $9,582/month, exactly at $9,582. + person2: + age: 28 + person3: + age: 12 + person4: + age: 10 + person5: + age: 9 + person6: + age: 8 + person7: + age: 7 + person8: + age: 6 + person9: + age: 5 + person10: + age: 4 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10] + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10] + state_code: OK + output: + ok_ccs_income_eligible: true + +- name: Case 6, household of eleven above the ten-person threshold is not eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 114_996 # $9,583/month, above the $9,582 ten-person limit. + person2: + age: 28 + person3: + age: 12 + person4: + age: 11 + person5: + age: 10 + person6: + age: 9 + person7: + age: 8 + person8: + age: 7 + person9: + age: 6 + person10: + age: 5 + person11: + age: 4 + 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: OK + output: + ok_ccs_income_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_predetermined_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_predetermined_eligible.yaml new file mode 100644 index 00000000000..f01a44eff97 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_predetermined_eligible.yaml @@ -0,0 +1,58 @@ +# Predetermined eligibility per OAC 340:40-7-1(b)(1): households receiving +# TANF or Supplemental Security Income. +- name: Case 1, TANF-enrolled household is predetermined eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_predetermined_eligible: true + +- name: Case 2, SSI recipient household is predetermined eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + ssi: 500 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_predetermined_eligible: true + +- name: Case 3, household with neither TANF nor SSI is not predetermined eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: OK + output: + ok_ccs_predetermined_eligible: false diff --git a/policyengine_us/variables/gov/states/ok/dhs/ccs/copay/ok_ccs_copay.py b/policyengine_us/variables/gov/states/ok/dhs/ccs/copay/ok_ccs_copay.py new file mode 100644 index 00000000000..31dfa918614 --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/copay/ok_ccs_copay.py @@ -0,0 +1,31 @@ +from policyengine_us.model_api import * + + +class ok_ccs_copay(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "Oklahoma Child Care Subsidy family share copayment" + definition_period = MONTH + defined_for = StateCode.OK + reference = ( + "https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4.pdf#page=2", + "https://okrules.elaws.us/oac/340:40-5-1", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ok.dhs.ccs.copay + # The monthly family share copayment is read from the Appendix C-4 + # schedule by adjusted monthly income and family size. Households + # larger than the largest published size (10) use the size-10 column. + income = spm_unit("ok_ccs_countable_income", period) + size = spm_unit("spm_unit_size", period.this_year) + copay = select( + [size == n for n in range(1, 10)], + [getattr(p.amount, f"size_{n}").calc(income) for n in range(1, 10)], + default=p.amount.size_10.calc(income), + ) + # Predetermined eligible households (public assistance or SSI + # recipients) have no family share copayment (OAC 340:40-7-1(b)(1)). + predetermined = spm_unit("ok_ccs_predetermined_eligible", period) + return where(predetermined, 0, copay) diff --git a/policyengine_us/variables/gov/states/ok/dhs/ccs/eligibility/ok_ccs_activity_eligible.py b/policyengine_us/variables/gov/states/ok/dhs/ccs/eligibility/ok_ccs_activity_eligible.py new file mode 100644 index 00000000000..619a75f1fbe --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/eligibility/ok_ccs_activity_eligible.py @@ -0,0 +1,71 @@ +from policyengine_us.model_api import * + + +class ok_ccs_activity_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Oklahoma Child Care Subsidy activity eligible" + definition_period = MONTH + defined_for = StateCode.OK + reference = ( + "https://www.law.cornell.edu/regulations/oklahoma/OAC-340-40-7-7", + "https://www.law.cornell.edu/regulations/oklahoma/OAC-340-40-7-8", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ok.dhs.ccs.eligibility + person = spm_unit.members + is_parent_or_caretaker = person( + "is_tax_unit_head_or_spouse", period.this_year + ) | person("is_parent", period.this_year) + weekly_hours = person("weekly_hours_worked_before_lsr", period.this_year) + monthly_hours = weekly_hours * WEEKS_IN_YEAR / MONTHS_IN_YEAR + monthly_earned_income = person("ok_ccs_countable_earned_income", period) + effective_hourly_earnings = np.divide( + monthly_earned_income, + monthly_hours, + out=np.zeros_like(monthly_earned_income), + where=monthly_hours > 0, + ) + min_wage = parameters(period).gov.dol.minimum_wage + is_working = (weekly_hours >= p.minimum_weekly_work_hours) & ( + effective_hourly_earnings >= min_wage + ) + is_student = person("is_full_time_student", period.this_year) + is_in_k12_school = person("is_in_k12_school", period.this_year) + + parent_or_caretaker_count = spm_unit.sum(is_parent_or_caretaker) + all_in_activity = ( + spm_unit.sum(is_parent_or_caretaker & ~(is_working | is_student)) == 0 + ) + has_working_parent_or_caretaker = ( + spm_unit.sum(is_parent_or_caretaker & is_working) > 0 + ) + has_k12_parent_or_caretaker = ( + spm_unit.sum(is_parent_or_caretaker & is_in_k12_school) > 0 + ) + education_pair_allowed = ( + (parent_or_caretaker_count == 1) + | has_working_parent_or_caretaker + | has_k12_parent_or_caretaker + ) + modeled_eligible = ( + (parent_or_caretaker_count > 0) & all_in_activity & education_pair_allowed + ) + # Protective or preventive child care covers families experiencing + # homelessness, medical hardship, or natural disasters; the 30-day + # initial approval limit is not tracked at the moment. + protective = ( + add( + spm_unit, + period.this_year, + ["receives_or_needs_protective_services"], + ) + > 0 + ) + # Fall back to the CCDF activity-test input for approved activities not + # individually modeled (SNAP E&T assigned activities and the + # enrichment pathway for children receiving SSI, approved TANF Work + # activities, and activity schedule overlap; OAC 340:40-7-7 and -7-8). + meets_ccdf = spm_unit("meets_ccdf_activity_test", period.this_year) + return modeled_eligible | protective | meets_ccdf diff --git a/policyengine_us/variables/gov/states/ok/dhs/ccs/eligibility/ok_ccs_eligible.py b/policyengine_us/variables/gov/states/ok/dhs/ccs/eligibility/ok_ccs_eligible.py new file mode 100644 index 00000000000..cad30f9f826 --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/eligibility/ok_ccs_eligible.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class ok_ccs_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Oklahoma Child Care Subsidy eligible" + definition_period = MONTH + defined_for = StateCode.OK + reference = "https://okrules.elaws.us/oac/340:40-7-1" + + def formula(spm_unit, period, parameters): + has_eligible_child = add(spm_unit, period, ["ok_ccs_eligible_child"]) > 0 + # Households receiving public assistance or Supplemental Security + # Income are predetermined eligible; all other households must meet + # the Appendix C-4 income threshold (OAC 340:40-7-1). + predetermined = spm_unit("ok_ccs_predetermined_eligible", period) + income_eligible = spm_unit("ok_ccs_income_eligible", period) + activity_eligible = spm_unit("ok_ccs_activity_eligible", period) + return ( + has_eligible_child & (predetermined | income_eligible) & activity_eligible + ) diff --git a/policyengine_us/variables/gov/states/ok/dhs/ccs/eligibility/ok_ccs_eligible_child.py b/policyengine_us/variables/gov/states/ok/dhs/ccs/eligibility/ok_ccs_eligible_child.py new file mode 100644 index 00000000000..560eaad235f --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/eligibility/ok_ccs_eligible_child.py @@ -0,0 +1,32 @@ +from policyengine_us.model_api import * + + +class ok_ccs_eligible_child(Variable): + value_type = bool + entity = Person + label = "Oklahoma Child Care Subsidy eligible child" + definition_period = MONTH + defined_for = StateCode.OK + reference = ( + "https://okrules.elaws.us/oac/340:40-7-3", + "https://okrules.elaws.us/oac/340:40-7-5", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.ok.dhs.ccs.eligibility + age = person("age", period.this_year) + # A child is eligible through the day before their 13th birthday; a + # child with disabilities or under court supervision is eligible + # through the day before their 19th birthday (OAC 340:40-7-3). + # is_disabled proxies the OAC 340:40-7-3.1 disability verification; + # the court supervision pathway and the grace period through the next + # renewal after the birthday are not tracked at the moment. + is_disabled = person("is_disabled", period.this_year) + age_limit = where(is_disabled, p.disabled_child_age_limit, p.child_age_limit) + age_eligible = age < age_limit + # Only the child for whom care is requested must meet citizenship + # and alienage requirements (OAC 340:40-7-5(c)). + immigration_eligible = person( + "is_ccdf_immigration_eligible_child", period.this_year + ) + return age_eligible & immigration_eligible diff --git a/policyengine_us/variables/gov/states/ok/dhs/ccs/eligibility/ok_ccs_income_eligible.py b/policyengine_us/variables/gov/states/ok/dhs/ccs/eligibility/ok_ccs_income_eligible.py new file mode 100644 index 00000000000..bdd141d9685 --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/eligibility/ok_ccs_income_eligible.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class ok_ccs_income_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Oklahoma Child Care Subsidy income eligible" + definition_period = MONTH + defined_for = StateCode.OK + reference = ( + "https://okrules.elaws.us/oac/340:40-7-13", + "https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4.pdf#page=2", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ok.dhs.ccs.income + countable_income = spm_unit("ok_ccs_countable_income", period) + # The adjusted monthly income is compared to the Appendix C-4 income + # threshold for the family size; income above the threshold closes + # the case (OAC 340:40-7-13). + size = spm_unit("spm_unit_size", period.this_year) + return countable_income <= p.limit.calc(size) diff --git a/policyengine_us/variables/gov/states/ok/dhs/ccs/eligibility/ok_ccs_predetermined_eligible.py b/policyengine_us/variables/gov/states/ok/dhs/ccs/eligibility/ok_ccs_predetermined_eligible.py new file mode 100644 index 00000000000..5e46a75ebbe --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/eligibility/ok_ccs_predetermined_eligible.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class ok_ccs_predetermined_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Oklahoma Child Care Subsidy predetermined eligible" + definition_period = MONTH + defined_for = StateCode.OK + reference = "https://okrules.elaws.us/oac/340:40-7-1" + + def formula(spm_unit, period, parameters): + # Households receiving public assistance (TANF, including Supported + # Permanency, State Supplemental Payments, or Refugee Resettlement + # Program cash assistance) or Supplemental Security Income are + # predetermined eligible with no family share copayment + # (OAC 340:40-7-1(b)(1)). We model the TANF and SSI pathways; we don't + # track Oklahoma State Supplemental Payments or Refugee Resettlement + # cash assistance at the moment. is_tanf_enrolled is used instead of a + # computed TANF variable to avoid the circular dependency through the + # TANF dependent care deduction. + is_tanf_enrolled = spm_unit("is_tanf_enrolled", period) + receives_ssi = add(spm_unit, period, ["ssi"]) > 0 + return is_tanf_enrolled | receives_ssi diff --git a/policyengine_us/variables/gov/states/ok/dhs/ccs/income/ok_ccs_countable_earned_income.py b/policyengine_us/variables/gov/states/ok/dhs/ccs/income/ok_ccs_countable_earned_income.py new file mode 100644 index 00000000000..16826856f7c --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/income/ok_ccs_countable_earned_income.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class ok_ccs_countable_earned_income(Variable): + value_type = float + entity = Person + unit = USD + label = "Oklahoma Child Care Subsidy countable earned income" + definition_period = MONTH + defined_for = StateCode.OK + reference = "https://www.law.cornell.edu/regulations/oklahoma/OAC-340-40-7-11" + + def formula(person, period, parameters): + return ( + person("employment_income", period) + + max_(person("self_employment_income", period), 0) + + max_(person("sstb_self_employment_income", period), 0) + + max_(person("farm_operations_income", period), 0) + + max_(person("rental_income", period), 0) + ) diff --git a/policyengine_us/variables/gov/states/ok/dhs/ccs/income/ok_ccs_countable_income.py b/policyengine_us/variables/gov/states/ok/dhs/ccs/income/ok_ccs_countable_income.py new file mode 100644 index 00000000000..f97e4e4101f --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/income/ok_ccs_countable_income.py @@ -0,0 +1,39 @@ +from policyengine_us.model_api import * + + +class ok_ccs_countable_income(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "Oklahoma Child Care Subsidy adjusted monthly income" + definition_period = MONTH + defined_for = StateCode.OK + reference = ( + "https://okrules.elaws.us/oac/340:40-7-12", + "https://okrules.elaws.us/oac/340:40-7-13", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ok.dhs.ccs.income + gross_income = spm_unit("ok_ccs_gross_income", period) + # The earned income of a child under 18 years of age who attends + # school regularly is excluded (OAC 340:40-7-12). School attendance is + # not tracked, so age alone drives the exclusion; the head-or-spouse + # guard keeps a minor parent's own wages countable. + person = spm_unit.members + is_minor = person("age", period.this_year) < p.child_earned_income_exclusion_age + not_head_or_spouse = ~person("is_tax_unit_head_or_spouse", period.this_year) + minor_earned_income = spm_unit.sum( + (is_minor & not_head_or_spouse) + * person("ok_ccs_countable_earned_income", period) + ) + # Verified, legally binding child support paid by a household member to + # or for a non-household member is deducted (OAC 340:40-7-13). + child_support_paid = add(spm_unit, period, ["child_support_expense"]) + adjusted_income = max_( + gross_income - minor_earned_income - child_support_paid, 0 + ) + # The adjusted monthly income is rounded to the nearest dollar before + # the Appendix C-4 threshold and copayment lookups, with half dollars + # rounding up; np.round would round them to the even dollar. + return np.floor(adjusted_income + 0.5) diff --git a/policyengine_us/variables/gov/states/ok/dhs/ccs/income/ok_ccs_gross_income.py b/policyengine_us/variables/gov/states/ok/dhs/ccs/income/ok_ccs_gross_income.py new file mode 100644 index 00000000000..87f110ab631 --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/income/ok_ccs_gross_income.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class ok_ccs_gross_income(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "Oklahoma Child Care Subsidy gross countable income" + definition_period = MONTH + defined_for = StateCode.OK + reference = "https://www.law.cornell.edu/regulations/oklahoma/OAC-340-40-7-11" + + def formula(spm_unit, period, parameters): + sources = parameters(period).gov.states.ok.dhs.ccs.income.sources + person = spm_unit.members + partnership_s_corp_income = max_(person("partnership_s_corp_income", period), 0) + return add(spm_unit, period, sources) + spm_unit.sum(partnership_s_corp_income) diff --git a/policyengine_us/variables/gov/states/ok/dhs/ccs/ok_ccs.py b/policyengine_us/variables/gov/states/ok/dhs/ccs/ok_ccs.py new file mode 100644 index 00000000000..d69f5062b8e --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/ok_ccs.py @@ -0,0 +1,35 @@ +from policyengine_us.model_api import * + + +class ok_ccs(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "Oklahoma Child Care Subsidy benefit amount" + definition_period = MONTH + defined_for = "ok_ccs_eligible" + reference = ( + "https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4.pdf#page=1", + "https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4-b.pdf#page=1", + ) + + def formula(spm_unit, period, parameters): + # OKDHS pays the provider a daily rate for each day of care, capped at + # the family's child care charges, and the family pays the family + # share copayment directly to the provider (Appendix C-4). The expense + # cap pools the per-child maximum rates across the unit (the IN / RI / + # MA / ND convention), because billed expenses are a single SPM-unit + # input. Blended and weekly unit types, special needs add-on rates, + # non-traditional hours payments, the Child Welfare $5 per day add-on, + # Community Hope Center rates, and absent day payments are not + # modeled. + person = spm_unit.members + daily_rate = person("ok_ccs_daily_rate", period) + days = person("childcare_attending_days_per_month", period.this_year) + maximum_monthly_rate = spm_unit.sum(daily_rate * days) + pre_subsidy_childcare_expenses = spm_unit( + "spm_unit_pre_subsidy_childcare_expenses", period + ) + capped_payment = min_(pre_subsidy_childcare_expenses, maximum_monthly_rate) + copay = spm_unit("ok_ccs_copay", period) + return max_(capped_payment - copay, 0) diff --git a/policyengine_us/variables/gov/states/ok/dhs/ccs/ok_child_care_subsidies.py b/policyengine_us/variables/gov/states/ok/dhs/ccs/ok_child_care_subsidies.py new file mode 100644 index 00000000000..914a478c651 --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/ok_child_care_subsidies.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class ok_child_care_subsidies(Variable): + value_type = float + entity = SPMUnit + label = "Oklahoma child care subsidies" + unit = USD + definition_period = YEAR + defined_for = StateCode.OK + adds = ["ok_ccs"] diff --git a/policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_center_age_group.py b/policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_center_age_group.py new file mode 100644 index 00000000000..49e273404f9 --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_center_age_group.py @@ -0,0 +1,28 @@ +from policyengine_us.model_api import * + + +class OKCCSCenterAgeGroup(Enum): + MONTHS_0_TO_12 = "0 to 12 months" + MONTHS_13_TO_24 = "13 to 24 months" + MONTHS_25_TO_48 = "25 to 48 months" + MONTHS_49_TO_72 = "49 to 72 months" + MONTHS_73_PLUS = "73 months to 13 years" + + +class ok_ccs_center_age_group(Variable): + value_type = Enum + entity = Person + possible_values = OKCCSCenterAgeGroup + default_value = OKCCSCenterAgeGroup.MONTHS_73_PLUS + definition_period = MONTH + label = "Oklahoma Child Care Subsidy child care center rate age group" + defined_for = StateCode.OK + reference = "https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4-b.pdf#page=3" + + def formula(person, period, parameters): + p = parameters(period).gov.states.ok.dhs.ccs.age_group + age_months = person("age", period.this_year) * MONTHS_IN_YEAR + # The bracket returns the OKCCSCenterAgeGroup enum index. Children 13 + # and older receive the 73 months to 13 years rate when eligible past + # age 13 with a disability (Appendix C-4-B). + return p.center.calc(age_months) diff --git a/policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_daily_rate.py b/policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_daily_rate.py new file mode 100644 index 00000000000..c24eb6e5b9e --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_daily_rate.py @@ -0,0 +1,37 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.ok.dhs.ccs.rates.ok_ccs_provider_setting import ( + OKCCSProviderSetting, +) + + +class ok_ccs_daily_rate(Variable): + value_type = float + entity = Person + unit = USD + label = "Oklahoma Child Care Subsidy daily rate per child" + definition_period = MONTH + defined_for = "ok_ccs_eligible_child" + reference = "https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4-b.pdf#page=3" + + def formula(person, period, parameters): + p = parameters(period).gov.states.ok.dhs.ccs.rates + provider_setting = person("ok_ccs_provider_setting", period) + star_level = person("ok_ccs_star_level", period) + time_category = person("ok_ccs_time_category", period) + center_age_group = person("ok_ccs_center_age_group", period) + home_age_group = person("ok_ccs_home_age_group", period) + center_rate = p.center[star_level][center_age_group][time_category] + home_rate = p.home[star_level][home_age_group][time_category] + # Care in the child's own home is paid at 90 percent of the one-star + # child care home rate for a child of the same age (Appendix C-4-B). + in_home_rate = ( + p.home.STAR_1[home_age_group][time_category] * p.in_home_rate_ratio + ) + return select( + [ + provider_setting == OKCCSProviderSetting.CHILD_CARE_CENTER, + provider_setting == OKCCSProviderSetting.CHILD_CARE_HOME, + provider_setting == OKCCSProviderSetting.IN_HOME, + ], + [center_rate, home_rate, in_home_rate], + ) diff --git a/policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_home_age_group.py b/policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_home_age_group.py new file mode 100644 index 00000000000..0d857d21576 --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_home_age_group.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +class OKCCSHomeAgeGroup(Enum): + MONTHS_0_TO_24 = "0 to 24 months" + MONTHS_25_TO_48 = "25 to 48 months" + MONTHS_49_TO_72 = "49 to 72 months" + MONTHS_73_PLUS = "73 months to 13 years" + + +class ok_ccs_home_age_group(Variable): + value_type = Enum + entity = Person + possible_values = OKCCSHomeAgeGroup + default_value = OKCCSHomeAgeGroup.MONTHS_73_PLUS + definition_period = MONTH + label = "Oklahoma Child Care Subsidy child care home rate age group" + defined_for = StateCode.OK + reference = "https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4-b.pdf#page=3" + + def formula(person, period, parameters): + p = parameters(period).gov.states.ok.dhs.ccs.age_group + age_months = person("age", period.this_year) * MONTHS_IN_YEAR + # The bracket returns the OKCCSHomeAgeGroup enum index. Children 13 + # and older receive the 73 months to 13 years rate when eligible past + # age 13 with a disability (Appendix C-4-B). + return p.home.calc(age_months) diff --git a/policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_provider_setting.py b/policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_provider_setting.py new file mode 100644 index 00000000000..a1068aa7dbe --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_provider_setting.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class OKCCSProviderSetting(Enum): + CHILD_CARE_CENTER = "Child care center" + CHILD_CARE_HOME = "Child care home" + IN_HOME = "In-home care" + + +class ok_ccs_provider_setting(Variable): + value_type = Enum + entity = Person + possible_values = OKCCSProviderSetting + default_value = OKCCSProviderSetting.CHILD_CARE_CENTER + definition_period = MONTH + label = "Oklahoma Child Care Subsidy provider setting" + defined_for = StateCode.OK + reference = "https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4-b.pdf#page=1" diff --git a/policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_star_level.py b/policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_star_level.py new file mode 100644 index 00000000000..86ebcf7d945 --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_star_level.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class OKCCSStarLevel(Enum): + STAR_1 = "One star" + STAR_2 = "Two star" + STAR_3 = "Three star" + STAR_4 = "Four star" + STAR_5 = "Five star" + + +class ok_ccs_star_level(Variable): + value_type = Enum + entity = Person + possible_values = OKCCSStarLevel + default_value = OKCCSStarLevel.STAR_1 + definition_period = MONTH + label = "Oklahoma Child Care Subsidy provider star level" + defined_for = StateCode.OK + reference = "https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4-b.pdf#page=1" diff --git a/policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_time_category.py b/policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_time_category.py new file mode 100644 index 00000000000..83aea999efa --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_time_category.py @@ -0,0 +1,32 @@ +from policyengine_us.model_api import * + + +class OKCCSTimeCategory(Enum): + FULL_TIME = "Full time" + PART_TIME = "Part time" + + +class ok_ccs_time_category(Variable): + value_type = Enum + entity = Person + possible_values = OKCCSTimeCategory + default_value = OKCCSTimeCategory.FULL_TIME + definition_period = MONTH + label = "Oklahoma Child Care Subsidy daily unit type" + defined_for = StateCode.OK + reference = "https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4-b.pdf#page=1" + + def formula(person, period, parameters): + p = parameters(period).gov.states.ok.dhs.ccs.time_category + # The full-time daily unit type is approved when the child needs care + # more than four hours per day; the part-time daily unit type when the + # child needs four or fewer hours per day (Appendix C-4-B). Zero hours + # means the input is unset, so it falls back to full time per the + # declared default rather than being treated as part time. + hours = person("childcare_hours_per_day", period.this_year) + is_part_time = (hours > 0) & (hours <= p.max_part_time_hours) + return where( + is_part_time, + OKCCSTimeCategory.PART_TIME, + OKCCSTimeCategory.FULL_TIME, + )