diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb2d..f8f61c000cc 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,4 @@ +- bump: minor + changes: + added: + - Add Florida Temporary Cash Assistance (TCA) program. diff --git a/policyengine_us/parameters/gov/states/fl/dcf/tanf/income/disregard/first_amount.yaml b/policyengine_us/parameters/gov/states/fl/dcf/tanf/income/disregard/first_amount.yaml new file mode 100644 index 00000000000..2aca8a1ebc9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/fl/dcf/tanf/income/disregard/first_amount.yaml @@ -0,0 +1,12 @@ +description: Florida excludes this amount from gross earned income as the first part of the earned income disregard under the Temporary Cash Assistance program. + +values: + 1996-01-01: 200 + +metadata: + unit: currency-USD + period: month + label: Florida TCA earned income disregard first amount + reference: + - title: Florida Statutes 414.095(11) - Earned Income Disregard + href: https://www.leg.state.fl.us/statutes/index.cfm?App_mode=Display_Statute&URL=0400-0499/0414/Sections/0414.095.html diff --git a/policyengine_us/parameters/gov/states/fl/dcf/tanf/income/disregard/remaining_rate.yaml b/policyengine_us/parameters/gov/states/fl/dcf/tanf/income/disregard/remaining_rate.yaml new file mode 100644 index 00000000000..17caebb4102 --- /dev/null +++ b/policyengine_us/parameters/gov/states/fl/dcf/tanf/income/disregard/remaining_rate.yaml @@ -0,0 +1,12 @@ +description: Florida excludes this share of remaining earned income after the first amount disregard under the Temporary Cash Assistance program. + +values: + 1996-01-01: 0.5 + +metadata: + unit: /1 + period: month + label: Florida TCA earned income disregard remaining rate + reference: + - title: Florida Statutes 414.095(11) - Earned Income Disregard + href: https://www.leg.state.fl.us/statutes/index.cfm?App_mode=Display_Statute&URL=0400-0499/0414/Sections/0414.095.html diff --git a/policyengine_us/parameters/gov/states/fl/dcf/tanf/income/disregard/standard_disregard.yaml b/policyengine_us/parameters/gov/states/fl/dcf/tanf/income/disregard/standard_disregard.yaml new file mode 100644 index 00000000000..87b3ffafe70 --- /dev/null +++ b/policyengine_us/parameters/gov/states/fl/dcf/tanf/income/disregard/standard_disregard.yaml @@ -0,0 +1,12 @@ +description: Florida deducts this standard amount from gross earned income before applying the $200 and 1/2 disregard under the Temporary Cash Assistance program net income test. + +values: + 1996-01-01: 90 + +metadata: + unit: currency-USD + period: month + label: Florida TCA standard earned income disregard + reference: + - title: Florida DCF Policy Manual 2620.0111.01 - Income Test and Benefit Determination + href: https://www.myflfamilies.com/sites/default/files/2023-02/2600.pdf#page=21 diff --git a/policyengine_us/parameters/gov/states/fl/dcf/tanf/income/gross_test/gross_income_limit_rate.yaml b/policyengine_us/parameters/gov/states/fl/dcf/tanf/income/gross_test/gross_income_limit_rate.yaml new file mode 100644 index 00000000000..f2123603780 --- /dev/null +++ b/policyengine_us/parameters/gov/states/fl/dcf/tanf/income/gross_test/gross_income_limit_rate.yaml @@ -0,0 +1,14 @@ +description: Florida limits gross income to this share of the federal poverty level under the Temporary Cash Assistance program. + +values: + 1996-01-01: 1.85 + +metadata: + unit: /1 + period: month + label: Florida TCA gross income limit rate + reference: + - title: FAC 65A-4.220 - Amount and Duration of Cash Payment + href: https://www.law.cornell.edu/regulations/florida/Fla-Admin-Code-Ann-R-65A-4-220 + - title: Florida Statutes 414.095 - Eligibility for Temporary Cash Assistance + href: https://www.leg.state.fl.us/statutes/index.cfm?App_mode=Display_Statute&URL=0400-0499/0414/Sections/0414.095.html diff --git a/policyengine_us/parameters/gov/states/fl/dcf/tanf/max_family_size.yaml b/policyengine_us/parameters/gov/states/fl/dcf/tanf/max_family_size.yaml new file mode 100644 index 00000000000..1db0dfd745b --- /dev/null +++ b/policyengine_us/parameters/gov/states/fl/dcf/tanf/max_family_size.yaml @@ -0,0 +1,12 @@ +description: Florida caps family size at this number for the payment standard table under the Temporary Cash Assistance program. + +metadata: + unit: person + period: year + label: Florida TCA maximum family size + reference: + - title: Florida Statutes 414.095(10) - Payment Standards + href: https://www.leg.state.fl.us/statutes/index.cfm?App_mode=Display_Statute&URL=0400-0499/0414/Sections/0414.095.html + +values: + 1996-01-01: 13 diff --git a/policyengine_us/parameters/gov/states/fl/dcf/tanf/payment_standard/high_shelter.yaml b/policyengine_us/parameters/gov/states/fl/dcf/tanf/payment_standard/high_shelter.yaml new file mode 100644 index 00000000000..5b150a20916 --- /dev/null +++ b/policyengine_us/parameters/gov/states/fl/dcf/tanf/payment_standard/high_shelter.yaml @@ -0,0 +1,40 @@ +description: Florida provides this amount as the payment standard for households with shelter obligation exceeding fifty dollars under the Temporary Cash Assistance program. + +metadata: + unit: currency-USD + period: month + breakdown: + - range(0, 20) + label: Florida TCA high shelter payment standard + reference: + - title: Florida Statutes 414.095(10) - Payment Standards + href: https://www.leg.state.fl.us/statutes/index.cfm?App_mode=Display_Statute&URL=0400-0499/0414/Sections/0414.095.html + - title: FAC 65A-4.220 - Amount and Duration of Cash Payment + href: https://www.law.cornell.edu/regulations/florida/Fla-Admin-Code-Ann-R-65A-4-220 + +1: + 1992-01-01: 180 +2: + 1992-01-01: 241 +3: + 1992-01-01: 303 +4: + 1992-01-01: 364 +5: + 1992-01-01: 426 +6: + 1992-01-01: 487 +7: + 1992-01-01: 549 +8: + 1992-01-01: 610 +9: + 1992-01-01: 671 +10: + 1992-01-01: 733 +11: + 1992-01-01: 795 +12: + 1992-01-01: 857 +13: + 1992-01-01: 919 diff --git a/policyengine_us/parameters/gov/states/fl/dcf/tanf/payment_standard/low_shelter.yaml b/policyengine_us/parameters/gov/states/fl/dcf/tanf/payment_standard/low_shelter.yaml new file mode 100644 index 00000000000..9c21f451aa8 --- /dev/null +++ b/policyengine_us/parameters/gov/states/fl/dcf/tanf/payment_standard/low_shelter.yaml @@ -0,0 +1,40 @@ +description: Florida provides this amount as the payment standard for households with shelter obligation between one and fifty dollars under the Temporary Cash Assistance program. + +metadata: + unit: currency-USD + period: month + breakdown: + - range(0, 20) + label: Florida TCA low shelter payment standard + reference: + - title: Florida Statutes 414.095(10) - Payment Standards + href: https://www.leg.state.fl.us/statutes/index.cfm?App_mode=Display_Statute&URL=0400-0499/0414/Sections/0414.095.html + - title: FAC 65A-4.220 - Amount and Duration of Cash Payment + href: https://www.law.cornell.edu/regulations/florida/Fla-Admin-Code-Ann-R-65A-4-220 + +1: + 1992-01-01: 153 +2: + 1992-01-01: 205 +3: + 1992-01-01: 258 +4: + 1992-01-01: 309 +5: + 1992-01-01: 362 +6: + 1992-01-01: 414 +7: + 1992-01-01: 467 +8: + 1992-01-01: 519 +9: + 1992-01-01: 570 +10: + 1992-01-01: 623 +11: + 1992-01-01: 676 +12: + 1992-01-01: 728 +13: + 1992-01-01: 781 diff --git a/policyengine_us/parameters/gov/states/fl/dcf/tanf/payment_standard/zero_shelter.yaml b/policyengine_us/parameters/gov/states/fl/dcf/tanf/payment_standard/zero_shelter.yaml new file mode 100644 index 00000000000..303cd1c089b --- /dev/null +++ b/policyengine_us/parameters/gov/states/fl/dcf/tanf/payment_standard/zero_shelter.yaml @@ -0,0 +1,40 @@ +description: Florida provides this amount as the payment standard for households with zero shelter obligation under the Temporary Cash Assistance program. + +metadata: + unit: currency-USD + period: month + breakdown: + - range(0, 20) + label: Florida TCA zero shelter payment standard + reference: + - title: Florida Statutes 414.095(10) - Payment Standards + href: https://www.leg.state.fl.us/statutes/index.cfm?App_mode=Display_Statute&URL=0400-0499/0414/Sections/0414.095.html + - title: FAC 65A-4.220 - Amount and Duration of Cash Payment + href: https://www.law.cornell.edu/regulations/florida/Fla-Admin-Code-Ann-R-65A-4-220 + +1: + 1996-01-01: 95 +2: + 1996-01-01: 158 +3: + 1996-01-01: 198 +4: + 1996-01-01: 254 +5: + 1996-01-01: 289 +6: + 1996-01-01: 346 +7: + 1996-01-01: 392 +8: + 1996-01-01: 438 +9: + 1996-01-01: 485 +10: + 1996-01-01: 534 +11: + 1996-01-01: 582 +12: + 1996-01-01: 630 +13: + 1996-01-01: 678 diff --git a/policyengine_us/parameters/gov/states/fl/dcf/tanf/resources/asset_limit.yaml b/policyengine_us/parameters/gov/states/fl/dcf/tanf/resources/asset_limit.yaml new file mode 100644 index 00000000000..d718164bd6b --- /dev/null +++ b/policyengine_us/parameters/gov/states/fl/dcf/tanf/resources/asset_limit.yaml @@ -0,0 +1,14 @@ +description: Florida limits countable assets to this amount under the Temporary Cash Assistance program. + +values: + 1996-01-01: 2_000 + +metadata: + unit: currency-USD + period: month + label: Florida TCA asset limit + reference: + - title: FAC 65A-1.716 - Income and Resource Criteria + href: https://www.law.cornell.edu/regulations/florida/Fla-Admin-Code-Ann-R-65A-1-716 + - title: Florida DCF Temporary Cash Assistance + href: https://www.myflfamilies.com/services/public-assistance/temporary-cash-assistance diff --git a/policyengine_us/parameters/gov/states/fl/dcf/tanf/shelter_cost_threshold.yaml b/policyengine_us/parameters/gov/states/fl/dcf/tanf/shelter_cost_threshold.yaml new file mode 100644 index 00000000000..dd6db6b1267 --- /dev/null +++ b/policyengine_us/parameters/gov/states/fl/dcf/tanf/shelter_cost_threshold.yaml @@ -0,0 +1,14 @@ +description: Florida uses this amount as the threshold between payment standard tiers based on monthly shelter obligation under the Temporary Cash Assistance program. + +values: + 1992-01-01: 50 + +metadata: + unit: currency-USD + period: month + label: Florida TCA shelter cost threshold + reference: + - title: Florida Statutes 414.095(10) - Payment Standards + href: https://www.leg.state.fl.us/statutes/index.cfm?App_mode=Display_Statute&URL=0400-0499/0414/Sections/0414.095.html + - title: FAC 65A-4.220 - Amount and Duration of Cash Payment + href: https://www.law.cornell.edu/regulations/florida/Fla-Admin-Code-Ann-R-65A-4-220 diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/fl_tca.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/fl_tca.yaml new file mode 100644 index 00000000000..6bea0d4964e --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/fl_tca.yaml @@ -0,0 +1,142 @@ +# Tests Florida TCA final benefit amount +# Formula: Benefit = max(Payment Standard - Net Countable Income, 0) +# Source: Florida Statutes 414.095(12), FAC 65A-4.220 +# +# NOTE: Basic scenarios (zero income, earned income, shelter tiers, eligibility) +# are covered in integration.yaml. This file tests edge cases of the benefit formula. + +- name: Case 1, benefit of $11. + period: 2024-01 + input: + people: + person1: + age: 30 + social_security: 2_760 # $230/month annual + rent: 12_000 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca: 11 + # Payment standard: $241 + # Countable income: $230 + # Benefit: 241 - 230 = $11 + +- name: Case 2, benefit of $1. + period: 2024-01 + input: + people: + person1: + age: 30 + social_security: 2_880 # $240/month annual + rent: 12_000 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca: 1 + # Payment standard: $241 + # Countable income: $240 + # Benefit: 241 - 240 = $1 + +- name: Case 3, maximum family size 13 full benefit. + period: 2024-01 + input: + people: + person1: + age: 35 + rent: 12_000 + person2: + age: 33 + person3: + age: 17 + person4: + age: 15 + person5: + age: 13 + person6: + age: 11 + person7: + age: 9 + person8: + age: 7 + person9: + age: 5 + person10: + age: 4 + person11: + age: 3 + person12: + age: 2 + person13: + age: 1 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11, person12, person13] + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, person11, person12, person13] + state_code: FL + output: + fl_tca: 919 + # Payment standard: $919 (size 13, >$50 shelter) + # Countable income: $0 + # Benefit: $919 + +- name: Case 4, income results in exactly zero benefit. + period: 2024-01 + input: + people: + person1: + age: 30 + social_security: 2_892 # $241/month annual + rent: 12_000 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca: 0 + # Payment standard: $241 + # Countable income: $241 + # Benefit: 241 - 241 = $0 + +- name: Case 5, income exceeds payment standard negative clip. + period: 2024-01 + input: + people: + person1: + age: 30 + social_security: 3_600 # $300/month annual + rent: 12_000 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca: 0 + # Payment standard: $241 + # Countable income: $300 + # Calculated benefit: max(241 - 300, 0) = 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/fl_tca_countable_earned_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/fl_tca_countable_earned_income.yaml new file mode 100644 index 00000000000..d98d427e36b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/fl_tca_countable_earned_income.yaml @@ -0,0 +1,229 @@ +# Tests Florida TCA earned income disregard +# Formula: Countable = max(max(Gross - $90, 0) - $200, 0) * 0.5 +# Per DCF 2620.0111.01: Step 2 subtract $90, Step 3 subtract $200 and 1/2 of remainder +# Source: Florida Statutes 414.095(11), DCF Policy Manual 2620.0111.01 + +- name: Case 1, zero earned income. + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 0 + households: + household: + members: [person1] + state_code: FL + output: + fl_tca_countable_earned_income: 0 + # $0 earned → $0 countable + +- name: Case 2, earned income at $200 (below $290 threshold). + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 2_400 # $200/month + households: + household: + members: [person1] + state_code: FL + output: + fl_tca_countable_earned_income: 0 + # $200/month: max(max(200-90,0)-200,0)*0.5 = max(110-200,0)*0.5 = 0 + +- name: Case 3, earned income $500. + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 6_000 # $500/month + households: + household: + members: [person1] + state_code: FL + output: + fl_tca_countable_earned_income: 105 + # $500: After $90 = 410, after $200 = 210, * 0.5 = $105 + +- name: Case 4, earned income $1000. + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 12_000 # $1,000/month + households: + household: + members: [person1] + state_code: FL + output: + fl_tca_countable_earned_income: 355 + # $1000: After $90 = 910, after $200 = 710, * 0.5 = $355 + +- name: Case 5, earned income $100 (below $90 disregard). + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 1_200 # $100/month + households: + household: + members: [person1] + state_code: FL + output: + fl_tca_countable_earned_income: 0 + # $100: After $90 = 10, after $200 = 0, * 0.5 = $0 + +- name: Case 6, multiple earners $800 combined. + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 6_000 # $500/month + person2: + employment_income_before_lsr: 3_600 # $300/month + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_countable_earned_income: 255 + # Combined: $800, after $90 = 710, after $200 = 510, * 0.5 = $255 + +# ============================================================ +# Edge Cases +# ============================================================ + +- name: Case 7, earned income at $290 threshold. + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 3_480 # $290/month + households: + household: + members: [person1] + state_code: FL + output: + fl_tca_countable_earned_income: 0 + # $290: After $90 = 200, after $200 = 0, * 0.5 = $0 + # Tests: exact threshold ($90 + $200 = $290) + +- name: Case 8, earned income $291 (one dollar above threshold). + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 3_492 # $291/month + households: + household: + members: [person1] + state_code: FL + output: + fl_tca_countable_earned_income: 0.5 + # $291: After $90 = 201, after $200 = 1, * 0.5 = $0.50 + +- name: Case 9, very high earned income $5000. + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 60_000 # $5,000/month + households: + household: + members: [person1] + state_code: FL + output: + fl_tca_countable_earned_income: 2_355 + # $5000: After $90 = 4910, after $200 = 4710, * 0.5 = $2,355 + +- name: Case 10, multiple earners $550 combined. + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 6_000 # $500/month + person2: + employment_income_before_lsr: 600 # $50/month + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_countable_earned_income: 130 + # Combined: $550, after $90 = 460, after $200 = 260, * 0.5 = $130 + +- name: Case 11, earned income exactly at $90. + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 1_080 # $90/month + households: + household: + members: [person1] + state_code: FL + output: + fl_tca_countable_earned_income: 0 + # $90: After $90 = 0, after $200 = 0, * 0.5 = $0 + +- name: Case 12, earned income $400. + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 4_800 # $400/month + households: + household: + members: [person1] + state_code: FL + output: + fl_tca_countable_earned_income: 55 + # $400: After $90 = 310, after $200 = 110, * 0.5 = $55 + +- name: Case 13, earned income $300. + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 3_600 # $300/month + households: + household: + members: [person1] + state_code: FL + output: + fl_tca_countable_earned_income: 5 + # $300: After $90 = 210, after $200 = 10, * 0.5 = $5 + +- name: Case 14, earned income $89 (one dollar below $90 disregard). + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 1_068 # $89/month + households: + household: + members: [person1] + state_code: FL + output: + fl_tca_countable_earned_income: 0 + # $89: After $90 = max(89-90, 0) = 0 + +- name: Case 15, earned income $91 (one dollar above $90 disregard). + period: 2024-01 + input: + people: + person1: + employment_income_before_lsr: 1_092 # $91/month + households: + household: + members: [person1] + state_code: FL + output: + fl_tca_countable_earned_income: 0 + # $91: After $90 = 1, after $200 = max(1-200, 0) = 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/fl_tca_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/fl_tca_eligible.yaml new file mode 100644 index 00000000000..9e8770f4316 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/fl_tca_eligible.yaml @@ -0,0 +1,159 @@ +# Tests Florida TCA overall eligibility +# Eligible if: Gross income test AND Net income test pass +# Source: Florida Statutes 414.095, FAC 65A-4.220 + +- name: Case 1, zero income fully eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + rent: 12_000 # $1,000/month + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_eligible: true + # Gross test: 0 < 185% FPL -> Pass + # Net test: 0 < $241 payment standard -> Pass + +- name: Case 2, passes gross but fails net test. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 12_000 # $1,000/month + rent: 12_000 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_eligible: false + # Gross test: $1,000 < 185% FPL ($3,151) -> Pass + # Net test: max(max(1000-90,0)-200,0)*0.5 = 355 > $241 -> Fail + # Must pass BOTH tests + +- name: Case 3, fails gross income test. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 48_000 # $4,000/month + rent: 12_000 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_eligible: false + # Gross test: $4,000 > 185% FPL ($3,151) -> Fail + +- name: Case 4, parent with one child eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + rent: 12_000 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_eligible: true + # Has dependent child (required for TANF) + # Gross test: 0 < 185% FPL ($3,151) -> Pass + # Net test: 0 < $241 payment standard -> Pass + +- name: Case 5, moderate income eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 6_000 # $500/month + rent: 12_000 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_eligible: true + # Gross test: $500 < 185% FPL -> Pass + # Net test: max(max(500-90,0)-200,0)*0.5 = 105 < $241 -> Pass + +- name: Case 6, larger family with higher thresholds. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 12_000 # $1,000/month + rent: 12_000 + person2: + age: 10 + person3: + age: 8 + person4: + age: 5 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: FL + output: + fl_tca_eligible: true + # Size 4, >$50 shelter payment standard: $364 + # Countable income: max(max(1000-90,0)-200,0)*0.5 = 355 + # Net test: 355 < $364 -> Pass + +- name: Case 7, adult-only household ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + rent: 12_000 + person2: + age: 28 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_eligible: false + # No dependent child -> demographic ineligible diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/fl_tca_gross_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/fl_tca_gross_income_eligible.yaml new file mode 100644 index 00000000000..87da08a6dc8 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/fl_tca_gross_income_eligible.yaml @@ -0,0 +1,81 @@ +# Tests Florida TCA gross income test (185% of FPL) +# Formula: Total Gross Income (earned + unearned) < 185% FPL +# Per DCF 2620.0109.01: NO disregards applied in gross test +# Source: FAC 65A-4.220, DCF Policy Manual 2620.0109.01 + +# 2024: 185% FPL for 2 people = $20,440 * 1.85 / 12 = $3,151.17/month + +- name: Case 1, zero income eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_gross_income_eligible: true + +- name: Case 2, one dollar below threshold eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 37_800 # ~$3,150/month + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_gross_income_eligible: true + +- name: Case 3, at threshold ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 37_814 # ~$3,151.17/month + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_gross_income_eligible: false + +- name: Case 4, one dollar above threshold ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 37_826 # ~$3,152/month + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_gross_income_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/fl_tca_net_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/fl_tca_net_income_eligible.yaml new file mode 100644 index 00000000000..0981301af24 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/fl_tca_net_income_eligible.yaml @@ -0,0 +1,84 @@ +# Tests Florida TCA net income test (payment standard test) +# Net countable income must be less than payment standard +# Source: Florida Statutes 414.095(12), FAC 65A-4.220 + +# Payment standard for size 2, >$50 shelter: $241 + +- name: Case 1, zero income eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + rent: 12_000 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_net_income_eligible: true + +- name: Case 2, one dollar below threshold eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + social_security: 2_880 # $240/month + rent: 12_000 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_net_income_eligible: true + +- name: Case 3, at threshold ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + social_security: 2_892 # $241/month + rent: 12_000 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_net_income_eligible: false + +- name: Case 4, one dollar above threshold ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + social_security: 2_904 # $242/month + rent: 12_000 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_net_income_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/fl_tca_payment_standard.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/fl_tca_payment_standard.yaml new file mode 100644 index 00000000000..795a4cd6031 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/fl_tca_payment_standard.yaml @@ -0,0 +1,103 @@ +# Tests Florida TCA payment standard based on shelter tier and family size +# Three shelter tiers: $0, $1-$50, >$50 +# Source: Florida Statutes 414.095(10), FAC 65A-4.220 + +- name: Case 1, size 1 zero shelter. + period: 2024-01 + input: + spm_unit_size: 1 + housing_cost: 0 + state_code: FL + output: + fl_tca_payment_standard: 95 + +- name: Case 2, size 1 low shelter. + period: 2024-01 + input: + spm_unit_size: 1 + housing_cost: 300 # $25/month + state_code: FL + output: + fl_tca_payment_standard: 153 + +- name: Case 3, size 1 high shelter. + period: 2024-01 + input: + spm_unit_size: 1 + housing_cost: 12_000 + state_code: FL + output: + fl_tca_payment_standard: 180 + +- name: Case 4, size 2 zero shelter. + period: 2024-01 + input: + spm_unit_size: 2 + housing_cost: 0 + state_code: FL + output: + fl_tca_payment_standard: 158 + +- name: Case 5, size 2 low shelter. + period: 2024-01 + input: + spm_unit_size: 2 + housing_cost: 600 # $50/month (boundary) + state_code: FL + output: + fl_tca_payment_standard: 205 + +- name: Case 6, size 2 high shelter. + period: 2024-01 + input: + spm_unit_size: 2 + housing_cost: 612 # $51/month (just above boundary) + state_code: FL + output: + fl_tca_payment_standard: 241 + +- name: Case 7, size 3 zero shelter. + period: 2024-01 + input: + spm_unit_size: 3 + housing_cost: 0 + state_code: FL + output: + fl_tca_payment_standard: 198 + +- name: Case 8, size 3 low shelter. + period: 2024-01 + input: + spm_unit_size: 3 + housing_cost: 300 + state_code: FL + output: + fl_tca_payment_standard: 258 + +- name: Case 9, size 3 high shelter. + period: 2024-01 + input: + spm_unit_size: 3 + housing_cost: 12_000 + state_code: FL + output: + fl_tca_payment_standard: 303 + +- name: Case 10, size 14 caps at size 13. + period: 2024-01 + input: + spm_unit_size: 14 + housing_cost: 12_000 + state_code: FL + output: + fl_tca_payment_standard: 919 + +- name: Case 11, shelter cost $1 (minimum low tier). + period: 2024-01 + input: + spm_unit_size: 2 + housing_cost: 12 # $1/month + state_code: FL + output: + fl_tca_payment_standard: 205 + # $1 shelter is in $1-$50 tier, not zero tier diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/fl_tca_resources_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/fl_tca_resources_eligible.yaml new file mode 100644 index 00000000000..4a3addf94ed --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/fl_tca_resources_eligible.yaml @@ -0,0 +1,71 @@ +# Tests Florida TCA resource eligibility +# Asset limit: $2,000 in countable resources +# Source: FAC 65A-1.716, Florida DCF TCA Page + +- name: Case 1, zero assets eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + spm_unit_assets: 0 + households: + household: + members: [person1] + state_code: FL + output: + fl_tca_resources_eligible: true + +- name: Case 2, one dollar below limit eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + spm_unit_assets: 1_999 + households: + household: + members: [person1] + state_code: FL + output: + fl_tca_resources_eligible: true + +- name: Case 3, at limit eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + spm_unit_assets: 2_000 + households: + household: + members: [person1] + state_code: FL + output: + fl_tca_resources_eligible: true + +- name: Case 4, one dollar above limit ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + spm_units: + spm_unit: + members: [person1] + spm_unit_assets: 2_001 + households: + household: + members: [person1] + state_code: FL + output: + fl_tca_resources_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/integration.yaml new file mode 100644 index 00000000000..59db65f7eed --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf/integration.yaml @@ -0,0 +1,590 @@ +# Florida TCA Integration Tests +# Comprehensive end-to-end tests for Temporary Cash Assistance program +# Sources: Florida Statutes 414.095, FAC 65A-4 + +# 2024 FPL values (Contiguous US): +# 1 person: $15,060/year = $1,255/month; 185% = $2,321.75/month +# 2 people: $20,440/year; 185% = $3,151.17/month +# 3 people: $25,820/year; 185% = $3,980.58/month + +# Payment Standard Table (>$50 shelter tier): +# Size 2: $241, Size 3: $303, Size 4: $364 + +- name: Case 1, single parent with one child, zero income, full benefit. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 0 + rent: 12_000 # $1,000/month (>$50 shelter tier) + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + # Income calculations + fl_tca_countable_earned_income: 0 + # No earned income + fl_tca_countable_income: 0 + # Total: 0 + 0 = 0 + + # Eligibility tests + fl_tca_gross_income_eligible: true + # Adjusted gross: 0 < 185% FPL ($3,151) -> Pass + fl_tca_net_income_eligible: true + # Countable: 0 < payment standard ($241) -> Pass + fl_tca_eligible: true + + # Benefit calculation + fl_tca_payment_standard: 241 + # Size 2, >$50 shelter + fl_tca: 241 + # Benefit: 241 - 0 = $241 + +- name: Case 2, single parent with earnings and child. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 6_000 # $500/month + rent: 12_000 + person2: + age: 8 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + # Income calculations + fl_tca_countable_earned_income: 105 + # Earned: $500/month + # After $90: 410, after $200: 210, * 0.5 = 105 + fl_tca_countable_income: 105 + # 105 + 0 = 105 + + # Eligibility tests + fl_tca_gross_income_eligible: true + # Gross: $500 < $3,151 -> Pass + fl_tca_net_income_eligible: true + # Countable: 105 < 241 -> Pass + fl_tca_eligible: true + + # Benefit calculation + fl_tca_payment_standard: 241 + fl_tca: 136 + # Benefit: 241 - 105 = $136 + +- name: Case 3, family of 3 with zero shelter obligation. + period: 2024-01 + input: + people: + person1: + age: 30 + rent: 0 # Zero shelter tier + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: FL + output: + fl_tca_countable_income: 0 + fl_tca_gross_income_eligible: true + fl_tca_net_income_eligible: true + fl_tca_eligible: true + fl_tca_payment_standard: 198 + # Size 3, $0 shelter tier -> $198 + fl_tca: 198 + +- name: Case 4, family of 3 with $25 shelter obligation. + period: 2024-01 + input: + people: + person1: + age: 30 + rent: 300 # $25/month ($1-$50 shelter tier) + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: FL + output: + fl_tca_countable_income: 0 + fl_tca_gross_income_eligible: true + fl_tca_net_income_eligible: true + fl_tca_eligible: true + fl_tca_payment_standard: 258 + # Size 3, $1-$50 shelter tier -> $258 + fl_tca: 258 + +- name: Case 5, family of 3 with $100 shelter obligation. + period: 2024-01 + input: + people: + person1: + age: 30 + rent: 1_200 # $100/month (>$50 shelter tier) + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: FL + output: + fl_tca_countable_income: 0 + fl_tca_gross_income_eligible: true + fl_tca_net_income_eligible: true + fl_tca_eligible: true + fl_tca_payment_standard: 303 + # Size 3, >$50 shelter tier -> $303 + fl_tca: 303 + +- name: Case 6, income exceeds net income limit but passes gross test. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 12_000 # $1,000/month + rent: 12_000 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + # Income calculations + fl_tca_countable_earned_income: 355 + # After $90: 910, after $200: 710, * 0.5 = 355 + fl_tca_countable_income: 355 + + # Eligibility tests + fl_tca_gross_income_eligible: true + # Gross: $1,000 < $3,151 -> Pass + fl_tca_net_income_eligible: false + # 355 > $241 -> Fail + fl_tca_eligible: false + # Failed net test + + # Benefit + fl_tca_payment_standard: 241 + fl_tca: 0 + # Ineligible -> $0 + +- name: Case 7, income exceeds gross income limit. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 48_000 # $4,000/month + rent: 12_000 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_countable_earned_income: 1_855 + # After $90: 3910, after $200: 3710, * 0.5 = 1,855 + fl_tca_countable_income: 1_855 + fl_tca_gross_income_eligible: false + # Gross: $4,000 > $3,151 -> Fail + fl_tca_net_income_eligible: false + # 1,855 > $241 -> Also fails + fl_tca_eligible: false + fl_tca: 0 + +- name: Case 8, small benefit with unearned income. + period: 2024-01 + input: + people: + person1: + age: 30 + social_security: 2_820 # $235/month annual # Unearned income + rent: 12_000 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_countable_earned_income: 0 + fl_tca_countable_income: 235 + fl_tca_gross_income_eligible: true + # 235 < $3,151 -> Pass + fl_tca_net_income_eligible: true + # 235 < $241 -> Pass + fl_tca_eligible: true + fl_tca_payment_standard: 241 + fl_tca: 6 + # Benefit: 241 - 235 = $6 + +- name: Case 9, two parents with two children eligible. + period: 2024-01 + input: + people: + person1: + age: 35 + employment_income_before_lsr: 3_600 # $300/month + rent: 12_000 + person2: + age: 32 + person3: + age: 10 + person4: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: FL + output: + fl_tca_countable_earned_income: 5 + # After $90: 210, after $200: 10, * 0.5 = 5 + fl_tca_countable_income: 5 + fl_tca_gross_income_eligible: true + # Gross: $300 < 185% FPL for 4 ($4,810) -> Pass + fl_tca_net_income_eligible: true + # 5 < $364 -> Pass + fl_tca_eligible: true + fl_tca_payment_standard: 364 + # Size 4, >$50 shelter + fl_tca: 359 + # 364 - 5 = $359 + +- name: Case 10, mixed income sources. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 4_800 # $400/month + social_security: 2_400 # $200/month annual + rent: 12_000 + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: FL + output: + fl_tca_countable_earned_income: 55 + # After $90: 310, after $200: 110, * 0.5 = 55 + fl_tca_countable_income: 255 + # 55 + 200 = 255 + fl_tca_gross_income_eligible: true + # Gross: 400 + 200 = 600 < $3,981 -> Pass + fl_tca_net_income_eligible: true + # 255 < $303 -> Pass + fl_tca_eligible: true + fl_tca_payment_standard: 303 + fl_tca: 48 + # Benefit: 303 - 255 = $48 + +- name: Case 11, larger family size 5 zero income. + period: 2024-01 + input: + people: + person1: + age: 35 + rent: 12_000 + person2: + age: 12 + person3: + age: 10 + person4: + age: 8 + person5: + age: 5 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: FL + output: + fl_tca_countable_income: 0 + fl_tca_gross_income_eligible: true + fl_tca_net_income_eligible: true + fl_tca_eligible: true + fl_tca_payment_standard: 426 + # Size 5, >$50 shelter + fl_tca: 426 + +# ============================================================ +# Edge Case Integration Tests +# ============================================================ + +- name: Case 12, earned income $200 below $290 threshold. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 2_400 # $200/month exactly + rent: 12_000 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_countable_earned_income: 0 + # After $90: 110, after $200: 0, * 0.5 = 0 + fl_tca_countable_income: 0 + fl_tca_gross_income_eligible: true + # Gross: $200 < $3,151 -> Pass + fl_tca_net_income_eligible: true + # 0 < 241 -> Pass + fl_tca_eligible: true + fl_tca_payment_standard: 241 + fl_tca: 241 + # Full benefit when earned income below $290 threshold + +- name: Case 13, shelter cost exactly at $50 boundary. + period: 2024-01 + input: + people: + person1: + age: 30 + rent: 600 # $50/month exactly + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_countable_income: 0 + fl_tca_gross_income_eligible: true + fl_tca_net_income_eligible: true + fl_tca_eligible: true + fl_tca_payment_standard: 205 + # $50 shelter is in $1-$50 tier -> $205 + fl_tca: 205 + +- name: Case 14, shelter cost $51 crosses to high tier. + period: 2024-01 + input: + people: + person1: + age: 30 + rent: 612 # $51/month + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_countable_income: 0 + fl_tca_gross_income_eligible: true + fl_tca_net_income_eligible: true + fl_tca_eligible: true + fl_tca_payment_standard: 241 + # $51 shelter is in >$50 tier -> $241 + fl_tca: 241 + +- name: Case 15, benefit of $10. + period: 2024-01 + input: + people: + person1: + age: 30 + social_security: 2_772 # $231/month annual + rent: 12_000 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_countable_earned_income: 0 + fl_tca_countable_income: 231 + fl_tca_gross_income_eligible: true + fl_tca_net_income_eligible: true + # 231 < 241 -> Pass + fl_tca_eligible: true + fl_tca_payment_standard: 241 + fl_tca: 10 + # Benefit: 241 - 231 = $10 + +- name: Case 16, benefit of $9. + period: 2024-01 + input: + people: + person1: + age: 30 + social_security: 2_784 # $232/month annual + rent: 12_000 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_countable_earned_income: 0 + fl_tca_countable_income: 232 + fl_tca_gross_income_eligible: true + fl_tca_net_income_eligible: true + fl_tca_eligible: true + fl_tca_payment_standard: 241 + fl_tca: 9 + # Benefit: 241 - 232 = $9 + +- name: Case 17, multiple earners with varying income. + period: 2024-01 + input: + people: + person1: + age: 35 + employment_income_before_lsr: 3_600 # $300/month + rent: 12_000 + person2: + age: 33 + employment_income_before_lsr: 2_400 # $200/month + person3: + age: 10 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: FL + output: + fl_tca_countable_earned_income: 105 + # Combined: 300 + 200 = 500 + # After $90: 410, after $200: 210, * 0.5 = 105 + fl_tca_countable_income: 105 + fl_tca_gross_income_eligible: true + # Gross: $500 < $3,981 -> Pass + fl_tca_net_income_eligible: true + # 105 < 303 -> Pass + fl_tca_eligible: true + fl_tca_payment_standard: 303 + fl_tca: 198 + # 303 - 105 = $198 + +- name: Case 18, assets at limit with income. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 3_600 # $300/month + rent: 12_000 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_assets: 2_000 # Exactly at limit + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_countable_earned_income: 5 + # After $90: 210, after $200: 10, * 0.5 = 5 + fl_tca_countable_income: 5 + fl_tca_resources_eligible: true + # 2,000 <= 2,000 -> Pass + fl_tca_gross_income_eligible: true + fl_tca_net_income_eligible: true + fl_tca_eligible: true + fl_tca_payment_standard: 241 + fl_tca: 236 + # 241 - 5 = $236 + +- name: Case 19, assets over limit ineligible. + period: 2024-01 + input: + people: + person1: + age: 30 + rent: 12_000 + person2: + age: 10 + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_assets: 2_001 # One dollar over limit + households: + household: + members: [person1, person2] + state_code: FL + output: + fl_tca_countable_income: 0 + fl_tca_resources_eligible: false + # 2,001 > 2,000 -> Fail + fl_tca_gross_income_eligible: true + fl_tca_net_income_eligible: true + fl_tca_eligible: false + # Failed resource test + fl_tca: 0 diff --git a/policyengine_us/variables/gov/states/fl/dcf/tanf/eligibility/fl_tca_eligible.py b/policyengine_us/variables/gov/states/fl/dcf/tanf/eligibility/fl_tca_eligible.py new file mode 100644 index 00000000000..3b0b0d4d32a --- /dev/null +++ b/policyengine_us/variables/gov/states/fl/dcf/tanf/eligibility/fl_tca_eligible.py @@ -0,0 +1,39 @@ +from policyengine_us.model_api import * + + +class fl_tca_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Florida TCA eligible" + definition_period = MONTH + reference = ( + "https://www.leg.state.fl.us/statutes/index.cfm?App_mode=Display_Statute&URL=0400-0499/0414/Sections/0414.095.html", + "https://www.myflfamilies.com/services/public-assistance/temporary-cash-assistance", + ) + defined_for = StateCode.FL + + def formula(spm_unit, period, parameters): + # Use federal demographic eligibility (minor child with deprived parent) + demographic_eligible = spm_unit("is_demographic_tanf_eligible", period) + + # Use federal immigration eligibility (at least one citizen or qualified immigrant) + immigration_eligible = ( + add(spm_unit, period, ["is_citizen_or_legal_immigrant"]) > 0 + ) + + # Must pass both income tests + gross_income_eligible = spm_unit( + "fl_tca_gross_income_eligible", period + ) + net_income_eligible = spm_unit("fl_tca_net_income_eligible", period) + + # Must pass resource test + resource_eligible = spm_unit("fl_tca_resources_eligible", period) + + return ( + demographic_eligible + & immigration_eligible + & gross_income_eligible + & net_income_eligible + & resource_eligible + ) diff --git a/policyengine_us/variables/gov/states/fl/dcf/tanf/eligibility/fl_tca_gross_income_eligible.py b/policyengine_us/variables/gov/states/fl/dcf/tanf/eligibility/fl_tca_gross_income_eligible.py new file mode 100644 index 00000000000..dc2f6731643 --- /dev/null +++ b/policyengine_us/variables/gov/states/fl/dcf/tanf/eligibility/fl_tca_gross_income_eligible.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +class fl_tca_gross_income_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Florida TCA gross income eligible" + definition_period = MONTH + reference = ( + "https://www.law.cornell.edu/regulations/florida/Fla-Admin-Code-Ann-R-65A-4-220", + "https://www.myflfamilies.com/services/public-assistance/temporary-cash-assistance", + ) + defined_for = StateCode.FL + + def formula(spm_unit, period, parameters): + # Per DCF 2620.0109.01: Gross income test - NO disregards applied + # "The standard earned income disregard, 200 and 1/2 which includes + # the standard earned income disregard of $90, is not deducted in this test." + p = parameters(period).gov.states.fl.dcf.tanf.income.gross_test + + gross_income = spm_unit("fl_tca_gross_income", period) + + # Compare to 185% FPL (annual FPG converted to monthly) + fpg = spm_unit("spm_unit_fpg", period) + gross_income_limit = fpg * p.gross_income_limit_rate + + return gross_income < gross_income_limit diff --git a/policyengine_us/variables/gov/states/fl/dcf/tanf/eligibility/fl_tca_net_income_eligible.py b/policyengine_us/variables/gov/states/fl/dcf/tanf/eligibility/fl_tca_net_income_eligible.py new file mode 100644 index 00000000000..d25029b434b --- /dev/null +++ b/policyengine_us/variables/gov/states/fl/dcf/tanf/eligibility/fl_tca_net_income_eligible.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class fl_tca_net_income_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Florida TCA net income eligible" + definition_period = MONTH + reference = ( + "https://www.leg.state.fl.us/statutes/index.cfm?App_mode=Display_Statute&URL=0400-0499/0414/Sections/0414.095.html", + "https://www.law.cornell.edu/regulations/florida/Fla-Admin-Code-Ann-R-65A-4-220", + ) + defined_for = StateCode.FL + + def formula(spm_unit, period, parameters): + # Per Florida Statutes 414.095(12): Net countable income < payment standard + countable_income = spm_unit("fl_tca_countable_income", period) + payment_standard = spm_unit("fl_tca_payment_standard", period) + return countable_income < payment_standard diff --git a/policyengine_us/variables/gov/states/fl/dcf/tanf/eligibility/fl_tca_resources_eligible.py b/policyengine_us/variables/gov/states/fl/dcf/tanf/eligibility/fl_tca_resources_eligible.py new file mode 100644 index 00000000000..76b17b8b3bd --- /dev/null +++ b/policyengine_us/variables/gov/states/fl/dcf/tanf/eligibility/fl_tca_resources_eligible.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class fl_tca_resources_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Florida TCA resource eligible" + definition_period = MONTH + reference = ( + "https://www.law.cornell.edu/regulations/florida/Fla-Admin-Code-Ann-R-65A-1-716", + "https://www.myflfamilies.com/services/public-assistance/temporary-cash-assistance", + ) + defined_for = StateCode.FL + + def formula(spm_unit, period, parameters): + # Per Florida DCF: Countable assets must be <= $2,000 + p = parameters(period).gov.states.fl.dcf.tanf.resources + assets = spm_unit("spm_unit_assets", period.this_year) + return assets <= p.asset_limit diff --git a/policyengine_us/variables/gov/states/fl/dcf/tanf/fl_tca.py b/policyengine_us/variables/gov/states/fl/dcf/tanf/fl_tca.py new file mode 100644 index 00000000000..ac1b4dfa750 --- /dev/null +++ b/policyengine_us/variables/gov/states/fl/dcf/tanf/fl_tca.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class fl_tca(Variable): + value_type = float + entity = SPMUnit + label = "Florida Temporary Cash Assistance" + unit = USD + definition_period = MONTH + reference = ( + "https://www.leg.state.fl.us/statutes/index.cfm?App_mode=Display_Statute&URL=0400-0499/0414/Sections/0414.095.html", + "https://www.law.cornell.edu/regulations/florida/Fla-Admin-Code-Ann-R-65A-4-220", + ) + defined_for = "fl_tca_eligible" + + def formula(spm_unit, period, parameters): + # Per Florida Statutes 414.095(12) and FAC 65A-4.220 + payment_standard = spm_unit("fl_tca_payment_standard", period) + countable_income = spm_unit("fl_tca_countable_income", period) + + # Benefit = Payment Standard - Countable Income + return max_(payment_standard - countable_income, 0) diff --git a/policyengine_us/variables/gov/states/fl/dcf/tanf/fl_tca_payment_standard.py b/policyengine_us/variables/gov/states/fl/dcf/tanf/fl_tca_payment_standard.py new file mode 100644 index 00000000000..79bafe25693 --- /dev/null +++ b/policyengine_us/variables/gov/states/fl/dcf/tanf/fl_tca_payment_standard.py @@ -0,0 +1,39 @@ +from policyengine_us.model_api import * + + +class fl_tca_payment_standard(Variable): + value_type = float + entity = SPMUnit + label = "Florida TCA payment standard" + unit = USD + definition_period = MONTH + reference = ( + "https://www.leg.state.fl.us/statutes/index.cfm?App_mode=Display_Statute&URL=0400-0499/0414/Sections/0414.095.html", + "https://www.law.cornell.edu/regulations/florida/Fla-Admin-Code-Ann-R-65A-4-220", + ) + defined_for = StateCode.FL + + def formula(spm_unit, period, parameters): + # Per Florida Statutes 414.095(10): Payment based on shelter tier + # Per FAC 65A-4.220(2)(b): Shelter obligation = responsibility to pay for cost of housing + p = parameters(period).gov.states.fl.dcf.tanf + + monthly_shelter = spm_unit("housing_cost", period) + + # Determine unit size, capped at max in parameter table + size = spm_unit("spm_unit_size", period.this_year) + capped_size = min_(size, p.max_family_size) + + # Determine payment standard based on shelter tier + threshold = p.shelter_cost_threshold + zero_shelter = monthly_shelter == 0 + low_shelter = (monthly_shelter > 0) & (monthly_shelter <= threshold) + + return select( + [zero_shelter, low_shelter], + [ + p.payment_standard.zero_shelter[capped_size], + p.payment_standard.low_shelter[capped_size], + ], + default=p.payment_standard.high_shelter[capped_size], + ) diff --git a/policyengine_us/variables/gov/states/fl/dcf/tanf/income/fl_tca_countable_earned_income.py b/policyengine_us/variables/gov/states/fl/dcf/tanf/income/fl_tca_countable_earned_income.py new file mode 100644 index 00000000000..32fd51e69bf --- /dev/null +++ b/policyengine_us/variables/gov/states/fl/dcf/tanf/income/fl_tca_countable_earned_income.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class fl_tca_countable_earned_income(Variable): + value_type = float + entity = SPMUnit + label = "Florida TCA countable earned income" + unit = USD + definition_period = MONTH + reference = "https://www.leg.state.fl.us/statutes/index.cfm?App_mode=Display_Statute&URL=0400-0499/0414/Sections/0414.095.html" + defined_for = StateCode.FL + + def formula(spm_unit, period, parameters): + # Per DCF 2620.0111.01: Income Test and Benefit Determination + # Step 2: Subtract $90 standard disregard + # Step 3: Subtract $200 and 1/2 of remainder + p = parameters(period).gov.states.fl.dcf.tanf.income.disregard + gross_earned = add(spm_unit, period, ["tanf_gross_earned_income"]) + + # Step 2: Subtract $90 standard disregard + after_standard = max_(gross_earned - p.standard_disregard, 0) + + # Step 3: Subtract $200, then 50% of remainder is countable + remaining_after_first = max_(after_standard - p.first_amount, 0) + return remaining_after_first * (1 - p.remaining_rate) diff --git a/policyengine_us/variables/gov/states/fl/dcf/tanf/income/fl_tca_countable_income.py b/policyengine_us/variables/gov/states/fl/dcf/tanf/income/fl_tca_countable_income.py new file mode 100644 index 00000000000..fa04d2f721e --- /dev/null +++ b/policyengine_us/variables/gov/states/fl/dcf/tanf/income/fl_tca_countable_income.py @@ -0,0 +1,15 @@ +from policyengine_us.model_api import * + + +class fl_tca_countable_income(Variable): + value_type = float + entity = SPMUnit + label = "Florida TCA countable income" + unit = USD + definition_period = MONTH + reference = "https://www.leg.state.fl.us/statutes/index.cfm?App_mode=Display_Statute&URL=0400-0499/0414/Sections/0414.095.html" + defined_for = StateCode.FL + adds = [ + "fl_tca_countable_earned_income", + "tanf_gross_unearned_income", + ] diff --git a/policyengine_us/variables/gov/states/fl/dcf/tanf/income/fl_tca_gross_income.py b/policyengine_us/variables/gov/states/fl/dcf/tanf/income/fl_tca_gross_income.py new file mode 100644 index 00000000000..8c0f811c594 --- /dev/null +++ b/policyengine_us/variables/gov/states/fl/dcf/tanf/income/fl_tca_gross_income.py @@ -0,0 +1,13 @@ +from policyengine_us.model_api import * + + +class fl_tca_gross_income(Variable): + value_type = float + entity = SPMUnit + label = "Florida TCA gross income" + unit = USD + definition_period = MONTH + reference = "https://www.leg.state.fl.us/statutes/index.cfm?App_mode=Display_Statute&URL=0400-0499/0414/Sections/0414.095.html" + defined_for = StateCode.FL + + adds = ["tanf_gross_earned_income", "tanf_gross_unearned_income"]