From 6a0d0c44de5f6737bbc7e063825d449030881f71 Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 10 Jul 2026 12:12:11 -0400 Subject: [PATCH 1/7] Add Oklahoma Child Care Subsidy Program (CCAP) Implements Oklahoma's Child Care Subsidy Program under OAC 340:40, administered by Oklahoma Human Services: - Income eligibility and family share copayments from Appendix C-4 (10/1/2025), by household size 1-10 - Daily provider rates from Appendix C-4-B (1/1/2023), by star level, setting (center/home/in-home), age group, and full/part-time unit type - Predetermined eligibility (TANF/SSI) with zero copayment - Need factor (employment, education, protective services, CCDF fallback) - Adjusted monthly income with minor child earnings exclusion and child support paid deduction Closes #8990 Co-Authored-By: Claude Fable 5 --- changelog.d/ok-ccs.added.md | 1 + .../hhs/ccdf/child_care_subsidy_programs.yaml | 1 + .../states/ok/dhs/ccs/age_group/center.yaml | 35 +++ .../gov/states/ok/dhs/ccs/age_group/home.yaml | 30 +++ .../ok/dhs/ccs/copay/amount/size_1.yaml | 61 +++++ .../ok/dhs/ccs/copay/amount/size_10.yaml | 49 ++++ .../ok/dhs/ccs/copay/amount/size_2.yaml | 61 +++++ .../ok/dhs/ccs/copay/amount/size_3.yaml | 61 +++++ .../ok/dhs/ccs/copay/amount/size_4.yaml | 61 +++++ .../ok/dhs/ccs/copay/amount/size_5.yaml | 61 +++++ .../ok/dhs/ccs/copay/amount/size_6.yaml | 61 +++++ .../ok/dhs/ccs/copay/amount/size_7.yaml | 57 +++++ .../ok/dhs/ccs/copay/amount/size_8.yaml | 53 +++++ .../ok/dhs/ccs/copay/amount/size_9.yaml | 49 ++++ .../dhs/ccs/eligibility/child_age_limit.yaml | 13 ++ .../eligibility/disabled_child_age_limit.yaml | 13 ++ .../child_earned_income_exclusion_age.yaml | 11 + .../gov/states/ok/dhs/ccs/income/limit.yaml | 57 +++++ .../gov/states/ok/dhs/ccs/income/sources.yaml | 37 +++ .../gov/states/ok/dhs/ccs/rates/center.yaml | 143 ++++++++++++ .../gov/states/ok/dhs/ccs/rates/home.yaml | 118 ++++++++++ .../ok/dhs/ccs/rates/in_home_rate_ratio.yaml | 11 + .../time_category/max_part_time_hours.yaml | 11 + policyengine_us/programs.yaml | 8 +- .../gov/states/ok/dhs/ccs/integration.yaml | 213 ++++++++++++++++++ .../gov/states/ok/dhs/ccs/ok_ccs_copay.yaml | 108 +++++++++ .../ok/dhs/ccs/ok_ccs_countable_income.yaml | 83 +++++++ .../states/ok/dhs/ccs/ok_ccs_daily_rate.yaml | 120 ++++++++++ .../ok/dhs/ccs/ok_ccs_eligible_child.yaml | 67 ++++++ .../ok/dhs/ccs/ok_ccs_income_eligible.yaml | 60 +++++ .../states/ok/dhs/ccs/copay/ok_ccs_copay.py | 31 +++ .../eligibility/ok_ccs_activity_eligible.py | 47 ++++ .../ok/dhs/ccs/eligibility/ok_ccs_eligible.py | 22 ++ .../ccs/eligibility/ok_ccs_eligible_child.py | 27 +++ .../ccs/eligibility/ok_ccs_income_eligible.py | 22 ++ .../ok_ccs_predetermined_eligible.py | 24 ++ .../dhs/ccs/income/ok_ccs_countable_income.py | 33 +++ .../ok/dhs/ccs/income/ok_ccs_gross_income.py | 12 + .../variables/gov/states/ok/dhs/ccs/ok_ccs.py | 30 +++ .../ok/dhs/ccs/ok_child_care_subsidies.py | 11 + .../dhs/ccs/rates/ok_ccs_center_age_group.py | 28 +++ .../ok/dhs/ccs/rates/ok_ccs_daily_rate.py | 37 +++ .../ok/dhs/ccs/rates/ok_ccs_home_age_group.py | 27 +++ .../dhs/ccs/rates/ok_ccs_provider_setting.py | 18 ++ .../ok/dhs/ccs/rates/ok_ccs_star_level.py | 20 ++ .../ok/dhs/ccs/rates/ok_ccs_time_category.py | 29 +++ 46 files changed, 2131 insertions(+), 1 deletion(-) create mode 100644 changelog.d/ok-ccs.added.md create mode 100644 policyengine_us/parameters/gov/states/ok/dhs/ccs/age_group/center.yaml create mode 100644 policyengine_us/parameters/gov/states/ok/dhs/ccs/age_group/home.yaml create mode 100644 policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_1.yaml create mode 100644 policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_10.yaml create mode 100644 policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_2.yaml create mode 100644 policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_3.yaml create mode 100644 policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_4.yaml create mode 100644 policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_5.yaml create mode 100644 policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_6.yaml create mode 100644 policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_7.yaml create mode 100644 policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_8.yaml create mode 100644 policyengine_us/parameters/gov/states/ok/dhs/ccs/copay/amount/size_9.yaml create mode 100644 policyengine_us/parameters/gov/states/ok/dhs/ccs/eligibility/child_age_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/ok/dhs/ccs/eligibility/disabled_child_age_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/ok/dhs/ccs/income/child_earned_income_exclusion_age.yaml create mode 100644 policyengine_us/parameters/gov/states/ok/dhs/ccs/income/limit.yaml create mode 100644 policyengine_us/parameters/gov/states/ok/dhs/ccs/income/sources.yaml create mode 100644 policyengine_us/parameters/gov/states/ok/dhs/ccs/rates/center.yaml create mode 100644 policyengine_us/parameters/gov/states/ok/dhs/ccs/rates/home.yaml create mode 100644 policyengine_us/parameters/gov/states/ok/dhs/ccs/rates/in_home_rate_ratio.yaml create mode 100644 policyengine_us/parameters/gov/states/ok/dhs/ccs/time_category/max_part_time_hours.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/integration.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_copay.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_countable_income.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_daily_rate.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_eligible_child.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_income_eligible.yaml create mode 100644 policyengine_us/variables/gov/states/ok/dhs/ccs/copay/ok_ccs_copay.py create mode 100644 policyengine_us/variables/gov/states/ok/dhs/ccs/eligibility/ok_ccs_activity_eligible.py create mode 100644 policyengine_us/variables/gov/states/ok/dhs/ccs/eligibility/ok_ccs_eligible.py create mode 100644 policyengine_us/variables/gov/states/ok/dhs/ccs/eligibility/ok_ccs_eligible_child.py create mode 100644 policyengine_us/variables/gov/states/ok/dhs/ccs/eligibility/ok_ccs_income_eligible.py create mode 100644 policyengine_us/variables/gov/states/ok/dhs/ccs/eligibility/ok_ccs_predetermined_eligible.py create mode 100644 policyengine_us/variables/gov/states/ok/dhs/ccs/income/ok_ccs_countable_income.py create mode 100644 policyengine_us/variables/gov/states/ok/dhs/ccs/income/ok_ccs_gross_income.py create mode 100644 policyengine_us/variables/gov/states/ok/dhs/ccs/ok_ccs.py create mode 100644 policyengine_us/variables/gov/states/ok/dhs/ccs/ok_child_care_subsidies.py create mode 100644 policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_center_age_group.py create mode 100644 policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_daily_rate.py create mode 100644 policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_home_age_group.py create mode 100644 policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_provider_setting.py create mode 100644 policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_star_level.py create mode 100644 policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_time_category.py 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/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..9baad652fc9 --- /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, pp. 3-5 + 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..c742e95df71 --- /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, pp. 3-5 + 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..2cb4ae85b89 --- /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: http://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..e99f46c7587 --- /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: http://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..113e1c54f69 --- /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: http://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..b80897f2eb2 --- /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: http://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..80175ae1366 --- /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: http://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..c80caf8f0e5 --- /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: http://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..30a0012e53b --- /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: http://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..4cfe812492f --- /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: http://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..ae75ba59d77 --- /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: http://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..496b933234e --- /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: http://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..f007e7ee3d1 --- /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(1) + href: http://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..920f9175814 --- /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(2) + href: http://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/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..5e725d1465d --- /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 + href: http://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..5e3fa575c34 --- /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: http://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..1c8312edd2b --- /dev/null +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/sources.yaml @@ -0,0 +1,37 @@ +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(1)): wages, including armed forces pay, + # commissions, tips, piece-rate payments, longevity payments, and cash + # bonuses, and self-employment income. + - employment_income + - self_employment_income + # Unearned income (OAC 340:40-7-11(2)). Supplemental Security Income is + # explicitly countable unearned income and is a separate variable from + # social_security. + - ssi + # 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 + # Temporary Assistance for Needy Families cash assistance is countable per + # OAC 340:40-7-11(2) 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. + # Mineral and royalty payments are countable but we don't track them as a + # separate 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: http://okrules.elaws.us/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..c611d708758 --- /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, pp. 3-5 + 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..7823fa61040 --- /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, pp. 3-5 + 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..7bd844cc323 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/integration.yaml @@ -0,0 +1,213 @@ +- 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 + 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] + 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 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..20cb3d96d7e --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_copay.yaml @@ -0,0 +1,108 @@ +# 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 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..61e0da56e85 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_countable_income.yaml @@ -0,0 +1,83 @@ +- 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 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..034032654eb --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_daily_rate.yaml @@ -0,0 +1,120 @@ +# 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, 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 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..cb9e9fbb1e4 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_income_eligible.yaml @@ -0,0 +1,60 @@ +# 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 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..c78c9354f7a --- /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", + "http://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..d439b79877d --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/eligibility/ok_ccs_activity_eligible.py @@ -0,0 +1,47 @@ +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 = "http://okrules.elaws.us/oac/340:40-7-8" + + def formula(spm_unit, period, parameters): + # The need factor requires each parent or caretaker to be employed or + # attending an education or training program (OAC 340:40-7-8). A + # parent qualifies with positive wages, nonzero self-employment income + # (a business loss still evidences active self-employment), or + # full-time student status. The minimum wage requirement on employment + # is not modeled. + person = spm_unit.members + is_head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) + has_earnings = (person("employment_income", period) > 0) | ( + person("self_employment_income", period) != 0 + ) + is_student = person("is_full_time_student", period.this_year) + in_activity = has_earnings | is_student + has_head_or_spouse = spm_unit.sum(is_head_or_spouse) >= 1 + all_covered = spm_unit.sum(is_head_or_spouse & ~in_activity) == 0 + modeled_eligible = has_head_or_spouse & all_covered + # TANF Work activities under a TANF Work/Personal Responsibility + # Agreement establish the need factor for TANF recipients. + is_tanf_enrolled = spm_unit("is_tanf_enrolled", period) + # 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; OAC 340:40-7-8). + meets_ccdf = spm_unit("meets_ccdf_activity_test", period.this_year) + return modeled_eligible | is_tanf_enrolled | 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..e19900178b6 --- /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 = "http://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..32d55fd1a0b --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/eligibility/ok_ccs_eligible_child.py @@ -0,0 +1,27 @@ +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 = "http://okrules.elaws.us/oac/340:40-7-3" + + 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 + 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..18bd5197e42 --- /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 = ( + "http://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..017a8adb916 --- /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 = "http://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_income.py b/policyengine_us/variables/gov/states/ok/dhs/ccs/income/ok_ccs_countable_income.py new file mode 100644 index 00000000000..2025cb8e67e --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/income/ok_ccs_countable_income.py @@ -0,0 +1,33 @@ +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 = ( + "http://okrules.elaws.us/oac/340:40-7-12", + "http://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) + * add(person, period, ["employment_income", "self_employment_income"]) + ) + # 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"]) + return max_(gross_income - minor_earned_income - child_support_paid, 0) 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..24d94944b02 --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/income/ok_ccs_gross_income.py @@ -0,0 +1,12 @@ +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 = "http://okrules.elaws.us/oac/340:40-7-11" + adds = "gov.states.ok.dhs.ccs.income.sources" 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..9fdd1147d13 --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/ok_ccs.py @@ -0,0 +1,30 @@ +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). 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) + pre_subsidy_per_child = person("pre_subsidy_childcare_expenses", period) + per_child_payment = min_(daily_rate * days, pre_subsidy_per_child) + total_payment = spm_unit.sum(per_child_payment) + copay = spm_unit("ok_ccs_copay", period) + return max_(total_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..da46eb0db74 --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_time_category.py @@ -0,0 +1,29 @@ +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). + hours = person("childcare_hours_per_day", period.this_year) + return where( + hours > p.max_part_time_hours, + OKCCSTimeCategory.FULL_TIME, + OKCCSTimeCategory.PART_TIME, + ) From 3d12b119fb2a95ec0a8dcdb8c08e3ffcf40779b9 Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 10 Jul 2026 22:53:24 -0400 Subject: [PATCH 2/7] Apply review fixes: family-level expense cap, full income source list, income rounding - Pool per-child maximum rates and cap at the SPM unit's total childcare expenses (IN/RI/MA/ND convention) instead of capping each child at an artificial even expense split - Add pension_income, disability_benefits, veterans_benefits, rental_income, and partnership_s_corp_income to countable income per OAC 340:40-7-11(b)(3), (c)(2), (c)(6), (c)(11) - Round adjusted monthly income to the nearest dollar before the Appendix C-4 threshold and copayment lookups - Add regression tests for each fix Co-Authored-By: Claude Fable 5 --- .../gov/states/ok/dhs/ccs/income/sources.yaml | 27 ++++++++++-- .../gov/states/ok/dhs/ccs/integration.yaml | 35 +++++++++++++++ .../gov/states/ok/dhs/ccs/ok_ccs_copay.yaml | 21 +++++++++ .../ok/dhs/ccs/ok_ccs_countable_income.yaml | 43 +++++++++++++++++++ .../dhs/ccs/income/ok_ccs_countable_income.py | 7 ++- .../variables/gov/states/ok/dhs/ccs/ok_ccs.py | 21 +++++---- 6 files changed, 141 insertions(+), 13 deletions(-) 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 index 1c8312edd2b..78ae4c51930 100644 --- a/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/sources.yaml +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/sources.yaml @@ -19,14 +19,33 @@ values: - 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 + # Rental property income is considered self-employment income + # (OAC 340:40-7-11(b)(3)). + - rental_income + # S corporation, limited partnership, and LLC profit shares are unearned + # income (OAC 340:40-7-11(c)(11)). + - partnership_s_corp_income # Temporary Assistance for Needy Families cash assistance is countable per - # OAC 340:40-7-11(2) but is omitted here: TANF recipients are + # 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. - # Mineral and royalty payments are countable but we don't track them as a - # separate income source at the moment. + # dependent care deduction. Oklahoma State Supplemental Payments and + # Refugee Resettlement Program cash assistance are not tracked at the + # moment. + # 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 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 index 7bd844cc323..cf11241cfd0 100644 --- 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 @@ -211,3 +211,38 @@ 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 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 index 20cb3d96d7e..ba07b5e65d3 100644 --- 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 @@ -106,3 +106,24 @@ 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 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 index 61e0da56e85..3f4c478a4ab 100644 --- 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 @@ -81,3 +81,46 @@ 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 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 index 2025cb8e67e..0c597138945 100644 --- 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 @@ -30,4 +30,9 @@ def formula(spm_unit, period, parameters): # 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"]) - return max_(gross_income - minor_earned_income - child_support_paid, 0) + 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 (Appendix C-4). + return np.round(adjusted_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 index 9fdd1147d13..d69f5062b8e 100644 --- a/policyengine_us/variables/gov/states/ok/dhs/ccs/ok_ccs.py +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/ok_ccs.py @@ -16,15 +16,20 @@ class ok_ccs(Variable): 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). 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. + # 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) - pre_subsidy_per_child = person("pre_subsidy_childcare_expenses", period) - per_child_payment = min_(daily_rate * days, pre_subsidy_per_child) - total_payment = spm_unit.sum(per_child_payment) + 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_(total_payment - copay, 0) + return max_(capped_payment - copay, 0) From 500a8194f8da17bb14a8ccff5935662c8428ae27 Mon Sep 17 00:00:00 2001 From: Ziming Date: Sat, 11 Jul 2026 14:05:54 -0400 Subject: [PATCH 3/7] Apply code review fixes: benefit registration, time category default, rounding, dead SSI source - Register ok_child_care_subsidies in household_state_benefits.yaml so the benefit flows into household totals and net income - Treat unset childcare hours as full time in ok_ccs_time_category, matching the declared default instead of halving the rate cap - Round adjusted income half-up via np.floor(x + 0.5) instead of np.round's half-to-even at the Appendix C-4 lookup step - Drop the dead ssi countable-income source: SSI receipt already makes the unit predetermined eligible, bypassing the income test and copay Co-Authored-By: Claude Fable 5 --- .../household/household_state_benefits.yaml | 6 ++++++ .../gov/states/ok/dhs/ccs/income/sources.yaml | 10 +++++----- .../ok/dhs/ccs/ok_ccs_countable_income.yaml | 20 +++++++++++++++++++ .../states/ok/dhs/ccs/ok_ccs_daily_rate.yaml | 18 ++++++++++++++++- .../dhs/ccs/income/ok_ccs_countable_income.py | 5 +++-- .../ok/dhs/ccs/rates/ok_ccs_time_category.py | 9 ++++++--- 6 files changed, 57 insertions(+), 11 deletions(-) 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/income/sources.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/sources.yaml index 78ae4c51930..b1554759332 100644 --- a/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/sources.yaml +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/sources.yaml @@ -6,10 +6,7 @@ values: # bonuses, and self-employment income. - employment_income - self_employment_income - # Unearned income (OAC 340:40-7-11(2)). Supplemental Security Income is - # explicitly countable unearned income and is a separate variable from - # social_security. - - ssi + # Unearned income (OAC 340:40-7-11(2)). # social_security already includes the disability, retirement, survivors, # and dependents components. - social_security @@ -42,7 +39,10 @@ values: # 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. + # moment. Supplemental Security Income is likewise countable unearned + # income (OAC 340:40-7-11(c)(2)) 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. 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 index 3f4c478a4ab..832965186d9 100644 --- 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 @@ -124,3 +124,23 @@ 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 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 index 034032654eb..c13130048b1 100644 --- 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 @@ -103,7 +103,23 @@ # 13-24 months, full-time. ok_ccs_daily_rate: 41.8 -- name: Case 7, a child aged 13 receives no rate. +- 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: 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 index 0c597138945..2a9eb1de730 100644 --- 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 @@ -34,5 +34,6 @@ def formula(spm_unit, period, parameters): 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 (Appendix C-4). - return np.round(adjusted_income) + # 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/rates/ok_ccs_time_category.py b/policyengine_us/variables/gov/states/ok/dhs/ccs/rates/ok_ccs_time_category.py index da46eb0db74..83aea999efa 100644 --- 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 @@ -20,10 +20,13 @@ 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). + # 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( - hours > p.max_part_time_hours, - OKCCSTimeCategory.FULL_TIME, + is_part_time, OKCCSTimeCategory.PART_TIME, + OKCCSTimeCategory.FULL_TIME, ) From 1a5e55bbf1adf731800d166ddc47d0a97286d77b Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 13 Jul 2026 12:56:17 -0400 Subject: [PATCH 4/7] Apply review fixes: OAC subsection citations, self-employment note, test coverage - Fix wrong OAC 340:40-7-3 subsection cites in age-limit references ((1)->(a), (2)->(b)-(c)) - Fix income sources comment cites ((1)->(b), (2)->(c), SSI (c)(2)->(c)(3)); cite 340:40-7-12(8) - Document unapplied 50% self-employment expense deduction (OAC 340:40-7-11(b)(3)(B)) - Drop page numbers from four reference titles (kept in #page= href) - Add activity-eligible and predetermined-eligible unit test files - Add exact income-limit boundary, size-10, and size-11 fallback tests - Add daily-rate cases covering all center and home age groups Co-Authored-By: Claude Fable 5 --- .../states/ok/dhs/ccs/age_group/center.yaml | 2 +- .../gov/states/ok/dhs/ccs/age_group/home.yaml | 2 +- .../ok/dhs/ccs/copay/amount/size_1.yaml | 2 +- .../ok/dhs/ccs/copay/amount/size_10.yaml | 2 +- .../ok/dhs/ccs/copay/amount/size_2.yaml | 2 +- .../ok/dhs/ccs/copay/amount/size_3.yaml | 2 +- .../ok/dhs/ccs/copay/amount/size_4.yaml | 2 +- .../ok/dhs/ccs/copay/amount/size_5.yaml | 2 +- .../ok/dhs/ccs/copay/amount/size_6.yaml | 2 +- .../ok/dhs/ccs/copay/amount/size_7.yaml | 2 +- .../ok/dhs/ccs/copay/amount/size_8.yaml | 2 +- .../ok/dhs/ccs/copay/amount/size_9.yaml | 2 +- .../dhs/ccs/eligibility/child_age_limit.yaml | 4 +- .../eligibility/disabled_child_age_limit.yaml | 4 +- .../child_earned_income_exclusion_age.yaml | 4 +- .../gov/states/ok/dhs/ccs/income/limit.yaml | 2 +- .../gov/states/ok/dhs/ccs/income/sources.yaml | 14 +- .../gov/states/ok/dhs/ccs/rates/center.yaml | 2 +- .../gov/states/ok/dhs/ccs/rates/home.yaml | 2 +- .../ok/dhs/ccs/ok_ccs_activity_eligible.yaml | 162 ++++++++++++++++++ .../gov/states/ok/dhs/ccs/ok_ccs_copay.yaml | 76 ++++++++ .../states/ok/dhs/ccs/ok_ccs_daily_rate.yaml | 70 ++++++++ .../ok/dhs/ccs/ok_ccs_income_eligible.yaml | 91 ++++++++++ .../ccs/ok_ccs_predetermined_eligible.yaml | 58 +++++++ .../states/ok/dhs/ccs/copay/ok_ccs_copay.py | 2 +- .../eligibility/ok_ccs_activity_eligible.py | 2 +- .../ok/dhs/ccs/eligibility/ok_ccs_eligible.py | 2 +- .../ccs/eligibility/ok_ccs_eligible_child.py | 2 +- .../ccs/eligibility/ok_ccs_income_eligible.py | 2 +- .../ok_ccs_predetermined_eligible.py | 2 +- .../dhs/ccs/income/ok_ccs_countable_income.py | 4 +- .../ok/dhs/ccs/income/ok_ccs_gross_income.py | 2 +- 32 files changed, 496 insertions(+), 35 deletions(-) create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_activity_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_predetermined_eligible.yaml 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 index 9baad652fc9..388630b8af8 100644 --- 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 @@ -9,7 +9,7 @@ metadata: period: year label: Oklahoma Child Care Subsidy center age group reference: - - title: OKDHS Appendix C-4-B, Child Care Provider Rate Schedule, pp. 3-5 + - 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: 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 index c742e95df71..5e581b6a3dd 100644 --- 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 @@ -8,7 +8,7 @@ metadata: period: year label: Oklahoma Child Care Subsidy home age group reference: - - title: OKDHS Appendix C-4-B, Child Care Provider Rate Schedule, pp. 3-5 + - 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: 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 index 2cb4ae85b89..082499cf3c0 100644 --- 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 @@ -12,7 +12,7 @@ metadata: - 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: http://okrules.elaws.us/oac/340:40-5-1 + href: https://okrules.elaws.us/oac/340:40-5-1 brackets: - threshold: 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 index e99f46c7587..e434eb329f0 100644 --- 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 @@ -12,7 +12,7 @@ metadata: - 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: http://okrules.elaws.us/oac/340:40-5-1 + href: https://okrules.elaws.us/oac/340:40-5-1 brackets: - threshold: 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 index 113e1c54f69..be3d8bd7d9e 100644 --- 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 @@ -12,7 +12,7 @@ metadata: - 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: http://okrules.elaws.us/oac/340:40-5-1 + href: https://okrules.elaws.us/oac/340:40-5-1 brackets: - threshold: 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 index b80897f2eb2..3dfbacf2cde 100644 --- 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 @@ -12,7 +12,7 @@ metadata: - 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: http://okrules.elaws.us/oac/340:40-5-1 + href: https://okrules.elaws.us/oac/340:40-5-1 brackets: - threshold: 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 index 80175ae1366..236b11e790a 100644 --- 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 @@ -12,7 +12,7 @@ metadata: - 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: http://okrules.elaws.us/oac/340:40-5-1 + href: https://okrules.elaws.us/oac/340:40-5-1 brackets: - threshold: 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 index c80caf8f0e5..13320d23acb 100644 --- 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 @@ -12,7 +12,7 @@ metadata: - 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: http://okrules.elaws.us/oac/340:40-5-1 + href: https://okrules.elaws.us/oac/340:40-5-1 brackets: - threshold: 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 index 30a0012e53b..9db9153b737 100644 --- 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 @@ -12,7 +12,7 @@ metadata: - 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: http://okrules.elaws.us/oac/340:40-5-1 + href: https://okrules.elaws.us/oac/340:40-5-1 brackets: - threshold: 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 index 4cfe812492f..f0212d74215 100644 --- 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 @@ -12,7 +12,7 @@ metadata: - 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: http://okrules.elaws.us/oac/340:40-5-1 + href: https://okrules.elaws.us/oac/340:40-5-1 brackets: - threshold: 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 index ae75ba59d77..1bdf431a9d6 100644 --- 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 @@ -12,7 +12,7 @@ metadata: - 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: http://okrules.elaws.us/oac/340:40-5-1 + href: https://okrules.elaws.us/oac/340:40-5-1 brackets: - threshold: 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 index 496b933234e..c1964af36eb 100644 --- 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 @@ -12,7 +12,7 @@ metadata: - 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: http://okrules.elaws.us/oac/340:40-5-1 + href: https://okrules.elaws.us/oac/340:40-5-1 brackets: - threshold: 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 index f007e7ee3d1..552c7515d1d 100644 --- 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 @@ -7,7 +7,7 @@ metadata: period: year label: Oklahoma Child Care Subsidy child age limit reference: - - title: OAC 340:40-7-3(1) - href: http://okrules.elaws.us/oac/340:40-7-3 + - 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 index 920f9175814..ef1a1aa38c0 100644 --- 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 @@ -7,7 +7,7 @@ metadata: period: year label: Oklahoma Child Care Subsidy disabled child age limit reference: - - title: OAC 340:40-7-3(2) - href: http://okrules.elaws.us/oac/340:40-7-3 + - 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/income/child_earned_income_exclusion_age.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/child_earned_income_exclusion_age.yaml index 5e725d1465d..98aae406fa2 100644 --- 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 @@ -7,5 +7,5 @@ metadata: period: year label: Oklahoma Child Care Subsidy child earned income exclusion age reference: - - title: OAC 340:40-7-12 - href: http://okrules.elaws.us/oac/340:40-7-12 + - 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 index 5e3fa575c34..4c954923351 100644 --- a/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/limit.yaml +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/limit.yaml @@ -12,7 +12,7 @@ metadata: - 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: http://okrules.elaws.us/oac/340:40-7-13 + href: https://okrules.elaws.us/oac/340:40-7-13 brackets: - threshold: 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 index b1554759332..3fa9044eef5 100644 --- a/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/sources.yaml +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/sources.yaml @@ -1,12 +1,16 @@ 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(1)): wages, including armed forces pay, + # 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. + # bonuses, and self-employment income. The 50 percent business-expense + # standard deduction for self-employment income (OAC + # 340:40-7-11(b)(3)(B)) is not applied: self_employment_income is already + # net of actual expenses, and gross self-employment receipts are not + # tracked at the moment. - employment_income - self_employment_income - # Unearned income (OAC 340:40-7-11(2)). + # Unearned income (OAC 340:40-7-11(c)). # social_security already includes the disability, retirement, survivors, # and dependents components. - social_security @@ -40,7 +44,7 @@ values: # 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)(2)) but omitted for the same reason: SSI + # 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 @@ -53,4 +57,4 @@ metadata: label: Oklahoma Child Care Subsidy countable income sources reference: - title: OAC 340:40-7-11 - href: http://okrules.elaws.us/oac/340:40-7-11 + href: https://okrules.elaws.us/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 index c611d708758..e73a09867da 100644 --- a/policyengine_us/parameters/gov/states/ok/dhs/ccs/rates/center.yaml +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/rates/center.yaml @@ -8,7 +8,7 @@ metadata: - ok_ccs_center_age_group - ok_ccs_time_category reference: - - title: OKDHS Appendix C-4-B, Child Care Provider Rate Schedule, pp. 3-5 + - 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: 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 index 7823fa61040..a4c8aa4bcca 100644 --- a/policyengine_us/parameters/gov/states/ok/dhs/ccs/rates/home.yaml +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/rates/home.yaml @@ -8,7 +8,7 @@ metadata: - ok_ccs_home_age_group - ok_ccs_time_category reference: - - title: OKDHS Appendix C-4-B, Child Care Provider Rate Schedule, pp. 3-5 + - 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: 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..f11836b713e --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_activity_eligible.yaml @@ -0,0 +1,162 @@ +# 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 still evidences active self-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: true + +- name: Case 5, non-working TANF-enrolled household meets 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: true + +- 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 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 index ba07b5e65d3..5f5a282555c 100644 --- 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 @@ -127,3 +127,79 @@ 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_daily_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_daily_rate.yaml index c13130048b1..8a712bf7946 100644 --- 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 @@ -134,3 +134,73 @@ 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_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_income_eligible.yaml index cb9e9fbb1e4..7f838d34a51 100644 --- 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 @@ -58,3 +58,94 @@ 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 index c78c9354f7a..31dfa918614 100644 --- 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 @@ -10,7 +10,7 @@ class ok_ccs_copay(Variable): defined_for = StateCode.OK reference = ( "https://oklahoma.gov/content/dam/ok/en/okdhs/documents/searchcenter/okdhsformresults/c-4.pdf#page=2", - "http://okrules.elaws.us/oac/340:40-5-1", + "https://okrules.elaws.us/oac/340:40-5-1", ) def formula(spm_unit, period, parameters): 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 index d439b79877d..6af67db34e9 100644 --- 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 @@ -7,7 +7,7 @@ class ok_ccs_activity_eligible(Variable): label = "Oklahoma Child Care Subsidy activity eligible" definition_period = MONTH defined_for = StateCode.OK - reference = "http://okrules.elaws.us/oac/340:40-7-8" + reference = "https://okrules.elaws.us/oac/340:40-7-8" def formula(spm_unit, period, parameters): # The need factor requires each parent or caretaker to be employed or 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 index e19900178b6..cad30f9f826 100644 --- 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 @@ -7,7 +7,7 @@ class ok_ccs_eligible(Variable): label = "Oklahoma Child Care Subsidy eligible" definition_period = MONTH defined_for = StateCode.OK - reference = "http://okrules.elaws.us/oac/340:40-7-1" + 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 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 index 32d55fd1a0b..ca58e0e5b0f 100644 --- 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 @@ -7,7 +7,7 @@ class ok_ccs_eligible_child(Variable): label = "Oklahoma Child Care Subsidy eligible child" definition_period = MONTH defined_for = StateCode.OK - reference = "http://okrules.elaws.us/oac/340:40-7-3" + reference = "https://okrules.elaws.us/oac/340:40-7-3" def formula(person, period, parameters): p = parameters(period).gov.states.ok.dhs.ccs.eligibility 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 index 18bd5197e42..bdd141d9685 100644 --- 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 @@ -8,7 +8,7 @@ class ok_ccs_income_eligible(Variable): definition_period = MONTH defined_for = StateCode.OK reference = ( - "http://okrules.elaws.us/oac/340:40-7-13", + "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", ) 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 index 017a8adb916..5e46a75ebbe 100644 --- 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 @@ -7,7 +7,7 @@ class ok_ccs_predetermined_eligible(Variable): label = "Oklahoma Child Care Subsidy predetermined eligible" definition_period = MONTH defined_for = StateCode.OK - reference = "http://okrules.elaws.us/oac/340:40-7-1" + reference = "https://okrules.elaws.us/oac/340:40-7-1" def formula(spm_unit, period, parameters): # Households receiving public assistance (TANF, including Supported 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 index 2a9eb1de730..86e87299cfd 100644 --- 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 @@ -9,8 +9,8 @@ class ok_ccs_countable_income(Variable): definition_period = MONTH defined_for = StateCode.OK reference = ( - "http://okrules.elaws.us/oac/340:40-7-12", - "http://okrules.elaws.us/oac/340:40-7-13", + "https://okrules.elaws.us/oac/340:40-7-12", + "https://okrules.elaws.us/oac/340:40-7-13", ) def formula(spm_unit, period, parameters): 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 index 24d94944b02..30a653ba1e3 100644 --- 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 @@ -8,5 +8,5 @@ class ok_ccs_gross_income(Variable): label = "Oklahoma Child Care Subsidy gross countable income" definition_period = MONTH defined_for = StateCode.OK - reference = "http://okrules.elaws.us/oac/340:40-7-11" + reference = "https://okrules.elaws.us/oac/340:40-7-11" adds = "gov.states.ok.dhs.ccs.income.sources" From 3c734b82022a78c22502bf67b559efab11c3823c Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 13 Jul 2026 15:14:11 -0400 Subject: [PATCH 5/7] Floor self-employment losses per person in countable income Per OAC 340:40-7-11(b)(3)(B), a business loss is not deducted from other household income. Add ok_ccs_countable_self_employment_income, which floors each person's self-employment income at zero, and use it in the income sources list and the minor-earnings exclusion. Co-Authored-By: Claude Fable 5 --- .../gov/states/ok/dhs/ccs/income/sources.yaml | 13 +++++----- .../ok/dhs/ccs/ok_ccs_countable_income.yaml | 24 +++++++++++++++++++ .../dhs/ccs/income/ok_ccs_countable_income.py | 9 ++++++- ...ok_ccs_countable_self_employment_income.py | 17 +++++++++++++ 4 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 policyengine_us/variables/gov/states/ok/dhs/ccs/income/ok_ccs_countable_self_employment_income.py 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 index 3fa9044eef5..b8dc22e389b 100644 --- a/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/sources.yaml +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/sources.yaml @@ -3,13 +3,14 @@ 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. The 50 percent business-expense - # standard deduction for self-employment income (OAC - # 340:40-7-11(b)(3)(B)) is not applied: self_employment_income is already - # net of actual expenses, and gross self-employment receipts are not - # tracked at the moment. + # bonuses, and self-employment income. Self-employment income 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. - employment_income - - self_employment_income + - ok_ccs_countable_self_employment_income # Unearned income (OAC 340:40-7-11(c)). # social_security already includes the disability, retirement, survivors, # and dependents components. 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 index 832965186d9..d4221c51ef4 100644 --- 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 @@ -144,3 +144,27 @@ 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 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 index 86e87299cfd..bbbf05f1c03 100644 --- 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 @@ -25,7 +25,14 @@ def formula(spm_unit, period, parameters): 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) - * add(person, period, ["employment_income", "self_employment_income"]) + * add( + person, + period, + [ + "employment_income", + "ok_ccs_countable_self_employment_income", + ], + ) ) # Verified, legally binding child support paid by a household member to # or for a non-household member is deducted (OAC 340:40-7-13). diff --git a/policyengine_us/variables/gov/states/ok/dhs/ccs/income/ok_ccs_countable_self_employment_income.py b/policyengine_us/variables/gov/states/ok/dhs/ccs/income/ok_ccs_countable_self_employment_income.py new file mode 100644 index 00000000000..59c107d9d7e --- /dev/null +++ b/policyengine_us/variables/gov/states/ok/dhs/ccs/income/ok_ccs_countable_self_employment_income.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class ok_ccs_countable_self_employment_income(Variable): + value_type = float + entity = Person + unit = USD + label = "Oklahoma Child Care Subsidy countable self-employment income" + definition_period = MONTH + defined_for = StateCode.OK + reference = "https://okrules.elaws.us/oac/340:40-7-11" + + def formula(person, period, parameters): + # A business loss is not deducted from other household income + # (OAC 340:40-7-11(b)(3)(B)), so each person's self-employment + # income is floored at zero before aggregation. + return max_(person("self_employment_income", period), 0) From 464150cfb0e97d88d3be02eaf2390a13dbf1e5b1 Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 13 Jul 2026 16:49:55 -0400 Subject: [PATCH 6/7] Fix Oklahoma CCS activity and business income --- .../minimum_weekly_work_hours.yaml | 11 ++ .../gov/states/ok/dhs/ccs/income/sources.yaml | 18 +-- .../gov/states/ok/dhs/ccs/integration.yaml | 2 + .../ok/dhs/ccs/ok_ccs_activity_eligible.yaml | 137 +++++++++++++++++- .../ok/dhs/ccs/ok_ccs_countable_income.yaml | 88 +++++++++++ .../eligibility/ok_ccs_activity_eligible.py | 61 +++++--- .../income/ok_ccs_countable_earned_income.py | 20 +++ .../dhs/ccs/income/ok_ccs_countable_income.py | 9 +- ...ok_ccs_countable_self_employment_income.py | 17 --- .../ok/dhs/ccs/income/ok_ccs_gross_income.py | 9 +- 10 files changed, 311 insertions(+), 61 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/ok/dhs/ccs/eligibility/minimum_weekly_work_hours.yaml create mode 100644 policyengine_us/variables/gov/states/ok/dhs/ccs/income/ok_ccs_countable_earned_income.py delete mode 100644 policyengine_us/variables/gov/states/ok/dhs/ccs/income/ok_ccs_countable_self_employment_income.py 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/sources.yaml b/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/sources.yaml index b8dc22e389b..df50f7aa8ff 100644 --- a/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/sources.yaml +++ b/policyengine_us/parameters/gov/states/ok/dhs/ccs/income/sources.yaml @@ -3,14 +3,13 @@ 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. Self-employment income 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 + # 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. - - employment_income - - ok_ccs_countable_self_employment_income + - ok_ccs_countable_earned_income # Unearned income (OAC 340:40-7-11(c)). # social_security already includes the disability, retirement, survivors, # and dependents components. @@ -31,12 +30,9 @@ values: # Veterans' compensation, pensions, and military allotments # (OAC 340:40-7-11(c)(6)). - veterans_benefits - # Rental property income is considered self-employment income - # (OAC 340:40-7-11(b)(3)). - - rental_income # S corporation, limited partnership, and LLC profit shares are unearned - # income (OAC 340:40-7-11(c)(11)). - - partnership_s_corp_income + # 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), @@ -58,4 +54,4 @@ metadata: label: Oklahoma Child Care Subsidy countable income sources reference: - title: OAC 340:40-7-11 - href: https://okrules.elaws.us/oac/340:40-7-11 + href: https://www.law.cornell.edu/regulations/oklahoma/OAC-340-40-7-11 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 index cf11241cfd0..7ff9c874020 100644 --- 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 @@ -45,6 +45,7 @@ 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: @@ -124,6 +125,7 @@ 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: 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 index f11836b713e..a3e6941dc7d 100644 --- 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 @@ -67,7 +67,7 @@ output: ok_ccs_activity_eligible: true -- name: Case 4, a self-employment loss still evidences active self-employment. +- name: Case 4, a self-employment loss does not establish employment. period: 2026-01 input: people: @@ -84,9 +84,9 @@ members: [person1, person2] state_code: OK output: - ok_ccs_activity_eligible: true + ok_ccs_activity_eligible: false -- name: Case 5, non-working TANF-enrolled household meets the need factor. +- name: Case 5, TANF enrollment without an approved activity does not meet the need factor. period: 2026-01 input: people: @@ -103,7 +103,7 @@ members: [person1, person2] state_code: OK output: - ok_ccs_activity_eligible: true + ok_ccs_activity_eligible: false - name: Case 6, non-working parent receiving protective services meets the need factor. period: 2026-01 @@ -160,3 +160,132 @@ 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_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ok/dhs/ccs/ok_ccs_countable_income.yaml index d4221c51ef4..fbec6d05468 100644 --- 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 @@ -168,3 +168,91 @@ 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/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 index 6af67db34e9..3f973491445 100644 --- 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 @@ -7,28 +7,50 @@ class ok_ccs_activity_eligible(Variable): label = "Oklahoma Child Care Subsidy activity eligible" definition_period = MONTH defined_for = StateCode.OK - reference = "https://okrules.elaws.us/oac/340:40-7-8" + 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): - # The need factor requires each parent or caretaker to be employed or - # attending an education or training program (OAC 340:40-7-8). A - # parent qualifies with positive wages, nonzero self-employment income - # (a business loss still evidences active self-employment), or - # full-time student status. The minimum wage requirement on employment - # is not modeled. + p = parameters(period).gov.states.ok.dhs.ccs.eligibility person = spm_unit.members - is_head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) - has_earnings = (person("employment_income", period) > 0) | ( - person("self_employment_income", period) != 0 + 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, + ) + is_working = (weekly_hours >= p.minimum_weekly_work_hours) & ( + effective_hourly_earnings >= parameters(period).gov.dol.minimum_wage ) is_student = person("is_full_time_student", period.this_year) - in_activity = has_earnings | is_student - has_head_or_spouse = spm_unit.sum(is_head_or_spouse) >= 1 - all_covered = spm_unit.sum(is_head_or_spouse & ~in_activity) == 0 - modeled_eligible = has_head_or_spouse & all_covered - # TANF Work activities under a TANF Work/Personal Responsibility - # Agreement establish the need factor for TANF recipients. - is_tanf_enrolled = spm_unit("is_tanf_enrolled", period) + 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. @@ -42,6 +64,7 @@ def formula(spm_unit, period, parameters): ) # 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; OAC 340:40-7-8). + # 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 | is_tanf_enrolled | protective | meets_ccdf + return modeled_eligible | protective | meets_ccdf 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 index bbbf05f1c03..f97e4e4101f 100644 --- 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 @@ -25,14 +25,7 @@ def formula(spm_unit, period, parameters): 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) - * add( - person, - period, - [ - "employment_income", - "ok_ccs_countable_self_employment_income", - ], - ) + * 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). diff --git a/policyengine_us/variables/gov/states/ok/dhs/ccs/income/ok_ccs_countable_self_employment_income.py b/policyengine_us/variables/gov/states/ok/dhs/ccs/income/ok_ccs_countable_self_employment_income.py deleted file mode 100644 index 59c107d9d7e..00000000000 --- a/policyengine_us/variables/gov/states/ok/dhs/ccs/income/ok_ccs_countable_self_employment_income.py +++ /dev/null @@ -1,17 +0,0 @@ -from policyengine_us.model_api import * - - -class ok_ccs_countable_self_employment_income(Variable): - value_type = float - entity = Person - unit = USD - label = "Oklahoma Child Care Subsidy countable self-employment income" - definition_period = MONTH - defined_for = StateCode.OK - reference = "https://okrules.elaws.us/oac/340:40-7-11" - - def formula(person, period, parameters): - # A business loss is not deducted from other household income - # (OAC 340:40-7-11(b)(3)(B)), so each person's self-employment - # income is floored at zero before aggregation. - return max_(person("self_employment_income", period), 0) 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 index 30a653ba1e3..87f110ab631 100644 --- 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 @@ -8,5 +8,10 @@ class ok_ccs_gross_income(Variable): label = "Oklahoma Child Care Subsidy gross countable income" definition_period = MONTH defined_for = StateCode.OK - reference = "https://okrules.elaws.us/oac/340:40-7-11" - adds = "gov.states.ok.dhs.ccs.income.sources" + 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) From a3d98832491c5f52e0b151c47363cf731e0b132f Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 13 Jul 2026 17:26:33 -0400 Subject: [PATCH 7/7] Apply review fixes: citizenship citation, minimum wage binding, regression-guard tests - Cite OAC 340:40-7-5 (citizenship/alienage) alongside 340:40-7-3 in ok_ccs_eligible_child, covering the is_ccdf_immigration_eligible_child gate - Bind gov.dol.minimum_wage to a name in ok_ccs_activity_eligible - Add integration Case 10: TANF predetermined eligibility overrides a failing income test (guards the predetermined | income_eligible OR) - Add integration Case 11: childless unit is ineligible Co-Authored-By: Claude Fable 5 --- .../gov/states/ok/dhs/ccs/integration.yaml | 53 +++++++++++++++++++ .../eligibility/ok_ccs_activity_eligible.py | 3 +- .../ccs/eligibility/ok_ccs_eligible_child.py | 7 ++- 3 files changed, 61 insertions(+), 2 deletions(-) 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 index 7ff9c874020..fbeee1e3851 100644 --- 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 @@ -248,3 +248,56 @@ # 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/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 index 3f973491445..619a75f1fbe 100644 --- 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 @@ -27,8 +27,9 @@ def formula(spm_unit, period, parameters): 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 >= parameters(period).gov.dol.minimum_wage + 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) 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 index ca58e0e5b0f..560eaad235f 100644 --- 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 @@ -7,7 +7,10 @@ class ok_ccs_eligible_child(Variable): label = "Oklahoma Child Care Subsidy eligible child" definition_period = MONTH defined_for = StateCode.OK - reference = "https://okrules.elaws.us/oac/340:40-7-3" + 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 @@ -21,6 +24,8 @@ def formula(person, period, parameters): 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 )