diff --git a/changelog.d/8307.added.md b/changelog.d/8307.added.md new file mode 100644 index 00000000000..848052999d7 --- /dev/null +++ b/changelog.d/8307.added.md @@ -0,0 +1 @@ +Added Tennessee property tax relief for elderly homeowners. diff --git a/policyengine_us/parameters/gov/states/tn/tax/property/elderly_property_tax_relief/age_threshold.yaml b/policyengine_us/parameters/gov/states/tn/tax/property/elderly_property_tax_relief/age_threshold.yaml new file mode 100644 index 00000000000..9aa8dbf7471 --- /dev/null +++ b/policyengine_us/parameters/gov/states/tn/tax/property/elderly_property_tax_relief/age_threshold.yaml @@ -0,0 +1,13 @@ +description: Tennessee sets the qualifying age to this threshold under the Property Tax Relief for Elderly Homeowners program. +values: + 2025-01-01: 65 + +metadata: + unit: year + period: year + label: Tennessee elderly property tax relief age threshold + reference: + - title: Tennessee Comptroller Tax Relief Brochure + href: https://comptroller.tn.gov/content/dam/cot/pa/documents/tax-relief/TaxReliefBrochure.pdf#page=2 + - title: Tennessee Code Annotated Sections 67-5-701 through 67-5-704 + href: https://comptroller.tn.gov/content/dam/cot/pa/documents/tax-relief/TCA%2067-5-701%20through%2067-5-704.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/tn/tax/property/elderly_property_tax_relief/assessment_rate.yaml b/policyengine_us/parameters/gov/states/tn/tax/property/elderly_property_tax_relief/assessment_rate.yaml new file mode 100644 index 00000000000..393d29a95b8 --- /dev/null +++ b/policyengine_us/parameters/gov/states/tn/tax/property/elderly_property_tax_relief/assessment_rate.yaml @@ -0,0 +1,11 @@ +description: Tennessee uses this assessment rate for residential property under the Property Tax Relief for Elderly Homeowners program. +values: + 2025-01-01: 0.25 + +metadata: + unit: /1 + period: year + label: Tennessee elderly property tax relief residential assessment rate + reference: + - title: Tennessee Code Annotated Section 67-5-702 + href: https://comptroller.tn.gov/content/dam/cot/pa/documents/tax-relief/TCA%2067-5-701%20through%2067-5-704.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/tn/tax/property/elderly_property_tax_relief/income_limit.yaml b/policyengine_us/parameters/gov/states/tn/tax/property/elderly_property_tax_relief/income_limit.yaml new file mode 100644 index 00000000000..1bdfab7b07b --- /dev/null +++ b/policyengine_us/parameters/gov/states/tn/tax/property/elderly_property_tax_relief/income_limit.yaml @@ -0,0 +1,16 @@ +description: Tennessee limits income to this amount under the Property Tax Relief for Elderly Homeowners program. +values: + 2025-01-01: 37_530 + 2026-01-01: 38_470 + +metadata: + unit: currency-USD + period: year + label: Tennessee elderly property tax relief income limit + reference: + - title: Tennessee Comptroller Tax Relief Brochure + href: https://comptroller.tn.gov/content/dam/cot/pa/documents/tax-relief/TaxReliefBrochure.pdf#page=2 + - title: Robertson County Trustee Tax Relief Program + href: https://www.robertsoncountytn.gov/local_government/trustee/tax_relief.php + - title: Tennessee Code Annotated Sections 67-5-701 through 67-5-704 + href: https://comptroller.tn.gov/content/dam/cot/pa/documents/tax-relief/TCA%2067-5-701%20through%2067-5-704.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/tn/tax/property/elderly_property_tax_relief/property_value_cap.yaml b/policyengine_us/parameters/gov/states/tn/tax/property/elderly_property_tax_relief/property_value_cap.yaml new file mode 100644 index 00000000000..de26baef106 --- /dev/null +++ b/policyengine_us/parameters/gov/states/tn/tax/property/elderly_property_tax_relief/property_value_cap.yaml @@ -0,0 +1,16 @@ +description: Tennessee limits property value to this amount under the Property Tax Relief for Elderly Homeowners program. +values: + 2025-01-01: 32_700 + 2026-01-01: 33_600 + +metadata: + unit: currency-USD + period: year + label: Tennessee elderly property tax relief property value cap + reference: + - title: Tennessee Comptroller Tax Relief Brochure + href: https://comptroller.tn.gov/content/dam/cot/pa/documents/tax-relief/TaxReliefBrochure.pdf#page=2 + - title: Robertson County Trustee Tax Relief Program + href: https://www.robertsoncountytn.gov/local_government/trustee/tax_relief.php + - title: Tennessee Code Annotated Sections 67-5-701 through 67-5-704 + href: https://comptroller.tn.gov/content/dam/cot/pa/documents/tax-relief/TCA%2067-5-701%20through%2067-5-704.pdf#page=3 diff --git a/policyengine_us/tests/policy/baseline/gov/states/tn/tax/property/elderly_property_tax_relief/tn_elderly_property_tax_relief.yaml b/policyengine_us/tests/policy/baseline/gov/states/tn/tax/property/elderly_property_tax_relief/tn_elderly_property_tax_relief.yaml new file mode 100644 index 00000000000..c39e8a6ed44 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/tn/tax/property/elderly_property_tax_relief/tn_elderly_property_tax_relief.yaml @@ -0,0 +1,156 @@ +- name: Case 1, senior homeowner receives relief on the capped assessed value. + period: 2026 + input: + people: + person1: + age: 65 + real_estate_taxes: 1_000 + assessed_property_value: 25_000 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 38_470 + households: + household: + members: [person1] + state_code: TN + output: + # Capped assessed value = 33,600 * 25% = 8,400. + # Relief = 1,000 * 8,400 / 25,000. + tn_elderly_property_tax_relief: 336 + +- name: Case 2, home below the value cap receives relief for all real estate taxes. + period: 2026 + input: + people: + person1: + age: 70 + real_estate_taxes: 400 + assessed_property_value: 6_000 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 30_000 + households: + household: + members: [person1] + state_code: TN + output: + tn_elderly_property_tax_relief: 400 + +- name: Case 3, senior homeowner above the 2025 income limit receives no relief. + period: 2025 + input: + people: + person1: + age: 70 + real_estate_taxes: 1_000 + assessed_property_value: 25_000 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 37_531 + households: + household: + members: [person1] + state_code: TN + output: + tn_elderly_property_tax_relief: 0 + +- name: Case 4, missing assessed property value yields no relief. + period: 2026 + input: + people: + person1: + age: 70 + real_estate_taxes: 1_000 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 30_000 + households: + household: + members: [person1] + state_code: TN + output: + tn_elderly_property_tax_relief: 0 + +- name: Case 5, senior homeowner at the 2025 income limit receives relief. + period: 2025 + input: + people: + person1: + age: 65 + real_estate_taxes: 1_000 + assessed_property_value: 25_000 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 37_530 + households: + household: + members: [person1] + state_code: TN + output: + # Capped assessed value = 32,700 * 25% = 8,175. + # Relief = 1,000 * 8,175 / 25,000. + tn_elderly_property_tax_relief: 327 + +- name: Case 6, home at the 2026 assessed value cap receives relief for all real estate taxes. + period: 2026 + input: + people: + person1: + age: 70 + real_estate_taxes: 500 + assessed_property_value: 8_400 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 30_000 + households: + household: + members: [person1] + state_code: TN + output: + tn_elderly_property_tax_relief: 500 + +- name: Case 7, senior homeowner outside Tennessee receives no relief. + period: 2026 + input: + people: + person1: + age: 70 + real_estate_taxes: 1_000 + assessed_property_value: 25_000 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 30_000 + households: + household: + members: [person1] + state_code: KY + output: + tn_elderly_property_tax_relief: 0 + +- name: Case 8, dependent property value and taxes do not generate relief. + period: 2026 + input: + people: + person1: + age: 70 + person2: + age: 17 + real_estate_taxes: 1_000 + assessed_property_value: 25_000 + tax_units: + tax_unit: + members: [person1, person2] + adjusted_gross_income: 30_000 + households: + household: + members: [person1, person2] + state_code: TN + output: + tn_elderly_property_tax_relief: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/tn/tax/property/elderly_property_tax_relief/tn_elderly_property_tax_relief_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/tn/tax/property/elderly_property_tax_relief/tn_elderly_property_tax_relief_eligible.yaml new file mode 100644 index 00000000000..acb19484746 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/tn/tax/property/elderly_property_tax_relief/tn_elderly_property_tax_relief_eligible.yaml @@ -0,0 +1,170 @@ +- name: Case 1, senior homeowner at the 2026 income limit is eligible. + period: 2026 + input: + people: + person1: + age: 65 + real_estate_taxes: 1_000 + assessed_property_value: 25_000 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 38_470 + households: + household: + members: [person1] + state_code: TN + output: + tn_elderly_property_tax_relief_eligible: true + +- name: Case 2, senior homeowner above the 2026 income limit is ineligible. + period: 2026 + input: + people: + person1: + age: 65 + real_estate_taxes: 1_000 + assessed_property_value: 25_000 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 38_471 + households: + household: + members: [person1] + state_code: TN + output: + tn_elderly_property_tax_relief_eligible: false + +- name: Case 3, homeowner below the age threshold is ineligible. + period: 2026 + input: + people: + person1: + age: 64 + real_estate_taxes: 1_000 + assessed_property_value: 25_000 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 30_000 + households: + household: + members: [person1] + state_code: TN + output: + tn_elderly_property_tax_relief_eligible: false + +- name: Case 4, senior renter is ineligible. + period: 2026 + input: + people: + person1: + age: 70 + rent: 12_000 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 30_000 + households: + household: + members: [person1] + state_code: TN + output: + tn_elderly_property_tax_relief_eligible: false + +- name: Case 5, senior homeowner outside Tennessee is ineligible. + period: 2026 + input: + people: + person1: + age: 70 + real_estate_taxes: 1_000 + assessed_property_value: 25_000 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 30_000 + households: + household: + members: [person1] + state_code: KY + output: + tn_elderly_property_tax_relief_eligible: false + +- name: Case 6, senior homeowner at the 2025 income limit is eligible. + period: 2025 + input: + people: + person1: + age: 65 + real_estate_taxes: 1_000 + assessed_property_value: 25_000 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 37_530 + households: + household: + members: [person1] + state_code: TN + output: + tn_elderly_property_tax_relief_eligible: true + +- name: Case 7, senior homeowner with no real estate taxes is ineligible. + period: 2026 + input: + people: + person1: + age: 70 + assessed_property_value: 25_000 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 30_000 + households: + household: + members: [person1] + state_code: TN + output: + tn_elderly_property_tax_relief_eligible: false + +- name: Case 8, senior homeowner with no assessed property value is ineligible. + period: 2026 + input: + people: + person1: + age: 70 + real_estate_taxes: 1_000 + assessed_property_value: 0 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 30_000 + households: + household: + members: [person1] + state_code: TN + output: + tn_elderly_property_tax_relief_eligible: false + +- name: Case 9, property value and taxes for a dependent do not create eligibility. + period: 2026 + input: + people: + person1: + age: 70 + person2: + age: 17 + real_estate_taxes: 1_000 + assessed_property_value: 25_000 + tax_units: + tax_unit: + members: [person1, person2] + adjusted_gross_income: 30_000 + households: + household: + members: [person1, person2] + state_code: TN + output: + tn_elderly_property_tax_relief_eligible: false diff --git a/policyengine_us/variables/gov/states/tn/tax/property/elderly_property_tax_relief/tn_elderly_property_tax_relief.py b/policyengine_us/variables/gov/states/tn/tax/property/elderly_property_tax_relief/tn_elderly_property_tax_relief.py new file mode 100644 index 00000000000..e29bf3544b6 --- /dev/null +++ b/policyengine_us/variables/gov/states/tn/tax/property/elderly_property_tax_relief/tn_elderly_property_tax_relief.py @@ -0,0 +1,39 @@ +from policyengine_us.model_api import * + + +class tn_elderly_property_tax_relief(Variable): + value_type = float + entity = TaxUnit + label = "Tennessee elderly property tax relief" + unit = USD + definition_period = YEAR + reference = ( + "https://comptroller.tn.gov/office-functions/pa/property-taxes/property-tax-programs/tax-relief.html", + "https://comptroller.tn.gov/content/dam/cot/pa/documents/tax-relief/TaxReliefBrochure.pdf#page=2", + "https://comptroller.tn.gov/content/dam/cot/pa/documents/tax-relief/TCA%2067-5-701%20through%2067-5-704.pdf#page=3", + ) + defined_for = "tn_elderly_property_tax_relief_eligible" + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.tn.tax.property.elderly_property_tax_relief + person = tax_unit.members + head = person("is_tax_unit_head", period) + joint_spouse = person("is_tax_unit_spouse", period) & person.tax_unit( + "tax_unit_is_joint", period + ) + head_or_joint_spouse = head | joint_spouse + assessed_property_value = tax_unit.sum( + person("assessed_property_value", period) * head_or_joint_spouse + ) + real_estate_taxes = tax_unit.sum( + person("real_estate_taxes", period) * head_or_joint_spouse + ) + capped_assessed_property_value = min_( + assessed_property_value, + p.property_value_cap * p.assessment_rate, + ) + return ( + real_estate_taxes + * capped_assessed_property_value + / max_(assessed_property_value, 1) + ) diff --git a/policyengine_us/variables/gov/states/tn/tax/property/elderly_property_tax_relief/tn_elderly_property_tax_relief_eligible.py b/policyengine_us/variables/gov/states/tn/tax/property/elderly_property_tax_relief/tn_elderly_property_tax_relief_eligible.py new file mode 100644 index 00000000000..aacad80a7d8 --- /dev/null +++ b/policyengine_us/variables/gov/states/tn/tax/property/elderly_property_tax_relief/tn_elderly_property_tax_relief_eligible.py @@ -0,0 +1,40 @@ +from policyengine_us.model_api import * + + +class tn_elderly_property_tax_relief_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Eligible for the Tennessee elderly property tax relief" + definition_period = YEAR + reference = ( + "https://comptroller.tn.gov/office-functions/pa/property-taxes/property-tax-programs/tax-relief.html", + "https://comptroller.tn.gov/content/dam/cot/pa/documents/tax-relief/TaxReliefBrochure.pdf#page=2", + "https://comptroller.tn.gov/content/dam/cot/pa/documents/tax-relief/TCA%2067-5-701%20through%2067-5-704.pdf#page=3", + ) + defined_for = StateCode.TN + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.tn.tax.property.elderly_property_tax_relief + person = tax_unit.members + head = person("is_tax_unit_head", period) + joint_spouse = person("is_tax_unit_spouse", period) & person.tax_unit( + "tax_unit_is_joint", period + ) + head_or_joint_spouse = head | joint_spouse + age = person("age", period.this_year) + assessed_property_value = tax_unit.sum( + person("assessed_property_value", period) * head_or_joint_spouse + ) + real_estate_taxes = tax_unit.sum( + person("real_estate_taxes", period) * head_or_joint_spouse + ) + return ( + tax_unit.any((age >= p.age_threshold) & head_or_joint_spouse) + & ( + tax_unit("tn_elderly_property_tax_relief_income", period) + <= p.income_limit + ) + & (real_estate_taxes > 0) + & (assessed_property_value > 0) + & ~tax_unit("rents", period) + ) diff --git a/policyengine_us/variables/gov/states/tn/tax/property/elderly_property_tax_relief/tn_elderly_property_tax_relief_income.py b/policyengine_us/variables/gov/states/tn/tax/property/elderly_property_tax_relief/tn_elderly_property_tax_relief_income.py new file mode 100644 index 00000000000..458772720f4 --- /dev/null +++ b/policyengine_us/variables/gov/states/tn/tax/property/elderly_property_tax_relief/tn_elderly_property_tax_relief_income.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class tn_elderly_property_tax_relief_income(Variable): + value_type = float + entity = TaxUnit + label = "Tennessee elderly property tax relief income" + unit = USD + definition_period = YEAR + reference = ( + "https://comptroller.tn.gov/content/dam/cot/pa/documents/tax-relief/TaxReliefBrochure.pdf#page=2", + "https://comptroller.tn.gov/content/dam/cot/pa/documents/tax-relief/TCA%2067-5-701%20through%2067-5-704.pdf#page=3", + ) + defined_for = StateCode.TN + + # AGI is the closest available tax-unit proxy for statutory income from all sources. + adds = ["adjusted_gross_income"]