diff --git a/changelog.d/fix-10208-tanf-dependent-care-scope.fixed.md b/changelog.d/fix-10208-tanf-dependent-care-scope.fixed.md new file mode 100644 index 00000000000..d2f49c72adc --- /dev/null +++ b/changelog.d/fix-10208-tanf-dependent-care-scope.fixed.md @@ -0,0 +1 @@ +Limit the Hawaii TANF and Vermont Reach Up dependent care deductions to the care the state rules allow (an incapacitated or disabled adult; not the unit's own children), cap each incapacitated adult's care separately in Hawaii and Kentucky, and apply the Kentucky K-TAP child care disregard only to a case that is otherwise ineligible, because its countable income exceeds the standard of need or its payment is zero (921 KAR 2:016 Sections 4(2)(b), 5(3)(b)1.c and 9(5)). diff --git a/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/hi_tanf_countable_earned_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/hi_tanf_countable_earned_income.yaml index 8a28757eca2..76679284278 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/hi_tanf_countable_earned_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/hi_tanf_countable_earned_income.yaml @@ -34,7 +34,7 @@ # Step 2: $200 flat = 400 - 200 = 200 # Step 3: 55% = 200 × 0.45 = 90 # Total: 450 + 90 = 540 - # No childcare expenses, so no dependent care deduction + # No care expenses, so no dependent care deduction hi_tanf_countable_earned_income: 540 - name: Case 2, earned income with dependent care deduction. @@ -46,12 +46,13 @@ tanf_gross_earned_income: 1_000 weekly_hours_worked_before_lsr: 40 person2: - age: 5 + age: 40 + is_disabled: true + # $1,200/year = $100/month disabled adult care + care_expenses: 1_200 spm_units: spm_unit: members: [person1, person2] - # $1,200/year = $100/month childcare - childcare_expenses: 1_200 tax_units: tax_unit: members: [person1, person2] @@ -61,11 +62,11 @@ state_code: HI output: # Person1 earned after deductions: 270 - # Dependent care: min(100, 1 child × $175) = 100 + # Dependent care: min(100, 1 disabled adult × $175) = 100 # Final: max(270 - 100, 0) = 170 hi_tanf_countable_earned_income: 170 -- name: Case 3, dependent care deduction capped at per-child max. +- name: Case 3, dependent care deduction capped at per-adult max. period: 2024-01 input: people: @@ -74,12 +75,13 @@ tanf_gross_earned_income: 1_500 weekly_hours_worked_before_lsr: 40 person2: - age: 5 + age: 40 + is_disabled: true + # $6,000/year = $500/month disabled adult care, exceeds $175 cap + care_expenses: 6_000 spm_units: spm_unit: members: [person1, person2] - # $6,000/year = $500/month childcare, exceeds $175 cap - childcare_expenses: 6_000 tax_units: tax_unit: members: [person1, person2] @@ -89,7 +91,7 @@ state_code: HI output: # Person1 earned after deductions: 450 - # Dependent care: min(500, 1 child × $175) = 175 + # Dependent care: min(500, 1 disabled adult × $175) = 175 # Final: max(450 - 175, 0) = 275 hi_tanf_countable_earned_income: 275 @@ -103,11 +105,12 @@ tanf_gross_earned_income: 200 weekly_hours_worked_before_lsr: 40 person2: - age: 5 + age: 40 + is_disabled: true + care_expenses: 2_400 spm_units: spm_unit: members: [person1, person2] - childcare_expenses: 2_400 tax_units: tax_unit: members: [person1, person2] diff --git a/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.yaml b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.yaml index 6df22fdedb2..b18e5574a38 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.yaml @@ -1,10 +1,13 @@ # Hawaii TANF dependent care deduction tests -# Deduction is actual childcare expenses, capped at rate per child per month +# Deduction is the actual cost of care for each incapacitated (disabled) +# adult in the household, capped per adult per month. +# Child care is not deducted. # Rate: $175 (full-time, 32+ hrs) or $165 (part-time, <32 hrs) # Uses MAX of adult hours - if either parent is full-time, use full-time rate -# Per Hawaii TANF State Plan +# Per HAR 17-676-54.1(c)(4) and (d)(4), HAR 17-676-2 and the Hawaii TANF +# State Plan section 10.2.2 -- name: Case 1, no childcare expenses. +- name: Case 1, no care expenses. period: 2024-01 input: people: @@ -26,7 +29,7 @@ output: hi_tanf_dependent_care_deduction: 0 -- name: Case 2, single parent full-time, expenses below cap. +- name: Case 2, child care for a child in the unit is not deducted. period: 2024-01 input: people: @@ -38,8 +41,8 @@ spm_units: spm_unit: members: [person1, person2] - # $1,200/year = $100/month, below $175 cap - childcare_expenses: 1_200 + # $3,600/year = $300/month + childcare_expenses: 3_600 tax_units: tax_unit: members: [person1, person2] @@ -48,11 +51,11 @@ members: [person1, person2] state_code: HI output: - # 40 hrs = full-time, $175 cap - # $100/month < $175 cap, so full amount deducted - hi_tanf_dependent_care_deduction: 100 + # HAR 17-676-54.1(c)(4) and (d)(4) deduct only the care of an + # incapacitated adult; no incapacitated adult here, so $0. + hi_tanf_dependent_care_deduction: 0 -- name: Case 3, single parent full-time, expenses above cap. +- name: Case 3, child care for three children is not deducted. period: 2024-01 input: people: @@ -60,52 +63,100 @@ age: 30 weekly_hours_worked_before_lsr: 40 person2: - age: 5 + age: 10 + person3: + age: 7 + person4: + age: 4 spm_units: spm_unit: - members: [person1, person2] - # $3,600/year = $300/month, above $175 cap - childcare_expenses: 3_600 + members: [person1, person2, person3, person4] + # $8,400/year = $700/month + childcare_expenses: 8_400 tax_units: tax_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: HI + output: + # No incapacitated adult, so $0. + hi_tanf_dependent_care_deduction: 0 + +- name: Case 4, disabled adult care below the full-time cap. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + weekly_hours_worked_before_lsr: 40 + person2: + age: 25 + is_disabled: true + care_expenses: 1_200 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: HI + output: + # 40 hrs = full-time, $175 cap per disabled adult. + # Expenses = 1,200 / 12 = 100/month, below the cap. + hi_tanf_dependent_care_deduction: 100 + +- name: Case 5, disabled adult care above the full-time cap. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + weekly_hours_worked_before_lsr: 40 + person2: + age: 25 + is_disabled: true + care_expenses: 3_600 + spm_units: + spm_unit: members: [person1, person2] households: household: members: [person1, person2] state_code: HI output: - # 40 hrs = full-time, $175 cap - # $300/month > $175 cap, capped at 1 child × $175 = $175 + # $300/month > $175 cap: min(300, 1 x 175) = 175 hi_tanf_dependent_care_deduction: 175 -- name: Case 4, single parent part-time, expenses above cap. +- name: Case 6, disabled adult care above the part-time cap. period: 2024-01 + absolute_error_margin: 0.01 input: people: person1: age: 30 weekly_hours_worked_before_lsr: 20 person2: - age: 5 + age: 25 + is_disabled: true + care_expenses: 3_600 spm_units: spm_unit: members: [person1, person2] - # $3,600/year = $300/month, above $165 cap - childcare_expenses: 3_600 - tax_units: - tax_unit: - members: [person1, person2] households: household: members: [person1, person2] state_code: HI output: - # 20 hrs = part-time, $165 cap - # $300/month > $165 cap, capped at 1 child × $165 = $165 + # 20 hrs = part-time, $165 cap: min(300, 165) = 165 hi_tanf_dependent_care_deduction: 165 -- name: Case 5, two parents both full-time, uses full-time rate. +- name: Case 7, two parents one part-time, uses full-time rate (MAX). period: 2024-01 + absolute_error_margin: 0.01 input: people: person1: @@ -113,239 +164,237 @@ weekly_hours_worked_before_lsr: 40 person2: age: 28 - weekly_hours_worked_before_lsr: 35 + weekly_hours_worked_before_lsr: 20 person3: - age: 5 + age: 60 + is_disabled: true + care_expenses: 3_600 spm_units: spm_unit: members: [person1, person2, person3] - # $3,600/year = $300/month - childcare_expenses: 3_600 - tax_units: - tax_unit: - members: [person1, person2, person3] households: household: members: [person1, person2, person3] state_code: HI output: - # MAX(40, 35) = 40 hrs = full-time, $175 cap + # MAX(40, 20, 0) = 40 hrs = full-time, $175 cap # $300/month > $175 cap, capped at $175 hi_tanf_dependent_care_deduction: 175 -- name: Case 6, two parents one part-time, uses full-time rate (MAX). +- name: Case 8, two parents both part-time, uses part-time rate. period: 2024-01 + absolute_error_margin: 0.01 input: people: person1: age: 30 - weekly_hours_worked_before_lsr: 40 + weekly_hours_worked_before_lsr: 25 person2: age: 28 weekly_hours_worked_before_lsr: 20 person3: - age: 5 + age: 60 + is_disabled: true + care_expenses: 3_600 spm_units: spm_unit: members: [person1, person2, person3] - # $3,600/year = $300/month - childcare_expenses: 3_600 - tax_units: - tax_unit: - members: [person1, person2, person3] households: household: members: [person1, person2, person3] state_code: HI output: - # MAX(40, 20) = 40 hrs = full-time, $175 cap - # $300/month > $175 cap, capped at $175 - hi_tanf_dependent_care_deduction: 175 + # MAX(25, 20, 0) = 25 hrs = part-time, $165 cap + hi_tanf_dependent_care_deduction: 165 -- name: Case 7, two children, full-time parent. +- name: Case 9, exactly 32 hours (boundary between part-time and full-time). period: 2024-01 + absolute_error_margin: 0.01 input: people: person1: age: 30 - weekly_hours_worked_before_lsr: 40 + weekly_hours_worked_before_lsr: 32 person2: - age: 5 - person3: - age: 8 + age: 25 + is_disabled: true + care_expenses: 3_600 spm_units: spm_unit: - members: [person1, person2, person3] - # $6,000/year = $500/month, above 2 × $175 = $350 cap - childcare_expenses: 6_000 - tax_units: - tax_unit: - members: [person1, person2, person3] + members: [person1, person2] households: household: - members: [person1, person2, person3] + members: [person1, person2] state_code: HI output: - # 40 hrs = full-time, $175 per child - # $500/month > $350 cap, capped at 2 children × $175 = $350 - hi_tanf_dependent_care_deduction: 350 + # 32 hrs = full-time (32+ threshold), $175 cap + hi_tanf_dependent_care_deduction: 175 -- name: Case 8, no children in household. +- name: Case 10, exactly 31 hours (just under full-time threshold). period: 2024-01 + absolute_error_margin: 0.01 input: people: person1: age: 30 - weekly_hours_worked_before_lsr: 40 + weekly_hours_worked_before_lsr: 31 person2: age: 25 - weekly_hours_worked_before_lsr: 40 + is_disabled: true + care_expenses: 3_600 spm_units: spm_unit: members: [person1, person2] - childcare_expenses: 2_400 - tax_units: - tax_unit: - members: [person1, person2] households: household: members: [person1, person2] state_code: HI output: - # No children means cap = 0 children × $175 = $0 - hi_tanf_dependent_care_deduction: 0 + # 31 hrs < 32 threshold = part-time, $165 cap + hi_tanf_dependent_care_deduction: 165 -- name: Case 9, exactly 32 hours (boundary between part-time and full-time). +- name: Case 11, two disabled adults, cap per disabled adult. period: 2024-01 + absolute_error_margin: 0.01 input: people: person1: age: 30 - weekly_hours_worked_before_lsr: 32 + weekly_hours_worked_before_lsr: 40 person2: - age: 5 + age: 60 + is_disabled: true + care_expenses: 3_600 + person3: + age: 62 + is_disabled: true + care_expenses: 3_600 spm_units: spm_unit: - members: [person1, person2] - childcare_expenses: 3_600 - tax_units: - tax_unit: - members: [person1, person2] + members: [person1, person2, person3] households: household: - members: [person1, person2] + members: [person1, person2, person3] state_code: HI output: - # 32 hrs = full-time (32+ threshold), $175 cap - hi_tanf_dependent_care_deduction: 175 + # Expenses = 300 and 300/month, each capped at $175 + # min(300, 175) + min(300, 175) = 350 + hi_tanf_dependent_care_deduction: 350 -- name: Case 10, two parents both part-time, uses part-time rate. +- name: Case 12, child care and disabled adult care, only the adult care counts. period: 2024-01 + absolute_error_margin: 0.01 input: people: person1: age: 30 - weekly_hours_worked_before_lsr: 25 + weekly_hours_worked_before_lsr: 40 person2: - age: 28 - weekly_hours_worked_before_lsr: 20 - person3: age: 5 + person3: + age: 60 + is_disabled: true + care_expenses: 1_200 spm_units: spm_unit: members: [person1, person2, person3] + # $3,600/year = $300/month child care, not deductible childcare_expenses: 3_600 - tax_units: - tax_unit: - members: [person1, person2, person3] households: household: members: [person1, person2, person3] state_code: HI output: - # MAX(25, 20) = 25 hrs = part-time, $165 cap - hi_tanf_dependent_care_deduction: 165 + # Adult care = 1,200 / 12 = 100/month; cap = 1 disabled adult x $175 + # min(100, 175) = 100 + hi_tanf_dependent_care_deduction: 100 -- name: Case 11, exactly 31 hours (just under full-time threshold). +- name: Case 13, adult care expenses without disability are not deducted. period: 2024-01 + absolute_error_margin: 0.01 input: people: person1: age: 30 - weekly_hours_worked_before_lsr: 31 + weekly_hours_worked_before_lsr: 40 person2: - age: 5 + age: 25 + care_expenses: 1_200 spm_units: spm_unit: members: [person1, person2] - childcare_expenses: 3_600 - tax_units: - tax_unit: - members: [person1, person2] households: household: members: [person1, person2] state_code: HI output: - # 31 hrs < 32 threshold = part-time, $165 cap - hi_tanf_dependent_care_deduction: 165 + # Person2 is not a disabled adult, so person2's care cost of + # 100/month does not count. + hi_tanf_dependent_care_deduction: 0 -- name: Case 12, three children, full-time parent. +- name: Case 14, two disabled adults, each adult's care capped separately. period: 2024-01 + absolute_error_margin: 0.01 input: people: person1: age: 30 weekly_hours_worked_before_lsr: 40 person2: - age: 10 + age: 60 + is_disabled: true + # $300/month + care_expenses: 3_600 person3: - age: 7 - person4: - age: 4 + age: 62 + is_disabled: true + # $50/month + care_expenses: 600 spm_units: spm_unit: - members: [person1, person2, person3, person4] - # $8,400/year = $700/month, above 3 × $175 = $525 cap - childcare_expenses: 8_400 - tax_units: - tax_unit: - members: [person1, person2, person3, person4] + members: [person1, person2, person3] households: household: - members: [person1, person2, person3, person4] + members: [person1, person2, person3] state_code: HI output: - # 40 hrs = full-time, $175 per child - # $700/month > $525 cap, capped at 3 children × $175 = $525 - hi_tanf_dependent_care_deduction: 525 + # HAR 17-676-54.1(d)(4): the cost "for the care of each incapacitated + # adult", not to exceed $175 (full time). + # min(300, 175) + min(50, 175) = 175 + 50 = 225 + # A pooled cap would give min(350, 2 x 175) = 350. + hi_tanf_dependent_care_deduction: 225 -- name: Case 13, disabled adult household member care expenses. +- name: Case 15, two disabled adults, part-time cap applied to each adult. period: 2024-01 absolute_error_margin: 0.01 input: people: person1: age: 30 - weekly_hours_worked_before_lsr: 40 + weekly_hours_worked_before_lsr: 20 person2: - age: 25 + age: 60 is_disabled: true - care_expenses: 1_200 + # $165/month + care_expenses: 1_980 + person3: + age: 62 + is_disabled: true + # $166/month + care_expenses: 1_992 spm_units: spm_unit: - members: [person1, person2] + members: [person1, person2, person3] households: household: - members: [person1, person2] + members: [person1, person2, person3] state_code: HI output: - # Per State Plan 10.2.1(D): care of a disabled adult household member - # up to $175/month (full-time employment, 40 hours >= 32). - # Expenses = 1,200 / 12 = 100/month, below the cap. - hi_tanf_dependent_care_deduction: 100 + # Part time (20 hours a week): $165 cap per disabled adult. + # min(165, 165) + min(166, 165) = 165 + 165 = 330 + hi_tanf_dependent_care_deduction: 330 -- name: Case 14, adult care expenses without disability are not deducted. +- name: Case 16, care of a member who is not a disabled adult does not count. period: 2024-01 absolute_error_margin: 0.01 input: @@ -353,9 +402,12 @@ person1: age: 30 weekly_hours_worked_before_lsr: 40 - person2: - age: 25 + # $100/month care_expenses: 1_200 + person2: + age: 60 + is_disabled: true + care_expenses: 0 spm_units: spm_unit: members: [person1, person2] @@ -364,6 +416,6 @@ members: [person1, person2] state_code: HI output: - # Person2 is neither a child nor a disabled adult, so no care - # recipients: min(100, 0) = 0. + # The disabled adult has no care cost: min(0, 175) = 0. + # Person1 is not disabled, so person1's care cost does not count. hi_tanf_dependent_care_deduction: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/integration.yaml index ddb1fcd3a82..b140c42588d 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/integration.yaml @@ -251,7 +251,7 @@ # Benefit = 610.56 - 570 = 40.56 hi_tanf: 40.56 -- name: Case 7, family with dependent care deduction in full pipeline. +- name: Case 7, child care expenses do not reduce countable income in full pipeline. period: 2024-01 input: people: @@ -280,20 +280,21 @@ output: hi_tanf_gross_income: 1_500 hi_tanf_gross_income_eligible: true - # Dependent care: min(150, 1 child × $175) = 150 - hi_tanf_dependent_care_deduction: 150 + # HAR 17-676-54.1(c)(4) and (d)(4) deduct only the care of an + # incapacitated adult, so the child's care is not deducted. + hi_tanf_dependent_care_deduction: 0 # Earned deductions for $1,500: # Step 1: 20% = 300, After: 1,200 # Step 2: $200 flat, After: 1,000 # Step 3: 55% = 550, After: 450 - # After dependent care: max(450 - 150, 0) = 300 - hi_tanf_countable_earned_income: 300 - hi_tanf_countable_income: 300 + # No dependent care deduction: 450 + hi_tanf_countable_earned_income: 450 + hi_tanf_countable_income: 450 # SOA = 1265 × 0.48 × 0.80 = 485.76 (mandatory-work steady-state) hi_tanf_maximum_benefit: 485.76 hi_tanf_eligible: true - # Benefit = 485.76 - 300 = 185.76 - hi_tanf: 185.76 + # Benefit = 485.76 - 450 = 35.76 + hi_tanf: 35.76 - name: Case 8, single person with no income. period: 2024-01 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.yaml index 347b36d2610..bd41c82b1e4 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.yaml @@ -3,6 +3,8 @@ # Max per child: # - $200/month for child under age 2 # - $175/month for child age 2-12 +# Child care counts only if the case is otherwise ineligible without it +# (Section 5(3)(b)1.c; DCBS Operations Manual Vol. III MS 2840 B.1). - name: No childcare expenses results in zero disregard. period: 2024-01 @@ -36,6 +38,9 @@ members: [parent, child] # $100/month * 12 = $1,200/year childcare_expenses: 1_200 + # Set as an input so the child care caps apply + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [parent, child] @@ -58,6 +63,9 @@ members: [parent, child] # $300/month * 12 = $3,600/year childcare_expenses: 3_600 + # Set as an input so the child care caps apply + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [parent, child] @@ -80,6 +88,9 @@ members: [parent, infant] # $400/month * 12 = $4,800/year childcare_expenses: 4_800 + # Set as an input so the child care caps apply + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [parent, infant] @@ -104,6 +115,9 @@ members: [parent, infant, child] # $500/month * 12 = $6,000/year childcare_expenses: 6_000 + # Set as an input so the child care caps apply + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [parent, infant, child] @@ -224,3 +238,206 @@ # Person2 is neither a dependent nor incapacitated, so the cap is $0: # min(100, 0) = 0. ky_ktap_dependent_care_disregard: 0 + +- name: Child care is not disregarded when the case is eligible without it. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 1_000 + child1: + age: 5 + child2: + age: 2 + spm_units: + spm_unit: + members: [parent, child1, child2] + # $1,530/month + childcare_expenses: 18_360 + households: + household: + members: [parent, child1, child2] + state_code: KY + output: + # Without the child care disregard, countable income is + # (1,000 - 175) x 0.5 = 412.50 < 631 standard of need (size 3), so the + # case stays eligible and CCAP, not the disregard, pays the child care + # (MS 2840 B.1.c). No incapacitated adult, so the disregard is $0. + ky_ktap_ineligible_without_child_care_disregard: false + ky_ktap_dependent_care_disregard: 0 + +- name: Child care is disregarded when the case is otherwise ineligible. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 400 + tanf_gross_unearned_income: 550 + child1: + age: 5 + child2: + age: 1 + spm_units: + spm_unit: + members: [parent, child1, child2] + # $300/month + childcare_expenses: 3_600 + households: + household: + members: [parent, child1, child2] + state_code: KY + output: + # Without child care: (400 - 175) x 0.5 + 550 = 662.50 > 631, ineligible. + # Cap: $175 (age 5) + $200 (age 1) = $375; min(300, 375) = 300 + ky_ktap_ineligible_without_child_care_disregard: true + ky_ktap_dependent_care_disregard: 300 + +- name: Incapacitated adult care counts but child care does not for an eligible case. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 1_000 + child: + age: 5 + adult: + age: 50 + is_incapable_of_self_care: true + care_expenses: 1_200 + spm_units: + spm_unit: + members: [parent, child, adult] + # $300/month + childcare_expenses: 3_600 + households: + household: + members: [parent, child, adult] + state_code: KY + output: + # Adult care: min(1,200 / 12 = 100, 175) = 100 (Section 5(3)(b)1.b) + # Without child care: (1,000 - 175 - 100) x 0.5 = 362.50 < 631, eligible, + # so the child's care is not disregarded. + ky_ktap_dependent_care_disregard: 100 + +- name: Each incapacitated adult's care is capped separately. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + adult1: + age: 50 + is_incapable_of_self_care: true + # $300/month + care_expenses: 3_600 + adult2: + age: 55 + is_incapable_of_self_care: true + # $50/month + care_expenses: 600 + spm_units: + spm_unit: + members: [parent, adult1, adult2] + households: + household: + members: [parent, adult1, adult2] + state_code: KY + output: + # Section 5(3)(b)2: $175 per month per individual. + # min(300, 175) + min(50, 175) = 175 + 50 = 225 (not min(350, 2 x 175)). + ky_ktap_dependent_care_disregard: 225 + +- name: An unused child cap does not absorb incapacitated adult care. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + child: + age: 5 + adult: + age: 50 + is_incapable_of_self_care: true + # $300/month + care_expenses: 3_600 + spm_units: + spm_unit: + members: [parent, child, adult] + childcare_expenses: 0 + # Set as an input so the child care caps apply + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true + households: + household: + members: [parent, child, adult] + state_code: KY + output: + # Adult: min(300, 175) = 175. Child: min(0, 175) = 0. + # 175 + 0 = 175 (not min(300, 175 + 175) = 300). + ky_ktap_dependent_care_disregard: 175 + +- name: An unused adult cap does not absorb child care. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + child: + age: 5 + adult: + age: 50 + is_incapable_of_self_care: true + care_expenses: 0 + spm_units: + spm_unit: + members: [parent, child, adult] + # $300/month + childcare_expenses: 3_600 + # Set as an input so the child care caps apply + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true + households: + household: + members: [parent, child, adult] + state_code: KY + output: + # Adult: min(0, 175) = 0. Child: min(300, 175) = 175. + # 0 + 175 = 175 (not min(300, 175 + 175) = 300). + ky_ktap_dependent_care_disregard: 175 + +- name: Child care is disregarded when countable income equals the standard of need. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 375 + tanf_gross_unearned_income: 452 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + # $300/month + childcare_expenses: 3_600 + households: + household: + members: [parent, child] + state_code: KY + output: + # Without child care: (375 - 175) x 0.5 + 452 = 552 = 552 standard of + # need (size 2). The payment is min(0.55 x (552 - 552), 450) = 0, so + # Section 9(5) makes the case otherwise ineligible. + ky_ktap_ineligible_without_child_care_disregard: true + # Child care: min(300, 175 cap for age 5) = 175 + ky_ktap_dependent_care_disregard: 175 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_incapacitated_adult_care_disregard.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_incapacitated_adult_care_disregard.yaml new file mode 100644 index 00000000000..d9053077d25 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_incapacitated_adult_care_disregard.yaml @@ -0,0 +1,190 @@ +# Kentucky K-TAP dependent care disregard for incapacitated adults +# Per 921 KAR 2:016 Section 5(3)(b)1.b, the disregard covers an incapacitated +# adult living in the home. Section 5(3)(b)2 caps it at $175 per month per +# individual (full-time rate; the part-time rate is not modeled). + +- name: Case 1, no incapacitated adult. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + childcare_expenses: 3_600 + households: + household: + members: [parent, child] + state_code: KY + output: + ky_ktap_incapacitated_adult_care_disregard: 0 + +- name: Case 2, one incapacitated adult with care below the cap. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + adult: + age: 50 + is_incapable_of_self_care: true + # $100/month + care_expenses: 1_200 + spm_units: + spm_unit: + members: [parent, adult] + households: + household: + members: [parent, adult] + state_code: KY + output: + # min(100, 175) = 100 + ky_ktap_incapacitated_adult_care_disregard: 100 + +- name: Case 3, one incapacitated adult with care at the cap. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + adult: + age: 50 + is_incapable_of_self_care: true + # $175/month + care_expenses: 2_100 + spm_units: + spm_unit: + members: [parent, adult] + households: + household: + members: [parent, adult] + state_code: KY + output: + # min(175, 175) = 175 + ky_ktap_incapacitated_adult_care_disregard: 175 + +- name: Case 4, one incapacitated adult with care above the cap. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + adult: + age: 50 + is_incapable_of_self_care: true + # $300/month + care_expenses: 3_600 + spm_units: + spm_unit: + members: [parent, adult] + households: + household: + members: [parent, adult] + state_code: KY + output: + # min(300, 175) = 175 + ky_ktap_incapacitated_adult_care_disregard: 175 + +- name: Case 5, two incapacitated adults are capped one by one. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + adult1: + age: 50 + is_incapable_of_self_care: true + # $300/month + care_expenses: 3_600 + adult2: + age: 55 + is_incapable_of_self_care: true + # $50/month + care_expenses: 600 + spm_units: + spm_unit: + members: [parent, adult1, adult2] + households: + household: + members: [parent, adult1, adult2] + state_code: KY + output: + # min(300, 175) + min(50, 175) = 175 + 50 = 225 + # A pooled cap would give min(350, 2 x 175) = 350. + ky_ktap_incapacitated_adult_care_disregard: 225 + +- name: Case 6, care for an adult who is not incapacitated does not count. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + # $100/month + care_expenses: 1_200 + adult: + age: 50 + is_incapable_of_self_care: true + care_expenses: 0 + spm_units: + spm_unit: + members: [parent, adult] + households: + household: + members: [parent, adult] + state_code: KY + output: + # The incapacitated adult has no care cost: min(0, 175) = 0. + # The parent's care cost does not count, as the parent is not + # incapacitated. + ky_ktap_incapacitated_adult_care_disregard: 0 + +- name: Case 7, an incapacitated child is not an incapacitated adult. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + child: + age: 10 + is_incapable_of_self_care: true + care_expenses: 1_200 + spm_units: + spm_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: KY + output: + ky_ktap_incapacitated_adult_care_disregard: 0 + +- name: Case 8, non-KY state returns zero. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + adult: + age: 50 + is_incapable_of_self_care: true + care_expenses: 1_200 + spm_units: + spm_unit: + members: [parent, adult] + households: + household: + members: [parent, adult] + state_code: TX + output: + ky_ktap_incapacitated_adult_care_disregard: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.yaml new file mode 100644 index 00000000000..fad585a3e32 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.yaml @@ -0,0 +1,188 @@ +# Kentucky K-TAP: is the case ineligible without the child care disregard? +# Per 921 KAR 2:016 Section 5(3)(b)1.c and DCBS Operations Manual Vol. III +# MS 2840 B.1, the dependent care disregard covers child care only for a case +# that is otherwise ineligible without it. Per 921 KAR 2:016 Section 4(2)(b), +# a case is ineligible when countable income exceeds the standard of need, +# and per Section 9(5) when its payment, the lesser of 55% of the deficit and +# the payment maximum (Section 9(4)(a)), is zero. +# Countable earned income here applies the $175 work expense, any +# incapacitated adult care disregard, and the 50% disregard (January). + +- name: Case 1, low earnings, eligible without the child care disregard. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 1_000 + child1: + age: 5 + child2: + age: 2 + spm_units: + spm_unit: + members: [parent, child1, child2] + childcare_expenses: 18_360 + households: + household: + members: [parent, child1, child2] + state_code: KY + output: + # Countable earned: (1,000 - 175) x 0.5 = 412.50 + # Standard of need (size 3): 631; 412.50 < 631, so eligible. + ky_ktap_ineligible_without_child_care_disregard: false + +- name: Case 2, countable income above the standard of need. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 400 + tanf_gross_unearned_income: 550 + child1: + age: 5 + child2: + age: 1 + spm_units: + spm_unit: + members: [parent, child1, child2] + childcare_expenses: 3_600 + households: + household: + members: [parent, child1, child2] + state_code: KY + output: + # Countable earned: (400 - 175) x 0.5 = 112.50; unearned: 550 + # Countable income: 662.50 > 631 standard of need (size 3), ineligible. + ky_ktap_ineligible_without_child_care_disregard: true + +- name: Case 3, countable income equal to the standard of need is ineligible. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 375 + tanf_gross_unearned_income: 452 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + childcare_expenses: 3_600 + households: + household: + members: [parent, child] + state_code: KY + output: + # Countable earned: (375 - 175) x 0.5 = 100; unearned: 452 + # Countable income: 552 = standard of need (size 2): 552. + # Section 4(2)(b) does not apply (552 does not exceed 552), but the + # payment is min(0.55 x (552 - 552), 450) = 0, so Section 9(5) makes the + # case ineligible. + ky_ktap_ineligible_without_child_care_disregard: true + +- name: Case 3a, countable income one dollar below the standard of need is eligible. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 373 + tanf_gross_unearned_income: 452 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + childcare_expenses: 3_600 + households: + household: + members: [parent, child] + state_code: KY + output: + # Countable earned: (373 - 175) x 0.5 = 99; unearned: 452 + # Countable income: 551 < 552 standard of need (size 2). + # Payment: min(0.55 x (552 - 551), 450) = 0.55 > 0, so the case is + # eligible without the child care disregard. + ky_ktap_ineligible_without_child_care_disregard: false + +- name: Case 3b, countable income one dollar above the standard of need is ineligible. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 377 + tanf_gross_unearned_income: 452 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + childcare_expenses: 3_600 + households: + household: + members: [parent, child] + state_code: KY + output: + # Countable earned: (377 - 175) x 0.5 = 101; unearned: 452 + # Countable income: 553 > 552 standard of need (size 2), ineligible. + ky_ktap_ineligible_without_child_care_disregard: true + +- name: Case 4, incapacitated adult care disregard applies in the test. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 600 + tanf_gross_unearned_income: 450 + child: + age: 5 + adult: + age: 50 + is_incapable_of_self_care: true + care_expenses: 1_200 + spm_units: + spm_unit: + members: [parent, child, adult] + childcare_expenses: 3_600 + households: + household: + members: [parent, child, adult] + state_code: KY + output: + # Incapacitated adult care: min(1,200 / 12 = 100, 175) = 100 + # Countable earned: (600 - 175 - 100) x 0.5 = 162.50; unearned: 450 + # Countable income: 612.50 < 631 standard of need (size 3), eligible. + # Without the adult care disregard it would be 662.50 (ineligible). + ky_ktap_ineligible_without_child_care_disregard: false + +- name: Case 5, unearned income above the standard of need. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_unearned_income: 700 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: KY + output: + # Countable unearned: 700; standard of need (size 2): 552. + ky_ktap_ineligible_without_child_care_disregard: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/integration.yaml index 76f0a7ffa87..eac611d2a9b 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/integration.yaml @@ -161,3 +161,106 @@ # Benefit: min(0.55 * $481, $524) = min($264.55, $524) = $264.55/month # Annual: $264.55 * 12 = $3,174.60 ky_ktap: 264.55 * 12 + +- name: Case 5, child care does not raise the benefit of a case eligible without it. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 1_000 + child1: + age: 5 + child2: + age: 2 + spm_units: + spm_unit: + members: [parent, child1, child2] + # $1,530/month + childcare_expenses: 18_360 + spm_unit_cash_assets: 0 + households: + household: + members: [parent, child1, child2] + state_code: KY + output: + # Monthly period. Without the child care disregard, countable income is + # (1,000 - 175) x 0.5 = 412.50 < 631 standard of need (size 3), so the + # case is eligible without it and the child care is not disregarded + # (921 KAR 2:016 Section 5(3)(b)1.c; MS 2840 B.1). + ky_ktap_dependent_care_disregard: 0 + ky_ktap_countable_income: 412.5 + # Benefit: min(0.55 x (631 - 412.50), 524) = 120.175 + ky_ktap: 120.175 + +- name: Case 6, child care disregard for a case otherwise ineligible. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 400 + tanf_gross_unearned_income: 550 + child1: + age: 5 + child2: + age: 1 + spm_units: + spm_unit: + members: [parent, child1, child2] + # $300/month + childcare_expenses: 3_600 + spm_unit_cash_assets: 0 + households: + household: + members: [parent, child1, child2] + state_code: KY + output: + # Monthly period. Without child care: (400 - 175) x 0.5 + 550 = 662.50 + # > 631 standard of need (size 3), ineligible; so the child care + # disregard applies: min(300, 175 + 200) = 300. + ky_ktap_dependent_care_disregard: 300 + # Earned: max(400 - 175 - 300, 0) = 0; countable: 0 + 550 = 550 + ky_ktap_countable_income: 550 + # Gross income 950 <= 631 x 1.85 = 1,167.35 + ky_ktap_eligible: true + # Benefit: min(0.55 x (631 - 550), 524) = 44.55 + ky_ktap: 44.55 + +- name: Case 7, child care disregard for a case whose countable income equals the standard of need. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 375 + tanf_gross_unearned_income: 452 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + # $300/month + childcare_expenses: 3_600 + spm_unit_cash_assets: 0 + households: + household: + members: [parent, child] + state_code: KY + output: + # Without child care: (375 - 175) x 0.5 + 452 = 552 = 552 standard of + # need (size 2). The payment would be min(0.55 x (552 - 552), 450) = 0, + # and 921 KAR 2:016 Section 9(5) makes a case with a zero payment + # ineligible, so the case is otherwise ineligible and the child care + # disregard applies (Section 5(3)(b)1.c): min(300, 175) = 175. + ky_ktap_ineligible_without_child_care_disregard: true + ky_ktap_dependent_care_disregard: 175 + # Earned: (375 - 175 - 175) x 0.5 = 12.50; countable: 12.50 + 452 = 464.50 + ky_ktap_countable_income: 464.5 + # Gross income 827 <= 552 x 1.85 = 1,021.20 + ky_ktap_eligible: true + # Benefit: min(0.55 x (552 - 464.50), 450) = 48.125 + ky_ktap: 48.125 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_countable_earned_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_countable_earned_income.yaml index 5861ac40167..97f0555675a 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_countable_earned_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_countable_earned_income.yaml @@ -116,6 +116,9 @@ members: [person1, person2, person3] # $300/month * 12 = $3,600/year childcare_expenses: 3_600 + # Set as an input so the child care caps apply + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [person1, person2, person3] @@ -173,6 +176,9 @@ members: [person1, person2, person3] # $300/month * 12 = $3,600/year childcare_expenses: 3_600 + # Set as an input so the child care caps apply + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [person1, person2, person3] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_edge_cases.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_edge_cases.yaml index da0d73bcf8e..3f4e1ea1269 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_edge_cases.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_edge_cases.yaml @@ -261,6 +261,9 @@ members: [person1, person2] # $100/month * 12 = $1,200/year childcare_expenses: 1_200 + # Set as an input so the child care caps apply + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [person1, person2] @@ -432,6 +435,9 @@ spm_unit: members: [person1, person2] childcare_expenses: 4_800 + # Set as an input so the child care caps apply + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [person1, person2] @@ -888,6 +894,9 @@ spm_unit: members: [parent, infant] childcare_expenses: 6_000 + # Set as an input so the child care caps apply + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [parent, infant] @@ -910,6 +919,9 @@ spm_unit: members: [parent, toddler] childcare_expenses: 6_000 + # Set as an input so the child care caps apply + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [parent, toddler] @@ -936,6 +948,9 @@ spm_unit: members: [parent, child] childcare_expenses: 6_000 + # Set as an input so the child care caps apply + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [parent, child] @@ -984,6 +999,9 @@ spm_unit: members: [parent, infant, teen] childcare_expenses: 6_000 + # Set as an input so the child care caps apply + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [parent, infant, teen] @@ -1013,6 +1031,9 @@ members: [parent, child] # Work expense $175 + dependent care cap $175 = $350 childcare_expenses: 6_000 + # Set as an input so the child care caps apply + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [parent, child] @@ -1077,6 +1098,9 @@ spm_unit: members: [parent, infant] childcare_expenses: 6_000 + # Set as an input so the child care caps apply + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true spm_unit_cash_assets: 0 households: household: @@ -1245,6 +1269,9 @@ members: [parent, child] # $50/month * 12 = $600/year (below $175 cap) childcare_expenses: 600 + # Set as an input so the child care caps apply + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [parent, child] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_historical.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_historical.yaml index 8e51a2e41e8..d2a34319ce3 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_historical.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_historical.yaml @@ -1043,6 +1043,9 @@ spm_unit: members: [person1, person2] childcare_expenses: 3_600 + # Set as an input so the child care caps apply + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [person1, person2] diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/reach_up/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/reach_up/integration.yaml index 77fcddab4ad..1d414ce48f8 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/reach_up/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/reach_up/integration.yaml @@ -576,7 +576,7 @@ # Benefit: $1,721.12 - $0 = $1,721.12 (full benefit) vt_reach_up: 1_721.12 -- name: Case 10, two-parent family with childcare expenses. +- name: Case 10, two-parent family with child care expenses that are not deducted. period: 2024-01 absolute_error_margin: 0.01 input: @@ -628,22 +628,22 @@ vt_reach_up_countable_earned_income_person: [337.5, 112.5, 0] # Dependent care deduction: - # 2 participants (head/spouse) x $175 = $350 max - # Actual expenses: $300 - # Deduction: min($300, $350) = $300 - vt_reach_up_dependent_care_deduction: 300 + # Rule 2252.2 covers care of a disabled or seriously ill adult and + # of a child outside the Reach Up household; the $300/month of child + # care for person3, a Reach Up child, is not deducted. + vt_reach_up_dependent_care_deduction: 0 - # Countable earned: max_($450 - $300, 0) = $150 - vt_reach_up_countable_earned_income: 150 + # Countable earned: max_($450 - $0, 0) = $450 + vt_reach_up_countable_earned_income: 450 # No unearned income vt_reach_up_countable_unearned_income: 0 - # Total countable: $150 - vt_reach_up_countable_income: 150 + # Total countable: $450 + vt_reach_up_countable_income: 450 # Eligible: true vt_reach_up_eligible: true - # Benefit: $856.096 - $150 = $706.10 - vt_reach_up: 706.10 + # Benefit: $856.096 - $450 = $406.10 + vt_reach_up: 406.10 diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/reach_up/vt_reach_up_dependent_care_deduction.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/reach_up/vt_reach_up_dependent_care_deduction.yaml index a10c1d143a0..7418f2b9e7f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/reach_up/vt_reach_up_dependent_care_deduction.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/reach_up/vt_reach_up_dependent_care_deduction.yaml @@ -1,8 +1,10 @@ # Vermont Reach Up Dependent Care Deduction # Max $175/month per participant (head or spouse) -# Source: Code Vt. R. 13-170-220-X Section 2252.2 +# Covers care of a disabled or seriously ill adult household member; +# child care for children in the Reach Up household is not deducted. +# Source: Code Vt. R. 13-170-220-X Section 2252.2; ESD Procedure P-2230A -- name: Case 1, zero childcare expenses. +- name: Case 1, zero care expenses. period: 2024-01 input: people: @@ -22,97 +24,151 @@ output: vt_reach_up_dependent_care_deduction: 0 -- name: Case 2, one participant childcare below max. +- name: Case 2, child care for a Reach Up child is not deducted. period: 2024-01 input: people: person1: + age: 30 is_tax_unit_head_or_spouse: true + person2: + age: 4 + is_tax_unit_head_or_spouse: false spm_units: spm_unit: - members: [person1] + members: [person1, person2] childcare_expenses: 1_200 # $100/month tax_units: tax_unit: - members: [person1] + members: [person1, person2] households: household: - members: [person1] + members: [person1, person2] state_code: VT output: - # min($100, $175) = $100 + # Rule 2252.2(b) covers only a child who is not a member of the + # Reach Up household; P-2230A step 2: "incapacitated adult or + # non-Reach Up member". The child here is in the unit, so $0. + vt_reach_up_dependent_care_deduction: 0 + +- name: Case 3, one participant, disabled adult care below max. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + is_tax_unit_head_or_spouse: true + person2: + age: 60 + is_tax_unit_head_or_spouse: false + is_disabled: true + care_expenses: 1_200 # $100/month + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Rule 2252.2(a): care of a disabled or seriously ill adult. + # min($100, 1 participant x $175) = $100 vt_reach_up_dependent_care_deduction: 100 -- name: Case 3, one participant childcare above max. +- name: Case 4, one participant, disabled adult care above max. period: 2024-01 + absolute_error_margin: 0.01 input: people: person1: + age: 30 is_tax_unit_head_or_spouse: true + person2: + age: 60 + is_tax_unit_head_or_spouse: false + is_disabled: true + care_expenses: 3_600 # $300/month spm_units: spm_unit: - members: [person1] - childcare_expenses: 3_600 # $300/month + members: [person1, person2] tax_units: tax_unit: - members: [person1] + members: [person1, person2] households: household: - members: [person1] + members: [person1, person2] state_code: VT output: # min($300, $175) = $175 (capped) vt_reach_up_dependent_care_deduction: 175 -- name: Case 4, two participants childcare below double max. +- name: Case 5, two participants, disabled adult care below double max. period: 2024-01 + absolute_error_margin: 0.01 input: people: person1: + age: 30 is_tax_unit_head_or_spouse: true person2: + age: 30 is_tax_unit_head_or_spouse: true + person3: + age: 60 + is_tax_unit_head_or_spouse: false + is_disabled: true + care_expenses: 3_000 # $250/month spm_units: spm_unit: - members: [person1, person2] - childcare_expenses: 3_000 # $250/month + members: [person1, person2, person3] tax_units: tax_unit: - members: [person1, person2] + members: [person1, person2, person3] households: household: - members: [person1, person2] + members: [person1, person2, person3] state_code: VT output: # 2 participants = $350 max # min($250, $350) = $250 vt_reach_up_dependent_care_deduction: 250 -- name: Case 5, two participants childcare above double max. +- name: Case 6, two participants, disabled adult care above double max. period: 2024-01 + absolute_error_margin: 0.01 input: people: person1: + age: 30 is_tax_unit_head_or_spouse: true person2: + age: 30 is_tax_unit_head_or_spouse: true + person3: + age: 60 + is_tax_unit_head_or_spouse: false + is_disabled: true + care_expenses: 6_000 # $500/month spm_units: spm_unit: - members: [person1, person2] - childcare_expenses: 6_000 # $500/month + members: [person1, person2, person3] tax_units: tax_unit: - members: [person1, person2] + members: [person1, person2, person3] households: household: - members: [person1, person2] + members: [person1, person2, person3] state_code: VT output: # 2 participants = $350 max # min($500, $350) = $350 (capped) vt_reach_up_dependent_care_deduction: 350 -- name: Case 6, disabled adult care expenses count toward the deduction. +- name: Case 7, disabled adult care expenses count toward the deduction. period: 2024-01 absolute_error_margin: 0.01 input: @@ -123,8 +179,7 @@ age: 35 # Describe the legal scenario (Rule 2252.2(a) covers a disabled or # seriously ill adult); the formula pools care_expenses without a - # disability filter and caps per participant, symmetric with the - # childcare side. + # disability filter and caps per participant. is_disabled: true is_incapable_of_self_care: true care_expenses: 1_200 @@ -140,3 +195,34 @@ # adult household member, capped at $175/month per participant. # Expenses = 1,200 / 12 = 100/month, below the cap. vt_reach_up_dependent_care_deduction: 100 + +- name: Case 8, child care and disabled adult care, only the adult care counts. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + is_tax_unit_head_or_spouse: true + person2: + age: 4 + is_tax_unit_head_or_spouse: false + person3: + age: 60 + is_tax_unit_head_or_spouse: false + is_disabled: true + care_expenses: 1_200 # $100/month + spm_units: + spm_unit: + members: [person1, person2, person3] + childcare_expenses: 3_600 # $300/month, not deductible + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # Adult care only: min($100, 1 participant x $175) = $100 + vt_reach_up_dependent_care_deduction: 100 diff --git a/policyengine_us/variables/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.py b/policyengine_us/variables/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.py index a07aa2f7839..4c236bef255 100644 --- a/policyengine_us/variables/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.py +++ b/policyengine_us/variables/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.py @@ -8,6 +8,8 @@ class hi_tanf_dependent_care_deduction(Variable): unit = USD definition_period = MONTH reference = ( + "https://www.law.cornell.edu/regulations/hawaii/Haw-Code-R-SS-17-676-54-1", + "https://www.law.cornell.edu/regulations/hawaii/Haw-Code-R-SS-17-676-2", "https://humanservices.hawaii.gov/wp-content/uploads/2024/12/Hawaii_TANF_State_Plan_Signed_Certified-Eff_20231001.pdf#page=20", ) defined_for = StateCode.HI @@ -15,18 +17,15 @@ class hi_tanf_dependent_care_deduction(Variable): def formula(spm_unit, period, parameters): p = parameters(period).gov.states.hi.dhs.tanf.deductions.dependent_care - # Per State Plan section 10.2.1(D), the deduction covers the cost - # of care for a disabled adult household member; care of children - # also flows through the same per-person caps. - childcare_expenses = spm_unit("childcare_expenses", period) - adult_care_expenses = add(spm_unit, period, ["care_expenses"]) - - # Count children and disabled adults in the unit for the per-person cap + # Per HAR 17-676-54.1(c)(4) and (d)(4) and the HAR 17-676-2 + # definition, the deduction covers only the cost of care for each + # incapacitated adult in the household (State Plan 10.2.2: "cost of + # care for a disabled adult household member"). Child care is not + # deducted. person = spm_unit.members - is_child = person("is_child", period.this_year) is_adult = ~person("is_child", period.this_year) is_disabled_adult = is_adult & person("is_disabled", period.this_year) - num_care_recipients = spm_unit.sum(is_child | is_disabled_adult) + adult_care_expenses = person("care_expenses", period) * is_disabled_adult # Determine rate based on MAX of adult hours # If either parent works full-time, use full-time rate @@ -38,7 +37,6 @@ def formula(spm_unit, period, parameters): # Full-time = 32+ hours/week # Rate is $175 (full-time) or $165 (part-time) per person rate = p.amount.calc(max_adult_hours) - max_deduction = num_care_recipients * rate - # Deduct actual cost up to max per care recipient - return min_(childcare_expenses + adult_care_expenses, max_deduction) + # Deduct each disabled adult's actual cost up to the rate + return spm_unit.sum(min_(adult_care_expenses, spm_unit.project(rate))) diff --git a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_countable_earned_income.py b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_countable_earned_income.py index 21ac63258a1..41a1cf539fd 100644 --- a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_countable_earned_income.py +++ b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_countable_earned_income.py @@ -1,4 +1,7 @@ from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.ky.dcbs.ktap.income.ky_ktap_earned_income_helpers import ( + ky_ktap_countable_earnings, +) class ky_ktap_countable_earned_income(Variable): @@ -17,20 +20,6 @@ def formula(spm_unit, period, parameters): p = parameters(period).gov.states.ky.dcbs.ktap.income.deductions person = spm_unit.members gross_earned = person("tanf_gross_earned_income", period) - # (a) Work expense per person per MS 2840.A - after_work_expense = max_(gross_earned - p.work_expense, 0) - # (b) Dependent care per MS 2840.B dep_care = person("ky_ktap_dependent_care_disregard_person", period) - after_dep_care = max_(after_work_expense - dep_care, 0) - # (e) Time-limited EID per person per MS 2857 - # Uses calendar month as proxy for participation months. - month = period.start.month - eid_rate = p.earned_income_disregard_rate.calc(month) - if p.earned_income_flat_disregard_in_effect: - flat = p.earned_income_flat_disregard - remainder = max_(after_dep_care - flat, 0) - disregard = flat + eid_rate * remainder - else: - disregard = eid_rate * after_dep_care - countable_per_person = max_(after_dep_care - disregard, 0) - return spm_unit.sum(countable_per_person) + countable = ky_ktap_countable_earnings(gross_earned, dep_care, p, period) + return spm_unit.sum(countable) diff --git a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.py b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.py index b2dbdbcec6c..cef3b9771fd 100644 --- a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.py +++ b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.py @@ -7,7 +7,11 @@ class ky_ktap_dependent_care_disregard(Variable): label = "Kentucky K-TAP dependent care disregard" unit = USD definition_period = MONTH - reference = "https://apps.legislature.ky.gov/law/kar/titles/921/002/016/" + reference = ( + "https://apps.legislature.ky.gov/law/kar/titles/921/002/016/", + # PDF pages 162-163 + "https://www.chfs.ky.gov/agencies/dcbs/dfs/Documents/OMVOLIII.pdf#page=162", + ) defined_for = StateCode.KY def formula(spm_unit, period, parameters): @@ -15,20 +19,27 @@ def formula(spm_unit, period, parameters): p = parameters(period).gov.states.ky.dcbs.ktap.income.deductions person = spm_unit.members is_dependent = person("is_tax_unit_dependent", period) - # Per 921 KAR 2:016 Section 5(3)(b)1.b, the disregard covers an - # incapacitated adult living in the home and receiving KTAP. incapacitated_adult = person("is_adult", period.this_year) & person( "is_incapable_of_self_care", period.this_year ) age = person("age", period.this_year) - # Children use their age-based rate; the older-age zero-out reflects - # children aging out of care. An incapacitated adult instead receives - # the standard age-two-or-older rate per 921 KAR 2:016 Section - # 5(3)(b)2, so evaluate the schedule at the age-two boundary for them. - cap_age = where(incapacitated_adult, p.dependent_care.thresholds[1], age) - care_recipient = is_dependent | incapacitated_adult - max_per_person = p.dependent_care.calc(cap_age) * care_recipient - total_max_disregard = spm_unit.sum(max_per_person) + # Children use their age-based rate per 921 KAR 2:016 Section + # 5(3)(b)2; the older-age zero-out reflects children aging out of + # care. Incapacitated adults are capped one by one in + # ky_ktap_incapacitated_adult_care_disregard. Child care expenses are + # a unit total, so the children's caps are summed. + is_child_care_recipient = is_dependent & ~incapacitated_adult + child_caps = spm_unit.sum(p.dependent_care.calc(age) * is_child_care_recipient) childcare_expenses = spm_unit("childcare_expenses", period) - adult_care_expenses = add(spm_unit, period, ["care_expenses"]) - return min_(childcare_expenses + adult_care_expenses, total_max_disregard) + child_care_disregard = min_(childcare_expenses, child_caps) + # Per Section 5(3)(b)1.c and MS 2840 B.1, child care counts only for a + # case that is otherwise ineligible without it; CCAP pays child care + # for a case that remains eligible. The month-of-application case + # (Section 5(3)(b)1.d) is not modeled. + child_care_counts = spm_unit( + "ky_ktap_ineligible_without_child_care_disregard", period + ) + adult_care_disregard = spm_unit( + "ky_ktap_incapacitated_adult_care_disregard", period + ) + return adult_care_disregard + where(child_care_counts, child_care_disregard, 0) diff --git a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard_person.py b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard_person.py index 6bfd0b03fd1..58898b3e356 100644 --- a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard_person.py +++ b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard_person.py @@ -1,4 +1,7 @@ from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.ky.dcbs.ktap.income.ky_ktap_earned_income_helpers import ( + ky_ktap_dependent_care_share, +) class ky_ktap_dependent_care_disregard_person(Variable): @@ -14,13 +17,4 @@ def formula(person, period, parameters): # Per MS 2840 B.2.c: "only one parent's income" # Allocate unit-level dependent care to the primary earner. unit_dep_care = person.spm_unit("ky_ktap_dependent_care_disregard", period) - gross_earned = person("tanf_gross_earned_income", period) - max_earned = person.spm_unit.max(gross_earned) - has_most_earnings = gross_earned == max_earned - is_recipient = has_most_earnings & (gross_earned > 0) - n_recipients = person.spm_unit.sum(is_recipient * 1.0) - return where( - n_recipients > 0, - unit_dep_care * is_recipient / max_(n_recipients, 1), - 0, - ) + return unit_dep_care * ky_ktap_dependent_care_share(person, period) diff --git a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_earned_income_helpers.py b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_earned_income_helpers.py new file mode 100644 index 00000000000..3f39deb122e --- /dev/null +++ b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_earned_income_helpers.py @@ -0,0 +1,34 @@ +from policyengine_us.model_api import * + + +def ky_ktap_dependent_care_share(person, period): + """Each member's share of the unit's dependent care disregard. + + Per MS 2840 B.2.c, the disregard applies to only one parent's income, so + it goes to the member with the most gross earnings (split evenly on ties). + """ + gross_earned = person("tanf_gross_earned_income", period) + max_earned = person.spm_unit.max(gross_earned) + is_recipient = (gross_earned == max_earned) & (gross_earned > 0) + n_recipients = person.spm_unit.sum(is_recipient * 1.0) + return where(n_recipients > 0, is_recipient / max_(n_recipients, 1), 0) + + +def ky_ktap_countable_earnings(gross_earned, dependent_care, p, period): + """Each member's countable earnings under 921 KAR 2:016 Section 5(3). + + Applies the work expense (MS 2840 A), the dependent care disregard + (MS 2840 B) and the time-limited earned income disregard (MS 2857). + `p` is `parameters(period).gov.states.ky.dcbs.ktap.income.deductions`. + """ + after_work_expense = max_(gross_earned - p.work_expense, 0) + after_dep_care = max_(after_work_expense - dependent_care, 0) + # Uses calendar month as proxy for participation months. + eid_rate = p.earned_income_disregard_rate.calc(period.start.month) + if p.earned_income_flat_disregard_in_effect: + flat = p.earned_income_flat_disregard + remainder = max_(after_dep_care - flat, 0) + disregard = flat + eid_rate * remainder + else: + disregard = eid_rate * after_dep_care + return max_(after_dep_care - disregard, 0) diff --git a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_incapacitated_adult_care_disregard.py b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_incapacitated_adult_care_disregard.py new file mode 100644 index 00000000000..756fb08cea9 --- /dev/null +++ b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_incapacitated_adult_care_disregard.py @@ -0,0 +1,26 @@ +from policyengine_us.model_api import * + + +class ky_ktap_incapacitated_adult_care_disregard(Variable): + value_type = float + entity = SPMUnit + label = "Kentucky K-TAP dependent care disregard for incapacitated adults" + unit = USD + definition_period = MONTH + reference = "https://apps.legislature.ky.gov/law/kar/titles/921/002/016/" + defined_for = StateCode.KY + + def formula(spm_unit, period, parameters): + # Per 921 KAR 2:016 Section 5(3)(b)1.b, the disregard covers an + # incapacitated adult living in the home and receiving KTAP. + p = parameters(period).gov.states.ky.dcbs.ktap.income.deductions + person = spm_unit.members + incapacitated_adult = person("is_adult", period.this_year) & person( + "is_incapable_of_self_care", period.this_year + ) + # Section 5(3)(b)2 caps the care of each individual. An incapacitated + # adult receives the standard age-two-or-older rate, so evaluate the + # schedule at the age-two boundary. + max_per_adult = p.dependent_care.calc(p.dependent_care.thresholds[1]) + adult_care_expenses = person("care_expenses", period) * incapacitated_adult + return spm_unit.sum(min_(adult_care_expenses, max_per_adult)) diff --git a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.py b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.py new file mode 100644 index 00000000000..071e11a767c --- /dev/null +++ b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.py @@ -0,0 +1,50 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.ky.dcbs.ktap.income.ky_ktap_earned_income_helpers import ( + ky_ktap_countable_earnings, + ky_ktap_dependent_care_share, +) + + +class ky_ktap_ineligible_without_child_care_disregard(Variable): + value_type = bool + entity = SPMUnit + label = "Kentucky K-TAP case is ineligible without the child care disregard" + definition_period = MONTH + reference = ( + # Sections 4(2)(b), 5(3)(b)1.c, 9(4)(a) and 9(5) + "https://apps.legislature.ky.gov/law/kar/titles/921/002/016/", + # PDF pages 160, 162 + "https://www.chfs.ky.gov/agencies/dcbs/dfs/Documents/OMVOLIII.pdf#page=160", + ) + defined_for = StateCode.KY + + def formula(spm_unit, period, parameters): + # Compute countable income with the dependent care disregard for + # incapacitated adults only. + p = parameters(period).gov.states.ky.dcbs.ktap + person = spm_unit.members + gross_earned = person("tanf_gross_earned_income", period) + adult_care = spm_unit("ky_ktap_incapacitated_adult_care_disregard", period) + adult_care_person = spm_unit.project(adult_care) * ky_ktap_dependent_care_share( + person, period + ) + countable_earned = spm_unit.sum( + ky_ktap_countable_earnings( + gross_earned, adult_care_person, p.income.deductions, period + ) + ) + countable_unearned = spm_unit("ky_ktap_countable_unearned_income", period) + countable_income = countable_earned + countable_unearned + standard_of_need = spm_unit("ky_ktap_standard_of_need", period) + # Per 921 KAR 2:016 Section 4(2)(b), a case whose countable income + # exceeds the standard of need is ineligible. + exceeds_need = countable_income > standard_of_need + # Per Section 9(5), a case whose payment is zero is also ineligible. + # Section 9(4)(a) pays the lesser of 55% of the deficit below the + # standard of need and the payment maximum, so the payment is zero + # when countable income equals the standard of need. + deficit = max_(standard_of_need - countable_income, 0) + payment_maximum = spm_unit("ky_ktap_payment_maximum", period) + payment = min_(deficit * p.benefit.rate, payment_maximum) + zero_payment = payment == 0 + return exceeds_need | zero_payment diff --git a/policyengine_us/variables/gov/states/vt/dcf/reach_up/income/deductions/vt_reach_up_dependent_care_deduction.py b/policyengine_us/variables/gov/states/vt/dcf/reach_up/income/deductions/vt_reach_up_dependent_care_deduction.py index edce5846b27..4be2d026662 100644 --- a/policyengine_us/variables/gov/states/vt/dcf/reach_up/income/deductions/vt_reach_up_dependent_care_deduction.py +++ b/policyengine_us/variables/gov/states/vt/dcf/reach_up/income/deductions/vt_reach_up_dependent_care_deduction.py @@ -8,7 +8,10 @@ class vt_reach_up_dependent_care_deduction(Variable): unit = USD definition_period = MONTH reference = ( - "https://www.law.cornell.edu/regulations/vermont/13-220-Code-Vt-R-13-170-220-X" + "https://www.law.cornell.edu/regulations/vermont/13-220-Code-Vt-R-13-170-220-X", + # PDF pages 71, 74-75 + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/ESD/Rules/2200-Reach-Up.pdf#page=71", + "https://outside.vermont.gov/dept/DCF/Policies%20Procedures%20Guidance/ESD-Procedure-P2230A.pdf", ) defined_for = StateCode.VT @@ -16,13 +19,16 @@ def formula(spm_unit, period, parameters): # Per Section 2252.2(c): $175/month max per participant claiming the deduction. # We approximate "participant" as head or spouse since they are the earners. # Per Section 2252.2(a), the deduction covers care of a household - # member who is a disabled or seriously ill adult, so adult care - # expenses count alongside childcare. + # member who is a disabled or seriously ill adult. Section 2252.2(b) + # covers child care only for a child who is not a member of the + # Reach Up household, which the model does not track; child care for + # children in the unit is not deducted (rule 2251.1(e): child care + # provided as a Reach Up support service is not a dependent care + # expense; ESD Procedure P-2230A). p = parameters(period).gov.states.vt.dcf.reach_up.income.deductions person = spm_unit.members head_or_spouse = person("is_tax_unit_head_or_spouse", period) num_participants = spm_unit.sum(head_or_spouse) max_deduction = p.dependent_care * num_participants - childcare_expenses = spm_unit("childcare_expenses", period) adult_care_expenses = add(spm_unit, period, ["care_expenses"]) - return min_(childcare_expenses + adult_care_expenses, max_deduction) + return min_(adult_care_expenses, max_deduction) diff --git a/policyengine_us/variables/gov/states/vt/dcf/reach_up/income/vt_reach_up_countable_earned_income.py b/policyengine_us/variables/gov/states/vt/dcf/reach_up/income/vt_reach_up_countable_earned_income.py index 85b2bbcfff0..521fd891da7 100644 --- a/policyengine_us/variables/gov/states/vt/dcf/reach_up/income/vt_reach_up_countable_earned_income.py +++ b/policyengine_us/variables/gov/states/vt/dcf/reach_up/income/vt_reach_up_countable_earned_income.py @@ -17,5 +17,6 @@ def formula(spm_unit, period, parameters): earned_after_disregard = add( spm_unit, period, ["vt_reach_up_countable_earned_income_person"] ) + # Order per rule 2251.1(c)(1): earned income disregard, then dependent care. dependent_care = spm_unit("vt_reach_up_dependent_care_deduction", period) return max_(earned_after_disregard - dependent_care, 0) diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index ba5edb758dd..f19cf35ef3c 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -2565,6 +2565,38 @@ candidates: the amendment implements a state plan amendment to KCHIP Phase III that extends coverage to pregnant recipients, which is KY-21-0001. Since the text does not settle the question, the agency''s reading decides. The register entry and the code marker follow the merge.' +- id: us-ky:ktap-incapacitated-adult-care-condition + program: tanf + years: + from: 2015 + type: calendar + question: Does the K-TAP dependent care disregard for an incapacitated adult apply only when the case would be + ineligible without it? + sources: + - kind: regulation + citation: 921 KAR 2:016 Section 5(3)(b)1 + url: https://apps.legislature.ky.gov/law/kar/titles/921/002/016/ + - kind: manual + citation: DCBS Operations Manual Volume III, MS 2840 B.1, OMTL-616, revised 3/1/23 + url: https://www.chfs.ky.gov/agencies/dcbs/dfs/Documents/OMVOLIII.pdf#page=162 + readings: + statute: Care of "an incapacitated adult living in the home and receiving KTAP" (1.b) is a case of its own; + the otherwise-ineligible case (1.c) covers only child care. + other: The deduction needs care paid for "a child or an incapacitated adult" and a case that "would be + ineligible without the deduction", for the adult as for the child. + example: In January 2025 a unit of three has a parent who earns $1,000, a child age 5 and an incapacitated adult + with $100 a month of care. Without any dependent care disregard countable income is 412.50, under the 631 + standard of need. The regulation allows the $100 disregard; the manual allows none. + pe_us: + follows: statute + code: + - policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_incapacitated_adult_care_disregard.py + - policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.py + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10254 + state: unreviewed + note: Section 5(3)(b)1.b reads the same in the versions effective 11-18-2015 and 2-16-2023. Code not yet on + main. - id: us-ky:ktap-payment-maximum-2025 program: tanf years: @@ -7035,6 +7067,34 @@ candidates: state: unreviewed note: PE-US treats the worksheet as filling silence about actual itemization; verify that interpretation against the statutory phrase. +- id: us-vt:reach-up-dependent-care-order + program: tanf + years: + from: 2024 + type: calendar + question: Does Reach Up subtract the dependent care deduction from earned income before or after the earned + income disregard? + sources: + - kind: regulation + citation: Reach Up rule 2251.1(c)(1), 08/01/2024 + url: https://outside.vermont.gov/dept/DCF/Shared%20Documents/ESD/Rules/2200-Reach-Up.pdf#page=71 + - kind: guidance + citation: ESD Procedure P-2230A, net earned income steps 2 and 4-6 + url: https://outside.vermont.gov/dept/DCF/Policies%20Procedures%20Guidance/ESD-Procedure-P2230A.pdf + readings: + statute: The unsubsidized sequence is business expenses, then the earned income disregard (rule 2252.3), then + dependent care (rule 2252.2). + other: Dependent care comes off first, then the $90 deduction or $350 disregard, then 25% of the subtotal. + example: One participant earns $1,000 and pays $100 a month of disabled adult care. The rule gives 1,000 - (350 + + 0.25 x 650) - 100 = 387.50 of net earned income; the procedure gives (1,000 - 100 - 350) x 0.75 = 412.50. + pe_us: + follows: statute + code: + - policyengine_us/variables/gov/states/vt/dcf/reach_up/income/vt_reach_up_countable_earned_income.py + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10254 + state: unreviewed + note: The earlier rule editions were not compared. - id: us-vt:renter-credit-booklet-income-limit-errors program: renter-credit years: