diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb2d..a8e70b8fd04 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,4 @@ +- bump: minor + changes: + added: + - Louisiana Family Independence Temporary Assistance Program (FITAP). 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 new file mode 100644 index 00000000000..776cb1158da --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/amount.yaml @@ -0,0 +1,77 @@ +description: Louisiana provides this amount as the flat grant under the Family Independence Temporary Assistance Program. + +metadata: + unit: currency-USD + period: month + breakdown: + - range(1, 19) + breakdown_label: + - Assistance unit size + label: Louisiana FITAP flat grant amount + reference: + # 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: + 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: 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..da51972c318 --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/excess_adjustment.yaml @@ -0,0 +1,17 @@ +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 + 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..522ad09390a --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/dcfs/fitap/flat_grant/max_table_size.yaml @@ -0,0 +1,16 @@ +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 + +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 new file mode 100644 index 00000000000..e912aec1fec --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/dcfs/fitap/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 FITAP standard earned income deduction + reference: + - 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 new file mode 100644 index 00000000000..0a47e190a85 --- /dev/null +++ b/policyengine_us/parameters/gov/states/la/dcfs/fitap/income/deductions/time_limited.yaml @@ -0,0 +1,12 @@ +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 + +metadata: + unit: currency-USD + period: month + label: Louisiana FITAP time-limited earned income deduction + reference: + - 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 new file mode 100644 index 00000000000..61c9ccb91d7 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/integration.yaml @@ -0,0 +1,336 @@ +- 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_fitap_flat_grant: 376 + la_fitap_earned_income_after_disregard: [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 + 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_fitap_flat_grant: 376 + la_fitap_earned_income_after_disregard: [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 + 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_fitap_flat_grant: 484 + la_fitap_earned_income_after_disregard: [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 + 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_fitap_flat_grant: 376 + la_fitap_earned_income_after_disregard: [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 FITAP + 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_fitap_flat_grant: 376 + la_fitap_earned_income_after_disregard: [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 + 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_fitap_flat_grant: 484 + la_fitap_earned_income_after_disregard: [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 + 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_fitap_flat_grant: 484 + la_fitap_earned_income_after_disregard: [80, 0, 0] + la_fitap_countable_income: 180 + 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.yaml b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap.yaml new file mode 100644 index 00000000000..2709c5441bf --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap.yaml @@ -0,0 +1,30 @@ +- name: Case 1, eligible with no income gets full benefit + period: 2024-01 + input: + 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 + # Benefit: $376 - $200 = $176 + period: 2024-01 + input: + state_code: LA + la_fitap_eligible: true + la_fitap_flat_grant: 376 + la_fitap_countable_income: 200 + output: + la_fitap: 176 + +- name: Case 3, ineligible gets zero + period: 2024-01 + input: + state_code: LA + la_fitap_eligible: false + la_fitap_flat_grant: 376 + la_fitap_countable_income: 0 + output: + la_fitap: 0 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 new file mode 100644 index 00000000000..fdeb2560090 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_flat_grant.yaml @@ -0,0 +1,74 @@ +- name: Case 1, pre-2022 size 1 + period: 2017-01 + input: + spm_unit_size: 1 + state_code: LA + output: + la_fitap_flat_grant: 122 + +- name: Case 2, pre-2022 size 3 + period: 2017-01 + input: + spm_unit_size: 3 + state_code: LA + output: + la_fitap_flat_grant: 240 + +- name: Case 3, pre-2022 size 20 exceeds table + # grant[18] + grant[2] - adjustment = 839 + 188 - 50 = 977 + period: 2017-01 + input: + spm_unit_size: 20 + state_code: LA + output: + la_fitap_flat_grant: 977 + +- name: Case 4, post-2022 size 2 + period: 2022-01 + input: + spm_unit_size: 2 + state_code: LA + output: + la_fitap_flat_grant: 376 + +- name: Case 5, post-2022 size 4 + period: 2022-01 + input: + spm_unit_size: 4 + state_code: LA + output: + la_fitap_flat_grant: 568 + +- name: Case 6, post-2022 size 18 max in table + period: 2022-01 + input: + spm_unit_size: 18 + state_code: LA + output: + la_fitap_flat_grant: 1_678 + +- name: Case 7, post-2022 size 19 exceeds table + # grant[18] + grant[1] - adjustment = 1678 + 244 - 100 = 1822 + period: 2022-01 + input: + spm_unit_size: 19 + 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/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 new file mode 100644 index 00000000000..fa2174a86d9 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/la/dcfs/fitap/la_fitap_income_eligible.yaml @@ -0,0 +1,26 @@ +- name: Case 1, income below flat grant is eligible + period: 2024-01 + input: + state_code: LA + la_fitap_countable_income: 200 + la_fitap_flat_grant: 376 + output: + la_fitap_income_eligible: true + +- name: Case 2, income equal to flat grant is eligible + period: 2024-01 + input: + state_code: LA + la_fitap_countable_income: 376 + la_fitap_flat_grant: 376 + output: + la_fitap_income_eligible: true + +- name: Case 3, income above flat grant is ineligible + period: 2024-01 + input: + state_code: LA + la_fitap_countable_income: 377 + la_fitap_flat_grant: 376 + output: + la_fitap_income_eligible: false diff --git a/policyengine_us/variables/gov/states/la/dcfs/fitap/eligibility/la_fitap_eligible.py b/policyengine_us/variables/gov/states/la/dcfs/fitap/eligibility/la_fitap_eligible.py new file mode 100644 index 00000000000..516f4a92492 --- /dev/null +++ b/policyengine_us/variables/gov/states/la/dcfs/fitap/eligibility/la_fitap_eligible.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +class la_fitap_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Louisiana FITAP eligible" + definition_period = MONTH + 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): + # Per LAC 67:III.1221: Child must be under 18 or 18 and in school + demographic_eligible = spm_unit("is_demographic_tanf_eligible", period) + + # Per LAC 67:III.1223: Must be US citizen or qualified alien + immigration_eligible = ( + add(spm_unit, period, ["is_citizen_or_legal_immigrant"]) > 0 + ) + + # Per LAC 67:III.1229: Countable income <= flat grant + income_eligible = spm_unit("la_fitap_income_eligible", period) + + return demographic_eligible & immigration_eligible & income_eligible diff --git a/policyengine_us/variables/gov/states/la/dcfs/fitap/eligibility/la_fitap_income_eligible.py b/policyengine_us/variables/gov/states/la/dcfs/fitap/eligibility/la_fitap_income_eligible.py new file mode 100644 index 00000000000..a0a80ae8520 --- /dev/null +++ b/policyengine_us/variables/gov/states/la/dcfs/fitap/eligibility/la_fitap_income_eligible.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + + +class la_fitap_income_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Louisiana FITAP income eligible" + 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(spm_unit, period, parameters): + # 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/income/la_fitap_countable_income.py b/policyengine_us/variables/gov/states/la/dcfs/fitap/income/la_fitap_countable_income.py new file mode 100644 index 00000000000..8f567c68c11 --- /dev/null +++ b/policyengine_us/variables/gov/states/la/dcfs/fitap/income/la_fitap_countable_income.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + + +class la_fitap_countable_income(Variable): + value_type = float + entity = SPMUnit + label = "Louisiana FITAP countable income" + 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 + + adds = [ + "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 new file mode 100644 index 00000000000..8c6e63087e2 --- /dev/null +++ b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class la_fitap(Variable): + value_type = float + entity = SPMUnit + label = "Louisiana FITAP" + unit = USD + definition_period = MONTH + 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): + flat_grant = spm_unit("la_fitap_flat_grant", period) + countable_income = spm_unit("la_fitap_countable_income", period) + + # Benefit = flat grant minus countable income + return max_(flat_grant - countable_income, 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 new file mode 100644 index 00000000000..10a27509d40 --- /dev/null +++ b/policyengine_us/variables/gov/states/la/dcfs/fitap/la_fitap_flat_grant.py @@ -0,0 +1,33 @@ +from policyengine_us.model_api import * + + +class la_fitap_flat_grant(Variable): + value_type = float + entity = SPMUnit + label = "Louisiana FITAP flat grant" + 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(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 > 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 > max_table_size + excess_size = max_(size - p.max_table_size, 1) + capped_excess_size = min_(excess_size, p.max_table_size) + excess_amount = p.amount[capped_excess_size] + + return where( + is_over_max, + base_amount + excess_amount - p.excess_adjustment, + base_amount, + )