diff --git a/changelog.d/8317.added.md b/changelog.d/8317.added.md new file mode 100644 index 00000000000..52ba11d97b7 --- /dev/null +++ b/changelog.d/8317.added.md @@ -0,0 +1 @@ +Added Utah Homeowner's/Renter's Relief. diff --git a/policyengine_us/parameters/gov/states/household/state_property_tax_credits.yaml b/policyengine_us/parameters/gov/states/household/state_property_tax_credits.yaml index b5c719c31cf..e4861d8d1c7 100644 --- a/policyengine_us/parameters/gov/states/household/state_property_tax_credits.yaml +++ b/policyengine_us/parameters/gov/states/household/state_property_tax_credits.yaml @@ -114,6 +114,26 @@ values: - wi_homestead_credit - wi_property_tax_credit - wv_homestead_excess_property_tax_credit + 2025-01-01: + - az_property_tax_credit + - ct_property_tax_credit + - dc_ptc + - il_property_tax_credit + - ma_senior_circuit_breaker + - me_property_tax_fairness_credit + - mi_homestead_property_tax_credit + - mo_property_tax_credit + - mt_elderly_homeowner_or_renter_credit + - mt_property_tax_rebate + - nj_property_tax_credit + - nm_property_tax_rebate + - ny_real_property_tax_credit + - ok_ptc + - ri_property_tax_credit + - ut_homeowner_renter_relief + - wi_homestead_credit + - wi_property_tax_credit + - wv_homestead_excess_property_tax_credit metadata: unit: list diff --git a/policyengine_us/parameters/gov/states/ut/tax/property/homeowner_renter_relief/age_threshold.yaml b/policyengine_us/parameters/gov/states/ut/tax/property/homeowner_renter_relief/age_threshold.yaml new file mode 100644 index 00000000000..47ea686f3fc --- /dev/null +++ b/policyengine_us/parameters/gov/states/ut/tax/property/homeowner_renter_relief/age_threshold.yaml @@ -0,0 +1,13 @@ +description: Utah limits age to this threshold under the Homeowner's/Renter's Relief program. +values: + 2025-01-01: 66 + 2026-01-01: 67 +metadata: + unit: year + period: year + label: Utah homeowner's/renter's relief age threshold + reference: + - title: Utah State Tax Commission Renter's Credit eligibility + href: https://tax.utah.gov/relief/renter-refund/ + - title: Utah Code Section 59-2a-101 + href: https://le.utah.gov/xcode/Title59/Chapter2A/C59-2a_2026010120250507.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ut/tax/property/homeowner_renter_relief/income_limit.yaml b/policyengine_us/parameters/gov/states/ut/tax/property/homeowner_renter_relief/income_limit.yaml new file mode 100644 index 00000000000..483a0cc93b9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ut/tax/property/homeowner_renter_relief/income_limit.yaml @@ -0,0 +1,12 @@ +description: Utah limits household income to this amount under the Homeowner's/Renter's Relief program. +values: + 2025-01-01: 44_221 +metadata: + unit: currency-USD + period: year + label: Utah homeowner's/renter's relief income limit + reference: + - title: Utah State Tax Commission Homeowner's or Renter's Relief 2025 Household Income Schedule + href: https://tax.utah.gov/relief/homeowner-renter-relief/ + - title: 2025 Utah TC-90CB Renter Refund Application + href: https://files.tax.utah.gov/tax/forms/current/tc-90cb.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ut/tax/property/homeowner_renter_relief/maximum.yaml b/policyengine_us/parameters/gov/states/ut/tax/property/homeowner_renter_relief/maximum.yaml new file mode 100644 index 00000000000..00c9fa1311d --- /dev/null +++ b/policyengine_us/parameters/gov/states/ut/tax/property/homeowner_renter_relief/maximum.yaml @@ -0,0 +1,45 @@ +description: Utah provides this maximum credit amount under the Homeowner's/Renter's Relief program. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + period: year + label: Utah homeowner's/renter's relief maximum amount + reference: + - title: Utah State Tax Commission Homeowner's or Renter's Relief 2025 Household Income Schedule + href: https://tax.utah.gov/relief/homeowner-renter-relief/ + - title: Utah Code Section 59-2a-305 + href: https://le.utah.gov/xcode/Title59/Chapter2A/C59-2a_2026010120250507.pdf#page=14 +brackets: + - threshold: + 2025-01-01: 0 + amount: + 2025-01-01: 1_412 + - threshold: + 2025-01-01: 15_034 + amount: + 2025-01-01: 1_245 + - threshold: + 2025-01-01: 20_049 + amount: + 2025-01-01: 1_082 + - threshold: + 2025-01-01: 25_058 + amount: + 2025-01-01: 835 + - threshold: + 2025-01-01: 30_070 + amount: + 2025-01-01: 674 + - threshold: + 2025-01-01: 35_084 + amount: + 2025-01-01: 429 + - threshold: + 2025-01-01: 39_797 + amount: + 2025-01-01: 262 + - threshold: + 2025-01-01: 44_222 + amount: + 2025-01-01: 0 diff --git a/policyengine_us/parameters/gov/states/ut/tax/property/homeowner_renter_relief/renter/rate.yaml b/policyengine_us/parameters/gov/states/ut/tax/property/homeowner_renter_relief/renter/rate.yaml new file mode 100644 index 00000000000..0c2527352f8 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ut/tax/property/homeowner_renter_relief/renter/rate.yaml @@ -0,0 +1,45 @@ +description: Utah provides this percentage of gross rent under the Homeowner's/Renter's Relief program. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + period: year + label: Utah homeowner's/renter's relief renter rate + reference: + - title: 2025 Utah TC-90CB Renter Refund Application + href: https://files.tax.utah.gov/tax/forms/current/tc-90cb.pdf#page=4 + - title: Utah Code Section 59-2a-205 + href: https://le.utah.gov/xcode/Title59/Chapter2A/C59-2a_2026010120250507.pdf#page=11 +brackets: + - threshold: + 2025-01-01: 0 + amount: + 2025-01-01: 0.095 + - threshold: + 2025-01-01: 15_034 + amount: + 2025-01-01: 0.085 + - threshold: + 2025-01-01: 20_049 + amount: + 2025-01-01: 0.07 + - threshold: + 2025-01-01: 25_058 + amount: + 2025-01-01: 0.055 + - threshold: + 2025-01-01: 30_070 + amount: + 2025-01-01: 0.04 + - threshold: + 2025-01-01: 35_084 + amount: + 2025-01-01: 0.03 + - threshold: + 2025-01-01: 39_797 + amount: + 2025-01-01: 0.025 + - threshold: + 2025-01-01: 44_222 + amount: + 2025-01-01: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ut/tax/property/homeowner_renter_relief/ut_homeowner_renter_relief.yaml b/policyengine_us/tests/policy/baseline/gov/states/ut/tax/property/homeowner_renter_relief/ut_homeowner_renter_relief.yaml new file mode 100644 index 00000000000..73f07998840 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ut/tax/property/homeowner_renter_relief/ut_homeowner_renter_relief.yaml @@ -0,0 +1,90 @@ +- name: Case 1, renter credit based on gross rent. + period: 2025 + absolute_error_margin: 0.01 + input: + age_head: 66 + adjusted_gross_income: 10_000 + rent: 12_000 + state_code: UT + output: + ut_homeowner_renter_relief: 1_140 + +- name: Case 2, renter credit capped by maximum amount. + period: 2025 + absolute_error_margin: 0.01 + input: + age_head: 66 + adjusted_gross_income: 10_000 + rent: 20_000 + state_code: UT + output: + ut_homeowner_renter_relief: 1_412 + +- name: Case 3, renter credit in a middle income bracket. + period: 2025 + absolute_error_margin: 0.01 + input: + age_head: 66 + adjusted_gross_income: 25_058 + rent: 10_000 + state_code: UT + output: + ut_homeowner_renter_relief: 550 + +- name: Case 4, homeowner credit capped by the income schedule. + period: 2025 + absolute_error_margin: 0.01 + input: + age_head: 66 + adjusted_gross_income: 35_084 + rent: 0 + real_estate_taxes: 600 + state_code: UT + output: + ut_homeowner_renter_relief: 429 + +- name: Case 5, homeowner credit capped by property tax paid. + period: 2025 + absolute_error_margin: 0.01 + input: + age_head: 66 + adjusted_gross_income: 10_000 + rent: 0 + real_estate_taxes: 900 + state_code: UT + output: + ut_homeowner_renter_relief: 900 + +- name: Case 6, surviving spouse renter in the top eligible bracket. + period: 2025 + absolute_error_margin: 0.01 + input: + age_head: 45 + adjusted_gross_income: 39_797 + filing_status: SURVIVING_SPOUSE + rent: 10_000 + state_code: UT + output: + ut_homeowner_renter_relief: 250 + +- name: Case 7, renter and homeowner amounts can both apply. + period: 2025 + absolute_error_margin: 0.01 + input: + age_head: 66 + adjusted_gross_income: 10_000 + rent: 10_000 + real_estate_taxes: 600 + state_code: UT + output: + ut_homeowner_renter_relief: 1_550 + +- name: Case 8, ineligible claimant receives no relief. + period: 2025 + input: + age_head: 60 + adjusted_gross_income: 10_000 + rent: 12_000 + state_code: UT + output: + ut_homeowner_renter_relief: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ut/tax/property/homeowner_renter_relief/ut_homeowner_renter_relief_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ut/tax/property/homeowner_renter_relief/ut_homeowner_renter_relief_eligible.yaml new file mode 100644 index 00000000000..f0e0667b69b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ut/tax/property/homeowner_renter_relief/ut_homeowner_renter_relief_eligible.yaml @@ -0,0 +1,61 @@ +- name: Case 1, age-eligible renter. + period: 2025 + input: + age_head: 66 + adjusted_gross_income: 15_000 + rent: 12_000 + state_code: UT + output: + ut_homeowner_renter_relief_eligible: true + +- name: Case 2, surviving spouse under the age threshold. + period: 2025 + input: + age_head: 45 + adjusted_gross_income: 15_000 + filing_status: SURVIVING_SPOUSE + rent: 12_000 + state_code: UT + output: + ut_homeowner_renter_relief_eligible: true + +- name: Case 3, income above the limit. + period: 2025 + input: + age_head: 66 + adjusted_gross_income: 44_222 + rent: 12_000 + state_code: UT + output: + ut_homeowner_renter_relief_eligible: false + +- name: Case 4, no rent or property tax paid. + period: 2025 + input: + age_head: 66 + adjusted_gross_income: 15_000 + rent: 0 + real_estate_taxes: 0 + state_code: UT + output: + ut_homeowner_renter_relief_eligible: false + +- name: Case 5, age 66 after the transition year. + period: 2026 + input: + age_head: 66 + adjusted_gross_income: 15_000 + rent: 12_000 + state_code: UT + output: + ut_homeowner_renter_relief_eligible: false + +- name: Case 6, age 67 after the transition year. + period: 2026 + input: + age_head: 67 + adjusted_gross_income: 15_000 + rent: 12_000 + state_code: UT + output: + ut_homeowner_renter_relief_eligible: true diff --git a/policyengine_us/variables/gov/states/ut/tax/property/homeowner_renter_relief/ut_homeowner_renter_relief.py b/policyengine_us/variables/gov/states/ut/tax/property/homeowner_renter_relief/ut_homeowner_renter_relief.py new file mode 100644 index 00000000000..3a1ee95433d --- /dev/null +++ b/policyengine_us/variables/gov/states/ut/tax/property/homeowner_renter_relief/ut_homeowner_renter_relief.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class ut_homeowner_renter_relief(Variable): + value_type = float + entity = TaxUnit + label = "Utah Homeowner's/Renter's Relief" + unit = USD + definition_period = YEAR + reference = ( + "https://tax.utah.gov/relief/homeowner-renter-relief/", + "https://files.tax.utah.gov/tax/forms/current/tc-90cb.pdf#page=4", + "https://le.utah.gov/xcode/Title59/Chapter2A/C59-2a_2026010120250507.pdf#page=11", + "https://le.utah.gov/xcode/Title59/Chapter2A/C59-2a_2026010120250507.pdf#page=14", + ) + defined_for = "ut_homeowner_renter_relief_eligible" + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.ut.tax.property.homeowner_renter_relief + income = tax_unit("adjusted_gross_income", period) + maximum = p.maximum.calc(income) + rent = add(tax_unit, period, ["rent"]) + renter_credit = min_(rent * p.renter.rate.calc(income), maximum) + homeowner_credit = min_(add(tax_unit, period, ["real_estate_taxes"]), maximum) + return renter_credit + homeowner_credit diff --git a/policyengine_us/variables/gov/states/ut/tax/property/homeowner_renter_relief/ut_homeowner_renter_relief_eligible.py b/policyengine_us/variables/gov/states/ut/tax/property/homeowner_renter_relief/ut_homeowner_renter_relief_eligible.py new file mode 100644 index 00000000000..0f7b6ebdded --- /dev/null +++ b/policyengine_us/variables/gov/states/ut/tax/property/homeowner_renter_relief/ut_homeowner_renter_relief_eligible.py @@ -0,0 +1,32 @@ +from policyengine_us.model_api import * + + +class ut_homeowner_renter_relief_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Eligible for Utah Homeowner's/Renter's Relief" + definition_period = YEAR + reference = ( + "https://tax.utah.gov/relief/homeowner-renter-relief/", + "https://tax.utah.gov/relief/renter-refund/", + "https://le.utah.gov/xcode/Title59/Chapter2A/C59-2a_2026010120250507.pdf#page=1", + ) + defined_for = StateCode.UT + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.ut.tax.property.homeowner_renter_relief + age_head = tax_unit("age_head", period) + age_spouse = tax_unit("age_spouse", period) + filing_status = tax_unit("filing_status", period) + statuses = filing_status.possible_values + age_eligible = (age_head >= p.age_threshold) | (age_spouse >= p.age_threshold) + surviving_spouse = filing_status == statuses.SURVIVING_SPOUSE + income = tax_unit("adjusted_gross_income", period) + paid_rent_or_property_tax = ( + add(tax_unit, period, ["rent", "real_estate_taxes"]) > 0 + ) + return ( + (age_eligible | surviving_spouse) + & (income <= p.income_limit) + & paid_rent_or_property_tax + )