diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb2d..4dfbc07cdc2 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,4 @@ +- bump: minor + changes: + added: + - Implement Arkansas Transitional Employment Assistance (TEA/TANF) program diff --git a/policyengine_us/parameters/gov/states/ar/dhs/tea/income/income_limit.yaml b/policyengine_us/parameters/gov/states/ar/dhs/tea/income/income_limit.yaml new file mode 100644 index 00000000000..797b09d8b31 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/dhs/tea/income/income_limit.yaml @@ -0,0 +1,17 @@ +description: Arkansas limits countable income to this amount for eligibility under the Transitional Employment Assistance program. + +values: + 1999-09-01: 223 + 2023-01-01: 513 + +metadata: + unit: currency-USD + period: month + label: Arkansas TEA income limit + reference: + - title: 208.00.13 Ark. Code R. Section 001, Section 3.3 - Income Limit + href: https://www.law.cornell.edu/regulations/arkansas/208-00-13-Ark-Code-R-SS-001 + - title: Arkansas TEA Policy Manual Sec 2101 + href: https://humanservices.arkansas.gov/wp-content/uploads/TEA_MANUAL-10.1.24.pdf#page=13 + - title: Quick Reference Transitional Employment Assistance (2024) + href: https://humanservices.arkansas.gov/wp-content/uploads/TEA-Quick-Reference-Guide-4.2024.pdf diff --git a/policyengine_us/parameters/gov/states/ar/dhs/tea/income/work_deduction/expense_rate.yaml b/policyengine_us/parameters/gov/states/ar/dhs/tea/income/work_deduction/expense_rate.yaml new file mode 100644 index 00000000000..ce049d7fbf9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/dhs/tea/income/work_deduction/expense_rate.yaml @@ -0,0 +1,16 @@ +description: Arkansas deducts this share of gross earned income as work-related expenses under the Transitional Employment Assistance program. + +values: + 1999-09-01: 0.2 + +metadata: + unit: /1 + period: month + label: Arkansas TEA work expense deduction rate + reference: + - title: 208.00.13 Ark. Code R. Section 001, Section 3.3 - Income Limit + href: https://www.law.cornell.edu/regulations/arkansas/208-00-13-Ark-Code-R-SS-001 + - title: 016.20.98-041 Ark. Code R. - TEA Policy 2352-2362, Work Expense Deduction + href: https://regulations.justia.com/states/arkansas/agency-016/division-20/rule-016-20-98-041/ + - title: Arkansas TEA Policy Manual Sec 2352 + href: https://humanservices.arkansas.gov/wp-content/uploads/TEA_MANUAL-10.1.24.pdf#page=89 diff --git a/policyengine_us/parameters/gov/states/ar/dhs/tea/income/work_deduction/incentive_rate.yaml b/policyengine_us/parameters/gov/states/ar/dhs/tea/income/work_deduction/incentive_rate.yaml new file mode 100644 index 00000000000..424c8ef57b3 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/dhs/tea/income/work_deduction/incentive_rate.yaml @@ -0,0 +1,16 @@ +description: Arkansas deducts this share of remaining earned income as a work incentive under the Transitional Employment Assistance program. + +values: + 1999-09-01: 0.6 + +metadata: + unit: /1 + period: month + label: Arkansas TEA work incentive deduction rate + reference: + - title: 208.00.13 Ark. Code R. Section 001, Section 3.3 - Income Limit + href: https://www.law.cornell.edu/regulations/arkansas/208-00-13-Ark-Code-R-SS-001 + - title: 016.20.98-041 Ark. Code R. - TEA Policy 2352-2362, Work Incentive Deduction + href: https://regulations.justia.com/states/arkansas/agency-016/division-20/rule-016-20-98-041/ + - title: Arkansas TEA Policy Manual Sec 2352 + href: https://humanservices.arkansas.gov/wp-content/uploads/TEA_MANUAL-10.1.24.pdf#page=89 diff --git a/policyengine_us/parameters/gov/states/ar/dhs/tea/payment_standard/amount.yaml b/policyengine_us/parameters/gov/states/ar/dhs/tea/payment_standard/amount.yaml new file mode 100644 index 00000000000..e327fc2cd6b --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/dhs/tea/payment_standard/amount.yaml @@ -0,0 +1,32 @@ +description: Arkansas provides this amount as the maximum monthly payment under the Transitional Employment Assistance program. + +metadata: + unit: currency-USD + period: month + breakdown: + - range(1, 20) + label: Arkansas TEA payment standard amount + reference: + - title: 208.00.13 Ark. Code R. Section 001, Section 6.1.1 - Monthly Cash Assistance Payment Amount + href: https://www.law.cornell.edu/regulations/arkansas/208-00-13-Ark-Code-R-SS-001 + - title: Arkansas TEA Policy Manual Sec 2361 + href: https://humanservices.arkansas.gov/wp-content/uploads/TEA_MANUAL-10.1.24.pdf#page=92 + +1: + 2012-01-01: 81 +2: + 2012-01-01: 162 +3: + 2012-01-01: 204 +4: + 2012-01-01: 247 +5: + 2012-01-01: 286 +6: + 2012-01-01: 331 +7: + 2012-01-01: 373 +8: + 2012-01-01: 415 +9: + 2012-01-01: 457 diff --git a/policyengine_us/parameters/gov/states/ar/dhs/tea/payment_standard/max_unit_size.yaml b/policyengine_us/parameters/gov/states/ar/dhs/tea/payment_standard/max_unit_size.yaml new file mode 100644 index 00000000000..c0b4351fec0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/dhs/tea/payment_standard/max_unit_size.yaml @@ -0,0 +1,14 @@ +description: Arkansas provides increased payment amounts for households with up to this number of members under the Transitional Employment Assistance program. + +values: + 1999-09-01: 9 + +metadata: + unit: int + period: month + label: Arkansas TEA payment standard max unit size + reference: + - title: 208.00.13 Ark. Code R. Section 001, Section 6.1.1 - Payment Standards + href: https://www.law.cornell.edu/regulations/arkansas/208-00-13-Ark-Code-R-SS-001 + - title: Arkansas TEA Policy Manual Sec 2361 + href: https://humanservices.arkansas.gov/wp-content/uploads/TEA_MANUAL-10.1.24.pdf#page=92 diff --git a/policyengine_us/parameters/gov/states/ar/dhs/tea/payment_standard/trigger/amount.yaml b/policyengine_us/parameters/gov/states/ar/dhs/tea/payment_standard/trigger/amount.yaml new file mode 100644 index 00000000000..57b71413d6c --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/dhs/tea/payment_standard/trigger/amount.yaml @@ -0,0 +1,17 @@ +description: Arkansas reduces the payment by half when gross income equals or exceeds this amount under the Transitional Employment Assistance program. + +values: + 1999-09-01: 446 + 2023-01-01: 1_026 + +metadata: + unit: currency-USD + period: month + label: Arkansas TEA gross income trigger threshold + reference: + - title: 208.00.13 Ark. Code R. Section 001, Section 6.1.1 - Payment Standards + href: https://www.law.cornell.edu/regulations/arkansas/208-00-13-Ark-Code-R-SS-001 + - title: Arkansas TEA/Work Pays Program + href: https://humanservices.arkansas.gov/divisions-shared-services/county-operations/temporary-assistance-for-needy-families/transitional-employment-assistance-tea-work-pays/ + - title: Arkansas TEA Policy Manual Sec 2362 + href: https://humanservices.arkansas.gov/wp-content/uploads/TEA_MANUAL-10.1.24.pdf#page=93 diff --git a/policyengine_us/parameters/gov/states/ar/dhs/tea/payment_standard/trigger/reduction_rate.yaml b/policyengine_us/parameters/gov/states/ar/dhs/tea/payment_standard/trigger/reduction_rate.yaml new file mode 100644 index 00000000000..afa20cc3a97 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/dhs/tea/payment_standard/trigger/reduction_rate.yaml @@ -0,0 +1,14 @@ +description: Arkansas reduces the payment by this share when gross income equals or exceeds the trigger amount under the Transitional Employment Assistance program. + +values: + 1999-09-01: 0.5 + +metadata: + unit: /1 + period: month + label: Arkansas TEA gross income trigger payment reduction rate + reference: + - title: 208.00.13 Ark. Code R. Section 001, Section 6.1.1 - Payment Standards + href: https://www.law.cornell.edu/regulations/arkansas/208-00-13-Ark-Code-R-SS-001 + - title: Arkansas TEA Policy Manual Sec 2362 + href: https://humanservices.arkansas.gov/wp-content/uploads/TEA_MANUAL-10.1.24.pdf#page=93 diff --git a/policyengine_us/parameters/gov/states/ar/dhs/tea/resources/limit.yaml b/policyengine_us/parameters/gov/states/ar/dhs/tea/resources/limit.yaml new file mode 100644 index 00000000000..313040c6892 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/dhs/tea/resources/limit.yaml @@ -0,0 +1,14 @@ +description: Arkansas limits countable resources to this amount for eligibility under the Transitional Employment Assistance program. + +values: + 1999-09-01: 3_000 + +metadata: + unit: currency-USD + period: month + label: Arkansas TEA resource limit + reference: + - title: 208.00.13 Ark. Code R. Section 001, Section 3.4 - Resource Limits + href: https://www.law.cornell.edu/regulations/arkansas/208-00-13-Ark-Code-R-SS-001 + - title: Arkansas TEA Policy Manual Sec 2101 + href: https://humanservices.arkansas.gov/wp-content/uploads/TEA_MANUAL-10.1.24.pdf#page=13 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/dhs/tea/ar_tea.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/dhs/tea/ar_tea.yaml new file mode 100644 index 00000000000..31d6394bb38 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/dhs/tea/ar_tea.yaml @@ -0,0 +1,140 @@ +# Unit tests for ar_tea (final benefit amount) +# Benefit calculation (per TEA Manual Section 2362, effective 01/01/2023): +# 1. If not eligible: $0 +# 2. If gross income < $1026: benefit = max(payment_standard - countable_income, 0) +# 3. If gross income >= $1026: benefit = payment_standard * 0.5 (no subtraction) + +- name: Case 1, ineligible receives zero. + period: 2024-01 + input: + people: + person1: + age: 30 + tanf_gross_earned_income: 0 + tanf_gross_unearned_income: 0 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + ar_tea_eligible: false + ar_tea_maximum_benefit: 204 + ar_tea_countable_income: 0 + output: + ar_tea: 0 + # Not eligible -> no benefit + +- name: Case 2, eligible with zero income receives full benefit. + period: 2024-01 + input: + people: + person1: + age: 30 + tanf_gross_earned_income: 0 + tanf_gross_unearned_income: 0 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + ar_tea_eligible: true + ar_tea_maximum_benefit: 204 + ar_tea_countable_income: 0 + output: + ar_tea: 204 + # max(204 - 0, 0) = 204 + +- name: Case 3, eligible with countable income below payment standard. + period: 2024-01 + input: + people: + person1: + age: 30 + tanf_gross_earned_income: 400 + tanf_gross_unearned_income: 0 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + ar_tea_eligible: true + ar_tea_maximum_benefit: 204 + ar_tea_countable_income: 128 + output: + ar_tea: 76 + # Gross income 400 < 1026 trigger, so full payment standard applies + # max(204 - 128, 0) = 76 + +- name: Case 4, gross income at trigger causes 50 percent reduction. + period: 2024-01 + input: + people: + person1: + age: 30 + tanf_gross_earned_income: 1_026 + tanf_gross_unearned_income: 0 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + ar_tea_eligible: true + ar_tea_maximum_benefit: 204 + ar_tea_countable_income: 0 + output: + ar_tea: 102 + # Gross income 1,026 >= 1,026 trigger, so 50% reduction + # 204 * 0.5 = 102 (no subtraction when above trigger) + +- name: Case 5, gross income above trigger with countable income. + period: 2024-01 + input: + people: + person1: + age: 30 + tanf_gross_earned_income: 1_200 + tanf_gross_unearned_income: 0 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + ar_tea_eligible: true + ar_tea_maximum_benefit: 162 + ar_tea_countable_income: 384 + output: + ar_tea: 81 + # Gross income 1,200 >= 1,026 trigger, so 50% reduction + # 162 * 0.5 = 81 (no subtraction when above trigger) + +- name: Case 6, benefit would be negative clipped to zero. + period: 2024-01 + input: + people: + person1: + age: 30 + tanf_gross_earned_income: 0 + tanf_gross_unearned_income: 0 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + ar_tea_eligible: true + ar_tea_maximum_benefit: 81 + ar_tea_countable_income: 100 + output: + ar_tea: 0 + # max(81 - 100, 0) = max(-19, 0) = 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/dhs/tea/ar_tea_countable_earned_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/dhs/tea/ar_tea_countable_earned_income.yaml new file mode 100644 index 00000000000..15413fc615d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/dhs/tea/ar_tea_countable_earned_income.yaml @@ -0,0 +1,143 @@ +# Unit tests for ar_tea_countable_earned_income +# Arkansas TEA applies sequential earned income deductions: +# - Initial applicants (not enrolled): 20% work-related expense deduction only +# - Ongoing recipients (enrolled): 20% work expense + 60% work incentive deduction +# Combined for ongoing: Net = Gross x 0.80 x 0.40 = Gross x 0.32 + +- name: Case 1, zero earned income (initial applicant). + period: 2024-01 + input: + people: + person1: + age: 30 + tanf_gross_earned_income: 0 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + is_tanf_enrolled: false + output: + ar_tea_countable_earned_income: 0 + +- name: Case 2, initial applicant with low income (20% deduction only). + period: 2024-01 + input: + people: + person1: + age: 30 + tanf_gross_earned_income: 300 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + is_tanf_enrolled: false + output: + ar_tea_countable_earned_income: 240 + # Initial applicant: 300 * 0.80 = 240 (only 20% work expense) + +- name: Case 3, ongoing recipient with low income (20% + 60% deductions). + period: 2024-01 + input: + people: + person1: + age: 30 + tanf_gross_earned_income: 300 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + is_tanf_enrolled: true + output: + ar_tea_countable_earned_income: 96 + # Ongoing recipient: + # Step 1: 300 * 0.80 = 240 (after 20% work expense) + # Step 2: 240 * 0.40 = 96 (after 60% work incentive) + +- name: Case 4, ongoing recipient documentation example with 550 gross earnings. + period: 2024-01 + input: + people: + person1: + age: 30 + tanf_gross_earned_income: 550 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + is_tanf_enrolled: true + output: + ar_tea_countable_earned_income: 176 + # Step 1: 550 * 0.80 = 440 (after 20% work expense) + # Step 2: 440 * 0.40 = 176 (after 60% work incentive) + +- name: Case 5, initial applicant with 550 gross earnings. + period: 2024-01 + input: + people: + person1: + age: 30 + tanf_gross_earned_income: 550 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + is_tanf_enrolled: false + output: + ar_tea_countable_earned_income: 440 + # Initial applicant: 550 * 0.80 = 440 (only 20% work expense) + +- name: Case 6, ongoing recipient with gross income at trigger threshold. + period: 2024-01 + input: + people: + person1: + age: 30 + tanf_gross_earned_income: 446 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + is_tanf_enrolled: true + output: + ar_tea_countable_earned_income: 142.72 + # Step 1: 446 * 0.80 = 356.8 (after 20% work expense) + # Step 2: 356.8 * 0.40 = 142.72 (after 60% work incentive) + +- name: Case 7, ongoing recipient higher earnings yielding net above eligibility standard. + period: 2024-01 + input: + people: + person1: + age: 30 + tanf_gross_earned_income: 800 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + is_tanf_enrolled: true + output: + ar_tea_countable_earned_income: 256 + # Step 1: 800 * 0.80 = 640 (after 20% work expense) + # Step 2: 640 * 0.40 = 256 (after 60% work incentive) + # Note: 256 > 223 eligibility standard, so would be income ineligible diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/dhs/tea/ar_tea_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/dhs/tea/ar_tea_eligible.yaml new file mode 100644 index 00000000000..0d1ec4d9fc6 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/dhs/tea/ar_tea_eligible.yaml @@ -0,0 +1,100 @@ +# Unit tests for ar_tea_eligible +# Overall eligibility requires: +# 1. Income eligibility (countable income <= $223) +# 2. Resource eligibility (resources <= $3,000) +# 3. Demographic eligibility (from federal baseline - SPM unit level) + +- name: Case 1, all requirements met. + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + ar_tea_income_eligible: true + ar_tea_resources_eligible: true + is_demographic_tanf_eligible: true + output: + ar_tea_eligible: true + +- name: Case 2, income ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + ar_tea_income_eligible: false + ar_tea_resources_eligible: true + is_demographic_tanf_eligible: true + output: + ar_tea_eligible: false + +- name: Case 3, resources ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + ar_tea_income_eligible: true + ar_tea_resources_eligible: false + is_demographic_tanf_eligible: true + output: + ar_tea_eligible: false + +- name: Case 4, demographic ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + ar_tea_income_eligible: true + ar_tea_resources_eligible: true + is_demographic_tanf_eligible: false + output: + ar_tea_eligible: false + +- name: Case 5, multiple requirements not met. + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + ar_tea_income_eligible: false + ar_tea_resources_eligible: false + is_demographic_tanf_eligible: true + output: + ar_tea_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/dhs/tea/ar_tea_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/dhs/tea/ar_tea_income_eligible.yaml new file mode 100644 index 00000000000..93f916bccc0 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/dhs/tea/ar_tea_income_eligible.yaml @@ -0,0 +1,149 @@ +# Unit tests for ar_tea_income_eligible +# Arkansas TEA income eligibility: Countable income must be <= $513/month (all family sizes) +# Income limit increased from $223 to $513 effective 01/01/2023 + +- name: Case 1, zero income is eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + ar_tea_countable_income: 0 + output: + ar_tea_income_eligible: true + # 0 <= 513 -> eligible + +- name: Case 2, countable income below limit is eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + ar_tea_countable_income: 400 + output: + ar_tea_income_eligible: true + # 400 <= 513 -> eligible + +- name: Case 3, countable income at threshold is eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + ar_tea_countable_income: 513 + output: + ar_tea_income_eligible: true + # 513 <= 513 -> eligible (at threshold is still eligible) + +- name: Case 4, countable income one dollar over threshold is ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + ar_tea_countable_income: 514 + output: + ar_tea_income_eligible: false + # 514 > 513 -> ineligible + +- name: Case 5, countable income well above threshold is ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + ar_tea_countable_income: 700 + output: + ar_tea_income_eligible: false + # 700 > 513 -> ineligible + +# 2022 tests - using old $223 income limit (before 01/01/2023 increase) + +- name: Case 6, 2022 countable income at old threshold is eligible. + period: 2022-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + ar_tea_countable_income: 223 + output: + ar_tea_income_eligible: true + # 223 <= 223 -> eligible (at old threshold) + +- name: Case 7, 2022 countable income one dollar over old threshold is ineligible. + period: 2022-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + ar_tea_countable_income: 224 + output: + ar_tea_income_eligible: false + # 224 > 223 -> ineligible (old threshold) + +- name: Case 8, 2022 countable income of 400 is ineligible under old limit. + period: 2022-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + ar_tea_countable_income: 400 + output: + ar_tea_income_eligible: false + # 400 > 223 -> ineligible (but would be eligible under 2024 $513 limit) diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/dhs/tea/ar_tea_maximum_benefit.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/dhs/tea/ar_tea_maximum_benefit.yaml new file mode 100644 index 00000000000..218afcf5196 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/dhs/tea/ar_tea_maximum_benefit.yaml @@ -0,0 +1,181 @@ +# Unit tests for ar_tea_maximum_benefit +# Arkansas TEA payment standards by family size (full payment, before 50% reduction): +# 1: $81, 2: $162, 3: $204, 4: $247, 5: $286 +# 6: $331, 7: $373, 8: $415, 9+: $457 + +- name: Case 1, family size 1. + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + spm_unit_size: 1 + output: + ar_tea_maximum_benefit: 81 + +- name: Case 2, family size 2. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 10 + households: + household: + members: [person1, person2] + state_code: AR + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_size: 2 + output: + ar_tea_maximum_benefit: 162 + +- name: Case 3, family size 3. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 10 + person3: + age: 8 + households: + household: + members: [person1, person2, person3] + state_code: AR + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_size: 3 + output: + ar_tea_maximum_benefit: 204 + +- name: Case 4, family size 4. + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + spm_unit_size: 4 + output: + ar_tea_maximum_benefit: 247 + +- name: Case 5, family size 5. + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + spm_unit_size: 5 + output: + ar_tea_maximum_benefit: 286 + +- name: Case 6, family size 6. + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + spm_unit_size: 6 + output: + ar_tea_maximum_benefit: 331 + +- name: Case 7, family size 7. + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + spm_unit_size: 7 + output: + ar_tea_maximum_benefit: 373 + +- name: Case 8, family size 8. + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + spm_unit_size: 8 + output: + ar_tea_maximum_benefit: 415 + +- name: Case 9, family size 9 or more. + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + spm_unit_size: 9 + output: + ar_tea_maximum_benefit: 457 + +- name: Case 10, family size 10 capped at 9 rate. + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + spm_unit_size: 10 + output: + ar_tea_maximum_benefit: 457 + # Family sizes 9+ all receive $457 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/dhs/tea/ar_tea_resources_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/dhs/tea/ar_tea_resources_eligible.yaml new file mode 100644 index 00000000000..1e49e14a4e4 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/dhs/tea/ar_tea_resources_eligible.yaml @@ -0,0 +1,97 @@ +# Unit tests for ar_tea_resources_eligible +# Arkansas TEA has a fixed resource limit of $3,000 for ALL family sizes +# Countable resources exclude: +# - Family homestead (residence) +# - One operable vehicle +# - Household goods and personal effects +# - Resources of SSI recipients + +- name: Case 1, zero resources is eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + spm_unit_assets: 0 + output: + ar_tea_resources_eligible: true + # 0 <= 3,000 -> eligible + +- name: Case 2, resources well below limit. + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + spm_unit_assets: 1_500 + output: + ar_tea_resources_eligible: true + # 1,500 <= 3,000 -> eligible + +- name: Case 3, resources exactly at limit. + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + spm_unit_assets: 3_000 + output: + ar_tea_resources_eligible: true + # 3,000 <= 3,000 -> eligible (at limit is still eligible) + +- name: Case 4, resources one dollar over limit. + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + spm_unit_assets: 3_001 + output: + ar_tea_resources_eligible: false + # 3,001 > 3,000 -> ineligible + +- name: Case 5, resources well above limit. + period: 2024-01 + input: + people: + person1: + age: 30 + households: + household: + members: [person1] + state_code: AR + spm_units: + spm_unit: + members: [person1] + spm_unit_assets: 10_000 + output: + ar_tea_resources_eligible: false + # 10,000 > 3,000 -> ineligible diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/dhs/tea/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/dhs/tea/integration.yaml new file mode 100644 index 00000000000..9b1b53598f5 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/dhs/tea/integration.yaml @@ -0,0 +1,677 @@ +# Integration tests for Arkansas TEA (Transitional Employment Assistance) +# These tests verify the complete benefit calculation pipeline from inputs to final benefit +# Note: These tests use is_tanf_enrolled: true to simulate ongoing recipients + +- name: Case 1, family of 3 with no income receives full benefit. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 0 + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_assets: 1_000 + is_tanf_enrolled: true + households: + household: + members: [person1, person2, person3] + state_code: AR + output: + # Income calculation chain + tanf_gross_earned_income: [0, 0, 0] + ar_tea_countable_earned_income: 0 + ar_tea_countable_income: 0 + + # Eligibility chain + ar_tea_income_eligible: true + # 0 <= 513 -> eligible + ar_tea_resources_eligible: true + # 1,000 <= 3,000 -> eligible + ar_tea_eligible: true + + # Benefit calculation + ar_tea_maximum_benefit: 204 + # Family size 3 -> $204 payment standard + ar_tea: 204 + # Gross income 0 < 1,026, so no reduction + # max(204 - 0, 0) = 204 + +- name: Case 2, ongoing family of 3 with earned income below trigger receives partial benefit. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 4_800 + # Annual $4,800 = $400/month + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_assets: 500 + is_tanf_enrolled: true + households: + household: + members: [person1, person2, person3] + state_code: AR + output: + # Income calculation chain + tanf_gross_earned_income: [400, 0, 0] + ar_tea_countable_earned_income: 128 + # Step 1: 400 * 0.80 = 320 (after 20% work expense) + # Step 2: 320 * 0.40 = 128 (after 60% work incentive) + ar_tea_countable_income: 128 + + # Eligibility chain + ar_tea_income_eligible: true + # 128 <= 513 -> eligible + ar_tea_resources_eligible: true + ar_tea_eligible: true + + # Benefit calculation + ar_tea_maximum_benefit: 204 + ar_tea: 76 + # Gross income 400 < 1,026, so no reduction + # max(204 - 128, 0) = 76 + +- name: Case 3, ongoing family of 2 with earnings below trigger. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 5_352 + # Annual $5,352 = $446/month + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_assets: 2_000 + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: AR + output: + # Income calculation chain + tanf_gross_earned_income: [446, 0] + ar_tea_countable_earned_income: 142.72 + # 446 * 0.80 * 0.40 = 142.72 + ar_tea_countable_income: 142.72 + + # Eligibility chain + ar_tea_income_eligible: true + # 142.72 <= 513 -> eligible + ar_tea_resources_eligible: true + ar_tea_eligible: true + + # Benefit calculation + ar_tea_maximum_benefit: 162 + ar_tea: 19.28 + # Gross income 446 < 1026, so no reduction + # max(162 - 142.72, 0) = 19.28 + +- name: Case 4, ongoing family of 4 with earnings below trigger. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 6_000 + # Annual $6,000 = $500/month + person2: + age: 28 + employment_income_before_lsr: 0 + person3: + age: 10 + person4: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + spm_unit_assets: 1_500 + is_tanf_enrolled: true + households: + household: + members: [person1, person2, person3, person4] + state_code: AR + output: + # Income calculation chain + tanf_gross_earned_income: [500, 0, 0, 0] + ar_tea_countable_earned_income: 160 + # 500 * 0.80 * 0.40 = 160 + ar_tea_countable_income: 160 + + # Eligibility chain + ar_tea_income_eligible: true + # 160 <= 513 -> eligible + ar_tea_eligible: true + + # Benefit calculation + ar_tea_maximum_benefit: 247 + ar_tea: 87 + # Gross income 500 < 1026, so no reduction + # max(247 - 160, 0) = 87 + +- name: Case 5, ongoing recipient with 550 gross earnings below trigger. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 6_600 + # Annual $6,600 = $550/month + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_assets: 500 + is_tanf_enrolled: true + households: + household: + members: [person1, person2, person3] + state_code: AR + output: + # Income calculation chain + tanf_gross_earned_income: [550, 0, 0] + ar_tea_countable_earned_income: 176 + # Step 1: 550 * 0.80 = 440 (after 20% work expense) + # Step 2: 440 * 0.40 = 176 (after 60% work incentive) + ar_tea_countable_income: 176 + + # Eligibility chain + ar_tea_income_eligible: true + # 176 <= 513 -> eligible + ar_tea_eligible: true + + # Benefit calculation + ar_tea_maximum_benefit: 204 + ar_tea: 28 + # Gross income 550 < 1026, so no reduction + # max(204 - 176, 0) = 28 + +- name: Case 6, ongoing recipient with high earnings but still income eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 9_600 + # Annual $9,600 = $800/month + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_assets: 1_000 + is_tanf_enrolled: true + households: + household: + members: [person1, person2, person3] + state_code: AR + output: + # Income calculation chain + tanf_gross_earned_income: [800, 0, 0] + ar_tea_countable_earned_income: 256 + # 800 * 0.80 * 0.40 = 256 + ar_tea_countable_income: 256 + + # Eligibility chain + ar_tea_income_eligible: true + # 256 <= 513 -> eligible + ar_tea_eligible: true + + # Benefit calculation + ar_tea_maximum_benefit: 204 + ar_tea: 0 + # Gross income 800 < 1,026, so no reduction + # max(204 - 256, 0) = 0 (countable income exceeds maximum benefit) + +- name: Case 7, resources exceed limit making family ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 0 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_assets: 5_000 + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: AR + output: + # Income calculation chain + ar_tea_countable_income: 0 + + # Eligibility chain + ar_tea_income_eligible: true + # 0 <= 513 -> eligible + ar_tea_resources_eligible: false + # 5,000 > 3,000 -> ineligible + ar_tea_eligible: false + + # Benefit calculation + ar_tea_maximum_benefit: 162 + ar_tea: 0 + # Ineligible -> no benefit + +- name: Case 8, initial applicant family of 3 (20% deduction only). + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 4_800 + # Annual $4,800 = $400/month + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_assets: 500 + is_tanf_enrolled: false + households: + household: + members: [person1, person2, person3] + state_code: AR + output: + # Income calculation chain - initial applicant gets only 20% deduction + tanf_gross_earned_income: [400, 0, 0] + ar_tea_countable_earned_income: 320 + # Initial applicant: 400 * 0.80 = 320 (only 20% work expense) + ar_tea_countable_income: 320 + + # Eligibility chain + ar_tea_income_eligible: true + # 320 <= 513 -> eligible + ar_tea_eligible: true + + # Benefit calculation + ar_tea_maximum_benefit: 204 + ar_tea: 0 + # Gross income 400 < 1,026, so no reduction + # max(204 - 320, 0) = 0 + +- name: Case 9, ongoing recipient with gross income above trigger. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 19_200 + # Annual $19,200 = $1,600/month + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_assets: 1_000 + is_tanf_enrolled: true + households: + household: + members: [person1, person2, person3] + state_code: AR + output: + # Income calculation chain + tanf_gross_earned_income: [1_600, 0, 0] + ar_tea_countable_earned_income: 512 + # 1,600 * 0.80 * 0.40 = 512 + ar_tea_countable_income: 512 + + # Eligibility chain + ar_tea_income_eligible: true + # 512 <= 513 -> eligible (just under threshold) + ar_tea_eligible: true + + # Benefit calculation + ar_tea_maximum_benefit: 204 + ar_tea: 102 + # Gross income 1,600 >= 1,026, so 50% reduction + # 204 * 0.5 = 102 (no subtraction when above trigger) + +- name: Case 10, ongoing recipient income exceeds $513 limit making family ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 19_500 + # Annual $19,500 = $1,625/month + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_assets: 1_000 + is_tanf_enrolled: true + households: + household: + members: [person1, person2, person3] + state_code: AR + output: + # Income calculation chain + tanf_gross_earned_income: [1_625, 0, 0] + ar_tea_countable_earned_income: 520 + # 1,625 * 0.80 * 0.40 = 520 + ar_tea_countable_income: 520 + + # Eligibility chain + ar_tea_income_eligible: false + # 520 > 513 -> ineligible + ar_tea_eligible: false + + # Benefit calculation + ar_tea_maximum_benefit: 204 + ar_tea: 0 + # Ineligible -> no benefit + +# TEA Manual Examples (Section 2353.1) + +- name: TEA Manual Example 1, Ms. Jones with unearned income exceeding $513 limit. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + unemployment_compensation: 6_501 + # Annual $6,501 = $541.75/month ($125/week UI) + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_assets: 1_000 + is_tanf_enrolled: false + households: + household: + members: [person1, person2] + state_code: AR + output: + # Income calculation chain (per TEA Manual Example #1) + tanf_gross_earned_income: [0, 0] + tanf_gross_unearned_income: [541.75, 0] + ar_tea_countable_earned_income: 0 + ar_tea_countable_income: 541.75 + + # Eligibility chain + ar_tea_income_eligible: false + # 541.75 > 513 -> ineligible + ar_tea_eligible: false + + # Benefit calculation + ar_tea_maximum_benefit: 162 + ar_tea: 0 + # Ineligible -> no benefit + +- name: TEA Manual Example 2, Miller family initial applicant with earned income below $513. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 5_720.88 + # Annual $5,720.88 = $476.74/month (10 hrs/week × $11/hr × 4.33 weeks) + person2: + age: 28 + person3: + age: 10 + person4: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + spm_unit_assets: 1_000 + is_tanf_enrolled: false + households: + household: + members: [person1, person2, person3, person4] + state_code: AR + output: + # Income calculation chain (per TEA Manual Example #2 Section 2353.1) + tanf_gross_earned_income: [476.74, 0, 0, 0] + ar_tea_countable_earned_income: 381.39 + # Initial applicant: 476.74 * 0.80 = 381.39 (manual says 381.40) + ar_tea_countable_income: 381.39 + + # Eligibility chain + ar_tea_income_eligible: true + # 381.39 <= 513 -> eligible + ar_tea_eligible: true + + # Benefit calculation + ar_tea_maximum_benefit: 247 + ar_tea: 0 + # Gross income 476.74 < 1026, so no reduction + # max(247 - 381.39, 0) = 0 + +# TEA Manual Section 2362 Examples (Gross Income Trigger) + +- name: TEA Manual Example 2362-2, Ms. Brown ongoing recipient above trigger. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 14_400 + # Annual $14,400 = $1,200/month gross + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_assets: 1_000 + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: AR + output: + # Income calculation chain (per TEA Manual Section 2362 Example #2) + tanf_gross_earned_income: [1_200, 0] + ar_tea_countable_earned_income: 384 + # Ongoing recipient: 1,200 * 0.80 * 0.40 = 384 + ar_tea_countable_income: 384 + + # Eligibility chain + ar_tea_income_eligible: true + # 384 <= 513 -> eligible + ar_tea_eligible: true + + # Benefit calculation + ar_tea_maximum_benefit: 162 + ar_tea: 81 + # Gross income 1,200 >= 1,026, so 50% reduction + # 162 * 0.5 = 81 (per manual: "payment is 50% of the maximum") + +# Gross Income Trigger Boundary Tests + +- name: Boundary test, gross income $1,025 (one below trigger - no reduction). + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 12_300 + # Annual $12,300 = $1,025/month + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_assets: 1_000 + is_tanf_enrolled: true + households: + household: + members: [person1, person2, person3] + state_code: AR + output: + # Income calculation chain + tanf_gross_earned_income: [1_025, 0, 0] + ar_tea_countable_earned_income: 328 + # 1,025 * 0.80 * 0.40 = 328 + ar_tea_countable_income: 328 + + # Eligibility chain + ar_tea_income_eligible: true + # 328 <= 513 -> eligible + ar_tea_eligible: true + + # Benefit calculation + ar_tea_maximum_benefit: 204 + ar_tea: 0 + # Gross income 1,025 < 1,026, so NO reduction + # max(204 - 328, 0) = 0 (countable income exceeds maximum benefit) + +- name: Boundary test, gross income $1,027 (one above trigger - 50% reduction). + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 12_324 + # Annual $12,324 = $1,027/month + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_assets: 1_000 + is_tanf_enrolled: true + households: + household: + members: [person1, person2, person3] + state_code: AR + output: + # Income calculation chain + tanf_gross_earned_income: [1_027, 0, 0] + ar_tea_countable_earned_income: 328.64 + # 1,027 * 0.80 * 0.40 = 328.64 + ar_tea_countable_income: 328.64 + + # Eligibility chain + ar_tea_income_eligible: true + # 328.64 <= 513 -> eligible + ar_tea_eligible: true + + # Benefit calculation + ar_tea_maximum_benefit: 204 + ar_tea: 102 + # Gross income 1,027 >= 1,026, so 50% reduction + # 204 * 0.5 = 102 (no subtraction when above trigger) + +# Historical Trigger Tests (2022 - $446 threshold) + +- name: Historical test 2022, ongoing recipient below $446 trigger. + period: 2022-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 5_340 + # Annual $5,340 = $445/month (one below trigger) + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_assets: 1_000 + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: AR + output: + # Income calculation chain + tanf_gross_earned_income: [445, 0] + ar_tea_countable_earned_income: 142.4 + # 445 * 0.80 * 0.40 = 142.4 + ar_tea_countable_income: 142.4 + + # Eligibility chain + ar_tea_income_eligible: true + # 142.4 <= 223 -> eligible (2022 income limit) + ar_tea_eligible: true + + # Benefit calculation + ar_tea_maximum_benefit: 162 + ar_tea: 19.6 + # Gross income 445 < 446, so NO reduction + # max(162 - 142.4, 0) = 19.6 + +- name: Historical test 2022, ongoing recipient above $446 trigger. + period: 2022-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 5_364 + # Annual $5,364 = $447/month (one above trigger) + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_assets: 1_000 + is_tanf_enrolled: true + households: + household: + members: [person1, person2] + state_code: AR + output: + # Income calculation chain + tanf_gross_earned_income: [447, 0] + ar_tea_countable_earned_income: 143.04 + # 447 * 0.80 * 0.40 = 143.04 + ar_tea_countable_income: 143.04 + + # Eligibility chain + ar_tea_income_eligible: true + # 143.04 <= 223 -> eligible (2022 income limit) + ar_tea_eligible: true + + # Benefit calculation + ar_tea_maximum_benefit: 162 + ar_tea: 81 + # Gross income 447 >= 446, so 50% reduction + # 162 * 0.5 = 81 (no subtraction when above trigger) diff --git a/policyengine_us/variables/gov/states/ar/dhs/tea/ar_tea.py b/policyengine_us/variables/gov/states/ar/dhs/tea/ar_tea.py new file mode 100644 index 00000000000..97c975985c2 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/dhs/tea/ar_tea.py @@ -0,0 +1,38 @@ +from policyengine_us.model_api import * + + +class ar_tea(Variable): + value_type = float + entity = SPMUnit + label = "Arkansas Transitional Employment Assistance" + unit = USD + definition_period = MONTH + reference = "https://www.law.cornell.edu/regulations/arkansas/208-00-13-Ark-Code-R-SS-001" + defined_for = "ar_tea_eligible" + + def formula(spm_unit, period, parameters): + # Per TEA Manual Section 2362 - Reduced Payment - Gross Income Trigger + p = parameters(period).gov.states.ar.dhs.tea + + maximum_benefit = spm_unit("ar_tea_maximum_benefit", period) + countable_income = spm_unit("ar_tea_countable_income", period) + + # Check if gross income triggers 50% payment reduction + gross_income = add( + spm_unit, + period, + ["tanf_gross_earned_income", "tanf_gross_unearned_income"], + ) + + above_trigger = gross_income >= p.payment_standard.trigger.amount + reduced_payment = maximum_benefit * ( + 1 - p.payment_standard.trigger.reduction_rate + ) + + # When gross income >= trigger: payment is 50% of max (no subtraction) + # When gross income < trigger: payment is max - countable income + return where( + above_trigger, + reduced_payment, + max_(maximum_benefit - countable_income, 0), + ) diff --git a/policyengine_us/variables/gov/states/ar/dhs/tea/ar_tea_maximum_benefit.py b/policyengine_us/variables/gov/states/ar/dhs/tea/ar_tea_maximum_benefit.py new file mode 100644 index 00000000000..9deda8d1d67 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/dhs/tea/ar_tea_maximum_benefit.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class ar_tea_maximum_benefit(Variable): + value_type = float + entity = SPMUnit + label = "Arkansas TEA maximum benefit" + unit = USD + definition_period = MONTH + reference = "https://www.law.cornell.edu/regulations/arkansas/208-00-13-Ark-Code-R-SS-001" + defined_for = StateCode.AR + + def formula(spm_unit, period, parameters): + # Per 208.00.13 Ark. Code R. Section 001, Section 6.1.1 + p = parameters(period).gov.states.ar.dhs.tea.payment_standard + unit_size = spm_unit("spm_unit_size", period.this_year) + capped_size = min_(unit_size, p.max_unit_size) + return p.amount[capped_size] diff --git a/policyengine_us/variables/gov/states/ar/dhs/tea/eligibility/ar_tea_eligible.py b/policyengine_us/variables/gov/states/ar/dhs/tea/eligibility/ar_tea_eligible.py new file mode 100644 index 00000000000..e3a8f5ca672 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/dhs/tea/eligibility/ar_tea_eligible.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class ar_tea_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Arkansas TEA eligible" + definition_period = MONTH + reference = "https://www.law.cornell.edu/regulations/arkansas/208-00-13-Ark-Code-R-SS-001" + defined_for = StateCode.AR + + def formula(spm_unit, period, parameters): + income_eligible = spm_unit("ar_tea_income_eligible", period) + resources_eligible = spm_unit("ar_tea_resources_eligible", period) + 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 + ) + return ( + income_eligible + & resources_eligible + & demographic_eligible + & immigration_eligible + ) diff --git a/policyengine_us/variables/gov/states/ar/dhs/tea/eligibility/ar_tea_income_eligible.py b/policyengine_us/variables/gov/states/ar/dhs/tea/eligibility/ar_tea_income_eligible.py new file mode 100644 index 00000000000..f2c9be33fe4 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/dhs/tea/eligibility/ar_tea_income_eligible.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class ar_tea_income_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Arkansas TEA income eligible" + definition_period = MONTH + reference = "https://www.law.cornell.edu/regulations/arkansas/208-00-13-Ark-Code-R-SS-001" + defined_for = StateCode.AR + + def formula(spm_unit, period, parameters): + # Per 208.00.13 Ark. Code R. Section 001, Section 3.3 + p = parameters(period).gov.states.ar.dhs.tea.income + # Countable income must be at or below the income limit + countable_income = spm_unit("ar_tea_countable_income", period) + return countable_income <= p.income_limit diff --git a/policyengine_us/variables/gov/states/ar/dhs/tea/eligibility/ar_tea_resources_eligible.py b/policyengine_us/variables/gov/states/ar/dhs/tea/eligibility/ar_tea_resources_eligible.py new file mode 100644 index 00000000000..ae11cb313c7 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/dhs/tea/eligibility/ar_tea_resources_eligible.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class ar_tea_resources_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Arkansas TEA resources eligible" + definition_period = MONTH + reference = "https://www.law.cornell.edu/regulations/arkansas/208-00-13-Ark-Code-R-SS-001" + defined_for = StateCode.AR + + def formula(spm_unit, period, parameters): + # Per 208.00.13 Ark. Code R. Section 001, Section 3.4 + p = parameters(period).gov.states.ar.dhs.tea.resources + # Use federal asset calculation for SPM unit + resources = spm_unit("spm_unit_assets", period.this_year) + return resources <= p.limit diff --git a/policyengine_us/variables/gov/states/ar/dhs/tea/income/ar_tea_countable_earned_income.py b/policyengine_us/variables/gov/states/ar/dhs/tea/income/ar_tea_countable_earned_income.py new file mode 100644 index 00000000000..2a717e1e0c0 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/dhs/tea/income/ar_tea_countable_earned_income.py @@ -0,0 +1,30 @@ +from policyengine_us.model_api import * + + +class ar_tea_countable_earned_income(Variable): + value_type = float + entity = SPMUnit + label = "Arkansas TEA countable earned income" + unit = USD + definition_period = MONTH + reference = "https://www.law.cornell.edu/regulations/arkansas/208-00-13-Ark-Code-R-SS-001" + defined_for = StateCode.AR + + def formula(spm_unit, period, parameters): + # Per 208.00.13 Ark. Code R. Section 001, Section 3.3 + p = parameters(period).gov.states.ar.dhs.tea.income.work_deduction + gross_earned = add(spm_unit, period, ["tanf_gross_earned_income"]) + + # Step 1: Apply 20% work expense deduction (applies to all) + after_work_expense = gross_earned * (1 - p.expense_rate) + + # Step 2: Apply 60% work incentive deduction (only for ongoing recipients) + is_enrolled = spm_unit("is_tanf_enrolled", period) + + # For initial applicants: only 20% work expense deduction + # For ongoing recipients: 20% work expense + 60% work incentive + return where( + is_enrolled, + after_work_expense * (1 - p.incentive_rate), + after_work_expense, + ) diff --git a/policyengine_us/variables/gov/states/ar/dhs/tea/income/ar_tea_countable_income.py b/policyengine_us/variables/gov/states/ar/dhs/tea/income/ar_tea_countable_income.py new file mode 100644 index 00000000000..a8d646e81f4 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/dhs/tea/income/ar_tea_countable_income.py @@ -0,0 +1,13 @@ +from policyengine_us.model_api import * + + +class ar_tea_countable_income(Variable): + value_type = float + entity = SPMUnit + label = "Arkansas TEA countable income" + unit = USD + definition_period = MONTH + reference = "https://www.law.cornell.edu/regulations/arkansas/208-00-13-Ark-Code-R-SS-001" + defined_for = StateCode.AR + + adds = ["ar_tea_countable_earned_income", "tanf_gross_unearned_income"] diff --git a/uv.lock b/uv.lock index eba54261b90..9e764e578ee 100644 --- a/uv.lock +++ b/uv.lock @@ -1534,7 +1534,7 @@ wheels = [ [[package]] name = "policyengine-us" -version = "1.471.0" +version = "1.474.0" source = { editable = "." } dependencies = [ { name = "microdf-python" },