diff --git a/changelog.d/la-ccap.added.md b/changelog.d/la-ccap.added.md new file mode 100644 index 00000000000..8888cf99143 --- /dev/null +++ b/changelog.d/la-ccap.added.md @@ -0,0 +1 @@ +Louisiana Child Care Assistance Program (CCAP). diff --git a/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml b/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml index 748e5f5bffc..bd23f41ba77 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 @@ -15,6 +15,7 @@ values: - in_child_care_subsidies # Indiana Child Care and Development Fund Voucher Program - ks_child_care_subsidies # Kansas Child Care Assistance Program - ky_child_care_subsidies # Kentucky Child Care Assistance Program + - la_child_care_subsidies # Louisiana Child Care Assistance Program - 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 diff --git a/policyengine_us/parameters/gov/states/la/ldoe/ccap/activity/special_needs_weekly_hours.yaml b/policyengine_us/parameters/gov/states/la/ldoe/ccap/activity/special_needs_weekly_hours.yaml new file mode 100644 index 00000000000..1d28829c94c --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/ldoe/ccap/activity/special_needs_weekly_hours.yaml @@ -0,0 +1,13 @@ +description: Louisiana reduces the minimum weekly activity hours to this number for households that qualify for special needs child care under the Child Care Assistance Program. +values: + 2022-02-01: 15 + +metadata: + unit: hour + period: year + label: Louisiana CCAP special needs household minimum weekly activity hours + reference: + - title: LAC 28:CLXV.509.A.5.d (Bulletin 139), reduction to 15 hours per week + href: https://www.doa.la.gov/media/043btqeh/28v165.docx + - title: Louisiana CCDF State Plan FFY 2025-2027, Section 2.2.2.d + href: https://doe.louisiana.gov/docs/default-source/early-childhood/approved-2025-2027-ccdf-state-plan.pdf#page=20 diff --git a/policyengine_us/parameters/gov/states/la/ldoe/ccap/activity/weekly_hours.yaml b/policyengine_us/parameters/gov/states/la/ldoe/ccap/activity/weekly_hours.yaml new file mode 100644 index 00000000000..0217088a864 --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/ldoe/ccap/activity/weekly_hours.yaml @@ -0,0 +1,13 @@ +description: Louisiana requires the head of household and spouse to average this number of weekly employment, training, or education hours under the Child Care Assistance Program. +values: + 2022-02-01: 20 + +metadata: + unit: hour + period: year + label: Louisiana CCAP minimum weekly activity hours + reference: + - title: LAC 28:CLXV.509.A.5.a (Bulletin 139), 20 hours per week minimum + href: https://www.doa.la.gov/media/043btqeh/28v165.docx + - title: Louisiana CCDF State Plan FFY 2025-2027, Section 2.2.2.d + href: https://doe.louisiana.gov/docs/default-source/early-childhood/approved-2025-2027-ccdf-state-plan.pdf#page=20 diff --git a/policyengine_us/parameters/gov/states/la/ldoe/ccap/age/child_limit.yaml b/policyengine_us/parameters/gov/states/la/ldoe/ccap/age/child_limit.yaml new file mode 100644 index 00000000000..a4ac4598fcc --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/ldoe/ccap/age/child_limit.yaml @@ -0,0 +1,11 @@ +description: Louisiana limits child eligibility to children below this age under the Child Care Assistance Program. +values: + 2022-02-01: 13 + +metadata: + unit: year + period: year + label: Louisiana CCAP child age limit + reference: + - title: LAC 28:CLXV.503.A.2 (Bulletin 139), eligible child under age 13 + href: https://www.doa.la.gov/media/043btqeh/28v165.docx diff --git a/policyengine_us/parameters/gov/states/la/ldoe/ccap/age/disabled_child_limit.yaml b/policyengine_us/parameters/gov/states/la/ldoe/ccap/age/disabled_child_limit.yaml new file mode 100644 index 00000000000..f4e4641be1a --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/ldoe/ccap/age/disabled_child_limit.yaml @@ -0,0 +1,11 @@ +description: Louisiana limits child eligibility to disabled children below this age under the Child Care Assistance Program. +values: + 2022-02-01: 18 + +metadata: + unit: year + period: year + label: Louisiana CCAP disabled child age limit + reference: + - title: LAC 28:CLXV.503.A.2 (Bulletin 139), age 13-17 incapable of self-care + href: https://www.doa.la.gov/media/043btqeh/28v165.docx diff --git a/policyengine_us/parameters/gov/states/la/ldoe/ccap/age_group/infant_age_limit.yaml b/policyengine_us/parameters/gov/states/la/ldoe/ccap/age_group/infant_age_limit.yaml new file mode 100644 index 00000000000..872c2cdb5bf --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/ldoe/ccap/age_group/infant_age_limit.yaml @@ -0,0 +1,11 @@ +description: Louisiana applies infant provider rates to children below this age under the Child Care Assistance Program. +values: + 2022-02-01: 1 + +metadata: + unit: year + period: year + label: Louisiana CCAP infant rate age limit + reference: + - title: LDOE 2022 CCAP Rate Increase notice, Age 0 (Infants) rate column + href: https://www.louisianabelieves.com/docs/default-source/child-care-providers/ccap-rate-changes.pdf?sfvrsn=2f5d8d1f_10 diff --git a/policyengine_us/parameters/gov/states/la/ldoe/ccap/age_group/toddler_age_limit.yaml b/policyengine_us/parameters/gov/states/la/ldoe/ccap/age_group/toddler_age_limit.yaml new file mode 100644 index 00000000000..61665e0f0ff --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/ldoe/ccap/age_group/toddler_age_limit.yaml @@ -0,0 +1,11 @@ +description: Louisiana applies toddler provider rates to children below this age under the Child Care Assistance Program. +values: + 2022-02-01: 3 + +metadata: + unit: year + period: year + label: Louisiana CCAP toddler rate age limit + reference: + - title: LDOE 2022 CCAP Rate Increase notice, Age 1-2 (Toddlers) rate column + href: https://www.louisianabelieves.com/docs/default-source/child-care-providers/ccap-rate-changes.pdf?sfvrsn=2f5d8d1f_10 diff --git a/policyengine_us/parameters/gov/states/la/ldoe/ccap/copay/daily_amount.yaml b/policyengine_us/parameters/gov/states/la/ldoe/ccap/copay/daily_amount.yaml new file mode 100644 index 00000000000..7e6b18dabd8 --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/ldoe/ccap/copay/daily_amount.yaml @@ -0,0 +1,48 @@ +description: Louisiana charges this daily co-payment per child under the Child Care Assistance Program, based on household income as a share of the state median income. +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + period: day + label: Louisiana CCAP daily co-payment by share of state median income + reference: + - title: LDOE 2026 Sliding Fee Scale (effective February 1, 2026; printed band tops equal these shares of the state median income, rounded to whole dollars) + href: https://www.louisianabelieves.com/docs/default-source/early-childhood/ccap-sliding-fee-scale.pdf + - title: LDOE 2025 Sliding Fee Scale (effective February 3, 2025, archived) + href: https://web.archive.org/web/20250302135951/https://doe.louisiana.gov/docs/default-source/early-childhood/ccap-sliding-fee-scale.pdf + - title: LDOE 2024 Sliding Fee Scale (effective February 1, 2024, archived) + href: https://web.archive.org/web/20240625175822/https://louisianabelieves.com/docs/default-source/early-childhood/ccap-sliding-fee-scale.pdf + - title: LDOE 2023 Sliding Fee Scale (archived) + href: https://web.archive.org/web/20230327170902/https://www.louisianabelieves.com/docs/default-source/early-childhood/ccap-sliding-fee-scale.pdf?sfvrsn=a5728c1f_29 + - title: LDOE 2022 Sliding Fee Scale (archived) + href: https://web.archive.org/web/20220209001401/https://www.louisianabelieves.com/docs/default-source/early-childhood/ccap-sliding-fee-scale.pdf?sfvrsn=2 + - title: Louisiana CCDF State Plan FFY 2025-2027, Section 3.1.2 (per-child monthly copays of $44 to $220 at 22 days) + href: https://doe.louisiana.gov/docs/default-source/early-childhood/approved-2025-2027-ccdf-state-plan.pdf#page=42 + - title: Louisiana CCDF State Plan FFY 2022-2024, Section 3.1.3.g (copay as a daily rate) + href: https://www.louisianabelieves.com/docs/default-source/early-childhood/2022-2024-ccdf-approved-state-plan.pdf#page=69 + +brackets: + - threshold: + 2022-02-01: 0 + amount: + 2022-02-01: 0 + - threshold: + 2022-02-01: 0.6501 + 2023-02-01: 0.6401 + amount: + 2022-02-01: 2 + - threshold: + 2022-02-01: 0.7001 + 2023-02-01: 0.6901 + amount: + 2022-02-01: 3 + - threshold: + 2022-02-01: 0.7501 + 2023-02-01: 0.7401 + amount: + 2022-02-01: 8 + - threshold: + 2022-02-01: 0.8001 + 2023-02-01: 0.7901 + amount: + 2022-02-01: 10 diff --git a/policyengine_us/parameters/gov/states/la/ldoe/ccap/household_size/maximum.yaml b/policyengine_us/parameters/gov/states/la/ldoe/ccap/household_size/maximum.yaml new file mode 100644 index 00000000000..86bd593071a --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/ldoe/ccap/household_size/maximum.yaml @@ -0,0 +1,11 @@ +description: Louisiana publishes its Child Care Assistance Program sliding fee scale up to this household size. +values: + 2022-02-01: 12 + +metadata: + unit: person + period: year + label: Louisiana CCAP sliding fee scale maximum household size + reference: + - title: LDOE 2026 Sliding Fee Scale, household size columns + href: https://www.louisianabelieves.com/docs/default-source/early-childhood/ccap-sliding-fee-scale.pdf diff --git a/policyengine_us/parameters/gov/states/la/ldoe/ccap/household_size/minimum.yaml b/policyengine_us/parameters/gov/states/la/ldoe/ccap/household_size/minimum.yaml new file mode 100644 index 00000000000..2aec06ba915 --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/ldoe/ccap/household_size/minimum.yaml @@ -0,0 +1,11 @@ +description: Louisiana publishes its Child Care Assistance Program sliding fee scale starting at this household size. +values: + 2022-02-01: 2 + +metadata: + unit: person + period: year + label: Louisiana CCAP sliding fee scale minimum household size + reference: + - title: LDOE 2026 Sliding Fee Scale, household size columns + href: https://www.louisianabelieves.com/docs/default-source/early-childhood/ccap-sliding-fee-scale.pdf diff --git a/policyengine_us/parameters/gov/states/la/ldoe/ccap/income/limit.yaml b/policyengine_us/parameters/gov/states/la/ldoe/ccap/income/limit.yaml new file mode 100644 index 00000000000..985ad12192b --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/ldoe/ccap/income/limit.yaml @@ -0,0 +1,15 @@ +description: Louisiana limits countable income to this share of the state median income under the Child Care Assistance Program. +values: + 2022-02-01: 0.85 + +metadata: + unit: /1 + period: year + label: Louisiana CCAP income limit as a share of state median income + reference: + - title: LAC 28:CLXV.509.A.3 (Bulletin 139) + href: https://www.doa.la.gov/media/043btqeh/28v165.docx + - title: Louisiana Register Vol. 48 No. 5, LR 48:1269 (May 20, 2022), LAC 28:CLXV.509 + href: https://www.doa.la.gov/media/ny1gpl0g/2205.pdf#page=8 + - title: LDOE 2026 Sliding Fee Scale, 85% state median income columns (effective February 1, 2026) + href: https://www.louisianabelieves.com/docs/default-source/early-childhood/ccap-sliding-fee-scale.pdf diff --git a/policyengine_us/parameters/gov/states/la/ldoe/ccap/income/self_employment_sources.yaml b/policyengine_us/parameters/gov/states/la/ldoe/ccap/income/self_employment_sources.yaml new file mode 100644 index 00000000000..5adec4140c1 --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/ldoe/ccap/income/self_employment_sources.yaml @@ -0,0 +1,13 @@ +description: Louisiana counts these gross self-employment income sources of the head of household and spouse under the Child Care Assistance Program. +values: + 2022-02-01: + - self_employment_income + - farm_operations_income + +metadata: + unit: list + period: year + label: Louisiana CCAP self-employment income sources + reference: + - title: LAC 28:CLXV.509.A.3.a (Bulletin 139), gross earnings + href: https://www.doa.la.gov/media/043btqeh/28v165.docx diff --git a/policyengine_us/parameters/gov/states/la/ldoe/ccap/income/unearned_sources.yaml b/policyengine_us/parameters/gov/states/la/ldoe/ccap/income/unearned_sources.yaml new file mode 100644 index 00000000000..598764d4ba2 --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/ldoe/ccap/income/unearned_sources.yaml @@ -0,0 +1,35 @@ +description: Louisiana counts these recurring unearned income sources of all household members under the Child Care Assistance Program. +values: + 2022-02-01: + - social_security + - ssi + - veterans_benefits + - pension_income + - disability_benefits + - unemployment_compensation + - workers_compensation + - child_support_received + - alimony_income + # LR 51:529 (April 20, 2025) repealed child support or alimony and adoption + # subsidy payments from the countable list; adoption subsidies are not tracked + # as a separate input at the moment, so only the first repeal affects the model. + 2025-04-20: + - social_security + - ssi + - veterans_benefits + - pension_income + - disability_benefits + - unemployment_compensation + - workers_compensation + +metadata: + unit: list + period: year + label: Louisiana CCAP unearned income sources + reference: + - title: LAC 28:CLXV.509.A.3.b (Bulletin 139), recurring unearned income (current 7-item list, from 2025-04-20) + href: https://www.doa.la.gov/media/043btqeh/28v165.docx + - title: LAC 28:CLXV.509.A.3.b (Bulletin 139, archived December 2024), pre-repeal 9-item list with child support or alimony (vi) and adoption subsidy payments (viii) + href: https://web.archive.org/web/20241213043535/https://www.doa.la.gov/media/xlpa5i53/28v165.pdf#page=22 + - title: Louisiana Register Vol. 51 No. 4, LR 51:524-529 (April 20, 2025), repeal of items vi and viii + href: https://www.doa.la.gov/media/aqifjzos/2504.pdf#page=50 diff --git a/policyengine_us/parameters/gov/states/la/ldoe/ccap/income/wage_sources.yaml b/policyengine_us/parameters/gov/states/la/ldoe/ccap/income/wage_sources.yaml new file mode 100644 index 00000000000..451ae746607 --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/ldoe/ccap/income/wage_sources.yaml @@ -0,0 +1,15 @@ +description: Louisiana counts these gross wage income sources of the head of household and spouse under the Child Care Assistance Program. +values: + 2022-02-01: + - employment_income + # LAC 28:CLXV.509.A.3.a excludes earnings from the Corporation for National and + # Community Service, college work study, and disaster-related employment; we do + # not track these income subtypes at the moment. + +metadata: + unit: list + period: year + label: Louisiana CCAP wage income sources + reference: + - title: LAC 28:CLXV.509.A.3.a (Bulletin 139), gross earnings + href: https://www.doa.la.gov/media/043btqeh/28v165.docx diff --git a/policyengine_us/parameters/gov/states/la/ldoe/ccap/payment/full_time_weekly_hours.yaml b/policyengine_us/parameters/gov/states/la/ldoe/ccap/payment/full_time_weekly_hours.yaml new file mode 100644 index 00000000000..178178ad28b --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/ldoe/ccap/payment/full_time_weekly_hours.yaml @@ -0,0 +1,11 @@ +description: Louisiana defines full-time child care as care of at least this number of hours per week under the Child Care Assistance Program. +values: + 2022-02-01: 30 + +metadata: + unit: hour + period: year + label: Louisiana CCAP full-time care weekly hours threshold + reference: + - title: LAC 28:CLXV.103 (Bulletin 139), definitions of Full-Time Care and Part-Time Care + href: https://www.doa.la.gov/media/043btqeh/28v165.docx diff --git a/policyengine_us/parameters/gov/states/la/ldoe/ccap/payment/max_monthly_days.yaml b/policyengine_us/parameters/gov/states/la/ldoe/ccap/payment/max_monthly_days.yaml new file mode 100644 index 00000000000..ec82fcb8796 --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/ldoe/ccap/payment/max_monthly_days.yaml @@ -0,0 +1,11 @@ +description: Louisiana pays for at most this number of full-time child care days per month under the Child Care Assistance Program. +values: + 2022-02-01: 22 + +metadata: + unit: day + period: month + label: Louisiana CCAP maximum paid days per month + reference: + - title: LAC 28:CLXV.103 (Bulletin 139), definition of Full-Time Care + href: https://www.doa.la.gov/media/043btqeh/28v165.docx diff --git a/policyengine_us/parameters/gov/states/la/ldoe/ccap/rates/regular.yaml b/policyengine_us/parameters/gov/states/la/ldoe/ccap/rates/regular.yaml new file mode 100644 index 00000000000..8bc40b7e5b7 --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/ldoe/ccap/rates/regular.yaml @@ -0,0 +1,56 @@ +description: Louisiana pays these state maximum daily child care rates under the Child Care Assistance Program, by provider type and child age group. +metadata: + unit: currency-USD + period: day + label: Louisiana CCAP state maximum daily rates + breakdown: + - la_ccap_provider_type + - la_ccap_age_group + reference: + - title: Louisiana Register Vol. 48 No. 5, LR 48:1269-1270 (May 20, 2022), LAC 28:CLXV.515.A + href: https://www.doa.la.gov/media/ny1gpl0g/2205.pdf#page=8 + - title: Louisiana Register Vol. 51 No. 4, LR 51:524-529 (April 20, 2025), LAC 28:CLXV.515.A re-codified + href: https://www.doa.la.gov/media/aqifjzos/2504.pdf#page=50 + - title: LDOE 2022 CCAP Rate Increase notice (rates paid from February 2022) + href: https://www.louisianabelieves.com/docs/default-source/child-care-providers/ccap-rate-changes.pdf?sfvrsn=2f5d8d1f_10 + - title: Louisiana Register Vol. 47 No. 5, LR 47:573 (May 20, 2021), LAC 28:CLXV.515.A prior military center rates (effective February 1 to May 19, 2022) + href: https://www.doa.la.gov/media/ymql05n5/2105.pdf#page=23 + +TYPE_III_EARLY_LEARNING_CENTER: + INFANT: + 2022-02-01: 68 + TODDLER: + 2022-02-01: 42 + REGULAR: + 2022-02-01: 31.5 +SCHOOL_CHILD_CARE_CENTER: + INFANT: + 2022-02-01: 24 + TODDLER: + 2022-02-01: 24 + REGULAR: + 2022-02-01: 24 +FAMILY_CHILD_CARE: + INFANT: + 2022-02-01: 61 + TODDLER: + 2022-02-01: 42 + REGULAR: + 2022-02-01: 29 +IN_HOME: + INFANT: + 2022-02-01: 26.65 + TODDLER: + 2022-02-01: 25.25 + REGULAR: + 2022-02-01: 25 +MILITARY_CHILD_CARE_CENTER: + INFANT: + 2022-02-01: 35.65 + 2022-05-20: 68 + TODDLER: + 2022-02-01: 31.05 + 2022-05-20: 42 + REGULAR: + 2022-02-01: 30 + 2022-05-20: 31.5 diff --git a/policyengine_us/parameters/gov/states/la/ldoe/ccap/rates/special_needs.yaml b/policyengine_us/parameters/gov/states/la/ldoe/ccap/rates/special_needs.yaml new file mode 100644 index 00000000000..0239e095f9c --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/ldoe/ccap/rates/special_needs.yaml @@ -0,0 +1,56 @@ +description: Louisiana pays these state maximum daily special needs care incentive rates under the Child Care Assistance Program, by provider type and child age group. +metadata: + unit: currency-USD + period: day + label: Louisiana CCAP special needs daily rates + breakdown: + - la_ccap_provider_type + - la_ccap_age_group + reference: + - title: Louisiana Register Vol. 48 No. 5, LR 48:1269-1270 (May 20, 2022), LAC 28:CLXV.515.A Special Needs Care Incentive + href: https://www.doa.la.gov/media/ny1gpl0g/2205.pdf#page=8 + - title: Louisiana Register Vol. 51 No. 4, LR 51:524-529 (April 20, 2025), LAC 28:CLXV.515.A re-codified + href: https://www.doa.la.gov/media/aqifjzos/2504.pdf#page=50 + - title: LDOE 2022 CCAP Rate Increase notice (rates paid from February 2022) + href: https://www.louisianabelieves.com/docs/default-source/child-care-providers/ccap-rate-changes.pdf?sfvrsn=2f5d8d1f_10 + - title: Louisiana Register Vol. 47 No. 5, LR 47:573 (May 20, 2021), LAC 28:CLXV.515.A prior military center rates (effective February 1 to May 19, 2022) + href: https://www.doa.la.gov/media/ymql05n5/2105.pdf#page=23 + +TYPE_III_EARLY_LEARNING_CENTER: + INFANT: + 2022-02-01: 85.68 + TODDLER: + 2022-02-01: 52.92 + REGULAR: + 2022-02-01: 39.69 +SCHOOL_CHILD_CARE_CENTER: + INFANT: + 2022-02-01: 30.24 + TODDLER: + 2022-02-01: 30.24 + REGULAR: + 2022-02-01: 30.24 +FAMILY_CHILD_CARE: + INFANT: + 2022-02-01: 76.86 + TODDLER: + 2022-02-01: 52.92 + REGULAR: + 2022-02-01: 36.54 +IN_HOME: + INFANT: + 2022-02-01: 33.58 + TODDLER: + 2022-02-01: 31.82 + REGULAR: + 2022-02-01: 31.5 +MILITARY_CHILD_CARE_CENTER: + INFANT: + 2022-02-01: 44.92 + 2022-05-20: 85.68 + TODDLER: + 2022-02-01: 39.12 + 2022-05-20: 52.92 + REGULAR: + 2022-02-01: 37.8 + 2022-05-20: 39.69 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 83ef1f1f1a0..6746979a49a 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -460,7 +460,7 @@ programs: category: Benefits agency: HHS status: partial - coverage: AK, AR, AL, CA, CO, CT, DE, DC, FL, HI, IA, ID, IL, IN, KS, KY, MA, MD, ME, NC, NH, NJ, PA, RI, SC, TX, VA, VT, WA, WV + coverage: AK, AR, AL, CA, CO, CT, DE, DC, FL, HI, IA, ID, IL, IN, KS, KY, LA, MA, MD, ME, NC, NH, NJ, PA, RI, SC, TX, VA, VT, WA, WV state_implementations: - state: AK status: complete @@ -540,6 +540,12 @@ programs: full_name: Kentucky Child Care Assistance Program variable: ky_ccap parameter_prefix: gov.states.ky.dcbs.ccap + - state: LA + status: complete + name: Louisiana CCAP + full_name: Louisiana Child Care Assistance Program + variable: la_ccap + parameter_prefix: gov.states.la.ldoe.ccap - state: MA status: complete name: Massachusetts CCFA diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/integration.yaml new file mode 100644 index 00000000000..153856e65b9 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/integration.yaml @@ -0,0 +1,175 @@ +# End-to-end scenarios for the Louisiana Child Care Assistance Program. +# Days in care = childcare_days_per_week x 52/12 (5 days/week = 21.67/month). +- name: Case 1, working single mother with an infant and a preschooler. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 54_000 # $4,500/month. + weekly_hours_worked_before_lsr: 40 + person2: + age: 0.5 + childcare_days_per_week: 5 + pre_subsidy_childcare_expenses: 15_600 # $1,300/month. + person3: + age: 4 + childcare_days_per_week: 5 + pre_subsidy_childcare_expenses: 9_600 # $800/month. + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: LA + output: + la_ccap_countable_income: 4_500 + # 2025 scale, 3 persons: $4,500 is above the $4,292 zero-copay band top + # and below the $4,627 top of the $2 band. + la_ccap_daily_copay: 2 + la_ccap_income_eligible: true # $4,500 vs $5,700 limit. + la_ccap_activity_eligible: true + la_ccap_eligible: true + # Infant: min($1,300, $68 x 21.67 = $1,473.33) - $2 x 21.67 = $1,256.67. + # Preschooler: min($800, $31.50 x 21.67 = $682.50) - $43.33 = $639.17. + la_ccap: 1_895.83 + +- name: Case 2, the same family under the 2024 sliding fee scale. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 54_000 # $4,500/month. + weekly_hours_worked_before_lsr: 40 + person2: + age: 0.5 + childcare_days_per_week: 5 + pre_subsidy_childcare_expenses: 15_600 + person3: + age: 4 + childcare_days_per_week: 5 + pre_subsidy_childcare_expenses: 9_600 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: LA + output: + # 2024 scale, 3 persons: $4,500 falls in the $3 band ($4,200-$4,503). + la_ccap_daily_copay: 3 + la_ccap_income_eligible: true # $4,500 vs $5,173 limit. + # Infant: $1,300 - $3 x 21.67 = $1,235; preschooler: $682.50 - $65 = $617.50. + la_ccap: 1_852.5 + +- name: Case 3, foster child bypasses income and activity tests with no copay. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 30_000 + weekly_hours_worked_before_lsr: 0 + person2: + age: 3 + is_in_foster_care: true + childcare_days_per_week: 5 + pre_subsidy_childcare_expenses: 9_600 # $800/month. + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_categorically_eligible: true + la_ccap_activity_eligible: false + la_ccap_eligible: true + la_ccap_daily_copay: 0 + # min($800, $31.50 x 21.67 = $682.50) with no copay. + la_ccap: 682.5 + +- name: Case 4, income above the limit is ineligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 60_000 # $5,000/month vs $4,614 two-person limit. + weekly_hours_worked_before_lsr: 40 + person2: + age: 2 + childcare_days_per_week: 5 + pre_subsidy_childcare_expenses: 12_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_income_eligible: false + la_ccap_eligible: false + la_ccap: 0 + +- name: Case 5, assets above the CCDF limit are disqualifying. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 54_000 + weekly_hours_worked_before_lsr: 40 + person2: + age: 4 + childcare_days_per_week: 5 + pre_subsidy_childcare_expenses: 9_600 + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_assets: 1_500_000 + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_eligible: false + la_ccap: 0 + +- name: Case 6, non-working spouse makes the household ineligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 54_000 + weekly_hours_worked_before_lsr: 40 + person2: + age: 28 + weekly_hours_worked_before_lsr: 0 + person3: + age: 4 + childcare_days_per_week: 5 + pre_subsidy_childcare_expenses: 9_600 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: LA + output: + la_ccap_activity_eligible: false + la_ccap_eligible: false + la_ccap: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap.yaml new file mode 100644 index 00000000000..4951237bbcf --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap.yaml @@ -0,0 +1,300 @@ +# Per-child monthly subsidy = max(min(expense, rate x days) - copay x days, 0). +# Days = childcare_days_per_week x 52/12, capped at 22 per month; with 5 days +# per week, days = 21.67. January 2026 uses the 2025 sliding fee scale. +- name: Case 1, zero-copay family with a toddler in a Type III center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 40_800 # $3,400/month, $0 copay band. + weekly_hours_worked_before_lsr: 40 + person2: + age: 2 + childcare_days_per_week: 5 + pre_subsidy_childcare_expenses: 12_000 # $1,000/month. + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + # Toddler rate $42 x 21.67 days = $910; capped at min($1,000, $910); no copay. + la_ccap: 910 + +- name: Case 2, $2 daily copay reduces the subsidy. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 42_000 # $3,500/month, $2 copay band. + weekly_hours_worked_before_lsr: 40 + person2: + age: 2 + childcare_days_per_week: 5 + pre_subsidy_childcare_expenses: 12_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + # $910 - $2 x 21.67 days = $866.67. + la_ccap: 866.67 + +- name: Case 3, part-time hours prorate the monthly day maximum. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 42_000 # $2 copay band. + weekly_hours_worked_before_lsr: 40 + person2: + age: 2 + childcare_hours_per_week: 15 + pre_subsidy_childcare_expenses: 12_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + # 22 days x 15/30 hours = 11 days; $42 x 11 = $462; minus $2 x 11 = $440. + la_ccap: 440 + +- name: Case 4, child not in care receives nothing. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 40_800 + weekly_hours_worked_before_lsr: 40 + person2: + age: 2 + childcare_days_per_week: 0 + childcare_hours_per_week: 0 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap: 0 + +- name: Case 5, TANF-enrolled family gets the full rate with no copay. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 60_000 # Above the income limit; categorical bypass. + weekly_hours_worked_before_lsr: 40 + person2: + age: 2 + childcare_days_per_week: 5 + pre_subsidy_childcare_expenses: 12_000 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_eligible: true + la_ccap: 910 + +- name: Case 6, negative self-employment income does not inflate the benefit. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + self_employment_income: -60_000 # -$5,000/month. + weekly_hours_worked_before_lsr: 40 + person2: + age: 2 + childcare_days_per_week: 5 + pre_subsidy_childcare_expenses: 12_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + # Copay income floors at zero: $0 band; subsidy stays at the $910 cap. + la_ccap: 910 + +- name: Case 7, household outside Louisiana receives nothing. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 40_800 + weekly_hours_worked_before_lsr: 40 + person2: + age: 2 + childcare_days_per_week: 5 + pre_subsidy_childcare_expenses: 12_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: TX + output: + la_ccap_eligible: false + la_ccap: 0 + +- name: Case 8, disabled child gets the special needs rate and a copay waiver. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 42_000 # $2 copay band, waived for the disabled child. + weekly_hours_worked_before_lsr: 40 + person2: + age: 2 + is_disabled: true + childcare_days_per_week: 5 + pre_subsidy_childcare_expenses: 12_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + # Special needs toddler rate $52.92 x 21.67 = $1,146.60, capped at the + # $1,000 monthly expense; no copay for a child with disabilities. + la_ccap: 1_000 + +- name: Case 9, the 2024 scale copay band applies in January 2025. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 42_000 # $3,500/month, $3 band on the 2024 scale. + weekly_hours_worked_before_lsr: 40 + person2: + age: 2 + childcare_days_per_week: 5 + pre_subsidy_childcare_expenses: 12_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_daily_copay: 3 + # Toddler rate $42 x 21.67 = $910, below the $1,000 monthly expense; + # copay $3 x 21.67 = $65; $910 - $65 = $845. + la_ccap: 845 + +- name: Case 10, part-time schedule with attendance days bills hourly. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 42_000 # $2 copay band. + weekly_hours_worked_before_lsr: 40 + person2: + age: 2 + childcare_days_per_week: 5 + childcare_hours_per_day: 3 # Derives 15 hours/week, part-time care. + pre_subsidy_childcare_expenses: 12_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + # Part-time (15 < 30 hours/week) bills the hours proration even though + # attendance days are reported: 22 x 15/30 = 11 day-equivalents; + # min($1,000, $42 x 11 = $462) - $2 x 11 = $440 — not 21.67 full days. + la_ccap: 440 + +- name: Case 11, full-time hours with attendance days bills day units. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 42_000 # $2 copay band. + weekly_hours_worked_before_lsr: 40 + person2: + age: 2 + childcare_days_per_week: 5 + childcare_hours_per_day: 8 # Derives 40 hours/week, full-time care. + pre_subsidy_childcare_expenses: 12_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + # Full-time care pays day units: 5 x 52/12 = 21.67 days; + # min($1,000, $42 x 21.67 = $910) - $2 x 21.67 = $866.67. + la_ccap: 866.67 + +- name: Case 12, full-time hours without days caps at 22 monthly days. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 42_000 # $2 copay band. + weekly_hours_worked_before_lsr: 40 + person2: + age: 2 + childcare_hours_per_week: 40 # No attendance days reported. + pre_subsidy_childcare_expenses: 12_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + # The min(hours/30, 1) clamp holds the proration at the 22-day maximum: + # min($1,000, $42 x 22 = $924) - $2 x 22 = $880. + la_ccap: 880 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_activity_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_activity_eligible.yaml new file mode 100644 index 00000000000..c60de9db81b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_activity_eligible.yaml @@ -0,0 +1,185 @@ +# LAC 28:CLXV.509.A.5: head of household and spouse must each average at +# least 20 hours per week of employment, training, or education, or be a +# full-time student; waived for disabled adults and homeless families; +# reduced to 15 hours for special needs households. +- name: Case 1, single parent working 40 hours qualifies. + period: 2026-01 + input: + people: + person1: + age: 30 + weekly_hours_worked_before_lsr: 40 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_activity_eligible: true + +- name: Case 2, single parent with no work or school fails. + period: 2026-01 + input: + people: + person1: + age: 30 + weekly_hours_worked_before_lsr: 0 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_activity_eligible: false + +- name: Case 3, non-working full-time student qualifies. + period: 2026-01 + input: + people: + person1: + age: 30 + weekly_hours_worked_before_lsr: 0 + is_full_time_student: true + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_activity_eligible: true + +- name: Case 4, disabled head of household is exempt. + period: 2026-01 + input: + people: + person1: + age: 30 + weekly_hours_worked_before_lsr: 0 + is_disabled: true + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_activity_eligible: true + +- name: Case 5, non-working spouse fails the two-parent requirement. + period: 2026-01 + input: + people: + person1: + age: 30 + weekly_hours_worked_before_lsr: 40 + person2: + age: 28 + weekly_hours_worked_before_lsr: 0 + person3: + age: 4 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: LA + output: + la_ccap_activity_eligible: false + +- name: Case 6, student spouse satisfies the two-parent requirement. + period: 2026-01 + input: + people: + person1: + age: 30 + weekly_hours_worked_before_lsr: 40 + person2: + age: 28 + weekly_hours_worked_before_lsr: 0 + is_full_time_student: true + person3: + age: 4 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: LA + output: + la_ccap_activity_eligible: true + +- name: Case 7, 18 hours qualifies with a special needs child. + period: 2026-01 + input: + people: + person1: + age: 30 + weekly_hours_worked_before_lsr: 18 + person2: + age: 4 + is_disabled: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_activity_eligible: true + +- name: Case 8, 18 hours fails without a special needs child. + period: 2026-01 + input: + people: + person1: + age: 30 + weekly_hours_worked_before_lsr: 18 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_activity_eligible: false + +- name: Case 9, homeless family is exempt from the activity test. + period: 2026-01 + input: + people: + person1: + age: 30 + weekly_hours_worked_before_lsr: 0 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + is_homeless: true + output: + la_ccap_activity_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_age_group.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_age_group.yaml new file mode 100644 index 00000000000..8f79fce331a --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_age_group.yaml @@ -0,0 +1,64 @@ +- name: Case 1, six-month-old is an infant. + period: 2026 + input: + people: + person1: + age: 0.5 + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_age_group: INFANT + +- name: Case 2, one-year-old is a toddler. + period: 2026 + input: + people: + person1: + age: 1 + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_age_group: TODDLER + +- name: Case 3, two-year-old is a toddler. + period: 2026 + input: + people: + person1: + age: 2 + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_age_group: TODDLER + +- name: Case 4, three-year-old receives the regular rate. + period: 2026 + input: + people: + person1: + age: 3 + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_age_group: REGULAR + +- name: Case 5, twelve-year-old receives the regular rate. + period: 2026 + input: + people: + person1: + age: 12 + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_age_group: REGULAR diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_categorically_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_categorically_eligible.yaml new file mode 100644 index 00000000000..a9eaaaab3af --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_categorically_eligible.yaml @@ -0,0 +1,56 @@ +# LAC 28:CLXV.505: FITAP recipients in the STEP program and foster children. +- name: Case 1, TANF-enrolled household is categorically eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_categorically_eligible: true + +- name: Case 2, household with a foster child is categorically eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_in_foster_care: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_categorically_eligible: true + +- name: Case 3, household with neither pathway is not categorically eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_categorically_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_copay_waived.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_copay_waived.yaml new file mode 100644 index 00000000000..4cc32462cc1 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_copay_waived.yaml @@ -0,0 +1,119 @@ +# CCDF State Plan FFY 2025-2027 Section 3.3.1 waives co-payments for families +# experiencing homelessness, children with disabilities, and categorically +# eligible households (foster care, STEP). Generic Head Start / Early Head +# Start enrollment is not a waiver category; only Early Head Start-Child Care +# Partnership (EHS-CCP) families are waived, which we do not track. +- name: Case 1, family with a disabled child has the co-payment waived. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 2 + is_disabled: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_copay_waived: true + +- name: Case 2, generic Head Start enrollment does not waive the co-payment. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 2 + is_enrolled_in_head_start: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + # Only EHS-CCP, not generic Head Start, is a waiver category, and EHS-CCP + # is not tracked, so an ordinary Head Start enrollee is not waived. + la_ccap_copay_waived: false + +- name: Case 3, homeless family has the co-payment waived. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 2 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + is_homeless: true + output: + la_ccap_copay_waived: true + +- name: Case 4, TANF-enrolled household has the co-payment waived. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 2 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_copay_waived: true + +- name: Case 5, family with no waiver category pays the scale co-payment. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 2 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_copay_waived: false + +- name: Case 6, a disabled adult does not trigger the child waiver. + period: 2026-01 + input: + people: + person1: + age: 30 + is_disabled: true + person2: + age: 2 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_copay_waived: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_countable_income.yaml new file mode 100644 index 00000000000..00e96802360 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_countable_income.yaml @@ -0,0 +1,146 @@ +# LAC 28:CLXV.509.A.3: gross earnings of head of household and spouse plus +# enumerated recurring unearned income of all household members. +- name: Case 1, head of household earnings count. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 36_000 # $3,000/month. + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_countable_income: 3_000 + +- name: Case 2, a dependent teenager's earnings are excluded. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 36_000 # $3,000/month. + person2: + age: 16 + employment_income: 12_000 # Excluded - not head or spouse. + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_countable_income: 3_000 + +- name: Case 3, a child's SSI counts as unearned income of all members. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 # $2,000/month. + person2: + age: 4 + ssi: 800 # Monthly input for a MONTH-defined variable. + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_countable_income: 2_800 + +- name: Case 4, child support counts before the April 2025 repeal. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 # $2,000/month. + child_support_received: 6_000 # $500/month, countable until 2025-04-20. + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_countable_income: 2_500 + +- name: Case 5, child support no longer counts in 2026. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 24_000 # $2,000/month. + child_support_received: 6_000 # Repealed from countable income by LR 51:529. + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_countable_income: 2_000 + +- name: Case 6, a self-employment loss does not offset gross wages. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 60_000 # $5,000/month gross wages. + self_employment_income: -60_000 # Loss floors at zero, no offset. + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_countable_income: 5_000 + +- name: Case 7, a loss-only earner has zero countable earned income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + self_employment_income: -60_000 + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_countable_income: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_daily_copay.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_daily_copay.yaml new file mode 100644 index 00000000000..720c1e1cc06 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_daily_copay.yaml @@ -0,0 +1,208 @@ +# January 2026 uses the 2025 sliding fee scale (effective February 3, 2025). +# Two-person bands: $0 to $3,474; $2 to $3,746; $3 to $4,017; $8 to $4,289; +# $10 to $4,614. +- name: Case 1, income below 65% SMI has no co-payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 40_800 # $3,400/month, in the $0 band. + person2: + age: 2 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_daily_copay: 0 + +- name: Case 2, income in the second band pays $2 per day. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 42_000 # $3,500/month. + person2: + age: 2 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_daily_copay: 2 + +- name: Case 3, income in the third band pays $3 per day. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 46_800 # $3,900/month. + person2: + age: 2 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_daily_copay: 3 + +- name: Case 4, income in the fourth band pays $8 per day. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 49_200 # $4,100/month. + person2: + age: 2 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_daily_copay: 8 + +- name: Case 5, income in the top band pays $10 per day. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 52_800 # $4,400/month. + person2: + age: 2 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_daily_copay: 10 + +- name: Case 6, TANF-enrolled household pays no co-payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 52_800 + person2: + age: 2 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_daily_copay: 0 + +- name: Case 7, homeless household pays no co-payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 52_800 + person2: + age: 2 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + is_homeless: true + output: + la_ccap_daily_copay: 0 + +- name: Case 8, the same income falls in the $3 band of the 2024 scale. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 40_800 # $3,400/month, 2024-scale $3 band starts at $3,400. + person2: + age: 2 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_daily_copay: 3 + +- name: Case 9, disabled child waives the co-payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 52_800 # Top band income, as in Case 5. + person2: + age: 2 + is_disabled: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_daily_copay: 0 + +- name: Case 10, generic Head Start enrollment does not waive the co-payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 52_800 # Top band income, as in Case 5. + person2: + age: 2 + is_enrolled_in_head_start: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + # EHS-CCP, not generic Head Start, is the waiver category and is not + # tracked, so the top-band co-payment still applies. + la_ccap_daily_copay: 10 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_daily_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_daily_rate.yaml new file mode 100644 index 00000000000..de5f57b8a37 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_daily_rate.yaml @@ -0,0 +1,155 @@ +# State maximum daily rates per LAC 28:CLXV.515.A (LR 48:1270, May 20, 2022). +- name: Case 1, infant in a Type III early learning center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 0.5 + la_ccap_provider_type: TYPE_III_EARLY_LEARNING_CENTER + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_daily_rate: 68 + +- name: Case 2, toddler with a family child care provider. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 2 + la_ccap_provider_type: FAMILY_CHILD_CARE + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_daily_rate: 42 + +- name: Case 3, preschooler with an in-home provider. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 5 + la_ccap_provider_type: IN_HOME + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_daily_rate: 25 + +- name: Case 4, school-age child in a school child care center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 7 + la_ccap_provider_type: SCHOOL_CHILD_CARE_CENTER + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_daily_rate: 24 + +- name: Case 5, school-age child in a military child care center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 10 + la_ccap_provider_type: MILITARY_CHILD_CARE_CENTER + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_daily_rate: 31.5 + +- name: Case 6, disabled child receives the special needs incentive rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 4 + is_disabled: true + la_ccap_provider_type: TYPE_III_EARLY_LEARNING_CENTER + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_daily_rate: 39.69 + +- name: Case 7, disabled infant in a Type III early learning center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 0.5 + is_disabled: true + la_ccap_provider_type: TYPE_III_EARLY_LEARNING_CENTER + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_daily_rate: 85.68 + +- name: Case 8, disabled toddler with a family child care provider. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 2 + is_disabled: true + la_ccap_provider_type: FAMILY_CHILD_CARE + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_daily_rate: 52.92 + +- name: Case 9, disabled school-age child in a school child care center. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 7 + is_disabled: true + la_ccap_provider_type: SCHOOL_CHILD_CARE_CENTER + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_daily_rate: 30.24 + +- name: Case 10, disabled toddler with an in-home provider. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 2 + is_disabled: true + la_ccap_provider_type: IN_HOME + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_daily_rate: 31.82 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_eligible.yaml new file mode 100644 index 00000000000..0de7c13f511 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_eligible.yaml @@ -0,0 +1,121 @@ +- name: Case 1, working family below the income limit is eligible. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 40_800 # $3,400/month vs $4,614 two-person limit. + weekly_hours_worked_before_lsr: 40 + person2: + age: 2 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_eligible: true + +- name: Case 2, income above the limit without categorical eligibility fails. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 60_000 # $5,000/month vs $4,614 two-person limit. + weekly_hours_worked_before_lsr: 40 + person2: + age: 2 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_eligible: false + +- name: Case 3, TANF enrollment bypasses the income and activity tests. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 60_000 + weekly_hours_worked_before_lsr: 0 + person2: + age: 2 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_eligible: true + +- name: Case 4, household without an eligible child fails. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 40_800 + weekly_hours_worked_before_lsr: 40 + person2: + age: 14 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_eligible: false + +- name: Case 5, assets above the CCDF limit fail. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 40_800 + weekly_hours_worked_before_lsr: 40 + person2: + age: 2 + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_assets: 1_500_000 + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_eligible: false + +- name: Case 6, failing the activity test without categorical eligibility fails. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 40_800 + weekly_hours_worked_before_lsr: 0 + person2: + age: 2 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_eligible_child.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_eligible_child.yaml new file mode 100644 index 00000000000..14df0bc3ce1 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_eligible_child.yaml @@ -0,0 +1,121 @@ +- name: Case 1, five-year-old citizen in Louisiana is eligible. + period: 2026-01 + input: + people: + person1: + age: 5 + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_eligible_child: true + +- name: Case 2, twelve-year-old is eligible. + period: 2026-01 + input: + people: + person1: + age: 12 + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_eligible_child: true + +- name: Case 3, thirteen-year-old without a disability is not eligible. + period: 2026-01 + input: + people: + person1: + age: 13 + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_eligible_child: false + +- name: Case 4, thirteen-year-old with a disability is eligible. + period: 2026-01 + input: + people: + person1: + age: 13 + is_incapable_of_self_care: true + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_eligible_child: true + +- name: Case 5, seventeen-year-old with a disability is eligible. + period: 2026-01 + input: + people: + person1: + age: 17 + is_incapable_of_self_care: true + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_eligible_child: true + +- name: Case 5a, eighteen-year-old with a disability is not eligible. + period: 2026-01 + input: + people: + person1: + age: 18 + is_incapable_of_self_care: true + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_eligible_child: false + +- name: Case 6, undocumented child is not eligible. + period: 2026-01 + input: + people: + person1: + age: 5 + immigration_status: UNDOCUMENTED + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_eligible_child: false + +- name: Case 7, child outside Louisiana is not eligible. + period: 2026-01 + input: + people: + person1: + age: 5 + households: + household: + members: [person1] + state_code: TX + output: + la_ccap_eligible_child: false + +- name: Case 8, thirteen-year-old receiving SSI is eligible. + period: 2026-01 + input: + people: + person1: + age: 13 + ssi: 600 # Receipt of SSI satisfies the §503.A.2 13-17 route. + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_eligible_child: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_income_eligible.yaml new file mode 100644 index 00000000000..7f9dae52b84 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_income_eligible.yaml @@ -0,0 +1,101 @@ +# Limits are the 85% SMI column of the LDOE sliding fee scale. January 2026 +# uses the 2025 scale (effective February 3, 2025): $4,614/month for a +# 2-person household and $5,700/month for a 3-person household. +- name: Case 1, three-person household just below the limit. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 68_388 # $5,699/month vs $5,700 limit. + person2: + age: 28 + person3: + age: 4 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: LA + output: + la_ccap_income_eligible: true + +- name: Case 2, three-person household just above the limit. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 68_424 # $5,702/month vs $5,700 limit. + person2: + age: 28 + person3: + age: 4 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: LA + output: + la_ccap_income_eligible: false + +- name: Case 3, two-person household below the limit. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 55_200 # $4,600/month vs $4,614 limit. + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_income_eligible: true + +- name: Case 4, two-person household above the limit. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 55_512 # $4,626/month vs $4,614 limit. + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_income_eligible: false + +- name: Case 5, 2024 era uses the 2024 scale limit. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 55_200 # $4,600/month vs $4,187 limit (2024 scale). + person2: + age: 4 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_income_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_monthly_days.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_monthly_days.yaml new file mode 100644 index 00000000000..0384b8fe05f --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_monthly_days.yaml @@ -0,0 +1,81 @@ +# Paid day units per LAC 28:CLXV.103: full-time care in day units (max 22 +# per month); part-time care prorated against the 30-hour threshold; the +# lesser of day-based and hours-based billing when both are reported. +- name: Case 1, five attendance days per week bills 21.67 days. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 2 + childcare_days_per_week: 5 + households: + household: + members: [person1] + state_code: LA + output: + # 5 x 52/12 = 21.67. + la_ccap_monthly_days: 21.67 + +- name: Case 2, fifteen weekly hours bill eleven day-equivalents. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 2 + childcare_hours_per_week: 15 + households: + household: + members: [person1] + state_code: LA + output: + # 22 x 15/30 = 11. + la_ccap_monthly_days: 11 + +- name: Case 3, part-time schedule with attendance days bills the lesser units. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 2 + childcare_days_per_week: 5 + childcare_hours_per_day: 3 # Derives 15 hours/week. + households: + household: + members: [person1] + state_code: LA + output: + # min(21.67 day units, 11 hour units) = 11. + la_ccap_monthly_days: 11 + +- name: Case 4, seven attendance days per week cap at 22 days. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 2 + childcare_days_per_week: 7 + households: + household: + members: [person1] + state_code: LA + output: + # 7 x 52/12 = 30.33, capped at the 22-day monthly maximum. + la_ccap_monthly_days: 22 + +- name: Case 5, no reported schedule bills nothing. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 2 + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_monthly_days: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_smi.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_smi.yaml new file mode 100644 index 00000000000..3edb4d9850a --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_smi.yaml @@ -0,0 +1,66 @@ +# Monthly SMI = HHS four-person state median income x household size +# adjustment / 12, taken from the federal fiscal year estimates underlying +# the sliding fee scale in effect; January falls under the prior February's +# scale. +- name: Case 1, two-person household in January 2026 uses the FY 2025 estimates. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 2 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + # $95,801 x 0.68 / 12 = $5,428.72. + la_ccap_smi: 5_428.72 + +- name: Case 2, two-person household in January 2025 uses the FY 2024 estimates. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + person2: + age: 2 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + # $86,934 x 0.68 / 12 = $4,926.26. + la_ccap_smi: 4_926.26 + +- name: Case 3, whole-year 2026 spans the February scale change without uprating. + period: 2026 + absolute_error_margin: 0.05 + input: + people: + person1: + age: 30 + person2: + age: 2 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + # Jan uses the FY 2025 table: $95,801 x 0.68 / 12 = $5,428.72; Feb-Dec + # use the published FY 2026 table (2025-10-01 entry, $98,137), not the + # CBO-uprated projection: 11 x $5,561.10 = $61,172.06. Total $66,600.79. + # Regression guard: uprating past the table end would give $69,935.79. + la_ccap_smi: 66_600.79 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_special_needs_child.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_special_needs_child.yaml new file mode 100644 index 00000000000..5d25503daa5 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_special_needs_child.yaml @@ -0,0 +1,84 @@ +# LAC 28:CLXV.103: a child birth through 17 with an IEP/IFSP under IDEA or +# receiving SSI; the general is_disabled flag is also accepted. +- name: Case 1, disabled child qualifies. + period: 2026-01 + input: + people: + person1: + age: 5 + is_disabled: true + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_special_needs_child: true + +- name: Case 2, child with an IEP qualifies. + period: 2026-01 + input: + people: + person1: + age: 5 + has_individualized_education_program: true + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_special_needs_child: true + +- name: Case 3, toddler with a developmental delay qualifies. + period: 2026-01 + input: + people: + person1: + age: 2 + has_developmental_delay: true + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_special_needs_child: true + +- name: Case 4, child receiving SSI qualifies. + period: 2026-01 + input: + people: + person1: + age: 5 + ssi: 600 # Monthly SSI receipt. + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_special_needs_child: true + +- name: Case 5, child with no qualifying condition does not qualify. + period: 2026-01 + input: + people: + person1: + age: 5 + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_special_needs_child: false + +- name: Case 6, eighteen-year-old is above the birth-to-17 range. + period: 2026-01 + input: + people: + person1: + age: 18 + is_disabled: true + households: + household: + members: [person1] + state_code: LA + output: + la_ccap_special_needs_child: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_total_copay.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_total_copay.yaml new file mode 100644 index 00000000000..5d9bf8ffae6 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_total_copay.yaml @@ -0,0 +1,96 @@ +# Total monthly co-payment = sliding fee scale daily copay x paid days, +# summed over eligible children in care; the copay is per child per day. +- name: Case 1, one toddler in the $2 band five days a week. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 42_000 # $3,500/month, $2 copay band. + weekly_hours_worked_before_lsr: 40 + person2: + age: 2 + childcare_days_per_week: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + # $2 x 21.67 days = $43.33. + la_ccap_total_copay: 43.33 + +- name: Case 2, two children each owe the per-child daily copay. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 54_000 # $4,500/month, $2 band for 3 persons. + weekly_hours_worked_before_lsr: 40 + person2: + age: 0.5 + childcare_days_per_week: 5 + person3: + age: 4 + childcare_days_per_week: 5 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: LA + output: + # $2 x 21.67 days x 2 children = $86.67. + la_ccap_total_copay: 86.67 + +- name: Case 3, TANF-enrolled household owes no co-payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 42_000 + weekly_hours_worked_before_lsr: 40 + person2: + age: 2 + childcare_days_per_week: 5 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: LA + output: + la_ccap_total_copay: 0 + +- name: Case 4, part-time hours owe the copay on prorated days. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 42_000 # $2 copay band. + weekly_hours_worked_before_lsr: 40 + person2: + age: 2 + childcare_hours_per_week: 15 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + # $2 x 11 day-equivalents = $22. + la_ccap_total_copay: 22 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_total_payment_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_total_payment_rate.yaml new file mode 100644 index 00000000000..927f8ceef12 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/ldoe/ccap/la_ccap_total_payment_rate.yaml @@ -0,0 +1,50 @@ +# Total monthly payment rate = state maximum daily rate x paid days, summed +# over eligible children in care (LAC 28:CLXV.515). +- name: Case 1, one toddler in a Type III center five days a week. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 40_800 + weekly_hours_worked_before_lsr: 40 + person2: + age: 2 + childcare_days_per_week: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + # Toddler rate $42 x 21.67 days = $910. + la_ccap_total_payment_rate: 910 + +- name: Case 2, an infant and a preschooler sum their rates. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 54_000 + weekly_hours_worked_before_lsr: 40 + person2: + age: 0.5 + childcare_days_per_week: 5 + person3: + age: 4 + childcare_days_per_week: 5 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: LA + output: + # Infant $68 x 21.67 + regular $31.50 x 21.67 = $99.50 x 21.67 = $2,155.83. + la_ccap_total_payment_rate: 2_155.83 diff --git a/policyengine_us/variables/gov/states/la/ldoe/ccap/eligibility/la_ccap_activity_eligible.py b/policyengine_us/variables/gov/states/la/ldoe/ccap/eligibility/la_ccap_activity_eligible.py new file mode 100644 index 00000000000..83134ed2a04 --- /dev/null +++ b/policyengine_us/variables/gov/states/la/ldoe/ccap/eligibility/la_ccap_activity_eligible.py @@ -0,0 +1,38 @@ +from policyengine_us.model_api import * + + +class la_ccap_activity_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = MONTH + label = "Louisiana CCAP activity eligible" + reference = "https://www.doa.la.gov/media/043btqeh/28v165.docx" + defined_for = StateCode.LA + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.la.ldoe.ccap + person = spm_unit.members + is_head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) + hours = person("weekly_hours_worked_before_lsr", period.this_year) + student = person("is_full_time_student", period.this_year) + disabled = person("is_disabled", period.this_year) + # LAC 28:CLXV.509.A.5.d reduces the hours requirement for households + # that qualify for special needs child care (§103). + has_special_needs_child = ( + add(spm_unit, period, ["la_ccap_special_needs_child"]) > 0 + ) + required_hours = where( + has_special_needs_child, + p.activity.special_needs_weekly_hours, + p.activity.weekly_hours, + ) + # LAC 28:CLXV.509.A.5.a: 20 hours per week of employment, training, or + # education, or full-time student status; waived for disabled adults + # (§509.A.5.a) — each adult must meet the requirement per the TEMP + # definition in §103. The 90-day job-search waiver is a time-limited + # certification state we don't model. + meets = (hours >= spm_unit.project(required_hours)) | student | disabled + failing_adults = spm_unit.sum(is_head_or_spouse & ~meets) + # §509.A.5.b waives the requirement for homeless parents. + homeless = spm_unit.household("is_homeless", period.this_year) + return (failing_adults == 0) | homeless diff --git a/policyengine_us/variables/gov/states/la/ldoe/ccap/eligibility/la_ccap_categorically_eligible.py b/policyengine_us/variables/gov/states/la/ldoe/ccap/eligibility/la_ccap_categorically_eligible.py new file mode 100644 index 00000000000..ce5e93eebc5 --- /dev/null +++ b/policyengine_us/variables/gov/states/la/ldoe/ccap/eligibility/la_ccap_categorically_eligible.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class la_ccap_categorically_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = MONTH + label = "Louisiana CCAP categorically eligible" + reference = "https://www.doa.la.gov/media/043btqeh/28v165.docx" + defined_for = StateCode.LA + + def formula(spm_unit, period, parameters): + # LAC 28:CLXV.505: FITAP recipients participating in the STEP program + # and children in foster care. STEP participation is approximated by + # TANF enrollment; we don't track STEP work-program status separately + # at the moment. + tanf_enrolled = spm_unit("is_tanf_enrolled", period) + has_foster_child = add(spm_unit, period, ["is_in_foster_care"]) > 0 + return tanf_enrolled | has_foster_child diff --git a/policyengine_us/variables/gov/states/la/ldoe/ccap/eligibility/la_ccap_eligible.py b/policyengine_us/variables/gov/states/la/ldoe/ccap/eligibility/la_ccap_eligible.py new file mode 100644 index 00000000000..0da2ed21ce6 --- /dev/null +++ b/policyengine_us/variables/gov/states/la/ldoe/ccap/eligibility/la_ccap_eligible.py @@ -0,0 +1,26 @@ +from policyengine_us.model_api import * + + +class la_ccap_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = MONTH + label = "Eligible for Louisiana CCAP" + reference = "https://www.doa.la.gov/media/043btqeh/28v165.docx" + defined_for = StateCode.LA + + def formula(spm_unit, period, parameters): + has_eligible_child = add(spm_unit, period, ["la_ccap_eligible_child"]) > 0 + # LAC 28:CLXV.505: categorically eligible households skip the income + # and activity tests of §509. + categorical = spm_unit("la_ccap_categorically_eligible", period) + income_eligible = spm_unit("la_ccap_income_eligible", period) + activity_eligible = spm_unit("la_ccap_activity_eligible", period) + # The $1,000,000 asset limit follows the federal CCDF standard + # (CCDF State Plan §2.2.6) and is not waived for any pathway. + asset_eligible = spm_unit("is_ccdf_asset_eligible", period.this_year) + return ( + has_eligible_child + & asset_eligible + & (categorical | (income_eligible & activity_eligible)) + ) diff --git a/policyengine_us/variables/gov/states/la/ldoe/ccap/eligibility/la_ccap_eligible_child.py b/policyengine_us/variables/gov/states/la/ldoe/ccap/eligibility/la_ccap_eligible_child.py new file mode 100644 index 00000000000..98f9da14111 --- /dev/null +++ b/policyengine_us/variables/gov/states/la/ldoe/ccap/eligibility/la_ccap_eligible_child.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +class la_ccap_eligible_child(Variable): + value_type = bool + entity = Person + definition_period = MONTH + label = "Louisiana CCAP eligible child" + reference = "https://www.doa.la.gov/media/043btqeh/28v165.docx" + defined_for = StateCode.LA + + def formula(person, period, parameters): + p = parameters(period).gov.states.la.ldoe.ccap.age + age = person("age", period.this_year) + # LAC 28:CLXV.503.A.2: under 13, or 13-17 and incapable of self-care + # (verified by a physician or by receipt of SSI). The court-supervision + # pathway for ages 13-17 is not tracked at the moment. + incapable = person("is_incapable_of_self_care", period.this_year) + receives_ssi = person("ssi", period) > 0 + older_child_eligible = (incapable | receives_ssi) & ( + age < p.disabled_child_limit + ) + age_eligible = (age < p.child_limit) | older_child_eligible + immigration_eligible = person( + "is_ccdf_immigration_eligible_child", period.this_year + ) + return age_eligible & immigration_eligible diff --git a/policyengine_us/variables/gov/states/la/ldoe/ccap/eligibility/la_ccap_income_eligible.py b/policyengine_us/variables/gov/states/la/ldoe/ccap/eligibility/la_ccap_income_eligible.py new file mode 100644 index 00000000000..d4fef6218d8 --- /dev/null +++ b/policyengine_us/variables/gov/states/la/ldoe/ccap/eligibility/la_ccap_income_eligible.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class la_ccap_income_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = MONTH + label = "Louisiana CCAP income eligible" + reference = "https://www.doa.la.gov/media/043btqeh/28v165.docx" + defined_for = StateCode.LA + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.la.ldoe.ccap + income = spm_unit("la_ccap_countable_income", period) + monthly_smi = spm_unit("la_ccap_smi", period) + # LAC 28:CLXV.509.A.3: countable income at or below 85% of the + # state median income. + return income <= p.income.limit * monthly_smi diff --git a/policyengine_us/variables/gov/states/la/ldoe/ccap/income/la_ccap_countable_income.py b/policyengine_us/variables/gov/states/la/ldoe/ccap/income/la_ccap_countable_income.py new file mode 100644 index 00000000000..a99f6cbab09 --- /dev/null +++ b/policyengine_us/variables/gov/states/la/ldoe/ccap/income/la_ccap_countable_income.py @@ -0,0 +1,30 @@ +from policyengine_us.model_api import * + + +class la_ccap_countable_income(Variable): + value_type = float + entity = SPMUnit + definition_period = MONTH + label = "Louisiana CCAP countable income" + unit = USD + reference = "https://www.doa.la.gov/media/043btqeh/28v165.docx" + defined_for = StateCode.LA + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.la.ldoe.ccap.income + person = spm_unit.members + # LAC 28:CLXV.509.A.3.a counts gross earnings of the head of household + # and the legal or non-legal spouse; minor unmarried parents are not + # tracked separately at the moment. + is_head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) + # §509.A.3.a counts gross earnings. Wages cannot be negative, but a + # self-employment or farm loss yields zero gross earnings and cannot + # offset wages, so the self-employment subtotal is floored at zero. + wages = add(person, period, p.wage_sources) + self_employment = max_(add(person, period, p.self_employment_sources), 0) + earned = wages + self_employment + countable_earned = spm_unit.sum(earned * is_head_or_spouse) + # LAC 28:CLXV.509.A.3.b counts enumerated recurring unearned income of + # all household members. + unearned = add(spm_unit, period, p.unearned_sources) + return countable_earned + unearned diff --git a/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap.py b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap.py new file mode 100644 index 00000000000..35a19d35efe --- /dev/null +++ b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap.py @@ -0,0 +1,32 @@ +from policyengine_us.model_api import * + + +class la_ccap(Variable): + value_type = float + entity = SPMUnit + definition_period = MONTH + label = "Louisiana Child Care Assistance Program benefit" + unit = USD + reference = "https://www.doa.la.gov/media/043btqeh/28v165.docx" + defined_for = "la_ccap_eligible" + + def formula(spm_unit, period, parameters): + person = spm_unit.members + daily_rate = person("la_ccap_daily_rate", period) + # Paid day units per child (zero for ineligible children via + # defined_for on la_ccap_monthly_days). + monthly_days = person("la_ccap_monthly_days", period) + # The sliding fee scale co-payment is per child per day; waivers + # (homelessness, disability, Head Start, STEP) zero it through + # la_ccap_copay_waived. + # NOTE: we bill the copay as the daily band x attendance days, per the + # FFY 2022-2024 CCDF Plan's "copay as a daily rate" framing. The current + # plan (FFY 2025-2027 Section 3.2.1.b) treats the published monthly band + # as not varying by hours in care, so this slightly under-charges + # part-time families; full-time care (the dominant case) is exact. + unit_copay = spm_unit("la_ccap_daily_copay", period) + child_copay = spm_unit.project(unit_copay) + monthly_expense = person("pre_subsidy_childcare_expenses", period) + capped_charge = min_(monthly_expense, daily_rate * monthly_days) + per_child = max_(capped_charge - child_copay * monthly_days, 0) + return spm_unit.sum(per_child) diff --git a/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_age_group.py b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_age_group.py new file mode 100644 index 00000000000..c7d78538196 --- /dev/null +++ b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_age_group.py @@ -0,0 +1,26 @@ +from policyengine_us.model_api import * + + +class LACCAPAgeGroup(Enum): + INFANT = "Infant" + TODDLER = "Toddler" + REGULAR = "Regular" + + +class la_ccap_age_group(Variable): + value_type = Enum + possible_values = LACCAPAgeGroup + default_value = LACCAPAgeGroup.REGULAR + entity = Person + definition_period = YEAR + label = "Louisiana CCAP child age group" + reference = "https://www.louisianabelieves.com/docs/default-source/child-care-providers/ccap-rate-changes.pdf?sfvrsn=2f5d8d1f_10" + + def formula(person, period, parameters): + p = parameters(period).gov.states.la.ldoe.ccap.age_group + age = person("age", period) + return select( + [age < p.infant_age_limit, age < p.toddler_age_limit], + [LACCAPAgeGroup.INFANT, LACCAPAgeGroup.TODDLER], + default=LACCAPAgeGroup.REGULAR, + ) diff --git a/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_copay_waived.py b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_copay_waived.py new file mode 100644 index 00000000000..435e175a4ab --- /dev/null +++ b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_copay_waived.py @@ -0,0 +1,31 @@ +from policyengine_us.model_api import * + + +class la_ccap_copay_waived(Variable): + value_type = bool + entity = SPMUnit + definition_period = MONTH + label = "Louisiana CCAP co-payment waived" + reference = ( + "https://www.louisianabelieves.com/docs/default-source/early-childhood/ccap-sliding-fee-scale.pdf", + "https://www.doa.la.gov/media/043btqeh/28v165.docx", + ) + defined_for = StateCode.LA + + def formula(spm_unit, period, parameters): + person = spm_unit.members + # CCDF State Plan FFY 2025-2027 Section 3.3.1 waives co-payments for + # families experiencing homelessness, children with disabilities, and + # categorically eligible households (foster care and STEP, who pay no + # co-payment because the state pays 100% of the maximum rate per + # LAC 28:CLXV.515.B). Section 3.3.1 leaves generic Head Start / Early + # Head Start enrollment unchecked; only Early Head Start-Child Care + # Partnership (EHS-CCP) families are waived (Section 3.3.1.vii). We + # don't track EHS-CCP partnership enrollment at the moment, so that + # narrow waiver is not modeled. + eligible_child = person("la_ccap_eligible_child", period) + special_needs = person("la_ccap_special_needs_child", period) + waived_child = spm_unit.any(eligible_child & special_needs) + homeless = spm_unit.household("is_homeless", period.this_year) + categorical = spm_unit("la_ccap_categorically_eligible", period) + return waived_child | homeless | categorical diff --git a/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_daily_copay.py b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_daily_copay.py new file mode 100644 index 00000000000..77cf9c570c7 --- /dev/null +++ b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_daily_copay.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class la_ccap_daily_copay(Variable): + value_type = float + entity = SPMUnit + definition_period = MONTH + label = "Louisiana CCAP daily co-payment" + unit = USD + reference = "https://www.louisianabelieves.com/docs/default-source/early-childhood/ccap-sliding-fee-scale.pdf" + defined_for = "la_ccap_eligible" + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.la.ldoe.ccap + waived = spm_unit("la_ccap_copay_waived", period) + income = max_(spm_unit("la_ccap_countable_income", period), 0) + monthly_smi = spm_unit("la_ccap_smi", period) + # The sliding fee scale bands are fixed shares of the state median + # income; the published dollar band tops equal these shares rounded + # to whole dollars. + smi_share = where(monthly_smi > 0, income / monthly_smi, 0) + return where(waived, 0, p.copay.daily_amount.calc(smi_share)) diff --git a/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_daily_rate.py b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_daily_rate.py new file mode 100644 index 00000000000..3af36de348d --- /dev/null +++ b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_daily_rate.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class la_ccap_daily_rate(Variable): + value_type = float + entity = Person + definition_period = MONTH + label = "Louisiana CCAP state maximum daily rate" + unit = USD + reference = "https://www.doa.la.gov/media/ny1gpl0g/2205.pdf#page=8" + defined_for = "la_ccap_eligible_child" + + def formula(person, period, parameters): + p = parameters(period).gov.states.la.ldoe.ccap.rates + provider_type = person("la_ccap_provider_type", period.this_year) + age_group = person("la_ccap_age_group", period.this_year) + # LAC 28:CLXV.515.A: the Special Needs Care Incentive rate applies to + # children qualifying for care for children with disabilities (§103). + special_needs = person("la_ccap_special_needs_child", period) + regular_rate = p.regular[provider_type][age_group] + special_needs_rate = p.special_needs[provider_type][age_group] + return where(special_needs, special_needs_rate, regular_rate) diff --git a/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_monthly_days.py b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_monthly_days.py new file mode 100644 index 00000000000..e476745d43a --- /dev/null +++ b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_monthly_days.py @@ -0,0 +1,40 @@ +from policyengine_us.model_api import * + + +class la_ccap_monthly_days(Variable): + value_type = float + entity = Person + definition_period = MONTH + label = "Louisiana CCAP paid child care days per month" + unit = "day" + reference = "https://www.doa.la.gov/media/043btqeh/28v165.docx" + defined_for = "la_ccap_eligible_child" + + def formula(person, period, parameters): + p = parameters(period).gov.states.la.ldoe.ccap.payment + days_per_week = person("childcare_days_per_week", period.this_year) + hours_per_week = person("childcare_hours_per_week", period.this_year) + weeks_per_month = WEEKS_IN_YEAR / MONTHS_IN_YEAR + days_from_days = days_per_week * weeks_per_month + # Part-time hourly rates are not published; hours are prorated + # against the 30-hour full-time threshold (LAC 28:CLXV.103). + days_from_hours = p.max_monthly_days * min_( + hours_per_week / p.full_time_weekly_hours, 1 + ) + # LAC 28:CLXV.103: full-time care (30+ hours per week) is paid in day + # units up to 22 per month, while part-time care is paid hourly with + # each day's total capped at the daily rate. Billing is therefore the + # lesser of the day-based and hours-based units when both schedule + # inputs are reported (a part-time schedule with attendance days must + # not bill full-day units); a record reporting only one input is + # billed on that input alone. + has_days = days_per_week > 0 + has_hours = hours_per_week > 0 + day_units = where(has_days, days_from_days, p.max_monthly_days) + hour_units = where(has_hours, days_from_hours, p.max_monthly_days) + in_care = has_days | has_hours + return where( + in_care, + min_(min_(day_units, hour_units), p.max_monthly_days), + 0, + ) diff --git a/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_provider_type.py b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_provider_type.py new file mode 100644 index 00000000000..773563784af --- /dev/null +++ b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_provider_type.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class LACCAPProviderType(Enum): + TYPE_III_EARLY_LEARNING_CENTER = "Type III early learning center" + SCHOOL_CHILD_CARE_CENTER = "School child care center" + FAMILY_CHILD_CARE = "Family child care provider" + IN_HOME = "In-home provider" + MILITARY_CHILD_CARE_CENTER = "Military child care center" + + +class la_ccap_provider_type(Variable): + value_type = Enum + possible_values = LACCAPProviderType + default_value = LACCAPProviderType.TYPE_III_EARLY_LEARNING_CENTER + entity = Person + definition_period = YEAR + label = "Louisiana CCAP child care provider type" + reference = "https://www.doa.la.gov/media/043btqeh/28v165.docx" diff --git a/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_smi.py b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_smi.py new file mode 100644 index 00000000000..50fd2f84aca --- /dev/null +++ b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_smi.py @@ -0,0 +1,37 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.hhs.hhs_smi import smi + + +class la_ccap_smi(Variable): + value_type = float + entity = SPMUnit + definition_period = MONTH + label = "Louisiana CCAP state median income" + unit = USD + reference = ( + "https://www.louisianabelieves.com/docs/default-source/early-childhood/ccap-sliding-fee-scale.pdf", + "https://doe.louisiana.gov/docs/default-source/early-childhood/early-childhood-provider-updates-(february-2025).pdf", + ) + defined_for = StateCode.LA + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.la.ldoe.ccap + # Each annual scale takes effect in February (per LDOE provider-update + # memos) and is built from the ACF state median income estimates for + # the federal fiscal year that began the prior October (scale footer: + # "Based on ACS [year] SMI Estimates in ACF Resource updated May/June + # [year]"). Pin the lookup to that October 1 instant: it lands on the + # SMI table's explicit entries, whereas reading at the February + # effective date falls past the series end for the newest scale and + # picks up CBO uprating instead of the published table. January falls + # under the prior year's scale. + year = period.start.year + month = period.start.month + if month >= 2: + instant_str = f"{year - 1}-10-01" + else: + instant_str = f"{year - 2}-10-01" + size = spm_unit("spm_unit_size", period.this_year) + capped_size = clip(size, p.household_size.minimum, p.household_size.maximum) + state = spm_unit.household("state_code_str", period.this_year) + return smi(capped_size, state, instant_str, parameters) / MONTHS_IN_YEAR diff --git a/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_special_needs_child.py b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_special_needs_child.py new file mode 100644 index 00000000000..989431b55c7 --- /dev/null +++ b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_special_needs_child.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +class la_ccap_special_needs_child(Variable): + value_type = bool + entity = Person + definition_period = MONTH + label = "Louisiana CCAP special needs child" + reference = "https://www.doa.la.gov/media/043btqeh/28v165.docx" + defined_for = StateCode.LA + + def formula(person, period, parameters): + p = parameters(period).gov.states.la.ldoe.ccap.age + # LAC 28:CLXV.103 "Care for Children with Disabilities": a child birth + # through age 17 with a current IEP or IFSP under IDEA, or who receives + # SSI. The IFSP (IDEA Part C, birth to age three) route is approximated + # by a screening-indicated developmental delay; the general is_disabled + # flag is also accepted as the broad disability signal underlying the + # statutory IEP/IFSP/SSI channels. + age = person("age", period.this_year) + disabled = person("is_disabled", period.this_year) + iep = person("has_individualized_education_program", period.this_year) + developmental_delay = person("has_developmental_delay", period.this_year) + receives_ssi = person("ssi", period) > 0 + return (age < p.disabled_child_limit) & ( + disabled | iep | developmental_delay | receives_ssi + ) diff --git a/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_total_copay.py b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_total_copay.py new file mode 100644 index 00000000000..86e62292587 --- /dev/null +++ b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_total_copay.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class la_ccap_total_copay(Variable): + value_type = float + entity = SPMUnit + definition_period = MONTH + label = "Louisiana CCAP total monthly co-payment" + unit = USD + reference = "https://www.louisianabelieves.com/docs/default-source/early-childhood/ccap-sliding-fee-scale.pdf" + defined_for = "la_ccap_eligible" + + def formula(spm_unit, period, parameters): + person = spm_unit.members + # The sliding fee scale co-payment applies per child per paid day; + # waivers zero it through la_ccap_daily_copay. + daily_copay = spm_unit("la_ccap_daily_copay", period) + monthly_days = spm_unit.sum(person("la_ccap_monthly_days", period)) + return daily_copay * monthly_days diff --git a/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_total_payment_rate.py b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_total_payment_rate.py new file mode 100644 index 00000000000..80832278fe3 --- /dev/null +++ b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_ccap_total_payment_rate.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class la_ccap_total_payment_rate(Variable): + value_type = float + entity = SPMUnit + definition_period = MONTH + label = "Louisiana CCAP total monthly payment rate" + unit = USD + reference = "https://www.doa.la.gov/media/043btqeh/28v165.docx" + defined_for = "la_ccap_eligible" + + def formula(spm_unit, period, parameters): + person = spm_unit.members + # LAC 28:CLXV.515: the state maximum daily rate times the paid days + # for each eligible child in care. + daily_rate = person("la_ccap_daily_rate", period) + monthly_days = person("la_ccap_monthly_days", period) + return spm_unit.sum(daily_rate * monthly_days) diff --git a/policyengine_us/variables/gov/states/la/ldoe/ccap/la_child_care_subsidies.py b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_child_care_subsidies.py new file mode 100644 index 00000000000..9c3477a3999 --- /dev/null +++ b/policyengine_us/variables/gov/states/la/ldoe/ccap/la_child_care_subsidies.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class la_child_care_subsidies(Variable): + value_type = float + entity = SPMUnit + label = "Louisiana child care subsidies" + unit = USD + definition_period = YEAR + defined_for = StateCode.LA + adds = ["la_ccap"]