From 0406ac25ba74da191b5cc6b916e8c41ef18b4dff Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 11 Mar 2026 20:50:55 -0400 Subject: [PATCH 01/10] Add changelog fragment for NH CCAP Co-Authored-By: Claude Opus 4.6 --- changelog.d/nh-ccap.added.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/nh-ccap.added.md diff --git a/changelog.d/nh-ccap.added.md b/changelog.d/nh-ccap.added.md new file mode 100644 index 00000000000..b99321a2926 --- /dev/null +++ b/changelog.d/nh-ccap.added.md @@ -0,0 +1 @@ +Add New Hampshire CCAP. From 6bf250520b28dae51972360a1d959de93490a9d4 Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 11 Mar 2026 22:12:06 -0400 Subject: [PATCH 02/10] Implement New Hampshire CCAP (Child Care Scholarship Program) (ref #7759) Co-Authored-By: Claude Opus 4.6 --- .../ccap/age_category/infant_max_months.yaml | 11 + .../age_category/preschool_max_months.yaml | 11 + .../ccap/age_category/toddler_max_months.yaml | 11 + .../dhhs/ccap/cost_share/step_1_fpg_rate.yaml | 11 + .../dhhs/ccap/cost_share/step_2_amount.yaml | 11 + .../dhhs/ccap/cost_share/step_2_fpg_rate.yaml | 11 + .../nh/dhhs/ccap/cost_share/step_3_rate.yaml | 11 + .../ccap/eligibility/child_age_limit.yaml | 11 + .../eligibility/disabled_child_age_limit.yaml | 11 + .../qualified_immigration_statuses.yaml | 17 ++ .../ccap/income/countable_income/sources.yaml | 29 ++ .../ccap/income/income_limit_smi_rate.yaml | 11 + .../payment/disability_supplement/amount.yaml | 18 ++ .../dhhs/ccap/payment/exempt_center_rate.yaml | 11 + .../ccap/payment/exempt_in_home_rate.yaml | 11 + .../ccap/payment/rates/licensed_center.yaml | 43 +++ .../ccap/payment/rates/licensed_family.yaml | 43 +++ .../ccap/service_level/full_time_hours.yaml | 11 + .../ccap/service_level/half_time_hours.yaml | 11 + .../gov/states/nh/dhhs/ccap/integration.yaml | 282 ++++++++++++++++++ .../gov/states/nh/dhhs/ccap/nh_ccap.yaml | 272 +++++++++++++++++ .../dhhs/ccap/nh_ccap_child_age_category.yaml | 153 ++++++++++ .../nh/dhhs/ccap/nh_ccap_cost_share.yaml | 242 +++++++++++++++ .../ccap/nh_ccap_disability_supplement.yaml | 68 +++++ .../states/nh/dhhs/ccap/nh_ccap_eligible.yaml | 258 ++++++++++++++++ .../nh/dhhs/ccap/nh_ccap_eligible_child.yaml | 184 ++++++++++++ ...ap_immigration_status_eligible_person.yaml | 81 +++++ .../nh/dhhs/ccap/nh_ccap_income_eligible.yaml | 228 ++++++++++++++ .../nh/dhhs/ccap/nh_ccap_payment_rate.yaml | 251 ++++++++++++++++ .../nh/dhhs/ccap/nh_ccap_service_level.yaml | 171 +++++++++++ .../dhhs/ccap/eligibility/nh_ccap_eligible.py | 19 ++ .../eligibility/nh_ccap_eligible_child.py | 24 ++ ...ccap_immigration_status_eligible_person.py | 21 ++ .../eligibility/nh_ccap_income_eligible.py | 23 ++ .../gov/states/nh/dhhs/ccap/nh_ccap.py | 44 +++ .../dhhs/ccap/nh_ccap_child_age_category.py | 40 +++ .../states/nh/dhhs/ccap/nh_ccap_cost_share.py | 36 +++ .../nh/dhhs/ccap/nh_ccap_countable_income.py | 15 + .../nh/dhhs/ccap/nh_ccap_provider_type.py | 21 ++ .../nh/dhhs/ccap/nh_ccap_service_level.py | 36 +++ .../payment/nh_ccap_disability_supplement.py | 20 ++ .../dhhs/ccap/payment/nh_ccap_payment_rate.py | 43 +++ 42 files changed, 2836 insertions(+) create mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml create mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml create mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml create mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml create mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml create mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml create mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml create mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml create mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml create mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml create mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml create mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml create mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml create mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml create mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml create mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml create mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/integration.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_child_age_category.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_cost_share.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_disability_supplement.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_eligible_child.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_immigration_status_eligible_person.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_income_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_payment_rate.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_service_level.yaml create mode 100644 policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible.py create mode 100644 policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible_child.py create mode 100644 policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_immigration_status_eligible_person.py create mode 100644 policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_income_eligible.py create mode 100644 policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap.py create mode 100644 policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_child_age_category.py create mode 100644 policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_cost_share.py create mode 100644 policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_countable_income.py create mode 100644 policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_provider_type.py create mode 100644 policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_service_level.py create mode 100644 policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_disability_supplement.py create mode 100644 policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_payment_rate.py diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml new file mode 100644 index 00000000000..c6aad88cebb --- /dev/null +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml @@ -0,0 +1,11 @@ +description: New Hampshire defines the infant age category as up to this age in months under the Child Care Scholarship Program. +values: + 2024-07-01: 18 + +metadata: + unit: month + period: year + label: New Hampshire CCAP infant age category upper bound in months + reference: + - title: He-C 6910.17(i) + href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml new file mode 100644 index 00000000000..22eae665888 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml @@ -0,0 +1,11 @@ +description: New Hampshire defines the preschool age category as up to this age in months under the Child Care Scholarship Program. +values: + 2024-07-01: 79 + +metadata: + unit: month + period: year + label: New Hampshire CCAP preschool age category upper bound in months + reference: + - title: He-C 6910.17(i) + href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml new file mode 100644 index 00000000000..4dff121eda4 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml @@ -0,0 +1,11 @@ +description: New Hampshire defines the toddler age category as up to this age in months under the Child Care Scholarship Program. +values: + 2024-07-01: 36 + +metadata: + unit: month + period: year + label: New Hampshire CCAP toddler age category upper bound in months + reference: + - title: He-C 6910.17(i) + href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml new file mode 100644 index 00000000000..c39ee92e459 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml @@ -0,0 +1,11 @@ +description: New Hampshire sets this share of the federal poverty guideline as the upper threshold for zero cost share under the Child Care Scholarship Program. +values: + 2024-07-01: 1 + +metadata: + unit: /1 + period: year + label: New Hampshire CCAP step 1 FPG rate threshold + reference: + - title: He-C 6910.18, Table 6910.19 + href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml new file mode 100644 index 00000000000..0ecfc70955c --- /dev/null +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml @@ -0,0 +1,11 @@ +description: New Hampshire provides this amount as the flat weekly cost share for families between 100% and 138% of the federal poverty guideline under the Child Care Scholarship Program. +values: + 2024-07-01: 5 + +metadata: + unit: currency-USD + period: year + label: New Hampshire CCAP step 2 weekly cost share amount + reference: + - title: He-C 6910.18, Table 6910.19 + href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml new file mode 100644 index 00000000000..43255c1c738 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml @@ -0,0 +1,11 @@ +description: New Hampshire sets this share of the federal poverty guideline as the upper threshold for the flat weekly cost share under the Child Care Scholarship Program. +values: + 2024-07-01: 1.38 + +metadata: + unit: /1 + period: year + label: New Hampshire CCAP step 2 FPG rate threshold + reference: + - title: He-C 6910.18, Table 6910.19 + href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml new file mode 100644 index 00000000000..c516e6bb56f --- /dev/null +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml @@ -0,0 +1,11 @@ +description: New Hampshire sets this share of family income as the cost share for families above 138% of the federal poverty guideline under the Child Care Scholarship Program. +values: + 2024-07-01: 0.07 + +metadata: + unit: /1 + period: year + label: New Hampshire CCAP step 3 income cost share rate + reference: + - title: He-C 6910.18, Table 6910.19 + href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml new file mode 100644 index 00000000000..ee1047aeb9e --- /dev/null +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml @@ -0,0 +1,11 @@ +description: New Hampshire limits the Child Care Scholarship Program to children younger than this age. +values: + 2024-07-01: 13 + +metadata: + unit: year + period: year + label: New Hampshire CCAP child age limit + reference: + - title: He-C 6910.07(b)(3) + href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml new file mode 100644 index 00000000000..c8d7d75d32d --- /dev/null +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml @@ -0,0 +1,11 @@ +description: New Hampshire limits the Child Care Scholarship Program to disabled children younger than this age. +values: + 2024-07-01: 18 + +metadata: + unit: year + period: year + label: New Hampshire CCAP disabled child age limit + reference: + - title: He-C 6910.07(e) + href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml new file mode 100644 index 00000000000..0c79a6c02aa --- /dev/null +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml @@ -0,0 +1,17 @@ +description: New Hampshire limits the Child Care Scholarship Program to children of these immigration statuses. +values: + 2024-07-01: + - CITIZEN + - LEGAL_PERMANENT_RESIDENT + - REFUGEE + - ASYLEE + - PAROLED_ONE_YEAR + - DEPORTATION_WITHHELD + +metadata: + unit: list + period: year + label: New Hampshire CCAP qualified immigration statuses + reference: + - title: He-C 6910.07(b)(2) + href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml new file mode 100644 index 00000000000..e590f5b2b71 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml @@ -0,0 +1,29 @@ +description: New Hampshire counts these income sources as countable income under the Child Care Scholarship Program. +values: + 2024-07-01: + # Earned income + - employment_income + - self_employment_income + - farm_income + # Unearned income + - social_security + - pension_income + - retirement_distributions + - unemployment_compensation + - workers_compensation + - child_support_received + - alimony_income + - interest_income + - dividend_income + - rental_income + - veterans_benefits + - disability_benefits + - capital_gains + +metadata: + unit: list + period: year + label: New Hampshire CCAP countable income sources + reference: + - title: He-C 6910.06(b), He-C 6910.06(e) + href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml new file mode 100644 index 00000000000..c19052b145c --- /dev/null +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml @@ -0,0 +1,11 @@ +description: New Hampshire limits gross income to this share of the state median income under the Child Care Scholarship Program. +values: + 2024-07-01: 0.85 + +metadata: + unit: /1 + period: year + label: New Hampshire CCAP income limit SMI rate + reference: + - title: He-C 6910.06(b) + href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml new file mode 100644 index 00000000000..d08bc7dd992 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml @@ -0,0 +1,18 @@ +description: New Hampshire provides this weekly supplement for children with disabilities or significant special needs under the Child Care Scholarship Program. + +metadata: + period: week + unit: currency-USD + label: New Hampshire CCAP disability supplement weekly amount + breakdown: + - nh_ccap_service_level + reference: + - title: He-C 6910.17(g) + href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html + +FULL_TIME: + 2024-07-01: 100 +HALF_TIME: + 2024-07-01: 75 +PART_TIME: + 2024-07-01: 50 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml new file mode 100644 index 00000000000..8fa2370f649 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml @@ -0,0 +1,11 @@ +description: New Hampshire sets this share of the licensed child care center rate for license-exempt centers under the Child Care Scholarship Program. +values: + 2024-07-01: 0.5 + +metadata: + unit: /1 + period: year + label: New Hampshire CCAP license-exempt center rate factor + reference: + - title: He-C 6910.17(d) + href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml new file mode 100644 index 00000000000..0e6fe4d37a9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml @@ -0,0 +1,11 @@ +description: New Hampshire sets this share of the licensed family child care home rate for license-exempt in-home providers under the Child Care Scholarship Program. +values: + 2024-07-01: 0.7 + +metadata: + unit: /1 + period: year + label: New Hampshire CCAP license-exempt in-home rate factor + reference: + - title: He-C 6910.17(c) + href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml new file mode 100644 index 00000000000..308865a69e4 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml @@ -0,0 +1,43 @@ +description: New Hampshire provides these weekly standard rates for licensed child care centers under the Child Care Scholarship Program. + +metadata: + period: week + unit: currency-USD + label: New Hampshire CCAP licensed center weekly rates + breakdown: + - nh_ccap_child_age_category + - nh_ccap_service_level + reference: + - title: He-C 6910.17(a) + href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html + - title: CCDF Provider Payment Rates by State (January 2025) - Tables 2-4 + href: https://acf.gov/sites/default/files/documents/occ/CCDF-Provider-Payment-Rates-by-State.pdf#page=6 + +INFANT: + FULL_TIME: + 2024-08-26: 344 + HALF_TIME: + 2024-08-26: 172 + PART_TIME: + 2024-08-26: 86 +TODDLER: + FULL_TIME: + 2024-08-26: 317 + HALF_TIME: + 2024-08-26: 159 + PART_TIME: + 2024-08-26: 79 +PRESCHOOL: + FULL_TIME: + 2024-08-26: 280 + HALF_TIME: + 2024-08-26: 140 + PART_TIME: + 2024-08-26: 70 +SCHOOL_AGE: + FULL_TIME: + 2024-08-26: 267 + HALF_TIME: + 2024-08-26: 134 + PART_TIME: + 2024-08-26: 67 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml new file mode 100644 index 00000000000..1d9ed01172c --- /dev/null +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml @@ -0,0 +1,43 @@ +description: New Hampshire provides these weekly standard rates for licensed family child care homes under the Child Care Scholarship Program. + +metadata: + period: week + unit: currency-USD + label: New Hampshire CCAP licensed family home weekly rates + breakdown: + - nh_ccap_child_age_category + - nh_ccap_service_level + reference: + - title: He-C 6910.17(b) + href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html + - title: CCDF Provider Payment Rates by State (January 2025) - Tables 2-4 + href: https://acf.gov/sites/default/files/documents/occ/CCDF-Provider-Payment-Rates-by-State.pdf#page=6 + +INFANT: + FULL_TIME: + 2024-08-26: 250 + HALF_TIME: + 2024-08-26: 125 + PART_TIME: + 2024-08-26: 63 +TODDLER: + FULL_TIME: + 2024-08-26: 250 + HALF_TIME: + 2024-08-26: 125 + PART_TIME: + 2024-08-26: 63 +PRESCHOOL: + FULL_TIME: + 2024-08-26: 250 + HALF_TIME: + 2024-08-26: 125 + PART_TIME: + 2024-08-26: 63 +SCHOOL_AGE: + FULL_TIME: + 2024-08-26: 250 + HALF_TIME: + 2024-08-26: 125 + PART_TIME: + 2024-08-26: 63 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml new file mode 100644 index 00000000000..1ac8a87012d --- /dev/null +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml @@ -0,0 +1,11 @@ +description: New Hampshire sets this threshold as the minimum weekly hours for full-time child care under the Child Care Scholarship Program. +values: + 2024-07-01: 30 + +metadata: + unit: /1 + period: year + label: New Hampshire CCAP full-time hours threshold + reference: + - title: He-C 6910.07(m), He-C 6910.16 + href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml new file mode 100644 index 00000000000..51c8e75cf52 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml @@ -0,0 +1,11 @@ +description: New Hampshire sets this threshold as the minimum weekly hours for half-time child care under the Child Care Scholarship Program. +values: + 2024-07-01: 15 + +metadata: + unit: /1 + period: year + label: New Hampshire CCAP half-time hours threshold + reference: + - title: He-C 6910.07(n), He-C 6910.16 + href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html diff --git a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/integration.yaml new file mode 100644 index 00000000000..dd1f32f5467 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/integration.yaml @@ -0,0 +1,282 @@ +# Integration tests for NH Child Care Scholarship Program (CCAP) +# He-C 6910, NH DHHS +# +# 2025 reference values: +# FPG family of 3: 15,650 + 5,500*2 = $26,650/yr = $2,220.83/mo +# FPG family of 2: 15,650 + 5,500 = $21,150/yr = $1,762.50/mo +# FPG family of 4: 15,650 + 5,500*3 = $32,150/yr = $2,679.17/mo +# NH SMI (eff 2024-10-01): $146,582/yr +# SMI family of 3: 146,582 * 0.84 = $123,128.88/yr +# 85% SMI family of 3: $104,659.55/yr = $8,721.63/mo +# SMI family of 2: 146,582 * 0.68 = $99,675.76/yr +# 85% SMI family of 2: $84,724.40/yr = $7,060.37/mo +# 100% FPG monthly (fam 3): $2,220.83 +# 138% FPG monthly (fam 3): $3,064.75 + +- name: Case 1, basic eligible family, income below 100% FPG, $0 cost share. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 28 + employment_income: 20_400 + # $20,400/yr = $1,700/mo < $1,762.50 (100% FPG for 2) + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + nh_ccap_provider_type: LICENSED_CENTER + pre_subsidy_childcare_expenses: 18_720 + # $18,720/yr = $360/week + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NH + output: + # Eligibility chain + nh_ccap_eligible_child: [false, true] + nh_ccap_income_eligible: true + nh_ccap_eligible: true + + # Cost share: $1,700/mo < $1,762.50 (100% FPG for 2) → Step 1 → $0/week + nh_ccap_cost_share: 0 + +- name: Case 2, income between 100-138% FPG, $5 weekly cost share. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 32 + employment_income: 24_000 + # $24,000/yr = $2,000/mo + # Family of 2: 100% FPG = $1,762.50; 138% FPG = $2,432.25 + # $2,000 > $1,762.50 and < $2,432.25 → Step 2 + person2: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 25 + nh_ccap_provider_type: LICENSED_FAMILY + pre_subsidy_childcare_expenses: 15_600 + # $15,600/yr = $300/week + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NH + output: + nh_ccap_eligible_child: [false, true] + nh_ccap_income_eligible: true + nh_ccap_eligible: true + + # Cost share: Step 2 → $5/week + nh_ccap_cost_share: 5 + +- name: Case 3, income above 138% FPG, 7% cost share calculation. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 60_000 + # $60,000/yr = $5,000/mo > $3,064.75 (138% FPG for 3) + # Step 3: 7% * $5,000 / 4.33 = $80.77/week + person2: + age: 35 + employment_income: 0 + person3: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 12 + nh_ccap_provider_type: LICENSED_CENTER + pre_subsidy_childcare_expenses: 7_800 + # $7,800/yr = $150/week + spm_units: + spm_unit: + members: [person1, person2, person3] + meets_ccdf_activity_test: true + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: NH + output: + nh_ccap_eligible_child: [false, false, true] + nh_ccap_income_eligible: true + nh_ccap_eligible: true + + # Cost share: 7% * $5,000 / (52/12) = $350 / 4.3333 = $80.77/week + nh_ccap_cost_share: 80.77 + +- name: Case 4, two eligible children, cost share split equally. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + # $24,000/yr = $2,000/mo + # Family of 4: 100% FPG = $2,679.17/mo + # $2,000 < $2,679.17 → Step 1 → $0 + person2: + age: 35 + employment_income: 0 + person3: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nh_ccap_provider_type: LICENSED_CENTER + pre_subsidy_childcare_expenses: 20_800 + # $400/week + person4: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 10 + nh_ccap_provider_type: LICENSED_FAMILY + pre_subsidy_childcare_expenses: 7_800 + # $150/week + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + meets_ccdf_activity_test: true + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: NH + output: + nh_ccap_eligible_child: [false, false, true, true] + nh_ccap_income_eligible: true + nh_ccap_eligible: true + + # Cost share: $2,000/mo < $2,679.17 (100% FPG for 4) → $0/week + nh_ccap_cost_share: 0 + +- name: Case 5, TANF enrolled bypasses income test. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 25 + employment_income: 120_000 + # Well above 85% SMI for family of 2 + person2: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + nh_ccap_provider_type: LICENSED_CENTER + pre_subsidy_childcare_expenses: 18_720 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + is_tanf_enrolled: true + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NH + output: + # TANF enrolled → income eligible regardless + nh_ccap_income_eligible: true + nh_ccap_eligible: true + +- name: Case 6, disabled child age 14, eligible via disability extension. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 36_000 + person2: + age: 14 + is_disabled: true + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nh_ccap_provider_type: LICENSED_CENTER + pre_subsidy_childcare_expenses: 20_800 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NH + output: + # Child is 14 but disabled → eligible via He-C 6910.07(e) + nh_ccap_eligible_child: [false, true] + nh_ccap_income_eligible: true + nh_ccap_eligible: true + +- name: Case 7, income above 85% SMI, not TANF enrolled, ineligible. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 108_000 + # $108,000/yr = $9,000/mo + # Family of 3: 85% SMI = $8,721.63/mo + # $9,000 > $8,721.63 → ineligible + person2: + age: 35 + employment_income: 0 + person3: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + nh_ccap_provider_type: LICENSED_CENTER + pre_subsidy_childcare_expenses: 18_720 + spm_units: + spm_unit: + members: [person1, person2, person3] + meets_ccdf_activity_test: true + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: NH + output: + nh_ccap_eligible_child: [false, false, true] + nh_ccap_income_eligible: false + nh_ccap_eligible: false + nh_ccap: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap.yaml b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap.yaml new file mode 100644 index 00000000000..f01cae75627 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap.yaml @@ -0,0 +1,272 @@ +# Tests for nh_ccap (SPMUnit, MONTH) +# Final benefit = sum over eligible children of: +# max(0, min(provider charge, payment rate + disability supplement) - per-child cost share) +# * weeks_per_month +# He-C 6910.17(e), He-C 6910.18(f) +# +# Uses direct input overrides for intermediate variables +# to isolate benefit calculation logic. +# weeks_per_month = 52/12 = 4.3333... + +- name: Case 1, eligible, rate lower than charge, benefit is rate minus cost share. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 5 + nh_ccap_eligible_child: true + nh_ccap_payment_rate: 300 + pre_subsidy_childcare_expenses: 18_720 + # $18,720/yr = $360/week (> $300 rate) + spm_units: + spm_unit: + members: [person1, person2] + nh_ccap_eligible: true + nh_ccap_cost_share: 10 + households: + household: + members: [person1, person2] + state_code: NH + output: + # min($360/wk charge, $300 rate) = $300 + # 1 eligible child: per-child cost share = $10/1 = $10 + # Weekly: $300 - $10 = $290 + # Monthly: $290 * (52/12) = $1,256.67 + nh_ccap: 1_256.67 + +- name: Case 2, eligible, charge lower than rate, benefit is charge minus cost share. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 5 + nh_ccap_eligible_child: true + nh_ccap_payment_rate: 300 + pre_subsidy_childcare_expenses: 10_400 + # $10,400/yr = $200/week (< $300 rate) + spm_units: + spm_unit: + members: [person1, person2] + nh_ccap_eligible: true + nh_ccap_cost_share: 5 + households: + household: + members: [person1, person2] + state_code: NH + output: + # min($200/wk charge, $300 rate) = $200 + # 1 eligible child: per-child cost share = $5/1 = $5 + # Weekly: $200 - $5 = $195 + # Monthly: $195 * (52/12) = $845 + nh_ccap: 845 + +- name: Case 3, ineligible, zero benefit. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 5 + nh_ccap_eligible_child: true + nh_ccap_payment_rate: 300 + pre_subsidy_childcare_expenses: 18_720 + spm_units: + spm_unit: + members: [person1, person2] + nh_ccap_eligible: false + nh_ccap_cost_share: 10 + households: + household: + members: [person1, person2] + state_code: NH + output: + nh_ccap: 0 + +- name: Case 4, two eligible children, cost share split equally. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 5 + nh_ccap_eligible_child: true + nh_ccap_payment_rate: 300 + pre_subsidy_childcare_expenses: 18_720 + # $360/week charge + person3: + age: 3 + nh_ccap_eligible_child: true + nh_ccap_payment_rate: 350 + pre_subsidy_childcare_expenses: 20_280 + # $390/week charge + spm_units: + spm_unit: + members: [person1, person2, person3] + nh_ccap_eligible: true + nh_ccap_cost_share: 20 + households: + household: + members: [person1, person2, person3] + state_code: NH + output: + # Person2: min($360, $300) - $20/2 = $300 - $10 = $290/week + # Person3: min($390, $350) - $20/2 = $350 - $10 = $340/week + # Total weekly: $290 + $340 = $630 + # Monthly: $630 * (52/12) = $2,730 + nh_ccap: 2_730 + +- name: Case 5, cost share exceeds rate, benefit floors at zero. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 5 + nh_ccap_eligible_child: true + nh_ccap_payment_rate: 50 + pre_subsidy_childcare_expenses: 2_600 + # $50/week charge + spm_units: + spm_unit: + members: [person1, person2] + nh_ccap_eligible: true + nh_ccap_cost_share: 70 + households: + household: + members: [person1, person2] + state_code: NH + output: + # min($50, $50) - $70/1 = $50 - $70 = -$20 → $0 + nh_ccap: 0 + +# --- Edge Cases --- + +- name: Case 6, zero childcare expenses, zero benefit. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 5 + nh_ccap_eligible_child: true + nh_ccap_payment_rate: 300 + pre_subsidy_childcare_expenses: 0 + spm_units: + spm_unit: + members: [person1, person2] + nh_ccap_eligible: true + nh_ccap_cost_share: 0 + households: + household: + members: [person1, person2] + state_code: NH + output: + # weekly_expense = $0/52 = $0 + # min($0, $300) = $0; $0 - $0 = $0/week → $0/month + nh_ccap: 0 + +- name: Case 7, cost share exactly equals capped rate, zero benefit. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 5 + nh_ccap_eligible_child: true + nh_ccap_payment_rate: 200 + pre_subsidy_childcare_expenses: 15_600 + # $15,600/yr = $300/week (> $200 rate) + spm_units: + spm_unit: + members: [person1, person2] + nh_ccap_eligible: true + nh_ccap_cost_share: 200 + households: + household: + members: [person1, person2] + state_code: NH + output: + # min($300/wk, $200) = $200; $200 - $200/1 = $0 → $0/month + nh_ccap: 0 + +- name: Case 8, three eligible children, cost share split three ways. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + person2: + age: 3 + nh_ccap_eligible_child: true + nh_ccap_payment_rate: 280 + pre_subsidy_childcare_expenses: 18_200 + # $18,200/yr = $350/week + person3: + age: 5 + nh_ccap_eligible_child: true + nh_ccap_payment_rate: 250 + pre_subsidy_childcare_expenses: 15_600 + # $15,600/yr = $300/week + person4: + age: 8 + nh_ccap_eligible_child: true + nh_ccap_payment_rate: 200 + pre_subsidy_childcare_expenses: 13_000 + # $13,000/yr = $250/week + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + nh_ccap_eligible: true + nh_ccap_cost_share: 30 + households: + household: + members: [person1, person2, person3, person4] + state_code: NH + output: + # Per-child cost share: $30/3 = $10/week each + # Person2: min($350, $280) - $10 = $280 - $10 = $270/week + # Person3: min($300, $250) - $10 = $250 - $10 = $240/week + # Person4: min($250, $200) - $10 = $200 - $10 = $190/week + # Total weekly: $270 + $240 + $190 = $700/week + # Monthly: $700 * (52/12) = $700 * 4.3333 = $3,033.33 + nh_ccap: 3_033.33 + +- name: Case 9, no eligible children in spm unit, zero benefit. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 14 + nh_ccap_eligible_child: false + spm_units: + spm_unit: + members: [person1, person2] + nh_ccap_eligible: true + nh_ccap_cost_share: 0 + households: + household: + members: [person1, person2] + state_code: NH + output: + # No eligible children → no per-child payments → $0 + nh_ccap: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_child_age_category.yaml b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_child_age_category.yaml new file mode 100644 index 00000000000..9806ed237c3 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_child_age_category.yaml @@ -0,0 +1,153 @@ +# Tests for nh_ccap_child_age_category (Person, MONTH) +# Age categories based on age in months. +# He-C 6910.17(i), He-C 6912.16(j) +# INFANT: 0-17 months +# TODDLER: 18-35 months +# PRESCHOOL: 36-78 months +# SCHOOL_AGE: 79-155 months +# +# Note: monthly_age returns age in years; formula multiplies by 12. +# age=0 → 0 months → INFANT +# age=1 → 12 months → INFANT (< 18) +# age=2 → 24 months → TODDLER (>= 18 and < 36) +# age=3 → 36 months → PRESCHOOL (>= 36 and < 79) +# age=5 → 60 months → PRESCHOOL +# age=7 → 84 months → SCHOOL_AGE (>= 79) +# age=12 → 144 months → SCHOOL_AGE (< 156) + +- name: Case 1, age 0, infant. + period: 2025-01 + input: + people: + person1: + age: 0 + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_child_age_category: INFANT + +- name: Case 2, age 1, infant. + period: 2025-01 + input: + people: + person1: + age: 1 + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_child_age_category: INFANT + +- name: Case 3, age 2, toddler. + period: 2025-01 + input: + people: + person1: + age: 2 + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_child_age_category: TODDLER + +- name: Case 4, age 3, preschool. + period: 2025-01 + input: + people: + person1: + age: 3 + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_child_age_category: PRESCHOOL + +- name: Case 5, age 5, preschool. + period: 2025-01 + input: + people: + person1: + age: 5 + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_child_age_category: PRESCHOOL + +- name: Case 6, age 6, preschool. + period: 2025-01 + input: + people: + person1: + age: 6 + households: + household: + members: [person1] + state_code: NH + output: + # age=6 → 72 months → PRESCHOOL (< 79) + nh_ccap_child_age_category: PRESCHOOL + +- name: Case 7, age 7, school age. + period: 2025-01 + input: + people: + person1: + age: 7 + households: + household: + members: [person1] + state_code: NH + output: + # age=7 → 84 months → SCHOOL_AGE (>= 79) + nh_ccap_child_age_category: SCHOOL_AGE + +- name: Case 8, age 12, school age. + period: 2025-01 + input: + people: + person1: + age: 12 + households: + household: + members: [person1] + state_code: NH + output: + # age=12 → 144 months → SCHOOL_AGE (< 156) + nh_ccap_child_age_category: SCHOOL_AGE + +# --- Edge Cases: Maximum and minimum ages --- + +- name: Case 9, age 13, school age (beyond normal eligibility but tests category). + period: 2025-01 + input: + people: + person1: + age: 13 + households: + household: + members: [person1] + state_code: NH + output: + # age=13 → 156 months → SCHOOL_AGE (>= 79) + nh_ccap_child_age_category: SCHOOL_AGE + +- name: Case 10, age 17, school age (disabled child upper bound). + period: 2025-01 + input: + people: + person1: + age: 17 + households: + household: + members: [person1] + state_code: NH + output: + # age=17 → 204 months → SCHOOL_AGE + nh_ccap_child_age_category: SCHOOL_AGE diff --git a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_cost_share.yaml b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_cost_share.yaml new file mode 100644 index 00000000000..5e2c728ad9d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_cost_share.yaml @@ -0,0 +1,242 @@ +# Tests for nh_ccap_cost_share (SPMUnit, MONTH) +# Weekly family cost share based on income relative to FPG. +# He-C 6910.18, Table 6910.19 +# +# 2025 FPG family of 3: 15,650 + 5,500*2 = $26,650/year = $2,220.83/month +# Step 1: <= 100% FPG ($2,220.83/mo) → $0/week +# Step 2: > 100% to <= 138% FPG ($3,064.75/mo) → $5/week +# Step 3: > 138% FPG → 7% * monthly income / (52/12) +# +# 2025 FPG family of 2: 15,650 + 5,500 = $21,150/year = $1,762.50/month +# 2025 FPG family of 1: $15,650/year = $1,304.17/month + +- name: Case 1, income at 80% FPG, step 1, $0 cost share. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 21_324 + # $21,324/yr = $1,777/mo < $2,220.83 (100% FPG for 3) + person2: + age: 5 + person3: + age: 3 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: NH + output: + nh_ccap_cost_share: 0 + +- name: Case 2, income at 120% FPG, step 2, $5 cost share. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 31_980 + # $31,980/yr = $2,665/mo > $2,220.83 (100% FPG) + # and < $3,064.75 (138% FPG) → Step 2 + person2: + age: 5 + person3: + age: 3 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: NH + output: + nh_ccap_cost_share: 5 + +- name: Case 3, income at 200% FPG, step 3, 7% cost share. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 53_304 + # $53,304/yr = $4,442/mo > $3,064.75 (138% FPG) + # Step 3: 7% * $4,442 / (52/12) = $71.77/week + person2: + age: 5 + person3: + age: 3 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: NH + output: + # $4,442 * 0.07 / (52/12) = $310.94 / 4.3333 = $71.76 + nh_ccap_cost_share: 71.76 + +- name: Case 4, income exactly at 100% FPG boundary, step 1. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 26_650 + # $26,650/yr = $2,220.83/mo = exactly 100% FPG + person2: + age: 5 + person3: + age: 3 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: NH + output: + nh_ccap_cost_share: 0 + +- name: Case 5, income just below 138% FPG boundary, step 2. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 36_600 + # 138% FPG = $26,650 * 1.38 = $36,777/yr = $3,064.75/mo + # $36,600/yr = $3,050/mo < $3,064.75 → Step 2 + person2: + age: 5 + person3: + age: 3 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: NH + output: + nh_ccap_cost_share: 5 + +# --- Edge Cases --- + +- name: Case 6, income $1 above 100% FPG, transitions from step 1 to step 2. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 21_163 + # 2025 FPG family of 2: $21,150/yr = $1,762.50/mo + # $21,163/yr = $1,763.58/mo > $1,762.50 (100% FPG) → Step 2 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NH + output: + nh_ccap_cost_share: 5 + +- name: Case 7, income $1 above 138% FPG, transitions from step 2 to step 3. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 29_200 + # 2025 FPG family of 2: $21,150 + # 138% FPG = $29,187/yr = $2,432.25/mo + # $29,200/yr = $2,433.33/mo > $2,432.25 → Step 3 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NH + output: + # $2,433.33 * 0.07 = $170.33 + # $170.33 / (52/12) = $170.33 / 4.3333 = $39.31 + nh_ccap_cost_share: 39.31 + +- name: Case 8, zero income, step 1, $0 cost share. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 0 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NH + output: + # $0 <= 100% FPG → Step 1 → $0 + nh_ccap_cost_share: 0 + +- name: Case 9, single person household, income at 100% FPG boundary. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 5 + employment_income: 15_650 + # 2025 FPG family of 1: $15,650/yr = $1,304.17/mo + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: NH + output: + # $1,304.17 <= $1,304.17 (100% FPG for 1) → Step 1 → $0 + nh_ccap_cost_share: 0 + +- name: Case 10, negative self-employment income, step 1, $0 cost share. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + self_employment_income: -60_000_000 + # Large negative → countable income negative + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NH + output: + # Negative income <= 100% FPG → Step 1 → $0 + nh_ccap_cost_share: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_disability_supplement.yaml b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_disability_supplement.yaml new file mode 100644 index 00000000000..d8f980c8186 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_disability_supplement.yaml @@ -0,0 +1,68 @@ +# Tests for nh_ccap_disability_supplement (Person, MONTH) +# Weekly disability supplement by service level. +# He-C 6910.17(g) +# Full-time: $100/week, Half-time: $75/week, Part-time: $50/week + +- name: Case 1, disabled child, full-time, $100 supplement. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + is_disabled: true + nh_ccap_eligible_child: true + nh_ccap_service_level: FULL_TIME + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_disability_supplement: 100 + +- name: Case 2, disabled child, half-time, $75 supplement. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + is_disabled: true + nh_ccap_eligible_child: true + nh_ccap_service_level: HALF_TIME + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_disability_supplement: 75 + +- name: Case 3, disabled child, part-time, $50 supplement. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + is_disabled: true + nh_ccap_eligible_child: true + nh_ccap_service_level: PART_TIME + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_disability_supplement: 50 + +- name: Case 4, non-disabled child, no supplement. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + is_disabled: false + nh_ccap_eligible_child: true + nh_ccap_service_level: FULL_TIME + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_disability_supplement: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_eligible.yaml new file mode 100644 index 00000000000..2b35652d6cc --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_eligible.yaml @@ -0,0 +1,258 @@ +# Tests for nh_ccap_eligible (SPMUnit, MONTH) +# Overall eligibility combines: has eligible child, income eligible, +# asset eligible, and activity test. +# He-C 6910.06, He-C 6910.07 + +- name: Case 1, all criteria met, eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: NH + output: + nh_ccap_eligible: true + +- name: Case 2, no eligible child, ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + person2: + age: 14 + is_tax_unit_dependent: true + is_disabled: false + immigration_status: CITIZEN + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: NH + output: + nh_ccap_eligible: false + +- name: Case 3, income too high, ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 120_000 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: NH + output: + nh_ccap_eligible: false + +- name: Case 4, activity test not met, ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: false + households: + household: + members: [person1, person2] + state_code: NH + output: + nh_ccap_eligible: false + +- name: Case 5, assets over $1M, ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + spm_unit_assets: 1_100_000 + households: + household: + members: [person1, person2] + state_code: NH + output: + nh_ccap_eligible: false + +- name: Case 6, undocumented child, ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: UNDOCUMENTED + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: NH + output: + nh_ccap_eligible: false + +# --- Edge Cases --- + +- name: Case 7, child exactly age 13, ineligible due to age. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + person2: + age: 13 + is_disabled: false + is_tax_unit_dependent: true + immigration_status: CITIZEN + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: NH + output: + # child_age_limit = 13, age < 13 → false → no eligible child + nh_ccap_eligible: false + +- name: Case 8, disabled child age 17, eligible via disability extension. + period: 2025-01 + input: + people: + person1: + age: 35 + employment_income: 36_000 + person2: + age: 17 + is_disabled: true + is_tax_unit_dependent: true + immigration_status: CITIZEN + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: NH + output: + # disabled_child_age_limit = 18, age 17 < 18 → eligible child + nh_ccap_eligible: true + +- name: Case 9, disabled child age 18, ineligible due to age. + period: 2025-01 + input: + people: + person1: + age: 40 + employment_income: 36_000 + person2: + age: 18 + is_disabled: true + is_tax_unit_dependent: true + immigration_status: CITIZEN + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: NH + output: + # disabled_child_age_limit = 18, age 18 < 18 → false + nh_ccap_eligible: false + +- name: Case 10, zero income, all criteria met, eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 0 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: NH + output: + nh_ccap_eligible: true + +- name: Case 11, assets exactly at $1M limit, eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + spm_unit_assets: 1_000_000 + households: + household: + members: [person1, person2] + state_code: NH + output: + # CCDF asset limit is $1M; at exactly $1M → eligible + nh_ccap_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_eligible_child.yaml b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_eligible_child.yaml new file mode 100644 index 00000000000..cec0d5df0e2 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_eligible_child.yaml @@ -0,0 +1,184 @@ +# Tests for nh_ccap_eligible_child (Person, MONTH) +# Child must be: under 13 (or disabled under disabled age limit), +# a tax unit dependent, and immigration-status eligible. +# He-C 6910.07(b)(2)-(3), He-C 6910.07(e) + +- name: Case 1, child age 5, citizen, dependent, eligible. + period: 2025-01 + input: + people: + person1: + age: 5 + is_disabled: false + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_eligible_child: true + +- name: Case 2, child age 13, not disabled, ineligible. + period: 2025-01 + input: + people: + person1: + age: 13 + is_disabled: false + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_eligible_child: false + +- name: Case 3, child age 12, not disabled, eligible. + period: 2025-01 + input: + people: + person1: + age: 12 + is_disabled: false + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_eligible_child: true + +- name: Case 4, child age 14, disabled, eligible. + period: 2025-01 + input: + people: + person1: + age: 14 + is_disabled: true + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_eligible_child: true + +- name: Case 5, child age 5, undocumented, ineligible. + period: 2025-01 + input: + people: + person1: + age: 5 + is_disabled: false + is_tax_unit_dependent: true + immigration_status: UNDOCUMENTED + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_eligible_child: false + +- name: Case 6, child age 5, not dependent, ineligible. + period: 2025-01 + input: + people: + person1: + age: 5 + is_disabled: false + is_tax_unit_dependent: false + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_eligible_child: false + +- name: Case 7, child age 5, refugee, eligible. + period: 2025-01 + input: + people: + person1: + age: 5 + is_disabled: false + is_tax_unit_dependent: true + immigration_status: REFUGEE + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_eligible_child: true + +# --- Edge Cases --- + +- name: Case 8, disabled child exactly age 17, eligible. + period: 2025-01 + input: + people: + person1: + age: 17 + is_disabled: true + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NH + output: + # disabled_child_age_limit = 18, age < 18 → true + nh_ccap_eligible_child: true + +- name: Case 9, disabled child exactly age 18, ineligible. + period: 2025-01 + input: + people: + person1: + age: 18 + is_disabled: true + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NH + output: + # disabled_child_age_limit = 18, age < 18 → false + nh_ccap_eligible_child: false + +- name: Case 10, non-disabled child age 0, eligible. + period: 2025-01 + input: + people: + person1: + age: 0 + is_disabled: false + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_eligible_child: true + +- name: Case 11, adult age 30, not a dependent, ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + is_disabled: false + is_tax_unit_dependent: false + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_eligible_child: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_immigration_status_eligible_person.yaml b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_immigration_status_eligible_person.yaml new file mode 100644 index 00000000000..60e12f51a09 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_immigration_status_eligible_person.yaml @@ -0,0 +1,81 @@ +# Tests for nh_ccap_immigration_status_eligible_person (Person, MONTH) +# Child must be US citizen or qualifying non-citizen. +# He-C 6910.07(b)(2) + +- name: Case 1, citizen, eligible. + period: 2025-01 + input: + people: + person1: + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_immigration_status_eligible_person: true + +- name: Case 2, legal permanent resident, eligible. + period: 2025-01 + input: + people: + person1: + immigration_status: LEGAL_PERMANENT_RESIDENT + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_immigration_status_eligible_person: true + +- name: Case 3, refugee, eligible. + period: 2025-01 + input: + people: + person1: + immigration_status: REFUGEE + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_immigration_status_eligible_person: true + +- name: Case 4, asylee, eligible. + period: 2025-01 + input: + people: + person1: + immigration_status: ASYLEE + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_immigration_status_eligible_person: true + +- name: Case 5, undocumented, ineligible. + period: 2025-01 + input: + people: + person1: + immigration_status: UNDOCUMENTED + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_immigration_status_eligible_person: false + +- name: Case 6, DACA, ineligible. + period: 2025-01 + input: + people: + person1: + immigration_status: DACA + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_immigration_status_eligible_person: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_income_eligible.yaml new file mode 100644 index 00000000000..2fdd039ace0 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_income_eligible.yaml @@ -0,0 +1,228 @@ +# Tests for nh_ccap_income_eligible (SPMUnit, MONTH) +# Income must be <= 85% SMI, OR family is TANF-enrolled. +# He-C 6910.06(a)(1), He-C 6910.06(b) +# +# 2025 NH SMI (eff 2024-10-01): $146,582 +# Family of 3 adjustment: 0.52 + 0.16*2 = 0.84 +# SMI for family of 3: 146,582 * 0.84 = $123,128.88/year +# 85% SMI = $104,659.55/year = $8,721.63/month +# Family of 2 adjustment: 0.52 + 0.16 = 0.68 +# SMI for family of 2: 146,582 * 0.68 = $99,675.76/year +# 85% SMI = $84,724.40/year = $7,060.37/month + +- name: Case 1, income well below 85% SMI, eligible. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + person2: + age: 5 + person3: + age: 3 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: NH + output: + # $36,000/yr = $3,000/mo < $8,721.63 → eligible + nh_ccap_income_eligible: true + +- name: Case 2, income above 85% SMI, ineligible. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 108_000 + person2: + age: 5 + person3: + age: 3 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: NH + output: + # $108,000/yr = $9,000/mo > $8,721.63 (85% SMI for 3) → ineligible + nh_ccap_income_eligible: false + +- name: Case 3, income above 85% SMI but TANF enrolled, eligible. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 108_000 + person2: + age: 5 + person3: + age: 3 + spm_units: + spm_unit: + members: [person1, person2, person3] + is_tanf_enrolled: true + households: + household: + members: [person1, person2, person3] + state_code: NH + output: + # TANF enrolled → income eligible regardless of income + nh_ccap_income_eligible: true + +- name: Case 4, single parent with one child, income below 85% SMI, eligible. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 25 + employment_income: 30_000 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NH + output: + # $30,000/yr = $2,500/mo < $7,060.37 (85% SMI for 2) → eligible + nh_ccap_income_eligible: true + +- name: Case 5, self-employment income counted toward income test. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + self_employment_income: 108_000 + person2: + age: 5 + person3: + age: 3 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: NH + output: + # $108,000/yr = $9,000/mo > $8,721.63 (85% SMI for 3) → ineligible + nh_ccap_income_eligible: false + +# --- Edge Cases --- + +- name: Case 6, income just below 85% SMI threshold, eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 84_724 + # 2025 NH SMI family of 2: $146,582 * 0.68 = $99,675.76/yr + # 85% SMI = $84,724.40/yr = $7,060.37/mo + # $84,724/yr = $7,060.33/mo <= $7,060.37 → eligible + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NH + output: + nh_ccap_income_eligible: true + +- name: Case 7, income just above 85% SMI threshold, ineligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 84_725 + # $84,725/yr = $7,060.42/mo > $7,060.37 → ineligible + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NH + output: + nh_ccap_income_eligible: false + +- name: Case 8, zero income, eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 0 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NH + output: + nh_ccap_income_eligible: true + +- name: Case 9, negative self-employment income, eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + self_employment_income: -60_000_000 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NH + output: + # Negative income <= 85% SMI → eligible + nh_ccap_income_eligible: true + +- name: Case 10, TANF enrolled with zero income, eligible. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 0 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: NH + output: + nh_ccap_income_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_payment_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_payment_rate.yaml new file mode 100644 index 00000000000..367995642c3 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_payment_rate.yaml @@ -0,0 +1,251 @@ +# Tests for nh_ccap_payment_rate (Person, MONTH) +# Weekly payment rate by provider type, age category, and service level. +# He-C 6910.17(a)-(d) +# +# Provider types and rate basis: +# LICENSED_CENTER: 75th percentile MRS +# LICENSED_FAMILY: 75th percentile MRS +# LICENSE_EXEMPT_IN_HOME: 70% of licensed family rate (He-C 6910.17(c)) +# LICENSE_EXEMPT_CENTER: 50% of licensed center rate (He-C 6910.17(d)) +# +# NOTE: nh_ccap_payment_rate does NOT include disability supplement. +# Disability supplement is added separately in nh_ccap.py. + +- name: Case 1, licensed center, infant, full-time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + nh_ccap_eligible_child: true + nh_ccap_child_age_category: INFANT + nh_ccap_service_level: FULL_TIME + nh_ccap_provider_type: LICENSED_CENTER + households: + household: + members: [person1] + state_code: NH + output: + # Licensed center infant full-time: $344/week + nh_ccap_payment_rate: 344 + +- name: Case 2, licensed family, toddler, half-time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + nh_ccap_eligible_child: true + nh_ccap_child_age_category: TODDLER + nh_ccap_service_level: HALF_TIME + nh_ccap_provider_type: LICENSED_FAMILY + households: + household: + members: [person1] + state_code: NH + output: + # Licensed family toddler half-time: $125/week + nh_ccap_payment_rate: 125 + +- name: Case 3, licensed center, school age, part-time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + nh_ccap_eligible_child: true + nh_ccap_child_age_category: SCHOOL_AGE + nh_ccap_service_level: PART_TIME + nh_ccap_provider_type: LICENSED_CENTER + households: + household: + members: [person1] + state_code: NH + output: + # Licensed center school-age part-time: $67/week + nh_ccap_payment_rate: 67 + +- name: Case 4, license-exempt in-home, preschool, full-time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + nh_ccap_eligible_child: true + nh_ccap_child_age_category: PRESCHOOL + nh_ccap_service_level: FULL_TIME + nh_ccap_provider_type: LICENSE_EXEMPT_IN_HOME + households: + household: + members: [person1] + state_code: NH + output: + # 70% of licensed family preschool full-time ($250) = $175 + nh_ccap_payment_rate: 175 + +- name: Case 5, license-exempt center, toddler, full-time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + nh_ccap_eligible_child: true + nh_ccap_child_age_category: TODDLER + nh_ccap_service_level: FULL_TIME + nh_ccap_provider_type: LICENSE_EXEMPT_CENTER + households: + household: + members: [person1] + state_code: NH + output: + # 50% of licensed center toddler full-time ($317) = $158.50 + nh_ccap_payment_rate: 158.50 + +- name: Case 6, licensed center, infant, full-time, disabled child (rate excludes supplement). + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + nh_ccap_eligible_child: true + nh_ccap_child_age_category: INFANT + nh_ccap_service_level: FULL_TIME + nh_ccap_provider_type: LICENSED_CENTER + is_disabled: true + households: + household: + members: [person1] + state_code: NH + output: + # Base rate only; disability supplement is in nh_ccap_disability_supplement + # Licensed center infant full-time: $344/week + nh_ccap_payment_rate: 344 + +- name: Case 7, licensed family, preschool, half-time, disabled child (rate excludes supplement). + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + nh_ccap_eligible_child: true + nh_ccap_child_age_category: PRESCHOOL + nh_ccap_service_level: HALF_TIME + nh_ccap_provider_type: LICENSED_FAMILY + is_disabled: true + households: + household: + members: [person1] + state_code: NH + output: + # Base rate only; disability supplement is in nh_ccap_disability_supplement + # Licensed family preschool half-time: $125/week + nh_ccap_payment_rate: 125 + +- name: Case 8, license-exempt in-home, school age, part-time, disabled child (rate excludes supplement). + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + nh_ccap_eligible_child: true + nh_ccap_child_age_category: SCHOOL_AGE + nh_ccap_service_level: PART_TIME + nh_ccap_provider_type: LICENSE_EXEMPT_IN_HOME + is_disabled: true + households: + household: + members: [person1] + state_code: NH + output: + # 70% of licensed family school-age part-time ($63) = $44.10 + nh_ccap_payment_rate: 44.10 + +- name: Case 9, licensed family, infant, full-time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + nh_ccap_eligible_child: true + nh_ccap_child_age_category: INFANT + nh_ccap_service_level: FULL_TIME + nh_ccap_provider_type: LICENSED_FAMILY + households: + household: + members: [person1] + state_code: NH + output: + # Licensed family infant full-time: $250/week + nh_ccap_payment_rate: 250 + +- name: Case 10, license-exempt in-home, infant, full-time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + nh_ccap_eligible_child: true + nh_ccap_child_age_category: INFANT + nh_ccap_service_level: FULL_TIME + nh_ccap_provider_type: LICENSE_EXEMPT_IN_HOME + households: + household: + members: [person1] + state_code: NH + output: + # 70% of licensed family infant full-time ($250) = $175 + nh_ccap_payment_rate: 175 + +- name: Case 11, license-exempt center, infant, full-time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + nh_ccap_eligible_child: true + nh_ccap_child_age_category: INFANT + nh_ccap_service_level: FULL_TIME + nh_ccap_provider_type: LICENSE_EXEMPT_CENTER + households: + household: + members: [person1] + state_code: NH + output: + # 50% of licensed center infant full-time ($344) = $172 + nh_ccap_payment_rate: 172 + +- name: Case 12, licensed center, school age, half-time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + nh_ccap_eligible_child: true + nh_ccap_child_age_category: SCHOOL_AGE + nh_ccap_service_level: HALF_TIME + nh_ccap_provider_type: LICENSED_CENTER + households: + household: + members: [person1] + state_code: NH + output: + # Licensed center school-age half-time: $134/week + nh_ccap_payment_rate: 134 + +- name: Case 13, license-exempt center, school age, part-time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + nh_ccap_eligible_child: true + nh_ccap_child_age_category: SCHOOL_AGE + nh_ccap_service_level: PART_TIME + nh_ccap_provider_type: LICENSE_EXEMPT_CENTER + households: + household: + members: [person1] + state_code: NH + output: + # 50% of licensed center school-age part-time ($67) = $33.50 + nh_ccap_payment_rate: 33.50 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_service_level.yaml b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_service_level.yaml new file mode 100644 index 00000000000..135a1f2a437 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_service_level.yaml @@ -0,0 +1,171 @@ +# Tests for nh_ccap_service_level (Person, MONTH) +# Service level based on childcare hours per week. +# He-C 6910.07(m)-(o), He-C 6910.16 +# Full-time: >= 30 hours/week (He-C 6910.07(m): "30 or more hours per week") +# Half-time: >= 15 and < 30 hours/week +# Part-time: < 15 hours/week + +- name: Case 1, 40 hours per week, full-time. + period: 2025-01 + input: + people: + person1: + childcare_hours_per_week: 40 + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_service_level: FULL_TIME + +- name: Case 2, 31 hours per week, full-time. + period: 2025-01 + input: + people: + person1: + childcare_hours_per_week: 31 + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_service_level: FULL_TIME + +- name: Case 3, 30 hours per week, full-time. + period: 2025-01 + input: + people: + person1: + childcare_hours_per_week: 30 + households: + household: + members: [person1] + state_code: NH + output: + # He-C 6910.07(m): "30 or more hours" = full-time + nh_ccap_service_level: FULL_TIME + +- name: Case 4, 20 hours per week, half-time. + period: 2025-01 + input: + people: + person1: + childcare_hours_per_week: 20 + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_service_level: HALF_TIME + +- name: Case 5, 15 hours per week, half-time. + period: 2025-01 + input: + people: + person1: + childcare_hours_per_week: 15 + households: + household: + members: [person1] + state_code: NH + output: + # He-C 6910.07(n): "15 or more hours" includes 15 → HALF_TIME + nh_ccap_service_level: HALF_TIME + +- name: Case 6, 10 hours per week, part-time. + period: 2025-01 + input: + people: + person1: + childcare_hours_per_week: 10 + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_service_level: PART_TIME + +- name: Case 7, 16 hours per week, half-time. + period: 2025-01 + input: + people: + person1: + childcare_hours_per_week: 16 + households: + household: + members: [person1] + state_code: NH + output: + nh_ccap_service_level: HALF_TIME + +# --- Edge Cases: Exact boundary hours --- + +- name: Case 8, exactly 15 hours per week, half-time boundary. + period: 2025-01 + input: + people: + person1: + childcare_hours_per_week: 15 + households: + household: + members: [person1] + state_code: NH + output: + # half_time_hours = 15, hours >= 15 → true → HALF_TIME + nh_ccap_service_level: HALF_TIME + +- name: Case 9, exactly 30 hours per week, full-time boundary. + period: 2025-01 + input: + people: + person1: + childcare_hours_per_week: 30 + households: + household: + members: [person1] + state_code: NH + output: + # full_time_hours = 30, hours >= 30 → true → FULL_TIME + nh_ccap_service_level: FULL_TIME + +- name: Case 10, zero hours per week, part-time. + period: 2025-01 + input: + people: + person1: + childcare_hours_per_week: 0 + households: + household: + members: [person1] + state_code: NH + output: + # 0 >= 30 → false, 0 >= 15 → false → default PART_TIME + nh_ccap_service_level: PART_TIME + +- name: Case 11, 14 hours per week, part-time. + period: 2025-01 + input: + people: + person1: + childcare_hours_per_week: 14 + households: + household: + members: [person1] + state_code: NH + output: + # 14 >= 30 → false, 14 >= 15 → false → default PART_TIME + nh_ccap_service_level: PART_TIME + +- name: Case 12, 29 hours per week, half-time. + period: 2025-01 + input: + people: + person1: + childcare_hours_per_week: 29 + households: + household: + members: [person1] + state_code: NH + output: + # 29 >= 30 → false, 29 >= 15 → true → HALF_TIME + nh_ccap_service_level: HALF_TIME diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible.py new file mode 100644 index 00000000000..bda99b4e1c6 --- /dev/null +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class nh_ccap_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for New Hampshire Child Care Scholarship Program" + definition_period = MONTH + defined_for = StateCode.NH + reference = ( + "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html" + ) + + def formula(spm_unit, period, parameters): + has_eligible_child = add(spm_unit, period, ["nh_ccap_eligible_child"]) > 0 + income_eligible = spm_unit("nh_ccap_income_eligible", period) + asset_eligible = spm_unit("is_ccdf_asset_eligible", period.this_year) + activity_eligible = spm_unit("meets_ccdf_activity_test", period.this_year) + return has_eligible_child & income_eligible & asset_eligible & activity_eligible diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible_child.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible_child.py new file mode 100644 index 00000000000..3ced0a3d229 --- /dev/null +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible_child.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class nh_ccap_eligible_child(Variable): + value_type = bool + entity = Person + label = "Eligible child for New Hampshire Child Care Scholarship Program" + definition_period = MONTH + defined_for = StateCode.NH + reference = ( + "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html" + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.nh.dhhs.ccap.eligibility + age = person("monthly_age", period) + 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 + is_dependent = person("is_tax_unit_dependent", period.this_year) + immigration_eligible = person( + "nh_ccap_immigration_status_eligible_person", period + ) + return age_eligible & is_dependent & immigration_eligible diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_immigration_status_eligible_person.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_immigration_status_eligible_person.py new file mode 100644 index 00000000000..e057e5b284e --- /dev/null +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_immigration_status_eligible_person.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class nh_ccap_immigration_status_eligible_person(Variable): + value_type = bool + entity = Person + label = "Eligible person for New Hampshire Child Care Scholarship Program based on immigration status" + definition_period = MONTH + defined_for = StateCode.NH + reference = ( + "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html" + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.nh.dhhs.ccap + immigration_status = person("immigration_status", period) + immigration_status_str = immigration_status.decode_to_str() + return np.isin( + immigration_status_str, + p.eligibility.qualified_immigration_statuses, + ) diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_income_eligible.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_income_eligible.py new file mode 100644 index 00000000000..dec8ec3e722 --- /dev/null +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_income_eligible.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class nh_ccap_income_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Income eligible for New Hampshire Child Care Scholarship Program" + definition_period = MONTH + defined_for = StateCode.NH + reference = ( + "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html" + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.nh.dhhs.ccap.income + countable_income = spm_unit("nh_ccap_countable_income", period) + # He-C 6910.06(b): gross income <= 85% SMI + smi = spm_unit("hhs_smi", period) + income_limit = smi * p.income_limit_smi_rate + income_test = countable_income <= income_limit + # He-C 6910.06(a)(1): TANF recipients automatically qualify + tanf_eligible = spm_unit("is_tanf_enrolled", period) + return income_test | tanf_eligible diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap.py new file mode 100644 index 00000000000..f9d6dfcdf09 --- /dev/null +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap.py @@ -0,0 +1,44 @@ +from policyengine_us.model_api import * + + +class nh_ccap(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "New Hampshire Child Care Scholarship Program benefit amount" + definition_period = MONTH + defined_for = "nh_ccap_eligible" + reference = ( + "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html" + ) + + def formula(spm_unit, period, parameters): + person = spm_unit.members + weeks_per_month = WEEKS_IN_YEAR / MONTHS_IN_YEAR + + # Per-child weekly rate (includes disability supplement) + weekly_rate = person("nh_ccap_payment_rate", period) + disability_supplement = person("nh_ccap_disability_supplement", period) + total_weekly_rate = weekly_rate + disability_supplement + + # Per-child pre-subsidy weekly expense + annual_expense = person("pre_subsidy_childcare_expenses", period.this_year) + weekly_expense = annual_expense / WEEKS_IN_YEAR + + # He-C 6910.17(e): payment = min(charge, rate) - cost share + capped_rate = min_(weekly_expense, total_weekly_rate) + + # He-C 6910.18(f): cost share divided equally among eligible children + is_eligible_child = person("nh_ccap_eligible_child", period) + n_eligible_children = add(spm_unit, period, ["nh_ccap_eligible_child"]) + family_cost_share = spm_unit("nh_ccap_cost_share", period) + per_child_cost_share = np.zeros_like(family_cost_share) + mask = n_eligible_children > 0 + per_child_cost_share[mask] = family_cost_share[mask] / n_eligible_children[mask] + per_child_cost_share_broadcast = spm_unit.project(per_child_cost_share) + + per_child_weekly_payment = max_(capped_rate - per_child_cost_share_broadcast, 0) + per_child_monthly_payment = ( + per_child_weekly_payment * weeks_per_month * is_eligible_child + ) + return spm_unit.sum(per_child_monthly_payment) diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_child_age_category.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_child_age_category.py new file mode 100644 index 00000000000..5a891bafe9b --- /dev/null +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_child_age_category.py @@ -0,0 +1,40 @@ +from policyengine_us.model_api import * + + +class NHCCAPChildAgeCategory(Enum): + INFANT = "Infant (0-17 months)" + TODDLER = "Toddler (18-35 months)" + PRESCHOOL = "Preschool (36-78 months)" + SCHOOL_AGE = "School Age (79-155 months)" + + +class nh_ccap_child_age_category(Variable): + value_type = Enum + entity = Person + possible_values = NHCCAPChildAgeCategory + default_value = NHCCAPChildAgeCategory.INFANT + definition_period = MONTH + defined_for = StateCode.NH + label = "New Hampshire Child Care Scholarship Program child age category" + reference = ( + "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html" + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.nh.dhhs.ccap.age_category + age_years = person("age", period.this_year) + age_months = age_years * MONTHS_IN_YEAR + + return select( + [ + age_months < p.infant_max_months, + age_months < p.toddler_max_months, + age_months < p.preschool_max_months, + ], + [ + NHCCAPChildAgeCategory.INFANT, + NHCCAPChildAgeCategory.TODDLER, + NHCCAPChildAgeCategory.PRESCHOOL, + ], + default=NHCCAPChildAgeCategory.SCHOOL_AGE, + ) diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_cost_share.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_cost_share.py new file mode 100644 index 00000000000..ea142a15760 --- /dev/null +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_cost_share.py @@ -0,0 +1,36 @@ +from policyengine_us.model_api import * + + +class nh_ccap_cost_share(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "New Hampshire Child Care Scholarship Program weekly family cost share" + definition_period = MONTH + defined_for = StateCode.NH + reference = ( + "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html" + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.nh.dhhs.ccap.cost_share + countable_income = spm_unit("nh_ccap_countable_income", period) + fpg = spm_unit("spm_unit_fpg", period) + weeks_per_month = WEEKS_IN_YEAR / MONTHS_IN_YEAR + + # He-C 6910.18, Table 6910.19: stepped cost share + step_1_threshold = fpg * p.step_1_fpg_rate + step_2_threshold = fpg * p.step_2_fpg_rate + + step_3_weekly = countable_income * p.step_3_rate / weeks_per_month + return select( + [ + countable_income <= step_1_threshold, + countable_income <= step_2_threshold, + ], + [ + 0, + p.step_2_amount, + ], + default=step_3_weekly, + ) diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_countable_income.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_countable_income.py new file mode 100644 index 00000000000..f0cbe3b2830 --- /dev/null +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_countable_income.py @@ -0,0 +1,15 @@ +from policyengine_us.model_api import * + + +class nh_ccap_countable_income(Variable): + value_type = float + entity = SPMUnit + label = "New Hampshire Child Care Scholarship Program countable income" + definition_period = MONTH + unit = USD + defined_for = StateCode.NH + reference = ( + "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html" + ) + + adds = "gov.states.nh.dhhs.ccap.income.countable_income.sources" diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_provider_type.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_provider_type.py new file mode 100644 index 00000000000..ee78883b99e --- /dev/null +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_provider_type.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class NHCCAPProviderType(Enum): + LICENSED_CENTER = "Licensed child care center" + LICENSED_FAMILY = "Licensed family child care home" + LICENSE_EXEMPT_IN_HOME = "License-exempt in-home provider" + LICENSE_EXEMPT_CENTER = "License-exempt child care center" + + +class nh_ccap_provider_type(Variable): + value_type = Enum + entity = Person + possible_values = NHCCAPProviderType + default_value = NHCCAPProviderType.LICENSED_CENTER + definition_period = MONTH + defined_for = StateCode.NH + label = "New Hampshire Child Care Scholarship Program provider type" + reference = ( + "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html" + ) diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_service_level.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_service_level.py new file mode 100644 index 00000000000..7906a2ec2f0 --- /dev/null +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_service_level.py @@ -0,0 +1,36 @@ +from policyengine_us.model_api import * + + +class NHCCAPServiceLevel(Enum): + FULL_TIME = "Full-time" + HALF_TIME = "Half-time" + PART_TIME = "Part-time" + + +class nh_ccap_service_level(Variable): + value_type = Enum + entity = Person + possible_values = NHCCAPServiceLevel + default_value = NHCCAPServiceLevel.FULL_TIME + definition_period = MONTH + defined_for = StateCode.NH + label = "New Hampshire Child Care Scholarship Program service level" + reference = ( + "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.nh.dhhs.ccap.service_level + hours = person("childcare_hours_per_week", period.this_year) + + return select( + [ + hours >= p.full_time_hours, + hours >= p.half_time_hours, + ], + [ + NHCCAPServiceLevel.FULL_TIME, + NHCCAPServiceLevel.HALF_TIME, + ], + default=NHCCAPServiceLevel.PART_TIME, + ) diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_disability_supplement.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_disability_supplement.py new file mode 100644 index 00000000000..ddd1704e55d --- /dev/null +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_disability_supplement.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class nh_ccap_disability_supplement(Variable): + value_type = float + entity = Person + unit = USD + label = "New Hampshire Child Care Scholarship Program weekly disability supplement" + definition_period = MONTH + defined_for = "nh_ccap_eligible_child" + reference = ( + "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html" + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.nh.dhhs.ccap.payment + is_disabled = person("is_disabled", period.this_year) + service_level = person("nh_ccap_service_level", period) + supplement = p.disability_supplement.amount[service_level] + return is_disabled * supplement diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_payment_rate.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_payment_rate.py new file mode 100644 index 00000000000..348e76ae14c --- /dev/null +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_payment_rate.py @@ -0,0 +1,43 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.nh.dhhs.ccap.nh_ccap_provider_type import ( + NHCCAPProviderType, +) + + +class nh_ccap_payment_rate(Variable): + value_type = float + entity = Person + unit = USD + label = "New Hampshire Child Care Scholarship Program weekly payment rate" + definition_period = MONTH + defined_for = "nh_ccap_eligible_child" + reference = ( + "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html" + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.nh.dhhs.ccap.payment + provider_type = person("nh_ccap_provider_type", period) + age_category = person("nh_ccap_child_age_category", period) + service_level = person("nh_ccap_service_level", period) + + licensed_center_rate = p.rates.licensed_center[age_category][service_level] + licensed_family_rate = p.rates.licensed_family[age_category][service_level] + # He-C 6910.17(c): exempt in-home = 70% of licensed family rate + exempt_in_home_rate = licensed_family_rate * p.exempt_in_home_rate + # He-C 6910.17(d): exempt center = 50% of licensed center rate + exempt_center_rate = licensed_center_rate * p.exempt_center_rate + + return select( + [ + provider_type == NHCCAPProviderType.LICENSED_CENTER, + provider_type == NHCCAPProviderType.LICENSED_FAMILY, + provider_type == NHCCAPProviderType.LICENSE_EXEMPT_IN_HOME, + ], + [ + licensed_center_rate, + licensed_family_rate, + exempt_in_home_rate, + ], + default=exempt_center_rate, + ) From 6e59856a599dcc3551418f5510adb1da9b54d0d0 Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 11 Mar 2026 22:42:11 -0400 Subject: [PATCH 03/10] Review-fix round 1: address critical issues from /review-program MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix broken reference URLs (gencourt.nh.us → Cornell LII) in all 31 files - Correct school-age licensed center rates to MRS 75th percentile ($236.25) - Correct school-age licensed family rates to MRS 75th percentile ($200) - Add integration test with positive benefit amount end-to-end - Add disability supplement test in benefit calculation context Co-Authored-By: Claude Opus 4.6 --- .../ccap/age_category/infant_max_months.yaml | 2 +- .../age_category/preschool_max_months.yaml | 2 +- .../ccap/age_category/toddler_max_months.yaml | 2 +- .../dhhs/ccap/cost_share/step_1_fpg_rate.yaml | 2 +- .../dhhs/ccap/cost_share/step_2_amount.yaml | 2 +- .../dhhs/ccap/cost_share/step_2_fpg_rate.yaml | 2 +- .../nh/dhhs/ccap/cost_share/step_3_rate.yaml | 2 +- .../ccap/eligibility/child_age_limit.yaml | 2 +- .../eligibility/disabled_child_age_limit.yaml | 2 +- .../qualified_immigration_statuses.yaml | 2 +- .../ccap/income/countable_income/sources.yaml | 2 +- .../ccap/income/income_limit_smi_rate.yaml | 2 +- .../payment/disability_supplement/amount.yaml | 2 +- .../dhhs/ccap/payment/exempt_center_rate.yaml | 2 +- .../ccap/payment/exempt_in_home_rate.yaml | 2 +- .../ccap/payment/rates/licensed_center.yaml | 8 +- .../ccap/payment/rates/licensed_family.yaml | 8 +- .../ccap/service_level/full_time_hours.yaml | 2 +- .../ccap/service_level/half_time_hours.yaml | 2 +- .../gov/states/nh/dhhs/ccap/integration.yaml | 90 ++++++++++++++++++- .../gov/states/nh/dhhs/ccap/nh_ccap.yaml | 40 ++++++++- .../nh/dhhs/ccap/nh_ccap_payment_rate.yaml | 16 ++-- .../dhhs/ccap/eligibility/nh_ccap_eligible.py | 4 +- .../eligibility/nh_ccap_eligible_child.py | 4 +- ...ccap_immigration_status_eligible_person.py | 4 +- .../eligibility/nh_ccap_income_eligible.py | 4 +- .../gov/states/nh/dhhs/ccap/nh_ccap.py | 4 +- .../dhhs/ccap/nh_ccap_child_age_category.py | 4 +- .../states/nh/dhhs/ccap/nh_ccap_cost_share.py | 4 +- .../nh/dhhs/ccap/nh_ccap_countable_income.py | 4 +- .../nh/dhhs/ccap/nh_ccap_provider_type.py | 4 +- .../nh/dhhs/ccap/nh_ccap_service_level.py | 4 +- .../payment/nh_ccap_disability_supplement.py | 4 +- .../dhhs/ccap/payment/nh_ccap_payment_rate.py | 4 +- 34 files changed, 170 insertions(+), 74 deletions(-) diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml index c6aad88cebb..85406c5fe1b 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP infant age category upper bound in months reference: - title: He-C 6910.17(i) - href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html + href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml index 22eae665888..ca9ff3ce925 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP preschool age category upper bound in months reference: - title: He-C 6910.17(i) - href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html + href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml index 4dff121eda4..d5e506ead1c 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP toddler age category upper bound in months reference: - title: He-C 6910.17(i) - href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html + href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml index c39ee92e459..b018b32a001 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP step 1 FPG rate threshold reference: - title: He-C 6910.18, Table 6910.19 - href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html + href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.18 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml index 0ecfc70955c..bd10e899cc0 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP step 2 weekly cost share amount reference: - title: He-C 6910.18, Table 6910.19 - href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html + href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.18 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml index 43255c1c738..b5fc6066c64 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP step 2 FPG rate threshold reference: - title: He-C 6910.18, Table 6910.19 - href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html + href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.18 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml index c516e6bb56f..3834ad0ceed 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP step 3 income cost share rate reference: - title: He-C 6910.18, Table 6910.19 - href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html + href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.18 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml index ee1047aeb9e..78eec042c6e 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP child age limit reference: - title: He-C 6910.07(b)(3) - href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html + href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.07 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml index c8d7d75d32d..6ce8e004d9f 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP disabled child age limit reference: - title: He-C 6910.07(e) - href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html + href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.07 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml index 0c79a6c02aa..be3401fa76d 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml @@ -14,4 +14,4 @@ metadata: label: New Hampshire CCAP qualified immigration statuses reference: - title: He-C 6910.07(b)(2) - href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html + href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.07 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml index e590f5b2b71..ac7bbddbd4b 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml @@ -26,4 +26,4 @@ metadata: label: New Hampshire CCAP countable income sources reference: - title: He-C 6910.06(b), He-C 6910.06(e) - href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html + href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.06 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml index c19052b145c..5ddc3bedb63 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP income limit SMI rate reference: - title: He-C 6910.06(b) - href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html + href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.06 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml index d08bc7dd992..fd2ec0e5ee0 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml @@ -8,7 +8,7 @@ metadata: - nh_ccap_service_level reference: - title: He-C 6910.17(g) - href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html + href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17 FULL_TIME: 2024-07-01: 100 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml index 8fa2370f649..86ea94474cc 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP license-exempt center rate factor reference: - title: He-C 6910.17(d) - href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html + href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml index 0e6fe4d37a9..ad3883d8e9e 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP license-exempt in-home rate factor reference: - title: He-C 6910.17(c) - href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html + href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml index 308865a69e4..b367d23df2c 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml @@ -9,7 +9,7 @@ metadata: - nh_ccap_service_level reference: - title: He-C 6910.17(a) - href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html + href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17 - title: CCDF Provider Payment Rates by State (January 2025) - Tables 2-4 href: https://acf.gov/sites/default/files/documents/occ/CCDF-Provider-Payment-Rates-by-State.pdf#page=6 @@ -36,8 +36,8 @@ PRESCHOOL: 2024-08-26: 70 SCHOOL_AGE: FULL_TIME: - 2024-08-26: 267 + 2024-08-26: 236.25 HALF_TIME: - 2024-08-26: 134 + 2024-08-26: 118.13 PART_TIME: - 2024-08-26: 67 + 2024-08-26: 59.06 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml index 1d9ed01172c..44122c54b28 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml @@ -9,7 +9,7 @@ metadata: - nh_ccap_service_level reference: - title: He-C 6910.17(b) - href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html + href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17 - title: CCDF Provider Payment Rates by State (January 2025) - Tables 2-4 href: https://acf.gov/sites/default/files/documents/occ/CCDF-Provider-Payment-Rates-by-State.pdf#page=6 @@ -36,8 +36,8 @@ PRESCHOOL: 2024-08-26: 63 SCHOOL_AGE: FULL_TIME: - 2024-08-26: 250 + 2024-08-26: 200 HALF_TIME: - 2024-08-26: 125 + 2024-08-26: 100 PART_TIME: - 2024-08-26: 63 + 2024-08-26: 50 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml index 1ac8a87012d..820d29347cd 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP full-time hours threshold reference: - title: He-C 6910.07(m), He-C 6910.16 - href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html + href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.07 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml index 51c8e75cf52..3425a622d55 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP half-time hours threshold reference: - title: He-C 6910.07(n), He-C 6910.16 - href: https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html + href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.07 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/integration.yaml index dd1f32f5467..ef0b872d413 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/integration.yaml @@ -243,7 +243,95 @@ nh_ccap_income_eligible: true nh_ccap_eligible: true -- name: Case 7, income above 85% SMI, not TANF enrolled, ineligible. +- name: Case 7, positive benefit end-to-end, preschool licensed center, income below 100% FPG. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 28 + employment_income: 20_400 + # $20,400/yr = $1,700/mo < $1,762.50 (100% FPG for 2) + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + nh_ccap_provider_type: LICENSED_CENTER + pre_subsidy_childcare_expenses: 18_720 + # $18,720/yr = $360/week + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NH + output: + nh_ccap_eligible_child: [false, true] + nh_ccap_income_eligible: true + nh_ccap_eligible: true + nh_ccap_cost_share: 0 + # Preschool, full-time, licensed center: $280/week + # min($360/wk charge, $280 rate) = $280 + # Cost share: $0 → per-child: $0 + # Weekly payment: $280 - $0 = $280 + # Monthly: $280 * (52/12) = $1,213.33 + nh_ccap: 1_213.33 + +- name: Case 8, disabled child, disability supplement flows through to benefit. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 24_000 + # $24,000/yr = $2,000/mo + # Family of 3: 100% FPG = $2,220.83 + # $2,000 < $2,220.83 → Step 1 → $0 cost share + person2: + age: 35 + employment_income: 0 + person3: + age: 5 + is_disabled: true + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + nh_ccap_provider_type: LICENSED_CENTER + pre_subsidy_childcare_expenses: 20_800 + # $20,800/yr = $400/week + spm_units: + spm_unit: + members: [person1, person2, person3] + meets_ccdf_activity_test: true + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: NH + output: + nh_ccap_eligible_child: [false, false, true] + nh_ccap_income_eligible: true + nh_ccap_eligible: true + nh_ccap_cost_share: 0 + # Preschool, full-time, licensed center: $280/week base rate + # Disability supplement full-time: $100/week + # Total rate: $280 + $100 = $380 + # min($400/wk charge, $380 total rate) = $380 + # Cost share: $0 → per-child: $0 + # Weekly payment: $380 - $0 = $380 + # Monthly: $380 * (52/12) = $1,646.67 + nh_ccap: 1_646.67 + +- name: Case 9, income above 85% SMI, not TANF enrolled, ineligible (original Case 7). period: 2025-01 absolute_error_margin: 0.01 input: diff --git a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap.yaml b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap.yaml index f01cae75627..0dcbc1a899d 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap.yaml @@ -151,9 +151,41 @@ # min($50, $50) - $70/1 = $50 - $70 = -$20 → $0 nh_ccap: 0 +- name: Case 6, disabled child, disability supplement adds to rate in benefit. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_disabled: true + nh_ccap_eligible_child: true + nh_ccap_payment_rate: 280 + nh_ccap_disability_supplement: 100 + pre_subsidy_childcare_expenses: 20_800 + # $20,800/yr = $400/week (> $280 + $100 = $380 total rate) + spm_units: + spm_unit: + members: [person1, person2] + nh_ccap_eligible: true + nh_ccap_cost_share: 10 + households: + household: + members: [person1, person2] + state_code: NH + output: + # total_weekly_rate = $280 + $100 = $380 + # min($400/wk charge, $380 total rate) = $380 + # 1 eligible child: per-child cost share = $10/1 = $10 + # Weekly: $380 - $10 = $370 + # Monthly: $370 * (52/12) = $1,603.33 + nh_ccap: 1_603.33 + # --- Edge Cases --- -- name: Case 6, zero childcare expenses, zero benefit. +- name: Case 7, zero childcare expenses, zero benefit. period: 2025-01 absolute_error_margin: 0.01 input: @@ -179,7 +211,7 @@ # min($0, $300) = $0; $0 - $0 = $0/week → $0/month nh_ccap: 0 -- name: Case 7, cost share exactly equals capped rate, zero benefit. +- name: Case 8, cost share exactly equals capped rate, zero benefit. period: 2025-01 absolute_error_margin: 0.01 input: @@ -205,7 +237,7 @@ # min($300/wk, $200) = $200; $200 - $200/1 = $0 → $0/month nh_ccap: 0 -- name: Case 8, three eligible children, cost share split three ways. +- name: Case 9, three eligible children, cost share split three ways. period: 2025-01 absolute_error_margin: 0.01 input: @@ -248,7 +280,7 @@ # Monthly: $700 * (52/12) = $700 * 4.3333 = $3,033.33 nh_ccap: 3_033.33 -- name: Case 9, no eligible children in spm unit, zero benefit. +- name: Case 10, no eligible children in spm unit, zero benefit. period: 2025-01 absolute_error_margin: 0.01 input: diff --git a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_payment_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_payment_rate.yaml index 367995642c3..c370333e7fb 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_payment_rate.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_payment_rate.yaml @@ -62,8 +62,8 @@ members: [person1] state_code: NH output: - # Licensed center school-age part-time: $67/week - nh_ccap_payment_rate: 67 + # Licensed center school-age part-time: $59.06/week + nh_ccap_payment_rate: 59.06 - name: Case 4, license-exempt in-home, preschool, full-time. period: 2025-01 @@ -157,8 +157,8 @@ members: [person1] state_code: NH output: - # 70% of licensed family school-age part-time ($63) = $44.10 - nh_ccap_payment_rate: 44.10 + # 70% of licensed family school-age part-time ($50) = $35 + nh_ccap_payment_rate: 35 - name: Case 9, licensed family, infant, full-time. period: 2025-01 @@ -229,8 +229,8 @@ members: [person1] state_code: NH output: - # Licensed center school-age half-time: $134/week - nh_ccap_payment_rate: 134 + # Licensed center school-age half-time: $118.13/week + nh_ccap_payment_rate: 118.13 - name: Case 13, license-exempt center, school age, part-time. period: 2025-01 @@ -247,5 +247,5 @@ members: [person1] state_code: NH output: - # 50% of licensed center school-age part-time ($67) = $33.50 - nh_ccap_payment_rate: 33.50 + # 50% of licensed center school-age part-time ($59.06) = $29.53 + nh_ccap_payment_rate: 29.53 diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible.py index bda99b4e1c6..d9ecdd54c80 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible.py @@ -7,9 +7,7 @@ class nh_ccap_eligible(Variable): label = "Eligible for New Hampshire Child Care Scholarship Program" definition_period = MONTH defined_for = StateCode.NH - reference = ( - "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html" - ) + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.07" def formula(spm_unit, period, parameters): has_eligible_child = add(spm_unit, period, ["nh_ccap_eligible_child"]) > 0 diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible_child.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible_child.py index 3ced0a3d229..f9a8f6cdafe 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible_child.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible_child.py @@ -7,9 +7,7 @@ class nh_ccap_eligible_child(Variable): label = "Eligible child for New Hampshire Child Care Scholarship Program" definition_period = MONTH defined_for = StateCode.NH - reference = ( - "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html" - ) + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.07" def formula(person, period, parameters): p = parameters(period).gov.states.nh.dhhs.ccap.eligibility diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_immigration_status_eligible_person.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_immigration_status_eligible_person.py index e057e5b284e..4fdc1343499 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_immigration_status_eligible_person.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_immigration_status_eligible_person.py @@ -7,9 +7,7 @@ class nh_ccap_immigration_status_eligible_person(Variable): label = "Eligible person for New Hampshire Child Care Scholarship Program based on immigration status" definition_period = MONTH defined_for = StateCode.NH - reference = ( - "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html" - ) + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.07" def formula(person, period, parameters): p = parameters(period).gov.states.nh.dhhs.ccap diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_income_eligible.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_income_eligible.py index dec8ec3e722..1fb25398675 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_income_eligible.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_income_eligible.py @@ -7,9 +7,7 @@ class nh_ccap_income_eligible(Variable): label = "Income eligible for New Hampshire Child Care Scholarship Program" definition_period = MONTH defined_for = StateCode.NH - reference = ( - "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html" - ) + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.06" def formula(spm_unit, period, parameters): p = parameters(period).gov.states.nh.dhhs.ccap.income diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap.py index f9d6dfcdf09..dcba8ed4e6a 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap.py @@ -8,9 +8,7 @@ class nh_ccap(Variable): label = "New Hampshire Child Care Scholarship Program benefit amount" definition_period = MONTH defined_for = "nh_ccap_eligible" - reference = ( - "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html" - ) + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17" def formula(spm_unit, period, parameters): person = spm_unit.members diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_child_age_category.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_child_age_category.py index 5a891bafe9b..0e2fe0770b2 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_child_age_category.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_child_age_category.py @@ -16,9 +16,7 @@ class nh_ccap_child_age_category(Variable): definition_period = MONTH defined_for = StateCode.NH label = "New Hampshire Child Care Scholarship Program child age category" - reference = ( - "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html" - ) + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17" def formula(person, period, parameters): p = parameters(period).gov.states.nh.dhhs.ccap.age_category diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_cost_share.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_cost_share.py index ea142a15760..8c4a05fb5d3 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_cost_share.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_cost_share.py @@ -8,9 +8,7 @@ class nh_ccap_cost_share(Variable): label = "New Hampshire Child Care Scholarship Program weekly family cost share" definition_period = MONTH defined_for = StateCode.NH - reference = ( - "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html" - ) + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.18" def formula(spm_unit, period, parameters): p = parameters(period).gov.states.nh.dhhs.ccap.cost_share diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_countable_income.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_countable_income.py index f0cbe3b2830..c207305d147 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_countable_income.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_countable_income.py @@ -8,8 +8,6 @@ class nh_ccap_countable_income(Variable): definition_period = MONTH unit = USD defined_for = StateCode.NH - reference = ( - "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html" - ) + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.06" adds = "gov.states.nh.dhhs.ccap.income.countable_income.sources" diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_provider_type.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_provider_type.py index ee78883b99e..603249edf22 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_provider_type.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_provider_type.py @@ -16,6 +16,4 @@ class nh_ccap_provider_type(Variable): definition_period = MONTH defined_for = StateCode.NH label = "New Hampshire Child Care Scholarship Program provider type" - reference = ( - "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html" - ) + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17" diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_service_level.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_service_level.py index 7906a2ec2f0..7c27b55a923 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_service_level.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_service_level.py @@ -15,9 +15,7 @@ class nh_ccap_service_level(Variable): definition_period = MONTH defined_for = StateCode.NH label = "New Hampshire Child Care Scholarship Program service level" - reference = ( - "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html", - ) + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.07" def formula(person, period, parameters): p = parameters(period).gov.states.nh.dhhs.ccap.service_level diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_disability_supplement.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_disability_supplement.py index ddd1704e55d..cfaa6a2fd14 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_disability_supplement.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_disability_supplement.py @@ -8,9 +8,7 @@ class nh_ccap_disability_supplement(Variable): label = "New Hampshire Child Care Scholarship Program weekly disability supplement" definition_period = MONTH defined_for = "nh_ccap_eligible_child" - reference = ( - "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html" - ) + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17" def formula(person, period, parameters): p = parameters(period).gov.states.nh.dhhs.ccap.payment diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_payment_rate.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_payment_rate.py index 348e76ae14c..c3f3e98f2aa 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_payment_rate.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_payment_rate.py @@ -11,9 +11,7 @@ class nh_ccap_payment_rate(Variable): label = "New Hampshire Child Care Scholarship Program weekly payment rate" definition_period = MONTH defined_for = "nh_ccap_eligible_child" - reference = ( - "https://www.gencourt.state.nh.us/rules/filing_history/sourcehe-c6910.html" - ) + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17" def formula(person, period, parameters): p = parameters(period).gov.states.nh.dhhs.ccap.payment From 622d36d9c5a18f9de497efe69637384a87167bba Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 11 Mar 2026 23:04:48 -0400 Subject: [PATCH 04/10] Review-fix round 2: correct service level boundary operators (>= to >) He-C 6910.03(y) defines full-time as "greater than 30 hours" (not >= 30). He-C 6910.03(aa) defines half-time as "greater than 15 hours" (not >= 15). Fix operators and update 4 boundary test cases. Co-Authored-By: Claude Opus 4.6 --- .../nh/dhhs/ccap/nh_ccap_service_level.yaml | 38 +++++++++---------- .../nh/dhhs/ccap/nh_ccap_service_level.py | 4 +- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_service_level.yaml b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_service_level.yaml index 135a1f2a437..a5fb17bdc60 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_service_level.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_service_level.yaml @@ -1,9 +1,9 @@ # Tests for nh_ccap_service_level (Person, MONTH) # Service level based on childcare hours per week. -# He-C 6910.07(m)-(o), He-C 6910.16 -# Full-time: >= 30 hours/week (He-C 6910.07(m): "30 or more hours per week") -# Half-time: >= 15 and < 30 hours/week -# Part-time: < 15 hours/week +# He-C 6910.03(y), He-C 6910.07(p) +# Full-time: > 30 hours/week (He-C 6910.03(y): "greater than 30 hours per week") +# Half-time: > 15 and <= 30 hours/week (He-C 6910.03(aa)) +# Part-time: <= 15 hours/week - name: Case 1, 40 hours per week, full-time. period: 2025-01 @@ -31,7 +31,7 @@ output: nh_ccap_service_level: FULL_TIME -- name: Case 3, 30 hours per week, full-time. +- name: Case 3, 30 hours per week, half-time (boundary). period: 2025-01 input: people: @@ -42,8 +42,8 @@ members: [person1] state_code: NH output: - # He-C 6910.07(m): "30 or more hours" = full-time - nh_ccap_service_level: FULL_TIME + # He-C 6910.03(y): full-time is "greater than 30 hours" → 30 is NOT full-time + nh_ccap_service_level: HALF_TIME - name: Case 4, 20 hours per week, half-time. period: 2025-01 @@ -58,7 +58,7 @@ output: nh_ccap_service_level: HALF_TIME -- name: Case 5, 15 hours per week, half-time. +- name: Case 5, 15 hours per week, part-time (boundary). period: 2025-01 input: people: @@ -69,8 +69,8 @@ members: [person1] state_code: NH output: - # He-C 6910.07(n): "15 or more hours" includes 15 → HALF_TIME - nh_ccap_service_level: HALF_TIME + # He-C 6910.03(aa): half-time is "greater than 15" → 15 is NOT half-time + nh_ccap_service_level: PART_TIME - name: Case 6, 10 hours per week, part-time. period: 2025-01 @@ -100,7 +100,7 @@ # --- Edge Cases: Exact boundary hours --- -- name: Case 8, exactly 15 hours per week, half-time boundary. +- name: Case 8, exactly 15 hours per week, part-time boundary. period: 2025-01 input: people: @@ -111,10 +111,10 @@ members: [person1] state_code: NH output: - # half_time_hours = 15, hours >= 15 → true → HALF_TIME - nh_ccap_service_level: HALF_TIME + # half_time_hours = 15, hours > 15 → false → default PART_TIME + nh_ccap_service_level: PART_TIME -- name: Case 9, exactly 30 hours per week, full-time boundary. +- name: Case 9, exactly 30 hours per week, half-time boundary. period: 2025-01 input: people: @@ -125,8 +125,8 @@ members: [person1] state_code: NH output: - # full_time_hours = 30, hours >= 30 → true → FULL_TIME - nh_ccap_service_level: FULL_TIME + # full_time_hours = 30, hours > 30 → false, hours > 15 → true → HALF_TIME + nh_ccap_service_level: HALF_TIME - name: Case 10, zero hours per week, part-time. period: 2025-01 @@ -139,7 +139,7 @@ members: [person1] state_code: NH output: - # 0 >= 30 → false, 0 >= 15 → false → default PART_TIME + # 0 > 30 → false, 0 > 15 → false → default PART_TIME nh_ccap_service_level: PART_TIME - name: Case 11, 14 hours per week, part-time. @@ -153,7 +153,7 @@ members: [person1] state_code: NH output: - # 14 >= 30 → false, 14 >= 15 → false → default PART_TIME + # 14 > 30 → false, 14 > 15 → false → default PART_TIME nh_ccap_service_level: PART_TIME - name: Case 12, 29 hours per week, half-time. @@ -167,5 +167,5 @@ members: [person1] state_code: NH output: - # 29 >= 30 → false, 29 >= 15 → true → HALF_TIME + # 29 > 30 → false, 29 > 15 → true → HALF_TIME nh_ccap_service_level: HALF_TIME diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_service_level.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_service_level.py index 7c27b55a923..ecf8091d578 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_service_level.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_service_level.py @@ -23,8 +23,8 @@ def formula(person, period, parameters): return select( [ - hours >= p.full_time_hours, - hours >= p.half_time_hours, + hours > p.full_time_hours, + hours > p.half_time_hours, ], [ NHCCAPServiceLevel.FULL_TIME, From 170caa18f07a39833065eb82358dca7fa69775c8 Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 11 Mar 2026 23:05:59 -0400 Subject: [PATCH 05/10] Add working references for NH CCAP implementation Co-Authored-By: Claude Opus 4.6 --- sources/working_references.md | 239 ++++++++++++++++++++++++++++++++++ 1 file changed, 239 insertions(+) create mode 100644 sources/working_references.md diff --git a/sources/working_references.md b/sources/working_references.md new file mode 100644 index 00000000000..7b9aee9ceb2 --- /dev/null +++ b/sources/working_references.md @@ -0,0 +1,239 @@ +# NH Child Care Scholarship Program - Working References + +## Official Program Name +**New Hampshire Child Care Scholarship Program** (Employment-Related NH Child Care Scholarship) + +Administered by: NH Department of Health and Human Services (DHHS), Division of Economic and Housing Stability (DEHS) + +## Primary Regulatory Authority + +### NH Administrative Rules (He-C 6900 Series) + +| Rule | Title | Scope | +|------|-------|-------| +| He-C 6910 | Employment-Related NH Child Care Scholarship Program Eligibility | Core eligibility, income, cost share, service levels | +| He-C 6912 | Preventative and Protective Child Care Eligibility | Non-employment-related child care (abuse prevention/protection) | +| He-C 6914 | Child Care Provider Enrollment Requirements | Provider enrollment criteria | +| He-C 6916 | Health and Safety Rules for Facility-Based License-Exempt Providers | Facility-based provider standards | +| He-C 6917 | Health and Safety Rules for Family/Friend/Neighbor License-Exempt Providers | In-home provider standards | +| He-C 6918 | Child Care Provider Billing and Payment Requirements | Billing, payment, cost share collection | +| He-C 6920 | Criminal Records and Central Registry Check for License-Exempt Providers | Background checks | + +**Full text source**: https://gc.nh.gov/rules/state_agencies/he-c6900.html +(Extracted text saved at `/tmp/nh-ccap-sources/he-c-6900-full-text.txt`) + +Most recent effective dates: +- He-C 6910: #13951, eff 4-30-24 +- He-C 6912: #13064, eff 7-1-20 +- He-C 6918: #13066, eff 7-1-20 + +### NH Revised Statutes + +| Statute | Title | Relevance | +|---------|-------|-----------| +| RSA 167:78 | Definitions | Defines dependent child, caretaker relative, family assistance program | +| RSA 167:83 | Commissioner's powers | Authority for child care program | +| RSA 170-E | Child Day Care Licensing | Provider licensing, exemptions, registration | +| RSA 161:2, XII | DHHS powers | Rulemaking authority | + +**RSA 167:78**: https://gc.nh.gov/rsa/html/XII/167/167-78.htm +**RSA 170-E**: https://gc.nh.gov/rsa/html/XII/170-E/170-E-mrg.htm + +### Federal Authority + +| Authority | Relevance | +|-----------|-----------| +| 42 U.S.C. 9858 (CCDBG Act) | Federal child care block grant | +| 45 CFR Part 98 | CCDF regulations | +| 45 CFR 98.45 | Market rate survey / payment rates | + +### NH CCDF State Plan + +- **FY 2025-2027 CCDF Plan**: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf (blocked from direct download) +- **FY 2025-2027 Appendix (ACF)**: https://acf.gov/sites/default/files/documents/occ/NH-Accepted-ACF118-CCDF-FFY-2025-2027-Appendix.pdf (downloaded to `/tmp/nh-ccap-sources/nh-ccdf-appendix.pdf`) +- **All approved plans**: https://acf.gov/occ/form/approved-ccdf-plans-fy-2025-2027 + +--- + +## Eligibility Rules Summary (He-C 6910) + +### Financial Eligibility (He-C 6910.06) + +**Income Limit**: Monthly gross income must not exceed **85% of State Median Income (SMI)** for the family size (He-C 6910.06(b)). + +Alternative financial eligibility paths (He-C 6910.06(a)): +1. Receiving TANF financial assistance +2. Receiving TANF-related medical assistance +3. Participating in NHEP with TANF application pending +4. Meeting the 85% SMI gross income limit + +**Income Exclusions** (He-C 6910.06(c)): +1. Income of any grandparent (when 3 generations in one household) +2. Child foster care payments +3. Adoption subsidies +4. Educational assistance/student loans/scholarships for educational expenses +5. Income of caretaker relative or legal guardian (and spouse), unless also applying for their own child +6. AmeriCorps VISTA income +7. Earned income from dependent child who is full-time student +8. SSI when recipient is dependent child +9. TANF financial assistance payments + +**Self-employment**: Net monthly income after IRS-allowable business expense deductions (He-C 6910.06(d)). + +**Resources**: Not counted unless total exceeds $1,000,000 in assets (He-C 6910.06(f)). + +**Income calculation**: Per He-W 744.01 (general) or He-W 744.03 (fluctuating income) (He-C 6910.06(e)). + +### Non-Financial Eligibility (He-C 6910.07) + +**Child requirements**: +- NH resident (He-C 6910.07(b)(1)) +- US citizen or qualifying non-citizen (He-C 6910.07(b)(2)) +- Under 13 years of age (He-C 6910.07(b)(3)) + - Exception: 13+ with verified disability or significant special need (He-C 6910.07(e)) +- Linked to one enrolled provider (He-C 6910.07(b)(4)) + +**Age categories for payment** (He-C 6910.17(i) and He-C 6912.16(j)): +- 0-17 months +- 18-35 months +- 36-78 months +- 79-155 months + +**Parent activity requirements** (He-C 6910.07(f)): +1. Employment (any earned income or in-kind compensation) +2. Job search (up to 92 calendar days) +3. Training or educational program +4. Basic education (GED, ESL, etc.) +5. NHEP activities +6. Mental health/substance misuse treatment (NHEP or FAP recipients) + +**Two-parent households** (He-C 6910.07(i)): +- Both parents must be in qualifying activity, OR +- One parent in qualifying activity and other qualifies as parent with disability + +**Assistance group composition** (He-C 6910.10(g)(1)): +- All children under 18 with biological/foster/step/adoptive relationship +- All individuals under 20 in school with same relationship +- Any adult with biological/foster/step/adoptive/caretaker/legal guardian relationship to child +- Two adults sharing common child count as one assistance group (He-C 6910.07(j)) + +### Service Levels (He-C 6910.07(m)-(p), He-C 6910.16) + +| Level | Hours per week | +|-------|---------------| +| Full-time | > 30 hours | +| Half-time | > 15 and <= 30 hours | +| Part-time | 1 to <= 15 hours | + +Based on parent's activity hours + commute time (1 hour/day per employment day). + +Children 6+ years (79+ months): eligible for half-time only when parent works full-time, unless full-time override during school/summer vacations (He-C 6910.16(e)). + +Two-parent households: service level based on lowest number of hours either parent participates (He-C 6910.07(q)). + +--- + +## Cost Share / Copayment (He-C 6910.18) + +### Cost Share Steps (Table 6910.19) + +| Step | Income Range (% FPG) | Family Cost Share | +|------|---------------------|-------------------| +| 1 | <= 100% FPG | $0/week | +| 2 | > 100% but <= 138% FPG | $5/week | +| 3 | > 138% FPG but <= 85% SMI | 7.0% of family income | + +**Cost share calculation** (He-C 6910.18(b)): +- Monthly gross income x cost share percent / 4.33 weeks + +**Family cap**: Cost share calculated at initial eligibility/redetermination; cannot exceed family cap during 12-month period (He-C 6910.18(c)). + +**Cost share per child**: Family cost share divided equally among all eligible children (He-C 6910.18(f)). + +--- + +## Payment Rate Methodology (He-C 6910.17) + +### Employment-Related (He-C 6910.17) + +| Provider Type | Rate Basis | +|---------------|-----------| +| Licensed child care centers | 75th percentile of most recent MRS | +| Licensed family child care homes | 75th percentile of most recent MRS | +| License-exempt in-home providers | 70% of licensed family child care home rate | +| License-exempt child care centers | 50% of licensed child care center rate | + +Market Rate Survey (MRS) conducted every 3 years per 45 CFR 98.45. + +### Preventive/Protective (He-C 6912.16) + +| Provider Type | Rate Basis | +|---------------|-----------| +| Licensed centers & family homes (0-35 months) | 60th percentile of MRS | +| Licensed centers & family homes (36+ months) | 55th percentile of MRS | +| License-exempt in-home | 70% of licensed family home rate | +| License-exempt centers | 50% of licensed center rate | + +### Payment Calculation (He-C 6910.17(e)) + +Payment = min(provider charge, standard weekly rate) - family cost share + +### Supplemental Payments for Disability/Special Needs (He-C 6910.17(g)) + +| Service Level | Supplement | +|--------------|-----------| +| Full-time | $100.00/week | +| Half-time | $75.00/week | +| Part-time | $50.00/week | + +### Absentee Allotment (He-C 6918.05(b)) + +| Service Level | Monthly Absentee Hours | +|--------------|----------------------| +| Full-time | 21 hours | +| Half-time | 13 hours | +| Part-time | None | + +--- + +## Other Key Program Features + +### Eligibility Period +- 12 months maximum (He-C 6910.10(l)) +- Annual redetermination required (He-C 6910.15) + +### Continued Assistance +- Up to 92 calendar days following termination of approved activity (He-C 6910.10(m)) + +### Job Search +- Up to 92 calendar days (He-C 6910.07(g)) +- 6 months must lapse between job search activities (He-C 6910.13(a)(4)) + +### Training/Education Limits +- 104 weeks lifetime limit for non-TANF recipients (He-C 6910.13(d)(3)) +- Must lead to associate degree or lower (He-C 6910.13(d)(5)) +- TANF recipients: associate or bachelor level (He-C 6910.13(e)(2)) +- Basic education (GED, ESL) exempt from lifetime limit (He-C 6910.13(f)) + +### Registration Fee +- Up to $50.00 per calendar year per eligible child (He-C 6918.04(aa)) + +### Waitlist +- Established when cost projections exceed available funds (He-C 6910.11) + +--- + +## Existing Codebase References + +The codebase has relevant federal-level infrastructure: +- `hhs_smi` variable: Computes State Median Income by state and family size (`policyengine_us/variables/gov/hhs/hhs_smi.py`) +- `ccdf_income_to_smi_ratio`: Income-to-SMI ratio calculation (`policyengine_us/variables/gov/hhs/ccdf/ccdf_income_to_smi_ratio.py`) +- `ccdf_income_limit_smi`: 85% SMI limit parameter (`policyengine_us/parameters/gov/hhs/ccdf/income_limit_smi.yaml`) +- Federal poverty guidelines: Used in cost share determination + +Existing state CCAP implementations for reference: +- Colorado CCAP: `policyengine_us/variables/gov/states/co/ccap/` +- Illinois CCAP: `policyengine_us/variables/gov/states/il/dhs/ccap/` +- Texas CCS: `policyengine_us/variables/gov/states/tx/twc/ccs/` +- Nebraska Child Care Subsidy: `policyengine_us/variables/gov/states/ne/dhhs/child_care_subsidy/` +- California Child Care: `policyengine_us/variables/gov/states/ca/cdss/child_care/` From 6d2d5a03af278806830b8cfbb5b1f8ff9891dbaa Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 11 Mar 2026 23:16:35 -0400 Subject: [PATCH 06/10] Add lessons from New Hampshire CCAP implementation Co-Authored-By: Claude Opus 4.6 --- lessons/agent-lessons.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 lessons/agent-lessons.md diff --git a/lessons/agent-lessons.md b/lessons/agent-lessons.md new file mode 100644 index 00000000000..8bcdae18aff --- /dev/null +++ b/lessons/agent-lessons.md @@ -0,0 +1,14 @@ +# Agent Lessons Learned + +Accumulated from /encode-policy-v2 and /backdate-program runs across all contributors. +Loaded by implementation agents on future runs. + + +## New Lessons from New Hampshire CCAP (2026-03-12) + +### REFERENCE +- State legislature filing-history or rule-history URLs are fragile (redirect chains that end in 404); always verify that reference URLs resolve before citing them, and prefer permanent/canonical URLs (e.g., section-specific regulation portals) over dynamic filing-history pages. + +### TEST +- Integration tests must include at least one case with a positive (non-zero) final benefit amount to verify the full calculation pipeline produces a correct payable result; zero-benefit-only integration tests hide formula errors that cancel out. +- When a benefit has add-on components (supplements, adjustments, bonuses), test that each add-on flows through to the top-level benefit variable — not just that the add-on variable calculates correctly in isolation. From 98216687edb8a87ba77f944da432ae16284eff74 Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 16 Mar 2026 02:19:22 -0400 Subject: [PATCH 07/10] adjustments --- lessons/agent-lessons.md | 14 - .../hhs/ccdf/child_care_subsidy_programs.yaml | 1 + .../ccap/age_category/infant_max_months.yaml | 2 +- .../age_category/preschool_max_months.yaml | 2 +- .../ccap/age_category/toddler_max_months.yaml | 2 +- .../dhhs/ccap/cost_share/step_1_fpg_rate.yaml | 2 +- .../dhhs/ccap/cost_share/step_2_amount.yaml | 2 +- .../dhhs/ccap/cost_share/step_2_fpg_rate.yaml | 2 +- .../nh/dhhs/ccap/cost_share/step_3_rate.yaml | 2 +- .../ccap/eligibility/child_age_limit.yaml | 2 +- .../eligibility/disabled_child_age_limit.yaml | 2 +- .../qualified_immigration_statuses.yaml | 6 +- .../ccap/income/countable_income/sources.yaml | 2 +- .../ccap/income/income_limit_smi_rate.yaml | 2 +- .../payment/disability_supplement/amount.yaml | 2 +- .../dhhs/ccap/payment/exempt_center_rate.yaml | 2 +- .../ccap/payment/exempt_in_home_rate.yaml | 2 +- .../ccap/payment/rates/licensed_center.yaml | 16 +- .../ccap/payment/rates/licensed_family.yaml | 4 +- .../ccap/service_level/full_time_hours.yaml | 2 +- .../ccap/service_level/half_time_hours.yaml | 2 +- .../gov/states/nh/dhhs/ccap/integration.yaml | 18 +- .../gov/states/nh/dhhs/ccap/nh_ccap.yaml | 32 +++ .../states/nh/dhhs/ccap/nh_ccap_eligible.yaml | 22 +- .../nh/dhhs/ccap/nh_ccap_payment_rate.yaml | 16 +- .../eligibility/nh_ccap_activity_eligible.py | 20 ++ .../dhhs/ccap/eligibility/nh_ccap_eligible.py | 4 +- .../eligibility/nh_ccap_eligible_child.py | 2 +- ...ccap_immigration_status_eligible_person.py | 2 +- .../eligibility/nh_ccap_income_eligible.py | 2 +- .../gov/states/nh/dhhs/ccap/nh_ccap.py | 2 +- .../dhhs/ccap/nh_ccap_child_age_category.py | 2 +- .../states/nh/dhhs/ccap/nh_ccap_cost_share.py | 2 +- .../nh/dhhs/ccap/nh_ccap_countable_income.py | 2 +- .../nh/dhhs/ccap/nh_ccap_provider_type.py | 2 +- .../nh/dhhs/ccap/nh_ccap_service_level.py | 2 +- .../payment/nh_ccap_disability_supplement.py | 2 +- .../dhhs/ccap/payment/nh_ccap_payment_rate.py | 2 +- .../states/nh/dhhs/nh_child_care_subsidies.py | 11 + sources/working_references.md | 239 ------------------ uv.lock | 2 +- 41 files changed, 136 insertions(+), 323 deletions(-) delete mode 100644 lessons/agent-lessons.md create mode 100644 policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_activity_eligible.py create mode 100644 policyengine_us/variables/gov/states/nh/dhhs/nh_child_care_subsidies.py delete mode 100644 sources/working_references.md diff --git a/lessons/agent-lessons.md b/lessons/agent-lessons.md deleted file mode 100644 index 8bcdae18aff..00000000000 --- a/lessons/agent-lessons.md +++ /dev/null @@ -1,14 +0,0 @@ -# Agent Lessons Learned - -Accumulated from /encode-policy-v2 and /backdate-program runs across all contributors. -Loaded by implementation agents on future runs. - - -## New Lessons from New Hampshire CCAP (2026-03-12) - -### REFERENCE -- State legislature filing-history or rule-history URLs are fragile (redirect chains that end in 404); always verify that reference URLs resolve before citing them, and prefer permanent/canonical URLs (e.g., section-specific regulation portals) over dynamic filing-history pages. - -### TEST -- Integration tests must include at least one case with a positive (non-zero) final benefit amount to verify the full calculation pipeline produces a correct payable result; zero-benefit-only integration tests hide formula errors that cancel out. -- When a benefit has add-on components (supplements, adjustments, bonuses), test that each add-on flows through to the top-level benefit variable — not just that the add-on variable calculates correctly in isolation. diff --git a/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml b/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml index 367612a52ae..4c9e17fc861 100644 --- a/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml +++ b/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml @@ -5,6 +5,7 @@ values: - co_child_care_subsidies # Colorado Child Care Assistance Program - ma_child_care_subsidies # Massachusetts Child Care Financial Assistance - ne_child_care_subsidies # Nebraska Child Care Subsidy + - nh_child_care_subsidies # New Hampshire Child Care Scholarship Program metadata: unit: list diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml index 85406c5fe1b..ac65d63df41 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP infant age category upper bound in months reference: - title: He-C 6910.17(i) - href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17 + href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml index ca9ff3ce925..8b72b9eecf3 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP preschool age category upper bound in months reference: - title: He-C 6910.17(i) - href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17 + href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml index d5e506ead1c..38ab3f9690e 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP toddler age category upper bound in months reference: - title: He-C 6910.17(i) - href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17 + href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml index b018b32a001..40977b65343 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP step 1 FPG rate threshold reference: - title: He-C 6910.18, Table 6910.19 - href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.18 + href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.18 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml index bd10e899cc0..05f159d005b 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP step 2 weekly cost share amount reference: - title: He-C 6910.18, Table 6910.19 - href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.18 + href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.18 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml index b5fc6066c64..6c7a292a218 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP step 2 FPG rate threshold reference: - title: He-C 6910.18, Table 6910.19 - href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.18 + href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.18 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml index 3834ad0ceed..7647a917fe3 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP step 3 income cost share rate reference: - title: He-C 6910.18, Table 6910.19 - href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.18 + href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.18 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml index 78eec042c6e..bb3b38f866b 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP child age limit reference: - title: He-C 6910.07(b)(3) - href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.07 + href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.07 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml index 6ce8e004d9f..20bf166793d 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP disabled child age limit reference: - title: He-C 6910.07(e) - href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.07 + href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.07 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml index be3401fa76d..8216be9ea22 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml @@ -5,13 +5,11 @@ values: - LEGAL_PERMANENT_RESIDENT - REFUGEE - ASYLEE - - PAROLED_ONE_YEAR - - DEPORTATION_WITHHELD metadata: unit: list period: year label: New Hampshire CCAP qualified immigration statuses reference: - - title: He-C 6910.07(b)(2) - href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.07 + - title: He-C 6910.09(c)(2) + href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.09 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml index ac7bbddbd4b..27162b088d0 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml @@ -26,4 +26,4 @@ metadata: label: New Hampshire CCAP countable income sources reference: - title: He-C 6910.06(b), He-C 6910.06(e) - href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.06 + href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.06 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml index 5ddc3bedb63..e7c8c48efa0 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP income limit SMI rate reference: - title: He-C 6910.06(b) - href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.06 + href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.06 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml index fd2ec0e5ee0..badf6eed4f3 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml @@ -8,7 +8,7 @@ metadata: - nh_ccap_service_level reference: - title: He-C 6910.17(g) - href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17 + href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 FULL_TIME: 2024-07-01: 100 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml index 86ea94474cc..d3626fe5744 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP license-exempt center rate factor reference: - title: He-C 6910.17(d) - href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17 + href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml index ad3883d8e9e..5e2bd9258d2 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP license-exempt in-home rate factor reference: - title: He-C 6910.17(c) - href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17 + href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml index b367d23df2c..aa830c850fe 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml @@ -9,24 +9,26 @@ metadata: - nh_ccap_service_level reference: - title: He-C 6910.17(a) - href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17 + href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 - title: CCDF Provider Payment Rates by State (January 2025) - Tables 2-4 href: https://acf.gov/sites/default/files/documents/occ/CCDF-Provider-Payment-Rates-by-State.pdf#page=6 + - title: New Hampshire CCDF State Plan 2025-2027, Table 4.4.1 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=53 INFANT: FULL_TIME: - 2024-08-26: 344 + 2024-08-26: 344.42 HALF_TIME: - 2024-08-26: 172 + 2024-08-26: 172.21 PART_TIME: - 2024-08-26: 86 + 2024-08-26: 86.11 TODDLER: FULL_TIME: - 2024-08-26: 317 + 2024-08-26: 317.36 HALF_TIME: - 2024-08-26: 159 + 2024-08-26: 158.68 PART_TIME: - 2024-08-26: 79 + 2024-08-26: 79.34 PRESCHOOL: FULL_TIME: 2024-08-26: 280 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml index 44122c54b28..55c52ce4721 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml @@ -9,9 +9,11 @@ metadata: - nh_ccap_service_level reference: - title: He-C 6910.17(b) - href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17 + href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 - title: CCDF Provider Payment Rates by State (January 2025) - Tables 2-4 href: https://acf.gov/sites/default/files/documents/occ/CCDF-Provider-Payment-Rates-by-State.pdf#page=6 + - title: New Hampshire CCDF State Plan 2025-2027, Table 4.4.1 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=53 INFANT: FULL_TIME: diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml index 820d29347cd..5cb55119813 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP full-time hours threshold reference: - title: He-C 6910.07(m), He-C 6910.16 - href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.07 + href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.07 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml index 3425a622d55..dba216ee560 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml @@ -8,4 +8,4 @@ metadata: label: New Hampshire CCAP half-time hours threshold reference: - title: He-C 6910.07(n), He-C 6910.16 - href: https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.07 + href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.07 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/integration.yaml index ef0b872d413..5343beefdd0 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/integration.yaml @@ -33,7 +33,7 @@ spm_units: spm_unit: members: [person1, person2] - meets_ccdf_activity_test: true + tax_units: tax_unit: members: [person1, person2] @@ -72,7 +72,7 @@ spm_units: spm_unit: members: [person1, person2] - meets_ccdf_activity_test: true + tax_units: tax_unit: members: [person1, person2] @@ -112,7 +112,7 @@ spm_units: spm_unit: members: [person1, person2, person3] - meets_ccdf_activity_test: true + tax_units: tax_unit: members: [person1, person2, person3] @@ -161,7 +161,7 @@ spm_units: spm_unit: members: [person1, person2, person3, person4] - meets_ccdf_activity_test: true + tax_units: tax_unit: members: [person1, person2, person3, person4] @@ -196,7 +196,7 @@ spm_units: spm_unit: members: [person1, person2] - meets_ccdf_activity_test: true + is_tanf_enrolled: true tax_units: tax_unit: @@ -229,7 +229,7 @@ spm_units: spm_unit: members: [person1, person2] - meets_ccdf_activity_test: true + tax_units: tax_unit: members: [person1, person2] @@ -263,7 +263,7 @@ spm_units: spm_unit: members: [person1, person2] - meets_ccdf_activity_test: true + tax_units: tax_unit: members: [person1, person2] @@ -309,7 +309,7 @@ spm_units: spm_unit: members: [person1, person2, person3] - meets_ccdf_activity_test: true + tax_units: tax_unit: members: [person1, person2, person3] @@ -355,7 +355,7 @@ spm_units: spm_unit: members: [person1, person2, person3] - meets_ccdf_activity_test: true + tax_units: tax_unit: members: [person1, person2, person3] diff --git a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap.yaml b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap.yaml index 0dcbc1a899d..f5f20d5ad61 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap.yaml @@ -302,3 +302,35 @@ output: # No eligible children → no per-child payments → $0 nh_ccap: 0 + +- name: Case 11, negative countable income does not inflate benefit. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + self_employment_income: -60_000_000 + person2: + age: 4 + nh_ccap_eligible_child: true + pre_subsidy_childcare_expenses: 15_000 + nh_ccap_payment_rate: 300 + nh_ccap_disability_supplement: 0 + spm_units: + spm_unit: + members: [person1, person2] + nh_ccap_eligible: true + nh_ccap_cost_share: 0 + households: + household: + members: [person1, person2] + state_code: NH + output: + # Negative income → cost share = 0 + # Weekly expense = 15,000 / 52 = $288.46 + # Capped rate = min(288.46, 300) = $288.46 + # Per-child payment = max(288.46 - 0, 0) = $288.46 + # Monthly = 288.46 * 52/12 = $1,250 + # Benefit capped at actual expenses, NOT inflated by negative income + nh_ccap: 1_250 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_eligible.yaml index 2b35652d6cc..7015a45ea1c 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_eligible.yaml @@ -17,7 +17,7 @@ spm_units: spm_unit: members: [person1, person2] - meets_ccdf_activity_test: true + households: household: members: [person1, person2] @@ -40,7 +40,7 @@ spm_units: spm_unit: members: [person1, person2] - meets_ccdf_activity_test: true + households: household: members: [person1, person2] @@ -62,7 +62,7 @@ spm_units: spm_unit: members: [person1, person2] - meets_ccdf_activity_test: true + households: household: members: [person1, person2] @@ -77,6 +77,7 @@ person1: age: 30 employment_income: 36_000 + weekly_hours_worked: 0 person2: age: 5 is_tax_unit_dependent: true @@ -84,7 +85,6 @@ spm_units: spm_unit: members: [person1, person2] - meets_ccdf_activity_test: false households: household: members: [person1, person2] @@ -106,7 +106,7 @@ spm_units: spm_unit: members: [person1, person2] - meets_ccdf_activity_test: true + spm_unit_assets: 1_100_000 households: household: @@ -129,7 +129,7 @@ spm_units: spm_unit: members: [person1, person2] - meets_ccdf_activity_test: true + households: household: members: [person1, person2] @@ -154,7 +154,7 @@ spm_units: spm_unit: members: [person1, person2] - meets_ccdf_activity_test: true + households: household: members: [person1, person2] @@ -178,7 +178,7 @@ spm_units: spm_unit: members: [person1, person2] - meets_ccdf_activity_test: true + households: household: members: [person1, person2] @@ -202,7 +202,7 @@ spm_units: spm_unit: members: [person1, person2] - meets_ccdf_activity_test: true + households: household: members: [person1, person2] @@ -225,7 +225,7 @@ spm_units: spm_unit: members: [person1, person2] - meets_ccdf_activity_test: true + households: household: members: [person1, person2] @@ -247,7 +247,7 @@ spm_units: spm_unit: members: [person1, person2] - meets_ccdf_activity_test: true + spm_unit_assets: 1_000_000 households: household: diff --git a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_payment_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_payment_rate.yaml index c370333e7fb..baad74b3eae 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_payment_rate.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_payment_rate.yaml @@ -26,8 +26,8 @@ members: [person1] state_code: NH output: - # Licensed center infant full-time: $344/week - nh_ccap_payment_rate: 344 + # Licensed center infant full-time: $344.42/week + nh_ccap_payment_rate: 344.42 - name: Case 2, licensed family, toddler, half-time. period: 2025-01 @@ -98,8 +98,8 @@ members: [person1] state_code: NH output: - # 50% of licensed center toddler full-time ($317) = $158.50 - nh_ccap_payment_rate: 158.50 + # 50% of licensed center toddler full-time ($317.36) = $158.68 + nh_ccap_payment_rate: 158.68 - name: Case 6, licensed center, infant, full-time, disabled child (rate excludes supplement). period: 2025-01 @@ -118,8 +118,8 @@ state_code: NH output: # Base rate only; disability supplement is in nh_ccap_disability_supplement - # Licensed center infant full-time: $344/week - nh_ccap_payment_rate: 344 + # Licensed center infant full-time: $344.42/week + nh_ccap_payment_rate: 344.42 - name: Case 7, licensed family, preschool, half-time, disabled child (rate excludes supplement). period: 2025-01 @@ -211,8 +211,8 @@ members: [person1] state_code: NH output: - # 50% of licensed center infant full-time ($344) = $172 - nh_ccap_payment_rate: 172 + # 50% of licensed center infant full-time ($344.42) = $172.21 + nh_ccap_payment_rate: 172.21 - name: Case 12, licensed center, school age, half-time. period: 2025-01 diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_activity_eligible.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_activity_eligible.py new file mode 100644 index 00000000000..47f466557be --- /dev/null +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_activity_eligible.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class nh_ccap_activity_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for New Hampshire CCAP based on activity requirements" + definition_period = MONTH + defined_for = StateCode.NH + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.07" + + def formula(spm_unit, period, parameters): + person = spm_unit.members + is_head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) + hours_worked = person("weekly_hours_worked", period.this_year) + is_employed = hours_worked > 0 + is_student = person("is_full_time_student", period.this_year) + is_disabled = person("is_disabled", period.this_year) + individually_eligible = is_employed | is_student | is_disabled + return spm_unit.sum(is_head_or_spouse & ~individually_eligible) == 0 diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible.py index d9ecdd54c80..566bc3347dc 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible.py @@ -7,11 +7,11 @@ class nh_ccap_eligible(Variable): label = "Eligible for New Hampshire Child Care Scholarship Program" definition_period = MONTH defined_for = StateCode.NH - reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.07" + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.07" def formula(spm_unit, period, parameters): has_eligible_child = add(spm_unit, period, ["nh_ccap_eligible_child"]) > 0 income_eligible = spm_unit("nh_ccap_income_eligible", period) asset_eligible = spm_unit("is_ccdf_asset_eligible", period.this_year) - activity_eligible = spm_unit("meets_ccdf_activity_test", period.this_year) + activity_eligible = spm_unit("nh_ccap_activity_eligible", period) return has_eligible_child & income_eligible & asset_eligible & activity_eligible diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible_child.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible_child.py index f9a8f6cdafe..ff981efb690 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible_child.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_eligible_child.py @@ -7,7 +7,7 @@ class nh_ccap_eligible_child(Variable): label = "Eligible child for New Hampshire Child Care Scholarship Program" definition_period = MONTH defined_for = StateCode.NH - reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.07" + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.07" def formula(person, period, parameters): p = parameters(period).gov.states.nh.dhhs.ccap.eligibility diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_immigration_status_eligible_person.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_immigration_status_eligible_person.py index 4fdc1343499..3392795325e 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_immigration_status_eligible_person.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_immigration_status_eligible_person.py @@ -7,7 +7,7 @@ class nh_ccap_immigration_status_eligible_person(Variable): label = "Eligible person for New Hampshire Child Care Scholarship Program based on immigration status" definition_period = MONTH defined_for = StateCode.NH - reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.07" + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.09" def formula(person, period, parameters): p = parameters(period).gov.states.nh.dhhs.ccap diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_income_eligible.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_income_eligible.py index 1fb25398675..73fb8f6a27e 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_income_eligible.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/eligibility/nh_ccap_income_eligible.py @@ -7,7 +7,7 @@ class nh_ccap_income_eligible(Variable): label = "Income eligible for New Hampshire Child Care Scholarship Program" definition_period = MONTH defined_for = StateCode.NH - reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.06" + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.06" def formula(spm_unit, period, parameters): p = parameters(period).gov.states.nh.dhhs.ccap.income diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap.py index dcba8ed4e6a..764e9143d2f 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap.py @@ -8,7 +8,7 @@ class nh_ccap(Variable): label = "New Hampshire Child Care Scholarship Program benefit amount" definition_period = MONTH defined_for = "nh_ccap_eligible" - reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17" + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17" def formula(spm_unit, period, parameters): person = spm_unit.members diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_child_age_category.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_child_age_category.py index 0e2fe0770b2..9bb421e4608 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_child_age_category.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_child_age_category.py @@ -16,7 +16,7 @@ class nh_ccap_child_age_category(Variable): definition_period = MONTH defined_for = StateCode.NH label = "New Hampshire Child Care Scholarship Program child age category" - reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17" + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17" def formula(person, period, parameters): p = parameters(period).gov.states.nh.dhhs.ccap.age_category diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_cost_share.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_cost_share.py index 8c4a05fb5d3..e4fc7b2e1d7 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_cost_share.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_cost_share.py @@ -8,7 +8,7 @@ class nh_ccap_cost_share(Variable): label = "New Hampshire Child Care Scholarship Program weekly family cost share" definition_period = MONTH defined_for = StateCode.NH - reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.18" + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.18" def formula(spm_unit, period, parameters): p = parameters(period).gov.states.nh.dhhs.ccap.cost_share diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_countable_income.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_countable_income.py index c207305d147..ee286b25658 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_countable_income.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_countable_income.py @@ -8,6 +8,6 @@ class nh_ccap_countable_income(Variable): definition_period = MONTH unit = USD defined_for = StateCode.NH - reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.06" + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.06" adds = "gov.states.nh.dhhs.ccap.income.countable_income.sources" diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_provider_type.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_provider_type.py index 603249edf22..3e07af52642 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_provider_type.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_provider_type.py @@ -16,4 +16,4 @@ class nh_ccap_provider_type(Variable): definition_period = MONTH defined_for = StateCode.NH label = "New Hampshire Child Care Scholarship Program provider type" - reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17" + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17" diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_service_level.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_service_level.py index ecf8091d578..1ab5a35d6b3 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_service_level.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_service_level.py @@ -15,7 +15,7 @@ class nh_ccap_service_level(Variable): definition_period = MONTH defined_for = StateCode.NH label = "New Hampshire Child Care Scholarship Program service level" - reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.07" + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.07" def formula(person, period, parameters): p = parameters(period).gov.states.nh.dhhs.ccap.service_level diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_disability_supplement.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_disability_supplement.py index cfaa6a2fd14..e44fc70847f 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_disability_supplement.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_disability_supplement.py @@ -8,7 +8,7 @@ class nh_ccap_disability_supplement(Variable): label = "New Hampshire Child Care Scholarship Program weekly disability supplement" definition_period = MONTH defined_for = "nh_ccap_eligible_child" - reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17" + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17" def formula(person, period, parameters): p = parameters(period).gov.states.nh.dhhs.ccap.payment diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_payment_rate.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_payment_rate.py index c3f3e98f2aa..db76887ab97 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_payment_rate.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_payment_rate.py @@ -11,7 +11,7 @@ class nh_ccap_payment_rate(Variable): label = "New Hampshire Child Care Scholarship Program weekly payment rate" definition_period = MONTH defined_for = "nh_ccap_eligible_child" - reference = "https://www.law.cornell.edu/regulations/new-hampshire/N.H.Code.Admin.R.He-C.6910.17" + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17" def formula(person, period, parameters): p = parameters(period).gov.states.nh.dhhs.ccap.payment diff --git a/policyengine_us/variables/gov/states/nh/dhhs/nh_child_care_subsidies.py b/policyengine_us/variables/gov/states/nh/dhhs/nh_child_care_subsidies.py new file mode 100644 index 00000000000..23d97050580 --- /dev/null +++ b/policyengine_us/variables/gov/states/nh/dhhs/nh_child_care_subsidies.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class nh_child_care_subsidies(Variable): + value_type = float + entity = SPMUnit + label = "New Hampshire child care subsidies" + unit = USD + definition_period = YEAR + defined_for = StateCode.NH + adds = ["nh_ccap"] diff --git a/sources/working_references.md b/sources/working_references.md deleted file mode 100644 index 7b9aee9ceb2..00000000000 --- a/sources/working_references.md +++ /dev/null @@ -1,239 +0,0 @@ -# NH Child Care Scholarship Program - Working References - -## Official Program Name -**New Hampshire Child Care Scholarship Program** (Employment-Related NH Child Care Scholarship) - -Administered by: NH Department of Health and Human Services (DHHS), Division of Economic and Housing Stability (DEHS) - -## Primary Regulatory Authority - -### NH Administrative Rules (He-C 6900 Series) - -| Rule | Title | Scope | -|------|-------|-------| -| He-C 6910 | Employment-Related NH Child Care Scholarship Program Eligibility | Core eligibility, income, cost share, service levels | -| He-C 6912 | Preventative and Protective Child Care Eligibility | Non-employment-related child care (abuse prevention/protection) | -| He-C 6914 | Child Care Provider Enrollment Requirements | Provider enrollment criteria | -| He-C 6916 | Health and Safety Rules for Facility-Based License-Exempt Providers | Facility-based provider standards | -| He-C 6917 | Health and Safety Rules for Family/Friend/Neighbor License-Exempt Providers | In-home provider standards | -| He-C 6918 | Child Care Provider Billing and Payment Requirements | Billing, payment, cost share collection | -| He-C 6920 | Criminal Records and Central Registry Check for License-Exempt Providers | Background checks | - -**Full text source**: https://gc.nh.gov/rules/state_agencies/he-c6900.html -(Extracted text saved at `/tmp/nh-ccap-sources/he-c-6900-full-text.txt`) - -Most recent effective dates: -- He-C 6910: #13951, eff 4-30-24 -- He-C 6912: #13064, eff 7-1-20 -- He-C 6918: #13066, eff 7-1-20 - -### NH Revised Statutes - -| Statute | Title | Relevance | -|---------|-------|-----------| -| RSA 167:78 | Definitions | Defines dependent child, caretaker relative, family assistance program | -| RSA 167:83 | Commissioner's powers | Authority for child care program | -| RSA 170-E | Child Day Care Licensing | Provider licensing, exemptions, registration | -| RSA 161:2, XII | DHHS powers | Rulemaking authority | - -**RSA 167:78**: https://gc.nh.gov/rsa/html/XII/167/167-78.htm -**RSA 170-E**: https://gc.nh.gov/rsa/html/XII/170-E/170-E-mrg.htm - -### Federal Authority - -| Authority | Relevance | -|-----------|-----------| -| 42 U.S.C. 9858 (CCDBG Act) | Federal child care block grant | -| 45 CFR Part 98 | CCDF regulations | -| 45 CFR 98.45 | Market rate survey / payment rates | - -### NH CCDF State Plan - -- **FY 2025-2027 CCDF Plan**: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf (blocked from direct download) -- **FY 2025-2027 Appendix (ACF)**: https://acf.gov/sites/default/files/documents/occ/NH-Accepted-ACF118-CCDF-FFY-2025-2027-Appendix.pdf (downloaded to `/tmp/nh-ccap-sources/nh-ccdf-appendix.pdf`) -- **All approved plans**: https://acf.gov/occ/form/approved-ccdf-plans-fy-2025-2027 - ---- - -## Eligibility Rules Summary (He-C 6910) - -### Financial Eligibility (He-C 6910.06) - -**Income Limit**: Monthly gross income must not exceed **85% of State Median Income (SMI)** for the family size (He-C 6910.06(b)). - -Alternative financial eligibility paths (He-C 6910.06(a)): -1. Receiving TANF financial assistance -2. Receiving TANF-related medical assistance -3. Participating in NHEP with TANF application pending -4. Meeting the 85% SMI gross income limit - -**Income Exclusions** (He-C 6910.06(c)): -1. Income of any grandparent (when 3 generations in one household) -2. Child foster care payments -3. Adoption subsidies -4. Educational assistance/student loans/scholarships for educational expenses -5. Income of caretaker relative or legal guardian (and spouse), unless also applying for their own child -6. AmeriCorps VISTA income -7. Earned income from dependent child who is full-time student -8. SSI when recipient is dependent child -9. TANF financial assistance payments - -**Self-employment**: Net monthly income after IRS-allowable business expense deductions (He-C 6910.06(d)). - -**Resources**: Not counted unless total exceeds $1,000,000 in assets (He-C 6910.06(f)). - -**Income calculation**: Per He-W 744.01 (general) or He-W 744.03 (fluctuating income) (He-C 6910.06(e)). - -### Non-Financial Eligibility (He-C 6910.07) - -**Child requirements**: -- NH resident (He-C 6910.07(b)(1)) -- US citizen or qualifying non-citizen (He-C 6910.07(b)(2)) -- Under 13 years of age (He-C 6910.07(b)(3)) - - Exception: 13+ with verified disability or significant special need (He-C 6910.07(e)) -- Linked to one enrolled provider (He-C 6910.07(b)(4)) - -**Age categories for payment** (He-C 6910.17(i) and He-C 6912.16(j)): -- 0-17 months -- 18-35 months -- 36-78 months -- 79-155 months - -**Parent activity requirements** (He-C 6910.07(f)): -1. Employment (any earned income or in-kind compensation) -2. Job search (up to 92 calendar days) -3. Training or educational program -4. Basic education (GED, ESL, etc.) -5. NHEP activities -6. Mental health/substance misuse treatment (NHEP or FAP recipients) - -**Two-parent households** (He-C 6910.07(i)): -- Both parents must be in qualifying activity, OR -- One parent in qualifying activity and other qualifies as parent with disability - -**Assistance group composition** (He-C 6910.10(g)(1)): -- All children under 18 with biological/foster/step/adoptive relationship -- All individuals under 20 in school with same relationship -- Any adult with biological/foster/step/adoptive/caretaker/legal guardian relationship to child -- Two adults sharing common child count as one assistance group (He-C 6910.07(j)) - -### Service Levels (He-C 6910.07(m)-(p), He-C 6910.16) - -| Level | Hours per week | -|-------|---------------| -| Full-time | > 30 hours | -| Half-time | > 15 and <= 30 hours | -| Part-time | 1 to <= 15 hours | - -Based on parent's activity hours + commute time (1 hour/day per employment day). - -Children 6+ years (79+ months): eligible for half-time only when parent works full-time, unless full-time override during school/summer vacations (He-C 6910.16(e)). - -Two-parent households: service level based on lowest number of hours either parent participates (He-C 6910.07(q)). - ---- - -## Cost Share / Copayment (He-C 6910.18) - -### Cost Share Steps (Table 6910.19) - -| Step | Income Range (% FPG) | Family Cost Share | -|------|---------------------|-------------------| -| 1 | <= 100% FPG | $0/week | -| 2 | > 100% but <= 138% FPG | $5/week | -| 3 | > 138% FPG but <= 85% SMI | 7.0% of family income | - -**Cost share calculation** (He-C 6910.18(b)): -- Monthly gross income x cost share percent / 4.33 weeks - -**Family cap**: Cost share calculated at initial eligibility/redetermination; cannot exceed family cap during 12-month period (He-C 6910.18(c)). - -**Cost share per child**: Family cost share divided equally among all eligible children (He-C 6910.18(f)). - ---- - -## Payment Rate Methodology (He-C 6910.17) - -### Employment-Related (He-C 6910.17) - -| Provider Type | Rate Basis | -|---------------|-----------| -| Licensed child care centers | 75th percentile of most recent MRS | -| Licensed family child care homes | 75th percentile of most recent MRS | -| License-exempt in-home providers | 70% of licensed family child care home rate | -| License-exempt child care centers | 50% of licensed child care center rate | - -Market Rate Survey (MRS) conducted every 3 years per 45 CFR 98.45. - -### Preventive/Protective (He-C 6912.16) - -| Provider Type | Rate Basis | -|---------------|-----------| -| Licensed centers & family homes (0-35 months) | 60th percentile of MRS | -| Licensed centers & family homes (36+ months) | 55th percentile of MRS | -| License-exempt in-home | 70% of licensed family home rate | -| License-exempt centers | 50% of licensed center rate | - -### Payment Calculation (He-C 6910.17(e)) - -Payment = min(provider charge, standard weekly rate) - family cost share - -### Supplemental Payments for Disability/Special Needs (He-C 6910.17(g)) - -| Service Level | Supplement | -|--------------|-----------| -| Full-time | $100.00/week | -| Half-time | $75.00/week | -| Part-time | $50.00/week | - -### Absentee Allotment (He-C 6918.05(b)) - -| Service Level | Monthly Absentee Hours | -|--------------|----------------------| -| Full-time | 21 hours | -| Half-time | 13 hours | -| Part-time | None | - ---- - -## Other Key Program Features - -### Eligibility Period -- 12 months maximum (He-C 6910.10(l)) -- Annual redetermination required (He-C 6910.15) - -### Continued Assistance -- Up to 92 calendar days following termination of approved activity (He-C 6910.10(m)) - -### Job Search -- Up to 92 calendar days (He-C 6910.07(g)) -- 6 months must lapse between job search activities (He-C 6910.13(a)(4)) - -### Training/Education Limits -- 104 weeks lifetime limit for non-TANF recipients (He-C 6910.13(d)(3)) -- Must lead to associate degree or lower (He-C 6910.13(d)(5)) -- TANF recipients: associate or bachelor level (He-C 6910.13(e)(2)) -- Basic education (GED, ESL) exempt from lifetime limit (He-C 6910.13(f)) - -### Registration Fee -- Up to $50.00 per calendar year per eligible child (He-C 6918.04(aa)) - -### Waitlist -- Established when cost projections exceed available funds (He-C 6910.11) - ---- - -## Existing Codebase References - -The codebase has relevant federal-level infrastructure: -- `hhs_smi` variable: Computes State Median Income by state and family size (`policyengine_us/variables/gov/hhs/hhs_smi.py`) -- `ccdf_income_to_smi_ratio`: Income-to-SMI ratio calculation (`policyengine_us/variables/gov/hhs/ccdf/ccdf_income_to_smi_ratio.py`) -- `ccdf_income_limit_smi`: 85% SMI limit parameter (`policyengine_us/parameters/gov/hhs/ccdf/income_limit_smi.yaml`) -- Federal poverty guidelines: Used in cost share determination - -Existing state CCAP implementations for reference: -- Colorado CCAP: `policyengine_us/variables/gov/states/co/ccap/` -- Illinois CCAP: `policyengine_us/variables/gov/states/il/dhs/ccap/` -- Texas CCS: `policyengine_us/variables/gov/states/tx/twc/ccs/` -- Nebraska Child Care Subsidy: `policyengine_us/variables/gov/states/ne/dhhs/child_care_subsidy/` -- California Child Care: `policyengine_us/variables/gov/states/ca/cdss/child_care/` diff --git a/uv.lock b/uv.lock index efec4d8555d..7adaf13620b 100644 --- a/uv.lock +++ b/uv.lock @@ -1492,7 +1492,7 @@ wheels = [ [[package]] name = "policyengine-us" -version = "1.592.1" +version = "1.598.0" source = { editable = "." } dependencies = [ { name = "microdf-python" }, From 76f3796cefddee4fc3b77f520c3c8ea384e0b627 Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 16 Mar 2026 11:17:34 -0400 Subject: [PATCH 08/10] Fix review findings: references, descriptions, tests, and metadata MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add nh_ccap_activity_eligible tests (7 cases: employed, student, disabled, non-qualifying, two-parent, child-not-affected) - Fix service level subsection citations: He-C 6910.07(m)/(n) → (o) - Fix rate table section number: Table 4.4.1 → Section 4.3.2, Table 1 - Add CCDF State Plan 2025-2027 as corroborating reference to all 17 parameter files with #page= citations - Add amendment register (eff. 4-30-24, #13951) to all He-C titles - Fix description verbs: defines → sets, counts → uses - Remove explanatory text from step_2_amount description - Fix step_2_amount period metadata: year → week - Add reference field to nh_child_care_subsidies aggregator - Improve income source reference to cite He-C 6910.06(b)-(c),(e) Co-Authored-By: Claude Opus 4.6 (1M context) --- .../ccap/age_category/infant_max_months.yaml | 6 +- .../age_category/preschool_max_months.yaml | 6 +- .../ccap/age_category/toddler_max_months.yaml | 6 +- .../dhhs/ccap/cost_share/step_1_fpg_rate.yaml | 4 +- .../dhhs/ccap/cost_share/step_2_amount.yaml | 8 +- .../dhhs/ccap/cost_share/step_2_fpg_rate.yaml | 4 +- .../nh/dhhs/ccap/cost_share/step_3_rate.yaml | 4 +- .../ccap/eligibility/child_age_limit.yaml | 4 +- .../eligibility/disabled_child_age_limit.yaml | 4 +- .../qualified_immigration_statuses.yaml | 4 +- .../ccap/income/countable_income/sources.yaml | 6 +- .../ccap/income/income_limit_smi_rate.yaml | 4 +- .../payment/disability_supplement/amount.yaml | 4 +- .../dhhs/ccap/payment/exempt_center_rate.yaml | 4 +- .../ccap/payment/exempt_in_home_rate.yaml | 4 +- .../ccap/payment/rates/licensed_center.yaml | 4 +- .../ccap/payment/rates/licensed_family.yaml | 4 +- .../ccap/service_level/full_time_hours.yaml | 4 +- .../ccap/service_level/half_time_hours.yaml | 4 +- .../dhhs/ccap/nh_ccap_activity_eligible.yaml | 166 ++++++++++++++++++ .../dhhs/ccap/nh_ccap_child_age_category.py | 3 +- .../states/nh/dhhs/nh_child_care_subsidies.py | 1 + 22 files changed, 229 insertions(+), 29 deletions(-) create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_activity_eligible.yaml diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml index ac65d63df41..33074737fe2 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml @@ -1,4 +1,4 @@ -description: New Hampshire defines the infant age category as up to this age in months under the Child Care Scholarship Program. +description: New Hampshire sets the infant age category as up to this age in months under the Child Care Scholarship Program. values: 2024-07-01: 18 @@ -7,5 +7,7 @@ metadata: period: year label: New Hampshire CCAP infant age category upper bound in months reference: - - title: He-C 6910.17(i) + - title: He-C 6910.17(i) (eff. 4-30-24, #13951) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 + - title: New Hampshire CCDF State Plan 2025-2027, Section 4.3.2 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=60 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml index 8b72b9eecf3..d6c21cd4448 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml @@ -1,4 +1,4 @@ -description: New Hampshire defines the preschool age category as up to this age in months under the Child Care Scholarship Program. +description: New Hampshire sets the preschool age category as up to this age in months under the Child Care Scholarship Program. values: 2024-07-01: 79 @@ -7,5 +7,7 @@ metadata: period: year label: New Hampshire CCAP preschool age category upper bound in months reference: - - title: He-C 6910.17(i) + - title: He-C 6910.17(i) (eff. 4-30-24, #13951) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 + - title: New Hampshire CCDF State Plan 2025-2027, Section 4.3.2 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=60 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml index 38ab3f9690e..651d0a6e590 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml @@ -1,4 +1,4 @@ -description: New Hampshire defines the toddler age category as up to this age in months under the Child Care Scholarship Program. +description: New Hampshire sets the toddler age category as up to this age in months under the Child Care Scholarship Program. values: 2024-07-01: 36 @@ -7,5 +7,7 @@ metadata: period: year label: New Hampshire CCAP toddler age category upper bound in months reference: - - title: He-C 6910.17(i) + - title: He-C 6910.17(i) (eff. 4-30-24, #13951) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 + - title: New Hampshire CCDF State Plan 2025-2027, Section 4.3.2 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=60 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml index 40977b65343..4842052e26e 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml @@ -7,5 +7,7 @@ metadata: period: year label: New Hampshire CCAP step 1 FPG rate threshold reference: - - title: He-C 6910.18, Table 6910.19 + - title: He-C 6910.18, Table 6910.19 (eff. 4-30-24, #13951) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.18 + - title: New Hampshire CCDF State Plan 2025-2027, Section 3.2.1 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=42 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml index 05f159d005b..2ab8ce45c32 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml @@ -1,11 +1,13 @@ -description: New Hampshire provides this amount as the flat weekly cost share for families between 100% and 138% of the federal poverty guideline under the Child Care Scholarship Program. +description: New Hampshire provides this amount as the flat weekly cost share under the Child Care Scholarship Program. values: 2024-07-01: 5 metadata: unit: currency-USD - period: year + period: week label: New Hampshire CCAP step 2 weekly cost share amount reference: - - title: He-C 6910.18, Table 6910.19 + - title: He-C 6910.18, Table 6910.19 (eff. 4-30-24, #13951) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.18 + - title: New Hampshire CCDF State Plan 2025-2027, Section 3.2.1 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=42 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml index 6c7a292a218..3fa61820016 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml @@ -7,5 +7,7 @@ metadata: period: year label: New Hampshire CCAP step 2 FPG rate threshold reference: - - title: He-C 6910.18, Table 6910.19 + - title: He-C 6910.18, Table 6910.19 (eff. 4-30-24, #13951) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.18 + - title: New Hampshire CCDF State Plan 2025-2027, Section 3.2.1 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=42 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml index 7647a917fe3..b68ba8be9ff 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml @@ -7,5 +7,7 @@ metadata: period: year label: New Hampshire CCAP step 3 income cost share rate reference: - - title: He-C 6910.18, Table 6910.19 + - title: He-C 6910.18, Table 6910.19 (eff. 4-30-24, #13951) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.18 + - title: New Hampshire CCDF State Plan 2025-2027, Section 3.2.1 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=42 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml index bb3b38f866b..d2edb80bb71 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml @@ -7,5 +7,7 @@ metadata: period: year label: New Hampshire CCAP child age limit reference: - - title: He-C 6910.07(b)(3) + - title: He-C 6910.07(b)(3) (eff. 4-30-24, #13951) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.07 + - title: New Hampshire CCDF State Plan 2025-2027, Section 2.3.1 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=26 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml index 20bf166793d..e80eace48ec 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml @@ -7,5 +7,7 @@ metadata: period: year label: New Hampshire CCAP disabled child age limit reference: - - title: He-C 6910.07(e) + - title: He-C 6910.07(e) (eff. 4-30-24, #13951) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.07 + - title: New Hampshire CCDF State Plan 2025-2027, Section 2.3.1 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=26 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml index 8216be9ea22..e9229990356 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml @@ -11,5 +11,7 @@ metadata: period: year label: New Hampshire CCAP qualified immigration statuses reference: - - title: He-C 6910.09(c)(2) + - title: He-C 6910.09(c)(2) (eff. 4-30-24, #13951) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.09 + - title: New Hampshire CCDF State Plan 2025-2027, Section 2.3.3 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=27 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml index 27162b088d0..32b72d9e115 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml @@ -1,4 +1,4 @@ -description: New Hampshire counts these income sources as countable income under the Child Care Scholarship Program. +description: New Hampshire uses these income sources as countable income under the Child Care Scholarship Program. values: 2024-07-01: # Earned income @@ -25,5 +25,7 @@ metadata: period: year label: New Hampshire CCAP countable income sources reference: - - title: He-C 6910.06(b), He-C 6910.06(e) + - title: He-C 6910.06(b)-(c),(e) (eff. 4-30-24, #13951) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.06 + - title: New Hampshire CCDF State Plan 2025-2027, Section 2.2.4 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=25 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml index e7c8c48efa0..6afe58c1f4f 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml @@ -7,5 +7,7 @@ metadata: period: year label: New Hampshire CCAP income limit SMI rate reference: - - title: He-C 6910.06(b) + - title: He-C 6910.06(b) (eff. 4-30-24, #13951) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.06 + - title: New Hampshire CCDF State Plan 2025-2027, Section 2.2.4 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=24 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml index badf6eed4f3..58e5712edb3 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml @@ -7,8 +7,10 @@ metadata: breakdown: - nh_ccap_service_level reference: - - title: He-C 6910.17(g) + - title: He-C 6910.17(g) (eff. 4-30-24, #13951) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 + - title: New Hampshire CCDF State Plan 2025-2027, Section 4.3.3 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=55 FULL_TIME: 2024-07-01: 100 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml index d3626fe5744..e0ae7533bc6 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml @@ -7,5 +7,7 @@ metadata: period: year label: New Hampshire CCAP license-exempt center rate factor reference: - - title: He-C 6910.17(d) + - title: He-C 6910.17(d) (eff. 4-30-24, #13951) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 + - title: New Hampshire CCDF State Plan 2025-2027, Section 4.3.2 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=52 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml index 5e2bd9258d2..faf68c20a18 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml @@ -7,5 +7,7 @@ metadata: period: year label: New Hampshire CCAP license-exempt in-home rate factor reference: - - title: He-C 6910.17(c) + - title: He-C 6910.17(c) (eff. 4-30-24, #13951) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 + - title: New Hampshire CCDF State Plan 2025-2027, Section 4.3.2 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=52 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml index aa830c850fe..eb525ad4fbb 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml @@ -8,11 +8,11 @@ metadata: - nh_ccap_child_age_category - nh_ccap_service_level reference: - - title: He-C 6910.17(a) + - title: He-C 6910.17(a) (eff. 4-30-24, #13951) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 - title: CCDF Provider Payment Rates by State (January 2025) - Tables 2-4 href: https://acf.gov/sites/default/files/documents/occ/CCDF-Provider-Payment-Rates-by-State.pdf#page=6 - - title: New Hampshire CCDF State Plan 2025-2027, Table 4.4.1 + - title: New Hampshire CCDF State Plan 2025-2027, Section 4.3.2, Table 1 href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=53 INFANT: diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml index 55c52ce4721..493534cf928 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml @@ -8,11 +8,11 @@ metadata: - nh_ccap_child_age_category - nh_ccap_service_level reference: - - title: He-C 6910.17(b) + - title: He-C 6910.17(b) (eff. 4-30-24, #13951) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 - title: CCDF Provider Payment Rates by State (January 2025) - Tables 2-4 href: https://acf.gov/sites/default/files/documents/occ/CCDF-Provider-Payment-Rates-by-State.pdf#page=6 - - title: New Hampshire CCDF State Plan 2025-2027, Table 4.4.1 + - title: New Hampshire CCDF State Plan 2025-2027, Section 4.3.2, Table 1 href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=53 INFANT: diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml index 5cb55119813..c1ace6595a4 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml @@ -7,5 +7,7 @@ metadata: period: year label: New Hampshire CCAP full-time hours threshold reference: - - title: He-C 6910.07(m), He-C 6910.16 + - title: He-C 6910.07(o) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.07 + - title: New Hampshire CCDF State Plan 2025-2027, Section 2.4.3 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=29 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml index dba216ee560..21e93dd56be 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml @@ -7,5 +7,7 @@ metadata: period: year label: New Hampshire CCAP half-time hours threshold reference: - - title: He-C 6910.07(n), He-C 6910.16 + - title: He-C 6910.07(o) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.07 + - title: New Hampshire CCDF State Plan 2025-2027, Section 2.4.3 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=29 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_activity_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_activity_eligible.yaml new file mode 100644 index 00000000000..205802c49ba --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_activity_eligible.yaml @@ -0,0 +1,166 @@ +- name: Case 1, single employed parent. + period: 2025-01 + input: + people: + person1: + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 40 + is_full_time_student: false + is_disabled: false + person2: + age: 4 + is_tax_unit_head_or_spouse: false + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NH + output: + nh_ccap_activity_eligible: true + +- name: Case 2, single student parent. + period: 2025-01 + input: + people: + person1: + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 0 + is_full_time_student: true + is_disabled: false + person2: + age: 4 + is_tax_unit_head_or_spouse: false + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NH + output: + nh_ccap_activity_eligible: true + +- name: Case 3, single disabled parent. + period: 2025-01 + input: + people: + person1: + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 0 + is_full_time_student: false + is_disabled: true + person2: + age: 4 + is_tax_unit_head_or_spouse: false + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NH + output: + nh_ccap_activity_eligible: true + +- name: Case 4, single unemployed non-student non-disabled parent. + period: 2025-01 + input: + people: + person1: + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 0 + is_full_time_student: false + is_disabled: false + person2: + age: 4 + is_tax_unit_head_or_spouse: false + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NH + output: + nh_ccap_activity_eligible: false + +- name: Case 5, two employed parents. + period: 2025-01 + input: + people: + person1: + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 40 + is_full_time_student: false + is_disabled: false + person2: + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 20 + is_full_time_student: false + is_disabled: false + person3: + age: 4 + is_tax_unit_head_or_spouse: false + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: NH + output: + nh_ccap_activity_eligible: true + +- name: Case 6, two parents one employed one not qualifying. + period: 2025-01 + input: + people: + person1: + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 40 + is_full_time_student: false + is_disabled: false + person2: + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 0 + is_full_time_student: false + is_disabled: false + person3: + age: 4 + is_tax_unit_head_or_spouse: false + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: NH + output: + nh_ccap_activity_eligible: false + +- name: Case 7, child does not affect activity test. + period: 2025-01 + input: + people: + person1: + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 20 + is_full_time_student: false + is_disabled: false + person2: + age: 10 + is_tax_unit_head_or_spouse: false + weekly_hours_worked: 0 + is_full_time_student: false + is_disabled: false + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NH + output: + nh_ccap_activity_eligible: true diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_child_age_category.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_child_age_category.py index 9bb421e4608..4bb2edefceb 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_child_age_category.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_child_age_category.py @@ -20,8 +20,7 @@ class nh_ccap_child_age_category(Variable): def formula(person, period, parameters): p = parameters(period).gov.states.nh.dhhs.ccap.age_category - age_years = person("age", period.this_year) - age_months = age_years * MONTHS_IN_YEAR + age_months = person("age", period.this_year) * MONTHS_IN_YEAR return select( [ diff --git a/policyengine_us/variables/gov/states/nh/dhhs/nh_child_care_subsidies.py b/policyengine_us/variables/gov/states/nh/dhhs/nh_child_care_subsidies.py index 23d97050580..bda0e10d3f5 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/nh_child_care_subsidies.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/nh_child_care_subsidies.py @@ -8,4 +8,5 @@ class nh_child_care_subsidies(Variable): unit = USD definition_period = YEAR defined_for = StateCode.NH + reference = "https://www.law.cornell.edu/regulations/new-hampshire/title-He/subtitle-He-C/chapter-He-C-6900/part-He-C-6910" adds = ["nh_ccap"] From 3dd20aa1d5ae99101ba6f0573c27fcd2289ea47a Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 16 Mar 2026 14:29:14 -0400 Subject: [PATCH 09/10] Use 2024-01-01 effective dates for microsimulation compatibility All NH CCAP parameter dates changed from 2024-07-01/2024-08-26 to 2024-01-01. The framework's parameter tree caching during microsim init requires parameters to cover the test year start date. Rate files note the actual effective date (2024-08-26) in a comment. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../ccap/age_category/infant_max_months.yaml | 2 +- .../age_category/preschool_max_months.yaml | 2 +- .../ccap/age_category/toddler_max_months.yaml | 2 +- .../dhhs/ccap/cost_share/step_1_fpg_rate.yaml | 2 +- .../dhhs/ccap/cost_share/step_2_amount.yaml | 2 +- .../dhhs/ccap/cost_share/step_2_fpg_rate.yaml | 2 +- .../nh/dhhs/ccap/cost_share/step_3_rate.yaml | 2 +- .../ccap/eligibility/child_age_limit.yaml | 2 +- .../eligibility/disabled_child_age_limit.yaml | 2 +- .../qualified_immigration_statuses.yaml | 2 +- .../ccap/income/countable_income/sources.yaml | 2 +- .../ccap/income/income_limit_smi_rate.yaml | 2 +- .../payment/disability_supplement/amount.yaml | 6 ++--- .../dhhs/ccap/payment/exempt_center_rate.yaml | 2 +- .../ccap/payment/exempt_in_home_rate.yaml | 2 +- .../ccap/payment/rates/licensed_center.yaml | 25 ++++++++++--------- .../ccap/payment/rates/licensed_family.yaml | 25 ++++++++++--------- .../ccap/service_level/full_time_hours.yaml | 2 +- .../ccap/service_level/half_time_hours.yaml | 2 +- 19 files changed, 45 insertions(+), 43 deletions(-) diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml index 33074737fe2..b149765a3fe 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml @@ -1,6 +1,6 @@ description: New Hampshire sets the infant age category as up to this age in months under the Child Care Scholarship Program. values: - 2024-07-01: 18 + 2024-01-01: 18 metadata: unit: month diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml index d6c21cd4448..4e083c24b3a 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml @@ -1,6 +1,6 @@ description: New Hampshire sets the preschool age category as up to this age in months under the Child Care Scholarship Program. values: - 2024-07-01: 79 + 2024-01-01: 79 metadata: unit: month diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml index 651d0a6e590..f5f8ce558cb 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml @@ -1,6 +1,6 @@ description: New Hampshire sets the toddler age category as up to this age in months under the Child Care Scholarship Program. values: - 2024-07-01: 36 + 2024-01-01: 36 metadata: unit: month diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml index 4842052e26e..d784f027140 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml @@ -1,6 +1,6 @@ description: New Hampshire sets this share of the federal poverty guideline as the upper threshold for zero cost share under the Child Care Scholarship Program. values: - 2024-07-01: 1 + 2024-01-01: 1 metadata: unit: /1 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml index 2ab8ce45c32..f0340f4babb 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml @@ -1,6 +1,6 @@ description: New Hampshire provides this amount as the flat weekly cost share under the Child Care Scholarship Program. values: - 2024-07-01: 5 + 2024-01-01: 5 metadata: unit: currency-USD diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml index 3fa61820016..d34ea812152 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml @@ -1,6 +1,6 @@ description: New Hampshire sets this share of the federal poverty guideline as the upper threshold for the flat weekly cost share under the Child Care Scholarship Program. values: - 2024-07-01: 1.38 + 2024-01-01: 1.38 metadata: unit: /1 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml index b68ba8be9ff..2f3a18e8dc1 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml @@ -1,6 +1,6 @@ description: New Hampshire sets this share of family income as the cost share for families above 138% of the federal poverty guideline under the Child Care Scholarship Program. values: - 2024-07-01: 0.07 + 2024-01-01: 0.07 metadata: unit: /1 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml index d2edb80bb71..85398f88a4e 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml @@ -1,6 +1,6 @@ description: New Hampshire limits the Child Care Scholarship Program to children younger than this age. values: - 2024-07-01: 13 + 2024-01-01: 13 metadata: unit: year diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml index e80eace48ec..391fff72795 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml @@ -1,6 +1,6 @@ description: New Hampshire limits the Child Care Scholarship Program to disabled children younger than this age. values: - 2024-07-01: 18 + 2024-01-01: 18 metadata: unit: year diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml index e9229990356..6f29d0abdc1 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml @@ -1,6 +1,6 @@ description: New Hampshire limits the Child Care Scholarship Program to children of these immigration statuses. values: - 2024-07-01: + 2024-01-01: - CITIZEN - LEGAL_PERMANENT_RESIDENT - REFUGEE diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml index 32b72d9e115..18266ee965b 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml @@ -1,6 +1,6 @@ description: New Hampshire uses these income sources as countable income under the Child Care Scholarship Program. values: - 2024-07-01: + 2024-01-01: # Earned income - employment_income - self_employment_income diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml index 6afe58c1f4f..cf8aa7cb5f1 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml @@ -1,6 +1,6 @@ description: New Hampshire limits gross income to this share of the state median income under the Child Care Scholarship Program. values: - 2024-07-01: 0.85 + 2024-01-01: 0.85 metadata: unit: /1 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml index 58e5712edb3..ca477997773 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml @@ -13,8 +13,8 @@ metadata: href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=55 FULL_TIME: - 2024-07-01: 100 + 2024-01-01: 100 HALF_TIME: - 2024-07-01: 75 + 2024-01-01: 75 PART_TIME: - 2024-07-01: 50 + 2024-01-01: 50 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml index e0ae7533bc6..eae4ad9b2c7 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml @@ -1,6 +1,6 @@ description: New Hampshire sets this share of the licensed child care center rate for license-exempt centers under the Child Care Scholarship Program. values: - 2024-07-01: 0.5 + 2024-01-01: 0.5 metadata: unit: /1 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml index faf68c20a18..182aebe00ac 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml @@ -1,6 +1,6 @@ description: New Hampshire sets this share of the licensed family child care home rate for license-exempt in-home providers under the Child Care Scholarship Program. values: - 2024-07-01: 0.7 + 2024-01-01: 0.7 metadata: unit: /1 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml index eb525ad4fbb..5eaf0dc2e9e 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml @@ -1,4 +1,5 @@ description: New Hampshire provides these weekly standard rates for licensed child care centers under the Child Care Scholarship Program. +# NOTE: Actual effective date is 2024-08-26 per MRS; using 2024-01-01 for microsimulation compatibility. metadata: period: week @@ -17,29 +18,29 @@ metadata: INFANT: FULL_TIME: - 2024-08-26: 344.42 + 2024-01-01: 344.42 HALF_TIME: - 2024-08-26: 172.21 + 2024-01-01: 172.21 PART_TIME: - 2024-08-26: 86.11 + 2024-01-01: 86.11 TODDLER: FULL_TIME: - 2024-08-26: 317.36 + 2024-01-01: 317.36 HALF_TIME: - 2024-08-26: 158.68 + 2024-01-01: 158.68 PART_TIME: - 2024-08-26: 79.34 + 2024-01-01: 79.34 PRESCHOOL: FULL_TIME: - 2024-08-26: 280 + 2024-01-01: 280 HALF_TIME: - 2024-08-26: 140 + 2024-01-01: 140 PART_TIME: - 2024-08-26: 70 + 2024-01-01: 70 SCHOOL_AGE: FULL_TIME: - 2024-08-26: 236.25 + 2024-01-01: 236.25 HALF_TIME: - 2024-08-26: 118.13 + 2024-01-01: 118.13 PART_TIME: - 2024-08-26: 59.06 + 2024-01-01: 59.06 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml index 493534cf928..852af1c7597 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml @@ -1,4 +1,5 @@ description: New Hampshire provides these weekly standard rates for licensed family child care homes under the Child Care Scholarship Program. +# NOTE: Actual effective date is 2024-08-26 per MRS; using 2024-01-01 for microsimulation compatibility. metadata: period: week @@ -17,29 +18,29 @@ metadata: INFANT: FULL_TIME: - 2024-08-26: 250 + 2024-01-01: 250 HALF_TIME: - 2024-08-26: 125 + 2024-01-01: 125 PART_TIME: - 2024-08-26: 63 + 2024-01-01: 63 TODDLER: FULL_TIME: - 2024-08-26: 250 + 2024-01-01: 250 HALF_TIME: - 2024-08-26: 125 + 2024-01-01: 125 PART_TIME: - 2024-08-26: 63 + 2024-01-01: 63 PRESCHOOL: FULL_TIME: - 2024-08-26: 250 + 2024-01-01: 250 HALF_TIME: - 2024-08-26: 125 + 2024-01-01: 125 PART_TIME: - 2024-08-26: 63 + 2024-01-01: 63 SCHOOL_AGE: FULL_TIME: - 2024-08-26: 200 + 2024-01-01: 200 HALF_TIME: - 2024-08-26: 100 + 2024-01-01: 100 PART_TIME: - 2024-08-26: 50 + 2024-01-01: 50 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml index c1ace6595a4..e8a668785e1 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml @@ -1,6 +1,6 @@ description: New Hampshire sets this threshold as the minimum weekly hours for full-time child care under the Child Care Scholarship Program. values: - 2024-07-01: 30 + 2024-01-01: 30 metadata: unit: /1 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml index 21e93dd56be..5eb1eee4812 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml @@ -1,6 +1,6 @@ description: New Hampshire sets this threshold as the minimum weekly hours for half-time child care under the Child Care Scholarship Program. values: - 2024-07-01: 15 + 2024-01-01: 15 metadata: unit: /1 From 990cea6fe0682e794c7dc1f05d5eef2b64b40d0d Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 16 Mar 2026 16:35:21 -0400 Subject: [PATCH 10/10] Fix rates, service level, cost share, and exempt center per Form 2533 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rates: - Fix all 16 HT/PT rates from Form 2533 (were FT/2 and FT/4, actual ratios are ~77.4% and ~38.7%) - Fix toddler FT center rate: $317.36 → $317.26 - Add Form 2533 as reference with #page= citations - Remove (eff. 4-30-24, #13951) from all He-C reference titles - Fix State Plan section/page numbers (immigration 2.2.7, age categories #page=53, child age limits Section 2.2.1 #page=19, remove non-existent Section 2.4.3 from service levels) Service level: - Activity-based: uses parent's weekly_hours_worked instead of childcare_hours_per_week per He-C 6910.07(o) - Two-parent minimum: uses lowest hours per He-C 6910.07(p) - Single bracket parameter (authorized_hours.yaml) replaces full_time_hours.yaml + half_time_hours.yaml - Split into nh_ccap_authorized_activity_hours.py (SPMUnit) + nh_ccap_service_level.py (Person) Cost share: - Bracket parameters: weekly_flat_amount.yaml + income_share_rate.yaml replace 4 separate step files - Formula: flat.calc(fpg_ratio) + income * rate.calc(fpg_ratio) Exempt center: - Uses school-age center rate as base (not age-matched rate) - Blocks children under 72 months (parameterized) - Parameterized min age: exempt_center_min_age_months.yaml Benefit formula: - Disability supplement moved outside min(charge, WSR) per He-C 6910.17(g) "in addition to the standard rates" Co-Authored-By: Claude Opus 4.6 (1M context) --- .../ccap/age_category/infant_max_months.yaml | 6 +- .../age_category/preschool_max_months.yaml | 6 +- .../ccap/age_category/toddler_max_months.yaml | 6 +- .../ccap/cost_share/income_share_rate.yaml | 25 +++ .../dhhs/ccap/cost_share/step_1_fpg_rate.yaml | 13 -- .../dhhs/ccap/cost_share/step_2_amount.yaml | 13 -- .../dhhs/ccap/cost_share/step_2_fpg_rate.yaml | 13 -- .../nh/dhhs/ccap/cost_share/step_3_rate.yaml | 13 -- .../ccap/cost_share/weekly_flat_amount.yaml | 29 +++ .../ccap/eligibility/child_age_limit.yaml | 6 +- .../eligibility/disabled_child_age_limit.yaml | 6 +- .../qualified_immigration_statuses.yaml | 4 +- .../ccap/income/countable_income/sources.yaml | 2 +- .../ccap/income/income_limit_smi_rate.yaml | 2 +- .../payment/disability_supplement/amount.yaml | 2 +- .../payment/exempt_center_min_age_months.yaml | 11 + .../dhhs/ccap/payment/exempt_center_rate.yaml | 2 +- .../ccap/payment/exempt_in_home_rate.yaml | 2 +- .../ccap/payment/rates/licensed_center.yaml | 24 +- .../ccap/payment/rates/licensed_family.yaml | 22 +- .../ccap/service_level/authorized_hours.yaml | 27 +++ .../ccap/service_level/full_time_hours.yaml | 13 -- .../ccap/service_level/half_time_hours.yaml | 13 -- .../nh/dhhs/ccap/nh_ccap_payment_rate.yaml | 110 ++++++--- .../nh/dhhs/ccap/nh_ccap_service_level.yaml | 211 +++++++++++------- .../gov/states/nh/dhhs/ccap/nh_ccap.py | 10 +- .../ccap/nh_ccap_authorized_activity_hours.py | 18 ++ .../states/nh/dhhs/ccap/nh_ccap_cost_share.py | 24 +- .../nh/dhhs/ccap/nh_ccap_service_level.py | 20 +- .../dhhs/ccap/payment/nh_ccap_payment_rate.py | 20 +- 30 files changed, 395 insertions(+), 278 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/income_share_rate.yaml delete mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml delete mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml delete mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml delete mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml create mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/weekly_flat_amount.yaml create mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_min_age_months.yaml create mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/authorized_hours.yaml delete mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml delete mode 100644 policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml create mode 100644 policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_authorized_activity_hours.py diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml index b149765a3fe..1ee77501e93 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/infant_max_months.yaml @@ -7,7 +7,7 @@ metadata: period: year label: New Hampshire CCAP infant age category upper bound in months reference: - - title: He-C 6910.17(i) (eff. 4-30-24, #13951) + - title: He-C 6910.17(i) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 - - title: New Hampshire CCDF State Plan 2025-2027, Section 4.3.2 - href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=60 + - title: New Hampshire CCDF State Plan 2025-2027, Section 4.3.2, Table 1 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=53 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml index 4e083c24b3a..57bf49eebc5 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/preschool_max_months.yaml @@ -7,7 +7,7 @@ metadata: period: year label: New Hampshire CCAP preschool age category upper bound in months reference: - - title: He-C 6910.17(i) (eff. 4-30-24, #13951) + - title: He-C 6910.17(i) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 - - title: New Hampshire CCDF State Plan 2025-2027, Section 4.3.2 - href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=60 + - title: New Hampshire CCDF State Plan 2025-2027, Section 4.3.2, Table 1 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=53 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml index f5f8ce558cb..594aba83559 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/age_category/toddler_max_months.yaml @@ -7,7 +7,7 @@ metadata: period: year label: New Hampshire CCAP toddler age category upper bound in months reference: - - title: He-C 6910.17(i) (eff. 4-30-24, #13951) + - title: He-C 6910.17(i) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 - - title: New Hampshire CCDF State Plan 2025-2027, Section 4.3.2 - href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=60 + - title: New Hampshire CCDF State Plan 2025-2027, Section 4.3.2, Table 1 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=53 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/income_share_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/income_share_rate.yaml new file mode 100644 index 00000000000..6ac34776f7f --- /dev/null +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/income_share_rate.yaml @@ -0,0 +1,25 @@ +description: New Hampshire sets this share of family income as the weekly cost share by federal poverty guideline ratio under the Child Care Scholarship Program. + +brackets: + - threshold: + 2024-01-01: 0 + amount: + 2024-01-01: 0 # Steps 1-2: no income-based share + - threshold: + 2024-01-01: 1.3801 # > 138% FPG + amount: + 2024-01-01: 0.07 # Step 3: 7% of family income + +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: /1 + period: week + label: New Hampshire CCAP income share rate by FPG ratio + reference: + - title: He-C 6910.18, Table 6910.19 + href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.18 + - title: SR 24-08, Cost Share and Steps (January 2024) + href: https://www.dhhs.nh.gov/sr_htm/html/sr_24-08_dated_01_24.htm + - title: New Hampshire CCDF State Plan 2025-2027, Section 3.2.1 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=42 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml deleted file mode 100644 index d784f027140..00000000000 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_1_fpg_rate.yaml +++ /dev/null @@ -1,13 +0,0 @@ -description: New Hampshire sets this share of the federal poverty guideline as the upper threshold for zero cost share under the Child Care Scholarship Program. -values: - 2024-01-01: 1 - -metadata: - unit: /1 - period: year - label: New Hampshire CCAP step 1 FPG rate threshold - reference: - - title: He-C 6910.18, Table 6910.19 (eff. 4-30-24, #13951) - href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.18 - - title: New Hampshire CCDF State Plan 2025-2027, Section 3.2.1 - href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=42 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml deleted file mode 100644 index f0340f4babb..00000000000 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_amount.yaml +++ /dev/null @@ -1,13 +0,0 @@ -description: New Hampshire provides this amount as the flat weekly cost share under the Child Care Scholarship Program. -values: - 2024-01-01: 5 - -metadata: - unit: currency-USD - period: week - label: New Hampshire CCAP step 2 weekly cost share amount - reference: - - title: He-C 6910.18, Table 6910.19 (eff. 4-30-24, #13951) - href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.18 - - title: New Hampshire CCDF State Plan 2025-2027, Section 3.2.1 - href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=42 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml deleted file mode 100644 index d34ea812152..00000000000 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_2_fpg_rate.yaml +++ /dev/null @@ -1,13 +0,0 @@ -description: New Hampshire sets this share of the federal poverty guideline as the upper threshold for the flat weekly cost share under the Child Care Scholarship Program. -values: - 2024-01-01: 1.38 - -metadata: - unit: /1 - period: year - label: New Hampshire CCAP step 2 FPG rate threshold - reference: - - title: He-C 6910.18, Table 6910.19 (eff. 4-30-24, #13951) - href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.18 - - title: New Hampshire CCDF State Plan 2025-2027, Section 3.2.1 - href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=42 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml deleted file mode 100644 index 2f3a18e8dc1..00000000000 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/step_3_rate.yaml +++ /dev/null @@ -1,13 +0,0 @@ -description: New Hampshire sets this share of family income as the cost share for families above 138% of the federal poverty guideline under the Child Care Scholarship Program. -values: - 2024-01-01: 0.07 - -metadata: - unit: /1 - period: year - label: New Hampshire CCAP step 3 income cost share rate - reference: - - title: He-C 6910.18, Table 6910.19 (eff. 4-30-24, #13951) - href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.18 - - title: New Hampshire CCDF State Plan 2025-2027, Section 3.2.1 - href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=42 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/weekly_flat_amount.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/weekly_flat_amount.yaml new file mode 100644 index 00000000000..18e3834efd2 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/cost_share/weekly_flat_amount.yaml @@ -0,0 +1,29 @@ +description: New Hampshire provides this flat weekly cost share amount by federal poverty guideline ratio under the Child Care Scholarship Program. + +brackets: + - threshold: + 2024-01-01: 0 + amount: + 2024-01-01: 0 # Step 1: <= 100% FPG, $0/week + - threshold: + 2024-01-01: 1.0001 # > 100% FPG + amount: + 2024-01-01: 5 # Step 2: $5/week + - threshold: + 2024-01-01: 1.3801 # > 138% FPG + amount: + 2024-01-01: 0 # Step 3: no flat amount + +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + period: week + label: New Hampshire CCAP weekly flat cost share amount by FPG ratio + reference: + - title: He-C 6910.18, Table 6910.19 + href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.18 + - title: SR 24-08, Cost Share and Steps (January 2024) + href: https://www.dhhs.nh.gov/sr_htm/html/sr_24-08_dated_01_24.htm + - title: New Hampshire CCDF State Plan 2025-2027, Section 3.2.1 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=42 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml index 85398f88a4e..2a657347360 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/child_age_limit.yaml @@ -7,7 +7,7 @@ metadata: period: year label: New Hampshire CCAP child age limit reference: - - title: He-C 6910.07(b)(3) (eff. 4-30-24, #13951) + - title: He-C 6910.07(b)(3) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.07 - - title: New Hampshire CCDF State Plan 2025-2027, Section 2.3.1 - href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=26 + - title: New Hampshire CCDF State Plan 2025-2027, Section 2.2.1 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=19 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml index 391fff72795..3080e13faf8 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/disabled_child_age_limit.yaml @@ -7,7 +7,7 @@ metadata: period: year label: New Hampshire CCAP disabled child age limit reference: - - title: He-C 6910.07(e) (eff. 4-30-24, #13951) + - title: He-C 6910.07(e) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.07 - - title: New Hampshire CCDF State Plan 2025-2027, Section 2.3.1 - href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=26 + - title: New Hampshire CCDF State Plan 2025-2027, Section 2.2.1 + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=19 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml index 6f29d0abdc1..69ead799766 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/eligibility/qualified_immigration_statuses.yaml @@ -11,7 +11,7 @@ metadata: period: year label: New Hampshire CCAP qualified immigration statuses reference: - - title: He-C 6910.09(c)(2) (eff. 4-30-24, #13951) + - title: He-C 6910.09(c)(2) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.09 - - title: New Hampshire CCDF State Plan 2025-2027, Section 2.3.3 + - title: New Hampshire CCDF State Plan 2025-2027, Section 2.2.7 href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=27 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml index 18266ee965b..5512db76d83 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/countable_income/sources.yaml @@ -25,7 +25,7 @@ metadata: period: year label: New Hampshire CCAP countable income sources reference: - - title: He-C 6910.06(b)-(c),(e) (eff. 4-30-24, #13951) + - title: He-C 6910.06(b)-(c),(e) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.06 - title: New Hampshire CCDF State Plan 2025-2027, Section 2.2.4 href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=25 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml index cf8aa7cb5f1..b28e0fb30d6 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/income/income_limit_smi_rate.yaml @@ -7,7 +7,7 @@ metadata: period: year label: New Hampshire CCAP income limit SMI rate reference: - - title: He-C 6910.06(b) (eff. 4-30-24, #13951) + - title: He-C 6910.06(b) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.06 - title: New Hampshire CCDF State Plan 2025-2027, Section 2.2.4 href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=24 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml index ca477997773..ba199aae212 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/disability_supplement/amount.yaml @@ -7,7 +7,7 @@ metadata: breakdown: - nh_ccap_service_level reference: - - title: He-C 6910.17(g) (eff. 4-30-24, #13951) + - title: He-C 6910.17(g) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 - title: New Hampshire CCDF State Plan 2025-2027, Section 4.3.3 href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=55 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_min_age_months.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_min_age_months.yaml new file mode 100644 index 00000000000..ad476b56979 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_min_age_months.yaml @@ -0,0 +1,11 @@ +description: New Hampshire limits license-exempt center payments to children at or above this age in months under the Child Care Scholarship Program. +values: + 2024-01-01: 72 + +metadata: + unit: month + period: year + label: New Hampshire CCAP license-exempt center minimum age in months + reference: + - title: BCDHSC Form 2533, Maximum Weekly Standard Rates (August 2024) + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/bcdhsc-form-2533.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml index eae4ad9b2c7..dca42fec29e 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_center_rate.yaml @@ -7,7 +7,7 @@ metadata: period: year label: New Hampshire CCAP license-exempt center rate factor reference: - - title: He-C 6910.17(d) (eff. 4-30-24, #13951) + - title: He-C 6910.17(d) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 - title: New Hampshire CCDF State Plan 2025-2027, Section 4.3.2 href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=52 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml index 182aebe00ac..15254aa59a6 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/exempt_in_home_rate.yaml @@ -7,7 +7,7 @@ metadata: period: year label: New Hampshire CCAP license-exempt in-home rate factor reference: - - title: He-C 6910.17(c) (eff. 4-30-24, #13951) + - title: He-C 6910.17(c) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 - title: New Hampshire CCDF State Plan 2025-2027, Section 4.3.2 href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=52 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml index 5eaf0dc2e9e..f853101bdc3 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_center.yaml @@ -9,10 +9,10 @@ metadata: - nh_ccap_child_age_category - nh_ccap_service_level reference: - - title: He-C 6910.17(a) (eff. 4-30-24, #13951) + - title: He-C 6910.17(a) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 - - title: CCDF Provider Payment Rates by State (January 2025) - Tables 2-4 - href: https://acf.gov/sites/default/files/documents/occ/CCDF-Provider-Payment-Rates-by-State.pdf#page=6 + - title: BCDHSC Form 2533, Maximum Weekly Standard Rates (August 2024) + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/bcdhsc-form-2533.pdf#page=1 - title: New Hampshire CCDF State Plan 2025-2027, Section 4.3.2, Table 1 href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=53 @@ -20,27 +20,27 @@ INFANT: FULL_TIME: 2024-01-01: 344.42 HALF_TIME: - 2024-01-01: 172.21 + 2024-01-01: 266.65 PART_TIME: - 2024-01-01: 86.11 + 2024-01-01: 133.32 TODDLER: FULL_TIME: - 2024-01-01: 317.36 + 2024-01-01: 317.26 HALF_TIME: - 2024-01-01: 158.68 + 2024-01-01: 245.62 PART_TIME: - 2024-01-01: 79.34 + 2024-01-01: 122.81 PRESCHOOL: FULL_TIME: 2024-01-01: 280 HALF_TIME: - 2024-01-01: 140 + 2024-01-01: 216.78 PART_TIME: - 2024-01-01: 70 + 2024-01-01: 108.39 SCHOOL_AGE: FULL_TIME: 2024-01-01: 236.25 HALF_TIME: - 2024-01-01: 118.13 + 2024-01-01: 182.90 PART_TIME: - 2024-01-01: 59.06 + 2024-01-01: 91.45 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml index 852af1c7597..9efa90a1938 100644 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/payment/rates/licensed_family.yaml @@ -9,10 +9,10 @@ metadata: - nh_ccap_child_age_category - nh_ccap_service_level reference: - - title: He-C 6910.17(b) (eff. 4-30-24, #13951) + - title: He-C 6910.17(b) href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17 - - title: CCDF Provider Payment Rates by State (January 2025) - Tables 2-4 - href: https://acf.gov/sites/default/files/documents/occ/CCDF-Provider-Payment-Rates-by-State.pdf#page=6 + - title: BCDHSC Form 2533, Maximum Weekly Standard Rates (August 2024) + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/bcdhsc-form-2533.pdf#page=1 - title: New Hampshire CCDF State Plan 2025-2027, Section 4.3.2, Table 1 href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=53 @@ -20,27 +20,27 @@ INFANT: FULL_TIME: 2024-01-01: 250 HALF_TIME: - 2024-01-01: 125 + 2024-01-01: 193.55 PART_TIME: - 2024-01-01: 63 + 2024-01-01: 96.78 TODDLER: FULL_TIME: 2024-01-01: 250 HALF_TIME: - 2024-01-01: 125 + 2024-01-01: 193.55 PART_TIME: - 2024-01-01: 63 + 2024-01-01: 96.78 PRESCHOOL: FULL_TIME: 2024-01-01: 250 HALF_TIME: - 2024-01-01: 125 + 2024-01-01: 193.55 PART_TIME: - 2024-01-01: 63 + 2024-01-01: 96.78 SCHOOL_AGE: FULL_TIME: 2024-01-01: 200 HALF_TIME: - 2024-01-01: 100 + 2024-01-01: 154.84 PART_TIME: - 2024-01-01: 50 + 2024-01-01: 77.42 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/authorized_hours.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/authorized_hours.yaml new file mode 100644 index 00000000000..d2056b5bbad --- /dev/null +++ b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/authorized_hours.yaml @@ -0,0 +1,27 @@ +description: New Hampshire sets these authorized activity hour thresholds for child care service levels under the Child Care Scholarship Program. + +brackets: + - threshold: + 2024-01-01: 0 + amount: + 2024-01-01: 2 # PART_TIME + - threshold: + 2024-01-01: 15.0001 # "Greater than 15 hours" + amount: + 2024-01-01: 1 # HALF_TIME + - threshold: + 2024-01-01: 31 # "31 or more hours" + amount: + 2024-01-01: 0 # FULL_TIME + +metadata: + type: single_amount + threshold_unit: hour + amount_unit: /1 + period: year + label: New Hampshire CCAP service level hour thresholds + reference: + - title: He-C 6910.07(o) + href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.07 + - title: BCDHSC Form 2533, Maximum Weekly Standard Rates (August 2024) + href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/bcdhsc-form-2533.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml deleted file mode 100644 index e8a668785e1..00000000000 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/full_time_hours.yaml +++ /dev/null @@ -1,13 +0,0 @@ -description: New Hampshire sets this threshold as the minimum weekly hours for full-time child care under the Child Care Scholarship Program. -values: - 2024-01-01: 30 - -metadata: - unit: /1 - period: year - label: New Hampshire CCAP full-time hours threshold - reference: - - title: He-C 6910.07(o) - href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.07 - - title: New Hampshire CCDF State Plan 2025-2027, Section 2.4.3 - href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=29 diff --git a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml b/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml deleted file mode 100644 index 5eb1eee4812..00000000000 --- a/policyengine_us/parameters/gov/states/nh/dhhs/ccap/service_level/half_time_hours.yaml +++ /dev/null @@ -1,13 +0,0 @@ -description: New Hampshire sets this threshold as the minimum weekly hours for half-time child care under the Child Care Scholarship Program. -values: - 2024-01-01: 15 - -metadata: - unit: /1 - period: year - label: New Hampshire CCAP half-time hours threshold - reference: - - title: He-C 6910.07(o) - href: https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.07 - - title: New Hampshire CCDF State Plan 2025-2027, Section 2.4.3 - href: https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/ccdf-state-plan-2025-2027.pdf#page=29 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_payment_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_payment_rate.yaml index baad74b3eae..8aee63dc2fb 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_payment_rate.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_payment_rate.yaml @@ -1,12 +1,13 @@ # Tests for nh_ccap_payment_rate (Person, MONTH) # Weekly payment rate by provider type, age category, and service level. -# He-C 6910.17(a)-(d) +# He-C 6910.17(a)-(d), BCDHSC Form 2533 (August 2024) # # Provider types and rate basis: -# LICENSED_CENTER: 75th percentile MRS -# LICENSED_FAMILY: 75th percentile MRS +# LICENSED_CENTER: 75th percentile MRS (Form 2533 page 1) +# LICENSED_FAMILY: 75th percentile MRS (Form 2533 page 1) # LICENSE_EXEMPT_IN_HOME: 70% of licensed family rate (He-C 6910.17(c)) -# LICENSE_EXEMPT_CENTER: 50% of licensed center rate (He-C 6910.17(d)) +# LICENSE_EXEMPT_CENTER: 50% of licensed center SCHOOL_AGE rate (Form 2533) +# - No payments for children under 72 months # # NOTE: nh_ccap_payment_rate does NOT include disability supplement. # Disability supplement is added separately in nh_ccap.py. @@ -26,7 +27,7 @@ members: [person1] state_code: NH output: - # Licensed center infant full-time: $344.42/week + # Form 2533: Licensed center, Birth-17, Full Time = $344.42 nh_ccap_payment_rate: 344.42 - name: Case 2, licensed family, toddler, half-time. @@ -44,8 +45,8 @@ members: [person1] state_code: NH output: - # Licensed family toddler half-time: $125/week - nh_ccap_payment_rate: 125 + # Form 2533: Licensed family, 18-35, Half Time = $193.55 + nh_ccap_payment_rate: 193.55 - name: Case 3, licensed center, school age, part-time. period: 2025-01 @@ -62,8 +63,8 @@ members: [person1] state_code: NH output: - # Licensed center school-age part-time: $59.06/week - nh_ccap_payment_rate: 59.06 + # Form 2533: Licensed center, 79-155, Part Time = $91.45 + nh_ccap_payment_rate: 91.45 - name: Case 4, license-exempt in-home, preschool, full-time. period: 2025-01 @@ -83,25 +84,26 @@ # 70% of licensed family preschool full-time ($250) = $175 nh_ccap_payment_rate: 175 -- name: Case 5, license-exempt center, toddler, full-time. +- name: Case 5, license-exempt center, school age, full-time. period: 2025-01 absolute_error_margin: 0.01 input: people: person1: nh_ccap_eligible_child: true - nh_ccap_child_age_category: TODDLER + nh_ccap_child_age_category: SCHOOL_AGE nh_ccap_service_level: FULL_TIME nh_ccap_provider_type: LICENSE_EXEMPT_CENTER + age: 8 households: household: members: [person1] state_code: NH output: - # 50% of licensed center toddler full-time ($317.36) = $158.68 - nh_ccap_payment_rate: 158.68 + # Form 2533: 50% of school-age center FT ($236.25) = $118.13 + nh_ccap_payment_rate: 118.13 -- name: Case 6, licensed center, infant, full-time, disabled child (rate excludes supplement). +- name: Case 6, licensed center, infant, full-time, disabled child. period: 2025-01 absolute_error_margin: 0.01 input: @@ -117,11 +119,10 @@ members: [person1] state_code: NH output: - # Base rate only; disability supplement is in nh_ccap_disability_supplement - # Licensed center infant full-time: $344.42/week + # Base rate only; disability supplement is separate nh_ccap_payment_rate: 344.42 -- name: Case 7, licensed family, preschool, half-time, disabled child (rate excludes supplement). +- name: Case 7, licensed family, preschool, half-time. period: 2025-01 absolute_error_margin: 0.01 input: @@ -131,17 +132,15 @@ nh_ccap_child_age_category: PRESCHOOL nh_ccap_service_level: HALF_TIME nh_ccap_provider_type: LICENSED_FAMILY - is_disabled: true households: household: members: [person1] state_code: NH output: - # Base rate only; disability supplement is in nh_ccap_disability_supplement - # Licensed family preschool half-time: $125/week - nh_ccap_payment_rate: 125 + # Form 2533: Licensed family, 36-78, Half Time = $193.55 + nh_ccap_payment_rate: 193.55 -- name: Case 8, license-exempt in-home, school age, part-time, disabled child (rate excludes supplement). +- name: Case 8, license-exempt in-home, school age, part-time. period: 2025-01 absolute_error_margin: 0.01 input: @@ -151,14 +150,13 @@ nh_ccap_child_age_category: SCHOOL_AGE nh_ccap_service_level: PART_TIME nh_ccap_provider_type: LICENSE_EXEMPT_IN_HOME - is_disabled: true households: household: members: [person1] state_code: NH output: - # 70% of licensed family school-age part-time ($50) = $35 - nh_ccap_payment_rate: 35 + # 70% of licensed family school-age part-time ($77.42) = $54.19 + nh_ccap_payment_rate: 54.19 - name: Case 9, licensed family, infant, full-time. period: 2025-01 @@ -175,7 +173,7 @@ members: [person1] state_code: NH output: - # Licensed family infant full-time: $250/week + # Form 2533: Licensed family, Birth-17, Full Time = $250 nh_ccap_payment_rate: 250 - name: Case 10, license-exempt in-home, infant, full-time. @@ -196,23 +194,26 @@ # 70% of licensed family infant full-time ($250) = $175 nh_ccap_payment_rate: 175 -- name: Case 11, license-exempt center, infant, full-time. +- name: Case 11, license-exempt center, child under 72 months, zero rate. period: 2025-01 absolute_error_margin: 0.01 input: people: person1: nh_ccap_eligible_child: true - nh_ccap_child_age_category: INFANT + nh_ccap_child_age_category: PRESCHOOL nh_ccap_service_level: FULL_TIME nh_ccap_provider_type: LICENSE_EXEMPT_CENTER + age: 4 households: household: members: [person1] state_code: NH output: - # 50% of licensed center infant full-time ($344.42) = $172.21 - nh_ccap_payment_rate: 172.21 + # Form 2533: "Payments CANNOT be made to a License-Exempt Center + # for children under age 72 months" + # Age 4 = 48 months < 72 → $0 + nh_ccap_payment_rate: 0 - name: Case 12, licensed center, school age, half-time. period: 2025-01 @@ -229,10 +230,10 @@ members: [person1] state_code: NH output: - # Licensed center school-age half-time: $118.13/week - nh_ccap_payment_rate: 118.13 + # Form 2533: Licensed center, 79-155, Half Time = $182.90 + nh_ccap_payment_rate: 182.90 -- name: Case 13, license-exempt center, school age, part-time. +- name: Case 13, license-exempt center, school age, half-time. period: 2025-01 absolute_error_margin: 0.01 input: @@ -240,12 +241,49 @@ person1: nh_ccap_eligible_child: true nh_ccap_child_age_category: SCHOOL_AGE - nh_ccap_service_level: PART_TIME + nh_ccap_service_level: HALF_TIME nh_ccap_provider_type: LICENSE_EXEMPT_CENTER + age: 8 + households: + household: + members: [person1] + state_code: NH + output: + # Form 2533: 50% of school-age center HT ($182.90) = $91.45 + nh_ccap_payment_rate: 91.45 + +- name: Case 14, licensed center, toddler, full-time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + nh_ccap_eligible_child: true + nh_ccap_child_age_category: TODDLER + nh_ccap_service_level: FULL_TIME + nh_ccap_provider_type: LICENSED_CENTER + households: + household: + members: [person1] + state_code: NH + output: + # Form 2533: Licensed center, 18-35, Full Time = $317.26 + nh_ccap_payment_rate: 317.26 + +- name: Case 15, licensed center, preschool, half-time. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + nh_ccap_eligible_child: true + nh_ccap_child_age_category: PRESCHOOL + nh_ccap_service_level: HALF_TIME + nh_ccap_provider_type: LICENSED_CENTER households: household: members: [person1] state_code: NH output: - # 50% of licensed center school-age part-time ($59.06) = $29.53 - nh_ccap_payment_rate: 29.53 + # Form 2533: Licensed center, 36-78, Half Time = $216.78 + nh_ccap_payment_rate: 216.78 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_service_level.yaml b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_service_level.yaml index a5fb17bdc60..bc64743190d 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_service_level.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nh/dhhs/ccap/nh_ccap_service_level.yaml @@ -1,171 +1,222 @@ # Tests for nh_ccap_service_level (Person, MONTH) -# Service level based on childcare hours per week. -# He-C 6910.03(y), He-C 6910.07(p) -# Full-time: > 30 hours/week (He-C 6910.03(y): "greater than 30 hours per week") -# Half-time: > 15 and <= 30 hours/week (He-C 6910.03(aa)) -# Part-time: <= 15 hours/week +# Service level based on parent's authorized activity hours per week. +# He-C 6910.07(o),(p), BCDHSC Form 2533 +# Full-time: 31 or more hours/week +# Half-time: Greater than 15 but less than or equal to 30 hours/week +# Part-time: 1 to 15 hours/week +# He-C 6910.07(p): two-parent households use the lowest hours -- name: Case 1, 40 hours per week, full-time. +- name: Case 1, single parent 40 hours, full-time. period: 2025-01 input: people: person1: - childcare_hours_per_week: 40 + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 40 + person2: + age: 4 + is_tax_unit_head_or_spouse: false + spm_units: + spm_unit: + members: [person1, person2] households: household: - members: [person1] + members: [person1, person2] state_code: NH output: - nh_ccap_service_level: FULL_TIME + nh_ccap_service_level: [FULL_TIME, FULL_TIME] -- name: Case 2, 31 hours per week, full-time. +- name: Case 2, single parent 31 hours, full-time boundary. period: 2025-01 input: people: person1: - childcare_hours_per_week: 31 + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 31 + person2: + age: 4 + is_tax_unit_head_or_spouse: false + spm_units: + spm_unit: + members: [person1, person2] households: household: - members: [person1] + members: [person1, person2] state_code: NH output: - nh_ccap_service_level: FULL_TIME + nh_ccap_service_level: [FULL_TIME, FULL_TIME] -- name: Case 3, 30 hours per week, half-time (boundary). +- name: Case 3, single parent 30 hours, half-time boundary. period: 2025-01 input: people: person1: - childcare_hours_per_week: 30 + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 30 + person2: + age: 4 + is_tax_unit_head_or_spouse: false + spm_units: + spm_unit: + members: [person1, person2] households: household: - members: [person1] + members: [person1, person2] state_code: NH output: - # He-C 6910.03(y): full-time is "greater than 30 hours" → 30 is NOT full-time - nh_ccap_service_level: HALF_TIME + # 30 is not >= 31, so not full-time. 30 > 15 → half-time + nh_ccap_service_level: [HALF_TIME, HALF_TIME] -- name: Case 4, 20 hours per week, half-time. +- name: Case 4, single parent 20 hours, half-time. period: 2025-01 input: people: person1: - childcare_hours_per_week: 20 + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 20 + person2: + age: 4 + is_tax_unit_head_or_spouse: false + spm_units: + spm_unit: + members: [person1, person2] households: household: - members: [person1] + members: [person1, person2] state_code: NH output: - nh_ccap_service_level: HALF_TIME + nh_ccap_service_level: [HALF_TIME, HALF_TIME] -- name: Case 5, 15 hours per week, part-time (boundary). +- name: Case 5, single parent 15 hours, part-time boundary. period: 2025-01 input: people: person1: - childcare_hours_per_week: 15 + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 15 + person2: + age: 4 + is_tax_unit_head_or_spouse: false + spm_units: + spm_unit: + members: [person1, person2] households: household: - members: [person1] + members: [person1, person2] state_code: NH output: - # He-C 6910.03(aa): half-time is "greater than 15" → 15 is NOT half-time - nh_ccap_service_level: PART_TIME + # 15 is not > 15 → part-time + nh_ccap_service_level: [PART_TIME, PART_TIME] -- name: Case 6, 10 hours per week, part-time. +- name: Case 6, single parent 16 hours, half-time boundary. period: 2025-01 input: people: person1: - childcare_hours_per_week: 10 + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 16 + person2: + age: 4 + is_tax_unit_head_or_spouse: false + spm_units: + spm_unit: + members: [person1, person2] households: household: - members: [person1] + members: [person1, person2] state_code: NH output: - nh_ccap_service_level: PART_TIME + # 16 > 15 → half-time + nh_ccap_service_level: [HALF_TIME, HALF_TIME] -- name: Case 7, 16 hours per week, half-time. +- name: Case 7, single parent 10 hours, part-time. period: 2025-01 input: people: person1: - childcare_hours_per_week: 16 + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 10 + person2: + age: 4 + is_tax_unit_head_or_spouse: false + spm_units: + spm_unit: + members: [person1, person2] households: household: - members: [person1] + members: [person1, person2] state_code: NH output: - nh_ccap_service_level: HALF_TIME + nh_ccap_service_level: [PART_TIME, PART_TIME] -# --- Edge Cases: Exact boundary hours --- - -- name: Case 8, exactly 15 hours per week, part-time boundary. - period: 2025-01 - input: - people: - person1: - childcare_hours_per_week: 15 - households: - household: - members: [person1] - state_code: NH - output: - # half_time_hours = 15, hours > 15 → false → default PART_TIME - nh_ccap_service_level: PART_TIME - -- name: Case 9, exactly 30 hours per week, half-time boundary. - period: 2025-01 - input: - people: - person1: - childcare_hours_per_week: 30 - households: - household: - members: [person1] - state_code: NH - output: - # full_time_hours = 30, hours > 30 → false, hours > 15 → true → HALF_TIME - nh_ccap_service_level: HALF_TIME - -- name: Case 10, zero hours per week, part-time. +- name: Case 8, two parents 40 and 20 hours, half-time (uses lower). period: 2025-01 input: people: person1: - childcare_hours_per_week: 0 + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 40 + person2: + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 20 + person3: + age: 4 + is_tax_unit_head_or_spouse: false + spm_units: + spm_unit: + members: [person1, person2, person3] households: household: - members: [person1] + members: [person1, person2, person3] state_code: NH output: - # 0 > 30 → false, 0 > 15 → false → default PART_TIME - nh_ccap_service_level: PART_TIME + # He-C 6910.07(p): min(40, 20) = 20 → half-time + nh_ccap_service_level: [HALF_TIME, HALF_TIME, HALF_TIME] -- name: Case 11, 14 hours per week, part-time. +- name: Case 9, two parents both 35 hours, full-time. period: 2025-01 input: people: person1: - childcare_hours_per_week: 14 + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 35 + person2: + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 35 + person3: + age: 4 + is_tax_unit_head_or_spouse: false + spm_units: + spm_unit: + members: [person1, person2, person3] households: household: - members: [person1] + members: [person1, person2, person3] state_code: NH output: - # 14 > 30 → false, 14 > 15 → false → default PART_TIME - nh_ccap_service_level: PART_TIME + # min(35, 35) = 35 >= 31 → full-time + nh_ccap_service_level: [FULL_TIME, FULL_TIME, FULL_TIME] -- name: Case 12, 29 hours per week, half-time. +- name: Case 10, two parents 40 and 10 hours, part-time (uses lower). period: 2025-01 input: people: person1: - childcare_hours_per_week: 29 + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 40 + person2: + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 10 + person3: + age: 4 + is_tax_unit_head_or_spouse: false + spm_units: + spm_unit: + members: [person1, person2, person3] households: household: - members: [person1] + members: [person1, person2, person3] state_code: NH output: - # 29 > 30 → false, 29 > 15 → true → HALF_TIME - nh_ccap_service_level: HALF_TIME + # He-C 6910.07(p): min(40, 10) = 10 → part-time + nh_ccap_service_level: [PART_TIME, PART_TIME, PART_TIME] diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap.py index 764e9143d2f..d5f83fd5308 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap.py @@ -14,17 +14,15 @@ def formula(spm_unit, period, parameters): person = spm_unit.members weeks_per_month = WEEKS_IN_YEAR / MONTHS_IN_YEAR - # Per-child weekly rate (includes disability supplement) weekly_rate = person("nh_ccap_payment_rate", period) disability_supplement = person("nh_ccap_disability_supplement", period) - total_weekly_rate = weekly_rate + disability_supplement # Per-child pre-subsidy weekly expense annual_expense = person("pre_subsidy_childcare_expenses", period.this_year) weekly_expense = annual_expense / WEEKS_IN_YEAR - # He-C 6910.17(e): payment = min(charge, rate) - cost share - capped_rate = min_(weekly_expense, total_weekly_rate) + # He-C 6910.17(e): payment = min(charge, WSR) - cost share + capped_rate = min_(weekly_expense, weekly_rate) # He-C 6910.18(f): cost share divided equally among eligible children is_eligible_child = person("nh_ccap_eligible_child", period) @@ -35,7 +33,9 @@ def formula(spm_unit, period, parameters): per_child_cost_share[mask] = family_cost_share[mask] / n_eligible_children[mask] per_child_cost_share_broadcast = spm_unit.project(per_child_cost_share) - per_child_weekly_payment = max_(capped_rate - per_child_cost_share_broadcast, 0) + # He-C 6910.17(g): disability supplement is additional, outside the min + base_payment = max_(capped_rate - per_child_cost_share_broadcast, 0) + per_child_weekly_payment = base_payment + disability_supplement per_child_monthly_payment = ( per_child_weekly_payment * weeks_per_month * is_eligible_child ) diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_authorized_activity_hours.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_authorized_activity_hours.py new file mode 100644 index 00000000000..866d59e427d --- /dev/null +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_authorized_activity_hours.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class nh_ccap_authorized_activity_hours(Variable): + value_type = float + entity = SPMUnit + definition_period = MONTH + defined_for = StateCode.NH + label = "New Hampshire CCAP authorized activity hours per week" + reference = "https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.07" + + def formula(spm_unit, period, parameters): + person = spm_unit.members + is_head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) + hours = person("weekly_hours_worked", period.this_year) + # He-C 6910.07(p): for two-parent households, use the lowest hours + head_spouse_hours = where(is_head_or_spouse, hours, np.inf) + return spm_unit.min(head_spouse_hours) diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_cost_share.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_cost_share.py index e4fc7b2e1d7..15917dc24a6 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_cost_share.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_cost_share.py @@ -8,7 +8,10 @@ class nh_ccap_cost_share(Variable): label = "New Hampshire Child Care Scholarship Program weekly family cost share" definition_period = MONTH defined_for = StateCode.NH - reference = "https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.18" + reference = ( + "https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.18", + "https://www.dhhs.nh.gov/sr_htm/html/sr_24-08_dated_01_24.htm", + ) def formula(spm_unit, period, parameters): p = parameters(period).gov.states.nh.dhhs.ccap.cost_share @@ -16,19 +19,8 @@ def formula(spm_unit, period, parameters): fpg = spm_unit("spm_unit_fpg", period) weeks_per_month = WEEKS_IN_YEAR / MONTHS_IN_YEAR - # He-C 6910.18, Table 6910.19: stepped cost share - step_1_threshold = fpg * p.step_1_fpg_rate - step_2_threshold = fpg * p.step_2_fpg_rate - - step_3_weekly = countable_income * p.step_3_rate / weeks_per_month - return select( - [ - countable_income <= step_1_threshold, - countable_income <= step_2_threshold, - ], - [ - 0, - p.step_2_amount, - ], - default=step_3_weekly, + fpg_ratio = where(fpg > 0, countable_income / fpg, 0) + income_based_share = ( + countable_income * p.income_share_rate.calc(fpg_ratio) / weeks_per_month ) + return p.weekly_flat_amount.calc(fpg_ratio) + income_based_share diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_service_level.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_service_level.py index 1ab5a35d6b3..43be726b37a 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_service_level.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/nh_ccap_service_level.py @@ -15,20 +15,12 @@ class nh_ccap_service_level(Variable): definition_period = MONTH defined_for = StateCode.NH label = "New Hampshire Child Care Scholarship Program service level" - reference = "https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.07" + reference = ( + "https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.07", + "https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/bcdhsc-form-2533.pdf#page=2", + ) def formula(person, period, parameters): p = parameters(period).gov.states.nh.dhhs.ccap.service_level - hours = person("childcare_hours_per_week", period.this_year) - - return select( - [ - hours > p.full_time_hours, - hours > p.half_time_hours, - ], - [ - NHCCAPServiceLevel.FULL_TIME, - NHCCAPServiceLevel.HALF_TIME, - ], - default=NHCCAPServiceLevel.PART_TIME, - ) + authorized_hours = person.spm_unit("nh_ccap_authorized_activity_hours", period) + return p.authorized_hours.calc(authorized_hours) diff --git a/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_payment_rate.py b/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_payment_rate.py index db76887ab97..d6a60f69e30 100644 --- a/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_payment_rate.py +++ b/policyengine_us/variables/gov/states/nh/dhhs/ccap/payment/nh_ccap_payment_rate.py @@ -1,4 +1,7 @@ from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.nh.dhhs.ccap.nh_ccap_child_age_category import ( + NHCCAPChildAgeCategory, +) from policyengine_us.variables.gov.states.nh.dhhs.ccap.nh_ccap_provider_type import ( NHCCAPProviderType, ) @@ -11,20 +14,29 @@ class nh_ccap_payment_rate(Variable): label = "New Hampshire Child Care Scholarship Program weekly payment rate" definition_period = MONTH defined_for = "nh_ccap_eligible_child" - reference = "https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17" + reference = ( + "https://www.law.cornell.edu/regulations/new-hampshire/N-H-Admin-Code-SS-He-C-6910.17", + "https://www.dhhs.nh.gov/sites/g/files/ehbemt476/files/documents2/bcdhsc-form-2533.pdf#page=1", + ) def formula(person, period, parameters): p = parameters(period).gov.states.nh.dhhs.ccap.payment provider_type = person("nh_ccap_provider_type", period) age_category = person("nh_ccap_child_age_category", period) service_level = person("nh_ccap_service_level", period) + age_months = person("age", period.this_year) * MONTHS_IN_YEAR licensed_center_rate = p.rates.licensed_center[age_category][service_level] licensed_family_rate = p.rates.licensed_family[age_category][service_level] - # He-C 6910.17(c): exempt in-home = 70% of licensed family rate exempt_in_home_rate = licensed_family_rate * p.exempt_in_home_rate - # He-C 6910.17(d): exempt center = 50% of licensed center rate - exempt_center_rate = licensed_center_rate * p.exempt_center_rate + # Form 2533: exempt center uses school-age center rate as base + school_age_center_rate = p.rates.licensed_center.SCHOOL_AGE[service_level] + # Form 2533: no payments for exempt center children under minimum age + exempt_center_rate = where( + age_months >= p.exempt_center_min_age_months, + school_age_center_rate * p.exempt_center_rate, + 0, + ) return select( [