diff --git a/changelog.d/fix-10209-ms-tanf-deductions.fixed.md b/changelog.d/fix-10209-ms-tanf-deductions.fixed.md new file mode 100644 index 00000000000..bf39d9263f8 --- /dev/null +++ b/changelog.d/fix-10209-ms-tanf-deductions.fixed.md @@ -0,0 +1 @@ +Deduct Mississippi TANF's $90 work expense and actual dependent care costs from each earner's earnings, and do not issue benefits under $10 a month. diff --git a/policyengine_us/parameters/gov/states/ms/dhs/tanf/income/deductions/work_expense.yaml b/policyengine_us/parameters/gov/states/ms/dhs/tanf/income/deductions/work_expense.yaml new file mode 100644 index 00000000000..72756691413 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/dhs/tanf/income/deductions/work_expense.yaml @@ -0,0 +1,14 @@ +description: Mississippi deducts this amount of monthly work expenses from each earner's earned income under the Temporary Assistance for Needy Families program. + +values: + 2017-01-01: 90 + +metadata: + unit: currency-USD + period: month + label: Mississippi TANF work expense deduction + reference: + - title: "MDHS TANF Policy Manual, Volume III (July 2019), Chapter 4 - Earned Income Disregards and Chapter 6 - Budgeting Net Monthly Earned Income #page 370,470" + href: https://www.mdhs.ms.gov/wp-content/uploads/2019/07/TANF-Manual-Revised_7.19.pdf#page=370 + - title: "Miss. Admin. Code tit. 18, pt. 13, TANF Policy Manual, Volume III, Chapter 4 - Earned Income Disregards and Chapter 6 - Budgeting Net Monthly Earned Income #page 362,469" + href: https://www.sos.ms.gov/adminsearch/ACCode/00000330c.pdf#page=362 diff --git a/policyengine_us/parameters/gov/states/ms/dhs/tanf/minimum_payment.yaml b/policyengine_us/parameters/gov/states/ms/dhs/tanf/minimum_payment.yaml new file mode 100644 index 00000000000..36a1fe23d68 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ms/dhs/tanf/minimum_payment.yaml @@ -0,0 +1,14 @@ +description: Mississippi does not issue Temporary Assistance for Needy Families program payments below this amount. + +values: + 2017-01-01: 10 + +metadata: + unit: currency-USD + period: month + label: Mississippi TANF minimum payment + reference: + - title: "MDHS TANF Policy Manual, Volume III (July 2019), Chapter 6 - Minimum Benefit and Chapter 15 - Table II #page 459,888" + href: https://www.mdhs.ms.gov/wp-content/uploads/2019/07/TANF-Manual-Revised_7.19.pdf#page=459 + - title: "Miss. Admin. Code tit. 18, pt. 13, TANF Policy Manual, Volume III, Chapter 6 - Minimum Benefit and Chapter 15 - Table II #page 459,970" + href: https://www.sos.ms.gov/adminsearch/ACCode/00000330c.pdf#page=459 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/integration.yaml index 47bb3b586cd..bddac6bd8d8 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/integration.yaml @@ -6,7 +6,15 @@ # - Income limits by size: 1=$627, 2=$851, 3=$1,074, 4=$1,298, 5=$1,523 # - Payment standards: First person $200, second $36, each additional $24 # - Resource limit: $2,000 -# - Benefit: Maximum Payment Standard - Countable Income +# - Countable earned income: each earner's earnings less $90, then less +# actual dependent care costs +# - Benefit: Maximum Payment Standard - Countable Income; no benefit under $10 +# +# The benefit formula is PolicyEngine's current one. MDHS pays 60% of the +# deficit (need standard less net income), up to the maximum (Title 18, +# Part 13, Chapter 6, Computing Benefit; Chapter 15, Table II). That change +# is tracked in PolicyEngine/policyengine-us#10269; the Case 9 and Case 10 +# comments give the amounts under the 60% rule. - name: Case 1, single parent with one child, no income, receives maximum benefit. period: 2026-01 @@ -304,3 +312,68 @@ # $500 <= $1,522.55 = true ms_tanf_income_eligible: true ms_tanf_eligible: true + +- name: Case 9, parent of two with $200 a month of earnings gets the $90 work expense deduction. + period: 2026 + input: + people: + parent: + age: 30 + employment_income_before_lsr: 2_400 + child1: + age: 5 + is_tax_unit_dependent: true + child2: + age: 2 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [parent, child1, child2] + spm_unit_cash_assets: 0 + tax_units: + tax_unit: + members: [parent, child1, child2] + households: + household: + members: [parent, child1, child2] + state_code: MS + output: + # Monthly countable income: 200 - 90 = 110 + ms_tanf_countable_income: 110 * 12 + # PolicyEngine's current formula: (260 - 110) * 12 = 1_800 + # 60% of the deficit (#10269): min(floor(0.6 * (581 - 110)), 260) * 12 + # = min(282, 260) * 12 = 3_120 + ms_tanf: 1_800 + +- name: Case 10, parent of two with $200 a month of earnings and $50 a month of child care. + period: 2026 + input: + people: + parent: + age: 30 + employment_income_before_lsr: 2_400 + child1: + age: 5 + is_tax_unit_dependent: true + child2: + age: 2 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [parent, child1, child2] + spm_unit_cash_assets: 0 + childcare_expenses: 600 + tax_units: + tax_unit: + members: [parent, child1, child2] + households: + household: + members: [parent, child1, child2] + state_code: MS + output: + # Monthly countable income: 200 - 90 - 50 = 60 + ms_tanf_countable_income: 60 * 12 + # PolicyEngine's current formula: (260 - 60) * 12 = 2_400 + # 60% of the deficit (#10269): min(floor(0.6 * (581 - 60)), 260) * 12 + # = min(312, 260) * 12 = 3_120 + ms_tanf: 2_400 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/ms_tanf.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/ms_tanf.yaml index efa341c2bc3..5addc16dd24 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/ms_tanf.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/ms_tanf.yaml @@ -1,7 +1,14 @@ # Mississippi TANF benefit calculation tests # Benefit = Maximum Payment Standard - Countable Income # If countable income exceeds payment standard, benefit = $0 +# No benefit is issued when the monthly benefit is less than $10 # Must be eligible (ms_tanf_eligible) to receive any benefit +# +# These cases test PolicyEngine's current formula. MDHS pays 60% of the +# deficit (need standard less net income), up to the maximum (Title 18, +# Part 13, Chapter 6, Computing Benefit; Chapter 15, Table II). That change +# is tracked in PolicyEngine/policyengine-us#10269 and will change these +# expectations. - name: Case 1, ineligible household receives zero benefit. period: 2026-01 @@ -112,7 +119,7 @@ # $200 - $50 = $150 ms_tanf: 150 -- name: Case 11, high income reduces benefit to near zero. +- name: Case 11, benefit under the $10 minimum payment is not issued. period: 2026-01 input: state_code: MS @@ -120,5 +127,21 @@ ms_tanf_maximum_benefit: 260 ms_tanf_countable_income: 255 output: - # $260 - $255 = $5 - ms_tanf: 5 + # $260 - $255 = $5 < $10 minimum payment + # Under the 60% rule (#10269), countable income of 255 for a family of 3 + # gives floor(0.6 * (581 - 255)) = 195; this case would then need + # countable income of 570: floor(0.6 * 11) = 6 < 10. + ms_tanf: 0 + +- name: Case 12, benefit equal to the $10 minimum payment is issued. + period: 2026-01 + input: + state_code: MS + ms_tanf_eligible: true + ms_tanf_maximum_benefit: 260 + ms_tanf_countable_income: 250 + output: + # $260 - $250 = $10 >= $10 minimum payment + # Under the 60% rule (#10269), this case would need countable income of + # 564: floor(0.6 * 17) = 10. + ms_tanf: 10 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/ms_tanf_countable_earned_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/ms_tanf_countable_earned_income.yaml new file mode 100644 index 00000000000..b934206d677 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ms/dhs/tanf/ms_tanf_countable_earned_income.yaml @@ -0,0 +1,178 @@ +# Mississippi TANF countable earned income +# MDHS TANF Policy Manual, Volume III, Chapter 6, Budgeting Net Monthly +# Earned Income: deduct from each earner's monthly earnings (a) $90 for work +# expenses, then (b) the actual cost of dependent care. + +- name: Case 1, no earnings. + period: 2026-01 + input: + people: + parent: + age: 30 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: MS + output: + ms_tanf_countable_earned_income: 0 + +- name: Case 2, one earner, $90 work expense deduction. + period: 2026-01 + input: + people: + parent: + age: 30 + employment_income_before_lsr: 2_400 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: MS + output: + # 2_400 / 12 - 90 = 200 - 90 = 110 + ms_tanf_countable_earned_income: 110 + +- name: Case 3, one earner with child care costs. + period: 2026-01 + input: + people: + parent: + age: 30 + employment_income_before_lsr: 2_400 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + childcare_expenses: 600 + households: + household: + members: [parent, child] + state_code: MS + output: + # 200 - 90 - 600 / 12 = 200 - 90 - 50 = 60 + ms_tanf_countable_earned_income: 60 + +- name: Case 4, two earners each get the $90 deduction. + period: 2026-01 + input: + people: + parent1: + age: 30 + employment_income_before_lsr: 6_000 + parent2: + age: 32 + employment_income_before_lsr: 3_600 + child: + age: 5 + spm_units: + spm_unit: + members: [parent1, parent2, child] + childcare_expenses: 1_200 + households: + household: + members: [parent1, parent2, child] + state_code: MS + output: + # (500 - 90) + (300 - 90) - 1_200 / 12 = 410 + 210 - 100 = 520 + ms_tanf_countable_earned_income: 520 + +- name: Case 5, earnings below $90 are fully deducted. + period: 2026-01 + input: + people: + parent: + age: 30 + employment_income_before_lsr: 720 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: MS + output: + # max(60 - 90, 0) = 0 + ms_tanf_countable_earned_income: 0 + +- name: Case 6, dependent care above earnings does not reduce unearned income. + period: 2026-01 + input: + people: + parent: + age: 30 + employment_income_before_lsr: 2_400 + alimony_income: 600 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + childcare_expenses: 3_600 + households: + household: + members: [parent, child] + state_code: MS + output: + # max(200 - 90 - 300, 0) = 0 + ms_tanf_countable_earned_income: 0 + # 0 earned + 600 / 12 unearned + ms_tanf_countable_income: 50 + +- name: Case 7, the $90 deduction is floored for each earner, not for the unit. + period: 2026-01 + input: + people: + parent1: + age: 30 + employment_income_before_lsr: 720 + parent2: + age: 32 + employment_income_before_lsr: 3_600 + child: + age: 5 + spm_units: + spm_unit: + members: [parent1, parent2, child] + households: + household: + members: [parent1, parent2, child] + state_code: MS + output: + # max(60 - 90, 0) + (300 - 90) = 0 + 210 = 210 + # (a floor on the pooled amount would give 360 - 180 = 180) + ms_tanf_countable_earned_income: 210 + +- name: Case 8, care costs for an incapacitated adult are deducted. + period: 2026-01 + input: + people: + parent: + age: 30 + employment_income_before_lsr: 6_000 + spouse: + age: 32 + care_expenses: 1_200 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, spouse, child] + households: + household: + members: [parent, spouse, child] + state_code: MS + output: + # (500 - 90) - 1_200 / 12 = 410 - 100 = 310 + ms_tanf_countable_earned_income: 310 diff --git a/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf.py b/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf.py index 923f3ed4ae2..c91ded8a9ef 100644 --- a/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf.py +++ b/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf.py @@ -11,10 +11,24 @@ class ms_tanf(Variable): reference = ( "https://www.mdhs.ms.gov/wp-content/uploads/2018/02/MDHS_TANF-Eligibility-Flyer.pdf", "https://www.law.cornell.edu/regulations/mississippi/Miss-Code-tit-18-pt-19", + # PDF pages 459, 888 + "https://www.mdhs.ms.gov/wp-content/uploads/2019/07/TANF-Manual-Revised_7.19.pdf#page=459", + # PDF pages 459, 970 + "https://www.sos.ms.gov/adminsearch/ACCode/00000330c.pdf#page=459", ) def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ms.dhs.tanf maximum_benefit = spm_unit("ms_tanf_maximum_benefit", period) countable_income = spm_unit("ms_tanf_countable_income", period) + # This pays the maximum benefit less countable income. Title 18, + # Part 13, Chapter 6 (Computing Benefit) and Chapter 15, Table II + # pay 60% of the deficit (need standard less net income), up to the + # maximum benefit. PolicyEngine/policyengine-us#10269 tracks that + # change. benefit = max_(maximum_benefit - countable_income, 0) - return min_(benefit, maximum_benefit) + benefit = min_(benefit, maximum_benefit) + # MDHS TANF Policy Manual, Volume III, Chapter 6, Minimum Benefit, + # and Chapter 15, Table II: no benefit is issued when the monthly + # benefit is less than $10. + return where(benefit >= p.minimum_payment, benefit, 0) diff --git a/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf_countable_earned_income.py b/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf_countable_earned_income.py new file mode 100644 index 00000000000..e044b39dc0e --- /dev/null +++ b/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf_countable_earned_income.py @@ -0,0 +1,33 @@ +from policyengine_us.model_api import * + + +class ms_tanf_countable_earned_income(Variable): + value_type = float + entity = SPMUnit + label = "Mississippi TANF countable earned income" + unit = USD + definition_period = MONTH + defined_for = StateCode.MS + reference = ( + "https://www.mdhs.ms.gov/wp-content/uploads/2019/07/TANF-Manual-Revised_7.19.pdf#page=470", + "https://www.sos.ms.gov/adminsearch/ACCode/00000330c.pdf#page=469", + ) + + def formula(spm_unit, period, parameters): + # MDHS TANF Policy Manual, Volume III, Chapter 6, Budgeting Net + # Monthly Earned Income: from the monthly earned income of each + # individual, deduct (a) a standard $90 for work expenses and then + # (b) the actual cost of care for each dependent child or + # incapacitated adult in the budget. + p = parameters(period).gov.states.ms.dhs.tanf.income.deductions + person = spm_unit.members + gross_earned = person("tanf_gross_earned_income", period) + earned_after_work_expense = spm_unit.sum(max_(gross_earned - p.work_expense, 0)) + # The manual deducts dependent care from the earnings of the + # individual who pays it. PolicyEngine does not record which earner + # pays, so the unit's care costs come off the unit's earnings after + # the per-earner $90. + childcare_expenses = spm_unit("childcare_expenses", period) + adult_care_expenses = add(spm_unit, period, ["care_expenses"]) + dependent_care = childcare_expenses + adult_care_expenses + return max_(earned_after_work_expense - dependent_care, 0) diff --git a/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf_countable_income.py b/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf_countable_income.py index b5eed6bf585..434f458c7a0 100644 --- a/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf_countable_income.py +++ b/policyengine_us/variables/gov/states/ms/dhs/tanf/ms_tanf_countable_income.py @@ -11,9 +11,11 @@ class ms_tanf_countable_income(Variable): reference = ( "https://www.mdhs.ms.gov/wp-content/uploads/2018/02/MDHS_TANF-Eligibility-Flyer.pdf", "https://www.law.cornell.edu/regulations/mississippi/Miss-Code-tit-18-pt-19", + "https://www.sos.ms.gov/adminsearch/ACCode/00000330c.pdf#page=469", ) # NOTE: Mississippi has 6-month and 3-month total earned income disregards # that cannot be tracked in PolicyEngine. This simplified implementation - # uses gross income without those time-limited disregards. + # does not apply those time-limited disregards. It also does not apply + # the special student disregard (PolicyEngine/policyengine-us#10490). - adds = ["tanf_gross_earned_income", "tanf_gross_unearned_income"] + adds = ["ms_tanf_countable_earned_income", "tanf_gross_unearned_income"]