From aa95ea7bd7af3b3ec2618a43000220f08331a4cd Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 19 Mar 2026 12:29:35 -0400 Subject: [PATCH 1/7] Initial commit for NJ CCAP From 54f534b82994b69657c9245b3c680a2f95a2f396 Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 19 Mar 2026 13:49:13 -0400 Subject: [PATCH 2/7] Implement New Jersey CCAP (Child Care Assistance Program) Adds eligibility, copay, and provider rate calculations for NJ CCAP per N.J.A.C. 10:15, CC-229, CC-230, CC-236, and CCDF State Plan. Closes #7810 Co-Authored-By: Claude Opus 4.6 (1M context) --- .../hhs/ccdf/child_care_subsidy_programs.yaml | 1 + .../activity_requirements/weekly_hours.yaml | 13 + .../nj/njdhs/ccap/age_group/months.yaml | 28 + .../nj/njdhs/ccap/age_threshold/child.yaml | 11 + .../ccap/age_threshold/special_needs.yaml | 11 + .../njdhs/ccap/copay/first_child_ft_rate.yaml | 24 + .../njdhs/ccap/copay/first_child_pt_rate.yaml | 24 + .../states/nj/njdhs/ccap/copay/max_rate.yaml | 11 + .../ccap/copay/second_child_ft_rate.yaml | 24 + .../ccap/copay/second_child_pt_rate.yaml | 24 + .../ccap/income/countable_income/sources.yaml | 29 + .../fpl_rate/continuing_eligibility.yaml | 13 + .../income/fpl_rate/initial_eligibility.yaml | 13 + .../njdhs/ccap/income/fpl_rate/smi_exit.yaml | 13 + .../nj/njdhs/ccap/rates/aca_summer_camp.yaml | 47 + .../nj/njdhs/ccap/rates/approved_home.yaml | 47 + .../nj/njdhs/ccap/rates/licensed_center.yaml | 152 +++ .../njdhs/ccap/rates/registered_family.yaml | 152 +++ .../ccap/time_authorization/thresholds.yaml | 22 + .../gov/states/nj/njdhs/ccap/edge_cases.yaml | 1025 +++++++++++++++++ .../gov/states/nj/njdhs/ccap/integration.yaml | 387 +++++++ .../gov/states/nj/njdhs/ccap/nj_ccap.yaml | 211 ++++ .../nj/njdhs/ccap/nj_ccap_age_group.yaml | 161 +++ .../states/nj/njdhs/ccap/nj_ccap_copay.yaml | 406 +++++++ .../njdhs/ccap/nj_ccap_countable_income.yaml | 113 ++ .../nj/njdhs/ccap/nj_ccap_eligible.yaml | 165 +++ .../nj/njdhs/ccap/nj_ccap_eligible_child.yaml | 156 +++ .../njdhs/ccap/nj_ccap_income_eligible.yaml | 190 +++ .../ccap/nj_ccap_maximum_weekly_benefit.yaml | 275 +++++ .../nj/njdhs/ccap/nj_ccap_time_category.yaml | 83 ++ .../nj/njdhs/ccap/copay/nj_ccap_copay.py | 53 + .../eligibility/nj_ccap_activity_eligible.py | 23 + .../ccap/eligibility/nj_ccap_eligible.py | 20 + .../eligibility/nj_ccap_eligible_child.py | 24 + .../eligibility/nj_ccap_income_eligible.py | 24 + .../gov/states/nj/njdhs/ccap/nj_ccap.py | 28 + .../states/nj/njdhs/ccap/nj_ccap_age_group.py | 35 + .../nj/njdhs/ccap/nj_ccap_countable_income.py | 13 + .../states/nj/njdhs/ccap/nj_ccap_enrolled.py | 9 + .../njdhs/ccap/nj_ccap_grow_nj_kids_rating.py | 19 + .../ccap/nj_ccap_maximum_weekly_benefit.py | 42 + .../nj/njdhs/ccap/nj_ccap_provider_type.py | 19 + .../gov/states/nj/njdhs/ccap/nj_ccap_smi.py | 28 + .../nj/njdhs/ccap/nj_ccap_time_category.py | 22 + .../nj/njdhs/nj_child_care_subsidies.py | 11 + sources/working_references.md | 658 +++++++++++ 46 files changed, 4859 insertions(+) create mode 100644 policyengine_us/parameters/gov/states/nj/njdhs/ccap/activity_requirements/weekly_hours.yaml create mode 100644 policyengine_us/parameters/gov/states/nj/njdhs/ccap/age_group/months.yaml create mode 100644 policyengine_us/parameters/gov/states/nj/njdhs/ccap/age_threshold/child.yaml create mode 100644 policyengine_us/parameters/gov/states/nj/njdhs/ccap/age_threshold/special_needs.yaml create mode 100644 policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/first_child_ft_rate.yaml create mode 100644 policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/first_child_pt_rate.yaml create mode 100644 policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/max_rate.yaml create mode 100644 policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/second_child_ft_rate.yaml create mode 100644 policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/second_child_pt_rate.yaml create mode 100644 policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/countable_income/sources.yaml create mode 100644 policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/fpl_rate/continuing_eligibility.yaml create mode 100644 policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/fpl_rate/initial_eligibility.yaml create mode 100644 policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/fpl_rate/smi_exit.yaml create mode 100644 policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/aca_summer_camp.yaml create mode 100644 policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/approved_home.yaml create mode 100644 policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/licensed_center.yaml create mode 100644 policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/registered_family.yaml create mode 100644 policyengine_us/parameters/gov/states/nj/njdhs/ccap/time_authorization/thresholds.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/edge_cases.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/integration.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_age_group.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_copay.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_countable_income.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_eligible_child.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_income_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_maximum_weekly_benefit.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_time_category.yaml create mode 100644 policyengine_us/variables/gov/states/nj/njdhs/ccap/copay/nj_ccap_copay.py create mode 100644 policyengine_us/variables/gov/states/nj/njdhs/ccap/eligibility/nj_ccap_activity_eligible.py create mode 100644 policyengine_us/variables/gov/states/nj/njdhs/ccap/eligibility/nj_ccap_eligible.py create mode 100644 policyengine_us/variables/gov/states/nj/njdhs/ccap/eligibility/nj_ccap_eligible_child.py create mode 100644 policyengine_us/variables/gov/states/nj/njdhs/ccap/eligibility/nj_ccap_income_eligible.py create mode 100644 policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap.py create mode 100644 policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_age_group.py create mode 100644 policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_countable_income.py create mode 100644 policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_enrolled.py create mode 100644 policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_grow_nj_kids_rating.py create mode 100644 policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_maximum_weekly_benefit.py create mode 100644 policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_provider_type.py create mode 100644 policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_smi.py create mode 100644 policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_time_category.py create mode 100644 policyengine_us/variables/gov/states/nj/njdhs/nj_child_care_subsidies.py create mode 100644 sources/working_references.md 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 05d4633fc56..93501d22232 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 @@ -6,6 +6,7 @@ values: - ma_child_care_subsidies # Massachusetts Child Care Financial Assistance - me_child_care_subsidies # Maine Child Care Affordability Program - ne_child_care_subsidies # Nebraska Child Care Subsidy + - nj_child_care_subsidies # New Jersey Child Care Assistance Program - ri_child_care_subsidies # Rhode Island Child Care Assistance Program metadata: diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/activity_requirements/weekly_hours.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/activity_requirements/weekly_hours.yaml new file mode 100644 index 00000000000..14cc29d91ad --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/activity_requirements/weekly_hours.yaml @@ -0,0 +1,13 @@ +description: New Jersey sets this amount as the minimum weekly hours of approved activity under the Child Care Assistance Program. +values: + 2024-01-01: 30 + +metadata: + unit: hour + period: year + label: New Jersey CCAP minimum weekly activity hours + reference: + - title: N.J.A.C. 10:15-5.2 + href: https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-15-5-2 + - title: CCDF State Plan for NJ FFY 2025-2027, Section 2.2 + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=14 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/age_group/months.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/age_group/months.yaml new file mode 100644 index 00000000000..93015298e06 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/age_group/months.yaml @@ -0,0 +1,28 @@ +description: New Jersey sets these age group boundaries in months under the Child Care Assistance Program. +metadata: + type: single_amount + threshold_unit: month + amount_unit: /1 + period: year + label: New Jersey CCAP age group by age in months + reference: + - title: CC-230 Maximum Child Care Payment Rates + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Max_CC_Payment_Rates.pdf#page=1 + +brackets: + - threshold: + 2024-01-01: 0 + amount: + 2024-01-01: 0 + - threshold: + 2024-01-01: 18 + amount: + 2024-01-01: 1 + - threshold: + 2024-01-01: 30 + amount: + 2024-01-01: 2 + - threshold: + 2024-01-01: 60 + amount: + 2024-01-01: 3 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/age_threshold/child.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/age_threshold/child.yaml new file mode 100644 index 00000000000..0ab7daf3c3f --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/age_threshold/child.yaml @@ -0,0 +1,11 @@ +description: New Jersey limits the Child Care Assistance Program to children younger than this age. +values: + 2024-01-01: 13 + +metadata: + unit: year + period: year + label: New Jersey CCAP child age threshold + reference: + - title: N.J.A.C. 10:15-5.2 + href: https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-15-5-2 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/age_threshold/special_needs.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/age_threshold/special_needs.yaml new file mode 100644 index 00000000000..307ebd32c63 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/age_threshold/special_needs.yaml @@ -0,0 +1,11 @@ +description: New Jersey limits the Child Care Assistance Program to children with special needs younger than this age. +values: + 2024-01-01: 19 + +metadata: + unit: year + period: year + label: New Jersey CCAP special needs child age threshold + reference: + - title: N.J.A.C. 10:15-5.2 + href: https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-15-5-2 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/first_child_ft_rate.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/first_child_ft_rate.yaml new file mode 100644 index 00000000000..0becaacffc5 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/first_child_ft_rate.yaml @@ -0,0 +1,24 @@ +description: New Jersey sets this copayment percentage for the first child in full-time care under the Child Care Assistance Program. +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: /1 + period: year + label: New Jersey CCAP first child full-time copayment rate by FPL ratio + reference: + - title: CC-236 Copayment Schedule + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Copayment_Schedule.pdf#page=1 + +brackets: + - threshold: + 2024-01-01: 0 + amount: + 2024-01-01: 0 + - threshold: + 2024-01-01: 1.0001 + amount: + 2024-01-01: 0.04 + - threshold: + 2024-01-01: 2.0001 + amount: + 2024-01-01: 0.05 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/first_child_pt_rate.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/first_child_pt_rate.yaml new file mode 100644 index 00000000000..3e3f239b1de --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/first_child_pt_rate.yaml @@ -0,0 +1,24 @@ +description: New Jersey sets this copayment percentage for the first child in part-time care under the Child Care Assistance Program. +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: /1 + period: year + label: New Jersey CCAP first child part-time copayment rate by FPL ratio + reference: + - title: CC-236 Copayment Schedule + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Copayment_Schedule.pdf#page=1 + +brackets: + - threshold: + 2024-01-01: 0 + amount: + 2024-01-01: 0 + - threshold: + 2024-01-01: 1.0001 + amount: + 2024-01-01: 0.02 + - threshold: + 2024-01-01: 2.0001 + amount: + 2024-01-01: 0.025 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/max_rate.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/max_rate.yaml new file mode 100644 index 00000000000..3f1c5878b03 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/max_rate.yaml @@ -0,0 +1,11 @@ +description: New Jersey limits copayment to this share of gross income under the Child Care Assistance Program. +values: + 2024-01-01: 0.05 + +metadata: + unit: /1 + period: year + label: New Jersey CCAP maximum copayment rate + reference: + - title: CCDF State Plan for NJ FFY 2025-2027, Section 3.1 + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=40 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/second_child_ft_rate.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/second_child_ft_rate.yaml new file mode 100644 index 00000000000..a03d63882f2 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/second_child_ft_rate.yaml @@ -0,0 +1,24 @@ +description: New Jersey sets this additional copayment percentage for the second child in full-time care under the Child Care Assistance Program. +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: /1 + period: year + label: New Jersey CCAP second child full-time copayment rate by FPL ratio + reference: + - title: CC-236 Copayment Schedule + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Copayment_Schedule.pdf#page=1 + +brackets: + - threshold: + 2024-01-01: 0 + amount: + 2024-01-01: 0 + - threshold: + 2024-01-01: 1.0001 + amount: + 2024-01-01: 0.02 + - threshold: + 2024-01-01: 2.0001 + amount: + 2024-01-01: 0.02 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/second_child_pt_rate.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/second_child_pt_rate.yaml new file mode 100644 index 00000000000..cb631dfcdeb --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/second_child_pt_rate.yaml @@ -0,0 +1,24 @@ +description: New Jersey sets this additional copayment percentage for the second child in part-time care under the Child Care Assistance Program. +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: /1 + period: year + label: New Jersey CCAP second child part-time copayment rate by FPL ratio + reference: + - title: CC-236 Copayment Schedule + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Copayment_Schedule.pdf#page=1 + +brackets: + - threshold: + 2024-01-01: 0 + amount: + 2024-01-01: 0 + - threshold: + 2024-01-01: 1.0001 + amount: + 2024-01-01: 0.01 + - threshold: + 2024-01-01: 2.0001 + amount: + 2024-01-01: 0.01 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/countable_income/sources.yaml new file mode 100644 index 00000000000..c3cb3795803 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/countable_income/sources.yaml @@ -0,0 +1,29 @@ +description: New Jersey counts these income sources under the Child Care Assistance Program. +values: + 2024-01-01: + - employment_income + - self_employment_income + - social_security_retirement + - social_security_disability + - social_security_survivors + - ssi + - dividend_income + - interest_income + - rental_income + - pension_income + - unemployment_compensation + - workers_compensation + - alimony_income + - child_support_received + # The following are counted per CCDF State Plan 2.2.4c but have no matching variables: + # - inheritance + # - any other source required for federal/state tax reporting + # Excluded: TANF cash benefits (WFNJ) + +metadata: + unit: list + period: year + label: New Jersey CCAP countable income sources + reference: + - title: CCDF State Plan for NJ FFY 2025-2027, Section 2.2.4c + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=23 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/fpl_rate/continuing_eligibility.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/fpl_rate/continuing_eligibility.yaml new file mode 100644 index 00000000000..ce3cbefd1b5 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/fpl_rate/continuing_eligibility.yaml @@ -0,0 +1,13 @@ +description: New Jersey limits the Child Care Assistance Program to enrolled families with income at or below this share of the federal poverty level at redetermination. +values: + 2024-01-01: 2.5 + +metadata: + unit: /1 + period: year + label: New Jersey CCAP continuing eligibility FPL rate + reference: + - title: CC-229 Income Eligibility Schedule, Tier E (250% FPL) + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Income_Eligibility_Schedule.pdf + - title: CCDF State Plan for NJ FFY 2025-2027, Section 2.5 + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=34 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/fpl_rate/initial_eligibility.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/fpl_rate/initial_eligibility.yaml new file mode 100644 index 00000000000..a5a770ed70a --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/fpl_rate/initial_eligibility.yaml @@ -0,0 +1,13 @@ +description: New Jersey limits the Child Care Assistance Program to new applicants with income at or below this share of the federal poverty level. +values: + 2024-01-01: 2 + +metadata: + unit: /1 + period: year + label: New Jersey CCAP initial eligibility FPL rate + reference: + - title: CC-229 Income Eligibility Schedule, Tier D (200% FPL) + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Income_Eligibility_Schedule.pdf + - title: CCDF State Plan for NJ FFY 2025-2027, Section 2.2.4 + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=23 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/fpl_rate/smi_exit.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/fpl_rate/smi_exit.yaml new file mode 100644 index 00000000000..c9a7ea8e711 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/fpl_rate/smi_exit.yaml @@ -0,0 +1,13 @@ +description: New Jersey sets this share of State Median Income as the exit threshold under the Child Care Assistance Program. +values: + 2024-01-01: 0.85 + +metadata: + unit: /1 + period: year + label: New Jersey CCAP SMI exit threshold rate + reference: + - title: CC-229 Income Eligibility Schedule, 85% NJ SMI column + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Income_Eligibility_Schedule.pdf + - title: CCDF State Plan for NJ FFY 2025-2027, Section 2.5 + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=34 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/aca_summer_camp.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/aca_summer_camp.yaml new file mode 100644 index 00000000000..fd8f58abbe8 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/aca_summer_camp.yaml @@ -0,0 +1,47 @@ +description: New Jersey provides these weekly reimbursement rates for ACA summer youth camps under the Child Care Assistance Program. +metadata: + period: week + unit: currency-USD + label: New Jersey CCAP ACA summer camp weekly rates + breakdown: + - nj_ccap_time_category + - nj_ccap_age_group + reference: + - title: CC-230 Maximum Child Care Payment Rates, ACA Summer Youth Camps + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Max_CC_Payment_Rates.pdf#page=4 + +FULL_TIME: + INFANT: + 2025-03-01: 0 + INFANT_SN: + 2025-03-01: 0 + TODDLER: + 2025-03-01: 0 + TODDLER_SN: + 2025-03-01: 0 + PRESCHOOL: + 2025-03-01: 0 + PRESCHOOL_SN: + 2025-03-01: 0 + SCHOOL_AGE: + 2025-03-01: 288.70 + SCHOOL_AGE_SN: + 2025-03-01: 366.65 + +PART_TIME: + INFANT: + 2025-03-01: 0 + INFANT_SN: + 2025-03-01: 0 + TODDLER: + 2025-03-01: 0 + TODDLER_SN: + 2025-03-01: 0 + PRESCHOOL: + 2025-03-01: 0 + PRESCHOOL_SN: + 2025-03-01: 0 + SCHOOL_AGE: + 2025-03-01: 144.35 + SCHOOL_AGE_SN: + 2025-03-01: 183.33 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/approved_home.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/approved_home.yaml new file mode 100644 index 00000000000..11aafdecd70 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/approved_home.yaml @@ -0,0 +1,47 @@ +description: New Jersey provides these weekly reimbursement rates for approved home providers under the Child Care Assistance Program. +metadata: + period: week + unit: currency-USD + label: New Jersey CCAP approved home weekly rates + breakdown: + - nj_ccap_time_category + - nj_ccap_age_group + reference: + - title: CC-230 Maximum Child Care Payment Rates, Approved Homes (FFN and In-Home) + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Max_CC_Payment_Rates.pdf#page=3 + +FULL_TIME: + INFANT: + 2025-03-01: 139.39 + INFANT_SN: + 2025-03-01: 158.79 + TODDLER: + 2025-03-01: 139.39 + TODDLER_SN: + 2025-03-01: 158.79 + PRESCHOOL: + 2025-03-01: 118.79 + PRESCHOOL_SN: + 2025-03-01: 139.39 + SCHOOL_AGE: + 2025-03-01: 118.79 + SCHOOL_AGE_SN: + 2025-03-01: 139.39 + +PART_TIME: + INFANT: + 2025-03-01: 69.70 + INFANT_SN: + 2025-03-01: 79.39 + TODDLER: + 2025-03-01: 69.70 + TODDLER_SN: + 2025-03-01: 79.39 + PRESCHOOL: + 2025-03-01: 59.39 + PRESCHOOL_SN: + 2025-03-01: 69.70 + SCHOOL_AGE: + 2025-03-01: 59.39 + SCHOOL_AGE_SN: + 2025-03-01: 69.70 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/licensed_center.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/licensed_center.yaml new file mode 100644 index 00000000000..1d1d1645ff2 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/licensed_center.yaml @@ -0,0 +1,152 @@ +description: New Jersey provides these weekly reimbursement rates for licensed child care centers under the Child Care Assistance Program. +metadata: + period: week + unit: currency-USD + label: New Jersey CCAP licensed center weekly rates + breakdown: + - nj_ccap_time_category + - nj_ccap_grow_nj_kids_rating + - nj_ccap_age_group + reference: + - title: CC-230 Maximum Child Care Payment Rates, Licensed Child Care Centers + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Max_CC_Payment_Rates.pdf#page=1 + +FULL_TIME: + NONE: + INFANT: + 2025-03-01: 366.67 + INFANT_SN: + 2025-03-01: 440.01 + TODDLER: + 2025-03-01: 326.56 + TODDLER_SN: + 2025-03-01: 391.87 + PRESCHOOL: + 2025-03-01: 291.57 + PRESCHOOL_SN: + 2025-03-01: 370.29 + SCHOOL_AGE: + 2025-03-01: 274.96 + SCHOOL_AGE_SN: + 2025-03-01: 349.20 + STAR_3: + INFANT: + 2025-03-01: 391.32 + INFANT_SN: + 2025-03-01: 469.58 + TODDLER: + 2025-03-01: 336.96 + TODDLER_SN: + 2025-03-01: 404.36 + PRESCHOOL: + 2025-03-01: 305.27 + PRESCHOOL_SN: + 2025-03-01: 387.70 + SCHOOL_AGE: + 2025-03-01: 274.96 + SCHOOL_AGE_SN: + 2025-03-01: 349.20 + STAR_4: + INFANT: + 2025-03-01: 402.27 + INFANT_SN: + 2025-03-01: 482.73 + TODDLER: + 2025-03-01: 345.68 + TODDLER_SN: + 2025-03-01: 414.82 + PRESCHOOL: + 2025-03-01: 312.71 + PRESCHOOL_SN: + 2025-03-01: 397.14 + SCHOOL_AGE: + 2025-03-01: 274.96 + SCHOOL_AGE_SN: + 2025-03-01: 349.20 + STAR_5: + INFANT: + 2025-03-01: 416.42 + INFANT_SN: + 2025-03-01: 499.70 + TODDLER: + 2025-03-01: 356.97 + TODDLER_SN: + 2025-03-01: 428.36 + PRESCHOOL: + 2025-03-01: 322.34 + PRESCHOOL_SN: + 2025-03-01: 409.37 + SCHOOL_AGE: + 2025-03-01: 274.96 + SCHOOL_AGE_SN: + 2025-03-01: 349.20 + +PART_TIME: + NONE: + INFANT: + 2025-03-01: 183.34 + INFANT_SN: + 2025-03-01: 220.00 + TODDLER: + 2025-03-01: 163.28 + TODDLER_SN: + 2025-03-01: 195.94 + PRESCHOOL: + 2025-03-01: 145.79 + PRESCHOOL_SN: + 2025-03-01: 185.15 + SCHOOL_AGE: + 2025-03-01: 137.48 + SCHOOL_AGE_SN: + 2025-03-01: 174.60 + STAR_3: + INFANT: + 2025-03-01: 195.66 + INFANT_SN: + 2025-03-01: 234.79 + TODDLER: + 2025-03-01: 168.48 + TODDLER_SN: + 2025-03-01: 202.18 + PRESCHOOL: + 2025-03-01: 152.64 + PRESCHOOL_SN: + 2025-03-01: 193.85 + SCHOOL_AGE: + 2025-03-01: 137.48 + SCHOOL_AGE_SN: + 2025-03-01: 174.60 + STAR_4: + INFANT: + 2025-03-01: 201.14 + INFANT_SN: + 2025-03-01: 241.36 + TODDLER: + 2025-03-01: 172.84 + TODDLER_SN: + 2025-03-01: 207.41 + PRESCHOOL: + 2025-03-01: 156.35 + PRESCHOOL_SN: + 2025-03-01: 198.57 + SCHOOL_AGE: + 2025-03-01: 137.48 + SCHOOL_AGE_SN: + 2025-03-01: 174.60 + STAR_5: + INFANT: + 2025-03-01: 208.21 + INFANT_SN: + 2025-03-01: 249.85 + TODDLER: + 2025-03-01: 178.48 + TODDLER_SN: + 2025-03-01: 214.18 + PRESCHOOL: + 2025-03-01: 161.17 + PRESCHOOL_SN: + 2025-03-01: 204.69 + SCHOOL_AGE: + 2025-03-01: 137.48 + SCHOOL_AGE_SN: + 2025-03-01: 174.60 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/registered_family.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/registered_family.yaml new file mode 100644 index 00000000000..ade6a65ce58 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/registered_family.yaml @@ -0,0 +1,152 @@ +description: New Jersey provides these weekly reimbursement rates for registered family child care homes under the Child Care Assistance Program. +metadata: + period: week + unit: currency-USD + label: New Jersey CCAP registered family weekly rates + breakdown: + - nj_ccap_time_category + - nj_ccap_grow_nj_kids_rating + - nj_ccap_age_group + reference: + - title: CC-230 Maximum Child Care Payment Rates, Registered Family Child Care Homes + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Max_CC_Payment_Rates.pdf#page=2 + +FULL_TIME: + NONE: + INFANT: + 2025-03-01: 281.19 + INFANT_SN: + 2025-03-01: 315.91 + TODDLER: + 2025-03-01: 281.19 + TODDLER_SN: + 2025-03-01: 315.91 + PRESCHOOL: + 2025-03-01: 246.47 + PRESCHOOL_SN: + 2025-03-01: 281.19 + SCHOOL_AGE: + 2025-03-01: 245.25 + SCHOOL_AGE_SN: + 2025-03-01: 279.80 + STAR_3: + INFANT: + 2025-03-01: 323.38 + INFANT_SN: + 2025-03-01: 327.98 + TODDLER: + 2025-03-01: 305.34 + TODDLER_SN: + 2025-03-01: 317.42 + PRESCHOOL: + 2025-03-01: 293.27 + PRESCHOOL_SN: + 2025-03-01: 305.34 + SCHOOL_AGE: + 2025-03-01: 245.25 + SCHOOL_AGE_SN: + 2025-03-01: 279.80 + STAR_4: + INFANT: + 2025-03-01: 335.46 + INFANT_SN: + 2025-03-01: 340.06 + TODDLER: + 2025-03-01: 317.35 + TODDLER_SN: + 2025-03-01: 329.49 + PRESCHOOL: + 2025-03-01: 305.27 + PRESCHOOL_SN: + 2025-03-01: 317.35 + SCHOOL_AGE: + 2025-03-01: 245.25 + SCHOOL_AGE_SN: + 2025-03-01: 279.80 + STAR_5: + INFANT: + 2025-03-01: 349.71 + INFANT_SN: + 2025-03-01: 352.13 + TODDLER: + 2025-03-01: 331.59 + TODDLER_SN: + 2025-03-01: 343.74 + PRESCHOOL: + 2025-03-01: 319.52 + PRESCHOOL_SN: + 2025-03-01: 331.59 + SCHOOL_AGE: + 2025-03-01: 245.25 + SCHOOL_AGE_SN: + 2025-03-01: 279.80 + +PART_TIME: + NONE: + INFANT: + 2025-03-01: 140.60 + INFANT_SN: + 2025-03-01: 157.95 + TODDLER: + 2025-03-01: 140.60 + TODDLER_SN: + 2025-03-01: 157.95 + PRESCHOOL: + 2025-03-01: 123.24 + PRESCHOOL_SN: + 2025-03-01: 140.60 + SCHOOL_AGE: + 2025-03-01: 122.63 + SCHOOL_AGE_SN: + 2025-03-01: 139.90 + STAR_3: + INFANT: + 2025-03-01: 161.69 + INFANT_SN: + 2025-03-01: 163.99 + TODDLER: + 2025-03-01: 152.67 + TODDLER_SN: + 2025-03-01: 158.71 + PRESCHOOL: + 2025-03-01: 146.63 + PRESCHOOL_SN: + 2025-03-01: 152.67 + SCHOOL_AGE: + 2025-03-01: 122.63 + SCHOOL_AGE_SN: + 2025-03-01: 139.90 + STAR_4: + INFANT: + 2025-03-01: 167.73 + INFANT_SN: + 2025-03-01: 170.03 + TODDLER: + 2025-03-01: 158.67 + TODDLER_SN: + 2025-03-01: 164.74 + PRESCHOOL: + 2025-03-01: 152.64 + PRESCHOOL_SN: + 2025-03-01: 158.67 + SCHOOL_AGE: + 2025-03-01: 122.63 + SCHOOL_AGE_SN: + 2025-03-01: 139.90 + STAR_5: + INFANT: + 2025-03-01: 174.85 + INFANT_SN: + 2025-03-01: 176.07 + TODDLER: + 2025-03-01: 165.80 + TODDLER_SN: + 2025-03-01: 171.87 + PRESCHOOL: + 2025-03-01: 159.76 + PRESCHOOL_SN: + 2025-03-01: 165.80 + SCHOOL_AGE: + 2025-03-01: 122.63 + SCHOOL_AGE_SN: + 2025-03-01: 139.90 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/time_authorization/thresholds.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/time_authorization/thresholds.yaml new file mode 100644 index 00000000000..7300f40f291 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/time_authorization/thresholds.yaml @@ -0,0 +1,22 @@ +description: New Jersey sets these full-time and part-time care thresholds under the Child Care Assistance Program. +metadata: + type: single_amount + threshold_unit: hour + amount_unit: /1 + period: year + label: New Jersey CCAP time authorization thresholds + reference: + - title: CC-230 Maximum Child Care Payment Rates notes + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Max_CC_Payment_Rates.pdf#page=1 + - title: CC-236 Copayment Schedule + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Copayment_Schedule.pdf#page=1 + +brackets: + - threshold: + 2024-01-01: 0 + amount: + 2024-01-01: 1 + - threshold: + 2024-01-01: 30 + amount: + 2024-01-01: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/edge_cases.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/edge_cases.yaml new file mode 100644 index 00000000000..7a8de21adbe --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/edge_cases.yaml @@ -0,0 +1,1025 @@ +# NJ CCAP Edge Case Tests +# Targets boundary conditions for eligibility, copay, age groups, provider rates, +# time categories, and assets. +# +# 2026 FPG (Contiguous US): first_person = 15_960, additional = 5_680 +# Family of 2: 21_640; 200% = 43_280; 250% = 54_100 +# Family of 3: 27_320; 200% = 54_640; 250% = 68_300 +# Family of 4: 33_000; 200% = 66_000; 250% = 82_500 +# Family of 8: 55_720; 200% = 111_440 +# CCDF asset limit: 1_000_000 + +# === Income threshold boundaries === + +- name: Case 1, income one dollar below 200% FPL for family of 2. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 43_279 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + # 43_279 < 43_280 (200% FPL) -> eligible + nj_ccap_income_eligible: true + +- name: Case 2, income one dollar above 200% FPL for family of 2. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 43_281 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + # 43_281 > 43_280 (200% FPL) -> ineligible for initial + nj_ccap_income_eligible: false + +- name: Case 3, enrolled family one dollar below 250% FPL. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 54_099 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + nj_ccap_enrolled: true + households: + household: + members: [person1, person2] + state_code: NJ + output: + # 54_099 < 54_100 (250% FPL fam of 2) -> eligible + nj_ccap_income_eligible: true + +- name: Case 4, enrolled family one dollar above 250% FPL. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 54_101 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + nj_ccap_enrolled: true + households: + household: + members: [person1, person2] + state_code: NJ + output: + # 54_101 > 54_100 (250% FPL fam of 2) -> ineligible + nj_ccap_income_eligible: false + +# === Copay at FPL tier boundaries === + +- name: Case 5, copay at exactly 100% FPL is waived. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 21_640 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + # FPG fam of 2 = 21_640; FPL ratio = 21_640/21_640 = 1.0 + # 1.0 < 1.0001 -> still in 0% bracket -> copay waived + nj_ccap_copay: 0 + +- name: Case 6, copay just above 100% FPL enters 101-200% tier. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 21_700 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + # FPL ratio = 21_700/21_640 = 1.00277 + # 1.00277 >= 1.0001 -> 101-200% tier + # 1 child FT -> 4% + # monthly copay = 21_700 * 0.04 / 12 = 72.33 + nj_ccap_copay: 72.33 + +- name: Case 7, copay at exactly 200% FPL stays in 101-200% tier. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 43_280 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + # FPL ratio = 43_280/21_640 = 2.0 + # 2.0 < 2.0001 -> still in 101-200% tier + # 1 child FT -> 4% + # monthly copay = 43_280 * 0.04 / 12 = 144.27 + nj_ccap_copay: 144.27 + +- name: Case 8, copay just above 200% FPL enters 201%+ tier. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 43_340 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + nj_ccap_enrolled: true + households: + household: + members: [person1, person2] + state_code: NJ + output: + # FPL ratio = 43_340/21_640 = 2.00277 + # 2.00277 >= 2.0001 -> 201%+ tier + # 1 child FT -> 5% + # monthly copay = 43_340 * 0.05 / 12 = 180.58 + nj_ccap_copay: 180.58 + +# === Asset boundary === + +- name: Case 9, assets exactly at 1M limit is eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_assets: 1_000_000 + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Assets 1_000_000 <= 1_000_000 -> asset eligible + is_ccdf_asset_eligible: true + nj_ccap_eligible: true + +- name: Case 10, assets one dollar over 1M limit is ineligible. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_assets: 1_000_001 + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Assets 1_000_001 > 1_000_000 -> asset ineligible + is_ccdf_asset_eligible: false + nj_ccap_eligible: false + +# === Age group month boundaries === +# age field is in years; age_in_months = age * 12 +# Boundary: 17 months (1.4167 yrs) = INFANT; 18 months (1.5 yrs) = TODDLER + +- name: Case 11, child at 17 months is infant. + period: 2026-01 + input: + people: + person1: + # 17 months = 17/12 = 1.4167 years + age: 1.4167 + households: + household: + members: [person1] + state_code: NJ + output: + # 1.4167 * 12 = 17.0 months < 18 -> INFANT + nj_ccap_age_group: INFANT + +- name: Case 12, child at 18 months is toddler. + period: 2026-01 + input: + people: + person1: + # 18 months = 1.5 years + age: 1.5 + households: + household: + members: [person1] + state_code: NJ + output: + # 1.5 * 12 = 18.0 months >= 18 -> TODDLER + nj_ccap_age_group: TODDLER + +- name: Case 13, child at 29 months is toddler. + period: 2026-01 + input: + people: + person1: + # 29 months = 29/12 = 2.4167 years + age: 2.4167 + households: + household: + members: [person1] + state_code: NJ + output: + # 2.4167 * 12 = 29.0 months < 30 -> TODDLER + nj_ccap_age_group: TODDLER + +- name: Case 14, child at 30 months is preschool. + period: 2026-01 + input: + people: + person1: + # 30 months = 2.5 years + age: 2.5 + households: + household: + members: [person1] + state_code: NJ + output: + # 2.5 * 12 = 30.0 months >= 30 -> PRESCHOOL + nj_ccap_age_group: PRESCHOOL + +- name: Case 15, child at 59 months is preschool. + period: 2026-01 + input: + people: + person1: + # 59 months = 59/12 = 4.9167 years + age: 4.9167 + households: + household: + members: [person1] + state_code: NJ + output: + # 4.9167 * 12 = 59.0 months < 60 -> PRESCHOOL + nj_ccap_age_group: PRESCHOOL + +- name: Case 16, child at 60 months is school age. + period: 2026-01 + input: + people: + person1: + # 60 months = 5.0 years + age: 5.0 + households: + household: + members: [person1] + state_code: NJ + output: + # 5.0 * 12 = 60.0 months >= 60 -> SCHOOL_AGE + nj_ccap_age_group: SCHOOL_AGE + +# === Time category boundary: 31 hours === + +- name: Case 17, childcare 31 hours is full time. + period: 2026-01 + input: + people: + person1: + childcare_hours_per_week: 31 + households: + household: + members: [person1] + state_code: NJ + output: + # 31 >= 30 -> FULL_TIME + nj_ccap_time_category: FULL_TIME + +# === Eligible child age boundaries === + +- name: Case 18, child exactly 13 years without disability is ineligible. + period: 2026-01 + input: + people: + person1: + age: 13 + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + # age 13 >= 13 -> not age eligible (not disabled) + nj_ccap_eligible_child: false + +- name: Case 19, child exactly 19 years with disability is ineligible. + period: 2026-01 + input: + people: + person1: + age: 19 + is_disabled: true + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + # age 19 >= 19 -> not age eligible even with disability + nj_ccap_eligible_child: false + +- name: Case 20, child exactly 18 years with disability is eligible. + period: 2026-01 + input: + people: + person1: + age: 18 + is_disabled: true + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + # age 18 < 19 -> age eligible with disability + nj_ccap_eligible_child: true + +# === Homeless family copay waiver === + +- name: Case 21, homeless family copay waived regardless of income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 35_000 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + is_homeless: true + output: + # Homeless -> copay waived ($0) even though income above 100% FPL + # FPL ratio = 35_000/21_640 = 1.617 -> would be 4% without waiver + nj_ccap_copay: 0 + +# === Large family size === + +- name: Case 22, family of 8 at 200% FPL boundary. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 111_440 + immigration_status: CITIZEN + person2: + age: 38 + immigration_status: CITIZEN + person3: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person4: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person5: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person6: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person7: + age: 10 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person8: + age: 12 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8] + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8] + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8] + state_code: NJ + output: + # FPG fam of 8: 15_960 + 7*5_680 = 55_720 + # 200% FPL = 111_440 + # 111_440 <= 111_440 -> eligible at boundary + nj_ccap_income_eligible: true + +# === All children ineligible === + +- name: Case 23, all children over 13 makes family ineligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + employment_income: 30_000 + immigration_status: CITIZEN + person2: + age: 14 + is_tax_unit_dependent: true + immigration_status: CITIZEN + person3: + age: 16 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_pre_subsidy_childcare_expenses: 10_000 + households: + household: + members: [person1, person2, person3] + state_code: NJ + output: + nj_ccap_eligible_child: [false, false, false] + nj_ccap_eligible: false + nj_ccap: 0 + +# === Single adult no children === + +- name: Case 24, single adult with no children is ineligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 20_000 + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1] + spm_units: + spm_unit: + members: [person1] + spm_unit_pre_subsidy_childcare_expenses: 5_000 + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_eligible_child: [false] + nj_ccap_eligible: false + nj_ccap: 0 + +# === Provider rate lookups: registered family 5-star === + +- name: Case 25, registered family FT 5-star toddler rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 2 + childcare_hours_per_week: 35 + nj_ccap_provider_type: REGISTERED_FAMILY + nj_ccap_grow_nj_kids_rating: STAR_5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + # Registered family FT 5-star toddler = 331.59 + nj_ccap_maximum_weekly_benefit: 331.59 + +# === Provider rate: approved home special needs === + +- name: Case 26, approved home FT special needs preschool rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 4 + is_disabled: true + childcare_hours_per_week: 35 + nj_ccap_provider_type: APPROVED_HOME + nj_ccap_grow_nj_kids_rating: NONE + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + # Approved home FT PRESCHOOL_SN = 139.39 + nj_ccap_maximum_weekly_benefit: 139.39 + +# === ACA summer camp for non-school-age child gives $0 rate === + +- name: Case 27, ACA summer camp for preschool child gives zero rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 4 + childcare_hours_per_week: 35 + nj_ccap_provider_type: ACA_SUMMER_CAMP + nj_ccap_grow_nj_kids_rating: NONE + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + # ACA summer camp FT PRESCHOOL = 0 (camp is school-age only) + nj_ccap_maximum_weekly_benefit: 0 + +# === Third child confirms $0 additional copay (via full nj_ccap benefit) === + +- name: Case 28, three children FT confirms third child zero additional copay. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 50_000 + immigration_status: CITIZEN + person2: + age: 32 + immigration_status: CITIZEN + person3: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + person4: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + person5: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2, person3, person4, person5] + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + spm_unit_pre_subsidy_childcare_expenses: 30_000 + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: NJ + output: + # FPG fam of 5: 38_680; FPL ratio = 50_000/38_680 = 1.293 + # 3 children all FT at 101-200%: + # first child FT 4% + second child FT 2% + third child 0% = 6% + # Uncapped: 50_000 * 0.06 / 12 = 250 + # Cap: 50_000 * 0.05 / 12 = 208.33 + # copay = min(250, 208.33) = 208.33 + nj_ccap_copay: 208.33 + + # Rates: infant FT base = 366.67; preschool FT base = 291.57; school age FT base = 274.96 + nj_ccap_maximum_weekly_benefit: [0, 0, 366.67, 291.57, 274.96] + + # max annual = (366.67 + 291.57 + 274.96) * 52 = 933.20 * 52 = 48_526.40 + # annual copay = 50_000 * 0.05 = 2_500 (capped) + # uncapped = max(30_000 - 2_500, 0) = 27_500 + # annual benefit = min(27_500, 48_526.40) = 27_500 + # monthly = 27_500 / 12 = 2_291.67 + nj_ccap: 2_291.67 + +# === Activity requirement: hours exactly at boundary === + +- name: Case 29, parent at exactly 30 hours meets activity requirement. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + immigration_status: CITIZEN + weekly_hours_worked: 30 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + # 30 >= 30 -> meets activity requirement + nj_ccap_activity_eligible: true + +- name: Case 30, parent at 29 hours fails activity requirement. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + immigration_status: CITIZEN + weekly_hours_worked: 29 + is_full_time_student: false + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + # 29 < 30 -> fails activity, not student -> ineligible + nj_ccap_activity_eligible: false + +# === Two-parent household where one fails activity === + +- name: Case 31, two parents one fails activity makes family ineligible. + period: 2026-01 + input: + people: + person1: + age: 35 + employment_income: 30_000 + immigration_status: CITIZEN + weekly_hours_worked: 40 + person2: + age: 32 + immigration_status: CITIZEN + weekly_hours_worked: 10 + is_full_time_student: false + person3: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: NJ + output: + # person1: 40 >= 30 -> meets work + # person2: 10 < 30 and not student -> fails + # Both heads/spouses must meet requirement + nj_ccap_activity_eligible: false + nj_ccap_eligible: false + +# === Zero income with zero deductions === + +- name: Case 32, zero income family gets full benefit up to rate cap. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 25 + immigration_status: CITIZEN + is_full_time_student: true + weekly_hours_worked: 0 + person2: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 18_000 + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Income = 0 -> income eligible, copay = 0 + nj_ccap_income_eligible: true + nj_ccap_copay: 0 + nj_ccap_countable_income: 0 + + # Toddler (24 mo) FT base center = 326.56 + nj_ccap_maximum_weekly_benefit: [0, 326.56] + + # max annual = 326.56 * 52 = 16_981.12 + # uncapped = max(18_000 - 0, 0) = 18_000 + # annual benefit = min(18_000, 16_981.12) = 16_981.12 + # monthly = 16_981.12 / 12 = 1_415.09 + nj_ccap: 1_415.09 + +# === Mixed copay: 1 FT + 1 PT at 201%+ with second child PT === + +- name: Case 33, mixed FT PT copay at 201%+ tier second child is PT. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 75_000 + immigration_status: CITIZEN + person2: + age: 32 + immigration_status: CITIZEN + person3: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + person4: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 20 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + nj_ccap_enrolled: true + households: + household: + members: [person1, person2, person3, person4] + state_code: NJ + output: + # FPG fam of 4: 33_000; FPL ratio = 75_000/33_000 = 2.273 + # 1 FT + 1 PT at 201%+: + # n_ft = 1 (person3 only); first child rate = FT 5% + # n_ft = 1 < 2; second child rate = PT 1% + # total rate = 5% + 1% = 6% + # Uncapped: 75_000 * 0.06 / 12 = 375 + # Cap: 75_000 * 0.05 / 12 = 312.50 + # copay = min(375, 312.50) = 312.50 + nj_ccap_copay: 312.50 + +# === Provider rate: registered family with star rating for school age = base === + +- name: Case 34, registered family 5-star school age gets base rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 8 + childcare_hours_per_week: 35 + nj_ccap_provider_type: REGISTERED_FAMILY + nj_ccap_grow_nj_kids_rating: STAR_5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + # Registered family FT 5-star school age = 245.25 (same as base) + nj_ccap_maximum_weekly_benefit: 245.25 + +# === Provider rate: ACA summer camp PT special needs school age === + +- name: Case 35, ACA summer camp PT special needs school age rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 10 + is_disabled: true + childcare_hours_per_week: 20 + nj_ccap_provider_type: ACA_SUMMER_CAMP + nj_ccap_grow_nj_kids_rating: NONE + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + # ACA summer camp PT SCHOOL_AGE_SN = 183.33 + nj_ccap_maximum_weekly_benefit: 183.33 + +# === Minimum family: 1 adult + 1 child, positive benefit === + +- name: Case 36, minimum family size with benefit. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 20 + employment_income: 18_000 + immigration_status: CITIZEN + person2: + age: 0 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + nj_ccap_provider_type: APPROVED_HOME + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 8_000 + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Parent (age 20 = 240 mo) -> SCHOOL_AGE; Newborn (0 mo) -> INFANT + nj_ccap_age_group: [SCHOOL_AGE, INFANT] + + # FPG fam of 2: 21_640; FPL ratio = 18_000/21_640 = 0.832 + # Below 100% FPL -> copay waived + nj_ccap_copay: 0 + + # Approved home FT infant = 139.39 + nj_ccap_maximum_weekly_benefit: [0, 139.39] + + # max annual = 139.39 * 52 = 7_248.28 + # uncapped = max(8_000 - 0, 0) = 8_000 + # annual benefit = min(8_000, 7_248.28) = 7_248.28 + # monthly = 7_248.28 / 12 = 604.02 + nj_ccap: 604.02 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/integration.yaml new file mode 100644 index 00000000000..4af7b84f402 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/integration.yaml @@ -0,0 +1,387 @@ +# NJ CCAP Integration Tests +# 2026 FPG (Contiguous US): first_person = 15_960, additional = 5_680 +# Family of 2: 21_640; 200% = 43_280 +# Family of 3: 27_320; 200% = 54_640 +# Family of 4: 33_000; 200% = 66_000; 250% = 82_500 +# Family of 5: 38_680; 200% = 77_360 + +- name: Case 1, single parent one infant FT licensed center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 28 + employment_income: 31_000 + immigration_status: CITIZEN + person2: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 19_000 + households: + household: + members: [person1, person2] + state_code: NJ + output: + # === Eligibility === + # Child age 1 < 13 -> age eligible + # Citizen, dependent -> eligible child + nj_ccap_eligible_child: [false, true] + + # FPG family of 2: 21_640 + # 31_000 <= 43_280 (200% FPL) -> income eligible + nj_ccap_income_eligible: true + is_ccdf_asset_eligible: true + nj_ccap_eligible: true + + # === Copay === + # FPL ratio = 31_000 / 21_640 = 1.433 -> 101-200% FPL tier + # 1 child FT -> 4% of annual income + # annual copay = 31_000 * 0.04 = 1_240 + # monthly copay = 1_240 / 12 = 103.33 + nj_ccap_copay: 103.33 + + # === Provider rates === + # Parent (age 28 = 336 mo >= 60) -> SCHOOL_AGE; Child (age 1 = 12 mo < 18) -> INFANT + nj_ccap_age_group: [SCHOOL_AGE, INFANT] + # Parent: 0 hrs -> PART_TIME; Child: 40 hrs -> FULL_TIME + nj_ccap_time_category: [PART_TIME, FULL_TIME] + # Center FT Base Infant = $366.67/wk + nj_ccap_maximum_weekly_benefit: [0, 366.67] + + # === Benefit === + # max annual = 366.67 * 52 = 19_066.84 + # uncapped = max(19_000 - 1_240, 0) = 17_760 + # annual benefit = min(17_760, 19_066.84) = 17_760 + # monthly = 17_760 / 12 = 1_480 + nj_ccap: 1_480 + +- name: Case 2, single parent two children PT registered family low income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 25 + employment_income: 20_000 + immigration_status: CITIZEN + person2: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 20 + nj_ccap_provider_type: REGISTERED_FAMILY + nj_ccap_grow_nj_kids_rating: NONE + person3: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 15 + nj_ccap_provider_type: REGISTERED_FAMILY + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_pre_subsidy_childcare_expenses: 12_000 + households: + household: + members: [person1, person2, person3] + state_code: NJ + output: + # === Eligibility === + nj_ccap_eligible_child: [false, true, true] + + # FPG family of 3: 27_320 + # 20_000 <= 54_640 (200% FPL) -> income eligible + nj_ccap_income_eligible: true + is_ccdf_asset_eligible: true + nj_ccap_eligible: true + + # === Copay === + # FPL ratio = 20_000 / 27_320 = 0.732 -> at or below 100% FPL -> waived + nj_ccap_copay: 0 + + # === Provider rates === + # Parent (age 25 = 300 mo >= 60) -> SCHOOL_AGE + # child1 (age 2 = 24 mo): >= 18, < 30 -> TODDLER + # child2 (age 7 = 84 mo): >= 60 -> SCHOOL_AGE + nj_ccap_age_group: [SCHOOL_AGE, TODDLER, SCHOOL_AGE] + # Parent: 0 hrs -> PT; child1: 20 hrs -> PT; child2: 15 hrs -> PT + nj_ccap_time_category: [PART_TIME, PART_TIME, PART_TIME] + # Registered family PT base toddler = $140.60; school age = $122.63 + nj_ccap_maximum_weekly_benefit: [0, 140.60, 122.63] + + # === Benefit === + # max annual = (140.60 + 122.63) * 52 = 263.23 * 52 = 13_687.96 + # uncapped = max(12_000 - 0, 0) = 12_000 + # annual benefit = min(12_000, 13_687.96) = 12_000 + # monthly = 12_000 / 12 = 1_000 + nj_ccap: 1_000 + +- name: Case 3, two parents one preschooler FT 5-star center enrolled at 220% FPL. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 70_000 + immigration_status: CITIZEN + person2: + age: 32 + immigration_status: CITIZEN + person3: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: STAR_5 + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + nj_ccap_enrolled: true + spm_unit_pre_subsidy_childcare_expenses: 16_000 + households: + household: + members: [person1, person2, person3] + state_code: NJ + output: + # === Eligibility === + nj_ccap_eligible_child: [false, false, true] + + # FPG family of 3: 27_320 + # Enrolled -> 250% FPL = 27_320 * 2.5 = 68_300 + # 70_000 > 68_300 -> ineligible at 250% FPL + nj_ccap_income_eligible: false + nj_ccap_eligible: false + + # === Benefit === + nj_ccap: 0 + +- name: Case 4, family exactly at 200% FPL initial application. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 66_000 + immigration_status: CITIZEN + person2: + age: 32 + immigration_status: CITIZEN + person3: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: STAR_4 + person4: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 30 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: STAR_4 + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + spm_unit_pre_subsidy_childcare_expenses: 20_000 + households: + household: + members: [person1, person2, person3, person4] + state_code: NJ + output: + # === Eligibility === + nj_ccap_eligible_child: [false, false, true, true] + + # FPG family of 4: 33_000; 200% = 66_000 + # 66_000 <= 66_000 -> exactly at limit -> eligible + nj_ccap_income_eligible: true + is_ccdf_asset_eligible: true + nj_ccap_eligible: true + + # === Copay === + # FPL ratio = 66_000 / 33_000 = 2.0 -> at 200% exactly + # Threshold for higher tier is 2.0001, so 2.0 < 2.0001 -> 101-200% tier + # 2 children both FT -> first child FT 4% + second child FT 2% = 6% + # Uncapped: 66_000 * 0.06 / 12 = 330 + # Cap: 66_000 * 0.05 / 12 = 275 + # copay = min(330, 275) = 275 + nj_ccap_copay: 275 + + # === Provider rates === + # Person1 (age 35 = 420 mo >= 60) -> SCHOOL_AGE; Person2 (age 32 = 384 mo >= 60) -> SCHOOL_AGE + # child1 (age 4 = 48 mo): PRESCHOOL; child2 (age 8 = 96 mo): SCHOOL_AGE + nj_ccap_age_group: [SCHOOL_AGE, SCHOOL_AGE, PRESCHOOL, SCHOOL_AGE] + nj_ccap_time_category: [PART_TIME, PART_TIME, FULL_TIME, FULL_TIME] + # Center FT Star 4 Preschool = 312.71; Center FT Star 4 School Age = 274.96 (base) + nj_ccap_maximum_weekly_benefit: [0, 0, 312.71, 274.96] + + # === Benefit === + # max annual = (312.71 + 274.96) * 52 = 587.67 * 52 = 30_558.84 + # annual copay = 66_000 * 0.05 = 3_300 (capped) + # uncapped = max(20_000 - 3_300, 0) = 16_700 + # annual benefit = min(16_700, 30_558.84) = 16_700 + # monthly = 16_700 / 12 = 1_391.67 + nj_ccap: 1_391.67 + +- name: Case 5, enrolled family at 240% FPL continuing eligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 79_200 + immigration_status: CITIZEN + person2: + age: 32 + immigration_status: CITIZEN + person3: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: STAR_3 + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + nj_ccap_enrolled: true + spm_unit_pre_subsidy_childcare_expenses: 22_000 + households: + household: + members: [person1, person2, person3] + state_code: NJ + output: + # === Eligibility === + nj_ccap_eligible_child: [false, false, true] + + # FPG family of 3: 27_320; 250% = 68_300 + # Enrolled: 79_200 > 68_300 -> exceeds 250% FPL -> ineligible + nj_ccap_income_eligible: false + nj_ccap_eligible: false + + # === Benefit === + nj_ccap: 0 + +- name: Case 6, enrolled family at 230% FPL continuing eligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 62_836 + immigration_status: CITIZEN + person2: + age: 32 + immigration_status: CITIZEN + person3: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: STAR_3 + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + nj_ccap_enrolled: true + spm_unit_pre_subsidy_childcare_expenses: 22_000 + households: + household: + members: [person1, person2, person3] + state_code: NJ + output: + # === Eligibility === + nj_ccap_eligible_child: [false, false, true] + + # FPG family of 3: 27_320; 250% = 68_300 + # Enrolled: 62_836 <= 68_300 -> eligible + nj_ccap_income_eligible: true + is_ccdf_asset_eligible: true + nj_ccap_eligible: true + + # === Copay === + # FPL ratio = 62_836 / 27_320 = 2.300 -> 201%+ tier + # 1 child FT -> 5% + # monthly copay = 62_836 * 0.05 / 12 = 261.82 + nj_ccap_copay: 261.82 + + # === Provider rates === + # Person1 (age 35 = 420 mo >= 60) -> SCHOOL_AGE; Person2 (age 32 = 384 mo >= 60) -> SCHOOL_AGE + # Child (age 1 = 12 mo < 18) -> INFANT + nj_ccap_age_group: [SCHOOL_AGE, SCHOOL_AGE, INFANT] + nj_ccap_time_category: [PART_TIME, PART_TIME, FULL_TIME] + # Center FT Star 3 Infant = $391.32 + nj_ccap_maximum_weekly_benefit: [0, 0, 391.32] + + # === Benefit === + # max annual = 391.32 * 52 = 20_348.64 + # annual copay = 62_836 * 0.05 = 3_141.80 + # uncapped = max(22_000 - 3_141.80, 0) = 18_858.20 + # annual benefit = min(18_858.20, 20_348.64) = 18_858.20 + # monthly = 18_858.20 / 12 = 1_571.52 + nj_ccap: 1_571.52 + +- name: Case 7, child exactly age 13 is ineligible unless special needs. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 30_000 + immigration_status: CITIZEN + person2: + age: 13 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 30 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 10_000 + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Child age 13 >= 13 -> not eligible (not disabled) + nj_ccap_eligible_child: [false, false] + nj_ccap_eligible: false + nj_ccap: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap.yaml new file mode 100644 index 00000000000..87043d7bc48 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap.yaml @@ -0,0 +1,211 @@ +# nj_ccap: SPMUnit, float, MONTH +# Per-child benefit = max(0, weekly_rate * 52/12 - copay_share) +# Total benefit = min(sum of per-child rates * 52/12, max(expenses - copay, 0)) +# Follows pattern: benefit = min(actual_expenses - copay, max_reimbursement) +# +# 2026 FPG: first_person = 15_960, additional = 5_680 +# Family of 2: 21_640; Family of 3: 27_320 + +- name: Case 1, basic eligible family positive benefit. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 14_000 + households: + household: + members: [person1, person2] + state_code: NJ + output: + # FPG family of 2: 21_640; FPL ratio = 30_000/21_640 = 1.386 + # 1 child FT at 101-200% -> copay = 30_000 * 0.04 / 12 = 100 + # annual copay = 1_200 + # max weekly = 291.57 (center FT base preschool); annual = 291.57 * 52 = 15_161.64 + # uncapped = max(14_000 - 1_200, 0) = 12_800 + # annual benefit = min(12_800, 15_161.64) = 12_800 + # monthly = 12_800 / 12 = 1_066.67 + nj_ccap: 1_066.67 + +- name: Case 2, ineligible family gets zero. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 50_000 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 14_000 + households: + household: + members: [person1, person2] + state_code: NJ + output: + # 50_000 > 43_280 (200% FPL for family of 2) -> ineligible + nj_ccap: 0 + +- name: Case 3, benefit capped at maximum rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 15_000 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 25_000 + households: + household: + members: [person1, person2] + state_code: NJ + output: + # FPL ratio = 15_000/21_640 = 0.693 -> copay waived ($0) + # max weekly = 291.57 (center FT base preschool); annual = 15_161.64 + # uncapped = max(25_000 - 0, 0) = 25_000 + # annual benefit = min(25_000, 15_161.64) = 15_161.64 + # monthly = 15_161.64 / 12 = 1_263.47 + nj_ccap: 1_263.47 + +- name: Case 4, zero expenses gives zero benefit. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 20_000 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 0 + households: + household: + members: [person1, person2] + state_code: NJ + output: + nj_ccap: 0 + +- name: Case 5, copay exceeds expenses gives zero benefit. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 42_000 + immigration_status: CITIZEN + person2: + age: 8 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 10 + nj_ccap_provider_type: APPROVED_HOME + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 1_200 + households: + household: + members: [person1, person2] + state_code: NJ + output: + # FPL ratio = 42_000/21_640 = 1.941; 1 child PT at 101-200% -> 2% + # annual copay = 42_000 * 0.02 = 840 + # uncapped = max(1_200 - 840, 0) = 360 + # max weekly = 59.39 (approved home PT school age); annual = 59.39 * 52 = 3_088.28 + # annual benefit = min(360, 3_088.28) = 360 + # monthly = 360 / 12 = 30 + nj_ccap: 30 + +- name: Case 6, negative countable income does not inflate benefit. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + self_employment_income: -60_000_000 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 15_000 + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Negative income -> copay = 0 + # max weekly = 291.57; annual = 15_161.64 + # uncapped = max(15_000 - 0, 0) = 15_000 + # annual = min(15_000, 15_161.64) = 15_000 + # monthly = 15_000 / 12 = 1_250 + nj_ccap: 1_250 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_age_group.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_age_group.yaml new file mode 100644 index 00000000000..125bf3b94db --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_age_group.yaml @@ -0,0 +1,161 @@ +# nj_ccap_age_group: Person, Enum, MONTH +# Age group boundaries (from age_group/months.yaml bracket parameter): +# 0 months -> INFANT (index 0) +# 18 months -> TODDLER (index 1) +# 30 months -> PRESCHOOL (index 2) +# 60 months -> SCHOOL_AGE (index 3) +# Special needs variants derived from is_disabled flag. +# Enum values: INFANT, INFANT_SN, TODDLER, TODDLER_SN, PRESCHOOL, PRESCHOOL_SN, +# SCHOOL_AGE, SCHOOL_AGE_SN + +- name: Case 1, newborn is infant. + period: 2026-01 + input: + people: + person1: + age: 0 + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_age_group: INFANT + +- name: Case 2, child at 1 year is infant. + period: 2026-01 + input: + people: + person1: + age: 1 + households: + household: + members: [person1] + state_code: NJ + output: + # 1 year = 12 months < 18 months -> INFANT + nj_ccap_age_group: INFANT + +- name: Case 3, child at 2 years is toddler. + period: 2026-01 + input: + people: + person1: + age: 2 + households: + household: + members: [person1] + state_code: NJ + output: + # 2 years = 24 months >= 18, < 30 -> TODDLER + nj_ccap_age_group: TODDLER + +- name: Case 4, child at 3 years is preschool. + period: 2026-01 + input: + people: + person1: + age: 3 + households: + household: + members: [person1] + state_code: NJ + output: + # 3 years = 36 months >= 30, < 60 -> PRESCHOOL + nj_ccap_age_group: PRESCHOOL + +- name: Case 5, child at 4 years is preschool. + period: 2026-01 + input: + people: + person1: + age: 4 + households: + household: + members: [person1] + state_code: NJ + output: + # 4 years = 48 months >= 30, < 60 -> PRESCHOOL + nj_ccap_age_group: PRESCHOOL + +- name: Case 6, child at 5 years is school age. + period: 2026-01 + input: + people: + person1: + age: 5 + households: + household: + members: [person1] + state_code: NJ + output: + # 5 years = 60 months >= 60 -> SCHOOL_AGE + nj_ccap_age_group: SCHOOL_AGE + +- name: Case 7, child at 10 years is school age. + period: 2026-01 + input: + people: + person1: + age: 10 + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_age_group: SCHOOL_AGE + +- name: Case 8, disabled infant has special needs variant. + period: 2026-01 + input: + people: + person1: + age: 1 + is_disabled: true + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_age_group: INFANT_SN + +- name: Case 9, disabled toddler has special needs variant. + period: 2026-01 + input: + people: + person1: + age: 2 + is_disabled: true + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_age_group: TODDLER_SN + +- name: Case 10, disabled preschooler has special needs variant. + period: 2026-01 + input: + people: + person1: + age: 3 + is_disabled: true + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_age_group: PRESCHOOL_SN + +- name: Case 11, disabled school age child has special needs variant. + period: 2026-01 + input: + people: + person1: + age: 8 + is_disabled: true + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_age_group: SCHOOL_AGE_SN diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_copay.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_copay.yaml new file mode 100644 index 00000000000..e5ce852f9b4 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_copay.yaml @@ -0,0 +1,406 @@ +# nj_ccap_copay: SPMUnit, float, MONTH +# Copay = annual_income * copay_percentage / 12 +# Copay percentage depends on FPL tier, care type (FT/PT), and child count (1 or 2+). +# Third+ child = $0 additional. Capped at 5% of gross income. +# +# 2026 FPG family of 2: 21_640; family of 4: 33_000; family of 5: 38_680 +# Copay rates (bracket thresholds at FPL ratio): +# 0-1.0: 0% (waived) +# 1.0001-2.0: first child FT 4%, PT 2%; second child FT +2%, PT +1% +# 2.0001+: first child FT 5%, PT 2.5%; second child FT +2%, PT +1% +# +# CC-236 verification examples from working_references.md: +# Income $22,000, 1 child FT weekly: $22,000 * 4% / 52 = $16.92 +# Income $55,000, 2 children FT weekly: $55,000 * 6% / 52 = $63.46 +# Income $40,000, 1 child PT weekly: $40,000 * 2% / 52 = $15.38 +# Income $91,000, 2 children mixed weekly: $91,000 * 5% / 52 = $87.50 + +- name: Case 1, income at or below 100% FPL copay waived. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 20_000 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + # FPG family of 2: 21_640 + # FPL ratio = 20_000 / 21_640 = 0.924 -> below 100% -> $0 copay + nj_ccap_copay: 0 + +- name: Case 2, one child FT at 101-200% FPL. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 31_000 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + # FPG family of 2: 21_640; FPL ratio = 31_000/21_640 = 1.4326 + # 1 child FT at 101-200% FPL -> 4% + # monthly copay = 31_000 * 0.04 / 12 = 103.33 + nj_ccap_copay: 103.33 + +- name: Case 3, two children FT at 101-200% FPL. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 55_000 + immigration_status: CITIZEN + person2: + age: 32 + immigration_status: CITIZEN + person3: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + person4: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: NJ + output: + # FPG family of 4: 33_000; FPL ratio = 55_000/33_000 = 1.667 + # 2 children both FT at 101-200% -> first child 4% + second child 2% = 6% + # Uncapped: 55_000 * 0.06 / 12 = 275 + # Cap: 55_000 * 0.05 / 12 = 229.17 + # copay = min(275, 229.17) = 229.17 + nj_ccap_copay: 229.17 + +- name: Case 4, one child PT at 101-200% FPL. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 40_000 + immigration_status: CITIZEN + person2: + age: 32 + immigration_status: CITIZEN + person3: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 20 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: NJ + output: + # FPG family of 3: 27_320; FPL ratio = 40_000/27_320 = 1.464 + # 1 child PT at 101-200% -> 2% + # monthly copay = 40_000 * 0.02 / 12 = 66.67 + nj_ccap_copay: 66.67 + +- name: Case 5, one child FT at 201%+ FPL. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 70_000 + immigration_status: CITIZEN + person2: + age: 32 + immigration_status: CITIZEN + person3: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: STAR_5 + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + nj_ccap_enrolled: true + households: + household: + members: [person1, person2, person3] + state_code: NJ + output: + # FPG family of 3: 27_320; FPL ratio = 70_000/27_320 = 2.562 + # 1 child FT at 201%+ -> 5% + # monthly copay = 70_000 * 0.05 / 12 = 291.67 + nj_ccap_copay: 291.67 + +- name: Case 6, two children FT at 201%+ FPL. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 80_000 + immigration_status: CITIZEN + person2: + age: 32 + immigration_status: CITIZEN + person3: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + person4: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + nj_ccap_enrolled: true + households: + household: + members: [person1, person2, person3, person4] + state_code: NJ + output: + # FPG family of 4: 33_000; FPL ratio = 80_000/33_000 = 2.424 + # 2 children both FT at 201%+ -> first child 5% + second child 2% = 7% + # Uncapped: 80_000 * 0.07 / 12 = 466.67 + # Cap: 80_000 * 0.05 / 12 = 333.33 + # copay = min(466.67, 333.33) = 333.33 + nj_ccap_copay: 333.33 + +- name: Case 7, mixed care one FT one PT at 101-200% FPL. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 61_000 + immigration_status: CITIZEN + person2: + age: 32 + immigration_status: CITIZEN + person3: + age: 1 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 20 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + person4: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: NJ + output: + # FPG family of 4: 33_000; FPL ratio = 61_000/33_000 = 1.848 + # 1 FT + 1 PT at 101-200% -> first child FT 4% + second child PT 1% = 5% + # monthly copay = 61_000 * 0.05 / 12 = 254.17 + nj_ccap_copay: 254.17 + +- name: Case 8, three children third child no additional copay. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 91_000 + immigration_status: CITIZEN + person2: + age: 32 + immigration_status: CITIZEN + person3: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + person4: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + person5: + age: 3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2, person3, person4, person5] + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + nj_ccap_enrolled: true + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: NJ + output: + # FPG family of 5: 38_680; FPL ratio = 91_000/38_680 = 2.352 + # 3 children all FT at 201%+ -> first child 5% + second child 2% + third child 0% = 7% + # Uncapped: 91_000 * 0.07 / 12 = 530.83 + # Cap: 91_000 * 0.05 / 12 = 379.17 + # copay = min(530.83, 379.17) = 379.17 + nj_ccap_copay: 379.17 + +- name: Case 9, copay capped at 5% of gross income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 80_000 + immigration_status: CITIZEN + person2: + age: 32 + immigration_status: CITIZEN + person3: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 20 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + person4: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + nj_ccap_enrolled: true + households: + household: + members: [person1, person2, person3, person4] + state_code: NJ + output: + # FPG family of 4: 33_000; FPL ratio = 80_000/33_000 = 2.424 + # 1 FT + 1 PT at 201%+ -> first child FT 5% + second child PT 1% = 6% + # Uncapped: 80_000 * 0.06 / 12 = 400 + # Cap: 80_000 * 0.05 / 12 = 333.33 + # copay = min(400, 333.33) = 333.33 + nj_ccap_copay: 333.33 + +- name: Case 10, zero income gives zero copay. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + nj_ccap_copay: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_countable_income.yaml new file mode 100644 index 00000000000..07f4d7723df --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_countable_income.yaml @@ -0,0 +1,113 @@ +# nj_ccap_countable_income: SPMUnit, float, MONTH +# Sums income sources via adds parameter list. +# Excludes TANF cash benefits. +# Sources: employment_income, self_employment_income, social_security_retirement, +# social_security_disability, social_security_survivors, ssi, dividend_income, +# interest_income, rental_income, pension_income, unemployment_compensation, +# workers_compensation, alimony_income, child_support_received. +# All are YEAR-defined; in MONTH test, input annual, output monthly (annual/12). + +- name: Case 1, employment income only. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 36_000 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: NJ + output: + # 36_000 / 12 = 3_000/month + nj_ccap_countable_income: 3_000 + +- name: Case 2, multiple income sources. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 + child_support_received: 6_000 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + # (24_000 + 6_000) / 12 = 2_500/month + nj_ccap_countable_income: 2_500 + +- name: Case 3, TANF excluded from countable income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 12_000 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + nj_wfnj: 4_800 + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Only employment counts: 12_000 / 12 = 1_000/month + # TANF (nj_wfnj) not in sources list -> excluded + nj_ccap_countable_income: 1_000 + +- name: Case 4, zero income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_countable_income: 0 + +- name: Case 5, two earners in household. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 30_000 + person2: + age: 32 + employment_income: 18_000 + person3: + age: 5 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: NJ + output: + # (30_000 + 18_000) / 12 = 4_000/month + nj_ccap_countable_income: 4_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_eligible.yaml new file mode 100644 index 00000000000..6e290913501 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_eligible.yaml @@ -0,0 +1,165 @@ +# nj_ccap_eligible: SPMUnit, bool, MONTH +# Combines: has_eligible_child & income_eligible & asset_eligible & activity_eligible +# +# 2026 FPG (Contiguous US): first_person = 15_960, additional = 5_680 +# Family of 2: 21_640; 200% = 43_280 + +- name: Case 1, basic eligible family. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Has eligible child (age 4, dependent, citizen) + # Income 30_000 <= 43_280 (200% FPL) -> income eligible + # Assets default 0 <= 1_000_000 -> asset eligible + # weekly_hours_worked defaults to 40 >= 30 -> activity eligible + nj_ccap_eligible: true + +- name: Case 2, no eligible child makes family ineligible. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + immigration_status: CITIZEN + person2: + age: 15 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Child age 15 >= 13 -> not eligible child + nj_ccap_eligible: false + +- name: Case 3, income too high for initial applicant. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 50_000 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + # 50_000 > 43_280 (200% FPL for family of 2) -> income ineligible + nj_ccap_eligible: false + +- name: Case 4, activity ineligible parent. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + immigration_status: CITIZEN + weekly_hours_worked: 20 + is_full_time_student: false + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Parent works 20 hrs < 30 hrs minimum, not student -> activity ineligible + nj_ccap_eligible: false + +- name: Case 5, full time student meets activity requirement. + period: 2026-01 + input: + people: + person1: + age: 22 + employment_income: 15_000 + immigration_status: CITIZEN + weekly_hours_worked: 0 + is_full_time_student: true + person2: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Student exemption -> activity eligible + nj_ccap_eligible: true + +- name: Case 6, non-NJ family gets false. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + person2: + age: 4 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: PA + output: + nj_ccap_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_eligible_child.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_eligible_child.yaml new file mode 100644 index 00000000000..648e0819de3 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_eligible_child.yaml @@ -0,0 +1,156 @@ +# nj_ccap_eligible_child: Person, bool, MONTH +# Child must be: age < 13 (or < 19 if special needs), dependent, immigration eligible +# Age threshold params: child = 13, special_needs = 19 + +- name: Case 1, child age 4 is eligible. + period: 2026-01 + input: + people: + person1: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_eligible_child: true + +- name: Case 2, child age 12 is eligible. + period: 2026-01 + input: + people: + person1: + age: 12 + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_eligible_child: true + +- name: Case 3, child age 13 is ineligible. + period: 2026-01 + input: + people: + person1: + age: 13 + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_eligible_child: false + +- name: Case 4, child age 14 is ineligible. + period: 2026-01 + input: + people: + person1: + age: 14 + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_eligible_child: false + +- name: Case 5, disabled child age 13 is eligible. + period: 2026-01 + input: + people: + person1: + age: 13 + is_disabled: true + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_eligible_child: true + +- name: Case 6, disabled child age 18 is eligible. + period: 2026-01 + input: + people: + person1: + age: 18 + is_disabled: true + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_eligible_child: true + +- name: Case 7, disabled child age 19 is ineligible. + period: 2026-01 + input: + people: + person1: + age: 19 + is_disabled: true + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_eligible_child: false + +- name: Case 8, non-dependent child is ineligible. + period: 2026-01 + input: + people: + person1: + age: 5 + is_tax_unit_dependent: false + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_eligible_child: false + +- name: Case 9, undocumented child is ineligible. + period: 2026-01 + input: + people: + person1: + age: 5 + is_tax_unit_dependent: true + immigration_status: UNDOCUMENTED + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_eligible_child: false + +- name: Case 10, adult age 30 is ineligible. + period: 2026-01 + input: + people: + person1: + age: 30 + is_tax_unit_dependent: false + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_eligible_child: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_income_eligible.yaml new file mode 100644 index 00000000000..0433e5f9204 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_income_eligible.yaml @@ -0,0 +1,190 @@ +# nj_ccap_income_eligible: SPMUnit, bool, MONTH +# Initial (not enrolled): income <= FPL * 2.0 (200% FPL) +# Continuing (enrolled): income <= FPL * 2.5 (250% FPL) +# Exit: income <= SMI * 0.85 +# +# 2026 FPG (Contiguous US): first_person = 15_960, additional = 5_680 +# Family of 2: 15_960 + 5_680 = 21_640 +# Family of 3: 15_960 + 2*5_680 = 27_320 +# Family of 4: 15_960 + 3*5_680 = 33_000 +# +# 200% FPL family of 2: 21_640 * 2 = 43_280 +# 250% FPL family of 2: 21_640 * 2.5 = 54_100 + +- name: Case 1, initial applicant at 150% FPL is eligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 32_460 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + # 32_460 / 12 = 2_705/mo; FPG fam of 2 = 21_640 + # 200% FPL = 43_280; 32_460 <= 43_280 -> eligible + nj_ccap_income_eligible: true + +- name: Case 2, initial applicant exactly at 200% FPL is eligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 43_280 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + # 43_280 = 200% FPL family of 2 -> exactly at limit -> eligible + nj_ccap_income_eligible: true + +- name: Case 3, initial applicant above 200% FPL is ineligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 43_281 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + # 43_281 > 43_280 (200% FPL) -> ineligible for initial + nj_ccap_income_eligible: false + +- name: Case 4, enrolled family at 220% FPL is eligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 47_608 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + nj_ccap_enrolled: true + households: + household: + members: [person1, person2] + state_code: NJ + output: + # 47_608 = ~220% FPL; enrolled -> limit is 250% = 54_100 + # 47_608 <= 54_100 -> eligible + nj_ccap_income_eligible: true + +- name: Case 5, enrolled family exactly at 250% FPL is eligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 54_100 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + nj_ccap_enrolled: true + households: + household: + members: [person1, person2] + state_code: NJ + output: + # 54_100 = 250% FPL family of 2; enrolled -> limit is 54_100 + # 54_100 <= 54_100 -> eligible + nj_ccap_income_eligible: true + +- name: Case 6, enrolled family above 250% FPL is ineligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 54_101 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + nj_ccap_enrolled: true + households: + household: + members: [person1, person2] + state_code: NJ + output: + # 54_101 > 54_100 (250% FPL) -> ineligible even for continuing + nj_ccap_income_eligible: false + +- name: Case 7, zero income is eligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + # $0 <= 43_280 (200% FPL) -> eligible + nj_ccap_income_eligible: true + +- name: Case 8, family of 4 at 200% FPL boundary. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 66_000 + person2: + age: 32 + person3: + age: 8 + person4: + age: 5 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: NJ + output: + # FPG family of 4 = 33_000; 200% = 66_000 + # 66_000 <= 66_000 -> eligible + nj_ccap_income_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_maximum_weekly_benefit.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_maximum_weekly_benefit.yaml new file mode 100644 index 00000000000..74d2429763b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_maximum_weekly_benefit.yaml @@ -0,0 +1,275 @@ +# nj_ccap_maximum_weekly_benefit: Person, float, MONTH +# Looks up rate by provider_type x quality_rating x age_group x time_category. +# Rates effective 2025-03-01 (CC-230). +# Person-level variable: returns the max weekly reimbursement for each child. + +- name: Case 1, licensed center FT base infant. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 1 + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_maximum_weekly_benefit: 366.67 + +- name: Case 2, licensed center PT base infant. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 1 + childcare_hours_per_week: 20 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_maximum_weekly_benefit: 183.34 + +- name: Case 3, licensed center FT 3-star preschool. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 3 + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: STAR_3 + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_maximum_weekly_benefit: 305.27 + +- name: Case 4, licensed center FT 5-star toddler. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 2 + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: STAR_5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_maximum_weekly_benefit: 356.97 + +- name: Case 5, licensed center FT base school age. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 8 + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_maximum_weekly_benefit: 274.96 + +- name: Case 6, licensed center FT 5-star school age gets base rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 8 + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: STAR_5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + # School-age always gets base rate regardless of quality rating + nj_ccap_maximum_weekly_benefit: 274.96 + +- name: Case 7, registered family FT base infant. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 1 + childcare_hours_per_week: 35 + nj_ccap_provider_type: REGISTERED_FAMILY + nj_ccap_grow_nj_kids_rating: NONE + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_maximum_weekly_benefit: 281.19 + +- name: Case 8, registered family PT 4-star preschool. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 4 + childcare_hours_per_week: 20 + nj_ccap_provider_type: REGISTERED_FAMILY + nj_ccap_grow_nj_kids_rating: STAR_4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_maximum_weekly_benefit: 152.64 + +- name: Case 9, approved home FT infant. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 1 + childcare_hours_per_week: 35 + nj_ccap_provider_type: APPROVED_HOME + nj_ccap_grow_nj_kids_rating: NONE + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_maximum_weekly_benefit: 139.39 + +- name: Case 10, approved home PT school age. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 8 + childcare_hours_per_week: 20 + nj_ccap_provider_type: APPROVED_HOME + nj_ccap_grow_nj_kids_rating: NONE + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_maximum_weekly_benefit: 59.39 + +- name: Case 11, ACA summer camp FT school age. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 8 + childcare_hours_per_week: 35 + nj_ccap_provider_type: ACA_SUMMER_CAMP + nj_ccap_grow_nj_kids_rating: NONE + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_maximum_weekly_benefit: 288.70 + +- name: Case 12, ACA summer camp FT school age special needs. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 8 + is_disabled: true + childcare_hours_per_week: 35 + nj_ccap_provider_type: ACA_SUMMER_CAMP + nj_ccap_grow_nj_kids_rating: NONE + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_maximum_weekly_benefit: 366.65 + +- name: Case 13, licensed center FT base special needs infant. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 1 + is_disabled: true + childcare_hours_per_week: 35 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_maximum_weekly_benefit: 440.01 + +- name: Case 14, licensed center PT base special needs school age. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 10 + is_disabled: true + childcare_hours_per_week: 20 + nj_ccap_provider_type: LICENSED_CENTER + nj_ccap_grow_nj_kids_rating: NONE + is_tax_unit_dependent: true + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: NJ + output: + # 5-18 yr Special Needs PT base: $174.60 + nj_ccap_maximum_weekly_benefit: 174.60 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_time_category.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_time_category.yaml new file mode 100644 index 00000000000..8c5031ed0a4 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_time_category.yaml @@ -0,0 +1,83 @@ +# nj_ccap_time_category: Person, Enum, MONTH +# NJ has binary FT/PT only (unlike RI which has 4 tiers). +# Time authorization thresholds (from time_authorization/thresholds.yaml): +# 0 hours -> PART_TIME (index 1) +# 30+ hours -> FULL_TIME (index 0) + +- name: Case 1, full time 35 hours per week. + period: 2026-01 + input: + people: + person1: + childcare_hours_per_week: 35 + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_time_category: FULL_TIME + +- name: Case 2, full time exactly 30 hours per week. + period: 2026-01 + input: + people: + person1: + childcare_hours_per_week: 30 + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_time_category: FULL_TIME + +- name: Case 3, part time 29 hours per week. + period: 2026-01 + input: + people: + person1: + childcare_hours_per_week: 29 + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_time_category: PART_TIME + +- name: Case 4, part time 15 hours per week. + period: 2026-01 + input: + people: + person1: + childcare_hours_per_week: 15 + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_time_category: PART_TIME + +- name: Case 5, part time zero hours per week. + period: 2026-01 + input: + people: + person1: + childcare_hours_per_week: 0 + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_time_category: PART_TIME + +- name: Case 6, full time 40 hours per week. + period: 2026-01 + input: + people: + person1: + childcare_hours_per_week: 40 + households: + household: + members: [person1] + state_code: NJ + output: + nj_ccap_time_category: FULL_TIME diff --git a/policyengine_us/variables/gov/states/nj/njdhs/ccap/copay/nj_ccap_copay.py b/policyengine_us/variables/gov/states/nj/njdhs/ccap/copay/nj_ccap_copay.py new file mode 100644 index 00000000000..e4646166321 --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/ccap/copay/nj_ccap_copay.py @@ -0,0 +1,53 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.nj.njdhs.ccap.nj_ccap_time_category import ( + NJCCAPTimeCategory, +) + + +class nj_ccap_copay(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "New Jersey CCAP family co-payment" + definition_period = MONTH + defined_for = StateCode.NJ + reference = ( + "https://www.childcarenj.gov/ChildCareNJ/media/media_library/Copayment_Schedule.pdf#page=1", + "https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=40", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.nj.njdhs.ccap.copay + is_homeless = spm_unit.household("is_homeless", period.this_year) + countable_income = spm_unit("nj_ccap_countable_income", period) + fpg = spm_unit("spm_unit_fpg", period) + fpl_ratio = where(fpg > 0, countable_income / fpg, 0) + + person = spm_unit.members + is_eligible_child = person("nj_ccap_eligible_child", period) + time_category = person("nj_ccap_time_category", period) + is_ft = time_category == NJCCAPTimeCategory.FULL_TIME + + n_eligible = spm_unit.sum(is_eligible_child) + n_ft = spm_unit.sum(is_eligible_child & is_ft) + has_second_child = n_eligible >= 2 + + # First child rate: use FT rate if any child is FT, else PT + first_child_rate = where( + n_ft > 0, + p.first_child_ft_rate.calc(fpl_ratio), + p.first_child_pt_rate.calc(fpl_ratio), + ) + + # Second child rate: FT only if 2+ FT children, otherwise PT + second_child_rate = where( + n_ft >= 2, + p.second_child_ft_rate.calc(fpl_ratio), + p.second_child_pt_rate.calc(fpl_ratio), + ) + + total_rate = first_child_rate + where(has_second_child, second_child_rate, 0) + capped_rate = min_(total_rate, p.max_rate) + # copay = annual_income * rate / 12 = monthly_income * rate + monthly_copay = countable_income * capped_rate + return where(is_homeless, 0, monthly_copay) diff --git a/policyengine_us/variables/gov/states/nj/njdhs/ccap/eligibility/nj_ccap_activity_eligible.py b/policyengine_us/variables/gov/states/nj/njdhs/ccap/eligibility/nj_ccap_activity_eligible.py new file mode 100644 index 00000000000..635a838d325 --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/ccap/eligibility/nj_ccap_activity_eligible.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class nj_ccap_activity_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for New Jersey CCAP based on activity requirements" + definition_period = MONTH + defined_for = StateCode.NJ + reference = ( + "https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-15-5-2", + "https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=14", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.nj.njdhs.ccap.activity_requirements + 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) + meets_work_requirement = hours_worked >= p.weekly_hours + is_student = person("is_full_time_student", period.this_year) + individually_eligible = meets_work_requirement | is_student + return spm_unit.sum(is_head_or_spouse & ~individually_eligible) == 0 diff --git a/policyengine_us/variables/gov/states/nj/njdhs/ccap/eligibility/nj_ccap_eligible.py b/policyengine_us/variables/gov/states/nj/njdhs/ccap/eligibility/nj_ccap_eligible.py new file mode 100644 index 00000000000..3eee86c6e7f --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/ccap/eligibility/nj_ccap_eligible.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class nj_ccap_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for New Jersey CCAP" + definition_period = MONTH + defined_for = StateCode.NJ + reference = ( + "https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-15-5-2", + "https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=14", + ) + + def formula(spm_unit, period, parameters): + has_eligible_child = add(spm_unit, period, ["nj_ccap_eligible_child"]) > 0 + income_eligible = spm_unit("nj_ccap_income_eligible", period) + asset_eligible = spm_unit("is_ccdf_asset_eligible", period.this_year) + activity_eligible = spm_unit("nj_ccap_activity_eligible", period) + return has_eligible_child & income_eligible & asset_eligible & activity_eligible diff --git a/policyengine_us/variables/gov/states/nj/njdhs/ccap/eligibility/nj_ccap_eligible_child.py b/policyengine_us/variables/gov/states/nj/njdhs/ccap/eligibility/nj_ccap_eligible_child.py new file mode 100644 index 00000000000..9c05fd038a1 --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/ccap/eligibility/nj_ccap_eligible_child.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class nj_ccap_eligible_child(Variable): + value_type = bool + entity = Person + label = "Eligible child for New Jersey CCAP" + definition_period = MONTH + defined_for = StateCode.NJ + reference = ( + "https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-15-5-2", + "https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=14", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.nj.njdhs.ccap.age_threshold + age = person("age", period.this_year) + is_disabled = person("is_disabled", period.this_year) + age_eligible = where(is_disabled, age < p.special_needs, age < p.child) + is_dependent = person("is_tax_unit_dependent", period.this_year) + immigration_eligible = person( + "is_ccdf_immigration_eligible_child", period.this_year + ) + return age_eligible & is_dependent & immigration_eligible diff --git a/policyengine_us/variables/gov/states/nj/njdhs/ccap/eligibility/nj_ccap_income_eligible.py b/policyengine_us/variables/gov/states/nj/njdhs/ccap/eligibility/nj_ccap_income_eligible.py new file mode 100644 index 00000000000..1f76d38dafe --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/ccap/eligibility/nj_ccap_income_eligible.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class nj_ccap_income_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for New Jersey CCAP based on income" + definition_period = MONTH + defined_for = StateCode.NJ + reference = ( + "https://www.childcarenj.gov/ChildCareNJ/media/media_library/Income_Eligibility_Schedule.pdf", + "https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=23", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.nj.njdhs.ccap.income.fpl_rate + countable_income = spm_unit("nj_ccap_countable_income", period) + fpg = spm_unit("spm_unit_fpg", period) + enrolled = spm_unit("nj_ccap_enrolled", period) + initial_limit = fpg * p.initial_eligibility + continuing_limit = fpg * p.continuing_eligibility + fpl_limit = where(enrolled, continuing_limit, initial_limit) + smi = spm_unit("nj_ccap_smi", period) + return (countable_income <= fpl_limit) & (countable_income <= smi) diff --git a/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap.py b/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap.py new file mode 100644 index 00000000000..dd2bcd08eed --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap.py @@ -0,0 +1,28 @@ +from policyengine_us.model_api import * + + +class nj_ccap(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "New Jersey CCAP benefit amount" + definition_period = MONTH + defined_for = "nj_ccap_eligible" + reference = ( + "https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-15-5-2", + "https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=14", + ) + + def formula(spm_unit, period, parameters): + copay = spm_unit("nj_ccap_copay", period) + maximum_weekly_benefit = add( + spm_unit, period, ["nj_ccap_maximum_weekly_benefit"] + ) + maximum_monthly_benefit = maximum_weekly_benefit * ( + WEEKS_IN_YEAR / MONTHS_IN_YEAR + ) + pre_subsidy_childcare_expenses = spm_unit( + "spm_unit_pre_subsidy_childcare_expenses", period + ) + uncapped = max_(pre_subsidy_childcare_expenses - copay, 0) + return min_(uncapped, maximum_monthly_benefit) diff --git a/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_age_group.py b/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_age_group.py new file mode 100644 index 00000000000..73d7444719e --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_age_group.py @@ -0,0 +1,35 @@ +from policyengine_us.model_api import * + + +class NJCCAPAgeGroup(Enum): + INFANT = "Infant (Birth to 17 Months)" + INFANT_SN = "Infant with Special Needs" + TODDLER = "Toddler (18 to 29 Months)" + TODDLER_SN = "Toddler with Special Needs" + PRESCHOOL = "Preschool (30 Months to 5 Years)" + PRESCHOOL_SN = "Preschool with Special Needs" + SCHOOL_AGE = "School Age (5 to 13 Years)" + SCHOOL_AGE_SN = "School Age with Special Needs" + + +class nj_ccap_age_group(Variable): + value_type = Enum + entity = Person + possible_values = NJCCAPAgeGroup + default_value = NJCCAPAgeGroup.PRESCHOOL + definition_period = MONTH + label = "New Jersey CCAP age group" + defined_for = StateCode.NJ + reference = "https://www.childcarenj.gov/ChildCareNJ/media/media_library/Max_CC_Payment_Rates.pdf#page=1" + + def formula(person, period, parameters): + p = parameters(period).gov.states.nj.njdhs.ccap.age_group + age_in_months = person("age", period.this_year) * MONTHS_IN_YEAR + base_group = p.months.calc(age_in_months) + is_disabled = person("is_disabled", period.this_year) + # base_group: 0=INFANT, 1=TODDLER, 2=PRESCHOOL, 3=SCHOOL_AGE + # SN variants are at indices: 1=INFANT_SN, 3=TODDLER_SN, 5=PRESCHOOL_SN, 7=SCHOOL_AGE_SN + # Standard variants at: 0=INFANT, 2=TODDLER, 4=PRESCHOOL, 6=SCHOOL_AGE + standard_index = base_group * 2 + sn_index = standard_index + 1 + return where(is_disabled, sn_index, standard_index) diff --git a/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_countable_income.py b/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_countable_income.py new file mode 100644 index 00000000000..7580d533e2b --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_countable_income.py @@ -0,0 +1,13 @@ +from policyengine_us.model_api import * + + +class nj_ccap_countable_income(Variable): + value_type = float + entity = SPMUnit + label = "New Jersey CCAP countable income" + definition_period = MONTH + unit = USD + defined_for = StateCode.NJ + reference = "https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=23" + + adds = "gov.states.nj.njdhs.ccap.income.countable_income.sources" diff --git a/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_enrolled.py b/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_enrolled.py new file mode 100644 index 00000000000..4ff163cbd9c --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_enrolled.py @@ -0,0 +1,9 @@ +from policyengine_us.model_api import * + + +class nj_ccap_enrolled(Variable): + value_type = bool + entity = SPMUnit + definition_period = MONTH + label = "Whether the family is currently enrolled in New Jersey CCAP" + defined_for = StateCode.NJ diff --git a/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_grow_nj_kids_rating.py b/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_grow_nj_kids_rating.py new file mode 100644 index 00000000000..67165a26109 --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_grow_nj_kids_rating.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class NJCCAPGrowNJKidsRating(Enum): + NONE = "No Rating" + STAR_3 = "3-Star" + STAR_4 = "4-Star" + STAR_5 = "5-Star" + + +class nj_ccap_grow_nj_kids_rating(Variable): + value_type = Enum + entity = Person + possible_values = NJCCAPGrowNJKidsRating + default_value = NJCCAPGrowNJKidsRating.NONE + definition_period = MONTH + label = "New Jersey CCAP Grow NJ Kids quality rating" + defined_for = StateCode.NJ + reference = "https://www.childcarenj.gov/ChildCareNJ/media/media_library/Max_CC_Payment_Rates.pdf#page=1" diff --git a/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_maximum_weekly_benefit.py b/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_maximum_weekly_benefit.py new file mode 100644 index 00000000000..b857d528e12 --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_maximum_weekly_benefit.py @@ -0,0 +1,42 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.nj.njdhs.ccap.nj_ccap_provider_type import ( + NJCCAPProviderType, +) + + +class nj_ccap_maximum_weekly_benefit(Variable): + value_type = float + entity = Person + unit = USD + label = "New Jersey CCAP maximum weekly benefit per child" + definition_period = MONTH + defined_for = "nj_ccap_eligible_child" + reference = "https://www.childcarenj.gov/ChildCareNJ/media/media_library/Max_CC_Payment_Rates.pdf#page=1" + + def formula(person, period, parameters): + p = parameters(period).gov.states.nj.njdhs.ccap.rates + provider_type = person("nj_ccap_provider_type", period) + time_category = person("nj_ccap_time_category", period) + age_group = person("nj_ccap_age_group", period) + grow_nj_kids_rating = person("nj_ccap_grow_nj_kids_rating", period) + + center_rate = p.licensed_center[time_category][grow_nj_kids_rating][age_group] + family_rate = p.registered_family[time_category][grow_nj_kids_rating][age_group] + home_rate = p.approved_home[time_category][age_group] + camp_rate = p.aca_summer_camp[time_category][age_group] + + return select( + [ + provider_type == NJCCAPProviderType.LICENSED_CENTER, + provider_type == NJCCAPProviderType.REGISTERED_FAMILY, + provider_type == NJCCAPProviderType.APPROVED_HOME, + provider_type == NJCCAPProviderType.ACA_SUMMER_CAMP, + ], + [ + center_rate, + family_rate, + home_rate, + camp_rate, + ], + default=center_rate, + ) diff --git a/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_provider_type.py b/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_provider_type.py new file mode 100644 index 00000000000..e50efce90d5 --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_provider_type.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class NJCCAPProviderType(Enum): + LICENSED_CENTER = "Licensed Center" + REGISTERED_FAMILY = "Registered Family" + APPROVED_HOME = "Approved Home" + ACA_SUMMER_CAMP = "ACA Summer Camp" + + +class nj_ccap_provider_type(Variable): + value_type = Enum + entity = Person + possible_values = NJCCAPProviderType + default_value = NJCCAPProviderType.LICENSED_CENTER + definition_period = MONTH + label = "New Jersey CCAP child care provider type" + defined_for = StateCode.NJ + reference = "https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-15-5-2" diff --git a/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_smi.py b/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_smi.py new file mode 100644 index 00000000000..c060d22e26e --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_smi.py @@ -0,0 +1,28 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.hhs.hhs_smi import smi + + +class nj_ccap_smi(Variable): + value_type = float + entity = SPMUnit + label = "New Jersey CCAP 85% State Median Income exit threshold" + unit = USD + definition_period = MONTH + defined_for = StateCode.NJ + reference = ( + "https://www.childcarenj.gov/ChildCareNJ/media/media_library/Income_Eligibility_Schedule.pdf", + "https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=34", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.nj.njdhs.ccap.income.fpl_rate + year = period.start.year + month = period.start.month + if month >= 10: + instant_str = f"{year}-10-01" + else: + instant_str = f"{year - 1}-10-01" + size = spm_unit("spm_unit_size", period.this_year) + state = spm_unit.household("state_code_str", period.this_year) + annual_smi = smi(size, state, instant_str, parameters) + return annual_smi * p.smi_exit / MONTHS_IN_YEAR diff --git a/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_time_category.py b/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_time_category.py new file mode 100644 index 00000000000..d0ea9afb112 --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/ccap/nj_ccap_time_category.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class NJCCAPTimeCategory(Enum): + FULL_TIME = "Full Time" + PART_TIME = "Part Time" + + +class nj_ccap_time_category(Variable): + value_type = Enum + entity = Person + possible_values = NJCCAPTimeCategory + default_value = NJCCAPTimeCategory.FULL_TIME + definition_period = MONTH + label = "New Jersey CCAP time authorization category" + defined_for = StateCode.NJ + reference = "https://www.childcarenj.gov/ChildCareNJ/media/media_library/Max_CC_Payment_Rates.pdf#page=1" + + def formula(person, period, parameters): + hours = person("childcare_hours_per_week", period.this_year) + p = parameters(period).gov.states.nj.njdhs.ccap.time_authorization + return p.thresholds.calc(hours) diff --git a/policyengine_us/variables/gov/states/nj/njdhs/nj_child_care_subsidies.py b/policyengine_us/variables/gov/states/nj/njdhs/nj_child_care_subsidies.py new file mode 100644 index 00000000000..83803de6bfe --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/nj_child_care_subsidies.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class nj_child_care_subsidies(Variable): + value_type = float + entity = SPMUnit + label = "New Jersey child care subsidies" + unit = USD + definition_period = YEAR + defined_for = StateCode.NJ + adds = ["nj_ccap"] diff --git a/sources/working_references.md b/sources/working_references.md new file mode 100644 index 00000000000..14de2e5b5b1 --- /dev/null +++ b/sources/working_references.md @@ -0,0 +1,658 @@ +# New Jersey Child Care Assistance Program (NJ CCAP) - Working References + +## Official Program Name +**New Jersey Child Care Assistance Program (CCAP)** — formerly known as "New Jersey Cares for Kids (NJCK)" + +Administered by: NJ Department of Human Services, Division of Family Development (DFD) + +--- + +## Primary Regulatory Authority + +### N.J.A.C. 10:15 — Child Care Services +- **Full chapter PDF (blocked)**: https://www.nj.gov/humanservices/providers/rulefees/regs/NJAC%2010_15%20Child%20Care%20Services.pdf + - Status: Returns 404/HTML — NJ.gov blocks automated downloads +- **Cornell Law (accessible)**: + - N.J.A.C. 10:15-5.2 (At Risk Child Care eligibility): https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-15-5-2 + - N.J.A.C. 10:15-5.3 (CCDBG eligibility): https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-15-5-3 + - N.J.A.C. 10:15-9.1 (Co-payment): https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-15-9-1 + +### CCDF State Plan for New Jersey FFY 2025-2027 +- **PDF (downloaded, 2.9MB, ~300 pages)**: https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf +- Local copy: `/tmp/nj-ccdf-state-plan-ffy25-27.pdf` → text at `/tmp/nj-ccdf-state-plan.txt` (16,095 lines) +- Key sections: + - Section 2.2 — Eligible Children and Families (p.14+) + - Section 2.2.4 — Initial eligibility: income limits (p.23) + - Section 2.5 — Promoting Continuity of Care (p.34) + - Section 3.1 — Family Co-payments (p.40) + - Section 3.2 — Calculation of Co-Payment (p.42) + - Section 3.3 — Waiving Family Co-payment (p.43) + +--- + +## Income Eligibility Schedule (CC-229) +- **PDF (downloaded, 773KB, 1 page)**: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Income_Eligibility_Schedule.pdf +- Local copy: `/tmp/nj-income-eligibility-schedule.pdf` → text at `/tmp/nj-income-eligibility-schedule.txt` +- 300 DPI screenshot: `/tmp/nj-income-elig-page-1.png` +- **Effective: March 1, 2026** (form CC-229, dated 03/26) +- **Source for FPL**: HHS Poverty Guidelines, Federal Register Vol. 91, No. 10, January 15, 2026, Page 1798 +- **Source for Tier E (85% SMI)**: Census Bureau Median Family Income by Family Size, Department of Justice, Cases Filed On or After November 1, 2025 + +### Income Tiers (Annual Gross Family Income) + +| Family Size | Tier A (100% FPL) | Tier B (150% FPL) | Tier C (175% FPL) | Tier D (200% FPL) - Initial Eligibility | Tier E* (250% FPL) - Redetermination | 85% NJ SMI | 350% FPL (Kinship <60) | 500% FPL (Kinship >=60) | +|---|---|---|---|---|---|---|---|---| +| 1 | $15,960 | $23,940 | $27,930 | $31,920 | $39,900 | $72,197 | $55,860 | $79,800 | +| 2 | $21,640 | $32,460 | $37,870 | $43,280 | $54,100 | $88,516 | $75,740 | $108,200 | +| 3 | $27,320 | $40,980 | $47,810 | $54,640 | $68,300 | $113,577 | $95,620 | $136,600 | +| 4 | $33,000 | $49,500 | $57,750 | $66,000 | $82,500 | $139,244 | $115,500 | $165,000 | +| 5 | $38,680 | $58,020 | $67,690 | $77,360 | $96,700 | $148,679 | $135,380 | $193,400 | +| 6 | $44,360 | $66,540 | $77,630 | $88,720 | $110,900 | $158,114 | $155,260 | $221,800 | +| 7 | $50,040 | $75,060 | $87,570 | $100,080 | $125,100 | $167,549 | $175,140 | $250,200 | +| 8 | $55,720 | $83,580 | $97,510 | $111,440 | $139,300 | $176,984 | $195,020 | $278,600 | +| 9 | $61,400 | $92,100 | $107,450 | $122,800 | $153,500 | $186,419 | $214,900 | $307,000 | +| 10 | $67,080 | $100,620 | $117,390 | $134,160 | $167,700 | $195,854 | $234,780 | $335,400 | +| 11 | $72,760 | $109,140 | $127,330 | $145,520 | $181,900 | $205,289 | $254,660 | $363,800 | +| 12 | $78,440 | $117,660 | $137,270 | $156,880 | $196,100 | $214,724 | $274,540 | $392,200 | +| Each add'l | +$5,680 | +$8,520 | +$9,940 | +$11,360 | +$14,200 | +$9,435 | +$19,880 | +$28,400 | + +*Tier E = one-time Graduated Phase-Out period (one year of additional assistance when income exceeds 250% FPL but remains below 85% SMI) + +### Eligibility Thresholds Summary +- **Initial eligibility**: 200% FPL (Tier D) +- **Continuing eligibility at redetermination**: 250% FPL (Tier E) +- **Graduated phase-out (exit threshold)**: 85% of NJ State Median Income +- **Federal maximum**: 85% SMI + +--- + +## Copayment Schedule (CC-236) +- **PDF (downloaded, 220KB, 2 pages)**: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Copayment_Schedule.pdf +- Local copy: `/tmp/nj-copayment-schedule.pdf` → text at `/tmp/nj-copayment-schedule.txt` +- 300 DPI screenshots: `/tmp/nj-copay-page-1.png` (101%-200% FPL), `/tmp/nj-copay-page-2.png` (201%+ FPL) +- **Effective: March 1, 2026** (form CC-236, dated 03/26) + +### Copayment Structure + +**Families at or below 100% FPL**: Copayment WAIVED ($0) + +**Families at 101% FPL to 200% FPL** (Page 1 of copay schedule): + +| Care Type | 1 Child | 2 Children | +|---|---|---| +| Full-Time (30+ hrs/week) - Weekly | 4.0% of annual income ÷ 52 | 6.0% of annual income ÷ 52 | +| Full-Time - Monthly | 4.0% of annual income ÷ 12 | 6.0% of annual income ÷ 12 | +| Part-Time (<30 hrs/week) - Weekly | 2.0% of annual income ÷ 52 | 3.0% of annual income ÷ 52 | +| Part-Time - Monthly | 2.0% of annual income ÷ 12 | 3.0% of annual income ÷ 12 | +| One FT / One PT (2 children only) - Weekly | N/A | 5.0% of annual income ÷ 52 | +| One FT / One PT (2 children only) - Monthly | N/A | 5.0% of annual income ÷ 12 | + +**Families at 201% FPL or Greater** (Page 2 of copay schedule): + +| Care Type | 1 Child | 2 Children | +|---|---|---| +| Full-Time (30+ hrs/week) - Weekly | 5.0% of annual income ÷ 52 | 7.0% of annual income ÷ 52 | +| Full-Time - Monthly | 5.0% of annual income ÷ 12 | 7.0% of annual income ÷ 12 | +| Part-Time (<30 hrs/week) - Weekly | 2.5% of annual income ÷ 52 | 3.5% of annual income ÷ 52 | +| Part-Time - Monthly | 2.5% of annual income ÷ 12 | 3.5% of annual income ÷ 12 | +| One FT / One PT (2 children only) - Weekly | N/A | 6.0% of annual income ÷ 52 | +| One FT / One PT (2 children only) - Monthly | N/A | 6.0% of annual income ÷ 12 | + +### Copayment Formula +``` +Weekly copay = (annual_gross_income * copay_percentage) / 52 +Monthly copay = (annual_gross_income * copay_percentage) / 12 +``` + +### Copayment Verification Examples (from CC-236 PDF, 101%-200% FPL tier) +- Income $22,000, 1 child FT weekly: $22,000 × 4% ÷ 52 = $16.92 ✓ +- Income $55,000, 2 children FT weekly: $55,000 × 6% ÷ 52 = $63.46 ✓ +- Income $40,000, 1 child PT weekly: $40,000 × 2% ÷ 52 = $15.38 ✓ +- Income $91,000, 2 children mixed weekly: $91,000 × 5% ÷ 52 = $87.50 ✓ + +### Copayment Exemptions +- Families at or below 100% FPL: copayment waived +- Children under child protective services (CPS): copayment exempt +- Third and subsequent children: no additional copayment charged (NJAC 10:15-9.1) +- CCDF State Plan confirms max copay is **5% of gross income** (below federal 7% cap) + +### Copayment History +- Copayments suspended from COVID-19 onset through June 30, 2024 +- Copayments reinstated August 1, 2024 +- Current schedule effective March 1, 2026 + +--- + +## Maximum Child Care Payment Rates (CC-230) +- **PDF (downloaded, 1.2MB, 8 pages)**: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Max_CC_Payment_Rates.pdf +- Local copy: `/tmp/nj-max-cc-payment-rates.pdf` → text at `/tmp/nj-max-cc-payment-rates.txt` +- 300 DPI screenshots: `/tmp/nj-rates-page-1.png` (Licensed Centers), `/tmp/nj-rates-page-2.png` (Registered Family) +- **Effective: March 1, 2025** (form CC-230, dated 02/25) +- Pages 5-8 are Spanish translations of pages 1-4 + +### Provider Types (4 categories) +1. **Licensed Child Care Centers** (page 1) — base rates + 3/4/5-star Grow NJ Kids differentials +2. **Registered Family Child Care Homes** (page 2) — base rates + 3/4/5-star Grow NJ Kids differentials +3. **Approved Homes (FFN & In-Home)** (page 3) — single rate tier +4. **ACA Summer Youth Camps** (page 4) — school-age only + +### Age Groups +- Birth to 17 Months (Infants) +- Birth to 17 Months w/Special Needs +- 18 to 29 Months (Toddlers) +- 18 to 29 Months w/Special Needs +- 30 Months to 5 Years (Preschool) +- 30 Months to 5 Years w/Special Needs +- 5 to 13 Years (School-Age) +- 5 to 18 Years w/Special Needs (School-Age) + +### Care Types +- Full Time: 30 or more hours per week +- Part Time: less than 30 hours per week + +### Rate Periods +- Monthly, Weekly, Daily + +### Licensed Child Care Center Rates (Base — No Grow NJ Kids Rating) + +| Age Group | FT Monthly | FT Weekly | FT Daily | PT Monthly | PT Weekly | PT Daily | +|---|---|---|---|---|---|---| +| Birth-17 mo | $1,587.69 | $366.67 | $73.33 | $793.85 | $183.34 | $36.67 | +| Birth-17 mo Special Needs | $1,905.23 | $440.01 | $88.00 | $952.61 | $220.00 | $44.00 | +| 18-29 mo | $1,414.00 | $326.56 | $65.31 | $707.00 | $163.28 | $32.66 | +| 18-29 mo Special Needs | $1,696.80 | $391.87 | $78.37 | $848.40 | $195.94 | $39.19 | +| 30 mo-5 yr | $1,262.50 | $291.57 | $58.31 | $631.25 | $145.79 | $29.16 | +| 30 mo-5 yr Special Needs | $1,603.38 | $370.29 | $74.06 | $801.69 | $185.15 | $37.03 | +| 5-13 yr | $1,190.56 | $274.96 | $54.99 | $595.28 | $137.48 | $27.50 | +| 5-18 yr Special Needs | $1,512.02 | $349.20 | $69.84 | $756.01 | $174.60 | $34.92 | + +### Registered Family Child Care Home Rates (Base — No Grow NJ Kids Rating) + +| Age Group | FT Monthly | FT Weekly | FT Daily | PT Monthly | PT Weekly | PT Daily | +|---|---|---|---|---|---|---| +| Birth-17 mo | $1,217.56 | $281.19 | $56.24 | $608.78 | $140.60 | $28.12 | +| Birth-17 mo Special Needs | $1,367.88 | $315.91 | $63.18 | $683.94 | $157.95 | $31.59 | +| 18-29 mo | $1,217.56 | $281.19 | $56.24 | $608.78 | $140.60 | $28.12 | +| 18-29 mo Special Needs | $1,367.88 | $315.91 | $63.18 | $683.94 | $157.95 | $31.59 | +| 30 mo-5 yr | $1,067.23 | $246.47 | $49.29 | $533.62 | $123.24 | $24.65 | +| 30 mo-5 yr Special Needs | $1,217.56 | $281.19 | $56.24 | $608.78 | $140.60 | $28.12 | +| 5-13 yr | $1,061.95 | $245.25 | $49.05 | $530.98 | $122.63 | $24.53 | +| 5-18 yr Special Needs | $1,211.53 | $279.80 | $55.96 | $605.77 | $139.90 | $27.98 | + +### Approved Home Rates (FFN & In-Home — Single Tier) + +| Age Group | FT Monthly | FT Weekly | FT Daily | PT Monthly | PT Weekly | PT Daily | +|---|---|---|---|---|---|---| +| Birth-17 mo | $603.56 | $139.39 | $27.88 | $301.78 | $69.70 | $13.94 | +| Birth-17 mo Special Needs | $687.56 | $158.79 | $31.76 | $343.78 | $79.39 | $15.88 | +| 18-29 mo | $603.56 | $139.39 | $27.88 | $301.78 | $69.70 | $13.94 | +| 18-29 mo Special Needs | $687.56 | $158.79 | $31.76 | $343.78 | $79.39 | $15.88 | +| 30 mo-5 yr | $514.36 | $118.79 | $23.76 | $257.18 | $59.39 | $11.88 | +| 30 mo-5 yr Special Needs | $603.56 | $139.39 | $27.88 | $301.78 | $69.70 | $13.94 | +| 5-13 yr | $514.36 | $118.79 | $23.76 | $257.18 | $59.39 | $11.88 | +| 5-18 yr Special Needs | $603.56 | $139.39 | $27.88 | $301.78 | $69.70 | $13.94 | + +### Special Notes on Rates +- Parents may choose a provider charging more than maximum rates; they are responsible for the difference +- A 13-year-old child is only eligible if they turn 13 during an eligibility period (not at initial eligibility, unless special needs) +- Grow NJ Kids rated providers receive higher rates (3-star, 4-star, 5-star tiers) + +--- + +## Activity Requirements + +### Initial Eligibility (CCDF State Plan Section 2.2, N.J.A.C. 10:15-5.2, 10:15-5.3) +- **Work**: Full-time employment = 30 or more hours per week +- **Education**: Full-time enrollment = 12 or more credit hours (Spring/Fall); 9 hours (Summer per some CCR&Rs) +- **Job Training**: 20 or more class hours per week +- **Combination**: Work + school/training totaling full-time equivalent (30+ hours) +- **Two-parent households**: Each parent must independently meet activity requirements + +### At Redetermination +- **Work**: 20 or more hours per week (reduced from 30 at initial) +- **Education/Training**: Same as initial + +### Exemptions from Activity Requirement +- Children identified by Child Protective & Permanency (CP&P) as abused/neglected: no employment requirement for CP&P At-Home cases +- TANF recipients: broader range of qualifying activities + +--- + +## Other Eligibility Requirements + +### Residency +- Must be a New Jersey resident + +### Citizenship +- Child must be a U.S. citizen or qualified non-citizen +- Social Security number required for child (not for applicant) + +### Age of Child +- Under age 13 (or under age 19 if special needs or under state protective supervision) +- A child turning 13 during an eligibility period can continue; a family cannot begin at initial eligibility for a 13-year-old (unless special needs) + +### Assets +- Family assets must not exceed $1,000,000 + +### 12-Month Eligibility Period +- Eligibility is determined for a minimum of 12 months +- Income changes during the 12-month period do not affect eligibility as long as income remains below 85% SMI + +--- + +## Income Definition (CCDF State Plan Section 2.2.4c) +Income includes: +- Gross wages or salary +- Disability or unemployment compensation +- Workers' compensation +- Spousal support, child support +- Survivor and retirement benefits +- Pensions or annuities +- Inheritance +- Any other source required for federal and state tax reporting + +Income does NOT include: +- Public assistance (TANF cash benefits) + +--- + +## Parent Handbook +- **PDF (downloaded, 7MB)**: http://www.bccap.org/wp-content/uploads/2024/04/IT-24-06-Attachment-1_CC-233_NJ-CCAP_Parent_Handbook-Eng.pdf +- Local copy: `/tmp/nj-ccap-parent-handbook.pdf` → text at `/tmp/nj-ccap-parent-handbook.txt` + +--- + +## Additional References + +### Rutgers Center for Women and Work - Research Brief (March 2025) +- **PDF**: https://smlr.rutgers.edu/sites/default/files/Documents/Centers/CWW/Publications/RCWW-109_Child_Care_Subsidy_Income_March2025.pdf +- Analysis of NJ child care subsidy income eligibility thresholds + +### CCDF Provider Payment Rates by State (January 2025) +- **PDF**: https://acf.gov/sites/default/files/documents/occ/CCDF-Provider-Payment-Rates-by-State.pdf + +### Child Care Connection NJ (Mercer County CCR&R) +- Program overview: https://childcareconnection-nj.org/families/financial-assistance/nj-cares-for-kids/ +- FAQ: https://childcareconnection-nj.org/families/financial-assistance/faq/ + +### CCR NJ (Monmouth County) +- Program details with income table: https://ccrnj.org/families/financial-assistance-2/new-jersey-cares-for-kids-njck/ + +### LSNJLAW (Legal Services of NJ) +- Program overview: https://www.lsnjlaw.org/legal-topics/government-aid-services/child-care/pages/new-jersey-cares-for-kids-aspx + +### Official CCAP Pages (childcarenj.gov — blocked by Cloudflare 403) +- Help Paying for Child Care: https://www.childcarenj.gov/parents/ccap +- Important Information: https://www.childcarenj.gov/Parents/CCAP/ImportantInfo +- Copayment Calculator: https://www.childcarenj.gov/calculator + +--- + +## Failed/Blocked Fetches + +| URL | Status | Likely Content | +|---|---|---| +| https://www.childcarenj.gov/parents/ccap | 403 (Cloudflare) | Main CCAP eligibility page with copayment tier details | +| https://www.childcarenj.gov/Parents/CCAP/ImportantInfo | 403 (Cloudflare) | Detailed copayment tiers, activity requirements, income thresholds | +| https://www.childcarenj.gov/calculator | 403 (Cloudflare) | Interactive copayment/eligibility calculator | +| https://www.nj.gov/humanservices/providers/rulefees/regs/NJAC%2010_15%20Child%20Care%20Services.pdf | 404/HTML | Full text of N.J.A.C. 10:15 administrative code | +| https://www.nj.gov/humanservices/providers/rulefees/regs/rulesfiles/NJAC%2010_15%20CHILD%20CARE%20SERVICES.PDF | 404/HTML | Alternate link for NJAC 10:15 full text | + +--- + +## Important Information - Child Care In New Jersey (childcarenj.gov) +- **Source URL**: https://childcarenj.gov/Parents/CCAP/ImportantInfo +- **Date printed**: 3/19/26 (page headers); content last updated 10/8/25 (page 7 footer) +- **7 pages** of policy summaries about CCAP + +### Copayment (Copay) (#page=1) + +Federal law requires families receiving child care assistance to share in the cost using a sliding fee scale. The fee is known as copayment or copay. + +**Factors determining copayment amount:** +- Household income +- Family size +- Hours of care (part-time or full-time) +- Number of children receiving services through CCAP + +**Three income thresholds for copayment assessment:** +1. At or below 100% FPL +2. Income at 101% up to 200% FPL +3. At or above 201% FPL + +#### Copayment Percentages + +**Family income at or below 100% FPL:** + +| | Full-Time | | Part-Time | | One FT / One PT | +|---|---|---|---|---|---| +| | 1 Child | 2+ Children | 1 Child | 2+ Children | 2+ Children | +| | waived | waived | waived | waived | waived | + +**Family income 101% to 200% FPL:** + +| | Full-Time | | Part-Time | | One FT / One PT | +|---|---|---|---|---|---| +| | 1 Child | 2+ Children | 1 Child | 2+ Children | 2+ Children | +| | 4% of income | 6% of income | 2% of income | 3% of income | 5% of income | + +**Family income 201% FPL or greater:** + +| | Full-Time | | Part-Time | | One FT / One PT | +|---|---|---|---|---|---| +| | 1 Child | 2+ Children | 1 Child | 2+ Children | 2+ Children | +| | 5% of income | 7% of income | 2.5% of income | 3.5% of income | 6% of income | + +#### How to Calculate Copayment (#page=2) +- Automatically calculated and printed on PAPA issued by CCR&R +- Can contact local CCR&R +- Estimate by multiplying monthly income by applicable percentage +- Can review Copayment Schedule + +**Important Reminder**: Copayments are based on household income, family size, hours of care (part-time or full-time), and number of children receiving assistance (whether 1 or 2). + +#### Overage +The state has set payment rates for CCAP. If a provider charges more than the state rate, the family is responsible for the difference ("overage"). This is separate from the copay and other provider fees (e.g., field trips, late fees). Providers may choose to waive or negotiate the overage. + +#### Copayment Frequency +Copayment is for the time period indicated on the PAPA. The family pays copayment directly to the provider. Frequency (weekly, monthly, etc.) is discussed with the provider. + +### Copayment Examples (#page=2-3) + +**Example One** (page 2): 1 parent + 1 child (family size 2), income $31,000/year ($2,583/month), income between 101%-200% FPL, 1 child in full-time care. +- Copay rate: 4% of annual gross income +- Annual copay: $31,000 x 4% = $1,240 +- Monthly copay: $1,240 / 12 = $103.33 + +| Ages of Children | Provider Monthly Rate | CCAP Payment Rate* | Overage | Monthly Copayment | Total Family Cost | +|---|---|---|---|---|---| +| Infant | $1,700.00 | $1,587.69 | $112.31 | $103.33 | $215.64 | + +**Example Two** (page 2): 2 parents + 2 children (family size 4), income $61,000/year ($5,083/month), income between 101%-200% FPL, 1 child FT + 1 child PT. +- Copay rate: 5% (4% first child + 1% second child) of annual gross income +- Annual copay: $61,000 x 5% = $3,050 +- Monthly copay: $3,050 / 12 = $254.17 + +| Ages of Children | Provider Monthly Rate | CCAP Payment Rate* | Overage | +|---|---|---|---| +| Infant (P/T) | $900.00 | $793.85 | $106.15 | +| Preschool | $1,300.00 | $1,262.50 | $37.50 | +| **Monthly Copayment** | | | **$254.17** | +| **Total Family Cost** | | | **$397.82** | + +**Example Three** (page 3): 2 parents + 3 children (family size 5), income $91,000/year ($7,583/month), income above 200% FPL, 3 children in full-time care. +- Copay rate: 7% (5% first child + 2% second child + 0% third child) of annual gross income +- Annual copay: $91,000 x 7% = $6,370 +- Monthly copay: $6,370 / 12 = $530.83 + +| Ages of Children | Provider Monthly Rate | CCAP Payment Rate* | Overage | +|---|---|---|---| +| Toddler | $1,500.00 | $1,414.00 | $86.00 | +| Preschooler 1 | $1,300.00 | $1,262.50 | $37.50 | +| Preschooler 2 | $1,300.00 | $1,262.50 | $37.50 | +| **Monthly Copayment** | | | **$530.83** | +| **Total Family Cost** | | | **$691.83** | + +*All three examples use the licensed child care provider rate. + +**Key insight from examples**: Third child copay is $0 (0% additional). The copay for 2+ children = first child's rate + 1% for the second child (at 101-200% FPL) or + 2% for the second child (at 201%+ FPL). No additional copay for 3rd+ children. + +### 12-Month Eligibility (#page=3) + +Families meeting all CCAP eligibility requirements at initial application or redetermination receive a **12-month eligibility period**. During this period, services continue even with temporary changes in family income or work/school/job training schedule. + +Families can request less than 12 months if a shorter period is more appropriate (e.g., summer only). + +**Mandatory reporting during 12-month period:** +- Family gross annual income exceeds 85% of SMI → immediately ineligible +- Family moved to another county +- Family changes child care providers +- Family is no longer using child care +- Child no longer lives with parent/applicant +- Family moved out of state + +Changes must be reported to CCR&R within **10 business days**. + +### Continued Eligibility at Redetermination (#page=3-4) + +To continue CCAP after the 12-month period, submit Application for Redetermination and all supporting documentation within **30 calendar days** from the Notice of Redetermination. + +#### Income Requirements at Redetermination +- **At or below 250% FPL**: Remain eligible (if all other requirements met) +- **Exceeds 250% FPL but below 85% SMI**: Granted **1 year** of additional assistance (Graduated Phase-Out Period) — one-time only +- **Exceeds 85% SMI**: No longer eligible (must notify CCR&R within 10 calendar days) + +#### Income Limits (2025-2026) (#page=4) + +| Family Size | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | +|---|---|---|---|---|---|---|---|---|---|---| +| 250% FPL | $39,125 | $52,875 | $66,625 | $80,375 | $94,125 | $107,875 | $121,625 | $135,375 | $149,125 | $162,875 | +| 85% SMI | $69,567 | $84,962 | $108,303 | $134,671 | $143,086 | $151,501 | $159,916 | $168,331 | $176,746 | $185,161 | + +- 250% FPL based on 2025-2026 Federal Poverty Index. Each additional person above 10: +$13,750 +- 85% SMI based on 2025-2026 State Median Income. Each additional person above 10: +$8,415 + +**NOTE**: These are 2025-2026 values from the Important Information page. The Income Eligibility Schedule (CC-229) shows **2026** values (effective March 1, 2026) with slightly different FPL figures (e.g., family of 4 at 250% FPL = $82,500 vs. $80,375 here). The CC-229 values supersede these for 2026. + +#### Employment, School, or Job Training Hours Requirements (#page=4) +- **Employment**: Minimum 20 hours/week. **EFFECTIVE OCTOBER 1, 2025: INCREASES TO MINIMUM 25 HOURS PER WEEK.** +- **School**: Minimum 12+ credit hours per term (or equivalent CEUs) in a 2-year Associate's or 4-year Bachelor's program, or 9+ credit hours during summer semester. + - Online/distance-learning asynchronous coursework: limited to 6 credit hours/semester (full-time) or 3 credit hours/semester (part-time or summer) +- **Job training**: Minimum 20 hours/week + +#### Termination Reasons at Redetermination (#page=4) +- Family income exceeds 85% SMI +- Applicant/co-applicant does not meet employment/school/job training requirements +- Employment/school/job training could not be verified +- Family no longer resides in NJ or county of application +- Child no longer meets age requirement +- Redetermination application not completed within 30 calendar days +- PAPA not signed and returned within 10 calendar days +- Delinquent on CCAP repayment agreement +- Funding unavailable (placed on waiting list) + +### Graduated Phase-Out (#page=5) + +One-year period of continued assistance when income exceeds 250% FPL but remains below 85% SMI at redetermination. Can only be granted **one time**. If income exceeds 85% SMI, must notify CCR&R within 10 days. + +Income limits table at 250% FPL and 85% SMI same as above (2025-2026 values). + +### County-to-County Transfers (#page=5) +- Must report move to CCR&R within 10 business days +- 12-month eligibility not interrupted +- Sending CCR&R must transfer case info to receiving CCR&R 60 days before 12-month service end date + +### Acceptable Documentation (#page=6) +- CCR&R provides Documentation Checklist for missing documentation +- Pending applications maintained for max 45 calendar days; denied if documentation not submitted by 45th day + +### Verification Requirements (#page=6-7) + +**Work/School/Job Training Minimum**: 30 hours per week combined (for initial eligibility) + +#### Verifying Work Hours +- Must submit proof of at least 4 weeks of employment at minimum 30 hours/week +- The 4 weeks can occur in the 6 weeks before application or 6 weeks after application received +- Alternative: CC-188 Verification of Employment form from employer if paystubs don't reflect hours/gross income or for new employment +- Paystubs must be submitted within 60 days of CCR&R certification date + +#### Verifying School/Job Training +- School registration document, schedule, or letter from job training program +- Alternative: CC-189 Verification of School or Training form +- Must attend college/university in 2-year Associate or 4-year Baccalaureate program with goal of degree/credentials +- Online courses allowed: max 2 online classes FT, 1 online class PT per semester +- NOTE: Even if school/training alone satisfies hours, CCR&R must inquire about potential earned income + +#### Verifying Self-Employment (#page=7) +- Must submit IRS Income Tax Return Transcript and Schedule C (Form 1040) or Schedule C-EZ +- Profit must be ≥ federal minimum wage when evaluated +- New business without tax filing cannot form basis of eligibility +- Schedule C / Schedule C-EZ are the only forms accepted + +#### Verification of Unearned Income (#page=7) +Sources include: Unemployment Benefits, Child Support, Alimony, SSI, SSDI, Pensions, Retirement Benefits, Worker's Compensation, WFNJ TANF cash assistance + +### Families Experiencing Homelessness (#page=7) +- Prioritized services for homeless children/families +- Definition: lacking fixed, adequate nighttime residence (shared housing, motels, shelters, cars, parks, etc.) +- **6-month grace period** to submit documentation while child receives services +- May substitute housing search or job search hours for work/school/training requirement + +--- + +## Maximum Child Care Payment Rates - CC-230 (childcarenj.gov) +- **Source URL**: https://childcarenj.gov/parents/ccap +- **Effective: March 1, 2025** (form CC-230, dated 02/25) +- **8 pages**: 4 English pages (Licensed Centers, Registered Family, Approved Homes, ACA Summer Camps) + 4 Spanish translations + +### General Notes +- Full-Time Care = 30 hours or more per week +- Part-Time Care = less than 30 hours per week +- Rate periods: Monthly, Weekly, Daily +- Parents may select a provider charging above maximum rates; they are responsible for all excess costs plus the copayment +- A 13-year-old child is only eligible if they turn 13 during an eligibility period (not at initial eligibility, except special needs) +- Grow NJ Kids quality ratings (3-Star, 4-Star, 5-Star) provide tiered rate increases above base rates + +### Page 1: Licensed Child Care Center Rates (#page=1) + +#### Base Licensed Child Care Center Rates (No Grow NJ Kids Rating) + +| Age Group | FT Monthly | FT Weekly | FT Daily | PT Monthly | PT Weekly | PT Daily | +|---|---|---|---|---|---|---| +| Birth to 17 Months | $1,587.69 | $366.67 | $73.33 | $793.85 | $183.34 | $36.67 | +| Birth to 17 Months w/Special Needs | $1,905.23 | $440.01 | $88.00 | $952.61 | $220.00 | $44.00 | +| 18 to 29 Months | $1,414.00 | $326.56 | $65.31 | $707.00 | $163.28 | $32.66 | +| 18 to 29 Months w/Special Needs | $1,696.80 | $391.87 | $78.37 | $848.40 | $195.94 | $39.19 | +| 30 Months to 5 Years | $1,262.50 | $291.57 | $58.31 | $631.25 | $145.79 | $29.16 | +| 30 Months to 5 Years w/Special Needs | $1,603.38 | $370.29 | $74.06 | $801.69 | $185.15 | $37.03 | +| 5 to 13 Years | $1,190.56 | $274.96 | $54.99 | $595.28 | $137.48 | $27.50 | +| 5 to 18 Years w/Special Needs | $1,512.02 | $349.20 | $69.84 | $756.01 | $174.60 | $34.92 | + +#### 3-Star Grow NJ Kids Rated Licensed Child Care Center Rates + +| Age Group | FT Monthly | FT Weekly | FT Daily | PT Monthly | PT Weekly | PT Daily | +|---|---|---|---|---|---|---| +| Birth to 17 Months | $1,694.41 | $391.32 | $78.26 | $847.20 | $195.66 | $39.13 | +| Birth to 17 Months w/Special Needs | $2,033.29 | $469.58 | $93.92 | $1,016.65 | $234.79 | $46.96 | +| 18 to 29 Months | $1,459.06 | $336.96 | $67.39 | $729.53 | $168.48 | $33.70 | +| 18 to 29 Months w/Special Needs | $1,750.87 | $404.36 | $80.87 | $875.43 | $202.18 | $40.44 | +| 30 Months to 5 Years | $1,321.84 | $305.27 | $61.05 | $660.92 | $152.64 | $30.53 | +| 30 Months to 5 Years w/Special Needs | $1,678.73 | $387.70 | $77.54 | $839.37 | $193.85 | $38.77 | +| 5 to 13 Years | — | — | — | — | — | — | +| 5 to 18 Years w/Special Needs | — | — | — | — | — | — | + +**Note**: School-age (5-13) and school-age special needs (5-18) do NOT have 3/4/5-Star rated tiers per the PDF — only base rates are listed for these age groups. + +#### 4-Star Grow NJ Kids Rated Licensed Child Care Center Rates + +| Age Group | FT Monthly | FT Weekly | FT Daily | PT Monthly | PT Weekly | PT Daily | +|---|---|---|---|---|---|---| +| Birth to 17 Months | $1,741.84 | $402.27 | $80.45 | $870.92 | $201.14 | $40.23 | +| Birth to 17 Months w/Special Needs | $2,090.21 | $482.73 | $96.55 | $1,045.11 | $241.36 | $48.27 | +| 18 to 29 Months | $1,496.81 | $345.68 | $69.14 | $748.40 | $172.84 | $34.57 | +| 18 to 29 Months w/Special Needs | $1,796.17 | $414.82 | $82.96 | $898.09 | $207.41 | $41.48 | +| 30 Months to 5 Years | $1,354.02 | $312.71 | $62.54 | $677.01 | $156.35 | $31.27 | +| 30 Months to 5 Years w/Special Needs | $1,719.60 | $397.14 | $79.43 | $859.80 | $198.57 | $39.71 | + +#### 5-Star Grow NJ Kids Rated Licensed Child Care Center Rates + +| Age Group | FT Monthly | FT Weekly | FT Daily | PT Monthly | PT Weekly | PT Daily | +|---|---|---|---|---|---|---| +| Birth to 17 Months | $1,803.10 | $416.42 | $83.28 | $901.55 | $208.21 | $41.64 | +| Birth to 17 Months w/Special Needs | $2,163.71 | $499.70 | $99.94 | $1,081.86 | $249.85 | $49.97 | +| 18 to 29 Months | $1,545.67 | $356.97 | $71.39 | $772.84 | $178.48 | $35.70 | +| 18 to 29 Months w/Special Needs | $1,854.81 | $428.36 | $85.67 | $927.40 | $214.18 | $42.84 | +| 30 Months to 5 Years | $1,395.74 | $322.34 | $64.47 | $697.87 | $161.17 | $32.23 | +| 30 Months to 5 Years w/Special Needs | $1,772.59 | $409.37 | $81.87 | $886.29 | $204.69 | $40.94 | + +### Page 2: Registered Family Child Care Home Rates (#page=2) + +#### Base Registered Family Child Care Home Rates (No Grow NJ Kids Rating) + +| Age Group | FT Monthly | FT Weekly | FT Daily | PT Monthly | PT Weekly | PT Daily | +|---|---|---|---|---|---|---| +| Birth to 17 Months | $1,217.56 | $281.19 | $56.24 | $608.78 | $140.60 | $28.12 | +| Birth to 17 Months w/Special Needs | $1,367.88 | $315.91 | $63.18 | $683.94 | $157.95 | $31.59 | +| 18 to 29 Months | $1,217.56 | $281.19 | $56.24 | $608.78 | $140.60 | $28.12 | +| 18 to 29 Months w/Special Needs | $1,367.88 | $315.91 | $63.18 | $683.94 | $157.95 | $31.59 | +| 30 Months to 5 Years | $1,067.23 | $246.47 | $49.29 | $533.62 | $123.24 | $24.65 | +| 30 Months to 5 Years w/Special Needs | $1,217.56 | $281.19 | $56.24 | $608.78 | $140.60 | $28.12 | +| 5 to 13 Years | $1,061.95 | $245.25 | $49.05 | $530.98 | $122.63 | $24.53 | +| 5 to 18 Years w/Special Needs | $1,211.53 | $279.80 | $55.96 | $605.77 | $139.90 | $27.98 | + +#### 3-Star Grow NJ Kids Rated Family Child Care Home Rates + +| Age Group | FT Monthly | FT Weekly | FT Daily | PT Monthly | PT Weekly | PT Daily | +|---|---|---|---|---|---|---| +| Birth to 17 Months | $1,400.25 | $323.38 | $64.68 | $700.13 | $161.69 | $32.34 | +| Birth to 17 Months w/Special Needs | $1,420.16 | $327.98 | $65.60 | $710.08 | $163.99 | $32.80 | +| 18 to 29 Months | $1,322.13 | $305.34 | $61.07 | $661.07 | $152.67 | $30.53 | +| 18 to 29 Months w/Special Needs | $1,374.41 | $317.42 | $63.48 | $687.21 | $158.71 | $31.74 | +| 30 Months to 5 Years | $1,269.84 | $293.27 | $58.65 | $634.92 | $146.63 | $29.33 | +| 30 Months to 5 Years w/Special Needs | $1,322.13 | $305.34 | $61.07 | $661.07 | $152.67 | $30.53 | +| 5 to 13 Years | — | — | — | — | — | — | +| 5 to 18 Years w/Special Needs | — | — | — | — | — | — | + +**Note**: School-age (5-13) and school-age special needs (5-18) do NOT have 3/4/5-Star rated tiers for registered family homes — only base rates. + +#### 4-Star Grow NJ Kids Rated Family Child Care Home Rates + +| Age Group | FT Monthly | FT Weekly | FT Daily | PT Monthly | PT Weekly | PT Daily | +|---|---|---|---|---|---|---| +| Birth to 17 Months | $1,452.54 | $335.46 | $67.09 | $726.27 | $167.73 | $33.55 | +| Birth to 17 Months w/Special Needs | $1,472.44 | $340.06 | $68.01 | $736.22 | $170.03 | $34.01 | +| 18 to 29 Months | $1,374.11 | $317.35 | $63.47 | $687.06 | $158.67 | $31.73 | +| 18 to 29 Months w/Special Needs | $1,426.69 | $329.49 | $65.90 | $713.35 | $164.74 | $32.95 | +| 30 Months to 5 Years | $1,321.83 | $305.27 | $61.05 | $660.92 | $152.64 | $30.53 | +| 30 Months to 5 Years w/Special Needs | $1,374.11 | $317.35 | $63.47 | $687.06 | $158.67 | $31.73 | + +#### 5-Star Grow NJ Kids Rated Family Child Care Home Rates + +| Age Group | FT Monthly | FT Weekly | FT Daily | PT Monthly | PT Weekly | PT Daily | +|---|---|---|---|---|---|---| +| Birth to 17 Months | $1,514.23 | $349.71 | $69.94 | $757.12 | $174.85 | $34.97 | +| Birth to 17 Months w/Special Needs | $1,524.73 | $352.13 | $70.43 | $762.37 | $176.07 | $35.21 | +| 18 to 29 Months | $1,435.80 | $331.59 | $66.32 | $717.90 | $165.80 | $33.16 | +| 18 to 29 Months w/Special Needs | $1,488.38 | $343.74 | $68.75 | $744.19 | $171.87 | $34.37 | +| 30 Months to 5 Years | $1,383.52 | $319.52 | $63.90 | $691.76 | $159.76 | $31.95 | +| 30 Months to 5 Years w/Special Needs | $1,435.80 | $331.59 | $66.32 | $717.90 | $165.80 | $33.16 | + +### Page 3: Approved Home Rates — FFN & In-Home Providers (#page=3) + +Single rate tier (no Grow NJ Kids quality rating tiers). + +| Age Group | FT Monthly | FT Weekly | FT Daily | PT Monthly | PT Weekly | PT Daily | +|---|---|---|---|---|---|---| +| Birth to 17 Months | $603.56 | $139.39 | $27.88 | $301.78 | $69.70 | $13.94 | +| Birth to 17 Months w/Special Needs | $687.56 | $158.79 | $31.76 | $343.78 | $79.39 | $15.88 | +| 18 to 29 Months | $603.56 | $139.39 | $27.88 | $301.78 | $69.70 | $13.94 | +| 18 to 29 Months w/Special Needs | $687.56 | $158.79 | $31.76 | $343.78 | $79.39 | $15.88 | +| 30 Months to 5 Years | $514.36 | $118.79 | $23.76 | $257.18 | $59.39 | $11.88 | +| 30 Months to 5 Years w/Special Needs | $603.56 | $139.39 | $27.88 | $301.78 | $69.70 | $13.94 | +| 5 to 13 Years | $514.36 | $118.79 | $23.76 | $257.18 | $59.39 | $11.88 | +| 5 to 18 Years w/Special Needs | $603.56 | $139.39 | $27.88 | $301.78 | $69.70 | $13.94 | + +### Page 4: ACA Summer Youth Camp Rates (#page=4) + +American Camping Association (ACA) Summer Youth Camp — school-age only, single rate tier. + +| Age Group | FT Monthly | FT Weekly | FT Daily | PT Monthly | PT Weekly | PT Daily | +|---|---|---|---|---|---|---| +| 5 to 13 Years | $1,250.09 | $288.70 | $57.74 | $625.05 | $144.35 | $28.87 | +| 5 to 18 Years w/Special Needs | $1,587.62 | $366.65 | $73.33 | $793.81 | $183.33 | $36.67 | + +### Rate Structure Summary + +**4 provider types** with varying quality tiers: +1. **Licensed Child Care Centers**: Base + 3-Star + 4-Star + 5-Star (for ages birth through preschool/special needs; school-age only at base) +2. **Registered Family Child Care Homes**: Base + 3-Star + 4-Star + 5-Star (same age restriction for quality tiers) +3. **Approved Homes (FFN & In-Home)**: Base only (no quality tiers) +4. **ACA Summer Youth Camps**: Base only (school-age only) + +**8 age groups**: Infant (0-17 mo), Infant Special Needs, Toddler (18-29 mo), Toddler Special Needs, Preschool (30 mo-5 yr), Preschool Special Needs, School-Age (5-13 yr), School-Age Special Needs (5-18 yr) + +**2 care types**: Full-Time (30+ hrs/week), Part-Time (<30 hrs/week) + +**3 rate periods**: Monthly, Weekly, Daily + +**Special needs surcharge**: Approximately 20% above standard rates for licensed centers; varies by age group for other provider types From 37f0ce20ef5afb19605a0532a281696b09e64b90 Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 19 Mar 2026 13:49:52 -0400 Subject: [PATCH 3/7] Add changelog fragment for NJ CCAP Co-Authored-By: Claude Opus 4.6 (1M context) --- changelog.d/nj-ccap.added.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/nj-ccap.added.md diff --git a/changelog.d/nj-ccap.added.md b/changelog.d/nj-ccap.added.md new file mode 100644 index 00000000000..bc5e2f13340 --- /dev/null +++ b/changelog.d/nj-ccap.added.md @@ -0,0 +1 @@ +Add New Jersey Child Care Assistance Program (CCAP). From 369af1d43bb6e4f1987309ed8d49180ecad86f46 Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 19 Mar 2026 14:41:29 -0400 Subject: [PATCH 4/7] Review-fix round 1: address critical issues from /review-program - Add nj_ccap_smi test coverage (4 test cases) - Activity requirement: 20 hrs at redetermination (was 30 for all) - Fix 3 wrong CCDF State Plan page numbers - Fix 3 wrong N.J.A.C. section citations - Remove incorrect 5% copay cap (CC-236 rates go up to 7% for multi-child) - Remove homeless copay waiver (not in CCDF State Plan) Co-Authored-By: Claude Opus 4.6 (1M context) --- .../activity_requirements/weekly_hours.yaml | 6 +- .../weekly_hours_redetermination.yaml | 11 ++ .../nj/njdhs/ccap/age_threshold/child.yaml | 4 +- .../ccap/age_threshold/special_needs.yaml | 4 +- .../states/nj/njdhs/ccap/copay/max_rate.yaml | 11 -- .../ccap/income/countable_income/sources.yaml | 2 +- .../income/fpl_rate/initial_eligibility.yaml | 2 +- .../gov/states/nj/njdhs/ccap/edge_cases.yaml | 115 +++++++++++------- .../gov/states/nj/njdhs/ccap/integration.yaml | 16 ++- .../states/nj/njdhs/ccap/nj_ccap_copay.yaml | 28 ++--- .../gov/states/nj/njdhs/ccap/nj_ccap_smi.yaml | 101 +++++++++++++++ .../nj/njdhs/ccap/copay/nj_ccap_copay.py | 6 +- .../eligibility/nj_ccap_activity_eligible.py | 7 +- 13 files changed, 210 insertions(+), 103 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/nj/njdhs/ccap/activity_requirements/weekly_hours_redetermination.yaml delete mode 100644 policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/max_rate.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_smi.yaml diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/activity_requirements/weekly_hours.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/activity_requirements/weekly_hours.yaml index 14cc29d91ad..d3464bdfe29 100644 --- a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/activity_requirements/weekly_hours.yaml +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/activity_requirements/weekly_hours.yaml @@ -7,7 +7,5 @@ metadata: period: year label: New Jersey CCAP minimum weekly activity hours reference: - - title: N.J.A.C. 10:15-5.2 - href: https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-15-5-2 - - title: CCDF State Plan for NJ FFY 2025-2027, Section 2.2 - href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=14 + - title: CCDF State Plan for NJ FFY 2025-2027, Section 2.2.2g + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=22 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/activity_requirements/weekly_hours_redetermination.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/activity_requirements/weekly_hours_redetermination.yaml new file mode 100644 index 00000000000..90711de8f5f --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/activity_requirements/weekly_hours_redetermination.yaml @@ -0,0 +1,11 @@ +description: New Jersey sets this amount as the minimum weekly hours of approved activity at redetermination under the Child Care Assistance Program. +values: + 2024-01-01: 20 + +metadata: + unit: hour + period: year + label: New Jersey CCAP minimum weekly activity hours at redetermination + reference: + - title: CCDF State Plan for NJ FFY 2025-2027, Section 2.2.2d + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=22 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/age_threshold/child.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/age_threshold/child.yaml index 0ab7daf3c3f..b85801dcc7d 100644 --- a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/age_threshold/child.yaml +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/age_threshold/child.yaml @@ -7,5 +7,5 @@ metadata: period: year label: New Jersey CCAP child age threshold reference: - - title: N.J.A.C. 10:15-5.2 - href: https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-15-5-2 + - title: CCDF State Plan for NJ FFY 2025-2027, Section 2.2.1 + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=19 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/age_threshold/special_needs.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/age_threshold/special_needs.yaml index 307ebd32c63..2a117863c4e 100644 --- a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/age_threshold/special_needs.yaml +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/age_threshold/special_needs.yaml @@ -7,5 +7,5 @@ metadata: period: year label: New Jersey CCAP special needs child age threshold reference: - - title: N.J.A.C. 10:15-5.2 - href: https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-15-5-2 + - title: CCDF State Plan for NJ FFY 2025-2027, Section 2.2.1b + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=19 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/max_rate.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/max_rate.yaml deleted file mode 100644 index 3f1c5878b03..00000000000 --- a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/max_rate.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: New Jersey limits copayment to this share of gross income under the Child Care Assistance Program. -values: - 2024-01-01: 0.05 - -metadata: - unit: /1 - period: year - label: New Jersey CCAP maximum copayment rate - reference: - - title: CCDF State Plan for NJ FFY 2025-2027, Section 3.1 - href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=40 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/countable_income/sources.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/countable_income/sources.yaml index c3cb3795803..76a35a6809f 100644 --- a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/countable_income/sources.yaml +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/countable_income/sources.yaml @@ -26,4 +26,4 @@ metadata: label: New Jersey CCAP countable income sources reference: - title: CCDF State Plan for NJ FFY 2025-2027, Section 2.2.4c - href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=23 + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=25 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/fpl_rate/initial_eligibility.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/fpl_rate/initial_eligibility.yaml index a5a770ed70a..d35250573f2 100644 --- a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/fpl_rate/initial_eligibility.yaml +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/income/fpl_rate/initial_eligibility.yaml @@ -10,4 +10,4 @@ metadata: - title: CC-229 Income Eligibility Schedule, Tier D (200% FPL) href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Income_Eligibility_Schedule.pdf - title: CCDF State Plan for NJ FFY 2025-2027, Section 2.2.4 - href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=23 + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=24 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/edge_cases.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/edge_cases.yaml index 7a8de21adbe..81d7dcd9b8d 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/edge_cases.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/edge_cases.yaml @@ -462,40 +462,6 @@ # age 18 < 19 -> age eligible with disability nj_ccap_eligible_child: true -# === Homeless family copay waiver === - -- name: Case 21, homeless family copay waived regardless of income. - period: 2026-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 30 - employment_income: 35_000 - immigration_status: CITIZEN - person2: - age: 4 - is_tax_unit_dependent: true - immigration_status: CITIZEN - childcare_hours_per_week: 35 - nj_ccap_provider_type: LICENSED_CENTER - nj_ccap_grow_nj_kids_rating: NONE - tax_units: - tax_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: NJ - is_homeless: true - output: - # Homeless -> copay waived ($0) even though income above 100% FPL - # FPL ratio = 35_000/21_640 = 1.617 -> would be 4% without waiver - nj_ccap_copay: 0 - # === Large family size === - name: Case 22, family of 8 at 200% FPL boundary. @@ -729,20 +695,18 @@ # FPG fam of 5: 38_680; FPL ratio = 50_000/38_680 = 1.293 # 3 children all FT at 101-200%: # first child FT 4% + second child FT 2% + third child 0% = 6% - # Uncapped: 50_000 * 0.06 / 12 = 250 - # Cap: 50_000 * 0.05 / 12 = 208.33 - # copay = min(250, 208.33) = 208.33 - nj_ccap_copay: 208.33 + # copay = 50_000 * 0.06 / 12 = 250 + nj_ccap_copay: 250 # Rates: infant FT base = 366.67; preschool FT base = 291.57; school age FT base = 274.96 nj_ccap_maximum_weekly_benefit: [0, 0, 366.67, 291.57, 274.96] # max annual = (366.67 + 291.57 + 274.96) * 52 = 933.20 * 52 = 48_526.40 - # annual copay = 50_000 * 0.05 = 2_500 (capped) - # uncapped = max(30_000 - 2_500, 0) = 27_500 - # annual benefit = min(27_500, 48_526.40) = 27_500 - # monthly = 27_500 / 12 = 2_291.67 - nj_ccap: 2_291.67 + # annual copay = 50_000 * 0.06 = 3_000 + # uncapped = max(30_000 - 3_000, 0) = 27_000 + # annual benefit = min(27_000, 48_526.40) = 27_000 + # monthly = 27_000 / 12 = 2_250 + nj_ccap: 2_250 # === Activity requirement: hours exactly at boundary === @@ -928,10 +892,8 @@ # n_ft = 1 (person3 only); first child rate = FT 5% # n_ft = 1 < 2; second child rate = PT 1% # total rate = 5% + 1% = 6% - # Uncapped: 75_000 * 0.06 / 12 = 375 - # Cap: 75_000 * 0.05 / 12 = 312.50 - # copay = min(375, 312.50) = 312.50 - nj_ccap_copay: 312.50 + # copay = 75_000 * 0.06 / 12 = 375 + nj_ccap_copay: 375 # === Provider rate: registered family with star rating for school age = base === @@ -1023,3 +985,62 @@ # annual benefit = min(8_000, 7_248.28) = 7_248.28 # monthly = 7_248.28 / 12 = 604.02 nj_ccap: 604.02 + +# === Redetermination activity threshold (20 hours) === + +- name: Case 37, enrolled parent at 25 hours meets redetermination activity requirement. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + immigration_status: CITIZEN + weekly_hours_worked: 25 + is_full_time_student: false + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + nj_ccap_enrolled: true + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Enrolled -> redetermination threshold = 20 hrs; 25 >= 20 -> eligible + nj_ccap_activity_eligible: true + +- name: Case 38, non-enrolled parent at 25 hours fails initial activity requirement. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + immigration_status: CITIZEN + weekly_hours_worked: 25 + is_full_time_student: false + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Not enrolled -> initial threshold = 30 hrs; 25 < 30 -> ineligible + nj_ccap_activity_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/integration.yaml index 4af7b84f402..638040b1d65 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/integration.yaml @@ -226,10 +226,8 @@ # FPL ratio = 66_000 / 33_000 = 2.0 -> at 200% exactly # Threshold for higher tier is 2.0001, so 2.0 < 2.0001 -> 101-200% tier # 2 children both FT -> first child FT 4% + second child FT 2% = 6% - # Uncapped: 66_000 * 0.06 / 12 = 330 - # Cap: 66_000 * 0.05 / 12 = 275 - # copay = min(330, 275) = 275 - nj_ccap_copay: 275 + # copay = 66_000 * 0.06 / 12 = 330 + nj_ccap_copay: 330 # === Provider rates === # Person1 (age 35 = 420 mo >= 60) -> SCHOOL_AGE; Person2 (age 32 = 384 mo >= 60) -> SCHOOL_AGE @@ -241,11 +239,11 @@ # === Benefit === # max annual = (312.71 + 274.96) * 52 = 587.67 * 52 = 30_558.84 - # annual copay = 66_000 * 0.05 = 3_300 (capped) - # uncapped = max(20_000 - 3_300, 0) = 16_700 - # annual benefit = min(16_700, 30_558.84) = 16_700 - # monthly = 16_700 / 12 = 1_391.67 - nj_ccap: 1_391.67 + # annual copay = 66_000 * 0.06 = 3_960 + # uncapped = max(20_000 - 3_960, 0) = 16_040 + # annual benefit = min(16_040, 30_558.84) = 16_040 + # monthly = 16_040 / 12 = 1_336.67 + nj_ccap: 1_336.67 - name: Case 5, enrolled family at 240% FPL continuing eligible. period: 2026-01 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_copay.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_copay.yaml index e5ce852f9b4..81aa5c2baba 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_copay.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_copay.yaml @@ -1,7 +1,7 @@ # nj_ccap_copay: SPMUnit, float, MONTH # Copay = annual_income * copay_percentage / 12 # Copay percentage depends on FPL tier, care type (FT/PT), and child count (1 or 2+). -# Third+ child = $0 additional. Capped at 5% of gross income. +# Third+ child = $0 additional. # # 2026 FPG family of 2: 21_640; family of 4: 33_000; family of 5: 38_680 # Copay rates (bracket thresholds at FPL ratio): @@ -117,10 +117,8 @@ output: # FPG family of 4: 33_000; FPL ratio = 55_000/33_000 = 1.667 # 2 children both FT at 101-200% -> first child 4% + second child 2% = 6% - # Uncapped: 55_000 * 0.06 / 12 = 275 - # Cap: 55_000 * 0.05 / 12 = 229.17 - # copay = min(275, 229.17) = 229.17 - nj_ccap_copay: 229.17 + # copay = 55_000 * 0.06 / 12 = 275 + nj_ccap_copay: 275 - name: Case 4, one child PT at 101-200% FPL. period: 2026-01 @@ -233,10 +231,8 @@ output: # FPG family of 4: 33_000; FPL ratio = 80_000/33_000 = 2.424 # 2 children both FT at 201%+ -> first child 5% + second child 2% = 7% - # Uncapped: 80_000 * 0.07 / 12 = 466.67 - # Cap: 80_000 * 0.05 / 12 = 333.33 - # copay = min(466.67, 333.33) = 333.33 - nj_ccap_copay: 333.33 + # copay = 80_000 * 0.07 / 12 = 466.67 + nj_ccap_copay: 466.67 - name: Case 7, mixed care one FT one PT at 101-200% FPL. period: 2026-01 @@ -327,12 +323,10 @@ output: # FPG family of 5: 38_680; FPL ratio = 91_000/38_680 = 2.352 # 3 children all FT at 201%+ -> first child 5% + second child 2% + third child 0% = 7% - # Uncapped: 91_000 * 0.07 / 12 = 530.83 - # Cap: 91_000 * 0.05 / 12 = 379.17 - # copay = min(530.83, 379.17) = 379.17 - nj_ccap_copay: 379.17 + # copay = 91_000 * 0.07 / 12 = 530.83 + nj_ccap_copay: 530.83 -- name: Case 9, copay capped at 5% of gross income. +- name: Case 9, two children mixed care at 201% FPL. period: 2026-01 absolute_error_margin: 0.01 input: @@ -372,10 +366,8 @@ output: # FPG family of 4: 33_000; FPL ratio = 80_000/33_000 = 2.424 # 1 FT + 1 PT at 201%+ -> first child FT 5% + second child PT 1% = 6% - # Uncapped: 80_000 * 0.06 / 12 = 400 - # Cap: 80_000 * 0.05 / 12 = 333.33 - # copay = min(400, 333.33) = 333.33 - nj_ccap_copay: 333.33 + # copay = 80_000 * 0.06 / 12 = 400 + nj_ccap_copay: 400 - name: Case 10, zero income gives zero copay. period: 2026-01 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_smi.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_smi.yaml new file mode 100644 index 00000000000..a1e4b8ea361 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/ccap/nj_ccap_smi.yaml @@ -0,0 +1,101 @@ +# nj_ccap_smi: SPMUnit, float, MONTH +# 85% of NJ State Median Income, annualized / 12 for monthly comparison. +# Uses federal HHS SMI data with household size adjustments, accessed at +# Oct 1 fiscal-year instant. +# +# For 2026-01 (FY 2026): NJ 4-person base = 160_276 (2025-10-01 HHS data) +# Size adjustments: first_person=0.52, second_to_sixth=0.16 each +# Family of 2: 160_276 * (0.52 + 0.16) * 0.85 / 12 = 7_719.96 +# Family of 4: 160_276 * (0.52 + 0.16*3) * 0.85 / 12 = 11_352.88 + +- name: Case 1, basic SMI lookup for family of 4. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + person2: + age: 32 + person3: + age: 8 + person4: + age: 5 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: NJ + output: + # 160_276 * 1.00 * 0.85 / 12 = 11_352.88 + nj_ccap_smi: 11_352.88 + +- name: Case 2, SMI for family of 2 used for exit threshold. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + # 160_276 * 0.68 * 0.85 / 12 = 7_719.96 + nj_ccap_smi: 7_719.96 + +- name: Case 3, income exceeds 250% FPL but below 85% SMI so FPL is binding. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 60_000 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + nj_ccap_enrolled: true + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Family of 2: 250% FPL = 54_100; 85% SMI annual = 92_640 + # Income 60_000 > 54_100 (FPL fails) but 60_000 < 92_640 (SMI passes) + # FPL is the binding constraint -> ineligible + nj_ccap_income_eligible: false + +- name: Case 4, income below 250% FPL but exceeds 85% SMI so SMI is binding. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 39_000 + person2: + age: 0 + spm_units: + spm_unit: + members: [person1, person2] + nj_ccap_enrolled: true + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Family of 2: 250% FPL = 54_100; 85% SMI annual = 92_640 + # Income 39_000 < 54_100 (FPL passes) and 39_000 < 92_640 (SMI passes) + # Both pass -> eligible (SMI is not binding at this income) + nj_ccap_income_eligible: true diff --git a/policyengine_us/variables/gov/states/nj/njdhs/ccap/copay/nj_ccap_copay.py b/policyengine_us/variables/gov/states/nj/njdhs/ccap/copay/nj_ccap_copay.py index e4646166321..c2d4805afd2 100644 --- a/policyengine_us/variables/gov/states/nj/njdhs/ccap/copay/nj_ccap_copay.py +++ b/policyengine_us/variables/gov/states/nj/njdhs/ccap/copay/nj_ccap_copay.py @@ -18,7 +18,6 @@ class nj_ccap_copay(Variable): def formula(spm_unit, period, parameters): p = parameters(period).gov.states.nj.njdhs.ccap.copay - is_homeless = spm_unit.household("is_homeless", period.this_year) countable_income = spm_unit("nj_ccap_countable_income", period) fpg = spm_unit("spm_unit_fpg", period) fpl_ratio = where(fpg > 0, countable_income / fpg, 0) @@ -47,7 +46,4 @@ def formula(spm_unit, period, parameters): ) total_rate = first_child_rate + where(has_second_child, second_child_rate, 0) - capped_rate = min_(total_rate, p.max_rate) - # copay = annual_income * rate / 12 = monthly_income * rate - monthly_copay = countable_income * capped_rate - return where(is_homeless, 0, monthly_copay) + return countable_income * total_rate diff --git a/policyengine_us/variables/gov/states/nj/njdhs/ccap/eligibility/nj_ccap_activity_eligible.py b/policyengine_us/variables/gov/states/nj/njdhs/ccap/eligibility/nj_ccap_activity_eligible.py index 635a838d325..a34568b4d68 100644 --- a/policyengine_us/variables/gov/states/nj/njdhs/ccap/eligibility/nj_ccap_activity_eligible.py +++ b/policyengine_us/variables/gov/states/nj/njdhs/ccap/eligibility/nj_ccap_activity_eligible.py @@ -8,16 +8,17 @@ class nj_ccap_activity_eligible(Variable): definition_period = MONTH defined_for = StateCode.NJ reference = ( - "https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-15-5-2", - "https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=14", + "https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=22", ) def formula(spm_unit, period, parameters): p = parameters(period).gov.states.nj.njdhs.ccap.activity_requirements + enrolled = spm_unit("nj_ccap_enrolled", period) + min_hours = where(enrolled, p.weekly_hours_redetermination, p.weekly_hours) 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) - meets_work_requirement = hours_worked >= p.weekly_hours + meets_work_requirement = hours_worked >= spm_unit.project(min_hours) is_student = person("is_full_time_student", period.this_year) individually_eligible = meets_work_requirement | is_student return spm_unit.sum(is_head_or_spouse & ~individually_eligible) == 0 From 60203f1707150babffc482f99191e2a4ec8eff48 Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 19 Mar 2026 14:54:56 -0400 Subject: [PATCH 5/7] Fix activity requirement reference citations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - weekly_hours.yaml: Section 2.2.2g → 2.2.2d, #page=22 → #page=21 - weekly_hours_redetermination.yaml: #page=22 → #page=21 Co-Authored-By: Claude Opus 4.6 (1M context) --- .../nj/njdhs/ccap/activity_requirements/weekly_hours.yaml | 4 ++-- .../activity_requirements/weekly_hours_redetermination.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/activity_requirements/weekly_hours.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/activity_requirements/weekly_hours.yaml index d3464bdfe29..83ba41407c1 100644 --- a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/activity_requirements/weekly_hours.yaml +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/activity_requirements/weekly_hours.yaml @@ -7,5 +7,5 @@ metadata: period: year label: New Jersey CCAP minimum weekly activity hours reference: - - title: CCDF State Plan for NJ FFY 2025-2027, Section 2.2.2g - href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=22 + - title: CCDF State Plan for NJ FFY 2025-2027, Section 2.2.2d + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=21 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/activity_requirements/weekly_hours_redetermination.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/activity_requirements/weekly_hours_redetermination.yaml index 90711de8f5f..924a25f25a7 100644 --- a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/activity_requirements/weekly_hours_redetermination.yaml +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/activity_requirements/weekly_hours_redetermination.yaml @@ -8,4 +8,4 @@ metadata: label: New Jersey CCAP minimum weekly activity hours at redetermination reference: - title: CCDF State Plan for NJ FFY 2025-2027, Section 2.2.2d - href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=22 + href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/CCDF_State_Plan_for_New_Jersey_FFY25-27.pdf#page=21 From 60779c85201f75406570bb9a105ac6c609a3e53c Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 19 Mar 2026 20:51:52 -0400 Subject: [PATCH 6/7] Backdate NJ CCAP rates to 2024 and add COVID copay waiver period - Add March 2024 CC-230 rates (effective 2024-01-01) for all 4 provider types - Add COVID copay waiver (rates=0) for 2024-01-01 through 2024-07-31 - Copay reinstated 2024-08-01 per NJ DHS policy - Fixes microsimulation failures for 2024/2025 periods Co-Authored-By: Claude Opus 4.6 (1M context) --- .../njdhs/ccap/copay/first_child_ft_rate.yaml | 8 ++- .../njdhs/ccap/copay/first_child_pt_rate.yaml | 8 ++- .../ccap/copay/second_child_ft_rate.yaml | 8 ++- .../ccap/copay/second_child_pt_rate.yaml | 8 ++- .../nj/njdhs/ccap/rates/aca_summer_camp.yaml | 20 +++++- .../nj/njdhs/ccap/rates/approved_home.yaml | 20 +++++- .../nj/njdhs/ccap/rates/licensed_center.yaml | 68 ++++++++++++++++++- .../njdhs/ccap/rates/registered_family.yaml | 68 ++++++++++++++++++- 8 files changed, 196 insertions(+), 12 deletions(-) diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/first_child_ft_rate.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/first_child_ft_rate.yaml index 0becaacffc5..b8ff4532e10 100644 --- a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/first_child_ft_rate.yaml +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/first_child_ft_rate.yaml @@ -8,6 +8,8 @@ metadata: reference: - title: CC-236 Copayment Schedule href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Copayment_Schedule.pdf#page=1 + - title: NJ DHS Important Information - Copayment + href: https://www.childcarenj.gov/Parents/Important-Information brackets: - threshold: @@ -17,8 +19,10 @@ brackets: - threshold: 2024-01-01: 1.0001 amount: - 2024-01-01: 0.04 + 2024-01-01: 0 + 2024-08-01: 0.04 - threshold: 2024-01-01: 2.0001 amount: - 2024-01-01: 0.05 + 2024-01-01: 0 + 2024-08-01: 0.05 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/first_child_pt_rate.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/first_child_pt_rate.yaml index 3e3f239b1de..d5b0bb045a9 100644 --- a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/first_child_pt_rate.yaml +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/first_child_pt_rate.yaml @@ -8,6 +8,8 @@ metadata: reference: - title: CC-236 Copayment Schedule href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Copayment_Schedule.pdf#page=1 + - title: NJ DHS Important Information - Copayment + href: https://www.childcarenj.gov/Parents/Important-Information brackets: - threshold: @@ -17,8 +19,10 @@ brackets: - threshold: 2024-01-01: 1.0001 amount: - 2024-01-01: 0.02 + 2024-01-01: 0 + 2024-08-01: 0.02 - threshold: 2024-01-01: 2.0001 amount: - 2024-01-01: 0.025 + 2024-01-01: 0 + 2024-08-01: 0.025 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/second_child_ft_rate.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/second_child_ft_rate.yaml index a03d63882f2..2640f0d8227 100644 --- a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/second_child_ft_rate.yaml +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/second_child_ft_rate.yaml @@ -8,6 +8,8 @@ metadata: reference: - title: CC-236 Copayment Schedule href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Copayment_Schedule.pdf#page=1 + - title: NJ DHS Important Information - Copayment + href: https://www.childcarenj.gov/Parents/Important-Information brackets: - threshold: @@ -17,8 +19,10 @@ brackets: - threshold: 2024-01-01: 1.0001 amount: - 2024-01-01: 0.02 + 2024-01-01: 0 + 2024-08-01: 0.02 - threshold: 2024-01-01: 2.0001 amount: - 2024-01-01: 0.02 + 2024-01-01: 0 + 2024-08-01: 0.02 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/second_child_pt_rate.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/second_child_pt_rate.yaml index cb631dfcdeb..2b81806ae70 100644 --- a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/second_child_pt_rate.yaml +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/copay/second_child_pt_rate.yaml @@ -8,6 +8,8 @@ metadata: reference: - title: CC-236 Copayment Schedule href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Copayment_Schedule.pdf#page=1 + - title: NJ DHS Important Information - Copayment + href: https://www.childcarenj.gov/Parents/Important-Information brackets: - threshold: @@ -17,8 +19,10 @@ brackets: - threshold: 2024-01-01: 1.0001 amount: - 2024-01-01: 0.01 + 2024-01-01: 0 + 2024-08-01: 0.01 - threshold: 2024-01-01: 2.0001 amount: - 2024-01-01: 0.01 + 2024-01-01: 0 + 2024-08-01: 0.01 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/aca_summer_camp.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/aca_summer_camp.yaml index fd8f58abbe8..1f70e9f0318 100644 --- a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/aca_summer_camp.yaml +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/aca_summer_camp.yaml @@ -7,41 +7,59 @@ metadata: - nj_ccap_time_category - nj_ccap_age_group reference: - - title: CC-230 Maximum Child Care Payment Rates, ACA Summer Youth Camps + - title: CC-230 (02/25) Maximum Child Care Payment Rates, ACA Summer Youth Camps href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Max_CC_Payment_Rates.pdf#page=4 + - title: CC-230 (02/24) Maximum Child Care Payment Rates, ACA Summer Youth Camps + href: http://www.bccap.org/wp-content/uploads/2024/03/Maximum-Child-Care-Payment-Rates-March-2024.pdf#page=4 FULL_TIME: INFANT: + 2024-01-01: 0 2025-03-01: 0 INFANT_SN: + 2024-01-01: 0 2025-03-01: 0 TODDLER: + 2024-01-01: 0 2025-03-01: 0 TODDLER_SN: + 2024-01-01: 0 2025-03-01: 0 PRESCHOOL: + 2024-01-01: 0 2025-03-01: 0 PRESCHOOL_SN: + 2024-01-01: 0 2025-03-01: 0 SCHOOL_AGE: + 2024-01-01: 287.27 2025-03-01: 288.70 SCHOOL_AGE_SN: + 2024-01-01: 364.83 2025-03-01: 366.65 PART_TIME: INFANT: + 2024-01-01: 0 2025-03-01: 0 INFANT_SN: + 2024-01-01: 0 2025-03-01: 0 TODDLER: + 2024-01-01: 0 2025-03-01: 0 TODDLER_SN: + 2024-01-01: 0 2025-03-01: 0 PRESCHOOL: + 2024-01-01: 0 2025-03-01: 0 PRESCHOOL_SN: + 2024-01-01: 0 2025-03-01: 0 SCHOOL_AGE: + 2024-01-01: 143.63 2025-03-01: 144.35 SCHOOL_AGE_SN: + 2024-01-01: 182.42 2025-03-01: 183.33 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/approved_home.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/approved_home.yaml index 11aafdecd70..fcac031c97b 100644 --- a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/approved_home.yaml +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/approved_home.yaml @@ -7,41 +7,59 @@ metadata: - nj_ccap_time_category - nj_ccap_age_group reference: - - title: CC-230 Maximum Child Care Payment Rates, Approved Homes (FFN and In-Home) + - title: CC-230 (02/25) Maximum Child Care Payment Rates, Approved Homes (FFN and In-Home) href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Max_CC_Payment_Rates.pdf#page=3 + - title: CC-230 (02/24) Maximum Child Care Payment Rates, Approved Homes (FFN and In-Home) + href: http://www.bccap.org/wp-content/uploads/2024/03/Maximum-Child-Care-Payment-Rates-March-2024.pdf#page=3 FULL_TIME: INFANT: + 2024-01-01: 139.39 2025-03-01: 139.39 INFANT_SN: + 2024-01-01: 158.79 2025-03-01: 158.79 TODDLER: + 2024-01-01: 139.39 2025-03-01: 139.39 TODDLER_SN: + 2024-01-01: 158.79 2025-03-01: 158.79 PRESCHOOL: + 2024-01-01: 118.79 2025-03-01: 118.79 PRESCHOOL_SN: + 2024-01-01: 139.39 2025-03-01: 139.39 SCHOOL_AGE: + 2024-01-01: 118.79 2025-03-01: 118.79 SCHOOL_AGE_SN: + 2024-01-01: 139.39 2025-03-01: 139.39 PART_TIME: INFANT: + 2024-01-01: 69.70 2025-03-01: 69.70 INFANT_SN: + 2024-01-01: 79.39 2025-03-01: 79.39 TODDLER: + 2024-01-01: 69.70 2025-03-01: 69.70 TODDLER_SN: + 2024-01-01: 79.39 2025-03-01: 79.39 PRESCHOOL: + 2024-01-01: 59.39 2025-03-01: 59.39 PRESCHOOL_SN: + 2024-01-01: 69.70 2025-03-01: 69.70 SCHOOL_AGE: + 2024-01-01: 59.39 2025-03-01: 59.39 SCHOOL_AGE_SN: + 2024-01-01: 69.70 2025-03-01: 69.70 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/licensed_center.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/licensed_center.yaml index 1d1d1645ff2..884db4b4409 100644 --- a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/licensed_center.yaml +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/licensed_center.yaml @@ -8,145 +8,211 @@ metadata: - nj_ccap_grow_nj_kids_rating - nj_ccap_age_group reference: - - title: CC-230 Maximum Child Care Payment Rates, Licensed Child Care Centers + - title: CC-230 (02/25) Maximum Child Care Payment Rates, Licensed Child Care Centers href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Max_CC_Payment_Rates.pdf#page=1 + - title: CC-230 (02/24) Maximum Child Care Payment Rates, Licensed Child Care Centers + href: http://www.bccap.org/wp-content/uploads/2024/03/Maximum-Child-Care-Payment-Rates-March-2024.pdf#page=1 FULL_TIME: NONE: INFANT: + 2024-01-01: 363.04 2025-03-01: 366.67 INFANT_SN: + 2024-01-01: 435.65 2025-03-01: 440.01 TODDLER: + 2024-01-01: 321.55 2025-03-01: 326.56 TODDLER_SN: + 2024-01-01: 385.86 2025-03-01: 391.87 PRESCHOOL: + 2024-01-01: 287.27 2025-03-01: 291.57 PRESCHOOL_SN: + 2024-01-01: 364.84 2025-03-01: 370.29 SCHOOL_AGE: + 2024-01-01: 273.59 2025-03-01: 274.96 SCHOOL_AGE_SN: + 2024-01-01: 347.46 2025-03-01: 349.20 STAR_3: INFANT: + 2024-01-01: 387.44 2025-03-01: 391.32 INFANT_SN: + 2024-01-01: 464.93 2025-03-01: 469.58 TODDLER: + 2024-01-01: 331.80 2025-03-01: 336.96 TODDLER_SN: + 2024-01-01: 398.16 2025-03-01: 404.36 PRESCHOOL: + 2024-01-01: 300.77 2025-03-01: 305.27 PRESCHOOL_SN: + 2024-01-01: 381.98 2025-03-01: 387.70 SCHOOL_AGE: + 2024-01-01: 273.59 2025-03-01: 274.96 SCHOOL_AGE_SN: + 2024-01-01: 347.46 2025-03-01: 349.20 STAR_4: INFANT: + 2024-01-01: 398.29 2025-03-01: 402.27 INFANT_SN: + 2024-01-01: 477.95 2025-03-01: 482.73 TODDLER: + 2024-01-01: 340.39 2025-03-01: 345.68 TODDLER_SN: + 2024-01-01: 408.46 2025-03-01: 414.82 PRESCHOOL: + 2024-01-01: 308.10 2025-03-01: 312.71 PRESCHOOL_SN: + 2024-01-01: 391.28 2025-03-01: 397.14 SCHOOL_AGE: + 2024-01-01: 273.59 2025-03-01: 274.96 SCHOOL_AGE_SN: + 2024-01-01: 347.46 2025-03-01: 349.20 STAR_5: INFANT: + 2024-01-01: 412.30 2025-03-01: 416.42 INFANT_SN: + 2024-01-01: 494.76 2025-03-01: 499.70 TODDLER: + 2024-01-01: 351.50 2025-03-01: 356.97 TODDLER_SN: + 2024-01-01: 421.80 2025-03-01: 428.36 PRESCHOOL: + 2024-01-01: 317.59 2025-03-01: 322.34 PRESCHOOL_SN: + 2024-01-01: 403.34 2025-03-01: 409.37 SCHOOL_AGE: + 2024-01-01: 273.59 2025-03-01: 274.96 SCHOOL_AGE_SN: + 2024-01-01: 347.46 2025-03-01: 349.20 PART_TIME: NONE: INFANT: + 2024-01-01: 181.52 2025-03-01: 183.34 INFANT_SN: + 2024-01-01: 217.83 2025-03-01: 220.00 TODDLER: + 2024-01-01: 160.78 2025-03-01: 163.28 TODDLER_SN: + 2024-01-01: 192.93 2025-03-01: 195.94 PRESCHOOL: + 2024-01-01: 143.64 2025-03-01: 145.79 PRESCHOOL_SN: + 2024-01-01: 182.42 2025-03-01: 185.15 SCHOOL_AGE: + 2024-01-01: 136.79 2025-03-01: 137.48 SCHOOL_AGE_SN: + 2024-01-01: 173.73 2025-03-01: 174.60 STAR_3: INFANT: + 2024-01-01: 193.72 2025-03-01: 195.66 INFANT_SN: + 2024-01-01: 232.47 2025-03-01: 234.79 TODDLER: + 2024-01-01: 165.90 2025-03-01: 168.48 TODDLER_SN: + 2024-01-01: 199.08 2025-03-01: 202.18 PRESCHOOL: + 2024-01-01: 150.39 2025-03-01: 152.64 PRESCHOOL_SN: + 2024-01-01: 190.99 2025-03-01: 193.85 SCHOOL_AGE: + 2024-01-01: 136.79 2025-03-01: 137.48 SCHOOL_AGE_SN: + 2024-01-01: 173.73 2025-03-01: 174.60 STAR_4: INFANT: + 2024-01-01: 199.15 2025-03-01: 201.14 INFANT_SN: + 2024-01-01: 238.97 2025-03-01: 241.36 TODDLER: + 2024-01-01: 170.19 2025-03-01: 172.84 TODDLER_SN: + 2024-01-01: 204.23 2025-03-01: 207.41 PRESCHOOL: + 2024-01-01: 154.05 2025-03-01: 156.35 PRESCHOOL_SN: + 2024-01-01: 195.64 2025-03-01: 198.57 SCHOOL_AGE: + 2024-01-01: 136.79 2025-03-01: 137.48 SCHOOL_AGE_SN: + 2024-01-01: 173.73 2025-03-01: 174.60 STAR_5: INFANT: + 2024-01-01: 206.15 2025-03-01: 208.21 INFANT_SN: + 2024-01-01: 247.38 2025-03-01: 249.85 TODDLER: + 2024-01-01: 175.75 2025-03-01: 178.48 TODDLER_SN: + 2024-01-01: 210.90 2025-03-01: 214.18 PRESCHOOL: + 2024-01-01: 158.80 2025-03-01: 161.17 PRESCHOOL_SN: + 2024-01-01: 201.67 2025-03-01: 204.69 SCHOOL_AGE: + 2024-01-01: 136.79 2025-03-01: 137.48 SCHOOL_AGE_SN: + 2024-01-01: 173.73 2025-03-01: 174.60 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/registered_family.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/registered_family.yaml index ade6a65ce58..5897f0fdcf3 100644 --- a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/registered_family.yaml +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/registered_family.yaml @@ -8,145 +8,211 @@ metadata: - nj_ccap_grow_nj_kids_rating - nj_ccap_age_group reference: - - title: CC-230 Maximum Child Care Payment Rates, Registered Family Child Care Homes + - title: CC-230 (02/25) Maximum Child Care Payment Rates, Registered Family Child Care Homes href: https://www.childcarenj.gov/ChildCareNJ/media/media_library/Max_CC_Payment_Rates.pdf#page=2 + - title: CC-230 (02/24) Maximum Child Care Payment Rates, Registered Family Child Care Homes + href: http://www.bccap.org/wp-content/uploads/2024/03/Maximum-Child-Care-Payment-Rates-March-2024.pdf#page=2 FULL_TIME: NONE: INFANT: + 2024-01-01: 278.41 2025-03-01: 281.19 INFANT_SN: + 2024-01-01: 312.78 2025-03-01: 315.91 TODDLER: + 2024-01-01: 278.41 2025-03-01: 281.19 TODDLER_SN: + 2024-01-01: 312.78 2025-03-01: 315.91 PRESCHOOL: + 2024-01-01: 244.03 2025-03-01: 246.47 PRESCHOOL_SN: + 2024-01-01: 278.41 2025-03-01: 281.19 SCHOOL_AGE: + 2024-01-01: 244.03 2025-03-01: 245.25 SCHOOL_AGE_SN: + 2024-01-01: 278.41 2025-03-01: 279.80 STAR_3: INFANT: + 2024-01-01: 320.18 2025-03-01: 323.38 INFANT_SN: + 2024-01-01: 324.73 2025-03-01: 327.98 TODDLER: + 2024-01-01: 302.32 2025-03-01: 305.34 TODDLER_SN: + 2024-01-01: 314.27 2025-03-01: 317.42 PRESCHOOL: + 2024-01-01: 290.36 2025-03-01: 293.27 PRESCHOOL_SN: + 2024-01-01: 302.32 2025-03-01: 305.34 SCHOOL_AGE: + 2024-01-01: 244.03 2025-03-01: 245.25 SCHOOL_AGE_SN: + 2024-01-01: 278.41 2025-03-01: 279.80 STAR_4: INFANT: + 2024-01-01: 332.14 2025-03-01: 335.46 INFANT_SN: + 2024-01-01: 336.69 2025-03-01: 340.06 TODDLER: + 2024-01-01: 314.21 2025-03-01: 317.35 TODDLER_SN: + 2024-01-01: 326.23 2025-03-01: 329.49 PRESCHOOL: + 2024-01-01: 302.25 2025-03-01: 305.27 PRESCHOOL_SN: + 2024-01-01: 314.21 2025-03-01: 317.35 SCHOOL_AGE: + 2024-01-01: 244.03 2025-03-01: 245.25 SCHOOL_AGE_SN: + 2024-01-01: 278.41 2025-03-01: 279.80 STAR_5: INFANT: + 2024-01-01: 346.24 2025-03-01: 349.71 INFANT_SN: + 2024-01-01: 348.64 2025-03-01: 352.13 TODDLER: + 2024-01-01: 328.31 2025-03-01: 331.59 TODDLER_SN: + 2024-01-01: 340.33 2025-03-01: 343.74 PRESCHOOL: + 2024-01-01: 316.36 2025-03-01: 319.52 PRESCHOOL_SN: + 2024-01-01: 328.31 2025-03-01: 331.59 SCHOOL_AGE: + 2024-01-01: 244.03 2025-03-01: 245.25 SCHOOL_AGE_SN: + 2024-01-01: 278.41 2025-03-01: 279.80 PART_TIME: NONE: INFANT: + 2024-01-01: 139.20 2025-03-01: 140.60 INFANT_SN: + 2024-01-01: 156.39 2025-03-01: 157.95 TODDLER: + 2024-01-01: 139.20 2025-03-01: 140.60 TODDLER_SN: + 2024-01-01: 156.39 2025-03-01: 157.95 PRESCHOOL: + 2024-01-01: 122.02 2025-03-01: 123.24 PRESCHOOL_SN: + 2024-01-01: 139.20 2025-03-01: 140.60 SCHOOL_AGE: + 2024-01-01: 122.02 2025-03-01: 122.63 SCHOOL_AGE_SN: + 2024-01-01: 139.20 2025-03-01: 139.90 STAR_3: INFANT: + 2024-01-01: 160.09 2025-03-01: 161.69 INFANT_SN: + 2024-01-01: 162.37 2025-03-01: 163.99 TODDLER: + 2024-01-01: 151.16 2025-03-01: 152.67 TODDLER_SN: + 2024-01-01: 157.14 2025-03-01: 158.71 PRESCHOOL: + 2024-01-01: 145.18 2025-03-01: 146.63 PRESCHOOL_SN: + 2024-01-01: 151.16 2025-03-01: 152.67 SCHOOL_AGE: + 2024-01-01: 122.02 2025-03-01: 122.63 SCHOOL_AGE_SN: + 2024-01-01: 139.20 2025-03-01: 139.90 STAR_4: INFANT: + 2024-01-01: 166.07 2025-03-01: 167.73 INFANT_SN: + 2024-01-01: 168.34 2025-03-01: 170.03 TODDLER: + 2024-01-01: 157.10 2025-03-01: 158.67 TODDLER_SN: + 2024-01-01: 163.11 2025-03-01: 164.74 PRESCHOOL: + 2024-01-01: 151.12 2025-03-01: 152.64 PRESCHOOL_SN: + 2024-01-01: 157.10 2025-03-01: 158.67 SCHOOL_AGE: + 2024-01-01: 122.02 2025-03-01: 122.63 SCHOOL_AGE_SN: + 2024-01-01: 139.20 2025-03-01: 139.90 STAR_5: INFANT: + 2024-01-01: 173.12 2025-03-01: 174.85 INFANT_SN: + 2024-01-01: 174.32 2025-03-01: 176.07 TODDLER: + 2024-01-01: 164.16 2025-03-01: 165.80 TODDLER_SN: + 2024-01-01: 170.17 2025-03-01: 171.87 PRESCHOOL: + 2024-01-01: 158.18 2025-03-01: 159.76 PRESCHOOL_SN: + 2024-01-01: 164.16 2025-03-01: 165.80 SCHOOL_AGE: + 2024-01-01: 122.02 2025-03-01: 122.63 SCHOOL_AGE_SN: + 2024-01-01: 139.20 2025-03-01: 139.90 From 8627feb23a0fb9897a63b122d7b76ed3fa057864 Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 20 Mar 2026 10:24:12 -0400 Subject: [PATCH 7/7] Move rate backdating notes from description to YAML comments Remove duplicate 2025-03-01 entries for approved home (unchanged rates). Remove duplicate zero entries for ACA summer camp non-school-age groups. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../nj/njdhs/ccap/rates/aca_summer_camp.yaml | 15 +++----------- .../nj/njdhs/ccap/rates/approved_home.yaml | 20 ++++--------------- .../nj/njdhs/ccap/rates/licensed_center.yaml | 3 +++ .../njdhs/ccap/rates/registered_family.yaml | 3 +++ 4 files changed, 13 insertions(+), 28 deletions(-) diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/aca_summer_camp.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/aca_summer_camp.yaml index 1f70e9f0318..8b601db9de5 100644 --- a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/aca_summer_camp.yaml +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/aca_summer_camp.yaml @@ -12,25 +12,22 @@ metadata: - title: CC-230 (02/24) Maximum Child Care Payment Rates, ACA Summer Youth Camps href: http://www.bccap.org/wp-content/uploads/2024/03/Maximum-Child-Care-Payment-Rates-March-2024.pdf#page=4 +# 2024-01-01 values are CC-230 (02/24) rates effective March 1, 2024, +# backdated to January 1 for microsimulation coverage. +# The prior (March 2023) rates could not be sourced. FULL_TIME: INFANT: 2024-01-01: 0 - 2025-03-01: 0 INFANT_SN: 2024-01-01: 0 - 2025-03-01: 0 TODDLER: 2024-01-01: 0 - 2025-03-01: 0 TODDLER_SN: 2024-01-01: 0 - 2025-03-01: 0 PRESCHOOL: 2024-01-01: 0 - 2025-03-01: 0 PRESCHOOL_SN: 2024-01-01: 0 - 2025-03-01: 0 SCHOOL_AGE: 2024-01-01: 287.27 2025-03-01: 288.70 @@ -41,22 +38,16 @@ FULL_TIME: PART_TIME: INFANT: 2024-01-01: 0 - 2025-03-01: 0 INFANT_SN: 2024-01-01: 0 - 2025-03-01: 0 TODDLER: 2024-01-01: 0 - 2025-03-01: 0 TODDLER_SN: 2024-01-01: 0 - 2025-03-01: 0 PRESCHOOL: 2024-01-01: 0 - 2025-03-01: 0 PRESCHOOL_SN: 2024-01-01: 0 - 2025-03-01: 0 SCHOOL_AGE: 2024-01-01: 143.63 2025-03-01: 144.35 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/approved_home.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/approved_home.yaml index fcac031c97b..2412de4c27b 100644 --- a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/approved_home.yaml +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/approved_home.yaml @@ -12,54 +12,42 @@ metadata: - title: CC-230 (02/24) Maximum Child Care Payment Rates, Approved Homes (FFN and In-Home) href: http://www.bccap.org/wp-content/uploads/2024/03/Maximum-Child-Care-Payment-Rates-March-2024.pdf#page=3 +# 2024-01-01 values are CC-230 (02/24) rates effective March 1, 2024, +# backdated to January 1 for microsimulation coverage. +# The prior (March 2023) rates could not be sourced. +# Rates unchanged between CC-230 (02/24) and CC-230 (02/25). FULL_TIME: INFANT: 2024-01-01: 139.39 - 2025-03-01: 139.39 INFANT_SN: 2024-01-01: 158.79 - 2025-03-01: 158.79 TODDLER: 2024-01-01: 139.39 - 2025-03-01: 139.39 TODDLER_SN: 2024-01-01: 158.79 - 2025-03-01: 158.79 PRESCHOOL: 2024-01-01: 118.79 - 2025-03-01: 118.79 PRESCHOOL_SN: 2024-01-01: 139.39 - 2025-03-01: 139.39 SCHOOL_AGE: 2024-01-01: 118.79 - 2025-03-01: 118.79 SCHOOL_AGE_SN: 2024-01-01: 139.39 - 2025-03-01: 139.39 PART_TIME: INFANT: 2024-01-01: 69.70 - 2025-03-01: 69.70 INFANT_SN: 2024-01-01: 79.39 - 2025-03-01: 79.39 TODDLER: 2024-01-01: 69.70 - 2025-03-01: 69.70 TODDLER_SN: 2024-01-01: 79.39 - 2025-03-01: 79.39 PRESCHOOL: 2024-01-01: 59.39 - 2025-03-01: 59.39 PRESCHOOL_SN: 2024-01-01: 69.70 - 2025-03-01: 69.70 SCHOOL_AGE: 2024-01-01: 59.39 - 2025-03-01: 59.39 SCHOOL_AGE_SN: 2024-01-01: 69.70 - 2025-03-01: 69.70 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/licensed_center.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/licensed_center.yaml index 884db4b4409..cde19a8001a 100644 --- a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/licensed_center.yaml +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/licensed_center.yaml @@ -13,6 +13,9 @@ metadata: - title: CC-230 (02/24) Maximum Child Care Payment Rates, Licensed Child Care Centers href: http://www.bccap.org/wp-content/uploads/2024/03/Maximum-Child-Care-Payment-Rates-March-2024.pdf#page=1 +# 2024-01-01 values are CC-230 (02/24) rates effective March 1, 2024, +# backdated to January 1 for microsimulation coverage. +# The prior (March 2023) rates could not be sourced. FULL_TIME: NONE: INFANT: diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/registered_family.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/registered_family.yaml index 5897f0fdcf3..e10bedee0ec 100644 --- a/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/registered_family.yaml +++ b/policyengine_us/parameters/gov/states/nj/njdhs/ccap/rates/registered_family.yaml @@ -13,6 +13,9 @@ metadata: - title: CC-230 (02/24) Maximum Child Care Payment Rates, Registered Family Child Care Homes href: http://www.bccap.org/wp-content/uploads/2024/03/Maximum-Child-Care-Payment-Rates-March-2024.pdf#page=2 +# 2024-01-01 values are CC-230 (02/24) rates effective March 1, 2024, +# backdated to January 1 for microsimulation coverage. +# The prior (March 2023) rates could not be sourced. FULL_TIME: NONE: INFANT: