From 48cfb5368723ef8a6ea6dc4439f4d5b08010d2cb Mon Sep 17 00:00:00 2001 From: Ziming Date: Sun, 4 Jan 2026 21:26:38 -0500 Subject: [PATCH 1/5] Initial commit for Louisiana TANF implementation Starting implementation of Louisiana TANF (FITAP) program. Documentation and parallel development will follow. From 5bff5a64a7709deecde57778778d58716f6a36a8 Mon Sep 17 00:00:00 2001 From: Ziming Date: Sun, 4 Jan 2026 22:07:46 -0500 Subject: [PATCH 2/5] Add Louisiana TANF (FITAP) program implementation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implement Louisiana Family Independence Temporary Assistance Program (FITAP): - Benefit calculation with flat grant amounts by family size - Earned income deduction (standard and time-limited) - Income eligibility determination - Integration and unit tests 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- changelog_entry.yaml | 4 + .../states/la/dcfs/tanf/benefit/minimum.yaml | 12 + .../la/dcfs/tanf/flat_grant/amount.yaml | 44 ++ .../dcfs/tanf/income/deductions/standard.yaml | 12 + .../tanf/income/deductions/time_limited.yaml | 14 + .../gov/states/la/dcfs/tanf/integration.yaml | 273 +++++++++++ .../gov/states/la/dcfs/tanf/la_tanf.yaml | 422 ++++++++++++++++++ .../tanf/la_tanf_countable_earned_income.yaml | 256 +++++++++++ .../dcfs/tanf/la_tanf_countable_income.yaml | 56 +++ .../la/dcfs/tanf/la_tanf_flat_grant.yaml | 377 ++++++++++++++++ .../la/dcfs/tanf/la_tanf_income_eligible.yaml | 192 ++++++++ .../gov/states/la/dcfs/tanf/la_tanf.py | 22 + .../tanf/la_tanf_countable_earned_income.py | 16 + .../la/dcfs/tanf/la_tanf_countable_income.py | 16 + .../tanf/la_tanf_earned_income_deduction.py | 27 ++ .../states/la/dcfs/tanf/la_tanf_eligible.py | 27 ++ .../states/la/dcfs/tanf/la_tanf_flat_grant.py | 20 + .../la/dcfs/tanf/la_tanf_income_eligible.py | 16 + sources/working_references.md | 313 +++++++++++++ 19 files changed, 2119 insertions(+) create mode 100644 policyengine_us/parameters/gov/states/la/dcfs/tanf/benefit/minimum.yaml create mode 100644 policyengine_us/parameters/gov/states/la/dcfs/tanf/flat_grant/amount.yaml create mode 100644 policyengine_us/parameters/gov/states/la/dcfs/tanf/income/deductions/standard.yaml create mode 100644 policyengine_us/parameters/gov/states/la/dcfs/tanf/income/deductions/time_limited.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/integration.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_countable_earned_income.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_countable_income.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_flat_grant.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_income_eligible.yaml create mode 100644 policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf.py create mode 100644 policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_countable_earned_income.py create mode 100644 policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_countable_income.py create mode 100644 policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_earned_income_deduction.py create mode 100644 policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_eligible.py create mode 100644 policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_flat_grant.py create mode 100644 policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_income_eligible.py create mode 100644 sources/working_references.md diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb2d..dda87f82295 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,4 @@ +- bump: minor + changes: + added: + - Louisiana Temporary Assistance for Needy Families (TANF) program, known as FITAP (Family Independence Temporary Assistance Program). diff --git a/policyengine_us/parameters/gov/states/la/dcfs/tanf/benefit/minimum.yaml b/policyengine_us/parameters/gov/states/la/dcfs/tanf/benefit/minimum.yaml new file mode 100644 index 00000000000..e16a07fcee0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/dcfs/tanf/benefit/minimum.yaml @@ -0,0 +1,12 @@ +description: Louisiana provides this amount as the minimum benefit under the Family Independence Temporary Assistance Program. + +values: + 2000-07-01: 10 + +metadata: + unit: currency-USD + period: month + label: Louisiana TANF minimum benefit + reference: + - title: Louisiana Administrative Code Title 67, Part III, Section 1211 - Minimum Payments + href: https://www.doa.la.gov/media/tp3lmkyg/67.pdf diff --git a/policyengine_us/parameters/gov/states/la/dcfs/tanf/flat_grant/amount.yaml b/policyengine_us/parameters/gov/states/la/dcfs/tanf/flat_grant/amount.yaml new file mode 100644 index 00000000000..85038149a19 --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/dcfs/tanf/flat_grant/amount.yaml @@ -0,0 +1,44 @@ +description: Louisiana provides this amount as the flat grant under the Family Independence Temporary Assistance Program. + +metadata: + unit: currency-USD + period: month + breakdown: + - range(0, 15) + label: Louisiana TANF flat grant amount + reference: + - title: Louisiana Department of Health FITAP Page + href: https://ldh.la.gov/page/fitap + - title: Louisiana DCFS TANF Benefits Increase Announcement + href: https://www.dcfs.louisiana.gov/news/louisiana-to-increase-tanf-cash-assistance-benefits-beginning-january-2022 + +1: + 2000-07-01: 122 + 2022-01-01: 244 +2: + 2000-07-01: 188 + 2022-01-01: 376 +3: + 2000-07-01: 240 + 2022-01-01: 484 +4: + 2000-07-01: 284 + 2022-01-01: 568 +5: + 2000-07-01: 327 + 2022-01-01: 654 +6: + 2000-07-01: 366 + 2022-01-01: 732 +7: + 2000-07-01: 402 + 2022-01-01: 804 +8: + 2000-07-01: 441 + 2022-01-01: 882 +9: + 2000-07-01: 477 + 2022-01-01: 954 +10: + 2000-07-01: 512 + 2022-01-01: 954 diff --git a/policyengine_us/parameters/gov/states/la/dcfs/tanf/income/deductions/standard.yaml b/policyengine_us/parameters/gov/states/la/dcfs/tanf/income/deductions/standard.yaml new file mode 100644 index 00000000000..cd3340ae319 --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/dcfs/tanf/income/deductions/standard.yaml @@ -0,0 +1,12 @@ +description: Louisiana deducts this amount from gross earned income for each employed member under the Family Independence Temporary Assistance Program. + +values: + 2000-07-01: 120 + +metadata: + unit: currency-USD + period: month + label: Louisiana TANF standard earned income deduction + reference: + - title: Louisiana Department of Health FITAP Page + href: https://ldh.la.gov/page/fitap diff --git a/policyengine_us/parameters/gov/states/la/dcfs/tanf/income/deductions/time_limited.yaml b/policyengine_us/parameters/gov/states/la/dcfs/tanf/income/deductions/time_limited.yaml new file mode 100644 index 00000000000..c781f50a12a --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/dcfs/tanf/income/deductions/time_limited.yaml @@ -0,0 +1,14 @@ +description: Louisiana deducts this amount from gross earned income for each employed member for the first six months of employment under the Family Independence Temporary Assistance Program. +# NOTE: PolicyEngine applies this deduction without tracking employment months. +# In reality, this deduction is only available for the first 6 consecutive months of employment. + +values: + 2000-07-01: 900 + +metadata: + unit: currency-USD + period: month + label: Louisiana TANF time-limited earned income deduction + reference: + - title: Louisiana Department of Health FITAP Page + href: https://ldh.la.gov/page/fitap diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/integration.yaml new file mode 100644 index 00000000000..ac5c8955607 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/integration.yaml @@ -0,0 +1,273 @@ +# Louisiana TANF (FITAP) Integration Tests +# Full pipeline testing from gross income to final benefit +# Reference: https://ldh.la.gov/page/fitap +# Reference: https://www.legis.la.gov/legis/Law.aspx?d=100599 +# +# Key Policy Rules: +# - Income limit = flat grant amount for household size +# - Benefit = Flat Grant - Countable Income +# - Earned income deductions: $120 standard + $900 time-limited per employed member +# - Unearned income counted dollar-for-dollar (no disregards) +# - Minimum benefit: $10 (benefits below this are not issued) +# - No resource test (all resources excluded) + +- name: Scenario 1 - Single parent with one child, no income, full benefit. + # Family of 2, no income, receives full flat grant + period: 2024-01 + input: + people: + person1: + age: 28 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + # Family size: 2 + # Gross earned income: $0 + # Countable earned income: $0 + # Countable income: $0 + # Flat grant (family of 2): $376 + # Income limit: $376 + # Benefit: $376 - $0 = $376 + la_tanf_flat_grant: 376 + la_tanf_countable_earned_income: [0, 0] + la_tanf_countable_income: 0 + la_tanf_income_eligible: true + la_tanf_eligible: true + la_tanf: 376 + +- name: Scenario 2 - Single parent with one child, $1,200/month earnings, partial benefit. + # Earned income with full deductions applied + period: 2024-01 + input: + people: + person1: + age: 32 + employment_income_before_lsr: 14_400 # $1,200/month + person2: + age: 8 + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + # Family size: 2 + # Monthly gross earned: $1,200 + # Deductions: $120 + $900 = $1,020 per employed member + # Countable earned: max($1,200 - $1,020, 0) = $180 + # Countable income: $180 (no unearned) + # Flat grant (family of 2): $376 + # Income limit: $376 + # $180 <= $376 = income eligible + # Benefit: $376 - $180 = $196 + la_tanf_flat_grant: 376 + la_tanf_countable_earned_income: [180, 0] + la_tanf_countable_income: 180 + la_tanf_income_eligible: true + la_tanf_eligible: true + la_tanf: 196 + +- name: Scenario 3 - Single parent with two children, earnings under deduction threshold. + # Earned income fully offset by deductions + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 10_800 # $900/month + person2: + age: 10 + person3: + age: 6 + spm_units: + spm_unit: + members: [person1, person2, person3] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: LA + output: + # Family size: 3 + # Monthly gross earned: $900 + # Deductions: $120 + $900 = $1,020 + # Countable earned: max($900 - $1,020, 0) = $0 + # Countable income: $0 + # Flat grant (family of 3): $484 + # Benefit: $484 - $0 = $484 + la_tanf_flat_grant: 484 + la_tanf_countable_earned_income: [0, 0, 0] + la_tanf_countable_income: 0 + la_tanf_income_eligible: true + la_tanf_eligible: true + la_tanf: 484 + +- name: Scenario 4 - Family with income above limit, ineligible. + # Countable income exceeds flat grant amount + period: 2024-01 + input: + people: + person1: + age: 35 + employment_income_before_lsr: 21_600 # $1,800/month + person2: + age: 7 + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + # Family size: 2 + # Monthly gross earned: $1,800 + # Deductions: $120 + $900 = $1,020 + # Countable earned: $1,800 - $1,020 = $780 + # Countable income: $780 + # Flat grant / Income limit (family of 2): $376 + # $780 > $376 = income ineligible + la_tanf_flat_grant: 376 + la_tanf_countable_earned_income: [780, 0] + la_tanf_countable_income: 780 + la_tanf_income_eligible: false + la_tanf_eligible: false + la_tanf: 0 + +- name: Scenario 5 - Family with unearned income only (no deductions). + # Unearned income has no deductions in LA TANF + period: 2024-01 + input: + people: + person1: + age: 40 + social_security: 2_400 # $200/month + person2: + age: 12 + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + # Family size: 2 + # Monthly unearned income: $200 (counted in full) + # Countable earned: $0 + # Countable income: $200 + # Flat grant (family of 2): $376 + # $200 <= $376 = income eligible + # Benefit: $376 - $200 = $176 + la_tanf_flat_grant: 376 + la_tanf_countable_earned_income: [0, 0] + la_tanf_countable_income: 200 + la_tanf_income_eligible: true + la_tanf_eligible: true + la_tanf: 176 + +- name: Scenario 6 - Two earners, combined income with deductions. + # Both employed members get deductions + period: 2024-01 + input: + people: + person1: + age: 35 + employment_income_before_lsr: 15_600 # $1,300/month + person2: + age: 33 + employment_income_before_lsr: 12_000 # $1,000/month + person3: + age: 10 + spm_units: + spm_unit: + members: [person1, person2, person3] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: LA + output: + # Family size: 3 + # Person 1 monthly gross: $1,300 + # Person 1 deductions: $1,020 + # Person 1 countable earned: max($1,300 - $1,020, 0) = $280 + # Person 2 monthly gross: $1,000 + # Person 2 deductions: $1,020 + # Person 2 countable earned: max($1,000 - $1,020, 0) = $0 + # Total countable earned: $280 + # Countable income: $280 + # Flat grant (family of 3): $484 + # $280 <= $484 = income eligible + # Benefit: $484 - $280 = $204 + la_tanf_flat_grant: 484 + la_tanf_countable_earned_income: [280, 0, 0] + la_tanf_countable_income: 280 + la_tanf_income_eligible: true + la_tanf_eligible: true + la_tanf: 204 + +- name: Scenario 7 - Mixed income (earned and unearned), eligible. + # Combination of earned income with deductions and unearned without + period: 2024-01 + input: + people: + person1: + age: 38 + employment_income_before_lsr: 13_200 # $1,100/month + child_support_received: 1_200 # $100/month + person2: + age: 9 + person3: + age: 5 + spm_units: + spm_unit: + members: [person1, person2, person3] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: LA + output: + # Family size: 3 + # Monthly gross earned: $1,100 + # Earned income deductions: $1,020 + # Countable earned: max($1,100 - $1,020, 0) = $80 + # Monthly unearned: $100 (child support, no disregard) + # Countable income: $80 + $100 = $180 + # Flat grant (family of 3): $484 + # $180 <= $484 = income eligible + # Benefit: $484 - $180 = $304 + la_tanf_flat_grant: 484 + la_tanf_countable_earned_income: [80, 0, 0] + la_tanf_countable_income: 180 + la_tanf_income_eligible: true + la_tanf_eligible: true + la_tanf: 304 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf.yaml new file mode 100644 index 00000000000..e2556130d9d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf.yaml @@ -0,0 +1,422 @@ +# Louisiana TANF Benefit Unit Tests +# Tests final benefit calculation: Benefit = Flat Grant - Countable Income +# Minimum benefit: $10 (benefits below this are not issued) +# Reference: https://ldh.la.gov/page/fitap + +- name: Case 1, eligible with no income gets full benefit. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + la_tanf_eligible: true + la_tanf_flat_grant: 376 + la_tanf_countable_income: 0 + households: + household: + members: [person1, person2] + state_code: LA + output: + la_tanf: 376 + +- name: Case 2, eligible with partial income gets partial benefit. + # Flat grant: $376 + # Countable income: $200 + # Benefit: $376 - $200 = $176 + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + la_tanf_eligible: true + la_tanf_flat_grant: 376 + la_tanf_countable_income: 200 + households: + household: + members: [person1, person2] + state_code: LA + output: + la_tanf: 176 + +- name: Case 3, eligible with income equal to flat grant gets zero. + # Flat grant: $376 + # Countable income: $376 + # Benefit: $376 - $376 = $0 + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + la_tanf_eligible: true + la_tanf_flat_grant: 376 + la_tanf_countable_income: 376 + households: + household: + members: [person1, person2] + state_code: LA + output: + la_tanf: 0 + +- name: Case 4, ineligible household gets zero benefit. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + la_tanf_eligible: false + la_tanf_flat_grant: 376 + la_tanf_countable_income: 0 + households: + household: + members: [person1, person2] + state_code: LA + output: + la_tanf: 0 + +- name: Case 5, benefit exactly at minimum threshold. + # Flat grant: $376 + # Countable income: $366 + # Benefit: $376 - $366 = $10 (at minimum) + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + la_tanf_eligible: true + la_tanf_flat_grant: 376 + la_tanf_countable_income: 366 + households: + household: + members: [person1, person2] + state_code: LA + output: + la_tanf: 10 + +- name: Case 6, benefit below minimum is not issued. + # Flat grant: $376 + # Countable income: $370 + # Calculated benefit: $376 - $370 = $6 + # $6 < $10 minimum, so no payment issued + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + la_tanf_eligible: true + la_tanf_flat_grant: 376 + la_tanf_countable_income: 370 + households: + household: + members: [person1, person2] + state_code: LA + output: + la_tanf: 0 + +- name: Case 7, larger family with higher flat grant. + # Flat grant (family of 4): $568 + # Countable income: $250 + # Benefit: $568 - $250 = $318 + period: 2024-01 + input: + people: + person1: + age: 35 + person2: + age: 33 + person3: + age: 10 + person4: + age: 7 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + la_tanf_eligible: true + la_tanf_flat_grant: 568 + la_tanf_countable_income: 250 + households: + household: + members: [person1, person2, person3, person4] + state_code: LA + output: + la_tanf: 318 + +# ============================================================================= +# EDGE CASES +# ============================================================================= + +- name: Edge case, benefit just at minimum threshold of ten dollars. + # Flat grant: $244 (size 1) + # Countable income: $234 + # Calculated benefit: $244 - $234 = $10 (exactly at minimum) + # $10 >= $10 minimum, so payment issued + period: 2024-01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + la_tanf_eligible: true + la_tanf_flat_grant: 244 + la_tanf_countable_income: 234 + households: + household: + members: [person1] + state_code: LA + output: + la_tanf: 10 + +- name: Edge case, benefit at nine dollars is below minimum. + # Flat grant: $244 (size 1) + # Countable income: $235 + # Calculated benefit: $244 - $235 = $9 + # $9 < $10 minimum, so no payment issued + period: 2024-01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + la_tanf_eligible: true + la_tanf_flat_grant: 244 + la_tanf_countable_income: 235 + households: + household: + members: [person1] + state_code: LA + output: + la_tanf: 0 + +- name: Edge case, benefit at eleven dollars just above minimum. + # Flat grant: $244 (size 1) + # Countable income: $233 + # Calculated benefit: $244 - $233 = $11 + # $11 > $10 minimum, so full $11 payment issued + period: 2024-01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + la_tanf_eligible: true + la_tanf_flat_grant: 244 + la_tanf_countable_income: 233 + households: + household: + members: [person1] + state_code: LA + output: + la_tanf: 11 + +- name: Edge case, benefit at one dollar is below minimum. + # Flat grant: $376 + # Countable income: $375 + # Calculated benefit: $376 - $375 = $1 + # $1 < $10 minimum, so no payment issued + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + la_tanf_eligible: true + la_tanf_flat_grant: 376 + la_tanf_countable_income: 375 + households: + household: + members: [person1, person2] + state_code: LA + output: + la_tanf: 0 + +- name: Edge case, very large family size 9 with no income gets full benefit. + # Flat grant (family of 9): $954 + # Countable income: $0 + # Benefit: $954 - $0 = $954 (maximum possible for size 9) + period: 2024-01 + input: + people: + person1: + age: 45 + person2: + age: 43 + person3: + age: 17 + person4: + age: 15 + person5: + age: 13 + person6: + age: 11 + person7: + age: 9 + person8: + age: 7 + person9: + age: 5 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9] + la_tanf_eligible: true + la_tanf_flat_grant: 954 + la_tanf_countable_income: 0 + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9] + state_code: LA + output: + la_tanf: 954 + +- name: Edge case, very large family size 10 with no income at cap. + # Flat grant (family of 10+): $954 (capped at size 10) + # Countable income: $0 + # Benefit: $954 - $0 = $954 (maximum possible) + period: 2024-01 + input: + people: + person1: + age: 45 + person2: + age: 43 + person3: + age: 17 + person4: + age: 15 + person5: + age: 13 + person6: + age: 11 + person7: + age: 9 + person8: + age: 7 + person9: + age: 5 + person10: + age: 3 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10] + la_tanf_eligible: true + la_tanf_flat_grant: 954 + la_tanf_countable_income: 0 + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10] + state_code: LA + output: + la_tanf: 954 + +- name: Edge case, income exceeds flat grant resulting in zero benefit. + # Flat grant: $376 + # Countable income: $400 (exceeds flat grant) + # Calculated benefit: max($376 - $400, 0) = max(-$24, 0) = $0 + # Note: This household would be income ineligible anyway + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + la_tanf_eligible: true + la_tanf_flat_grant: 376 + la_tanf_countable_income: 400 + households: + household: + members: [person1, person2] + state_code: LA + output: + la_tanf: 0 + +- name: Edge case, very high income far exceeding flat grant. + # Flat grant: $568 (family of 4) + # Countable income: $2,000 (very high, exceeds flat grant by $1,432) + # Calculated benefit: max($568 - $2,000, 0) = $0 + period: 2024-01 + input: + people: + person1: + age: 35 + person2: + age: 33 + person3: + age: 10 + person4: + age: 7 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + la_tanf_eligible: true + la_tanf_flat_grant: 568 + la_tanf_countable_income: 2_000 + households: + household: + members: [person1, person2, person3, person4] + state_code: LA + output: + la_tanf: 0 + +- name: Edge case, single person full benefit no income. + # Flat grant (family of 1): $244 + # Countable income: $0 + # Benefit: $244 - $0 = $244 + period: 2024-01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + la_tanf_eligible: true + la_tanf_flat_grant: 244 + la_tanf_countable_income: 0 + households: + household: + members: [person1] + state_code: LA + output: + la_tanf: 244 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_countable_earned_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_countable_earned_income.yaml new file mode 100644 index 00000000000..b6e557a437f --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_countable_earned_income.yaml @@ -0,0 +1,256 @@ +# Louisiana TANF Countable Earned Income Unit Tests +# Tests earned income after deductions for LA FITAP program +# Deductions: $120 standard + $900 time-limited per employed member per month +# Reference: https://ldh.la.gov/page/fitap +# NOTE: Time-limited deduction normally only available for 6 months of employment, +# but PolicyEngine cannot track employment duration, so it's applied always. + +- name: Case 1, no earned income results in zero countable earned income. + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 0 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: LA + output: + la_tanf_countable_earned_income: 0 + +- name: Case 2, single earner with deductions exceeding income. + # Monthly gross: $800 + # Deductions: $120 + $900 = $1,020 + # Countable: max($800 - $1,020, 0) = $0 + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 9_600 # $800/month + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: LA + output: + la_tanf_countable_earned_income: 0 + +- name: Case 3, single earner with income exceeding deductions. + # Monthly gross: $1,500 + # Deductions: $120 + $900 = $1,020 + # Countable: $1,500 - $1,020 = $480 + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 18_000 # $1,500/month + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: LA + output: + la_tanf_countable_earned_income: 480 + +- name: Case 4, two earners with income exceeding deductions. + # Person 1 monthly gross: $1,200 + # Person 1 deductions: $120 + $900 = $1,020 + # Person 1 countable: max($1,200 - $1,020, 0) = $180 + # Person 2 monthly gross: $800 + # Person 2 deductions: $120 + $900 = $1,020 + # Person 2 countable: max($800 - $1,020, 0) = $0 + # Total countable earned: $180 + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 14_400 # $1,200/month + person2: + employment_income_before_lsr: 9_600 # $800/month + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_tanf_countable_earned_income: [180, 0] + +- name: Case 5, earner at exact deduction threshold. + # Monthly gross: $1,020 + # Deductions: $120 + $900 = $1,020 + # Countable: $1,020 - $1,020 = $0 + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 12_240 # $1,020/month + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: LA + output: + la_tanf_countable_earned_income: 0 + +- name: Case 6, self-employment income treated same as wages. + # Monthly gross: $1,500 (self-employment) + # Deductions: $120 + $900 = $1,020 + # Countable: $1,500 - $1,020 = $480 + period: 2024-01 + input: + people: + person1: + self_employment_income_before_lsr: 18_000 # $1,500/month + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: LA + output: + la_tanf_countable_earned_income: 480 + +# ============================================================================= +# EDGE CASES +# ============================================================================= + +- name: Edge case, zero income explicitly results in zero deduction and countable. + # Verifies that zero gross earned income produces zero countable earned income. + # Deductions should not apply when there is no earned income. + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 0 + self_employment_income_before_lsr: 0 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: LA + output: + la_tanf_countable_earned_income: 0 + +- name: Edge case, income exactly one dollar over deduction threshold. + # Monthly gross: $1,021 (exactly $1 over $1,020 deduction) + # Deductions: $120 + $900 = $1,020 + # Countable: $1,021 - $1,020 = $1 + # Tests boundary condition at deduction threshold + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 12_252 # $1,021/month + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: LA + output: + la_tanf_countable_earned_income: 1 + +- name: Edge case, very high income far exceeds deduction. + # Monthly gross: $10,000 (extreme income scenario) + # Deductions: $120 + $900 = $1,020 + # Countable: $10,000 - $1,020 = $8,980 + # Tests that high income is handled correctly + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 120_000 # $10,000/month + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: LA + output: + la_tanf_countable_earned_income: 8_980 + +- name: Edge case, multiple earners where one has zero income. + # Person 1 monthly gross: $1,500 (employed) + # Person 1 deductions: $120 + $900 = $1,020 + # Person 1 countable: $1,500 - $1,020 = $480 + # Person 2 monthly gross: $0 (not employed, no deduction) + # Person 2 countable: $0 + # Total countable earned: $480 + # Verifies deductions only apply to employed members + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 18_000 # $1,500/month + person2: + employment_income_before_lsr: 0 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_tanf_countable_earned_income: [480, 0] + +- name: Edge case, two high earners both exceed deduction threshold. + # Person 1 monthly gross: $2,000 + # Person 1 deductions: $120 + $900 = $1,020 + # Person 1 countable: $2,000 - $1,020 = $980 + # Person 2 monthly gross: $1,500 + # Person 2 deductions: $120 + $900 = $1,020 + # Person 2 countable: $1,500 - $1,020 = $480 + # Total countable earned: $980 + $480 = $1,460 + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 24_000 # $2,000/month + person2: + employment_income_before_lsr: 18_000 # $1,500/month + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_tanf_countable_earned_income: [980, 480] + +- name: Edge case, combined employment and self-employment same person. + # Person 1 monthly gross: $900 employment + $600 self-employment = $1,500 total + # Deductions: $120 + $900 = $1,020 (single set applied to total earned) + # Countable: $1,500 - $1,020 = $480 + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 10_800 # $900/month + self_employment_income_before_lsr: 7_200 # $600/month + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: LA + output: + la_tanf_countable_earned_income: 480 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_countable_income.yaml new file mode 100644 index 00000000000..fcfb62898a8 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_countable_income.yaml @@ -0,0 +1,56 @@ +# Louisiana TANF Countable Income Unit Tests +# Tests total countable income = countable earned + unearned income +# Unearned income counted dollar-for-dollar (no disregards) +# Reference: https://ldh.la.gov/page/fitap + +- name: Case 1, no income results in zero countable income. + period: 2024-01 + input: + state_code: LA + la_tanf_countable_earned_income: 0 + tanf_gross_unearned_income: 0 + output: + la_tanf_countable_income: 0 + +- name: Case 2, only countable earned income. + period: 2024-01 + input: + state_code: LA + la_tanf_countable_earned_income: 300 + tanf_gross_unearned_income: 0 + output: + la_tanf_countable_income: 300 + +- name: Case 3, only unearned income. + # Unearned income counted in full + period: 2024-01 + input: + state_code: LA + la_tanf_countable_earned_income: 0 + tanf_gross_unearned_income: 200 + output: + la_tanf_countable_income: 200 + +- name: Case 4, both earned and unearned income. + # Countable earned: $300 + # Unearned: $150 + # Total countable: $300 + $150 = $450 + period: 2024-01 + input: + state_code: LA + la_tanf_countable_earned_income: 300 + tanf_gross_unearned_income: 150 + output: + la_tanf_countable_income: 450 + +- name: Case 5, larger combined income. + # Countable earned: $480 + # Unearned: $250 + # Total countable: $480 + $250 = $730 + period: 2024-01 + input: + state_code: LA + la_tanf_countable_earned_income: 480 + tanf_gross_unearned_income: 250 + output: + la_tanf_countable_income: 730 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_flat_grant.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_flat_grant.yaml new file mode 100644 index 00000000000..68d855d6a2b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_flat_grant.yaml @@ -0,0 +1,377 @@ +# Louisiana TANF Flat Grant Unit Tests +# Tests flat grant amounts by household size (effective January 2022) +# Reference: https://ldh.la.gov/page/fitap +# Reference: https://www.dcfs.louisiana.gov/news/louisiana-to-increase-tanf-cash-assistance-benefits-beginning-january-2022 + +- name: Case 1, household size 1 flat grant. + period: 2024-01 + input: + people: + person1: + age: 25 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: LA + output: + la_tanf_flat_grant: 244 + +- name: Case 2, household size 2 flat grant. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_tanf_flat_grant: 376 + +- name: Case 3, household size 3 flat grant. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 8 + person3: + age: 6 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: LA + output: + la_tanf_flat_grant: 484 + +- name: Case 4, household size 4 flat grant. + period: 2024-01 + input: + people: + person1: + age: 35 + person2: + age: 33 + person3: + age: 10 + person4: + age: 7 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: LA + output: + la_tanf_flat_grant: 568 + +- name: Case 5, household size 5 flat grant. + period: 2024-01 + input: + people: + person1: + age: 40 + person2: + age: 38 + person3: + age: 15 + person4: + age: 12 + person5: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: LA + output: + la_tanf_flat_grant: 654 + +- name: Case 6, household size 6 flat grant. + period: 2024-01 + input: + people: + person1: + age: 40 + person2: + age: 38 + person3: + age: 16 + person4: + age: 14 + person5: + age: 10 + person6: + age: 6 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6] + households: + household: + members: [person1, person2, person3, person4, person5, person6] + state_code: LA + output: + la_tanf_flat_grant: 732 + +- name: Case 7, household size 9 flat grant (max in table). + period: 2024-01 + input: + people: + person1: + age: 45 + person2: + age: 43 + person3: + age: 17 + person4: + age: 15 + person5: + age: 13 + person6: + age: 11 + person7: + age: 9 + person8: + age: 7 + person9: + age: 5 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9] + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9] + state_code: LA + output: + la_tanf_flat_grant: 954 + +- name: Case 8, pre-2022 flat grant (historical). + # Before January 2022, benefits were half current amounts + period: 2021-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + la_tanf_flat_grant: 188 + +# ============================================================================= +# EDGE CASES +# ============================================================================= + +- name: Edge case, single person household minimum size. + # Tests that single-person household gets the minimum flat grant. + # Size 1 = $244 + period: 2024-01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: LA + output: + la_tanf_flat_grant: 244 + +- name: Edge case, household size 7 flat grant. + # Size 7 = $804 + period: 2024-01 + input: + people: + person1: + age: 40 + person2: + age: 38 + person3: + age: 16 + person4: + age: 14 + person5: + age: 12 + person6: + age: 10 + person7: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7] + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7] + state_code: LA + output: + la_tanf_flat_grant: 804 + +- name: Edge case, household size 8 flat grant. + # Size 8 = $882 + period: 2024-01 + input: + people: + person1: + age: 42 + person2: + age: 40 + person3: + age: 17 + person4: + age: 15 + person5: + age: 13 + person6: + age: 11 + person7: + age: 9 + person8: + age: 7 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8] + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8] + state_code: LA + output: + la_tanf_flat_grant: 882 + +- name: Edge case, household size 10 at cap. + # Size 10 = $954 (same as size 9, cap applies) + # This tests that size 10 returns the capped value + period: 2024-01 + input: + people: + person1: + age: 45 + person2: + age: 43 + person3: + age: 17 + person4: + age: 15 + person5: + age: 13 + person6: + age: 11 + person7: + age: 9 + person8: + age: 7 + person9: + age: 5 + person10: + age: 3 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10] + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10] + state_code: LA + output: + la_tanf_flat_grant: 954 + +- name: Edge case, household size 11 exceeds cap. + # Size 11 should cap at size 10 value = $954 + # Tests that sizes beyond 10 still receive the maximum flat grant + period: 2024-01 + input: + people: + person1: + age: 45 + person2: + age: 43 + person3: + age: 17 + person4: + age: 15 + person5: + age: 13 + person6: + age: 11 + person7: + age: 9 + person8: + age: 7 + person9: + age: 5 + person10: + age: 3 + person11: + age: 1 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11] + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11] + state_code: LA + output: + la_tanf_flat_grant: 954 + +- name: Edge case, very large household size 12 still caps at size 10. + # Size 12 should cap at size 10 value = $954 + # Tests extreme household sizes are handled correctly + period: 2024-01 + input: + people: + person1: + age: 48 + person2: + age: 46 + person3: + age: 17 + person4: + age: 16 + person5: + age: 15 + person6: + age: 14 + person7: + age: 12 + person8: + age: 10 + person9: + age: 8 + person10: + age: 6 + person11: + age: 4 + person12: + age: 2 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11, person12] + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11, person12] + state_code: LA + output: + la_tanf_flat_grant: 954 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_income_eligible.yaml new file mode 100644 index 00000000000..c1d4b340fd0 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_income_eligible.yaml @@ -0,0 +1,192 @@ +# Louisiana TANF Income Eligibility Unit Tests +# Income limit equals the flat grant amount for household size +# Reference: https://ldh.la.gov/page/fitap +# "Monthly countable income, both earned and unearned, cannot exceed +# the flat grant amount for the number of persons in the assistance unit." + +- name: Case 1, no income is income eligible. + period: 2024-01 + input: + state_code: LA + la_tanf_countable_income: 0 + la_tanf_flat_grant: 376 # Family of 2 + output: + la_tanf_income_eligible: true + +- name: Case 2, income below flat grant is eligible. + # Countable income: $200 + # Flat grant (family of 2): $376 + # $200 < $376 = eligible + period: 2024-01 + input: + state_code: LA + la_tanf_countable_income: 200 + la_tanf_flat_grant: 376 + output: + la_tanf_income_eligible: true + +- name: Case 3, income equal to flat grant is eligible. + # Countable income: $376 + # Flat grant (family of 2): $376 + # $376 <= $376 = eligible + period: 2024-01 + input: + state_code: LA + la_tanf_countable_income: 376 + la_tanf_flat_grant: 376 + output: + la_tanf_income_eligible: true + +- name: Case 4, income above flat grant is ineligible. + # Countable income: $400 + # Flat grant (family of 2): $376 + # $400 > $376 = ineligible + period: 2024-01 + input: + state_code: LA + la_tanf_countable_income: 400 + la_tanf_flat_grant: 376 + output: + la_tanf_income_eligible: false + +- name: Case 5, income just above flat grant is ineligible. + # Countable income: $377 + # Flat grant (family of 2): $376 + # $377 > $376 = ineligible + period: 2024-01 + input: + state_code: LA + la_tanf_countable_income: 377 + la_tanf_flat_grant: 376 + output: + la_tanf_income_eligible: false + +- name: Case 6, larger family higher income limit. + # Countable income: $450 + # Flat grant (family of 3): $484 + # $450 < $484 = eligible + period: 2024-01 + input: + state_code: LA + la_tanf_countable_income: 450 + la_tanf_flat_grant: 484 + output: + la_tanf_income_eligible: true + +# ============================================================================= +# EDGE CASES +# ============================================================================= + +- name: Edge case, income exactly one dollar below limit is eligible. + # Countable income: $375 + # Flat grant (family of 2): $376 + # $375 < $376 = eligible + # Tests boundary one dollar below threshold + period: 2024-01 + input: + state_code: LA + la_tanf_countable_income: 375 + la_tanf_flat_grant: 376 + output: + la_tanf_income_eligible: true + +- name: Edge case, income exactly one dollar above limit is ineligible. + # Countable income: $245 + # Flat grant (family of 1): $244 + # $245 > $244 = ineligible + # Tests boundary one dollar above threshold for smallest family size + period: 2024-01 + input: + state_code: LA + la_tanf_countable_income: 245 + la_tanf_flat_grant: 244 + output: + la_tanf_income_eligible: false + +- name: Edge case, income exactly at limit for single person household. + # Countable income: $244 + # Flat grant (family of 1): $244 + # $244 <= $244 = eligible + period: 2024-01 + input: + state_code: LA + la_tanf_countable_income: 244 + la_tanf_flat_grant: 244 + output: + la_tanf_income_eligible: true + +- name: Edge case, income exactly one dollar below limit for single person. + # Countable income: $243 + # Flat grant (family of 1): $244 + # $243 < $244 = eligible + period: 2024-01 + input: + state_code: LA + la_tanf_countable_income: 243 + la_tanf_flat_grant: 244 + output: + la_tanf_income_eligible: true + +- name: Edge case, very high income far above limit. + # Countable income: $2,000 + # Flat grant (family of 2): $376 + # $2,000 > $376 = ineligible (clearly exceeds limit) + period: 2024-01 + input: + state_code: LA + la_tanf_countable_income: 2_000 + la_tanf_flat_grant: 376 + output: + la_tanf_income_eligible: false + +- name: Edge case, maximum family size income limit. + # Countable income: $954 + # Flat grant (family of 9): $954 + # $954 <= $954 = eligible + # Tests at maximum flat grant amount + period: 2024-01 + input: + state_code: LA + la_tanf_countable_income: 954 + la_tanf_flat_grant: 954 + output: + la_tanf_income_eligible: true + +- name: Edge case, income one dollar above maximum family size limit. + # Countable income: $955 + # Flat grant (family of 9): $954 + # $955 > $954 = ineligible + # Tests just above maximum flat grant amount + period: 2024-01 + input: + state_code: LA + la_tanf_countable_income: 955 + la_tanf_flat_grant: 954 + output: + la_tanf_income_eligible: false + +- name: Edge case, income one dollar below maximum family size limit. + # Countable income: $953 + # Flat grant (family of 9): $954 + # $953 < $954 = eligible + # Tests just below maximum flat grant amount + period: 2024-01 + input: + state_code: LA + la_tanf_countable_income: 953 + la_tanf_flat_grant: 954 + output: + la_tanf_income_eligible: true + +- name: Edge case, fractional income just above limit. + # Countable income: $376.01 + # Flat grant (family of 2): $376 + # $376.01 > $376 = ineligible + # Tests fractional dollar precision + period: 2024-01 + input: + state_code: LA + la_tanf_countable_income: 376.01 + la_tanf_flat_grant: 376 + output: + la_tanf_income_eligible: false diff --git a/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf.py b/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf.py new file mode 100644 index 00000000000..3f9d778ffdf --- /dev/null +++ b/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class la_tanf(Variable): + value_type = float + entity = SPMUnit + label = "Louisiana TANF" + unit = USD + definition_period = MONTH + reference = "https://ldh.la.gov/page/fitap" + defined_for = "la_tanf_eligible" + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.la.dcfs.tanf.benefit + flat_grant = spm_unit("la_tanf_flat_grant", period) + countable_income = spm_unit("la_tanf_countable_income", period) + + # Benefit = flat grant minus countable income + benefit = max_(flat_grant - countable_income, 0) + + # Benefits below minimum are not issued + return where(benefit >= p.minimum, benefit, 0) diff --git a/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_countable_earned_income.py b/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_countable_earned_income.py new file mode 100644 index 00000000000..9d412bdca1c --- /dev/null +++ b/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_countable_earned_income.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + + +class la_tanf_countable_earned_income(Variable): + value_type = float + entity = Person + label = "Louisiana TANF countable earned income" + unit = USD + definition_period = MONTH + reference = "https://ldh.la.gov/page/fitap" + defined_for = StateCode.LA + + def formula(person, period, parameters): + gross_earned = person("tanf_gross_earned_income", period) + deduction = person("la_tanf_earned_income_deduction", period) + return max_(gross_earned - deduction, 0) diff --git a/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_countable_income.py b/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_countable_income.py new file mode 100644 index 00000000000..e21fa63c7ff --- /dev/null +++ b/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_countable_income.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + + +class la_tanf_countable_income(Variable): + value_type = float + entity = SPMUnit + label = "Louisiana TANF countable income" + unit = USD + definition_period = MONTH + reference = "https://ldh.la.gov/page/fitap" + defined_for = StateCode.LA + + adds = [ + "la_tanf_countable_earned_income", + "tanf_gross_unearned_income", + ] diff --git a/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_earned_income_deduction.py b/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_earned_income_deduction.py new file mode 100644 index 00000000000..00aadf2d409 --- /dev/null +++ b/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_earned_income_deduction.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +class la_tanf_earned_income_deduction(Variable): + value_type = float + entity = Person + label = "Louisiana TANF earned income deduction" + unit = USD + definition_period = MONTH + reference = "https://ldh.la.gov/page/fitap" + defined_for = StateCode.LA + + def formula(person, period, parameters): + p = parameters(period).gov.states.la.dcfs.tanf.income.deductions + gross_earned = person("tanf_gross_earned_income", period) + + # Per FITAP rules: deductions only apply to employed members + is_employed = gross_earned > 0 + + # NOTE: The $900 time-limited deduction is only available for + # the first 6 months of employment. PolicyEngine cannot track + # employment duration, so we apply it assuming qualification. + standard_deduction = p.standard + time_limited_deduction = p.time_limited + total_deduction = standard_deduction + time_limited_deduction + + return where(is_employed, total_deduction, 0) diff --git a/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_eligible.py b/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_eligible.py new file mode 100644 index 00000000000..29311108c36 --- /dev/null +++ b/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_eligible.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +class la_tanf_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Louisiana TANF eligible" + definition_period = MONTH + reference = "https://ldh.la.gov/page/fitap" + defined_for = StateCode.LA + + def formula(spm_unit, period, parameters): + # Use federal demographic eligibility + demographic_eligible = spm_unit("is_demographic_tanf_eligible", period) + + # Must have at least one U.S. citizen or qualified immigrant + immigration_eligible = ( + add(spm_unit, period, ["is_citizen_or_legal_immigrant"]) > 0 + ) + + # Income eligibility (countable income <= flat grant) + income_eligible = spm_unit("la_tanf_income_eligible", period) + + # NOTE: Louisiana excludes all resources from eligibility + # determination, so no resource test is needed. + + return demographic_eligible & immigration_eligible & income_eligible diff --git a/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_flat_grant.py b/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_flat_grant.py new file mode 100644 index 00000000000..2eec6e4f6c3 --- /dev/null +++ b/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_flat_grant.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class la_tanf_flat_grant(Variable): + value_type = float + entity = SPMUnit + label = "Louisiana TANF flat grant" + unit = USD + definition_period = MONTH + reference = ( + "https://ldh.la.gov/page/fitap", + "https://www.dcfs.louisiana.gov/news/louisiana-to-increase-tanf-cash-assistance-benefits-beginning-january-2022", + ) + defined_for = StateCode.LA + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.la.dcfs.tanf.flat_grant + size = spm_unit("spm_unit_size", period.this_year) + capped_size = min_(size, 10) + return p.amount[capped_size] diff --git a/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_income_eligible.py b/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_income_eligible.py new file mode 100644 index 00000000000..d06713cc1ba --- /dev/null +++ b/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_income_eligible.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + + +class la_tanf_income_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Louisiana TANF income eligible" + definition_period = MONTH + reference = "https://ldh.la.gov/page/fitap" + defined_for = StateCode.LA + + def formula(spm_unit, period, parameters): + # Per FITAP rules: countable income cannot exceed the flat grant + countable_income = spm_unit("la_tanf_countable_income", period) + flat_grant = spm_unit("la_tanf_flat_grant", period) + return countable_income <= flat_grant diff --git a/sources/working_references.md b/sources/working_references.md new file mode 100644 index 00000000000..ee7e2024aeb --- /dev/null +++ b/sources/working_references.md @@ -0,0 +1,313 @@ +# Collected Documentation + +## Louisiana FITAP (Family Independence Temporary Assistance Program) Implementation +**Collected**: 2026-01-04 +**Implementation Task**: Implement Louisiana TANF program (FITAP) + +--- + +## Official Program Name + +**Federal Program**: Temporary Assistance for Needy Families (TANF) +**State's Official Name**: Family Independence Temporary Assistance Program +**Abbreviation**: FITAP +**Source**: LA RS 46:231.2 - "There is hereby created the Family Independence Temporary Assistance Program" + +**Variable Prefix**: `la_tanf` + +--- + +## Regulatory Authority + +### Primary Sources + +1. **Louisiana Revised Statutes Title 46** + - RS 46:231 - Aid to needy families; definitions + - RS 46:231.2 - Family Independence Temporary Assistance Program + - RS 46:231.3 - FITAP benefits; prohibited uses + - URL: https://www.legis.la.gov/legis/Law.aspx?d=100599 + +2. **Louisiana Administrative Code Title 67, Part III** + - Subpart 5: Family Independence Temporary Assistance Program + - Chapter 5: Eligibility Requirements + - URL: https://www.doa.la.gov/media/tp3lmkyg/67.pdf + +3. **Louisiana Department of Health FITAP Page** + - URL: https://ldh.la.gov/page/fitap + +4. **Louisiana DCFS FITAP Page** + - URL: https://www.dcfs.louisiana.gov/page/fitap + +5. **DCFS Benefit Increase Announcement (January 2022)** + - URL: https://www.dcfs.louisiana.gov/news/louisiana-to-increase-tanf-cash-assistance-benefits-beginning-january-2022 + +--- + +## Non-Simulatable Rules (Architecture Limitation) + +### Time Limits (CANNOT ENFORCE - requires history) +- **24-of-60 Month Limit**: Cannot receive benefits for more than 24 months within any 60-month period +- **60-Month Lifetime Limit**: Lifetime limit of 60 months if the assistance unit includes a parent/caretaker relative +- There are exceptions to both limits + +### Time-Limited Deductions (APPLIED ALWAYS - cannot track months) +- **$900 Employment Deduction**: Time-limited deduction of $900 for six months for each employed member +- **Note**: This will be applied assuming the household qualifies since PolicyEngine cannot track employment duration + +--- + +## Income Eligibility Test + +### Single Income Test +Louisiana FITAP uses a unique income eligibility structure where **the income limit equals the flat grant amount** for the household size. + +**Rule**: Monthly countable income, both earned and unearned, cannot exceed the flat grant amount for the number of persons in the assistance unit. + +**Source**: Louisiana Department of Health FITAP page - "Monthly countable income, both earned and unearned, cannot exceed the flat grant amount for the number of persons in the assistance unit." + +### Benefit Calculation +**Formula**: Benefit = Flat Grant Amount - Total Countable Income + +**Source**: "Total countable income is subtracted from the flat grant amount to determine the client's grant amount." + +--- + +## Income Deductions & Disregards + +### Earned Income Deductions + +| Deduction Type | Amount | Level | Notes | +|---------------|--------|-------|-------| +| Standard Earned Income Deduction | $120 | Per employed member | Always available | +| Time-Limited Employment Deduction | $900 | Per employed member | For 6 months (cannot track) | +| Dependent Care Deduction | Varies | Per employed member | Certain requirements must be met | + +**Source**: Louisiana Department of Health FITAP page - "The allowable earned income deductions are: Standard earned income deduction of $120 for each employed member." + +**Implementation approach:** +- [x] $120 standard deduction per employed member (will implement) +- [x] $900 time-limited deduction (will implement as always available with comment noting limitation) +- [ ] Dependent care deduction (specific amounts not found in documentation) + +### Unearned Income +- Counted dollar-for-dollar (no disregards) +- Examples include: Child Support, alimony, unemployment benefits, Social Security benefits, SSI benefits, VA benefits, worker's compensation, pensions, contributions from friends/family + +### Child Support Policy +**No pass-through or disregard**: Louisiana does NOT pass through child support to TANF families or disregard it when calculating benefits. + +**Source**: NCSL Child Support Pass-Through and Disregard Policies - Louisiana shows "No" for both pass-through and disregard. + +**Requirement**: Client must assign any child support and medical support rights to the state and must cooperate with the agency's Child Support Enforcement Services. + +--- + +## Flat Grant Amounts (Payment Standards) + +### Current Amounts (Effective January 2022) + +| Household Size | Monthly Grant | +|----------------|---------------| +| 1 | $244 | +| 2 | $376 | +| 3 | $484 | +| 4 | $568 | +| 5 | $654 | +| 6 | $732 | +| 7 | $804 | +| 8 | $882 | +| 9 | $954 | + +**Source**: Louisiana Department of Health FITAP page (https://ldh.la.gov/page/fitap) and DCFS Benefit Increase Announcement (January 2022) + +**Note**: Benefits were doubled in January 2022 for the first time in over 20 years. The previous amounts were: +- 1: $122, 2: $188, 3: $240, 4: $284, 5: $327, 6: $366, 7: $402, 8: $441, 9: $477, 10: $512 + +### Minimum Payment +**LAC 67:III.1211** covers "Minimum Payments" - specific amount not confirmed in available sources but typically $10. + +--- + +## Resource Limits + +**All resources are EXCLUDED** when determining FITAP eligibility. + +**Source**: Law Library of Louisiana FITAP Guide - "Resources are assets or possessions that a household can convert to cash to meet needs. All resources are excluded when determining eligibility." + +**Implementation approach:** +- [x] No resource eligibility test needed for Louisiana FITAP + +--- + +## Eligibility Criteria + +### Age Requirements +- **Minor Child**: Under 18 years of age +- **Student Exception**: 18 years of age AND enrolled full-time in a secondary school or equivalent vocational/technical training, expected to complete before age 19 +- **Unborn Children**: Not eligible for FITAP benefits +- **Pregnant Women**: May be certified if in the sixth month of pregnancy or beyond (with medical verification) + +**Source**: LA RS 46:231 - "Dependent child" is defined as a needy child under the age of 18, or under age 19 if a full-time student in secondary school or equivalent vocational/technical training who may reasonably be expected to complete the program before age 19. + +**Implementation approach:** +- [x] Use federal demographic eligibility (age thresholds match federal: 18/19) + +### Citizenship/Immigration Eligibility +- Must be a U.S. citizen, non-citizen national, or qualified alien + +**Source**: Louisiana Department of Health FITAP page + +**Implementation approach:** +- [x] Use federal immigration eligibility (state follows federal rules) + +### Residency +- Must be living in Louisiana +- Must intend to make a home in Louisiana (not temporary) + +### Relationship Requirements +- Must be a qualified relative (related by blood, marriage, or adoption) +- Child must reside in the same home with the qualified relative +- Within fifth degree of relationship + +### Minor Parent Requirements +- Unmarried parents under 18 and their children must reside with parent, legal guardian, or in adult-supervised setting + +### Work Requirements (STEP Program) +- Work-eligible applicants and recipients are required to participate in the Strategies to Empower People (STEP) Program +- **Note**: Work requirements are not modeled in PolicyEngine - only eligibility and benefit calculation + +### Child Support Cooperation +- Client must assign child support and medical support rights to the state +- Must cooperate with Child Support Enforcement Services + +### Drug Screening +- Adults 18+ must cooperate with drug screening and testing if required + +### Immunization +- Children under 18 must show sufficient evidence of immunity or immunization against vaccine-preventable diseases + +--- + +## Benefit Calculation Formula + +### Step-by-Step Calculation + +1. **Determine Household Size** (assistance unit) +2. **Look up Flat Grant Amount** from payment standard table +3. **Calculate Gross Earned Income** for all employed members +4. **Apply Earned Income Deductions**: + - Subtract $120 per employed member (standard deduction) + - Subtract $900 per employed member (time-limited, if applicable) + - Subtract allowable dependent care expenses +5. **Calculate Countable Earned Income** = Gross Earned - Deductions (minimum of $0) +6. **Calculate Total Countable Income** = Countable Earned + Unearned Income +7. **Determine Eligibility**: If Total Countable Income > Flat Grant Amount, NOT eligible +8. **Calculate Benefit**: Benefit = Flat Grant Amount - Total Countable Income + +**Note**: Minimum benefit payment is typically $10 (LAC 67:III.1211) + +--- + +## Implementation Notes + +### Variables to Create + +1. **Eligibility Variables**: + - `la_tanf_eligible` - Overall TANF eligibility + - `la_tanf_income_eligible` - Income eligibility check + +2. **Income Variables**: + - `la_tanf_countable_earned_income` - Earned income after deductions + - `la_tanf_countable_income` - Total countable income + - `la_tanf_earned_income_deduction` - Standard and time-limited deductions + +3. **Benefit Variables**: + - `la_tanf_flat_grant` - Flat grant amount by household size + - `la_tanf` - Final benefit amount + +### Parameters to Create + +1. **Flat Grant Amounts**: `/parameters/gov/states/la/dcfs/tanf/flat_grant/amount.yaml` + - Bracket-style by household size (1-9+) + - Effective date: 2022-01-01 for current values + - Historical values from 2000-07-01 + +2. **Earned Income Deductions**: + - `/parameters/gov/states/la/dcfs/tanf/income/deductions/standard/amount.yaml` - $120 + - `/parameters/gov/states/la/dcfs/tanf/income/deductions/time_limited/amount.yaml` - $900 + +3. **Age Thresholds** (if not using federal): + - Minor child: 18 + - Full-time student: 19 + +--- + +## PDFs for Future Reference + +The following PDFs contain additional information but could not be fully extracted: + +1. **Louisiana Administrative Code Title 67 (Full Text)** + - URL: https://www.doa.la.gov/media/tp3lmkyg/67.pdf + - Expected content: Complete regulatory text for FITAP including LAC 67:III.1211 (Minimum Payments), income determination rules, and detailed eligibility requirements + +2. **Louisiana TANF State Plan** + - URL: https://www.dcfs.louisiana.gov/assets/docs/searchable/EconomicStability/TANF/TANF%20State%20Plan%20Renewal%20for%20Louisiana2012.pdf + - Expected content: State plan details, income calculation methodology, dependent care deduction specifics + +3. **TANF Combined WIOA Plan** + - URL: https://www.dcfs.louisiana.gov/assets/docs/searchable/EconomicStability/TANF/TANF_portion_combined_WIOAplan.pdf + - Expected content: Updated state plan information + +4. **2021 FITAP Brochure** + - URL: https://www.dcfs.louisiana.gov/assets/docs/searchable/Publication_Library/Family_Support/2021_FITAP_Brochure.pdf + - Expected content: Program overview and eligibility summary (pre-2022 benefit amounts) + +5. **NCCP TANF Profile - Louisiana** + - URL: https://www.nccp.org/wp-content/uploads/2024/08/TANF-profile-Louisiana.pdf + - Expected content: Income limits, asset limits, benefit amounts, earned income disregards + +--- + +## References for Metadata + +### For Parameters: +```yaml +reference: + - title: Louisiana Department of Health FITAP Page + href: https://ldh.la.gov/page/fitap + - title: Louisiana DCFS TANF Benefits Increase Announcement + href: https://www.dcfs.louisiana.gov/news/louisiana-to-increase-tanf-cash-assistance-benefits-beginning-january-2022 +``` + +### For Variables: +```python +reference = ( + "https://ldh.la.gov/page/fitap", + "https://www.legis.la.gov/legis/Law.aspx?d=100599", +) +``` + +--- + +## Verification Checklist + +- [x] Official program name discovered (FITAP) +- [x] Current benefit amounts by family size documented +- [x] Income eligibility test documented (income <= flat grant) +- [x] Earned income deductions documented ($120 + $900 time-limited) +- [x] Resource limit documented (all resources excluded) +- [x] Age requirements documented (under 18, or 18 if student completing before 19) +- [x] Child support passthrough policy documented (none) +- [x] Time limits documented (non-simulatable) +- [ ] Dependent care deduction amounts not fully specified in available sources +- [ ] LAC 67:III.1211 minimum payment amount not confirmed + +--- + +## Key Differences from Other State TANF Programs + +1. **No Resource Test**: Unlike many states, Louisiana excludes all resources from eligibility determination +2. **Income Limit = Benefit Amount**: The flat grant amount serves as both the income limit and the maximum benefit +3. **No Child Support Passthrough**: Louisiana does not pass through or disregard child support for FITAP families +4. **Time-Limited Deduction**: $900 for 6 months is unique to Louisiana +5. **2022 Benefit Doubling**: Benefits were doubled in January 2022 after 20+ years without increase From 43530982d5fa1e308722288156361342c41d1803 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 6 Jan 2026 12:30:25 -0500 Subject: [PATCH 3/5] rename --- .../dcfs/{tanf => fitap}/benefit/minimum.yaml | 2 +- .../{tanf => fitap}/flat_grant/amount.yaml | 4 +- .../income/deductions/standard.yaml | 2 +- .../income/deductions/time_limited.yaml | 2 +- .../la/dcfs/{tanf => fitap}/integration.yaml | 88 ++++++------ .../la_tanf.yaml => fitap/la_fitap.yaml} | 130 +++++++++--------- .../la_fitap_countable_earned_income.yaml} | 26 ++-- .../la_fitap_countable_income.yaml} | 22 +-- .../la_fitap_flat_grant.yaml} | 30 ++-- .../la_fitap_income_eligible.yaml} | 92 ++++++------- .../{tanf/la_tanf.py => fitap/la_fitap.py} | 12 +- .../la_fitap_countable_earned_income.py} | 6 +- .../la_fitap_countable_income.py} | 6 +- .../la_fitap_earned_income_deduction.py} | 6 +- .../la_fitap_eligible.py} | 6 +- .../la_fitap_flat_grant.py} | 6 +- .../la_fitap_income_eligible.py} | 8 +- 17 files changed, 224 insertions(+), 224 deletions(-) rename policyengine_us/parameters/gov/states/la/dcfs/{tanf => fitap}/benefit/minimum.yaml (89%) rename policyengine_us/parameters/gov/states/la/dcfs/{tanf => fitap}/flat_grant/amount.yaml (88%) rename policyengine_us/parameters/gov/states/la/dcfs/{tanf => fitap}/income/deductions/standard.yaml (85%) rename policyengine_us/parameters/gov/states/la/dcfs/{tanf => fitap}/income/deductions/time_limited.yaml (89%) rename policyengine_us/tests/policy/baseline/gov/states/la/dcfs/{tanf => fitap}/integration.yaml (81%) rename policyengine_us/tests/policy/baseline/gov/states/la/dcfs/{tanf/la_tanf.yaml => fitap/la_fitap.yaml} (80%) rename policyengine_us/tests/policy/baseline/gov/states/la/dcfs/{tanf/la_tanf_countable_earned_income.yaml => fitap/la_fitap_countable_earned_income.yaml} (92%) rename policyengine_us/tests/policy/baseline/gov/states/la/dcfs/{tanf/la_tanf_countable_income.yaml => fitap/la_fitap_countable_income.yaml} (71%) rename policyengine_us/tests/policy/baseline/gov/states/la/dcfs/{tanf/la_tanf_flat_grant.yaml => fitap/la_fitap_flat_grant.yaml} (94%) rename policyengine_us/tests/policy/baseline/gov/states/la/dcfs/{tanf/la_tanf_income_eligible.yaml => fitap/la_fitap_income_eligible.yaml} (70%) rename policyengine_us/variables/gov/states/la/dcfs/{tanf/la_tanf.py => fitap/la_fitap.py} (60%) rename policyengine_us/variables/gov/states/la/dcfs/{tanf/la_tanf_countable_earned_income.py => fitap/la_fitap_countable_earned_income.py} (67%) rename policyengine_us/variables/gov/states/la/dcfs/{tanf/la_tanf_countable_income.py => fitap/la_fitap_countable_income.py} (66%) rename policyengine_us/variables/gov/states/la/dcfs/{tanf/la_tanf_earned_income_deduction.py => fitap/la_fitap_earned_income_deduction.py} (82%) rename policyengine_us/variables/gov/states/la/dcfs/{tanf/la_tanf_eligible.py => fitap/la_fitap_eligible.py} (84%) rename policyengine_us/variables/gov/states/la/dcfs/{tanf/la_tanf_flat_grant.py => fitap/la_fitap_flat_grant.py} (78%) rename policyengine_us/variables/gov/states/la/dcfs/{tanf/la_tanf_income_eligible.py => fitap/la_fitap_income_eligible.py} (61%) diff --git a/policyengine_us/parameters/gov/states/la/dcfs/tanf/benefit/minimum.yaml b/policyengine_us/parameters/gov/states/la/dcfs/fitap/benefit/minimum.yaml similarity index 89% rename from policyengine_us/parameters/gov/states/la/dcfs/tanf/benefit/minimum.yaml rename to policyengine_us/parameters/gov/states/la/dcfs/fitap/benefit/minimum.yaml index e16a07fcee0..d4e12964e53 100644 --- a/policyengine_us/parameters/gov/states/la/dcfs/tanf/benefit/minimum.yaml +++ b/policyengine_us/parameters/gov/states/la/dcfs/fitap/benefit/minimum.yaml @@ -6,7 +6,7 @@ values: metadata: unit: currency-USD period: month - label: Louisiana TANF minimum benefit + label: Louisiana FITAP minimum benefit reference: - title: Louisiana Administrative Code Title 67, Part III, Section 1211 - Minimum Payments href: https://www.doa.la.gov/media/tp3lmkyg/67.pdf diff --git a/policyengine_us/parameters/gov/states/la/dcfs/tanf/flat_grant/amount.yaml b/policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/amount.yaml similarity index 88% rename from policyengine_us/parameters/gov/states/la/dcfs/tanf/flat_grant/amount.yaml rename to policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/amount.yaml index 85038149a19..37f877cbeb3 100644 --- a/policyengine_us/parameters/gov/states/la/dcfs/tanf/flat_grant/amount.yaml +++ b/policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/amount.yaml @@ -5,11 +5,11 @@ metadata: period: month breakdown: - range(0, 15) - label: Louisiana TANF flat grant amount + label: Louisiana FITAP flat grant amount reference: - title: Louisiana Department of Health FITAP Page href: https://ldh.la.gov/page/fitap - - title: Louisiana DCFS TANF Benefits Increase Announcement + - title: Louisiana DCFS FITAP Benefits Increase Announcement href: https://www.dcfs.louisiana.gov/news/louisiana-to-increase-tanf-cash-assistance-benefits-beginning-january-2022 1: diff --git a/policyengine_us/parameters/gov/states/la/dcfs/tanf/income/deductions/standard.yaml b/policyengine_us/parameters/gov/states/la/dcfs/fitap/income/deductions/standard.yaml similarity index 85% rename from policyengine_us/parameters/gov/states/la/dcfs/tanf/income/deductions/standard.yaml rename to policyengine_us/parameters/gov/states/la/dcfs/fitap/income/deductions/standard.yaml index cd3340ae319..9d7d49a858a 100644 --- a/policyengine_us/parameters/gov/states/la/dcfs/tanf/income/deductions/standard.yaml +++ b/policyengine_us/parameters/gov/states/la/dcfs/fitap/income/deductions/standard.yaml @@ -6,7 +6,7 @@ values: metadata: unit: currency-USD period: month - label: Louisiana TANF standard earned income deduction + label: Louisiana FITAP standard earned income deduction reference: - title: Louisiana Department of Health FITAP Page href: https://ldh.la.gov/page/fitap diff --git a/policyengine_us/parameters/gov/states/la/dcfs/tanf/income/deductions/time_limited.yaml b/policyengine_us/parameters/gov/states/la/dcfs/fitap/income/deductions/time_limited.yaml similarity index 89% rename from policyengine_us/parameters/gov/states/la/dcfs/tanf/income/deductions/time_limited.yaml rename to policyengine_us/parameters/gov/states/la/dcfs/fitap/income/deductions/time_limited.yaml index c781f50a12a..49484bd8988 100644 --- a/policyengine_us/parameters/gov/states/la/dcfs/tanf/income/deductions/time_limited.yaml +++ b/policyengine_us/parameters/gov/states/la/dcfs/fitap/income/deductions/time_limited.yaml @@ -8,7 +8,7 @@ values: metadata: unit: currency-USD period: month - label: Louisiana TANF time-limited earned income deduction + label: Louisiana FITAP time-limited earned income deduction reference: - title: Louisiana Department of Health FITAP Page href: https://ldh.la.gov/page/fitap diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/integration.yaml similarity index 81% rename from policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/integration.yaml rename to policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/integration.yaml index ac5c8955607..4163dcb3a9e 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/integration.yaml @@ -1,4 +1,4 @@ -# Louisiana TANF (FITAP) Integration Tests +# Louisiana FITAP Integration Tests # Full pipeline testing from gross income to final benefit # Reference: https://ldh.la.gov/page/fitap # Reference: https://www.legis.la.gov/legis/Law.aspx?d=100599 @@ -38,12 +38,12 @@ # Flat grant (family of 2): $376 # Income limit: $376 # Benefit: $376 - $0 = $376 - la_tanf_flat_grant: 376 - la_tanf_countable_earned_income: [0, 0] - la_tanf_countable_income: 0 - la_tanf_income_eligible: true - la_tanf_eligible: true - la_tanf: 376 + la_fitap_flat_grant: 376 + la_fitap_countable_earned_income: [0, 0] + la_fitap_countable_income: 0 + la_fitap_income_eligible: true + la_fitap_eligible: true + la_fitap: 376 - name: Scenario 2 - Single parent with one child, $1,200/month earnings, partial benefit. # Earned income with full deductions applied @@ -75,12 +75,12 @@ # Income limit: $376 # $180 <= $376 = income eligible # Benefit: $376 - $180 = $196 - la_tanf_flat_grant: 376 - la_tanf_countable_earned_income: [180, 0] - la_tanf_countable_income: 180 - la_tanf_income_eligible: true - la_tanf_eligible: true - la_tanf: 196 + la_fitap_flat_grant: 376 + la_fitap_countable_earned_income: [180, 0] + la_fitap_countable_income: 180 + la_fitap_income_eligible: true + la_fitap_eligible: true + la_fitap: 196 - name: Scenario 3 - Single parent with two children, earnings under deduction threshold. # Earned income fully offset by deductions @@ -112,12 +112,12 @@ # Countable income: $0 # Flat grant (family of 3): $484 # Benefit: $484 - $0 = $484 - la_tanf_flat_grant: 484 - la_tanf_countable_earned_income: [0, 0, 0] - la_tanf_countable_income: 0 - la_tanf_income_eligible: true - la_tanf_eligible: true - la_tanf: 484 + la_fitap_flat_grant: 484 + la_fitap_countable_earned_income: [0, 0, 0] + la_fitap_countable_income: 0 + la_fitap_income_eligible: true + la_fitap_eligible: true + la_fitap: 484 - name: Scenario 4 - Family with income above limit, ineligible. # Countable income exceeds flat grant amount @@ -147,15 +147,15 @@ # Countable income: $780 # Flat grant / Income limit (family of 2): $376 # $780 > $376 = income ineligible - la_tanf_flat_grant: 376 - la_tanf_countable_earned_income: [780, 0] - la_tanf_countable_income: 780 - la_tanf_income_eligible: false - la_tanf_eligible: false - la_tanf: 0 + la_fitap_flat_grant: 376 + la_fitap_countable_earned_income: [780, 0] + la_fitap_countable_income: 780 + la_fitap_income_eligible: false + la_fitap_eligible: false + la_fitap: 0 - name: Scenario 5 - Family with unearned income only (no deductions). - # Unearned income has no deductions in LA TANF + # Unearned income has no deductions in LA FITAP period: 2024-01 input: people: @@ -182,12 +182,12 @@ # Flat grant (family of 2): $376 # $200 <= $376 = income eligible # Benefit: $376 - $200 = $176 - la_tanf_flat_grant: 376 - la_tanf_countable_earned_income: [0, 0] - la_tanf_countable_income: 200 - la_tanf_income_eligible: true - la_tanf_eligible: true - la_tanf: 176 + la_fitap_flat_grant: 376 + la_fitap_countable_earned_income: [0, 0] + la_fitap_countable_income: 200 + la_fitap_income_eligible: true + la_fitap_eligible: true + la_fitap: 176 - name: Scenario 6 - Two earners, combined income with deductions. # Both employed members get deductions @@ -225,12 +225,12 @@ # Flat grant (family of 3): $484 # $280 <= $484 = income eligible # Benefit: $484 - $280 = $204 - la_tanf_flat_grant: 484 - la_tanf_countable_earned_income: [280, 0, 0] - la_tanf_countable_income: 280 - la_tanf_income_eligible: true - la_tanf_eligible: true - la_tanf: 204 + la_fitap_flat_grant: 484 + la_fitap_countable_earned_income: [280, 0, 0] + la_fitap_countable_income: 280 + la_fitap_income_eligible: true + la_fitap_eligible: true + la_fitap: 204 - name: Scenario 7 - Mixed income (earned and unearned), eligible. # Combination of earned income with deductions and unearned without @@ -265,9 +265,9 @@ # Flat grant (family of 3): $484 # $180 <= $484 = income eligible # Benefit: $484 - $180 = $304 - la_tanf_flat_grant: 484 - la_tanf_countable_earned_income: [80, 0, 0] - la_tanf_countable_income: 180 - la_tanf_income_eligible: true - la_tanf_eligible: true - la_tanf: 304 + la_fitap_flat_grant: 484 + la_fitap_countable_earned_income: [80, 0, 0] + la_fitap_countable_income: 180 + la_fitap_income_eligible: true + la_fitap_eligible: true + la_fitap: 304 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap.yaml similarity index 80% rename from policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf.yaml rename to policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap.yaml index e2556130d9d..b8584bdfd98 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap.yaml @@ -1,4 +1,4 @@ -# Louisiana TANF Benefit Unit Tests +# Louisiana FITAP Benefit Unit Tests # Tests final benefit calculation: Benefit = Flat Grant - Countable Income # Minimum benefit: $10 (benefits below this are not issued) # Reference: https://ldh.la.gov/page/fitap @@ -14,15 +14,15 @@ spm_units: spm_unit: members: [person1, person2] - la_tanf_eligible: true - la_tanf_flat_grant: 376 - la_tanf_countable_income: 0 + la_fitap_eligible: true + la_fitap_flat_grant: 376 + la_fitap_countable_income: 0 households: household: members: [person1, person2] state_code: LA output: - la_tanf: 376 + la_fitap: 376 - name: Case 2, eligible with partial income gets partial benefit. # Flat grant: $376 @@ -38,15 +38,15 @@ spm_units: spm_unit: members: [person1, person2] - la_tanf_eligible: true - la_tanf_flat_grant: 376 - la_tanf_countable_income: 200 + la_fitap_eligible: true + la_fitap_flat_grant: 376 + la_fitap_countable_income: 200 households: household: members: [person1, person2] state_code: LA output: - la_tanf: 176 + la_fitap: 176 - name: Case 3, eligible with income equal to flat grant gets zero. # Flat grant: $376 @@ -62,15 +62,15 @@ spm_units: spm_unit: members: [person1, person2] - la_tanf_eligible: true - la_tanf_flat_grant: 376 - la_tanf_countable_income: 376 + la_fitap_eligible: true + la_fitap_flat_grant: 376 + la_fitap_countable_income: 376 households: household: members: [person1, person2] state_code: LA output: - la_tanf: 0 + la_fitap: 0 - name: Case 4, ineligible household gets zero benefit. period: 2024-01 @@ -83,15 +83,15 @@ spm_units: spm_unit: members: [person1, person2] - la_tanf_eligible: false - la_tanf_flat_grant: 376 - la_tanf_countable_income: 0 + la_fitap_eligible: false + la_fitap_flat_grant: 376 + la_fitap_countable_income: 0 households: household: members: [person1, person2] state_code: LA output: - la_tanf: 0 + la_fitap: 0 - name: Case 5, benefit exactly at minimum threshold. # Flat grant: $376 @@ -107,15 +107,15 @@ spm_units: spm_unit: members: [person1, person2] - la_tanf_eligible: true - la_tanf_flat_grant: 376 - la_tanf_countable_income: 366 + la_fitap_eligible: true + la_fitap_flat_grant: 376 + la_fitap_countable_income: 366 households: household: members: [person1, person2] state_code: LA output: - la_tanf: 10 + la_fitap: 10 - name: Case 6, benefit below minimum is not issued. # Flat grant: $376 @@ -132,15 +132,15 @@ spm_units: spm_unit: members: [person1, person2] - la_tanf_eligible: true - la_tanf_flat_grant: 376 - la_tanf_countable_income: 370 + la_fitap_eligible: true + la_fitap_flat_grant: 376 + la_fitap_countable_income: 370 households: household: members: [person1, person2] state_code: LA output: - la_tanf: 0 + la_fitap: 0 - name: Case 7, larger family with higher flat grant. # Flat grant (family of 4): $568 @@ -160,15 +160,15 @@ spm_units: spm_unit: members: [person1, person2, person3, person4] - la_tanf_eligible: true - la_tanf_flat_grant: 568 - la_tanf_countable_income: 250 + la_fitap_eligible: true + la_fitap_flat_grant: 568 + la_fitap_countable_income: 250 households: household: members: [person1, person2, person3, person4] state_code: LA output: - la_tanf: 318 + la_fitap: 318 # ============================================================================= # EDGE CASES @@ -187,15 +187,15 @@ spm_units: spm_unit: members: [person1] - la_tanf_eligible: true - la_tanf_flat_grant: 244 - la_tanf_countable_income: 234 + la_fitap_eligible: true + la_fitap_flat_grant: 244 + la_fitap_countable_income: 234 households: household: members: [person1] state_code: LA output: - la_tanf: 10 + la_fitap: 10 - name: Edge case, benefit at nine dollars is below minimum. # Flat grant: $244 (size 1) @@ -210,15 +210,15 @@ spm_units: spm_unit: members: [person1] - la_tanf_eligible: true - la_tanf_flat_grant: 244 - la_tanf_countable_income: 235 + la_fitap_eligible: true + la_fitap_flat_grant: 244 + la_fitap_countable_income: 235 households: household: members: [person1] state_code: LA output: - la_tanf: 0 + la_fitap: 0 - name: Edge case, benefit at eleven dollars just above minimum. # Flat grant: $244 (size 1) @@ -233,15 +233,15 @@ spm_units: spm_unit: members: [person1] - la_tanf_eligible: true - la_tanf_flat_grant: 244 - la_tanf_countable_income: 233 + la_fitap_eligible: true + la_fitap_flat_grant: 244 + la_fitap_countable_income: 233 households: household: members: [person1] state_code: LA output: - la_tanf: 11 + la_fitap: 11 - name: Edge case, benefit at one dollar is below minimum. # Flat grant: $376 @@ -258,15 +258,15 @@ spm_units: spm_unit: members: [person1, person2] - la_tanf_eligible: true - la_tanf_flat_grant: 376 - la_tanf_countable_income: 375 + la_fitap_eligible: true + la_fitap_flat_grant: 376 + la_fitap_countable_income: 375 households: household: members: [person1, person2] state_code: LA output: - la_tanf: 0 + la_fitap: 0 - name: Edge case, very large family size 9 with no income gets full benefit. # Flat grant (family of 9): $954 @@ -296,15 +296,15 @@ spm_units: spm_unit: members: [person1, person2, person3, person4, person5, person6, person7, person8, person9] - la_tanf_eligible: true - la_tanf_flat_grant: 954 - la_tanf_countable_income: 0 + la_fitap_eligible: true + la_fitap_flat_grant: 954 + la_fitap_countable_income: 0 households: household: members: [person1, person2, person3, person4, person5, person6, person7, person8, person9] state_code: LA output: - la_tanf: 954 + la_fitap: 954 - name: Edge case, very large family size 10 with no income at cap. # Flat grant (family of 10+): $954 (capped at size 10) @@ -336,15 +336,15 @@ spm_units: spm_unit: members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10] - la_tanf_eligible: true - la_tanf_flat_grant: 954 - la_tanf_countable_income: 0 + la_fitap_eligible: true + la_fitap_flat_grant: 954 + la_fitap_countable_income: 0 households: household: members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10] state_code: LA output: - la_tanf: 954 + la_fitap: 954 - name: Edge case, income exceeds flat grant resulting in zero benefit. # Flat grant: $376 @@ -361,15 +361,15 @@ spm_units: spm_unit: members: [person1, person2] - la_tanf_eligible: true - la_tanf_flat_grant: 376 - la_tanf_countable_income: 400 + la_fitap_eligible: true + la_fitap_flat_grant: 376 + la_fitap_countable_income: 400 households: household: members: [person1, person2] state_code: LA output: - la_tanf: 0 + la_fitap: 0 - name: Edge case, very high income far exceeding flat grant. # Flat grant: $568 (family of 4) @@ -389,15 +389,15 @@ spm_units: spm_unit: members: [person1, person2, person3, person4] - la_tanf_eligible: true - la_tanf_flat_grant: 568 - la_tanf_countable_income: 2_000 + la_fitap_eligible: true + la_fitap_flat_grant: 568 + la_fitap_countable_income: 2_000 households: household: members: [person1, person2, person3, person4] state_code: LA output: - la_tanf: 0 + la_fitap: 0 - name: Edge case, single person full benefit no income. # Flat grant (family of 1): $244 @@ -411,12 +411,12 @@ spm_units: spm_unit: members: [person1] - la_tanf_eligible: true - la_tanf_flat_grant: 244 - la_tanf_countable_income: 0 + la_fitap_eligible: true + la_fitap_flat_grant: 244 + la_fitap_countable_income: 0 households: household: members: [person1] state_code: LA output: - la_tanf: 244 + la_fitap: 244 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_countable_earned_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_countable_earned_income.yaml similarity index 92% rename from policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_countable_earned_income.yaml rename to policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_countable_earned_income.yaml index b6e557a437f..56633d69bd4 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_countable_earned_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_countable_earned_income.yaml @@ -1,4 +1,4 @@ -# Louisiana TANF Countable Earned Income Unit Tests +# Louisiana FITAP Countable Earned Income Unit Tests # Tests earned income after deductions for LA FITAP program # Deductions: $120 standard + $900 time-limited per employed member per month # Reference: https://ldh.la.gov/page/fitap @@ -19,7 +19,7 @@ members: [person1] state_code: LA output: - la_tanf_countable_earned_income: 0 + la_fitap_countable_earned_income: 0 - name: Case 2, single earner with deductions exceeding income. # Monthly gross: $800 @@ -38,7 +38,7 @@ members: [person1] state_code: LA output: - la_tanf_countable_earned_income: 0 + la_fitap_countable_earned_income: 0 - name: Case 3, single earner with income exceeding deductions. # Monthly gross: $1,500 @@ -57,7 +57,7 @@ members: [person1] state_code: LA output: - la_tanf_countable_earned_income: 480 + la_fitap_countable_earned_income: 480 - name: Case 4, two earners with income exceeding deductions. # Person 1 monthly gross: $1,200 @@ -82,7 +82,7 @@ members: [person1, person2] state_code: LA output: - la_tanf_countable_earned_income: [180, 0] + la_fitap_countable_earned_income: [180, 0] - name: Case 5, earner at exact deduction threshold. # Monthly gross: $1,020 @@ -101,7 +101,7 @@ members: [person1] state_code: LA output: - la_tanf_countable_earned_income: 0 + la_fitap_countable_earned_income: 0 - name: Case 6, self-employment income treated same as wages. # Monthly gross: $1,500 (self-employment) @@ -120,7 +120,7 @@ members: [person1] state_code: LA output: - la_tanf_countable_earned_income: 480 + la_fitap_countable_earned_income: 480 # ============================================================================= # EDGE CASES @@ -143,7 +143,7 @@ members: [person1] state_code: LA output: - la_tanf_countable_earned_income: 0 + la_fitap_countable_earned_income: 0 - name: Edge case, income exactly one dollar over deduction threshold. # Monthly gross: $1,021 (exactly $1 over $1,020 deduction) @@ -163,7 +163,7 @@ members: [person1] state_code: LA output: - la_tanf_countable_earned_income: 1 + la_fitap_countable_earned_income: 1 - name: Edge case, very high income far exceeds deduction. # Monthly gross: $10,000 (extreme income scenario) @@ -183,7 +183,7 @@ members: [person1] state_code: LA output: - la_tanf_countable_earned_income: 8_980 + la_fitap_countable_earned_income: 8_980 - name: Edge case, multiple earners where one has zero income. # Person 1 monthly gross: $1,500 (employed) @@ -208,7 +208,7 @@ members: [person1, person2] state_code: LA output: - la_tanf_countable_earned_income: [480, 0] + la_fitap_countable_earned_income: [480, 0] - name: Edge case, two high earners both exceed deduction threshold. # Person 1 monthly gross: $2,000 @@ -233,7 +233,7 @@ members: [person1, person2] state_code: LA output: - la_tanf_countable_earned_income: [980, 480] + la_fitap_countable_earned_income: [980, 480] - name: Edge case, combined employment and self-employment same person. # Person 1 monthly gross: $900 employment + $600 self-employment = $1,500 total @@ -253,4 +253,4 @@ members: [person1] state_code: LA output: - la_tanf_countable_earned_income: 480 + la_fitap_countable_earned_income: 480 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_countable_income.yaml similarity index 71% rename from policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_countable_income.yaml rename to policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_countable_income.yaml index fcfb62898a8..55110993a64 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_countable_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_countable_income.yaml @@ -1,4 +1,4 @@ -# Louisiana TANF Countable Income Unit Tests +# Louisiana FITAP Countable Income Unit Tests # Tests total countable income = countable earned + unearned income # Unearned income counted dollar-for-dollar (no disregards) # Reference: https://ldh.la.gov/page/fitap @@ -7,29 +7,29 @@ period: 2024-01 input: state_code: LA - la_tanf_countable_earned_income: 0 + la_fitap_countable_earned_income: 0 tanf_gross_unearned_income: 0 output: - la_tanf_countable_income: 0 + la_fitap_countable_income: 0 - name: Case 2, only countable earned income. period: 2024-01 input: state_code: LA - la_tanf_countable_earned_income: 300 + la_fitap_countable_earned_income: 300 tanf_gross_unearned_income: 0 output: - la_tanf_countable_income: 300 + la_fitap_countable_income: 300 - name: Case 3, only unearned income. # Unearned income counted in full period: 2024-01 input: state_code: LA - la_tanf_countable_earned_income: 0 + la_fitap_countable_earned_income: 0 tanf_gross_unearned_income: 200 output: - la_tanf_countable_income: 200 + la_fitap_countable_income: 200 - name: Case 4, both earned and unearned income. # Countable earned: $300 @@ -38,10 +38,10 @@ period: 2024-01 input: state_code: LA - la_tanf_countable_earned_income: 300 + la_fitap_countable_earned_income: 300 tanf_gross_unearned_income: 150 output: - la_tanf_countable_income: 450 + la_fitap_countable_income: 450 - name: Case 5, larger combined income. # Countable earned: $480 @@ -50,7 +50,7 @@ period: 2024-01 input: state_code: LA - la_tanf_countable_earned_income: 480 + la_fitap_countable_earned_income: 480 tanf_gross_unearned_income: 250 output: - la_tanf_countable_income: 730 + la_fitap_countable_income: 730 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_flat_grant.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_flat_grant.yaml similarity index 94% rename from policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_flat_grant.yaml rename to policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_flat_grant.yaml index 68d855d6a2b..8df41d9333d 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_flat_grant.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_flat_grant.yaml @@ -1,4 +1,4 @@ -# Louisiana TANF Flat Grant Unit Tests +# Louisiana FITAP Flat Grant Unit Tests # Tests flat grant amounts by household size (effective January 2022) # Reference: https://ldh.la.gov/page/fitap # Reference: https://www.dcfs.louisiana.gov/news/louisiana-to-increase-tanf-cash-assistance-benefits-beginning-january-2022 @@ -17,7 +17,7 @@ members: [person1] state_code: LA output: - la_tanf_flat_grant: 244 + la_fitap_flat_grant: 244 - name: Case 2, household size 2 flat grant. period: 2024-01 @@ -35,7 +35,7 @@ members: [person1, person2] state_code: LA output: - la_tanf_flat_grant: 376 + la_fitap_flat_grant: 376 - name: Case 3, household size 3 flat grant. period: 2024-01 @@ -55,7 +55,7 @@ members: [person1, person2, person3] state_code: LA output: - la_tanf_flat_grant: 484 + la_fitap_flat_grant: 484 - name: Case 4, household size 4 flat grant. period: 2024-01 @@ -77,7 +77,7 @@ members: [person1, person2, person3, person4] state_code: LA output: - la_tanf_flat_grant: 568 + la_fitap_flat_grant: 568 - name: Case 5, household size 5 flat grant. period: 2024-01 @@ -101,7 +101,7 @@ members: [person1, person2, person3, person4, person5] state_code: LA output: - la_tanf_flat_grant: 654 + la_fitap_flat_grant: 654 - name: Case 6, household size 6 flat grant. period: 2024-01 @@ -127,7 +127,7 @@ members: [person1, person2, person3, person4, person5, person6] state_code: LA output: - la_tanf_flat_grant: 732 + la_fitap_flat_grant: 732 - name: Case 7, household size 9 flat grant (max in table). period: 2024-01 @@ -159,7 +159,7 @@ members: [person1, person2, person3, person4, person5, person6, person7, person8, person9] state_code: LA output: - la_tanf_flat_grant: 954 + la_fitap_flat_grant: 954 - name: Case 8, pre-2022 flat grant (historical). # Before January 2022, benefits were half current amounts @@ -178,7 +178,7 @@ members: [person1, person2] state_code: LA output: - la_tanf_flat_grant: 188 + la_fitap_flat_grant: 188 # ============================================================================= # EDGE CASES @@ -200,7 +200,7 @@ members: [person1] state_code: LA output: - la_tanf_flat_grant: 244 + la_fitap_flat_grant: 244 - name: Edge case, household size 7 flat grant. # Size 7 = $804 @@ -229,7 +229,7 @@ members: [person1, person2, person3, person4, person5, person6, person7] state_code: LA output: - la_tanf_flat_grant: 804 + la_fitap_flat_grant: 804 - name: Edge case, household size 8 flat grant. # Size 8 = $882 @@ -260,7 +260,7 @@ members: [person1, person2, person3, person4, person5, person6, person7, person8] state_code: LA output: - la_tanf_flat_grant: 882 + la_fitap_flat_grant: 882 - name: Edge case, household size 10 at cap. # Size 10 = $954 (same as size 9, cap applies) @@ -296,7 +296,7 @@ members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10] state_code: LA output: - la_tanf_flat_grant: 954 + la_fitap_flat_grant: 954 - name: Edge case, household size 11 exceeds cap. # Size 11 should cap at size 10 value = $954 @@ -334,7 +334,7 @@ members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11] state_code: LA output: - la_tanf_flat_grant: 954 + la_fitap_flat_grant: 954 - name: Edge case, very large household size 12 still caps at size 10. # Size 12 should cap at size 10 value = $954 @@ -374,4 +374,4 @@ members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11, person12] state_code: LA output: - la_tanf_flat_grant: 954 + la_fitap_flat_grant: 954 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_income_eligible.yaml similarity index 70% rename from policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_income_eligible.yaml rename to policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_income_eligible.yaml index c1d4b340fd0..5a6d8b273d8 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/tanf/la_tanf_income_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_income_eligible.yaml @@ -1,4 +1,4 @@ -# Louisiana TANF Income Eligibility Unit Tests +# Louisiana FITAP Income Eligibility Unit Tests # Income limit equals the flat grant amount for household size # Reference: https://ldh.la.gov/page/fitap # "Monthly countable income, both earned and unearned, cannot exceed @@ -8,10 +8,10 @@ period: 2024-01 input: state_code: LA - la_tanf_countable_income: 0 - la_tanf_flat_grant: 376 # Family of 2 + la_fitap_countable_income: 0 + la_fitap_flat_grant: 376 # Family of 2 output: - la_tanf_income_eligible: true + la_fitap_income_eligible: true - name: Case 2, income below flat grant is eligible. # Countable income: $200 @@ -20,10 +20,10 @@ period: 2024-01 input: state_code: LA - la_tanf_countable_income: 200 - la_tanf_flat_grant: 376 + la_fitap_countable_income: 200 + la_fitap_flat_grant: 376 output: - la_tanf_income_eligible: true + la_fitap_income_eligible: true - name: Case 3, income equal to flat grant is eligible. # Countable income: $376 @@ -32,10 +32,10 @@ period: 2024-01 input: state_code: LA - la_tanf_countable_income: 376 - la_tanf_flat_grant: 376 + la_fitap_countable_income: 376 + la_fitap_flat_grant: 376 output: - la_tanf_income_eligible: true + la_fitap_income_eligible: true - name: Case 4, income above flat grant is ineligible. # Countable income: $400 @@ -44,10 +44,10 @@ period: 2024-01 input: state_code: LA - la_tanf_countable_income: 400 - la_tanf_flat_grant: 376 + la_fitap_countable_income: 400 + la_fitap_flat_grant: 376 output: - la_tanf_income_eligible: false + la_fitap_income_eligible: false - name: Case 5, income just above flat grant is ineligible. # Countable income: $377 @@ -56,10 +56,10 @@ period: 2024-01 input: state_code: LA - la_tanf_countable_income: 377 - la_tanf_flat_grant: 376 + la_fitap_countable_income: 377 + la_fitap_flat_grant: 376 output: - la_tanf_income_eligible: false + la_fitap_income_eligible: false - name: Case 6, larger family higher income limit. # Countable income: $450 @@ -68,10 +68,10 @@ period: 2024-01 input: state_code: LA - la_tanf_countable_income: 450 - la_tanf_flat_grant: 484 + la_fitap_countable_income: 450 + la_fitap_flat_grant: 484 output: - la_tanf_income_eligible: true + la_fitap_income_eligible: true # ============================================================================= # EDGE CASES @@ -85,10 +85,10 @@ period: 2024-01 input: state_code: LA - la_tanf_countable_income: 375 - la_tanf_flat_grant: 376 + la_fitap_countable_income: 375 + la_fitap_flat_grant: 376 output: - la_tanf_income_eligible: true + la_fitap_income_eligible: true - name: Edge case, income exactly one dollar above limit is ineligible. # Countable income: $245 @@ -98,10 +98,10 @@ period: 2024-01 input: state_code: LA - la_tanf_countable_income: 245 - la_tanf_flat_grant: 244 + la_fitap_countable_income: 245 + la_fitap_flat_grant: 244 output: - la_tanf_income_eligible: false + la_fitap_income_eligible: false - name: Edge case, income exactly at limit for single person household. # Countable income: $244 @@ -110,10 +110,10 @@ period: 2024-01 input: state_code: LA - la_tanf_countable_income: 244 - la_tanf_flat_grant: 244 + la_fitap_countable_income: 244 + la_fitap_flat_grant: 244 output: - la_tanf_income_eligible: true + la_fitap_income_eligible: true - name: Edge case, income exactly one dollar below limit for single person. # Countable income: $243 @@ -122,10 +122,10 @@ period: 2024-01 input: state_code: LA - la_tanf_countable_income: 243 - la_tanf_flat_grant: 244 + la_fitap_countable_income: 243 + la_fitap_flat_grant: 244 output: - la_tanf_income_eligible: true + la_fitap_income_eligible: true - name: Edge case, very high income far above limit. # Countable income: $2,000 @@ -134,10 +134,10 @@ period: 2024-01 input: state_code: LA - la_tanf_countable_income: 2_000 - la_tanf_flat_grant: 376 + la_fitap_countable_income: 2_000 + la_fitap_flat_grant: 376 output: - la_tanf_income_eligible: false + la_fitap_income_eligible: false - name: Edge case, maximum family size income limit. # Countable income: $954 @@ -147,10 +147,10 @@ period: 2024-01 input: state_code: LA - la_tanf_countable_income: 954 - la_tanf_flat_grant: 954 + la_fitap_countable_income: 954 + la_fitap_flat_grant: 954 output: - la_tanf_income_eligible: true + la_fitap_income_eligible: true - name: Edge case, income one dollar above maximum family size limit. # Countable income: $955 @@ -160,10 +160,10 @@ period: 2024-01 input: state_code: LA - la_tanf_countable_income: 955 - la_tanf_flat_grant: 954 + la_fitap_countable_income: 955 + la_fitap_flat_grant: 954 output: - la_tanf_income_eligible: false + la_fitap_income_eligible: false - name: Edge case, income one dollar below maximum family size limit. # Countable income: $953 @@ -173,10 +173,10 @@ period: 2024-01 input: state_code: LA - la_tanf_countable_income: 953 - la_tanf_flat_grant: 954 + la_fitap_countable_income: 953 + la_fitap_flat_grant: 954 output: - la_tanf_income_eligible: true + la_fitap_income_eligible: true - name: Edge case, fractional income just above limit. # Countable income: $376.01 @@ -186,7 +186,7 @@ period: 2024-01 input: state_code: LA - la_tanf_countable_income: 376.01 - la_tanf_flat_grant: 376 + la_fitap_countable_income: 376.01 + la_fitap_flat_grant: 376 output: - la_tanf_income_eligible: false + la_fitap_income_eligible: false diff --git a/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf.py b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap.py similarity index 60% rename from policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf.py rename to policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap.py index 3f9d778ffdf..7afdf97490b 100644 --- a/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf.py +++ b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap.py @@ -1,19 +1,19 @@ from policyengine_us.model_api import * -class la_tanf(Variable): +class la_fitap(Variable): value_type = float entity = SPMUnit - label = "Louisiana TANF" + label = "Louisiana FITAP" unit = USD definition_period = MONTH reference = "https://ldh.la.gov/page/fitap" - defined_for = "la_tanf_eligible" + defined_for = "la_fitap_eligible" def formula(spm_unit, period, parameters): - p = parameters(period).gov.states.la.dcfs.tanf.benefit - flat_grant = spm_unit("la_tanf_flat_grant", period) - countable_income = spm_unit("la_tanf_countable_income", period) + p = parameters(period).gov.states.la.dcfs.fitap.benefit + flat_grant = spm_unit("la_fitap_flat_grant", period) + countable_income = spm_unit("la_fitap_countable_income", period) # Benefit = flat grant minus countable income benefit = max_(flat_grant - countable_income, 0) diff --git a/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_countable_earned_income.py b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_countable_earned_income.py similarity index 67% rename from policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_countable_earned_income.py rename to policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_countable_earned_income.py index 9d412bdca1c..54bb3a0dade 100644 --- a/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_countable_earned_income.py +++ b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_countable_earned_income.py @@ -1,10 +1,10 @@ from policyengine_us.model_api import * -class la_tanf_countable_earned_income(Variable): +class la_fitap_countable_earned_income(Variable): value_type = float entity = Person - label = "Louisiana TANF countable earned income" + label = "Louisiana FITAP countable earned income" unit = USD definition_period = MONTH reference = "https://ldh.la.gov/page/fitap" @@ -12,5 +12,5 @@ class la_tanf_countable_earned_income(Variable): def formula(person, period, parameters): gross_earned = person("tanf_gross_earned_income", period) - deduction = person("la_tanf_earned_income_deduction", period) + deduction = person("la_fitap_earned_income_deduction", period) return max_(gross_earned - deduction, 0) diff --git a/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_countable_income.py b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_countable_income.py similarity index 66% rename from policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_countable_income.py rename to policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_countable_income.py index e21fa63c7ff..f5f8cc8c7a5 100644 --- a/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_countable_income.py +++ b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_countable_income.py @@ -1,16 +1,16 @@ from policyengine_us.model_api import * -class la_tanf_countable_income(Variable): +class la_fitap_countable_income(Variable): value_type = float entity = SPMUnit - label = "Louisiana TANF countable income" + label = "Louisiana FITAP countable income" unit = USD definition_period = MONTH reference = "https://ldh.la.gov/page/fitap" defined_for = StateCode.LA adds = [ - "la_tanf_countable_earned_income", + "la_fitap_countable_earned_income", "tanf_gross_unearned_income", ] diff --git a/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_earned_income_deduction.py b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_earned_income_deduction.py similarity index 82% rename from policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_earned_income_deduction.py rename to policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_earned_income_deduction.py index 00aadf2d409..d418f9f60e4 100644 --- a/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_earned_income_deduction.py +++ b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_earned_income_deduction.py @@ -1,17 +1,17 @@ from policyengine_us.model_api import * -class la_tanf_earned_income_deduction(Variable): +class la_fitap_earned_income_deduction(Variable): value_type = float entity = Person - label = "Louisiana TANF earned income deduction" + label = "Louisiana FITAP earned income deduction" unit = USD definition_period = MONTH reference = "https://ldh.la.gov/page/fitap" defined_for = StateCode.LA def formula(person, period, parameters): - p = parameters(period).gov.states.la.dcfs.tanf.income.deductions + p = parameters(period).gov.states.la.dcfs.fitap.income.deductions gross_earned = person("tanf_gross_earned_income", period) # Per FITAP rules: deductions only apply to employed members diff --git a/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_eligible.py b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_eligible.py similarity index 84% rename from policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_eligible.py rename to policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_eligible.py index 29311108c36..2a6ce1d8b96 100644 --- a/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_eligible.py +++ b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_eligible.py @@ -1,10 +1,10 @@ from policyengine_us.model_api import * -class la_tanf_eligible(Variable): +class la_fitap_eligible(Variable): value_type = bool entity = SPMUnit - label = "Louisiana TANF eligible" + label = "Louisiana FITAP eligible" definition_period = MONTH reference = "https://ldh.la.gov/page/fitap" defined_for = StateCode.LA @@ -19,7 +19,7 @@ def formula(spm_unit, period, parameters): ) # Income eligibility (countable income <= flat grant) - income_eligible = spm_unit("la_tanf_income_eligible", period) + income_eligible = spm_unit("la_fitap_income_eligible", period) # NOTE: Louisiana excludes all resources from eligibility # determination, so no resource test is needed. diff --git a/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_flat_grant.py b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_flat_grant.py similarity index 78% rename from policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_flat_grant.py rename to policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_flat_grant.py index 2eec6e4f6c3..2dd76df12b7 100644 --- a/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_flat_grant.py +++ b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_flat_grant.py @@ -1,10 +1,10 @@ from policyengine_us.model_api import * -class la_tanf_flat_grant(Variable): +class la_fitap_flat_grant(Variable): value_type = float entity = SPMUnit - label = "Louisiana TANF flat grant" + label = "Louisiana FITAP flat grant" unit = USD definition_period = MONTH reference = ( @@ -14,7 +14,7 @@ class la_tanf_flat_grant(Variable): defined_for = StateCode.LA def formula(spm_unit, period, parameters): - p = parameters(period).gov.states.la.dcfs.tanf.flat_grant + p = parameters(period).gov.states.la.dcfs.fitap.flat_grant size = spm_unit("spm_unit_size", period.this_year) capped_size = min_(size, 10) return p.amount[capped_size] diff --git a/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_income_eligible.py b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_income_eligible.py similarity index 61% rename from policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_income_eligible.py rename to policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_income_eligible.py index d06713cc1ba..a799b297139 100644 --- a/policyengine_us/variables/gov/states/la/dcfs/tanf/la_tanf_income_eligible.py +++ b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_income_eligible.py @@ -1,16 +1,16 @@ from policyengine_us.model_api import * -class la_tanf_income_eligible(Variable): +class la_fitap_income_eligible(Variable): value_type = bool entity = SPMUnit - label = "Louisiana TANF income eligible" + label = "Louisiana FITAP income eligible" definition_period = MONTH reference = "https://ldh.la.gov/page/fitap" defined_for = StateCode.LA def formula(spm_unit, period, parameters): # Per FITAP rules: countable income cannot exceed the flat grant - countable_income = spm_unit("la_tanf_countable_income", period) - flat_grant = spm_unit("la_tanf_flat_grant", period) + countable_income = spm_unit("la_fitap_countable_income", period) + flat_grant = spm_unit("la_fitap_flat_grant", period) return countable_income <= flat_grant From 0d92b1965e8cee85b2d469fa987ffd82198cb21c Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 6 Jan 2026 15:24:52 -0500 Subject: [PATCH 4/5] adjustments --- changelog_entry.yaml | 2 +- .../states/la/dcfs/fitap/benefit/minimum.yaml | 12 - .../la/dcfs/fitap/flat_grant/amount.yaml | 41 +- .../fitap/flat_grant/excess_adjustment.yaml | 17 + .../dcfs/fitap/flat_grant/max_table_size.yaml | 16 + .../fitap/income/deductions/standard.yaml | 4 +- .../fitap/income/deductions/time_limited.yaml | 8 +- .../gov/states/la/dcfs/fitap/integration.yaml | 27 +- .../gov/states/la/dcfs/fitap/la_fitap.yaml | 422 +----------------- .../la_fitap_countable_earned_income.yaml | 256 ----------- .../dcfs/fitap/la_fitap_countable_income.yaml | 56 --- ...a_fitap_earned_income_after_disregard.yaml | 48 ++ .../la/dcfs/fitap/la_fitap_eligible.yaml | 81 ++++ .../la/dcfs/fitap/la_fitap_flat_grant.yaml | 394 ++-------------- .../dcfs/fitap/la_fitap_income_eligible.yaml | 172 +------ .../{ => eligibility}/la_fitap_eligible.py | 14 +- .../la_fitap_income_eligible.py | 4 +- .../{ => income}/la_fitap_countable_income.py | 4 +- .../la_fitap_earned_income_after_disregard.py | 21 + .../gov/states/la/dcfs/fitap/la_fitap.py | 8 +- .../fitap/la_fitap_countable_earned_income.py | 16 - .../fitap/la_fitap_earned_income_deduction.py | 27 -- .../la/dcfs/fitap/la_fitap_flat_grant.py | 24 +- sources/working_references.md | 313 ------------- 24 files changed, 318 insertions(+), 1669 deletions(-) delete mode 100644 policyengine_us/parameters/gov/states/la/dcfs/fitap/benefit/minimum.yaml create mode 100644 policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/excess_adjustment.yaml create mode 100644 policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/max_table_size.yaml delete mode 100644 policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_countable_earned_income.yaml delete mode 100644 policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_countable_income.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_earned_income_after_disregard.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_eligible.yaml rename policyengine_us/variables/gov/states/la/dcfs/fitap/{ => eligibility}/la_fitap_eligible.py (63%) rename policyengine_us/variables/gov/states/la/dcfs/fitap/{ => eligibility}/la_fitap_income_eligible.py (72%) rename policyengine_us/variables/gov/states/la/dcfs/fitap/{ => income}/la_fitap_countable_income.py (67%) create mode 100644 policyengine_us/variables/gov/states/la/dcfs/fitap/income/la_fitap_earned_income_after_disregard.py delete mode 100644 policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_countable_earned_income.py delete mode 100644 policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_earned_income_deduction.py delete mode 100644 sources/working_references.md diff --git a/changelog_entry.yaml b/changelog_entry.yaml index dda87f82295..a8e70b8fd04 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -1,4 +1,4 @@ - bump: minor changes: added: - - Louisiana Temporary Assistance for Needy Families (TANF) program, known as FITAP (Family Independence Temporary Assistance Program). + - Louisiana Family Independence Temporary Assistance Program (FITAP). diff --git a/policyengine_us/parameters/gov/states/la/dcfs/fitap/benefit/minimum.yaml b/policyengine_us/parameters/gov/states/la/dcfs/fitap/benefit/minimum.yaml deleted file mode 100644 index d4e12964e53..00000000000 --- a/policyengine_us/parameters/gov/states/la/dcfs/fitap/benefit/minimum.yaml +++ /dev/null @@ -1,12 +0,0 @@ -description: Louisiana provides this amount as the minimum benefit under the Family Independence Temporary Assistance Program. - -values: - 2000-07-01: 10 - -metadata: - unit: currency-USD - period: month - label: Louisiana FITAP minimum benefit - reference: - - title: Louisiana Administrative Code Title 67, Part III, Section 1211 - Minimum Payments - href: https://www.doa.la.gov/media/tp3lmkyg/67.pdf diff --git a/policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/amount.yaml b/policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/amount.yaml index 37f877cbeb3..ba1af935c30 100644 --- a/policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/amount.yaml +++ b/policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/amount.yaml @@ -4,12 +4,19 @@ metadata: unit: currency-USD period: month breakdown: - - range(0, 15) + - range(1, 19) label: Louisiana FITAP flat grant amount reference: - - title: Louisiana Department of Health FITAP Page - href: https://ldh.la.gov/page/fitap - - title: Louisiana DCFS FITAP Benefits Increase Announcement + # 2000-07-01 values (unchanged until 2022): + - title: Louisiana DCFS 2014 TANF State Plan Renewal - Appendix B-911-2 + href: https://www.dcfs.louisiana.gov/assets/docs/searchable/EconomicStability/TANF/2014TANFRenewal.pdf#page=16 + # 2022-01-01 values (doubled from 2000 amounts): + - title: Louisiana Administrative Code Title 67, Part III, Section 1229(D) + href: https://www.law.cornell.edu/regulations/louisiana/La-Admin-Code-tit-67-SS-III-1229 + # NOTE: Payment standards were set in July 2000 and remained unchanged for over 21 years. + # In January 2022, benefits were doubled for the first time since 2000. + # Per DCFS: "Inflation has increased 61% since these benefit amounts were last increased in July 2000." + - title: Louisiana DCFS FITAP Benefits Increase Announcement (January 2022) href: https://www.dcfs.louisiana.gov/news/louisiana-to-increase-tanf-cash-assistance-benefits-beginning-january-2022 1: @@ -41,4 +48,28 @@ metadata: 2022-01-01: 954 10: 2000-07-01: 512 - 2022-01-01: 954 + 2022-01-01: 1_024 +11: + 2000-07-01: 551 + 2022-01-01: 1_102 +12: + 2000-07-01: 590 + 2022-01-01: 1_180 +13: + 2000-07-01: 630 + 2022-01-01: 1_260 +14: + 2000-07-01: 670 + 2022-01-01: 1_340 +15: + 2000-07-01: 712 + 2022-01-01: 1_424 +16: + 2000-07-01: 757 + 2022-01-01: 1_514 +17: + 2000-07-01: 791 + 2022-01-01: 1_582 +18: + 2000-07-01: 839 + 2022-01-01: 1_678 diff --git a/policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/excess_adjustment.yaml b/policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/excess_adjustment.yaml new file mode 100644 index 00000000000..5bdf908995a --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/excess_adjustment.yaml @@ -0,0 +1,17 @@ +description: For households exceeding 18 persons, Louisiana subtracts this amount when calculating the flat grant under the Family Independence Temporary Assistance Program. + +values: + 2000-07-01: 50 + 2022-01-01: 100 + +metadata: + unit: currency-USD + period: month + label: Louisiana FITAP excess household size adjustment + reference: + # 2000-07-01 values: + - title: Louisiana DCFS 2014 TANF State Plan Renewal - Appendix B-911-2 Note 2 + href: https://www.dcfs.louisiana.gov/assets/docs/searchable/EconomicStability/TANF/2014TANFRenewal.pdf#page=16 + # 2022-01-01 values: + - title: Louisiana Administrative Code Title 67, Part III, Section 1229(D) Note 1 + href: https://www.law.cornell.edu/regulations/louisiana/La-Admin-Code-tit-67-SS-III-1229 diff --git a/policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/max_table_size.yaml b/policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/max_table_size.yaml new file mode 100644 index 00000000000..ac1824e8574 --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/max_table_size.yaml @@ -0,0 +1,16 @@ +description: Louisiana caps the flat grant lookup table at this assistance unit size under the Family Independence Temporary Assistance Program. + +values: + 2000-07-01: 18 + +metadata: + unit: person + period: year + label: Louisiana FITAP maximum table size for flat grant + reference: + # 2000-07-01 values: + - title: Louisiana DCFS 2014 TANF State Plan Renewal - Appendix B-911-2 + href: https://www.dcfs.louisiana.gov/assets/docs/searchable/EconomicStability/TANF/2014TANFRenewal.pdf#page=16 + # 2022-01-01 values: + - title: Louisiana Administrative Code Title 67, Part III, Section 1229(D) + href: https://www.law.cornell.edu/regulations/louisiana/La-Admin-Code-tit-67-SS-III-1229 diff --git a/policyengine_us/parameters/gov/states/la/dcfs/fitap/income/deductions/standard.yaml b/policyengine_us/parameters/gov/states/la/dcfs/fitap/income/deductions/standard.yaml index 9d7d49a858a..e912aec1fec 100644 --- a/policyengine_us/parameters/gov/states/la/dcfs/fitap/income/deductions/standard.yaml +++ b/policyengine_us/parameters/gov/states/la/dcfs/fitap/income/deductions/standard.yaml @@ -8,5 +8,5 @@ metadata: period: month label: Louisiana FITAP standard earned income deduction reference: - - title: Louisiana Department of Health FITAP Page - href: https://ldh.la.gov/page/fitap + - title: Louisiana Administrative Code Title 67, Part III, Section 1229(C)(1) + href: https://www.law.cornell.edu/regulations/louisiana/La-Admin-Code-tit-67-SS-III-1229 diff --git a/policyengine_us/parameters/gov/states/la/dcfs/fitap/income/deductions/time_limited.yaml b/policyengine_us/parameters/gov/states/la/dcfs/fitap/income/deductions/time_limited.yaml index 49484bd8988..0a47e190a85 100644 --- a/policyengine_us/parameters/gov/states/la/dcfs/fitap/income/deductions/time_limited.yaml +++ b/policyengine_us/parameters/gov/states/la/dcfs/fitap/income/deductions/time_limited.yaml @@ -1,6 +1,4 @@ -description: Louisiana deducts this amount from gross earned income for each employed member for the first six months of employment under the Family Independence Temporary Assistance Program. -# NOTE: PolicyEngine applies this deduction without tracking employment months. -# In reality, this deduction is only available for the first 6 consecutive months of employment. +description: Louisiana provides this time-limited deduction from earned income when earnings exceed the standard deduction under the Family Independence Temporary Assistance Program. values: 2000-07-01: 900 @@ -10,5 +8,5 @@ metadata: period: month label: Louisiana FITAP time-limited earned income deduction reference: - - title: Louisiana Department of Health FITAP Page - href: https://ldh.la.gov/page/fitap + - title: Louisiana Administrative Code Title 67, Part III, Section 1229(C)(2) + href: https://www.law.cornell.edu/regulations/louisiana/La-Admin-Code-tit-67-SS-III-1229 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/integration.yaml index 4163dcb3a9e..9aaea826b09 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/integration.yaml @@ -1,16 +1,3 @@ -# Louisiana FITAP Integration Tests -# Full pipeline testing from gross income to final benefit -# Reference: https://ldh.la.gov/page/fitap -# Reference: https://www.legis.la.gov/legis/Law.aspx?d=100599 -# -# Key Policy Rules: -# - Income limit = flat grant amount for household size -# - Benefit = Flat Grant - Countable Income -# - Earned income deductions: $120 standard + $900 time-limited per employed member -# - Unearned income counted dollar-for-dollar (no disregards) -# - Minimum benefit: $10 (benefits below this are not issued) -# - No resource test (all resources excluded) - - name: Scenario 1 - Single parent with one child, no income, full benefit. # Family of 2, no income, receives full flat grant period: 2024-01 @@ -39,7 +26,7 @@ # Income limit: $376 # Benefit: $376 - $0 = $376 la_fitap_flat_grant: 376 - la_fitap_countable_earned_income: [0, 0] + la_fitap_earned_income_after_disregard: [0, 0] la_fitap_countable_income: 0 la_fitap_income_eligible: true la_fitap_eligible: true @@ -76,7 +63,7 @@ # $180 <= $376 = income eligible # Benefit: $376 - $180 = $196 la_fitap_flat_grant: 376 - la_fitap_countable_earned_income: [180, 0] + la_fitap_earned_income_after_disregard: [180, 0] la_fitap_countable_income: 180 la_fitap_income_eligible: true la_fitap_eligible: true @@ -113,7 +100,7 @@ # Flat grant (family of 3): $484 # Benefit: $484 - $0 = $484 la_fitap_flat_grant: 484 - la_fitap_countable_earned_income: [0, 0, 0] + la_fitap_earned_income_after_disregard: [0, 0, 0] la_fitap_countable_income: 0 la_fitap_income_eligible: true la_fitap_eligible: true @@ -148,7 +135,7 @@ # Flat grant / Income limit (family of 2): $376 # $780 > $376 = income ineligible la_fitap_flat_grant: 376 - la_fitap_countable_earned_income: [780, 0] + la_fitap_earned_income_after_disregard: [780, 0] la_fitap_countable_income: 780 la_fitap_income_eligible: false la_fitap_eligible: false @@ -183,7 +170,7 @@ # $200 <= $376 = income eligible # Benefit: $376 - $200 = $176 la_fitap_flat_grant: 376 - la_fitap_countable_earned_income: [0, 0] + la_fitap_earned_income_after_disregard: [0, 0] la_fitap_countable_income: 200 la_fitap_income_eligible: true la_fitap_eligible: true @@ -226,7 +213,7 @@ # $280 <= $484 = income eligible # Benefit: $484 - $280 = $204 la_fitap_flat_grant: 484 - la_fitap_countable_earned_income: [280, 0, 0] + la_fitap_earned_income_after_disregard: [280, 0, 0] la_fitap_countable_income: 280 la_fitap_income_eligible: true la_fitap_eligible: true @@ -266,7 +253,7 @@ # $180 <= $484 = income eligible # Benefit: $484 - $180 = $304 la_fitap_flat_grant: 484 - la_fitap_countable_earned_income: [80, 0, 0] + la_fitap_earned_income_after_disregard: [80, 0, 0] la_fitap_countable_income: 180 la_fitap_income_eligible: true la_fitap_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap.yaml index b8584bdfd98..2709c5441bf 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap.yaml @@ -1,422 +1,30 @@ -# Louisiana FITAP Benefit Unit Tests -# Tests final benefit calculation: Benefit = Flat Grant - Countable Income -# Minimum benefit: $10 (benefits below this are not issued) -# Reference: https://ldh.la.gov/page/fitap - -- name: Case 1, eligible with no income gets full benefit. +- name: Case 1, eligible with no income gets full benefit period: 2024-01 input: - people: - person1: - age: 30 - person2: - age: 5 - spm_units: - spm_unit: - members: [person1, person2] - la_fitap_eligible: true - la_fitap_flat_grant: 376 - la_fitap_countable_income: 0 - households: - household: - members: [person1, person2] - state_code: LA + state_code: LA + la_fitap_eligible: true + la_fitap_flat_grant: 376 + la_fitap_countable_income: 0 output: la_fitap: 376 -- name: Case 2, eligible with partial income gets partial benefit. - # Flat grant: $376 - # Countable income: $200 +- name: Case 2, eligible with partial income gets partial benefit # Benefit: $376 - $200 = $176 period: 2024-01 input: - people: - person1: - age: 30 - person2: - age: 5 - spm_units: - spm_unit: - members: [person1, person2] - la_fitap_eligible: true - la_fitap_flat_grant: 376 - la_fitap_countable_income: 200 - households: - household: - members: [person1, person2] - state_code: LA + state_code: LA + la_fitap_eligible: true + la_fitap_flat_grant: 376 + la_fitap_countable_income: 200 output: la_fitap: 176 -- name: Case 3, eligible with income equal to flat grant gets zero. - # Flat grant: $376 - # Countable income: $376 - # Benefit: $376 - $376 = $0 - period: 2024-01 - input: - people: - person1: - age: 30 - person2: - age: 5 - spm_units: - spm_unit: - members: [person1, person2] - la_fitap_eligible: true - la_fitap_flat_grant: 376 - la_fitap_countable_income: 376 - households: - household: - members: [person1, person2] - state_code: LA - output: - la_fitap: 0 - -- name: Case 4, ineligible household gets zero benefit. - period: 2024-01 - input: - people: - person1: - age: 30 - person2: - age: 5 - spm_units: - spm_unit: - members: [person1, person2] - la_fitap_eligible: false - la_fitap_flat_grant: 376 - la_fitap_countable_income: 0 - households: - household: - members: [person1, person2] - state_code: LA - output: - la_fitap: 0 - -- name: Case 5, benefit exactly at minimum threshold. - # Flat grant: $376 - # Countable income: $366 - # Benefit: $376 - $366 = $10 (at minimum) - period: 2024-01 - input: - people: - person1: - age: 30 - person2: - age: 5 - spm_units: - spm_unit: - members: [person1, person2] - la_fitap_eligible: true - la_fitap_flat_grant: 376 - la_fitap_countable_income: 366 - households: - household: - members: [person1, person2] - state_code: LA - output: - la_fitap: 10 - -- name: Case 6, benefit below minimum is not issued. - # Flat grant: $376 - # Countable income: $370 - # Calculated benefit: $376 - $370 = $6 - # $6 < $10 minimum, so no payment issued - period: 2024-01 - input: - people: - person1: - age: 30 - person2: - age: 5 - spm_units: - spm_unit: - members: [person1, person2] - la_fitap_eligible: true - la_fitap_flat_grant: 376 - la_fitap_countable_income: 370 - households: - household: - members: [person1, person2] - state_code: LA - output: - la_fitap: 0 - -- name: Case 7, larger family with higher flat grant. - # Flat grant (family of 4): $568 - # Countable income: $250 - # Benefit: $568 - $250 = $318 - period: 2024-01 - input: - people: - person1: - age: 35 - person2: - age: 33 - person3: - age: 10 - person4: - age: 7 - spm_units: - spm_unit: - members: [person1, person2, person3, person4] - la_fitap_eligible: true - la_fitap_flat_grant: 568 - la_fitap_countable_income: 250 - households: - household: - members: [person1, person2, person3, person4] - state_code: LA - output: - la_fitap: 318 - -# ============================================================================= -# EDGE CASES -# ============================================================================= - -- name: Edge case, benefit just at minimum threshold of ten dollars. - # Flat grant: $244 (size 1) - # Countable income: $234 - # Calculated benefit: $244 - $234 = $10 (exactly at minimum) - # $10 >= $10 minimum, so payment issued - period: 2024-01 - input: - people: - person1: - age: 30 - spm_units: - spm_unit: - members: [person1] - la_fitap_eligible: true - la_fitap_flat_grant: 244 - la_fitap_countable_income: 234 - households: - household: - members: [person1] - state_code: LA - output: - la_fitap: 10 - -- name: Edge case, benefit at nine dollars is below minimum. - # Flat grant: $244 (size 1) - # Countable income: $235 - # Calculated benefit: $244 - $235 = $9 - # $9 < $10 minimum, so no payment issued - period: 2024-01 - input: - people: - person1: - age: 30 - spm_units: - spm_unit: - members: [person1] - la_fitap_eligible: true - la_fitap_flat_grant: 244 - la_fitap_countable_income: 235 - households: - household: - members: [person1] - state_code: LA - output: - la_fitap: 0 - -- name: Edge case, benefit at eleven dollars just above minimum. - # Flat grant: $244 (size 1) - # Countable income: $233 - # Calculated benefit: $244 - $233 = $11 - # $11 > $10 minimum, so full $11 payment issued - period: 2024-01 - input: - people: - person1: - age: 30 - spm_units: - spm_unit: - members: [person1] - la_fitap_eligible: true - la_fitap_flat_grant: 244 - la_fitap_countable_income: 233 - households: - household: - members: [person1] - state_code: LA - output: - la_fitap: 11 - -- name: Edge case, benefit at one dollar is below minimum. - # Flat grant: $376 - # Countable income: $375 - # Calculated benefit: $376 - $375 = $1 - # $1 < $10 minimum, so no payment issued - period: 2024-01 - input: - people: - person1: - age: 30 - person2: - age: 5 - spm_units: - spm_unit: - members: [person1, person2] - la_fitap_eligible: true - la_fitap_flat_grant: 376 - la_fitap_countable_income: 375 - households: - household: - members: [person1, person2] - state_code: LA - output: - la_fitap: 0 - -- name: Edge case, very large family size 9 with no income gets full benefit. - # Flat grant (family of 9): $954 - # Countable income: $0 - # Benefit: $954 - $0 = $954 (maximum possible for size 9) - period: 2024-01 - input: - people: - person1: - age: 45 - person2: - age: 43 - person3: - age: 17 - person4: - age: 15 - person5: - age: 13 - person6: - age: 11 - person7: - age: 9 - person8: - age: 7 - person9: - age: 5 - spm_units: - spm_unit: - members: [person1, person2, person3, person4, person5, person6, person7, person8, person9] - la_fitap_eligible: true - la_fitap_flat_grant: 954 - la_fitap_countable_income: 0 - households: - household: - members: [person1, person2, person3, person4, person5, person6, person7, person8, person9] - state_code: LA - output: - la_fitap: 954 - -- name: Edge case, very large family size 10 with no income at cap. - # Flat grant (family of 10+): $954 (capped at size 10) - # Countable income: $0 - # Benefit: $954 - $0 = $954 (maximum possible) - period: 2024-01 - input: - people: - person1: - age: 45 - person2: - age: 43 - person3: - age: 17 - person4: - age: 15 - person5: - age: 13 - person6: - age: 11 - person7: - age: 9 - person8: - age: 7 - person9: - age: 5 - person10: - age: 3 - spm_units: - spm_unit: - members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10] - la_fitap_eligible: true - la_fitap_flat_grant: 954 - la_fitap_countable_income: 0 - households: - household: - members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10] - state_code: LA - output: - la_fitap: 954 - -- name: Edge case, income exceeds flat grant resulting in zero benefit. - # Flat grant: $376 - # Countable income: $400 (exceeds flat grant) - # Calculated benefit: max($376 - $400, 0) = max(-$24, 0) = $0 - # Note: This household would be income ineligible anyway +- name: Case 3, ineligible gets zero period: 2024-01 input: - people: - person1: - age: 30 - person2: - age: 5 - spm_units: - spm_unit: - members: [person1, person2] - la_fitap_eligible: true - la_fitap_flat_grant: 376 - la_fitap_countable_income: 400 - households: - household: - members: [person1, person2] - state_code: LA + state_code: LA + la_fitap_eligible: false + la_fitap_flat_grant: 376 + la_fitap_countable_income: 0 output: la_fitap: 0 - -- name: Edge case, very high income far exceeding flat grant. - # Flat grant: $568 (family of 4) - # Countable income: $2,000 (very high, exceeds flat grant by $1,432) - # Calculated benefit: max($568 - $2,000, 0) = $0 - period: 2024-01 - input: - people: - person1: - age: 35 - person2: - age: 33 - person3: - age: 10 - person4: - age: 7 - spm_units: - spm_unit: - members: [person1, person2, person3, person4] - la_fitap_eligible: true - la_fitap_flat_grant: 568 - la_fitap_countable_income: 2_000 - households: - household: - members: [person1, person2, person3, person4] - state_code: LA - output: - la_fitap: 0 - -- name: Edge case, single person full benefit no income. - # Flat grant (family of 1): $244 - # Countable income: $0 - # Benefit: $244 - $0 = $244 - period: 2024-01 - input: - people: - person1: - age: 30 - spm_units: - spm_unit: - members: [person1] - la_fitap_eligible: true - la_fitap_flat_grant: 244 - la_fitap_countable_income: 0 - households: - household: - members: [person1] - state_code: LA - output: - la_fitap: 244 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_countable_earned_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_countable_earned_income.yaml deleted file mode 100644 index 56633d69bd4..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_countable_earned_income.yaml +++ /dev/null @@ -1,256 +0,0 @@ -# Louisiana FITAP Countable Earned Income Unit Tests -# Tests earned income after deductions for LA FITAP program -# Deductions: $120 standard + $900 time-limited per employed member per month -# Reference: https://ldh.la.gov/page/fitap -# NOTE: Time-limited deduction normally only available for 6 months of employment, -# but PolicyEngine cannot track employment duration, so it's applied always. - -- name: Case 1, no earned income results in zero countable earned income. - period: 2024-01 - input: - people: - person1: - employment_income_before_lsr: 0 - spm_units: - spm_unit: - members: [person1] - households: - household: - members: [person1] - state_code: LA - output: - la_fitap_countable_earned_income: 0 - -- name: Case 2, single earner with deductions exceeding income. - # Monthly gross: $800 - # Deductions: $120 + $900 = $1,020 - # Countable: max($800 - $1,020, 0) = $0 - period: 2024-01 - input: - people: - person1: - employment_income_before_lsr: 9_600 # $800/month - spm_units: - spm_unit: - members: [person1] - households: - household: - members: [person1] - state_code: LA - output: - la_fitap_countable_earned_income: 0 - -- name: Case 3, single earner with income exceeding deductions. - # Monthly gross: $1,500 - # Deductions: $120 + $900 = $1,020 - # Countable: $1,500 - $1,020 = $480 - period: 2024-01 - input: - people: - person1: - employment_income_before_lsr: 18_000 # $1,500/month - spm_units: - spm_unit: - members: [person1] - households: - household: - members: [person1] - state_code: LA - output: - la_fitap_countable_earned_income: 480 - -- name: Case 4, two earners with income exceeding deductions. - # Person 1 monthly gross: $1,200 - # Person 1 deductions: $120 + $900 = $1,020 - # Person 1 countable: max($1,200 - $1,020, 0) = $180 - # Person 2 monthly gross: $800 - # Person 2 deductions: $120 + $900 = $1,020 - # Person 2 countable: max($800 - $1,020, 0) = $0 - # Total countable earned: $180 - period: 2024-01 - input: - people: - person1: - employment_income_before_lsr: 14_400 # $1,200/month - person2: - employment_income_before_lsr: 9_600 # $800/month - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: LA - output: - la_fitap_countable_earned_income: [180, 0] - -- name: Case 5, earner at exact deduction threshold. - # Monthly gross: $1,020 - # Deductions: $120 + $900 = $1,020 - # Countable: $1,020 - $1,020 = $0 - period: 2024-01 - input: - people: - person1: - employment_income_before_lsr: 12_240 # $1,020/month - spm_units: - spm_unit: - members: [person1] - households: - household: - members: [person1] - state_code: LA - output: - la_fitap_countable_earned_income: 0 - -- name: Case 6, self-employment income treated same as wages. - # Monthly gross: $1,500 (self-employment) - # Deductions: $120 + $900 = $1,020 - # Countable: $1,500 - $1,020 = $480 - period: 2024-01 - input: - people: - person1: - self_employment_income_before_lsr: 18_000 # $1,500/month - spm_units: - spm_unit: - members: [person1] - households: - household: - members: [person1] - state_code: LA - output: - la_fitap_countable_earned_income: 480 - -# ============================================================================= -# EDGE CASES -# ============================================================================= - -- name: Edge case, zero income explicitly results in zero deduction and countable. - # Verifies that zero gross earned income produces zero countable earned income. - # Deductions should not apply when there is no earned income. - period: 2024-01 - input: - people: - person1: - employment_income_before_lsr: 0 - self_employment_income_before_lsr: 0 - spm_units: - spm_unit: - members: [person1] - households: - household: - members: [person1] - state_code: LA - output: - la_fitap_countable_earned_income: 0 - -- name: Edge case, income exactly one dollar over deduction threshold. - # Monthly gross: $1,021 (exactly $1 over $1,020 deduction) - # Deductions: $120 + $900 = $1,020 - # Countable: $1,021 - $1,020 = $1 - # Tests boundary condition at deduction threshold - period: 2024-01 - input: - people: - person1: - employment_income_before_lsr: 12_252 # $1,021/month - spm_units: - spm_unit: - members: [person1] - households: - household: - members: [person1] - state_code: LA - output: - la_fitap_countable_earned_income: 1 - -- name: Edge case, very high income far exceeds deduction. - # Monthly gross: $10,000 (extreme income scenario) - # Deductions: $120 + $900 = $1,020 - # Countable: $10,000 - $1,020 = $8,980 - # Tests that high income is handled correctly - period: 2024-01 - input: - people: - person1: - employment_income_before_lsr: 120_000 # $10,000/month - spm_units: - spm_unit: - members: [person1] - households: - household: - members: [person1] - state_code: LA - output: - la_fitap_countable_earned_income: 8_980 - -- name: Edge case, multiple earners where one has zero income. - # Person 1 monthly gross: $1,500 (employed) - # Person 1 deductions: $120 + $900 = $1,020 - # Person 1 countable: $1,500 - $1,020 = $480 - # Person 2 monthly gross: $0 (not employed, no deduction) - # Person 2 countable: $0 - # Total countable earned: $480 - # Verifies deductions only apply to employed members - period: 2024-01 - input: - people: - person1: - employment_income_before_lsr: 18_000 # $1,500/month - person2: - employment_income_before_lsr: 0 - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: LA - output: - la_fitap_countable_earned_income: [480, 0] - -- name: Edge case, two high earners both exceed deduction threshold. - # Person 1 monthly gross: $2,000 - # Person 1 deductions: $120 + $900 = $1,020 - # Person 1 countable: $2,000 - $1,020 = $980 - # Person 2 monthly gross: $1,500 - # Person 2 deductions: $120 + $900 = $1,020 - # Person 2 countable: $1,500 - $1,020 = $480 - # Total countable earned: $980 + $480 = $1,460 - period: 2024-01 - input: - people: - person1: - employment_income_before_lsr: 24_000 # $2,000/month - person2: - employment_income_before_lsr: 18_000 # $1,500/month - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: LA - output: - la_fitap_countable_earned_income: [980, 480] - -- name: Edge case, combined employment and self-employment same person. - # Person 1 monthly gross: $900 employment + $600 self-employment = $1,500 total - # Deductions: $120 + $900 = $1,020 (single set applied to total earned) - # Countable: $1,500 - $1,020 = $480 - period: 2024-01 - input: - people: - person1: - employment_income_before_lsr: 10_800 # $900/month - self_employment_income_before_lsr: 7_200 # $600/month - spm_units: - spm_unit: - members: [person1] - households: - household: - members: [person1] - state_code: LA - output: - la_fitap_countable_earned_income: 480 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_countable_income.yaml deleted file mode 100644 index 55110993a64..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_countable_income.yaml +++ /dev/null @@ -1,56 +0,0 @@ -# Louisiana FITAP Countable Income Unit Tests -# Tests total countable income = countable earned + unearned income -# Unearned income counted dollar-for-dollar (no disregards) -# Reference: https://ldh.la.gov/page/fitap - -- name: Case 1, no income results in zero countable income. - period: 2024-01 - input: - state_code: LA - la_fitap_countable_earned_income: 0 - tanf_gross_unearned_income: 0 - output: - la_fitap_countable_income: 0 - -- name: Case 2, only countable earned income. - period: 2024-01 - input: - state_code: LA - la_fitap_countable_earned_income: 300 - tanf_gross_unearned_income: 0 - output: - la_fitap_countable_income: 300 - -- name: Case 3, only unearned income. - # Unearned income counted in full - period: 2024-01 - input: - state_code: LA - la_fitap_countable_earned_income: 0 - tanf_gross_unearned_income: 200 - output: - la_fitap_countable_income: 200 - -- name: Case 4, both earned and unearned income. - # Countable earned: $300 - # Unearned: $150 - # Total countable: $300 + $150 = $450 - period: 2024-01 - input: - state_code: LA - la_fitap_countable_earned_income: 300 - tanf_gross_unearned_income: 150 - output: - la_fitap_countable_income: 450 - -- name: Case 5, larger combined income. - # Countable earned: $480 - # Unearned: $250 - # Total countable: $480 + $250 = $730 - period: 2024-01 - input: - state_code: LA - la_fitap_countable_earned_income: 480 - tanf_gross_unearned_income: 250 - output: - la_fitap_countable_income: 730 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_earned_income_after_disregard.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_earned_income_after_disregard.yaml new file mode 100644 index 00000000000..ff29d9d8f1c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_earned_income_after_disregard.yaml @@ -0,0 +1,48 @@ +- name: Case 1, income at or below total deduction threshold + period: 2024-01 + input: + people: + person1: + tanf_gross_earned_income: 0 + person2: + tanf_gross_earned_income: 100 + person3: + tanf_gross_earned_income: 120 + person4: + tanf_gross_earned_income: 500 + person5: + tanf_gross_earned_income: 1_020 + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: LA + output: + la_fitap_earned_income_after_disregard: [0, 0, 0, 0, 0] + # Person 1: $0 → $0 + # Person 2: $100 (below standard $120) → $0 + # Person 3: $120 (exactly at standard) → $0 + # Person 4: $500 (between standard and total) → $0 + # Person 5: $1,020 (exactly at total deduction) → $0 + +- name: Case 2, income exceeding total deduction threshold + period: 2024-01 + input: + people: + person1: + tanf_gross_earned_income: 1_021 + person2: + tanf_gross_earned_income: 1_500 + person3: + tanf_gross_earned_income: 3_000 + person4: + tanf_gross_earned_income: 800 + households: + household: + members: [person1, person2, person3, person4] + state_code: LA + output: + la_fitap_earned_income_after_disregard: [1, 480, 1_980, 0] + # Person 1: $1,021 → max(1021-120, 0)=901 → max(901-900, 0) = $1 + # Person 2: $1,500 → max(1500-120, 0)=1380 → max(1380-900, 0) = $480 + # Person 3: $3,000 → max(3000-120, 0)=2880 → max(2880-900, 0) = $1,980 + # Person 4: $800 → max(800-120, 0)=680 → max(680-900, 0) = $0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_eligible.yaml new file mode 100644 index 00000000000..ddbc10f4c79 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_eligible.yaml @@ -0,0 +1,81 @@ +- name: Case 1, all conditions met is eligible + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + is_demographic_tanf_eligible: true + la_fitap_income_eligible: true + households: + household: + members: [person1, person2] + state_code: LA + output: + la_fitap_eligible: true + +- name: Case 2, demographic ineligible + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 25 + spm_units: + spm_unit: + members: [person1, person2] + is_demographic_tanf_eligible: false + la_fitap_income_eligible: true + households: + household: + members: [person1, person2] + state_code: LA + output: + la_fitap_eligible: false + +- name: Case 3, income ineligible + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + is_demographic_tanf_eligible: true + la_fitap_income_eligible: false + households: + household: + members: [person1, person2] + state_code: LA + output: + la_fitap_eligible: false + +- name: Case 4, immigration ineligible + period: 2024-01 + input: + people: + person1: + age: 30 + is_citizen_or_legal_immigrant: false + person2: + age: 5 + is_citizen_or_legal_immigrant: false + spm_units: + spm_unit: + members: [person1, person2] + is_demographic_tanf_eligible: true + la_fitap_income_eligible: true + households: + household: + members: [person1, person2] + state_code: LA + output: + la_fitap_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_flat_grant.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_flat_grant.yaml index 8df41d9333d..70dee2d3ec5 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_flat_grant.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_flat_grant.yaml @@ -1,377 +1,57 @@ -# Louisiana FITAP Flat Grant Unit Tests -# Tests flat grant amounts by household size (effective January 2022) -# Reference: https://ldh.la.gov/page/fitap -# Reference: https://www.dcfs.louisiana.gov/news/louisiana-to-increase-tanf-cash-assistance-benefits-beginning-january-2022 - -- name: Case 1, household size 1 flat grant. - period: 2024-01 - input: - people: - person1: - age: 25 - spm_units: - spm_unit: - members: [person1] - households: - household: - members: [person1] - state_code: LA - output: - la_fitap_flat_grant: 244 - -- name: Case 2, household size 2 flat grant. - period: 2024-01 - input: - people: - person1: - age: 30 - person2: - age: 5 - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: LA - output: - la_fitap_flat_grant: 376 - -- name: Case 3, household size 3 flat grant. - period: 2024-01 +- name: Case 1, pre-2022 size 1 + period: 2017-01 input: - people: - person1: - age: 30 - person2: - age: 8 - person3: - age: 6 - spm_units: - spm_unit: - members: [person1, person2, person3] - households: - household: - members: [person1, person2, person3] - state_code: LA + spm_unit_size: 1 + state_code: LA output: - la_fitap_flat_grant: 484 + la_fitap_flat_grant: 122 -- name: Case 4, household size 4 flat grant. - period: 2024-01 +- name: Case 2, pre-2022 size 3 + period: 2017-01 input: - people: - person1: - age: 35 - person2: - age: 33 - person3: - age: 10 - person4: - age: 7 - spm_units: - spm_unit: - members: [person1, person2, person3, person4] - households: - household: - members: [person1, person2, person3, person4] - state_code: LA + spm_unit_size: 3 + state_code: LA output: - la_fitap_flat_grant: 568 + la_fitap_flat_grant: 240 -- name: Case 5, household size 5 flat grant. - period: 2024-01 +- name: Case 3, pre-2022 size 20 exceeds table + # grant[18] + grant[2] - adjustment = 839 + 188 - 50 = 977 + period: 2017-01 input: - people: - person1: - age: 40 - person2: - age: 38 - person3: - age: 15 - person4: - age: 12 - person5: - age: 8 - spm_units: - spm_unit: - members: [person1, person2, person3, person4, person5] - households: - household: - members: [person1, person2, person3, person4, person5] - state_code: LA + spm_unit_size: 20 + state_code: LA output: - la_fitap_flat_grant: 654 + la_fitap_flat_grant: 977 -- name: Case 6, household size 6 flat grant. - period: 2024-01 +- name: Case 4, post-2022 size 2 + period: 2022-01 input: - people: - person1: - age: 40 - person2: - age: 38 - person3: - age: 16 - person4: - age: 14 - person5: - age: 10 - person6: - age: 6 - spm_units: - spm_unit: - members: [person1, person2, person3, person4, person5, person6] - households: - household: - members: [person1, person2, person3, person4, person5, person6] - state_code: LA + spm_unit_size: 2 + state_code: LA output: - la_fitap_flat_grant: 732 - -- name: Case 7, household size 9 flat grant (max in table). - period: 2024-01 - input: - people: - person1: - age: 45 - person2: - age: 43 - person3: - age: 17 - person4: - age: 15 - person5: - age: 13 - person6: - age: 11 - person7: - age: 9 - person8: - age: 7 - person9: - age: 5 - spm_units: - spm_unit: - members: [person1, person2, person3, person4, person5, person6, person7, person8, person9] - households: - household: - members: [person1, person2, person3, person4, person5, person6, person7, person8, person9] - state_code: LA - output: - la_fitap_flat_grant: 954 - -- name: Case 8, pre-2022 flat grant (historical). - # Before January 2022, benefits were half current amounts - period: 2021-01 - input: - people: - person1: - age: 30 - person2: - age: 5 - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: LA - output: - la_fitap_flat_grant: 188 - -# ============================================================================= -# EDGE CASES -# ============================================================================= - -- name: Edge case, single person household minimum size. - # Tests that single-person household gets the minimum flat grant. - # Size 1 = $244 - period: 2024-01 - input: - people: - person1: - age: 30 - spm_units: - spm_unit: - members: [person1] - households: - household: - members: [person1] - state_code: LA - output: - la_fitap_flat_grant: 244 - -- name: Edge case, household size 7 flat grant. - # Size 7 = $804 - period: 2024-01 - input: - people: - person1: - age: 40 - person2: - age: 38 - person3: - age: 16 - person4: - age: 14 - person5: - age: 12 - person6: - age: 10 - person7: - age: 8 - spm_units: - spm_unit: - members: [person1, person2, person3, person4, person5, person6, person7] - households: - household: - members: [person1, person2, person3, person4, person5, person6, person7] - state_code: LA - output: - la_fitap_flat_grant: 804 - -- name: Edge case, household size 8 flat grant. - # Size 8 = $882 - period: 2024-01 - input: - people: - person1: - age: 42 - person2: - age: 40 - person3: - age: 17 - person4: - age: 15 - person5: - age: 13 - person6: - age: 11 - person7: - age: 9 - person8: - age: 7 - spm_units: - spm_unit: - members: [person1, person2, person3, person4, person5, person6, person7, person8] - households: - household: - members: [person1, person2, person3, person4, person5, person6, person7, person8] - state_code: LA - output: - la_fitap_flat_grant: 882 + la_fitap_flat_grant: 376 -- name: Edge case, household size 10 at cap. - # Size 10 = $954 (same as size 9, cap applies) - # This tests that size 10 returns the capped value - period: 2024-01 +- name: Case 5, post-2022 size 4 + period: 2022-01 input: - people: - person1: - age: 45 - person2: - age: 43 - person3: - age: 17 - person4: - age: 15 - person5: - age: 13 - person6: - age: 11 - person7: - age: 9 - person8: - age: 7 - person9: - age: 5 - person10: - age: 3 - spm_units: - spm_unit: - members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10] - households: - household: - members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10] - state_code: LA + spm_unit_size: 4 + state_code: LA output: - la_fitap_flat_grant: 954 + la_fitap_flat_grant: 568 -- name: Edge case, household size 11 exceeds cap. - # Size 11 should cap at size 10 value = $954 - # Tests that sizes beyond 10 still receive the maximum flat grant - period: 2024-01 +- name: Case 6, post-2022 size 18 max in table + period: 2022-01 input: - people: - person1: - age: 45 - person2: - age: 43 - person3: - age: 17 - person4: - age: 15 - person5: - age: 13 - person6: - age: 11 - person7: - age: 9 - person8: - age: 7 - person9: - age: 5 - person10: - age: 3 - person11: - age: 1 - spm_units: - spm_unit: - members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11] - households: - household: - members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11] - state_code: LA + spm_unit_size: 18 + state_code: LA output: - la_fitap_flat_grant: 954 + la_fitap_flat_grant: 1_678 -- name: Edge case, very large household size 12 still caps at size 10. - # Size 12 should cap at size 10 value = $954 - # Tests extreme household sizes are handled correctly - period: 2024-01 +- name: Case 7, post-2022 size 19 exceeds table + # grant[18] + grant[1] - adjustment = 1678 + 244 - 100 = 1822 + period: 2022-01 input: - people: - person1: - age: 48 - person2: - age: 46 - person3: - age: 17 - person4: - age: 16 - person5: - age: 15 - person6: - age: 14 - person7: - age: 12 - person8: - age: 10 - person9: - age: 8 - person10: - age: 6 - person11: - age: 4 - person12: - age: 2 - spm_units: - spm_unit: - members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11, person12] - households: - household: - members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11, person12] - state_code: LA + spm_unit_size: 19 + state_code: LA output: - la_fitap_flat_grant: 954 + la_fitap_flat_grant: 1_822 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_income_eligible.yaml index 5a6d8b273d8..fa2174a86d9 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_income_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_income_eligible.yaml @@ -1,22 +1,4 @@ -# Louisiana FITAP Income Eligibility Unit Tests -# Income limit equals the flat grant amount for household size -# Reference: https://ldh.la.gov/page/fitap -# "Monthly countable income, both earned and unearned, cannot exceed -# the flat grant amount for the number of persons in the assistance unit." - -- name: Case 1, no income is income eligible. - period: 2024-01 - input: - state_code: LA - la_fitap_countable_income: 0 - la_fitap_flat_grant: 376 # Family of 2 - output: - la_fitap_income_eligible: true - -- name: Case 2, income below flat grant is eligible. - # Countable income: $200 - # Flat grant (family of 2): $376 - # $200 < $376 = eligible +- name: Case 1, income below flat grant is eligible period: 2024-01 input: state_code: LA @@ -25,10 +7,7 @@ output: la_fitap_income_eligible: true -- name: Case 3, income equal to flat grant is eligible. - # Countable income: $376 - # Flat grant (family of 2): $376 - # $376 <= $376 = eligible +- name: Case 2, income equal to flat grant is eligible period: 2024-01 input: state_code: LA @@ -37,22 +16,7 @@ output: la_fitap_income_eligible: true -- name: Case 4, income above flat grant is ineligible. - # Countable income: $400 - # Flat grant (family of 2): $376 - # $400 > $376 = ineligible - period: 2024-01 - input: - state_code: LA - la_fitap_countable_income: 400 - la_fitap_flat_grant: 376 - output: - la_fitap_income_eligible: false - -- name: Case 5, income just above flat grant is ineligible. - # Countable income: $377 - # Flat grant (family of 2): $376 - # $377 > $376 = ineligible +- name: Case 3, income above flat grant is ineligible period: 2024-01 input: state_code: LA @@ -60,133 +24,3 @@ la_fitap_flat_grant: 376 output: la_fitap_income_eligible: false - -- name: Case 6, larger family higher income limit. - # Countable income: $450 - # Flat grant (family of 3): $484 - # $450 < $484 = eligible - period: 2024-01 - input: - state_code: LA - la_fitap_countable_income: 450 - la_fitap_flat_grant: 484 - output: - la_fitap_income_eligible: true - -# ============================================================================= -# EDGE CASES -# ============================================================================= - -- name: Edge case, income exactly one dollar below limit is eligible. - # Countable income: $375 - # Flat grant (family of 2): $376 - # $375 < $376 = eligible - # Tests boundary one dollar below threshold - period: 2024-01 - input: - state_code: LA - la_fitap_countable_income: 375 - la_fitap_flat_grant: 376 - output: - la_fitap_income_eligible: true - -- name: Edge case, income exactly one dollar above limit is ineligible. - # Countable income: $245 - # Flat grant (family of 1): $244 - # $245 > $244 = ineligible - # Tests boundary one dollar above threshold for smallest family size - period: 2024-01 - input: - state_code: LA - la_fitap_countable_income: 245 - la_fitap_flat_grant: 244 - output: - la_fitap_income_eligible: false - -- name: Edge case, income exactly at limit for single person household. - # Countable income: $244 - # Flat grant (family of 1): $244 - # $244 <= $244 = eligible - period: 2024-01 - input: - state_code: LA - la_fitap_countable_income: 244 - la_fitap_flat_grant: 244 - output: - la_fitap_income_eligible: true - -- name: Edge case, income exactly one dollar below limit for single person. - # Countable income: $243 - # Flat grant (family of 1): $244 - # $243 < $244 = eligible - period: 2024-01 - input: - state_code: LA - la_fitap_countable_income: 243 - la_fitap_flat_grant: 244 - output: - la_fitap_income_eligible: true - -- name: Edge case, very high income far above limit. - # Countable income: $2,000 - # Flat grant (family of 2): $376 - # $2,000 > $376 = ineligible (clearly exceeds limit) - period: 2024-01 - input: - state_code: LA - la_fitap_countable_income: 2_000 - la_fitap_flat_grant: 376 - output: - la_fitap_income_eligible: false - -- name: Edge case, maximum family size income limit. - # Countable income: $954 - # Flat grant (family of 9): $954 - # $954 <= $954 = eligible - # Tests at maximum flat grant amount - period: 2024-01 - input: - state_code: LA - la_fitap_countable_income: 954 - la_fitap_flat_grant: 954 - output: - la_fitap_income_eligible: true - -- name: Edge case, income one dollar above maximum family size limit. - # Countable income: $955 - # Flat grant (family of 9): $954 - # $955 > $954 = ineligible - # Tests just above maximum flat grant amount - period: 2024-01 - input: - state_code: LA - la_fitap_countable_income: 955 - la_fitap_flat_grant: 954 - output: - la_fitap_income_eligible: false - -- name: Edge case, income one dollar below maximum family size limit. - # Countable income: $953 - # Flat grant (family of 9): $954 - # $953 < $954 = eligible - # Tests just below maximum flat grant amount - period: 2024-01 - input: - state_code: LA - la_fitap_countable_income: 953 - la_fitap_flat_grant: 954 - output: - la_fitap_income_eligible: true - -- name: Edge case, fractional income just above limit. - # Countable income: $376.01 - # Flat grant (family of 2): $376 - # $376.01 > $376 = ineligible - # Tests fractional dollar precision - period: 2024-01 - input: - state_code: LA - la_fitap_countable_income: 376.01 - la_fitap_flat_grant: 376 - output: - la_fitap_income_eligible: false diff --git a/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_eligible.py b/policyengine_us/variables/gov/states/la/dcfs/fitap/eligibility/la_fitap_eligible.py similarity index 63% rename from policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_eligible.py rename to policyengine_us/variables/gov/states/la/dcfs/fitap/eligibility/la_fitap_eligible.py index 2a6ce1d8b96..516f4a92492 100644 --- a/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_eligible.py +++ b/policyengine_us/variables/gov/states/la/dcfs/fitap/eligibility/la_fitap_eligible.py @@ -6,22 +6,22 @@ class la_fitap_eligible(Variable): entity = SPMUnit label = "Louisiana FITAP eligible" definition_period = MONTH - reference = "https://ldh.la.gov/page/fitap" + reference = ( + "https://www.doa.la.gov/media/tp3lmkyg/67.pdf#page=37", + "https://www.doa.la.gov/media/tp3lmkyg/67.pdf#page=38", + ) defined_for = StateCode.LA def formula(spm_unit, period, parameters): - # Use federal demographic eligibility + # Per LAC 67:III.1221: Child must be under 18 or 18 and in school demographic_eligible = spm_unit("is_demographic_tanf_eligible", period) - # Must have at least one U.S. citizen or qualified immigrant + # Per LAC 67:III.1223: Must be US citizen or qualified alien immigration_eligible = ( add(spm_unit, period, ["is_citizen_or_legal_immigrant"]) > 0 ) - # Income eligibility (countable income <= flat grant) + # Per LAC 67:III.1229: Countable income <= flat grant income_eligible = spm_unit("la_fitap_income_eligible", period) - # NOTE: Louisiana excludes all resources from eligibility - # determination, so no resource test is needed. - return demographic_eligible & immigration_eligible & income_eligible diff --git a/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_income_eligible.py b/policyengine_us/variables/gov/states/la/dcfs/fitap/eligibility/la_fitap_income_eligible.py similarity index 72% rename from policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_income_eligible.py rename to policyengine_us/variables/gov/states/la/dcfs/fitap/eligibility/la_fitap_income_eligible.py index a799b297139..a0a80ae8520 100644 --- a/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_income_eligible.py +++ b/policyengine_us/variables/gov/states/la/dcfs/fitap/eligibility/la_fitap_income_eligible.py @@ -6,11 +6,11 @@ class la_fitap_income_eligible(Variable): entity = SPMUnit label = "Louisiana FITAP income eligible" definition_period = MONTH - reference = "https://ldh.la.gov/page/fitap" + reference = "https://www.law.cornell.edu/regulations/louisiana/La-Admin-Code-tit-67-SS-III-1229" defined_for = StateCode.LA def formula(spm_unit, period, parameters): - # Per FITAP rules: countable income cannot exceed the flat grant + # Per LAC 67:III.1229.E: Countable income cannot exceed flat grant countable_income = spm_unit("la_fitap_countable_income", period) flat_grant = spm_unit("la_fitap_flat_grant", period) return countable_income <= flat_grant diff --git a/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_countable_income.py b/policyengine_us/variables/gov/states/la/dcfs/fitap/income/la_fitap_countable_income.py similarity index 67% rename from policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_countable_income.py rename to policyengine_us/variables/gov/states/la/dcfs/fitap/income/la_fitap_countable_income.py index f5f8cc8c7a5..8f567c68c11 100644 --- a/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_countable_income.py +++ b/policyengine_us/variables/gov/states/la/dcfs/fitap/income/la_fitap_countable_income.py @@ -7,10 +7,10 @@ class la_fitap_countable_income(Variable): label = "Louisiana FITAP countable income" unit = USD definition_period = MONTH - reference = "https://ldh.la.gov/page/fitap" + reference = "https://www.law.cornell.edu/regulations/louisiana/La-Admin-Code-tit-67-SS-III-1229" defined_for = StateCode.LA adds = [ - "la_fitap_countable_earned_income", + "la_fitap_earned_income_after_disregard", "tanf_gross_unearned_income", ] diff --git a/policyengine_us/variables/gov/states/la/dcfs/fitap/income/la_fitap_earned_income_after_disregard.py b/policyengine_us/variables/gov/states/la/dcfs/fitap/income/la_fitap_earned_income_after_disregard.py new file mode 100644 index 00000000000..768b4677e31 --- /dev/null +++ b/policyengine_us/variables/gov/states/la/dcfs/fitap/income/la_fitap_earned_income_after_disregard.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class la_fitap_earned_income_after_disregard(Variable): + value_type = float + entity = Person + label = "Louisiana FITAP earned income after disregard" + unit = USD + definition_period = MONTH + reference = "https://www.law.cornell.edu/regulations/louisiana/La-Admin-Code-tit-67-SS-III-1229" + defined_for = StateCode.LA + + def formula(person, period, parameters): + p = parameters(period).gov.states.la.dcfs.fitap.income.deductions + gross_earned = person("tanf_gross_earned_income", period) + + # Per LAC 67:III.1229.C: + # 1. Apply $120 standard deduction + # 2. Apply $900 time-limited deduction (6-month limit not modeled yet) + after_standard = max_(gross_earned - p.standard, 0) + return max_(after_standard - p.time_limited, 0) diff --git a/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap.py b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap.py index 7afdf97490b..8c6e63087e2 100644 --- a/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap.py +++ b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap.py @@ -7,16 +7,12 @@ class la_fitap(Variable): label = "Louisiana FITAP" unit = USD definition_period = MONTH - reference = "https://ldh.la.gov/page/fitap" + reference = "https://www.law.cornell.edu/regulations/louisiana/La-Admin-Code-tit-67-SS-III-1229" defined_for = "la_fitap_eligible" def formula(spm_unit, period, parameters): - p = parameters(period).gov.states.la.dcfs.fitap.benefit flat_grant = spm_unit("la_fitap_flat_grant", period) countable_income = spm_unit("la_fitap_countable_income", period) # Benefit = flat grant minus countable income - benefit = max_(flat_grant - countable_income, 0) - - # Benefits below minimum are not issued - return where(benefit >= p.minimum, benefit, 0) + return max_(flat_grant - countable_income, 0) diff --git a/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_countable_earned_income.py b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_countable_earned_income.py deleted file mode 100644 index 54bb3a0dade..00000000000 --- a/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_countable_earned_income.py +++ /dev/null @@ -1,16 +0,0 @@ -from policyengine_us.model_api import * - - -class la_fitap_countable_earned_income(Variable): - value_type = float - entity = Person - label = "Louisiana FITAP countable earned income" - unit = USD - definition_period = MONTH - reference = "https://ldh.la.gov/page/fitap" - defined_for = StateCode.LA - - def formula(person, period, parameters): - gross_earned = person("tanf_gross_earned_income", period) - deduction = person("la_fitap_earned_income_deduction", period) - return max_(gross_earned - deduction, 0) diff --git a/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_earned_income_deduction.py b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_earned_income_deduction.py deleted file mode 100644 index d418f9f60e4..00000000000 --- a/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_earned_income_deduction.py +++ /dev/null @@ -1,27 +0,0 @@ -from policyengine_us.model_api import * - - -class la_fitap_earned_income_deduction(Variable): - value_type = float - entity = Person - label = "Louisiana FITAP earned income deduction" - unit = USD - definition_period = MONTH - reference = "https://ldh.la.gov/page/fitap" - defined_for = StateCode.LA - - def formula(person, period, parameters): - p = parameters(period).gov.states.la.dcfs.fitap.income.deductions - gross_earned = person("tanf_gross_earned_income", period) - - # Per FITAP rules: deductions only apply to employed members - is_employed = gross_earned > 0 - - # NOTE: The $900 time-limited deduction is only available for - # the first 6 months of employment. PolicyEngine cannot track - # employment duration, so we apply it assuming qualification. - standard_deduction = p.standard - time_limited_deduction = p.time_limited - total_deduction = standard_deduction + time_limited_deduction - - return where(is_employed, total_deduction, 0) diff --git a/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_flat_grant.py b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_flat_grant.py index 2dd76df12b7..9e68d0c887d 100644 --- a/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_flat_grant.py +++ b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_flat_grant.py @@ -7,14 +7,26 @@ class la_fitap_flat_grant(Variable): label = "Louisiana FITAP flat grant" unit = USD definition_period = MONTH - reference = ( - "https://ldh.la.gov/page/fitap", - "https://www.dcfs.louisiana.gov/news/louisiana-to-increase-tanf-cash-assistance-benefits-beginning-january-2022", - ) + reference = "https://www.law.cornell.edu/regulations/louisiana/La-Admin-Code-tit-67-SS-III-1229" defined_for = StateCode.LA def formula(spm_unit, period, parameters): p = parameters(period).gov.states.la.dcfs.fitap.flat_grant size = spm_unit("spm_unit_size", period.this_year) - capped_size = min_(size, 10) - return p.amount[capped_size] + + # For size > 18: grant[18] + grant[excess] - adjustment + is_over_max = size > p.max_table_size + + # Base amount (capped at max_table_size) + capped_size = min_(size, p.max_table_size) + base_amount = p.amount[capped_size] + + # Excess calculation for size > 18 + excess_size = max_(size - p.max_table_size, 1) + excess_amount = p.amount[min_(excess_size, p.max_table_size)] + + return where( + is_over_max, + base_amount + excess_amount - p.excess_adjustment, + base_amount, + ) diff --git a/sources/working_references.md b/sources/working_references.md deleted file mode 100644 index ee7e2024aeb..00000000000 --- a/sources/working_references.md +++ /dev/null @@ -1,313 +0,0 @@ -# Collected Documentation - -## Louisiana FITAP (Family Independence Temporary Assistance Program) Implementation -**Collected**: 2026-01-04 -**Implementation Task**: Implement Louisiana TANF program (FITAP) - ---- - -## Official Program Name - -**Federal Program**: Temporary Assistance for Needy Families (TANF) -**State's Official Name**: Family Independence Temporary Assistance Program -**Abbreviation**: FITAP -**Source**: LA RS 46:231.2 - "There is hereby created the Family Independence Temporary Assistance Program" - -**Variable Prefix**: `la_tanf` - ---- - -## Regulatory Authority - -### Primary Sources - -1. **Louisiana Revised Statutes Title 46** - - RS 46:231 - Aid to needy families; definitions - - RS 46:231.2 - Family Independence Temporary Assistance Program - - RS 46:231.3 - FITAP benefits; prohibited uses - - URL: https://www.legis.la.gov/legis/Law.aspx?d=100599 - -2. **Louisiana Administrative Code Title 67, Part III** - - Subpart 5: Family Independence Temporary Assistance Program - - Chapter 5: Eligibility Requirements - - URL: https://www.doa.la.gov/media/tp3lmkyg/67.pdf - -3. **Louisiana Department of Health FITAP Page** - - URL: https://ldh.la.gov/page/fitap - -4. **Louisiana DCFS FITAP Page** - - URL: https://www.dcfs.louisiana.gov/page/fitap - -5. **DCFS Benefit Increase Announcement (January 2022)** - - URL: https://www.dcfs.louisiana.gov/news/louisiana-to-increase-tanf-cash-assistance-benefits-beginning-january-2022 - ---- - -## Non-Simulatable Rules (Architecture Limitation) - -### Time Limits (CANNOT ENFORCE - requires history) -- **24-of-60 Month Limit**: Cannot receive benefits for more than 24 months within any 60-month period -- **60-Month Lifetime Limit**: Lifetime limit of 60 months if the assistance unit includes a parent/caretaker relative -- There are exceptions to both limits - -### Time-Limited Deductions (APPLIED ALWAYS - cannot track months) -- **$900 Employment Deduction**: Time-limited deduction of $900 for six months for each employed member -- **Note**: This will be applied assuming the household qualifies since PolicyEngine cannot track employment duration - ---- - -## Income Eligibility Test - -### Single Income Test -Louisiana FITAP uses a unique income eligibility structure where **the income limit equals the flat grant amount** for the household size. - -**Rule**: Monthly countable income, both earned and unearned, cannot exceed the flat grant amount for the number of persons in the assistance unit. - -**Source**: Louisiana Department of Health FITAP page - "Monthly countable income, both earned and unearned, cannot exceed the flat grant amount for the number of persons in the assistance unit." - -### Benefit Calculation -**Formula**: Benefit = Flat Grant Amount - Total Countable Income - -**Source**: "Total countable income is subtracted from the flat grant amount to determine the client's grant amount." - ---- - -## Income Deductions & Disregards - -### Earned Income Deductions - -| Deduction Type | Amount | Level | Notes | -|---------------|--------|-------|-------| -| Standard Earned Income Deduction | $120 | Per employed member | Always available | -| Time-Limited Employment Deduction | $900 | Per employed member | For 6 months (cannot track) | -| Dependent Care Deduction | Varies | Per employed member | Certain requirements must be met | - -**Source**: Louisiana Department of Health FITAP page - "The allowable earned income deductions are: Standard earned income deduction of $120 for each employed member." - -**Implementation approach:** -- [x] $120 standard deduction per employed member (will implement) -- [x] $900 time-limited deduction (will implement as always available with comment noting limitation) -- [ ] Dependent care deduction (specific amounts not found in documentation) - -### Unearned Income -- Counted dollar-for-dollar (no disregards) -- Examples include: Child Support, alimony, unemployment benefits, Social Security benefits, SSI benefits, VA benefits, worker's compensation, pensions, contributions from friends/family - -### Child Support Policy -**No pass-through or disregard**: Louisiana does NOT pass through child support to TANF families or disregard it when calculating benefits. - -**Source**: NCSL Child Support Pass-Through and Disregard Policies - Louisiana shows "No" for both pass-through and disregard. - -**Requirement**: Client must assign any child support and medical support rights to the state and must cooperate with the agency's Child Support Enforcement Services. - ---- - -## Flat Grant Amounts (Payment Standards) - -### Current Amounts (Effective January 2022) - -| Household Size | Monthly Grant | -|----------------|---------------| -| 1 | $244 | -| 2 | $376 | -| 3 | $484 | -| 4 | $568 | -| 5 | $654 | -| 6 | $732 | -| 7 | $804 | -| 8 | $882 | -| 9 | $954 | - -**Source**: Louisiana Department of Health FITAP page (https://ldh.la.gov/page/fitap) and DCFS Benefit Increase Announcement (January 2022) - -**Note**: Benefits were doubled in January 2022 for the first time in over 20 years. The previous amounts were: -- 1: $122, 2: $188, 3: $240, 4: $284, 5: $327, 6: $366, 7: $402, 8: $441, 9: $477, 10: $512 - -### Minimum Payment -**LAC 67:III.1211** covers "Minimum Payments" - specific amount not confirmed in available sources but typically $10. - ---- - -## Resource Limits - -**All resources are EXCLUDED** when determining FITAP eligibility. - -**Source**: Law Library of Louisiana FITAP Guide - "Resources are assets or possessions that a household can convert to cash to meet needs. All resources are excluded when determining eligibility." - -**Implementation approach:** -- [x] No resource eligibility test needed for Louisiana FITAP - ---- - -## Eligibility Criteria - -### Age Requirements -- **Minor Child**: Under 18 years of age -- **Student Exception**: 18 years of age AND enrolled full-time in a secondary school or equivalent vocational/technical training, expected to complete before age 19 -- **Unborn Children**: Not eligible for FITAP benefits -- **Pregnant Women**: May be certified if in the sixth month of pregnancy or beyond (with medical verification) - -**Source**: LA RS 46:231 - "Dependent child" is defined as a needy child under the age of 18, or under age 19 if a full-time student in secondary school or equivalent vocational/technical training who may reasonably be expected to complete the program before age 19. - -**Implementation approach:** -- [x] Use federal demographic eligibility (age thresholds match federal: 18/19) - -### Citizenship/Immigration Eligibility -- Must be a U.S. citizen, non-citizen national, or qualified alien - -**Source**: Louisiana Department of Health FITAP page - -**Implementation approach:** -- [x] Use federal immigration eligibility (state follows federal rules) - -### Residency -- Must be living in Louisiana -- Must intend to make a home in Louisiana (not temporary) - -### Relationship Requirements -- Must be a qualified relative (related by blood, marriage, or adoption) -- Child must reside in the same home with the qualified relative -- Within fifth degree of relationship - -### Minor Parent Requirements -- Unmarried parents under 18 and their children must reside with parent, legal guardian, or in adult-supervised setting - -### Work Requirements (STEP Program) -- Work-eligible applicants and recipients are required to participate in the Strategies to Empower People (STEP) Program -- **Note**: Work requirements are not modeled in PolicyEngine - only eligibility and benefit calculation - -### Child Support Cooperation -- Client must assign child support and medical support rights to the state -- Must cooperate with Child Support Enforcement Services - -### Drug Screening -- Adults 18+ must cooperate with drug screening and testing if required - -### Immunization -- Children under 18 must show sufficient evidence of immunity or immunization against vaccine-preventable diseases - ---- - -## Benefit Calculation Formula - -### Step-by-Step Calculation - -1. **Determine Household Size** (assistance unit) -2. **Look up Flat Grant Amount** from payment standard table -3. **Calculate Gross Earned Income** for all employed members -4. **Apply Earned Income Deductions**: - - Subtract $120 per employed member (standard deduction) - - Subtract $900 per employed member (time-limited, if applicable) - - Subtract allowable dependent care expenses -5. **Calculate Countable Earned Income** = Gross Earned - Deductions (minimum of $0) -6. **Calculate Total Countable Income** = Countable Earned + Unearned Income -7. **Determine Eligibility**: If Total Countable Income > Flat Grant Amount, NOT eligible -8. **Calculate Benefit**: Benefit = Flat Grant Amount - Total Countable Income - -**Note**: Minimum benefit payment is typically $10 (LAC 67:III.1211) - ---- - -## Implementation Notes - -### Variables to Create - -1. **Eligibility Variables**: - - `la_tanf_eligible` - Overall TANF eligibility - - `la_tanf_income_eligible` - Income eligibility check - -2. **Income Variables**: - - `la_tanf_countable_earned_income` - Earned income after deductions - - `la_tanf_countable_income` - Total countable income - - `la_tanf_earned_income_deduction` - Standard and time-limited deductions - -3. **Benefit Variables**: - - `la_tanf_flat_grant` - Flat grant amount by household size - - `la_tanf` - Final benefit amount - -### Parameters to Create - -1. **Flat Grant Amounts**: `/parameters/gov/states/la/dcfs/tanf/flat_grant/amount.yaml` - - Bracket-style by household size (1-9+) - - Effective date: 2022-01-01 for current values - - Historical values from 2000-07-01 - -2. **Earned Income Deductions**: - - `/parameters/gov/states/la/dcfs/tanf/income/deductions/standard/amount.yaml` - $120 - - `/parameters/gov/states/la/dcfs/tanf/income/deductions/time_limited/amount.yaml` - $900 - -3. **Age Thresholds** (if not using federal): - - Minor child: 18 - - Full-time student: 19 - ---- - -## PDFs for Future Reference - -The following PDFs contain additional information but could not be fully extracted: - -1. **Louisiana Administrative Code Title 67 (Full Text)** - - URL: https://www.doa.la.gov/media/tp3lmkyg/67.pdf - - Expected content: Complete regulatory text for FITAP including LAC 67:III.1211 (Minimum Payments), income determination rules, and detailed eligibility requirements - -2. **Louisiana TANF State Plan** - - URL: https://www.dcfs.louisiana.gov/assets/docs/searchable/EconomicStability/TANF/TANF%20State%20Plan%20Renewal%20for%20Louisiana2012.pdf - - Expected content: State plan details, income calculation methodology, dependent care deduction specifics - -3. **TANF Combined WIOA Plan** - - URL: https://www.dcfs.louisiana.gov/assets/docs/searchable/EconomicStability/TANF/TANF_portion_combined_WIOAplan.pdf - - Expected content: Updated state plan information - -4. **2021 FITAP Brochure** - - URL: https://www.dcfs.louisiana.gov/assets/docs/searchable/Publication_Library/Family_Support/2021_FITAP_Brochure.pdf - - Expected content: Program overview and eligibility summary (pre-2022 benefit amounts) - -5. **NCCP TANF Profile - Louisiana** - - URL: https://www.nccp.org/wp-content/uploads/2024/08/TANF-profile-Louisiana.pdf - - Expected content: Income limits, asset limits, benefit amounts, earned income disregards - ---- - -## References for Metadata - -### For Parameters: -```yaml -reference: - - title: Louisiana Department of Health FITAP Page - href: https://ldh.la.gov/page/fitap - - title: Louisiana DCFS TANF Benefits Increase Announcement - href: https://www.dcfs.louisiana.gov/news/louisiana-to-increase-tanf-cash-assistance-benefits-beginning-january-2022 -``` - -### For Variables: -```python -reference = ( - "https://ldh.la.gov/page/fitap", - "https://www.legis.la.gov/legis/Law.aspx?d=100599", -) -``` - ---- - -## Verification Checklist - -- [x] Official program name discovered (FITAP) -- [x] Current benefit amounts by family size documented -- [x] Income eligibility test documented (income <= flat grant) -- [x] Earned income deductions documented ($120 + $900 time-limited) -- [x] Resource limit documented (all resources excluded) -- [x] Age requirements documented (under 18, or 18 if student completing before 19) -- [x] Child support passthrough policy documented (none) -- [x] Time limits documented (non-simulatable) -- [ ] Dependent care deduction amounts not fully specified in available sources -- [ ] LAC 67:III.1211 minimum payment amount not confirmed - ---- - -## Key Differences from Other State TANF Programs - -1. **No Resource Test**: Unlike many states, Louisiana excludes all resources from eligibility determination -2. **Income Limit = Benefit Amount**: The flat grant amount serves as both the income limit and the maximum benefit -3. **No Child Support Passthrough**: Louisiana does not pass through or disregard child support for FITAP families -4. **Time-Limited Deduction**: $900 for 6 months is unique to Louisiana -5. **2022 Benefit Doubling**: Benefits were doubled in January 2022 after 20+ years without increase From 711bf3284cb96f559f730b377d3b6403dd0e1481 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 6 Jan 2026 15:45:32 -0500 Subject: [PATCH 5/5] add test cases --- .../fitap/flat_grant/excess_adjustment.yaml | 2 +- .../dcfs/fitap/flat_grant/max_table_size.yaml | 2 +- .../gov/states/la/dcfs/fitap/integration.yaml | 76 +++++++++++++++++++ .../la/dcfs/fitap/la_fitap_flat_grant.yaml | 17 +++++ .../la/dcfs/fitap/la_fitap_flat_grant.py | 7 +- 5 files changed, 99 insertions(+), 5 deletions(-) diff --git a/policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/excess_adjustment.yaml b/policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/excess_adjustment.yaml index 5bdf908995a..da51972c318 100644 --- a/policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/excess_adjustment.yaml +++ b/policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/excess_adjustment.yaml @@ -1,4 +1,4 @@ -description: For households exceeding 18 persons, Louisiana subtracts this amount when calculating the flat grant under the Family Independence Temporary Assistance Program. +description: Louisiana deducts this amount from the flat grant for households exceeding the maximum table size under the Family Independence Temporary Assistance Program. values: 2000-07-01: 50 diff --git a/policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/max_table_size.yaml b/policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/max_table_size.yaml index ac1824e8574..522ad09390a 100644 --- a/policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/max_table_size.yaml +++ b/policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/max_table_size.yaml @@ -1,4 +1,4 @@ -description: Louisiana caps the flat grant lookup table at this assistance unit size under the Family Independence Temporary Assistance Program. +description: Louisiana limits the flat grant lookup table to this assistance unit size under the Family Independence Temporary Assistance Program. values: 2000-07-01: 18 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/integration.yaml index 9aaea826b09..61c9ccb91d7 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/integration.yaml @@ -258,3 +258,79 @@ la_fitap_income_eligible: true la_fitap_eligible: true la_fitap: 304 + +- name: Scenario 8 - Zero-benefit edge case (income exactly equals flat grant). + # Income eligible but zero benefit + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 16_752 # $1,396/month + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: LA + output: + # Family size: 2 + # Monthly gross earned: $1,396 + # Deductions: $1,020 + # Countable earned: $1,396 - $1,020 = $376 + # Countable income: $376 + # Flat grant (family of 2): $376 + # $376 <= $376 = income eligible (at boundary) + # Benefit: $376 - $376 = $0 + la_fitap_flat_grant: 376 + la_fitap_earned_income_after_disregard: [376, 0] + la_fitap_countable_income: 376 + la_fitap_income_eligible: true + la_fitap_eligible: true + la_fitap: 0 + +- name: Scenario 9 - Two earners both above $1,020 threshold. + # Both employed members have positive countable earned income + period: 2024-01 + input: + people: + person1: + age: 35 + employment_income_before_lsr: 18_000 # $1,500/month + person2: + age: 33 + employment_income_before_lsr: 15_600 # $1,300/month + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: LA + output: + # Family size: 3 + # Person 1 monthly gross: $1,500 + # Person 1 countable earned: max($1,500 - $1,020, 0) = $480 + # Person 2 monthly gross: $1,300 + # Person 2 countable earned: max($1,300 - $1,020, 0) = $280 + # Total countable earned: $480 + $280 = $760 + # Countable income: $760 + # Flat grant (family of 3): $484 + # $760 > $484 = income ineligible + la_fitap_flat_grant: 484 + la_fitap_earned_income_after_disregard: [480, 280, 0] + la_fitap_countable_income: 760 + la_fitap_income_eligible: false + la_fitap_eligible: false + la_fitap: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_flat_grant.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_flat_grant.yaml index 70dee2d3ec5..fdeb2560090 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_flat_grant.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_flat_grant.yaml @@ -55,3 +55,20 @@ state_code: LA output: la_fitap_flat_grant: 1_822 + +- name: Case 8, post-2022 size 1 (minimum household) + period: 2024-01 + input: + spm_unit_size: 1 + state_code: LA + output: + la_fitap_flat_grant: 244 + +- name: Case 9, pre-2022 size 19 exceeds table (tests $50 adjustment) + # grant[18] + grant[1] - adjustment = 839 + 122 - 50 = 911 + period: 2017-01 + input: + spm_unit_size: 19 + state_code: LA + output: + la_fitap_flat_grant: 911 diff --git a/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_flat_grant.py b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_flat_grant.py index 9e68d0c887d..10a27509d40 100644 --- a/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_flat_grant.py +++ b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_flat_grant.py @@ -14,16 +14,17 @@ def formula(spm_unit, period, parameters): p = parameters(period).gov.states.la.dcfs.fitap.flat_grant size = spm_unit("spm_unit_size", period.this_year) - # For size > 18: grant[18] + grant[excess] - adjustment + # For size > max_table_size: grant[max] + grant[excess] - adjustment is_over_max = size > p.max_table_size # Base amount (capped at max_table_size) capped_size = min_(size, p.max_table_size) base_amount = p.amount[capped_size] - # Excess calculation for size > 18 + # Excess calculation for size > max_table_size excess_size = max_(size - p.max_table_size, 1) - excess_amount = p.amount[min_(excess_size, p.max_table_size)] + capped_excess_size = min_(excess_size, p.max_table_size) + excess_amount = p.amount[capped_excess_size] return where( is_over_max,