diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb2d..dd3b7e013c3 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,4 @@ +- bump: minor + changes: + added: + - Add Kansas TANF program. diff --git a/policyengine_us/parameters/gov/states/ks/dcf/tanf/income/earned_income_disregard/flat.yaml b/policyengine_us/parameters/gov/states/ks/dcf/tanf/income/earned_income_disregard/flat.yaml new file mode 100644 index 00000000000..47c93986e83 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ks/dcf/tanf/income/earned_income_disregard/flat.yaml @@ -0,0 +1,16 @@ +description: Kansas deducts this amount per employed person for work-related expenses before applying the earned income disregard under the Temporary Assistance for Needy Families program. + +values: + 1996-10-01: 90 + +metadata: + unit: currency-USD + period: month + label: Kansas TANF flat earned income disregard per employed person + reference: + - title: Kan. Admin. Regs. § 30-4-111 - Income (b)(1) + href: https://www.law.cornell.edu/regulations/kansas/K-A-R-30-4-111 + - title: KEESM 7211 - Deduction From Earned Income (1) + href: https://content.dcf.ks.gov/ees/keesm/current/keesm7200.htm + - title: Kansas TANF State Plan FFY 2024-2026 + href: https://www.dcf.ks.gov/services/ees/Documents/Reports/TANF%20State%20Plan%20FFY%202024%20-%202026.pdf#page=28 diff --git a/policyengine_us/parameters/gov/states/ks/dcf/tanf/income/earned_income_disregard/rate.yaml b/policyengine_us/parameters/gov/states/ks/dcf/tanf/income/earned_income_disregard/rate.yaml new file mode 100644 index 00000000000..46d636429db --- /dev/null +++ b/policyengine_us/parameters/gov/states/ks/dcf/tanf/income/earned_income_disregard/rate.yaml @@ -0,0 +1,19 @@ +description: Kansas excludes this share of earnings from countable income under the Temporary Assistance for Needy Families program. + +values: + 1996-10-01: 0.4 + 2008-05-01: 0.6 + +metadata: + unit: /1 + period: month + label: Kansas TANF earned income disregard rate + reference: + - title: Proposed Rate changed in 2008 + href: https://content.dcf.ks.gov/ees/keesm/implem_memo/2008_0326_TAF_ei_disregard.htm + - title: Kan. Admin. Regs. § 30-4-111 - Income (b)(2) + href: https://www.law.cornell.edu/regulations/kansas/K-A-R-30-4-111 + - title: KEESM 7211 - Deduction From Earned Income (2) + href: https://content.dcf.ks.gov/ees/keesm/current/keesm7200.htm + - title: Kansas TANF State Plan FFY 2024-2026 + href: https://www.dcf.ks.gov/services/ees/Documents/Reports/TANF%20State%20Plan%20FFY%202024%20-%202026.pdf#page=28 diff --git a/policyengine_us/parameters/gov/states/ks/dcf/tanf/income/gross_income_limit.yaml b/policyengine_us/parameters/gov/states/ks/dcf/tanf/income/gross_income_limit.yaml new file mode 100644 index 00000000000..71e87f1a34d --- /dev/null +++ b/policyengine_us/parameters/gov/states/ks/dcf/tanf/income/gross_income_limit.yaml @@ -0,0 +1,16 @@ +description: Kansas limits gross income to this percentage of the Federal Poverty Level for Temporary Assistance for Needy Families eligibility. + +values: + 1996-10-01: 0.30 + +metadata: + unit: /1 + period: year + label: Kansas TANF gross income limit as percentage of FPL + reference: + - title: K.S.A. 39-709 - Temporary Assistance for Needy Families + href: https://ksrevisor.gov/statutes/chapters/ch39/039_007_0009.html + - title: KEESM 7200 - Income + href: https://content.dcf.ks.gov/ees/keesm/current/keesm7200.htm + - title: Kansas TANF State Plan FFY 2024-2026 + href: https://www.dcf.ks.gov/services/ees/Documents/Reports/TANF%20State%20Plan%20FFY%202024%20-%202026.pdf diff --git a/policyengine_us/parameters/gov/states/ks/dcf/tanf/max_family_size_in_table.yaml b/policyengine_us/parameters/gov/states/ks/dcf/tanf/max_family_size_in_table.yaml new file mode 100644 index 00000000000..b4169e32bd6 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ks/dcf/tanf/max_family_size_in_table.yaml @@ -0,0 +1,18 @@ +description: Kansas defines payment standard values up to this family size in the Temporary Assistance for Needy Families program. + +values: + 1997-03-01: 4 + +metadata: + unit: person + period: year + label: Kansas TANF maximum family size in payment table + reference: + - title: K.A.R. 30-4-100 - Payment Standards + href: https://www.law.cornell.edu/regulations/kansas/K-A-R-30-4-100 + - title: KEESM 7400 - Standards for Budgetary Requirements + href: https://content.dcf.ks.gov/ees/keesm/current/keesm7400.htm + - title: KEESM Appendix F-4 - TAF Non-Shared Living Standards + href: https://content.dcf.ks.gov/ees/keesm/appendix/F-4_TAFtable07_11.pdf#page=1 + - title: Kansas TANF State Plan FFY 2024-2026 + href: https://www.dcf.ks.gov/services/ees/Documents/Reports/TANF%20State%20Plan%20FFY%202024%20-%202026.pdf#page=29 diff --git a/policyengine_us/parameters/gov/states/ks/dcf/tanf/payment_standard/additional_person_amount.yaml b/policyengine_us/parameters/gov/states/ks/dcf/tanf/payment_standard/additional_person_amount.yaml new file mode 100644 index 00000000000..dddd0437f4b --- /dev/null +++ b/policyengine_us/parameters/gov/states/ks/dcf/tanf/payment_standard/additional_person_amount.yaml @@ -0,0 +1,18 @@ +description: Kansas provides this additional amount per person for family sizes beyond the payment standard table under the Temporary Assistance for Needy Families program. + +values: + 1997-03-01: 61 + +metadata: + unit: currency-USD + period: month + label: Kansas TANF additional person payment amount + reference: + - title: K.A.R. 30-4-100 - Payment Standards + href: https://www.law.cornell.edu/regulations/kansas/K-A-R-30-4-100 + - title: KEESM 7400 - Standards for Budgetary Requirements + href: https://content.dcf.ks.gov/ees/keesm/current/keesm7400.htm + - title: KEESM Appendix F-4 - TAF Non-Shared Living Standards + href: https://content.dcf.ks.gov/ees/keesm/appendix/F-4_TAFtable07_11.pdf#page=1 + - title: Kansas TANF State Plan FFY 2024-2026 + href: https://www.dcf.ks.gov/services/ees/Documents/Reports/TANF%20State%20Plan%20FFY%202024%20-%202026.pdf#page=29 diff --git a/policyengine_us/parameters/gov/states/ks/dcf/tanf/payment_standard/amount.yaml b/policyengine_us/parameters/gov/states/ks/dcf/tanf/payment_standard/amount.yaml new file mode 100644 index 00000000000..9e2cb0dcad9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ks/dcf/tanf/payment_standard/amount.yaml @@ -0,0 +1,30 @@ +description: Kansas provides this amount as the payment standard under the Temporary Assistance for Needy Families program. + +metadata: + unit: currency-USD + period: month + breakdown: + - range(0, 10) + label: Kansas TANF payment standard amount + reference: + - title: K.A.R. 30-4-100 - Payment Standards + href: https://www.law.cornell.edu/regulations/kansas/K-A-R-30-4-100 + - title: K.A.R. 30-4-101 - Basic Standards + href: https://www.law.cornell.edu/regulations/kansas/K-A-R-30-4-101 + - title: KEESM 7400 - Standards for Budgetary Requirements + href: https://content.dcf.ks.gov/ees/keesm/current/keesm7400.htm + - title: KEESM Appendix F-4 - TAF Non-Shared Living Standards + href: https://content.dcf.ks.gov/ees/keesm/appendix/F-4_TAFtable07_11.pdf#page=1 + - title: Kansas TANF State Plan FFY 2024-2026 + href: https://www.dcf.ks.gov/services/ees/Documents/Reports/TANF%20State%20Plan%20FFY%202024%20-%202026.pdf#page=29 + +# Using High Population Counties (Group III) values for Non-shared Living Arrangements +# Per K.A.R. 30-4-101: Basic allowance + $109 shelter (Group III) +1: + 1997-03-01: 241 +2: + 1997-03-01: 326 +3: + 1997-03-01: 403 +4: + 1997-03-01: 471 diff --git a/policyengine_us/parameters/gov/states/ks/dcf/tanf/resource_limit/amount.yaml b/policyengine_us/parameters/gov/states/ks/dcf/tanf/resource_limit/amount.yaml new file mode 100644 index 00000000000..cf19480ea05 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ks/dcf/tanf/resource_limit/amount.yaml @@ -0,0 +1,14 @@ +description: Kansas limits resources to this amount under the Temporary Assistance for Needy Families program. + +values: + 1997-03-01: 3_000 + +metadata: + unit: currency-USD + period: month + label: Kansas TANF resource limit + reference: + - title: KEESM 5000 - Resources + href: https://content.dcf.ks.gov/ees/keesm/current/keesm5000.htm + - title: KEESM 5110 - Resource Limitation + href: https://content.dcf.ks.gov/ees/keesm/current/keesm5000.htm diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/integration.yaml new file mode 100644 index 00000000000..11784a941f6 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/integration.yaml @@ -0,0 +1,363 @@ +# Kansas TANF integration tests +# Tests the complete calculation pipeline from inputs to final benefit +# Key rules: +# - $90 work expense deduction (KEESM 7211) +# - 60% earned income disregard on remainder (KEESM Memo 2008-0326) +# - Dependent care deduction - no cap (KEESM 7224) +# - Gross income must be < 30% FPL (K.S.A. 39-709) +# - Payment standards (High Population Counties, Group III): +# 1=$241, 2=$326, 3=$403, 4=$471, 5+=$471+$61/person +# - Resource limit: $3,000 + +- name: Case 1, family of 3 with no income, receives full benefit. + period: 2025-01 + input: + people: + person1: + age: 30 + person2: + age: 8 + is_tax_unit_dependent: true + person3: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_cash_assets: 1_000 + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: KS + output: + # Intermediate values + spm_unit_size: 3 + ks_tanf_maximum_benefit: 403 + ks_tanf_countable_income: 0 + # Eligibility + ks_tanf_gross_income_eligible: true + ks_tanf_income_eligible: true + ks_tanf_resources_eligible: true + ks_tanf_eligible: true + # Benefit: 403 - 0 = 403 + ks_tanf: 403 + +- name: Case 2, family of 3 with low earned income. + period: 2025-01 + input: + people: + person1: + age: 35 + employment_income_before_lsr: 6_000 # $500/month + person2: + age: 10 + is_tax_unit_dependent: true + person3: + age: 7 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_cash_assets: 500 + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: KS + output: + # Income calculation: + # Gross earned: $6,000/year = $500/month + # Work expense: $90 + # Remainder: $500 - $90 = $410 + # 60% disregard: $410 * 0.60 = $246 + # After deductions: $410 - $246 = $164 + ks_tanf_earned_income_after_deductions: [164, 0, 0] + ks_tanf_countable_earned_income: 164 + ks_tanf_countable_income: 164 + ks_tanf_maximum_benefit: 403 + # Gross income ($500) < 30% FPL for family of 3 (~$670) + ks_tanf_gross_income_eligible: true + ks_tanf_income_eligible: true + ks_tanf_resources_eligible: true + ks_tanf_eligible: true + # Benefit: 403 - 164 = 239 + ks_tanf: 239 + +- name: Case 3, family of 3 with net income exceeding limit. + period: 2025-01 + input: + people: + person1: + age: 32 + employment_income_before_lsr: 9_600 # $800/month + person2: + age: 6 + is_tax_unit_dependent: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_cash_assets: 200 + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: KS + output: + # Gross earned: $9,600/year = $800/month + # Work expense: $90 + # Remainder: $800 - $90 = $710 + # After 60% disregard: $710 * 0.40 = $284 + ks_tanf_earned_income_after_deductions: [284, 0, 0] + ks_tanf_countable_earned_income: 284 + ks_tanf_countable_income: 284 + ks_tanf_maximum_benefit: 403 + # Gross ($800) > 30% FPL for family of 3 (~$670) + ks_tanf_gross_income_eligible: false + ks_tanf_eligible: false + ks_tanf: 0 + +- name: Case 4, family exceeding resource limit. + period: 2025-01 + input: + people: + person1: + age: 28 + person2: + age: 4 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_cash_assets: 5_000 # Exceeds $3,000 limit + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: KS + output: + spm_unit_size: 2 + ks_tanf_maximum_benefit: 326 + # Resources: $5,000 > $3,000 limit + ks_tanf_resources_eligible: false + ks_tanf_eligible: false + ks_tanf: 0 + +- name: Case 5, family of 2 with unearned income only. + period: 2025-01 + input: + people: + person1: + age: 40 + social_security: 2_400 # $200/month + person2: + age: 12 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_cash_assets: 800 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: KS + output: + # Unearned income has no disregard + # Countable: $200/month + ks_tanf_countable_income: 200 + ks_tanf_maximum_benefit: 326 + # Gross ($200) < 30% FPL for family of 2 (~$530) + ks_tanf_gross_income_eligible: true + ks_tanf_income_eligible: true + ks_tanf_resources_eligible: true + ks_tanf_eligible: true + # Benefit: 326 - 200 = 126 + ks_tanf: 126 + +- name: Case 6, family with small benefit. + period: 2025-01 + input: + people: + person1: + age: 33 + employment_income_before_lsr: 4_800 # $400/month + person2: + age: 9 + is_tax_unit_dependent: true + person3: + age: 6 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_cash_assets: 600 + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: KS + output: + # Gross earned: $4,800/year = $400/month + # Work expense: $90 + # Remainder: $400 - $90 = $310 + # After 60% disregard: $310 * 0.40 = $124 + ks_tanf_earned_income_after_deductions: [124, 0, 0] + ks_tanf_countable_earned_income: 124 + ks_tanf_countable_income: 124 + ks_tanf_maximum_benefit: 403 + # Gross ($400) < 30% FPL (~$670) + ks_tanf_gross_income_eligible: true + ks_tanf_income_eligible: true + ks_tanf_eligible: true + # Benefit: 403 - 124 = 279 + ks_tanf: 279 + +- name: Case 7, household with two earners. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 3_600 # $300/month + person2: + age: 28 + employment_income_before_lsr: 2_400 # $200/month + person3: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_cash_assets: 800 + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: KS + output: + # Two earners - deductions applied per person + # Person1: $300 - $90 = $210, $210 * 0.40 = $84 + # Person2: $200 - $90 = $110, $110 * 0.40 = $44 + # Countable earned: $84 + $44 = $128 + spm_unit_size: 3 + ks_tanf_earned_income_after_deductions: [84, 44, 0] + ks_tanf_countable_earned_income: 128 + ks_tanf_countable_income: 128 + ks_tanf_maximum_benefit: 403 + # Gross ($500) < 30% FPL for family of 3 (~$670) + ks_tanf_gross_income_eligible: true + ks_tanf_income_eligible: true + ks_tanf_resources_eligible: true + ks_tanf_eligible: true + # Benefit: 403 - 128 = 275 + ks_tanf: 275 + +- name: Case 8, large family of 5. + period: 2025-01 + input: + people: + adult1: + age: 35 + employment_income_before_lsr: 7_200 # $600/month + adult2: + age: 32 + child1: + age: 12 + is_tax_unit_dependent: true + child2: + age: 8 + is_tax_unit_dependent: true + child3: + age: 4 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [adult1, adult2, child1, child2, child3] + spm_unit_cash_assets: 1_500 + tax_units: + tax_unit: + members: [adult1, adult2, child1, child2, child3] + households: + household: + members: [adult1, adult2, child1, child2, child3] + state_code: KS + output: + # Large family tests the additional-person formula for 5+ members + # Payment standard for 5: $471 + $61 = $532 + # Gross earned: $7,200/year = $600/month + # adult1: $600 - $90 = $510, $510 * 0.40 = $204 + spm_unit_size: 5 + ks_tanf_earned_income_after_deductions: [204, 0, 0, 0, 0] + ks_tanf_countable_earned_income: 204 + ks_tanf_countable_income: 204 + ks_tanf_maximum_benefit: 532 + # Gross ($600) < 30% FPL for family of 5 (~$890) + ks_tanf_gross_income_eligible: true + ks_tanf_income_eligible: true + ks_tanf_resources_eligible: true + ks_tanf_eligible: true + # Benefit: 532 - 204 = 328 + ks_tanf: 328 + +- name: Case 9, family with dependent care expenses. + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income_before_lsr: 6_000 # $500/month + person2: + age: 4 + is_tax_unit_dependent: true + person3: + age: 2 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_cash_assets: 500 + spm_unit_pre_subsidy_childcare_expenses: 1_200 # $100/month + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: KS + output: + # Per KEESM 7224: Dependent care applied AFTER $90 and 60% disregards + # There is NO cap on dependent care in Kansas TANF + # + # Gross earned: $6,000/year = $500/month + # person1: $500 - $90 = $410, $410 * 0.40 = $164 + # Dependent care: $100/month (no cap) + # Countable earned: $164 - $100 = $64 + spm_unit_size: 3 + ks_tanf_earned_income_after_deductions: [164, 0, 0] + ks_tanf_countable_earned_income: 64 + ks_tanf_countable_income: 64 + ks_tanf_maximum_benefit: 403 + ks_tanf_gross_income_eligible: true + ks_tanf_income_eligible: true + ks_tanf_resources_eligible: true + ks_tanf_eligible: true + # Benefit: 403 - 64 = 339 + ks_tanf: 339 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf.yaml new file mode 100644 index 00000000000..2b2862336ed --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf.yaml @@ -0,0 +1,79 @@ +# Kansas TANF benefit calculation test +# Benefit = max(payment_standard - countable_income, 0) +# Source: KEESM 7110, K.A.R. 30-4-100 + +- name: Case 1, eligible with no income, full benefit. + period: 2025-01 + input: + state_code: KS + ks_tanf_eligible: true + ks_tanf_maximum_benefit: 386 + ks_tanf_countable_income: 0 + output: + # Benefit: 386 - 0 = 386 + ks_tanf: 386 + +- name: Case 2, eligible with partial income. + period: 2025-01 + input: + state_code: KS + ks_tanf_eligible: true + ks_tanf_maximum_benefit: 386 + ks_tanf_countable_income: 200 + output: + # Benefit: 386 - 200 = 186 + ks_tanf: 186 + +- name: Case 3, eligible with small benefit. + period: 2025-01 + input: + state_code: KS + ks_tanf_eligible: true + ks_tanf_maximum_benefit: 386 + ks_tanf_countable_income: 350 + output: + # Benefit: 386 - 350 = 36 + ks_tanf: 36 + +- name: Case 4, ineligible, no benefit. + period: 2025-01 + input: + state_code: KS + ks_tanf_eligible: false + ks_tanf_maximum_benefit: 386 + ks_tanf_countable_income: 0 + output: + ks_tanf: 0 + +- name: Case 5, eligible family of 4. + period: 2025-01 + input: + state_code: KS + ks_tanf_eligible: true + ks_tanf_maximum_benefit: 454 + ks_tanf_countable_income: 150 + output: + # Benefit: 454 - 150 = 304 + ks_tanf: 304 + +- name: Case 6, income equals payment standard. + period: 2025-01 + input: + state_code: KS + ks_tanf_eligible: true + ks_tanf_maximum_benefit: 386 + ks_tanf_countable_income: 386 + output: + # Benefit: 386 - 386 = 0 + ks_tanf: 0 + +- name: Case 7, benefit with decimal. + period: 2025-01 + input: + state_code: KS + ks_tanf_eligible: true + ks_tanf_maximum_benefit: 386 + ks_tanf_countable_income: 100.50 + output: + # Benefit: 386 - 100.50 = 285.50 + ks_tanf: 285.5 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf_countable_earned_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf_countable_earned_income.yaml new file mode 100644 index 00000000000..8752c50de20 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf_countable_earned_income.yaml @@ -0,0 +1,51 @@ +# Kansas TANF countable earned income test +# Sums person-level earned income after deductions, +# then subtracts dependent care (no cap per KEESM 7224) + +- name: Case 1, no earned income. + period: 2025-01 + input: + state_code: KS + ks_tanf_earned_income_after_deductions: 0 + spm_unit_pre_subsidy_childcare_expenses: 0 + output: + ks_tanf_countable_earned_income: 0 + +- name: Case 2, earned income no childcare. + period: 2025-01 + input: + state_code: KS + ks_tanf_earned_income_after_deductions: 164 + spm_unit_pre_subsidy_childcare_expenses: 0 + output: + ks_tanf_countable_earned_income: 164 + +- name: Case 3, earned income with childcare. + period: 2025-01 + input: + state_code: KS + ks_tanf_earned_income_after_deductions: 164 + spm_unit_pre_subsidy_childcare_expenses: 1_200 # $100/month + output: + # $164 - $100 = $64 + ks_tanf_countable_earned_income: 64 + +- name: Case 4, childcare exceeds earned. + period: 2025-01 + input: + state_code: KS + ks_tanf_earned_income_after_deductions: 50 + spm_unit_pre_subsidy_childcare_expenses: 1_200 # $100/month + output: + # max($50 - $100, 0) = $0 + ks_tanf_countable_earned_income: 0 + +- name: Case 5, high childcare no cap. + period: 2025-01 + input: + state_code: KS + ks_tanf_earned_income_after_deductions: 400 + spm_unit_pre_subsidy_childcare_expenses: 3_600 # $300/month - no cap + output: + # $400 - $300 = $100 + ks_tanf_countable_earned_income: 100 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf_earned_income_after_deductions.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf_earned_income_after_deductions.yaml new file mode 100644 index 00000000000..857fe9a4b2d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf_earned_income_after_deductions.yaml @@ -0,0 +1,57 @@ +# Kansas TANF earned income after deductions test +# Per KEESM 7211 and K.A.R. 30-4-111: +# Step 1: Deduct $90 work expense (capped at gross) +# Step 2: Apply 60% disregard (keep 40%) + +- name: Case 1, no income. + period: 2025-01 + input: + state_code: KS + tanf_gross_earned_income: 0 + output: + ks_tanf_earned_income_after_deductions: 0 + +- name: Case 2, income below $90. + period: 2025-01 + input: + state_code: KS + tanf_gross_earned_income: 50 + output: + # $50 - $50 (capped) = $0, $0 * 0.40 = $0 + ks_tanf_earned_income_after_deductions: 0 + +- name: Case 3, income exactly $90. + period: 2025-01 + input: + state_code: KS + tanf_gross_earned_income: 90 + output: + # $90 - $90 = $0, $0 * 0.40 = $0 + ks_tanf_earned_income_after_deductions: 0 + +- name: Case 4, income $100. + period: 2025-01 + input: + state_code: KS + tanf_gross_earned_income: 100 + output: + # $100 - $90 = $10, $10 * 0.40 = $4 + ks_tanf_earned_income_after_deductions: 4 + +- name: Case 5, income $500. + period: 2025-01 + input: + state_code: KS + tanf_gross_earned_income: 500 + output: + # $500 - $90 = $410, $410 * 0.40 = $164 + ks_tanf_earned_income_after_deductions: 164 + +- name: Case 6, income $1000. + period: 2025-01 + input: + state_code: KS + tanf_gross_earned_income: 1_000 + output: + # $1000 - $90 = $910, $910 * 0.40 = $364 + ks_tanf_earned_income_after_deductions: 364 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf_eligible.yaml new file mode 100644 index 00000000000..2fe4eb84633 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf_eligible.yaml @@ -0,0 +1,117 @@ +# Kansas TANF eligibility test +# Eligible if: demographic & gross_income & net_income & resources all pass +# Source: K.A.R. 30-4-50, K.A.R. 30-4-70, K.S.A. 39-709 + +- name: Case 1, all eligibility conditions met. + period: 2025-01 + input: + people: + person1: + is_person_demographic_tanf_eligible: true + spm_units: + spm_unit: + members: [person1] + ks_tanf_gross_income_eligible: true + ks_tanf_income_eligible: true + ks_tanf_resources_eligible: true + households: + household: + members: [person1] + state_code: KS + output: + ks_tanf_eligible: true + +- name: Case 2, gross income ineligible. + period: 2025-01 + input: + people: + person1: + is_person_demographic_tanf_eligible: true + spm_units: + spm_unit: + members: [person1] + ks_tanf_gross_income_eligible: false + ks_tanf_income_eligible: true + ks_tanf_resources_eligible: true + households: + household: + members: [person1] + state_code: KS + output: + ks_tanf_eligible: false + +- name: Case 3, net income ineligible. + period: 2025-01 + input: + people: + person1: + is_person_demographic_tanf_eligible: true + spm_units: + spm_unit: + members: [person1] + ks_tanf_gross_income_eligible: true + ks_tanf_income_eligible: false + ks_tanf_resources_eligible: true + households: + household: + members: [person1] + state_code: KS + output: + ks_tanf_eligible: false + +- name: Case 4, resources ineligible. + period: 2025-01 + input: + people: + person1: + is_person_demographic_tanf_eligible: true + spm_units: + spm_unit: + members: [person1] + ks_tanf_gross_income_eligible: true + ks_tanf_income_eligible: true + ks_tanf_resources_eligible: false + households: + household: + members: [person1] + state_code: KS + output: + ks_tanf_eligible: false + +- name: Case 5, demographic ineligible. + period: 2025-01 + input: + people: + person1: + is_person_demographic_tanf_eligible: false + spm_units: + spm_unit: + members: [person1] + ks_tanf_gross_income_eligible: true + ks_tanf_income_eligible: true + ks_tanf_resources_eligible: true + households: + household: + members: [person1] + state_code: KS + output: + ks_tanf_eligible: false + +- name: Case 6, all conditions fail. + period: 2025-01 + input: + people: + person1: + is_person_demographic_tanf_eligible: false + spm_units: + spm_unit: + members: [person1] + ks_tanf_gross_income_eligible: false + ks_tanf_income_eligible: false + ks_tanf_resources_eligible: false + households: + household: + members: [person1] + state_code: KS + output: + ks_tanf_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf_gross_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf_gross_income_eligible.yaml new file mode 100644 index 00000000000..bb076e0a948 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf_gross_income_eligible.yaml @@ -0,0 +1,70 @@ +# Kansas TANF gross income eligibility test +# Gross income must be less than 30% of Federal Poverty Level +# Source: K.S.A. 39-709, Kansas TANF State Plan FFY 2024-2026 +# 2025 FPL (contiguous US): $15,650 first person + $5,580 per additional +# 30% monthly thresholds: 1=$391, 2=$530, 3=$670, 4=$809 + +- name: Case 1, no income, eligible. + period: 2025-01 + input: + state_code: KS + tanf_gross_earned_income: 0 + tanf_gross_unearned_income: 0 + spm_unit_size: 3 + output: + ks_tanf_gross_income_eligible: true + +- name: Case 2, income below 30% FPL for family of 3. + period: 2025-01 + input: + state_code: KS + tanf_gross_earned_income: 400 + tanf_gross_unearned_income: 100 + spm_unit_size: 3 + output: + # Gross: $500, threshold ~$670 (30% of $26,810/12) + ks_tanf_gross_income_eligible: true + +- name: Case 3, income above 30% FPL for family of 3. + period: 2025-01 + input: + state_code: KS + tanf_gross_earned_income: 600 + tanf_gross_unearned_income: 200 + spm_unit_size: 3 + output: + # Gross: $800 > threshold ~$670 + ks_tanf_gross_income_eligible: false + +- name: Case 4, single person low income. + period: 2025-01 + input: + state_code: KS + tanf_gross_earned_income: 300 + tanf_gross_unearned_income: 0 + spm_unit_size: 1 + output: + # Gross: $300, threshold ~$391 (30% of $15,650/12) + ks_tanf_gross_income_eligible: true + +- name: Case 5, single person at threshold. + period: 2025-01 + input: + state_code: KS + tanf_gross_earned_income: 400 + tanf_gross_unearned_income: 0 + spm_unit_size: 1 + output: + # Gross: $400 > threshold ~$391 + ks_tanf_gross_income_eligible: false + +- name: Case 6, family of 4 below threshold. + period: 2025-01 + input: + state_code: KS + tanf_gross_earned_income: 500 + tanf_gross_unearned_income: 200 + spm_unit_size: 4 + output: + # Gross: $700, threshold ~$809 (30% of $32,390/12) + ks_tanf_gross_income_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf_income_eligible.yaml new file mode 100644 index 00000000000..f7af26d9fd0 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf_income_eligible.yaml @@ -0,0 +1,59 @@ +# Kansas TANF income eligibility test +# Eligible if countable income < payment standard (maximum benefit) +# Source: KEESM 7110, K.A.R. 30-4-110 + +- name: Case 1, no income. + period: 2025-01 + input: + state_code: KS + ks_tanf_countable_income: 0 + ks_tanf_maximum_benefit: 386 + output: + ks_tanf_income_eligible: true + +- name: Case 2, income below payment standard. + period: 2025-01 + input: + state_code: KS + ks_tanf_countable_income: 200 + ks_tanf_maximum_benefit: 386 + output: + ks_tanf_income_eligible: true + +- name: Case 3, income equals payment standard. + period: 2025-01 + input: + state_code: KS + ks_tanf_countable_income: 386 + ks_tanf_maximum_benefit: 386 + output: + # Per KEESM 7110: income must be LESS THAN payment standard + # 386 < 386 = false + ks_tanf_income_eligible: false + +- name: Case 4, income exceeds payment standard. + period: 2025-01 + input: + state_code: KS + ks_tanf_countable_income: 400 + ks_tanf_maximum_benefit: 386 + output: + ks_tanf_income_eligible: false + +- name: Case 5, income significantly exceeds payment standard. + period: 2025-01 + input: + state_code: KS + ks_tanf_countable_income: 1_000 + ks_tanf_maximum_benefit: 386 + output: + ks_tanf_income_eligible: false + +- name: Case 6, family of 4 income below limit. + period: 2025-01 + input: + state_code: KS + ks_tanf_countable_income: 400 + ks_tanf_maximum_benefit: 454 + output: + ks_tanf_income_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf_maximum_benefit.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf_maximum_benefit.yaml new file mode 100644 index 00000000000..25728469ab3 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf_maximum_benefit.yaml @@ -0,0 +1,72 @@ +# Kansas TANF maximum benefit (payment standard) test +# Payment standards for Non-shared Living, High Population Counties (Group III) +# Source: K.A.R. 30-4-100, K.A.R. 30-4-101, Kansas TANF State Plan FFY 2024-2026 p.29 +# Family size 1: $241, 2: $326, 3: $403, 4: $471, 5+: $471 + $61 per person + +- name: Case 1, family of 1. + period: 2025-01 + input: + state_code: KS + spm_unit_size: 1 + output: + ks_tanf_maximum_benefit: 241 + +- name: Case 2, family of 2. + period: 2025-01 + input: + state_code: KS + spm_unit_size: 2 + output: + ks_tanf_maximum_benefit: 326 + +- name: Case 3, family of 3. + period: 2025-01 + input: + state_code: KS + spm_unit_size: 3 + output: + ks_tanf_maximum_benefit: 403 + +- name: Case 4, family of 4. + period: 2025-01 + input: + state_code: KS + spm_unit_size: 4 + output: + ks_tanf_maximum_benefit: 471 + +- name: Case 5, family of 5. + period: 2025-01 + input: + state_code: KS + spm_unit_size: 5 + output: + # 471 + 61 = 532 + ks_tanf_maximum_benefit: 532 + +- name: Case 6, family of 6. + period: 2025-01 + input: + state_code: KS + spm_unit_size: 6 + output: + # 471 + 61*2 = 593 + ks_tanf_maximum_benefit: 593 + +- name: Case 7, family of 7. + period: 2025-01 + input: + state_code: KS + spm_unit_size: 7 + output: + # 471 + 61*3 = 654 + ks_tanf_maximum_benefit: 654 + +- name: Case 8, family of 8. + period: 2025-01 + input: + state_code: KS + spm_unit_size: 8 + output: + # 471 + 61*4 = 715 + ks_tanf_maximum_benefit: 715 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf_resources_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf_resources_eligible.yaml new file mode 100644 index 00000000000..6c8dd12e410 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/dcf/tanf/ks_tanf_resources_eligible.yaml @@ -0,0 +1,42 @@ +# Kansas TANF resources eligibility test +# Resource limit: $3,000 (KEESM 5110) + +- name: Case 1, resources below limit. + period: 2025-01 + input: + state_code: KS + spm_unit_cash_assets: 1_000 + output: + ks_tanf_resources_eligible: true + +- name: Case 2, resources at limit. + period: 2025-01 + input: + state_code: KS + spm_unit_cash_assets: 3_000 + output: + ks_tanf_resources_eligible: true + +- name: Case 3, resources above limit. + period: 2025-01 + input: + state_code: KS + spm_unit_cash_assets: 3_001 + output: + ks_tanf_resources_eligible: false + +- name: Case 4, no resources. + period: 2025-01 + input: + state_code: KS + spm_unit_cash_assets: 0 + output: + ks_tanf_resources_eligible: true + +- name: Case 5, resources significantly above limit. + period: 2025-01 + input: + state_code: KS + spm_unit_cash_assets: 10_000 + output: + ks_tanf_resources_eligible: false diff --git a/policyengine_us/variables/gov/states/ks/dcf/tanf/eligibility/ks_tanf_eligible.py b/policyengine_us/variables/gov/states/ks/dcf/tanf/eligibility/ks_tanf_eligible.py new file mode 100644 index 00000000000..ffc305fcbd5 --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/tanf/eligibility/ks_tanf_eligible.py @@ -0,0 +1,34 @@ +from policyengine_us.model_api import * + + +class ks_tanf_eligible(Variable): + value_type = bool + entity = SPMUnit + label = ( + "Eligible for Kansas Temporary Assistance for Needy Families (TANF)" + ) + definition_period = MONTH + reference = ( + "https://www.law.cornell.edu/regulations/kansas/K-A-R-30-4-70", + "https://www.law.cornell.edu/regulations/kansas/K-A-R-30-4-50", + "https://ksrevisor.gov/statutes/chapters/ch39/039_007_0009.html", + ) + defined_for = StateCode.KS + + def formula(spm_unit, period, parameters): + demographic_eligible = spm_unit("is_demographic_tanf_eligible", period) + immigration_eligible = ( + add(spm_unit, period, ["is_citizen_or_legal_immigrant"]) > 0 + ) + gross_income_eligible = spm_unit( + "ks_tanf_gross_income_eligible", period + ) + net_income_eligible = spm_unit("ks_tanf_income_eligible", period) + resources_eligible = spm_unit("ks_tanf_resources_eligible", period) + return ( + demographic_eligible + & immigration_eligible + & gross_income_eligible + & net_income_eligible + & resources_eligible + ) diff --git a/policyengine_us/variables/gov/states/ks/dcf/tanf/eligibility/ks_tanf_gross_income_eligible.py b/policyengine_us/variables/gov/states/ks/dcf/tanf/eligibility/ks_tanf_gross_income_eligible.py new file mode 100644 index 00000000000..d3250741bf5 --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/tanf/eligibility/ks_tanf_gross_income_eligible.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class ks_tanf_gross_income_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Kansas TANF gross income eligible" + definition_period = MONTH + reference = ( + "https://ksrevisor.gov/statutes/chapters/ch39/039_007_0009.html", + "https://www.dcf.ks.gov/services/ees/Documents/Reports/TANF%20State%20Plan%20FFY%202024%20-%202026.pdf", + ) + defined_for = StateCode.KS + + def formula(spm_unit, period, parameters): + # Per K.S.A. 39-709 and Kansas TANF State Plan: + # Gross income must be less than 30% of Federal Poverty Level + gross_income = add( + spm_unit, + period, + ["tanf_gross_earned_income", "tanf_gross_unearned_income"], + ) + fpg = spm_unit("spm_unit_fpg", period) + p = parameters(period).gov.states.ks.dcf.tanf.income + return gross_income < fpg * p.gross_income_limit diff --git a/policyengine_us/variables/gov/states/ks/dcf/tanf/eligibility/ks_tanf_income_eligible.py b/policyengine_us/variables/gov/states/ks/dcf/tanf/eligibility/ks_tanf_income_eligible.py new file mode 100644 index 00000000000..1f9d4a298fd --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/tanf/eligibility/ks_tanf_income_eligible.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class ks_tanf_income_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Kansas TANF income eligibility" + definition_period = MONTH + reference = ( + "https://www.law.cornell.edu/regulations/kansas/K-A-R-30-4-110", + "https://content.dcf.ks.gov/ees/keesm/current/keesm7110.htm", + ) + defined_for = StateCode.KS + + def formula(spm_unit, period, parameters): + # Per K.A.R. 30-4-110 and KEESM 7110: + # Countable income must be less than the payment standard + countable_income = spm_unit("ks_tanf_countable_income", period) + payment_standard = spm_unit("ks_tanf_maximum_benefit", period) + return countable_income < payment_standard diff --git a/policyengine_us/variables/gov/states/ks/dcf/tanf/eligibility/ks_tanf_resources_eligible.py b/policyengine_us/variables/gov/states/ks/dcf/tanf/eligibility/ks_tanf_resources_eligible.py new file mode 100644 index 00000000000..c50c05bee6f --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/tanf/eligibility/ks_tanf_resources_eligible.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class ks_tanf_resources_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Kansas TANF resource eligibility" + definition_period = MONTH + reference = ( + "https://content.dcf.ks.gov/ees/keesm/current/keesm5110.htm", + "https://content.dcf.ks.gov/ees/keesm/current/keesm5000.htm", + ) + defined_for = StateCode.KS + + def formula(spm_unit, period, parameters): + # Per KEESM 5110: Resource limit is $3,000 + p = parameters(period).gov.states.ks.dcf.tanf.resource_limit + resources = spm_unit("spm_unit_cash_assets", period.this_year) + return resources <= p.amount diff --git a/policyengine_us/variables/gov/states/ks/dcf/tanf/income/ks_tanf_countable_earned_income.py b/policyengine_us/variables/gov/states/ks/dcf/tanf/income/ks_tanf_countable_earned_income.py new file mode 100644 index 00000000000..b520c243763 --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/tanf/income/ks_tanf_countable_earned_income.py @@ -0,0 +1,30 @@ +from policyengine_us.model_api import * + + +class ks_tanf_countable_earned_income(Variable): + value_type = float + entity = SPMUnit + label = "Kansas TANF countable earned income" + unit = USD + definition_period = MONTH + reference = ( + "https://www.law.cornell.edu/regulations/kansas/K-A-R-30-4-110", + "https://content.dcf.ks.gov/ees/keesm/current/keesm7110.htm", + "https://content.dcf.ks.gov/ees/keesm/current/keesm7224.htm", + ) + defined_for = StateCode.KS + + def formula(spm_unit, period, parameters): + # Per K.A.R. 30-4-110, KEESM 7110, and KEESM 7224: + # Sum person-level earned income after $90 and 60% deductions, + # then subtract dependent care expenses. + # + # Per KEESM 7224: Dependent care is applied after $90 and 60% disregards. + # There is NO cap on dependent care deduction in Kansas TANF. + earned_after_deductions = add( + spm_unit, period, ["ks_tanf_earned_income_after_deductions"] + ) + dependent_care = spm_unit( + "spm_unit_pre_subsidy_childcare_expenses", period + ) + return max_(earned_after_deductions - dependent_care, 0) diff --git a/policyengine_us/variables/gov/states/ks/dcf/tanf/income/ks_tanf_countable_income.py b/policyengine_us/variables/gov/states/ks/dcf/tanf/income/ks_tanf_countable_income.py new file mode 100644 index 00000000000..f3b7c28a429 --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/tanf/income/ks_tanf_countable_income.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class ks_tanf_countable_income(Variable): + value_type = float + entity = SPMUnit + label = "Kansas TANF countable income" + unit = USD + definition_period = MONTH + reference = ( + "https://www.law.cornell.edu/regulations/kansas/K-A-R-30-4-110", + "https://content.dcf.ks.gov/ees/keesm/current/keesm7110.htm", + ) + defined_for = StateCode.KS + adds = [ + "ks_tanf_countable_earned_income", + "tanf_gross_unearned_income", + ] diff --git a/policyengine_us/variables/gov/states/ks/dcf/tanf/income/ks_tanf_earned_income_after_deductions.py b/policyengine_us/variables/gov/states/ks/dcf/tanf/income/ks_tanf_earned_income_after_deductions.py new file mode 100644 index 00000000000..f8ffc56e251 --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/tanf/income/ks_tanf_earned_income_after_deductions.py @@ -0,0 +1,35 @@ +from policyengine_us.model_api import * + + +class ks_tanf_earned_income_after_deductions(Variable): + value_type = float + entity = Person + label = "Kansas TANF earned income after deductions" + unit = USD + definition_period = MONTH + reference = ( + "https://www.law.cornell.edu/regulations/kansas/K-A-R-30-4-111", + "https://content.dcf.ks.gov/ees/keesm/current/keesm7200.htm", + "https://content.dcf.ks.gov/ees/keesm/implem_memo/2008_0326_TAF_ei_disregard.htm", + ) + defined_for = StateCode.KS + + def formula(person, period, parameters): + # Per KEESM 7211 and K.A.R. 30-4-111: + # Step 1: Deduct $90 work expense per employed person + # Step 2: Apply 60% disregard to remainder + # + # NOTE: Per K.A.R. 30-4-111(b)(2), the 60% disregard does NOT apply + # when initially establishing or re-establishing TANF eligibility + # UNLESS the person received TANF in one of the four preceding months. + # PolicyEngine cannot track benefit history across periods, so we apply + # the 60% disregard to all applicants. + p = parameters( + period + ).gov.states.ks.dcf.tanf.income.earned_income_disregard + gross_earned = person("tanf_gross_earned_income", period) + # Apply $90 work expense (capped at person's gross earned) + work_expense = min_(gross_earned, p.flat) + after_work_expense = gross_earned - work_expense + # Apply 60% disregard to remainder (keep 40%) + return after_work_expense * (1 - p.rate) diff --git a/policyengine_us/variables/gov/states/ks/dcf/tanf/ks_tanf.py b/policyengine_us/variables/gov/states/ks/dcf/tanf/ks_tanf.py new file mode 100644 index 00000000000..3f131d1e042 --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/tanf/ks_tanf.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class ks_tanf(Variable): + value_type = float + entity = SPMUnit + label = "Kansas Temporary Assistance for Needy Families (TANF)" + unit = USD + definition_period = MONTH + reference = ( + "https://www.law.cornell.edu/regulations/kansas/K-A-R-30-4-100", + "https://content.dcf.ks.gov/ees/keesm/current/keesm7110.htm", + ) + defined_for = "ks_tanf_eligible" + + def formula(spm_unit, period, parameters): + # Per K.A.R. 30-4-100 and KEESM 7110: + # Benefit = Payment Standard - Countable Income + maximum_benefit = spm_unit("ks_tanf_maximum_benefit", period) + countable_income = spm_unit("ks_tanf_countable_income", period) + return max_(maximum_benefit - countable_income, 0) diff --git a/policyengine_us/variables/gov/states/ks/dcf/tanf/ks_tanf_maximum_benefit.py b/policyengine_us/variables/gov/states/ks/dcf/tanf/ks_tanf_maximum_benefit.py new file mode 100644 index 00000000000..39f917ec487 --- /dev/null +++ b/policyengine_us/variables/gov/states/ks/dcf/tanf/ks_tanf_maximum_benefit.py @@ -0,0 +1,32 @@ +from policyengine_us.model_api import * + + +class ks_tanf_maximum_benefit(Variable): + value_type = float + entity = SPMUnit + label = "Kansas TANF maximum benefit amount" + unit = USD + definition_period = MONTH + reference = ( + "https://www.law.cornell.edu/regulations/kansas/K-A-R-30-4-100", + "https://www.law.cornell.edu/regulations/kansas/K-A-R-30-4-101", + ) + defined_for = StateCode.KS + + def formula(spm_unit, period, parameters): + # Per K.A.R. 30-4-100 and K.A.R. 30-4-101: + # Payment standard = Basic allowance + Shelter allowance + # Using High Population Counties (Group III) rates for Non-shared Living + # Group III shelter = $109/month + # Counties: Butler, Jefferson, Leavenworth, McPherson, Miami, Osage, + # Reno, Rice, Riley, Sedgwick, Shawnee, Wyandotte + p = parameters(period).gov.states.ks.dcf.tanf.payment_standard + max_size_in_table = parameters( + period + ).gov.states.ks.dcf.tanf.max_family_size_in_table + unit_size = spm_unit("spm_unit_size", period.this_year) + capped_size = min_(unit_size, max_size_in_table) + base_amount = p.amount[capped_size] + additional_people = max_(unit_size - max_size_in_table, 0) + additional_amount = additional_people * p.additional_person_amount + return base_amount + additional_amount diff --git a/uv.lock b/uv.lock index 9e764e578ee..03bbfcb2430 100644 --- a/uv.lock +++ b/uv.lock @@ -1534,7 +1534,7 @@ wheels = [ [[package]] name = "policyengine-us" -version = "1.474.0" +version = "1.475.0" source = { editable = "." } dependencies = [ { name = "microdf-python" },