diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb2d..c6b6ff1248a 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,4 @@ +- bump: minor + changes: + added: + - Illinois Prevention Initiative (PI) program. diff --git a/policyengine_us/parameters/gov/states/il/isbe/pi/benefit/amount.yaml b/policyengine_us/parameters/gov/states/il/isbe/pi/benefit/amount.yaml new file mode 100644 index 00000000000..6d1ff33cb93 --- /dev/null +++ b/policyengine_us/parameters/gov/states/il/isbe/pi/benefit/amount.yaml @@ -0,0 +1,16 @@ +description: Illinois provides this amount per child under the Prevention Initiative program (center-based). +values: + # FY2024 Center-Based: $9.39M total / 702 children = $13,383 + 2024-01-01: 13_383 + # FY2025: $6.85M total / 512 children = $13,379 + 2025-01-01: 13_379 + +metadata: + unit: currency-USD + period: year + label: Illinois PI per-child funding amount (center-based) + reference: + - title: Gov. Pritzker Smart Start FY2024 Press Release ($9.39M / 702 children center-based) + href: https://www.illinois.gov/news/press-release.29519.html + - title: Gov. Pritzker Smart Start FY2025 Press Release ($6.85M / 512 children) + href: https://gov-pritzker-newsroom.prezly.com/gov-pritzker-announces-5150-new-preschool-seats-through-smart-start-initiative diff --git a/policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/age_threshold/child.yaml b/policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/age_threshold/child.yaml new file mode 100644 index 00000000000..c5e100982fa --- /dev/null +++ b/policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/age_threshold/child.yaml @@ -0,0 +1,13 @@ +description: Illinois limits eligibility to children under this age under the Prevention Initiative program. +values: + 2015-01-01: 3 + +metadata: + unit: year + period: year + label: Illinois PI child age threshold + reference: + - title: 105 ILCS 5/2-3.89 + href: https://ilga.gov/Documents/legislation/ilcs/documents/010500050K2-3.89.htm + - title: 23 Ill. Adm. Code 235.10 + href: http://ilrules.elaws.us/iac/t23_pt235_sec.235.10 diff --git a/policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/age_threshold/young_parent.yaml b/policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/age_threshold/young_parent.yaml new file mode 100644 index 00000000000..f54c1a8a951 --- /dev/null +++ b/policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/age_threshold/young_parent.yaml @@ -0,0 +1,11 @@ +description: Illinois uses this age threshold for young parent priority under the Prevention Initiative program. +values: + 2015-01-01: 21 + +metadata: + unit: year + period: year + label: Illinois PI young parent age threshold + reference: + - title: ISBE Prevention Initiative Eligibility Form (Factor 11) + href: https://www.isbe.net/Documents/Prevention-Initiative-Eligibility-Form.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/income/deep_poverty_rate.yaml b/policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/income/deep_poverty_rate.yaml new file mode 100644 index 00000000000..8c4598ebc77 --- /dev/null +++ b/policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/income/deep_poverty_rate.yaml @@ -0,0 +1,11 @@ +description: Illinois uses this share of the federal poverty guideline as the deep poverty threshold under the Prevention Initiative program. +values: + 2015-01-01: 0.5 + +metadata: + unit: /1 + period: year + label: Illinois PI deep poverty threshold as share of FPL + reference: + - title: ISBE Prevention Initiative Eligibility Form (Factor 4) + href: https://www.isbe.net/Documents/Prevention-Initiative-Eligibility-Form.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/income/low_income_rate.yaml b/policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/income/low_income_rate.yaml new file mode 100644 index 00000000000..8848edb6393 --- /dev/null +++ b/policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/income/low_income_rate.yaml @@ -0,0 +1,11 @@ +description: Illinois uses this share of the federal poverty guideline as the low income threshold under the Prevention Initiative program. +values: + 2015-01-01: 1 + +metadata: + unit: /1 + period: year + label: Illinois PI low income threshold as share of FPL + reference: + - title: ISBE Prevention Initiative Eligibility Form (Factor 6) + href: https://www.isbe.net/Documents/Prevention-Initiative-Eligibility-Form.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/income/poverty_rate.yaml b/policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/income/poverty_rate.yaml new file mode 100644 index 00000000000..8788a4f4b69 --- /dev/null +++ b/policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/income/poverty_rate.yaml @@ -0,0 +1,11 @@ +description: Illinois uses this share of the federal poverty guideline as the poverty threshold under the Prevention Initiative program. +values: + 2015-01-01: 2 + +metadata: + unit: /1 + period: year + label: Illinois PI poverty threshold as share of FPL + reference: + - title: ISBE Prevention Initiative Eligibility Form (Factor 36) + href: https://www.isbe.net/Documents/Prevention-Initiative-Eligibility-Form.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/priority/geriatric_pregnancy_age.yaml b/policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/priority/geriatric_pregnancy_age.yaml new file mode 100644 index 00000000000..14b5ca7de0a --- /dev/null +++ b/policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/priority/geriatric_pregnancy_age.yaml @@ -0,0 +1,10 @@ +description: Minimum age for geriatric pregnancy factor in Illinois PI +metadata: + unit: year + period: year + label: Geriatric pregnancy age threshold + reference: + - title: Prevention Initiative Eligibility Form - Factor 28 + href: https://www.isbe.net/Documents/Prevention-Initiative-Eligibility-Form.pdf#page=3 +values: + 2015-01-01: 40 diff --git a/policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/risk_factors/minimum_score.yaml b/policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/risk_factors/minimum_score.yaml new file mode 100644 index 00000000000..e10605f7741 --- /dev/null +++ b/policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/risk_factors/minimum_score.yaml @@ -0,0 +1,11 @@ +description: Illinois requires this minimum score for eligibility under the Prevention Initiative program. +values: + 2015-01-01: 50 + +metadata: + unit: /1 + period: year + label: Illinois PI minimum eligibility score + reference: + - title: ISBE Prevention Initiative Eligibility Form + href: https://www.isbe.net/Documents/Prevention-Initiative-Eligibility-Form.pdf#page=3 diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/il_pi_basic_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/il_pi_basic_eligible.yaml new file mode 100644 index 00000000000..2a32933f7b2 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/il_pi_basic_eligible.yaml @@ -0,0 +1,46 @@ +- name: Case 1, eligible child under 3 with income below 400% FPL. + period: 2024 + input: + state_code: IL + age: 2 + employment_income: 30_000 + output: + il_pi_basic_eligible: true + +- name: Case 2, child under 3 but income above 400% FPL. + period: 2024 + input: + state_code: IL + age: 1 + employment_income: 150_000 + output: + il_pi_basic_eligible: false + +- name: Case 3, child age 3 (too old) with income below 400% FPL. + period: 2024 + input: + state_code: IL + age: 3 + employment_income: 20_000 + output: + il_pi_basic_eligible: false + +- name: Case 4, pregnant person with income below 400% FPL. + period: 2024 + input: + state_code: IL + age: 25 + is_pregnant: true + employment_income: 40_000 + output: + il_pi_basic_eligible: true + +- name: Case 5, pregnant person with income above 400% FPL. + period: 2024 + input: + state_code: IL + age: 30 + is_pregnant: true + employment_income: 200_000 + output: + il_pi_basic_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/il_pi_demographic_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/il_pi_demographic_eligible.yaml new file mode 100644 index 00000000000..b6fa9c907fa --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/il_pi_demographic_eligible.yaml @@ -0,0 +1,48 @@ +- name: Infant age 0 is demographically eligible. + period: 2024 + input: + age: 0 + state_code: IL + output: + il_pi_demographic_eligible: true + +- name: Toddler age 1 is demographically eligible. + period: 2024 + input: + age: 1 + state_code: IL + output: + il_pi_demographic_eligible: true + +- name: Toddler age 2 is demographically eligible. + period: 2024 + input: + age: 2 + state_code: IL + output: + il_pi_demographic_eligible: true + +- name: Child age 3 not demographically eligible (transitions to PFA). + period: 2024 + input: + age: 3 + state_code: IL + output: + il_pi_demographic_eligible: false + +- name: Adult not demographically eligible. + period: 2024 + input: + age: 30 + state_code: IL + output: + il_pi_demographic_eligible: false + +- name: Pregnant woman is demographically eligible. + period: 2024 + input: + age: 25 + state_code: IL + is_pregnant: true + output: + il_pi_demographic_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/il_pi_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/il_pi_eligible.yaml new file mode 100644 index 00000000000..582ae60961e --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/il_pi_eligible.yaml @@ -0,0 +1,38 @@ +- name: Case 1, eligible infant with developmental delay. + period: 2024 + input: + state_code: IL + age: 1 + has_developmental_delay: true + employment_income: 30_000 + output: + il_pi_eligible: true + +- name: Case 2, eligible pregnant woman in deep poverty. + period: 2024 + input: + state_code: IL + age: 25 + is_pregnant: true + employment_income: 5_000 + output: + il_pi_eligible: true + +- name: Case 3, ineligible child age 3 too old. + period: 2024 + input: + state_code: IL + age: 3 + has_developmental_delay: true + employment_income: 30_000 + output: + il_pi_eligible: false + +- name: Case 4, ineligible no risk factors. + period: 2024 + input: + state_code: IL + age: 1 + employment_income: 100_000 + output: + il_pi_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/il_pi_risk_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/il_pi_risk_eligible.yaml new file mode 100644 index 00000000000..dcc60cb68be --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/il_pi_risk_eligible.yaml @@ -0,0 +1,74 @@ +- name: Case 1, eligible child with homeless status (50 pts >= 50). + period: 2024 + input: + people: + person1: + age: 30 + person2: + age: 1 + households: + household: + members: [person1, person2] + state_code: IL + is_homeless: true + spm_units: + spm_unit: + members: [person1, person2] + il_tanf: 0 + tax_units: + tax_unit: + members: [person1, person2] + output: + # Only age-eligible child gets risk eligibility check + # Homeless (50) >= 50 minimum + il_pi_risk_eligible: [false, true] + +- name: Case 2, eligible child with two 25-pt factors (50 pts). + period: 2024 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 1 + households: + household: + members: [person1, person2] + state_code: IL + # Factor 7: Parent didn't complete high school (Household-level) + parent_has_less_than_high_school_education: true + spm_units: + spm_unit: + members: [person1, person2] + il_tanf: 0 + tax_units: + tax_unit: + members: [person1, person2] + output: + # Low income (25) + no high school (25) + poverty (10) = 60 pts >= 50 + il_pi_risk_eligible: [false, true] + +- name: Case 3, ineligible child with insufficient score. + period: 2024 + input: + people: + person1: + age: 30 + employment_income: 35_000 # Only poverty (10 pts) + person2: + age: 1 + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + il_tanf: 0 + tax_units: + tax_unit: + members: [person1, person2] + output: + # Only poverty (10 pts) < 50 minimum + il_pi_risk_eligible: [false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/income/il_pi_is_deep_poverty.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/income/il_pi_is_deep_poverty.yaml new file mode 100644 index 00000000000..8fa4de5d204 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/income/il_pi_is_deep_poverty.yaml @@ -0,0 +1,43 @@ +- name: Family in deep poverty (below 50% FPL) + period: 2024 + input: + people: + person1: + age: 30 + employment_income: 8_000 # Below 50% FPL for family of 2 + person2: + age: 1 + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + output: + il_pi_is_deep_poverty: [true, true] + +- name: Family above deep poverty threshold + period: 2024 + input: + people: + person1: + age: 30 + employment_income: 15_000 # Above 50% FPL for family of 2 + person2: + age: 1 + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + output: + il_pi_is_deep_poverty: [false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/income/il_pi_is_low_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/income/il_pi_is_low_income.yaml new file mode 100644 index 00000000000..1b095fa6efb --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/income/il_pi_is_low_income.yaml @@ -0,0 +1,43 @@ +- name: Family at low income (below 100% FPL) + period: 2024 + input: + people: + person1: + age: 30 + employment_income: 18_000 # Below 100% FPL for family of 2 + person2: + age: 1 + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + output: + il_pi_is_low_income: [true, true] + +- name: Family above low income threshold + period: 2024 + input: + people: + person1: + age: 30 + employment_income: 25_000 # Above 100% FPL for family of 2 + person2: + age: 1 + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + output: + il_pi_is_low_income: [false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/income/il_pi_is_poverty.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/income/il_pi_is_poverty.yaml new file mode 100644 index 00000000000..b8fc4da2951 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/income/il_pi_is_poverty.yaml @@ -0,0 +1,43 @@ +- name: Family experiencing poverty (below 200% FPL) + period: 2024 + input: + people: + person1: + age: 30 + employment_income: 35_000 # Below 200% FPL for family of 2 + person2: + age: 1 + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + output: + il_pi_is_poverty: [true, true] + +- name: Family above poverty threshold + period: 2024 + input: + people: + person1: + age: 30 + employment_income: 50_000 # Above 200% FPL for family of 2 + person2: + age: 1 + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + output: + il_pi_is_poverty: [false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_has_developmental_delay.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_has_developmental_delay.yaml new file mode 100644 index 00000000000..1e8d6f5e290 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_has_developmental_delay.yaml @@ -0,0 +1,75 @@ +- name: Case 1, no disability in household. + period: 2024 + input: + people: + person1: + age: 30 + person2: + age: 1 + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + output: + il_pi_has_developmental_delay: false + +- name: Case 2, child has developmental delay. + period: 2024 + input: + people: + person1: + age: 30 + person2: + age: 1 + has_developmental_delay: true + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + output: + il_pi_has_developmental_delay: true + +- name: Case 3, parent is disabled. + period: 2024 + input: + people: + person1: + age: 30 + is_disabled: true + person2: + age: 1 + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + output: + il_pi_has_developmental_delay: true + +- name: Case 4, both disability and developmental delay. + period: 2024 + input: + people: + person1: + age: 30 + is_disabled: true + person2: + age: 1 + has_developmental_delay: true + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + output: + il_pi_has_developmental_delay: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_has_geriatric_pregnancy.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_has_geriatric_pregnancy.yaml new file mode 100644 index 00000000000..557e75bded6 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_has_geriatric_pregnancy.yaml @@ -0,0 +1,74 @@ +- name: Case 1, no pregnancy. + period: 2024 + input: + people: + person1: + age: 42 + person2: + age: 1 + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + output: + il_pi_has_geriatric_pregnancy: false + +- name: Case 2, pregnant but under 40. + period: 2024 + input: + people: + person1: + age: 35 + is_pregnant: true + person2: + age: 1 + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + output: + il_pi_has_geriatric_pregnancy: false + +- name: Case 3, pregnant at exactly 40. + period: 2024 + input: + people: + person1: + age: 40 + is_pregnant: true + person2: + age: 1 + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + output: + il_pi_has_geriatric_pregnancy: true + +- name: Case 4, pregnant over 40. + period: 2024 + input: + people: + person1: + age: 45 + is_pregnant: true + person2: + age: 1 + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + output: + il_pi_has_geriatric_pregnancy: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_highest_priority_score.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_highest_priority_score.yaml new file mode 100644 index 00000000000..0f4ae90e054 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_highest_priority_score.yaml @@ -0,0 +1,100 @@ +- name: Case 1, no highest priority factors. + period: 2024 + input: + people: + person1: + age: 30 + employment_income: 100_000 + person2: + age: 1 + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + il_tanf: 0 + tax_units: + tax_unit: + members: [person1, person2] + output: + # No factors = 0 pts + il_pi_highest_priority_score: [0, 0] + +- name: Case 2, homeless family. + period: 2024 + input: + people: + person1: + age: 30 + employment_income: 100_000 + person2: + age: 1 + households: + household: + members: [person1, person2] + state_code: IL + is_homeless: true + spm_units: + spm_unit: + members: [person1, person2] + il_tanf: 0 + tax_units: + tax_unit: + members: [person1, person2] + output: + # Homeless (50) = 50 pts for child only + il_pi_highest_priority_score: [0, 50] + +- name: Case 3, foster child. + period: 2024 + input: + people: + person1: + age: 30 + employment_income: 100_000 + person2: + age: 1 + is_in_foster_care: true + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + il_tanf: 0 + tax_units: + tax_unit: + members: [person1, person2] + output: + # Foster care (50) = 50 pts for child only + il_pi_highest_priority_score: [0, 50] + +- name: Case 4, multiple highest priority factors. + period: 2024 + input: + people: + person1: + age: 30 + employment_income: 5_000 + person2: + age: 1 + has_developmental_delay: true + households: + household: + members: [person1, person2] + state_code: IL + is_homeless: true + is_non_english_speaking_home: true + spm_units: + spm_unit: + members: [person1, person2] + il_tanf: 0 + tax_units: + tax_unit: + members: [person1, person2] + output: + # Homeless (50) + developmental delay (50) + deep poverty (50) + non-English (50) = 200 pts + il_pi_highest_priority_score: [0, 200] diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_is_young_parent_family.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_is_young_parent_family.yaml new file mode 100644 index 00000000000..db3e7f94e1a --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_is_young_parent_family.yaml @@ -0,0 +1,91 @@ +- name: Case 1, young parent family with parent age 20. + period: 2024 + input: + people: + person1: + age: 20 + is_parent: true + person2: + age: 1 + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + output: + il_pi_is_young_parent_family: true + +- name: Case 2, mixed age parents (30 and 20) eligible if any parent is young. + period: 2024 + input: + people: + person1: + age: 30 + is_parent: true + person2: + age: 20 + is_parent: true + person3: + age: 1 + households: + household: + members: [person1, person2, person3] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2, person3] + tax_units: + tax_unit: + members: [person1, person2, person3] + output: + # Eligible because one parent is 20 (<=21) + il_pi_is_young_parent_family: true + +- name: Case 3, older parent age 25 not eligible. + period: 2024 + input: + people: + person1: + age: 25 + is_parent: true + person2: + age: 1 + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + output: + il_pi_is_young_parent_family: false + +- name: Case 4, parent exactly 21 is eligible. + period: 2024 + input: + people: + person1: + age: 21 + is_parent: true + person2: + age: 1 + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + output: + il_pi_is_young_parent_family: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_lower_priority_score.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_lower_priority_score.yaml new file mode 100644 index 00000000000..5caebe1330b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_lower_priority_score.yaml @@ -0,0 +1,102 @@ +- name: Case 1, no lower priority factors married couple. + period: 2024 + input: + people: + person1: + age: 30 + employment_income: 100_000 + person2: + age: 30 + is_tax_unit_spouse: true + person3: + age: 1 + households: + household: + members: [person1, person2, person3] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2, person3] + il_tanf: 0 + tax_units: + tax_unit: + members: [person1, person2, person3] + output: + # No factors = 0 pts + il_pi_lower_priority_score: [0, 0, 0] + +- name: Case 2, single parent only. + period: 2024 + input: + people: + person1: + age: 30 + employment_income: 100_000 + person2: + age: 1 + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + il_tanf: 0 + tax_units: + tax_unit: + members: [person1, person2] + output: + # Single parent (10) = 10 pts for child only + il_pi_lower_priority_score: [0, 10] + +- name: Case 3, poverty and single parent. + period: 2024 + input: + people: + person1: + age: 30 + employment_income: 35_000 + person2: + age: 1 + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + il_tanf: 0 + tax_units: + tax_unit: + members: [person1, person2] + output: + # Single parent (10) + poverty (10) = 20 pts for child only + il_pi_lower_priority_score: [0, 20] + +- name: Case 4, teen parent family. + period: 2024 + input: + people: + person1: + age: 30 + employment_income: 100_000 + person2: + age: 30 + is_tax_unit_spouse: true + person3: + age: 1 + households: + household: + members: [person1, person2, person3] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2, person3] + il_tanf: 0 + il_isbe_was_teen_parent_at_first_birth: true + tax_units: + tax_unit: + members: [person1, person2, person3] + output: + # Teen parent (10) = 10 pts for child only + il_pi_lower_priority_score: [0, 0, 10] diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_other_priority_score.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_other_priority_score.yaml new file mode 100644 index 00000000000..1e8198c08eb --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_other_priority_score.yaml @@ -0,0 +1,160 @@ +- name: Case 1, no other priority factors. + period: 2024 + input: + people: + person1: + age: 30 + employment_income: 100_000 + person2: + age: 30 + is_tax_unit_spouse: true + person3: + age: 1 + households: + household: + members: [person1, person2, person3] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2, person3] + il_tanf: 0 + tax_units: + tax_unit: + members: [person1, person2, person3] + output: + # No factors = 0 pts + il_pi_other_priority_score: [0, 0, 0] + +- name: Case 2, low income family. + period: 2024 + input: + people: + person1: + age: 30 + employment_income: 18_000 + person2: + age: 30 + is_tax_unit_spouse: true + person3: + age: 1 + households: + household: + members: [person1, person2, person3] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2, person3] + il_tanf: 0 + tax_units: + tax_unit: + members: [person1, person2, person3] + output: + # Low income (25) = 25 pts for child only + il_pi_other_priority_score: [0, 0, 25] + +- name: Case 3, immigrant family. + period: 2024 + input: + people: + person1: + age: 30 + employment_income: 100_000 + is_born_outside_us: true + person2: + age: 30 + is_tax_unit_spouse: true + person3: + age: 1 + households: + household: + members: [person1, person2, person3] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2, person3] + il_tanf: 0 + tax_units: + tax_unit: + members: [person1, person2, person3] + output: + # Immigrant family (25) = 25 pts for child only + il_pi_other_priority_score: [0, 0, 25] + +- name: Case 4, military family. + period: 2024 + input: + people: + person1: + age: 30 + employment_income: 50_000 + military_basic_pay: 50_000 + person2: + age: 30 + is_tax_unit_spouse: true + person3: + age: 1 + households: + household: + members: [person1, person2, person3] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2, person3] + il_tanf: 0 + tax_units: + tax_unit: + members: [person1, person2, person3] + output: + # Military family (25) = 25 pts for child only + il_pi_other_priority_score: [0, 0, 25] + +- name: Case 5, geriatric pregnancy. + period: 2024 + input: + people: + person1: + age: 42 + is_pregnant: true + employment_income: 100_000 + households: + household: + members: [person1] + state_code: IL + spm_units: + spm_unit: + members: [person1] + il_tanf: 0 + tax_units: + tax_unit: + members: [person1] + output: + # Geriatric pregnancy (25) = 25 pts + il_pi_other_priority_score: [25] + +- name: Case 6, household has disability. + period: 2024 + input: + people: + person1: + age: 30 + employment_income: 100_000 + is_disabled: true + person2: + age: 30 + is_tax_unit_spouse: true + person3: + age: 1 + households: + household: + members: [person1, person2, person3] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2, person3] + il_tanf: 0 + tax_units: + tax_unit: + members: [person1, person2, person3] + output: + # Household has disability (25) = 25 pts for child only + il_pi_other_priority_score: [0, 0, 25] diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/integration.yaml new file mode 100644 index 00000000000..d1cc99554a0 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/integration.yaml @@ -0,0 +1,187 @@ +- name: Case 1, single parent low income family with infant with developmental delay. + period: 2024 + input: + people: + person1: + age: 28 + employment_income: 25_000 + person2: + age: 1 + has_developmental_delay: true + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + il_tanf: 0 + tax_units: + tax_unit: + members: [person1, person2] + output: + il_pi_demographic_eligible: [false, true] + # Developmental delay (50) + household has disability (25) + single parent (10) + poverty (10) = 95 pts + il_pi_priority_score: [0, 95] + il_pi_eligible: [false, true] + +- name: Case 2, pregnant single woman in non-English speaking home. + period: 2024 + input: + people: + person1: + age: 22 + is_pregnant: true + employment_income: 20_000 + households: + household: + members: [person1] + state_code: IL + is_non_english_speaking_home: true + spm_units: + spm_unit: + members: [person1] + il_tanf: 0 + tax_units: + tax_unit: + members: [person1] + output: + # Non-English home (50) + single parent (10) + poverty (10) = 70 pts + il_pi_priority_score: [70] + il_pi_eligible: [true] + +- name: Case 3, homeless single parent family with toddler. + period: 2024 + input: + people: + person1: + age: 30 + employment_income: 8_000 + person2: + age: 2 + households: + household: + members: [person1, person2] + state_code: IL + is_homeless: true + spm_units: + spm_unit: + members: [person1, person2] + il_tanf: 0 + tax_units: + tax_unit: + members: [person1, person2] + output: + il_pi_demographic_eligible: [false, true] + # Homeless (50) + deep poverty (50) + low income (25) + single parent (10) + poverty (10) = 145 pts + il_pi_priority_score: [0, 145] + il_pi_eligible: [false, true] + +- name: Case 4, higher income married couple no risk factors ineligible. + period: 2024 + input: + people: + person1: + age: 35 + employment_income: 150_000 + person2: + age: 35 + is_tax_unit_spouse: true + child: + age: 1 + households: + household: + members: [person1, person2, child] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2, child] + il_tanf: 0 + tax_units: + tax_unit: + members: [person1, person2, child] + output: + il_pi_demographic_eligible: [false, false, true] + # Married couple with high income - no risk factors + il_pi_priority_score: [0, 0, 0] + il_pi_eligible: [false, false, false] + +- name: Case 5, child age 3 transitions out of PI. + period: 2024 + input: + people: + person1: + age: 30 + employment_income: 20_000 + person2: + age: 3 + has_developmental_delay: true + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + il_tanf: 0 + tax_units: + tax_unit: + members: [person1, person2] + output: + il_pi_demographic_eligible: [false, false] + # Child has developmental delay but too old for PI + il_pi_eligible: [false, false] + +- name: Case 6, single parent foster child infant highest priority. + period: 2024 + input: + people: + person1: + age: 40 + employment_income: 60_000 + person2: + age: 0 + is_in_foster_care: true + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + il_tanf: 0 + tax_units: + tax_unit: + members: [person1, person2] + output: + il_pi_demographic_eligible: [false, true] + # Foster care (50) + single parent (10) = 60 pts for child + il_pi_priority_score: [0, 60] + il_pi_eligible: [false, true] + +- name: Case 7, 45 points ineligible boundary case. + period: 2024 + input: + people: + person1: + age: 21 + employment_income: 25_000 + is_parent: true + person2: + age: 1 + households: + household: + members: [person1, person2] + state_code: IL + spm_units: + spm_unit: + members: [person1, person2] + il_tanf: 0 + tax_units: + tax_unit: + members: [person1, person2] + output: + il_pi_demographic_eligible: [false, true] + # Young parent age 21 (25) + single parent (10) + poverty (10) = 45 pts (below 50 threshold) + il_pi_priority_score: [0, 45] + il_pi_eligible: [false, false] diff --git a/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/il_pi_basic_eligible.py b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/il_pi_basic_eligible.py new file mode 100644 index 00000000000..261c60a951d --- /dev/null +++ b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/il_pi_basic_eligible.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class il_pi_basic_eligible(Variable): + value_type = bool + entity = Person + label = "Meets basic eligibility for Illinois PI (age and income)" + definition_period = YEAR + reference = "https://www.isbe.net/Pages/Birth-to-Age-3-Years.aspx" + defined_for = StateCode.IL + + def formula(person, period, parameters): + # Basic eligibility: demographic eligible (child under 3 or pregnant) + # and income eligible (≤400% FPL). + demographic_eligible = person("il_pi_demographic_eligible", period) + income_eligible = person("il_isbe_income_eligible", period) + return demographic_eligible & income_eligible diff --git a/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/il_pi_demographic_eligible.py b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/il_pi_demographic_eligible.py new file mode 100644 index 00000000000..bfeb1aaabd3 --- /dev/null +++ b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/il_pi_demographic_eligible.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class il_pi_demographic_eligible(Variable): + value_type = bool + entity = Person + label = "Meets demographic requirements for Illinois PI" + definition_period = YEAR + reference = "https://www.isbe.net/Pages/Birth-to-Age-3-Years.aspx" + defined_for = StateCode.IL + + def formula(person, period, parameters): + # Eligible if child under 3 or pregnant woman. + p = parameters(period).gov.states.il.isbe.pi.eligibility.age_threshold + age = person("age", period) + is_child_under_3 = age < p.child + is_pregnant = person("is_pregnant", period) + return is_child_under_3 | is_pregnant diff --git a/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/il_pi_risk_eligible.py b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/il_pi_risk_eligible.py new file mode 100644 index 00000000000..28f5f04ea17 --- /dev/null +++ b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/il_pi_risk_eligible.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class il_pi_risk_eligible(Variable): + value_type = bool + entity = Person + label = "Meets risk factor requirements for Illinois PI" + definition_period = YEAR + reference = ( + "https://www.isbe.net/Documents/Prevention-Initiative-Eligibility-Form.pdf#page=3", + ) + defined_for = StateCode.IL + + def formula(person, period, parameters): + # Eligible if priority score meets minimum (50 points). + p = parameters(period).gov.states.il.isbe.pi.eligibility.risk_factors + priority_score = person("il_pi_priority_score", period) + return priority_score >= p.minimum_score diff --git a/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/income/il_pi_is_deep_poverty.py b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/income/il_pi_is_deep_poverty.py new file mode 100644 index 00000000000..145471c5fb0 --- /dev/null +++ b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/income/il_pi_is_deep_poverty.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class il_pi_is_deep_poverty(Variable): + value_type = bool + entity = Person + label = "In deep poverty or receiving TANF for Illinois PI (Factor 4)" + definition_period = YEAR + reference = ( + "https://www.isbe.net/Documents/Prevention-Initiative-Eligibility-Form.pdf#page=2", + ) + defined_for = StateCode.IL + + def formula(person, period, parameters): + spm_unit = person.spm_unit + # Factor 4 (50 pts): Family income at or below 50% FPL and/or receiving TANF. + p = parameters(period).gov.states.il.isbe.pi.eligibility.income + fpg = spm_unit("spm_unit_fpg", period) + income = spm_unit("il_isbe_countable_income", period) + threshold = fpg * p.deep_poverty_rate + is_below_50_fpl = income <= threshold + receives_tanf = spm_unit("il_tanf", period) > 0 + return is_below_50_fpl | receives_tanf diff --git a/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/income/il_pi_is_low_income.py b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/income/il_pi_is_low_income.py new file mode 100644 index 00000000000..cb4525aacff --- /dev/null +++ b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/income/il_pi_is_low_income.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class il_pi_is_low_income(Variable): + value_type = bool + entity = Person + label = "Low income for Illinois PI (Factor 6, 25 points)" + definition_period = YEAR + reference = ( + "https://www.isbe.net/Documents/Prevention-Initiative-Eligibility-Form.pdf#page=2", + ) + defined_for = StateCode.IL + + def formula(person, period, parameters): + spm_unit = person.spm_unit + # Factor 6 (25 pts): Family income at or below 100% FPL. + p = parameters(period).gov.states.il.isbe.pi.eligibility.income + fpg = spm_unit("spm_unit_fpg", period) + income = spm_unit("il_isbe_countable_income", period) + threshold = fpg * p.low_income_rate + return income <= threshold diff --git a/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/income/il_pi_is_poverty.py b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/income/il_pi_is_poverty.py new file mode 100644 index 00000000000..abbe580a3e0 --- /dev/null +++ b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/income/il_pi_is_poverty.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class il_pi_is_poverty(Variable): + value_type = bool + entity = Person + label = "Experiencing poverty for Illinois PI (Factor 36, 10 points)" + definition_period = YEAR + reference = ( + "https://www.isbe.net/Documents/Prevention-Initiative-Eligibility-Form.pdf#page=3", + ) + defined_for = StateCode.IL + + def formula(person, period, parameters): + spm_unit = person.spm_unit + # Factor 36 (10 pts): Child/Family experiencing poverty (200% FPL). + p = parameters(period).gov.states.il.isbe.pi.eligibility.income + fpg = spm_unit("spm_unit_fpg", period) + income = spm_unit("il_isbe_countable_income", period) + threshold = fpg * p.poverty_rate + return income <= threshold diff --git a/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_has_developmental_delay.py b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_has_developmental_delay.py new file mode 100644 index 00000000000..0bf4b5f3962 --- /dev/null +++ b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_has_developmental_delay.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + + +class il_pi_has_developmental_delay(Variable): + value_type = bool + entity = SPMUnit + label = "SPM unit has developmental delay or disability for Illinois PI" + definition_period = YEAR + reference = "https://www.isbe.net/Documents/Prevention-Initiative-Eligibility-Form.pdf#page=2" + defined_for = StateCode.IL + + def formula(spm_unit, period, parameters): + # Factor 18: Member of household has developmental delay or disability + has_disability = spm_unit.members("is_disabled", period) + has_dev_delay = spm_unit.members("has_developmental_delay", period) + return spm_unit.any(has_disability | has_dev_delay) diff --git a/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_has_geriatric_pregnancy.py b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_has_geriatric_pregnancy.py new file mode 100644 index 00000000000..f8164b318e7 --- /dev/null +++ b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_has_geriatric_pregnancy.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class il_pi_has_geriatric_pregnancy(Variable): + value_type = bool + entity = SPMUnit + label = "Household has geriatric pregnancy for Illinois PI" + definition_period = YEAR + reference = "https://www.isbe.net/Documents/Prevention-Initiative-Eligibility-Form.pdf#page=3" + defined_for = StateCode.IL + + def formula(spm_unit, period, parameters): + # Factor 28: Pregnant woman age 40 or over + p = parameters(period).gov.states.il.isbe.pi.eligibility.priority + is_pregnant = spm_unit.members("is_pregnant", period) + age = spm_unit.members("age", period) + has_geriatric_pregnancy = is_pregnant & ( + age >= p.geriatric_pregnancy_age + ) + return spm_unit.any(has_geriatric_pregnancy) diff --git a/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_highest_priority_score.py b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_highest_priority_score.py new file mode 100644 index 00000000000..7d2e9522301 --- /dev/null +++ b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_highest_priority_score.py @@ -0,0 +1,37 @@ +from policyengine_us.model_api import * + + +class il_pi_highest_priority_score(Variable): + value_type = int + entity = Person + label = "Illinois PI highest priority score (50 pts factors)" + definition_period = YEAR + reference = ( + "https://www.isbe.net/Documents/Prevention-Initiative-Eligibility-Form.pdf#page=2", + ) + defined_for = "il_pi_demographic_eligible" + + def formula(person, period, parameters): + household = person.household + + # Highest priority factors (50 pts each): + # Factor 1: Homeless (McKinney-Vento) + is_homeless = household("is_homeless", period) + # Factor 2: Youth in Care (foster care, child welfare) + is_in_foster_care = person("is_in_foster_care", period) + # Factor 3: Developmental delay + has_developmental_delay = person("has_developmental_delay", period) + # Factor 4: Deep poverty (<=50% FPL) and/or receiving TANF + is_deep_poverty = person("il_pi_is_deep_poverty", period) + # Factor 5: Non-English speaking home + is_non_english_home = household("is_non_english_speaking_home", period) + + highest_priority_factors = [ + is_homeless, + is_in_foster_care, + has_developmental_delay, + is_deep_poverty, + is_non_english_home, + ] + + return sum([f.astype(int) for f in highest_priority_factors]) * 50 diff --git a/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_is_young_parent_family.py b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_is_young_parent_family.py new file mode 100644 index 00000000000..a067477d821 --- /dev/null +++ b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_is_young_parent_family.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class il_pi_is_young_parent_family(Variable): + value_type = bool + entity = SPMUnit + label = "Young parent family for Illinois PI (Factor 11)" + definition_period = YEAR + reference = ( + "https://www.isbe.net/Documents/Prevention-Initiative-Eligibility-Form.pdf#page=2", + ) + defined_for = StateCode.IL + + def formula(spm_unit, period, parameters): + # Factor 11 (25 pts): Parent is currently age 21 years or younger. + p = parameters(period).gov.states.il.isbe.pi.eligibility.age_threshold + age = spm_unit.members("age", period) + is_parent = spm_unit.members("is_parent", period) + is_young = age <= p.young_parent + # Eligible if any parent is 21 or younger. + return spm_unit.any(is_parent & is_young) diff --git a/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_lower_priority_score.py b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_lower_priority_score.py new file mode 100644 index 00000000000..9c9d313e25a --- /dev/null +++ b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_lower_priority_score.py @@ -0,0 +1,36 @@ +from policyengine_us.model_api import * + + +class il_pi_lower_priority_score(Variable): + value_type = int + entity = Person + label = "Illinois PI lower priority score (10 pts factors)" + definition_period = YEAR + reference = ( + "https://www.isbe.net/Documents/Prevention-Initiative-Eligibility-Form.pdf#page=3", + ) + defined_for = "il_pi_demographic_eligible" + + def formula(person, period, parameters): + household = person.household + spm_unit = person.spm_unit + + # Lower priority factors (10 pts each): + # Factor 33: Teen parent at birth of first child (SPMUnit-level variable) + # Parent was under 20 when first child was born + is_teen_parent_family = spm_unit( + "il_isbe_was_teen_parent_at_first_birth", period + ) + # Factor 35: Parent/Caregiver is single parent + is_parent = spm_unit.members("is_tax_unit_head_or_spouse", period) + is_single_parent = spm_unit.sum(is_parent) == 1 + # Factor 36: Experiencing poverty (<=200% FPL) + is_poverty = person("il_pi_is_poverty", period) + + lower_priority_factors = [ + is_teen_parent_family, + is_single_parent, + is_poverty, + ] + + return sum([f.astype(int) for f in lower_priority_factors]) * 10 diff --git a/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_other_priority_score.py b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_other_priority_score.py new file mode 100644 index 00000000000..b28c5f76e10 --- /dev/null +++ b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_other_priority_score.py @@ -0,0 +1,54 @@ +from policyengine_us.model_api import * + + +class il_pi_other_priority_score(Variable): + value_type = int + entity = Person + label = "Illinois PI other priority score (25 pts factors)" + definition_period = YEAR + reference = ( + "https://www.isbe.net/Documents/Prevention-Initiative-Eligibility-Form.pdf#page=2", + ) + defined_for = "il_pi_demographic_eligible" + + def formula(person, period, parameters): + spm_unit = person.spm_unit + household = person.household + + # Other priority factors (25 pts each): + # Factor 6: Low income (<=100% FPL) + is_low_income = person("il_pi_is_low_income", period) + # Factor 7: Parent didn't complete high school (Household-level variable) + parent_low_education = household( + "parent_has_less_than_high_school_education", period + ) + # Factor 8: Child/parent born outside US + born_outside_us = person("is_born_outside_us", period) + is_immigrant_family = spm_unit.any(born_outside_us) + # Factor 10: Active Duty Military family + is_active_duty_military = person("military_basic_pay", period) > 0 + is_military_family = spm_unit.any(is_active_duty_military) + # Factor 11: Parent is currently age 21 or younger + is_young_parent_family = spm_unit( + "il_pi_is_young_parent_family", period + ) + # Factor 18: Member of household has developmental delay or disability + has_developmental_delay = spm_unit( + "il_pi_has_developmental_delay", period + ) + # Factor 28: Geriatric pregnancy (pregnant woman age 40+) + has_geriatric_pregnancy = spm_unit( + "il_pi_has_geriatric_pregnancy", period + ) + + other_priority_factors = [ + is_low_income, + parent_low_education, + is_immigrant_family, + is_military_family, + is_young_parent_family, + has_developmental_delay, + has_geriatric_pregnancy, + ] + + return sum([f.astype(int) for f in other_priority_factors]) * 25 diff --git a/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_priority_score.py b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_priority_score.py new file mode 100644 index 00000000000..ade594b2a90 --- /dev/null +++ b/policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_priority_score.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class il_pi_priority_score(Variable): + value_type = int + entity = Person + label = "Weighted priority score for Illinois PI eligibility" + definition_period = YEAR + reference = ( + "https://www.isbe.net/Documents/Prevention-Initiative-Eligibility-Form.pdf#page=2", + "https://www.isbe.net/Documents/Prevention-Initiative-Eligibility-Form.pdf#page=3", + ) + defined_for = "il_pi_demographic_eligible" + + adds = [ + "il_pi_highest_priority_score", + "il_pi_other_priority_score", + "il_pi_lower_priority_score", + ] diff --git a/policyengine_us/variables/gov/states/il/isbe/pi/il_pi.py b/policyengine_us/variables/gov/states/il/isbe/pi/il_pi.py new file mode 100644 index 00000000000..74cdd6f65c0 --- /dev/null +++ b/policyengine_us/variables/gov/states/il/isbe/pi/il_pi.py @@ -0,0 +1,15 @@ +from policyengine_us.model_api import * + + +class il_pi(Variable): + value_type = float + entity = Person + label = "Illinois Prevention Initiative (PI) benefit" + definition_period = YEAR + unit = USD + reference = ( + "https://www.isbe.net/Pages/Birth-to-Age-3-Years.aspx", + "https://gov-pritzker-newsroom.prezly.com/gov-pritzker-announces-5150-new-preschool-seats-through-smart-start-initiative", + ) + defined_for = "il_pi_eligible" + adds = ["gov.states.il.isbe.pi.benefit.amount"] diff --git a/policyengine_us/variables/gov/states/il/isbe/pi/il_pi_eligible.py b/policyengine_us/variables/gov/states/il/isbe/pi/il_pi_eligible.py new file mode 100644 index 00000000000..6ad335c003a --- /dev/null +++ b/policyengine_us/variables/gov/states/il/isbe/pi/il_pi_eligible.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class il_pi_eligible(Variable): + value_type = bool + entity = Person + label = "Eligible for Illinois Prevention Initiative" + definition_period = YEAR + reference = "https://www.isbe.net/Pages/Birth-to-Age-3-Years.aspx" + defined_for = StateCode.IL + + def formula(person, period, parameters): + # Eligibility requires: demographic eligible (child under 3 OR pregnant), + # income eligible (≤400% FPL), and risk eligible (≥50 pts). + demographic_eligible = person("il_pi_demographic_eligible", period) + income_eligible = person("il_isbe_income_eligible", period) + risk_eligible = person("il_pi_risk_eligible", period) + return demographic_eligible & income_eligible & risk_eligible diff --git a/uv.lock b/uv.lock index 7511808d966..e4c36b69aed 100644 --- a/uv.lock +++ b/uv.lock @@ -1535,7 +1535,7 @@ wheels = [ [[package]] name = "policyengine-us" -version = "1.467.0" +version = "1.469.0" source = { editable = "." } dependencies = [ { name = "microdf-python" },