diff --git a/changelog.d/8312.added.md b/changelog.d/8312.added.md new file mode 100644 index 00000000000..ea4cefb643c --- /dev/null +++ b/changelog.d/8312.added.md @@ -0,0 +1 @@ +Added the Texas school district residence homestead exemptions. diff --git a/policyengine_us/parameters/gov/states/tx/tax/property/school_district_homestead_exemption/age_threshold.yaml b/policyengine_us/parameters/gov/states/tx/tax/property/school_district_homestead_exemption/age_threshold.yaml new file mode 100644 index 00000000000..426e6306c26 --- /dev/null +++ b/policyengine_us/parameters/gov/states/tx/tax/property/school_district_homestead_exemption/age_threshold.yaml @@ -0,0 +1,12 @@ +description: Texas limits age-based eligibility to filers at or above this age under the Age 65 or Older or Disabled Persons program. +values: + 2025-01-01: 65 +metadata: + unit: year + period: year + label: Texas age 65 or older residence homestead exemption age threshold + reference: + - title: Texas Tax Code § 11.13(c) | Additional residence homestead exemption for adults who are disabled or 65 or older + href: https://statutes.capitol.texas.gov/Docs/TX/htm/TX.11.htm#11.13 + - title: Texas Comptroller | Property Tax Exemptions + href: https://comptroller.texas.gov/taxes/property-tax/exemptions/ diff --git a/policyengine_us/parameters/gov/states/tx/tax/property/school_district_homestead_exemption/general_amount.yaml b/policyengine_us/parameters/gov/states/tx/tax/property/school_district_homestead_exemption/general_amount.yaml new file mode 100644 index 00000000000..95518722da8 --- /dev/null +++ b/policyengine_us/parameters/gov/states/tx/tax/property/school_district_homestead_exemption/general_amount.yaml @@ -0,0 +1,15 @@ +description: Texas provides this amount as a school district residence homestead exemption under the Residence Homestead Exemption program. +values: + 2024-01-01: 100_000 + 2025-01-01: 140_000 +metadata: + unit: currency-USD + period: year + label: Texas school district residence homestead exemption amount + reference: + - title: Texas Tax Code § 11.13(b) | General residence homestead exemption ($140,000 for school districts) + href: https://statutes.capitol.texas.gov/Docs/TX/htm/TX.11.htm#11.13 + - title: Texas Comptroller | Property Tax Exemptions + href: https://comptroller.texas.gov/taxes/property-tax/exemptions/ + - title: Texas Education Agency | Tax Year 2025 Maximum Compressed Tax Rates + href: https://tea.texas.gov/sites/default/files/taa-2025-06-12-tax-year-2025-maximum-compressed-tax-rates.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/tx/tax/property/school_district_homestead_exemption/over_65_or_disabled_amount.yaml b/policyengine_us/parameters/gov/states/tx/tax/property/school_district_homestead_exemption/over_65_or_disabled_amount.yaml new file mode 100644 index 00000000000..83984959576 --- /dev/null +++ b/policyengine_us/parameters/gov/states/tx/tax/property/school_district_homestead_exemption/over_65_or_disabled_amount.yaml @@ -0,0 +1,15 @@ +description: Texas provides this amount as an additional school district residence homestead exemption under the Age 65 or Older or Disabled Persons program. +values: + 2024-01-01: 10_000 + 2025-01-01: 60_000 +metadata: + unit: currency-USD + period: year + label: Texas additional school district residence homestead exemption amount for age 65 or older or disabled homeowners + reference: + - title: Texas Tax Code § 11.13(c) | Additional residence homestead exemption for adults who are disabled or 65 or older ($60,000 for school districts) + href: https://statutes.capitol.texas.gov/Docs/TX/htm/TX.11.htm#11.13 + - title: Texas Comptroller | Property Tax Exemptions + href: https://comptroller.texas.gov/taxes/property-tax/exemptions/ + - title: Texas Education Agency | Tax Year 2025 Maximum Compressed Tax Rates + href: https://tea.texas.gov/sites/default/files/taa-2025-06-12-tax-year-2025-maximum-compressed-tax-rates.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/tx/tax/property/school_district_homestead_exemption/surviving_spouse_age_threshold.yaml b/policyengine_us/parameters/gov/states/tx/tax/property/school_district_homestead_exemption/surviving_spouse_age_threshold.yaml new file mode 100644 index 00000000000..3ffcce6860a --- /dev/null +++ b/policyengine_us/parameters/gov/states/tx/tax/property/school_district_homestead_exemption/surviving_spouse_age_threshold.yaml @@ -0,0 +1,12 @@ +description: Texas limits surviving spouse eligibility to filers at or above this age under the Age 65 or Older or Disabled Persons program. +values: + 2025-01-01: 55 +metadata: + unit: year + period: year + label: Texas age 65 or older residence homestead exemption surviving spouse age threshold + reference: + - title: Texas Tax Code § 11.13(q) | Surviving spouse (age 55 or older at the time of the deceased spouse's death) continuation of the age 65 or older exemption + href: https://statutes.capitol.texas.gov/Docs/TX/htm/TX.11.htm#11.13 + - title: Texas Comptroller | Property Tax Exemptions + href: https://comptroller.texas.gov/taxes/property-tax/exemptions/ diff --git a/policyengine_us/tests/policy/baseline/gov/states/tx/tax/property/school_district_homestead_exemption/tx_over_65_or_disabled_school_district_homestead_exemption.yaml b/policyengine_us/tests/policy/baseline/gov/states/tx/tax/property/school_district_homestead_exemption/tx_over_65_or_disabled_school_district_homestead_exemption.yaml new file mode 100644 index 00000000000..b1637724155 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/tx/tax/property/school_district_homestead_exemption/tx_over_65_or_disabled_school_district_homestead_exemption.yaml @@ -0,0 +1,71 @@ +- name: Case 1, additional exemption is capped at the statutory amount. + period: 2025 + input: + people: + person1: + age: 65 + assessed_property_value: 300_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: TX + output: + tx_over_65_or_disabled_school_district_homestead_exemption: 60_000 + tx_total_school_district_homestead_exemption: 200_000 + +- name: Case 2, additional exemption is limited to remaining assessed property value. + period: 2025 + input: + people: + person1: + age: 65 + assessed_property_value: 180_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: TX + output: + tx_over_65_or_disabled_school_district_homestead_exemption: 40_000 + tx_total_school_district_homestead_exemption: 180_000 + +- name: Case 3, ineligible filer gets no additional exemption. + period: 2025 + input: + people: + person1: + age: 64 + assessed_property_value: 300_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: TX + output: + tx_over_65_or_disabled_school_district_homestead_exemption: 0 + tx_total_school_district_homestead_exemption: 140_000 + +- name: Case 4, prior-law 2024 additional exemption is capped at the statutory amount. + period: 2024 + input: + people: + person1: + age: 65 + assessed_property_value: 300_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: TX + output: + tx_over_65_or_disabled_school_district_homestead_exemption: 10_000 + tx_total_school_district_homestead_exemption: 110_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/tx/tax/property/school_district_homestead_exemption/tx_over_65_or_disabled_school_district_homestead_exemption_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/tx/tax/property/school_district_homestead_exemption/tx_over_65_or_disabled_school_district_homestead_exemption_eligible.yaml new file mode 100644 index 00000000000..3d09db02f95 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/tx/tax/property/school_district_homestead_exemption/tx_over_65_or_disabled_school_district_homestead_exemption_eligible.yaml @@ -0,0 +1,114 @@ +- name: Case 1, age 65 homeowner is eligible for the additional exemption. + period: 2025 + input: + people: + person1: + age: 65 + assessed_property_value: 300_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: TX + output: + tx_over_65_or_disabled_school_district_homestead_exemption_eligible: true + +- name: Case 2, disabled homeowner under age 65 is eligible for the additional exemption. + period: 2025 + input: + people: + person1: + age: 40 + is_disabled: true + assessed_property_value: 300_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: TX + output: + tx_over_65_or_disabled_school_district_homestead_exemption_eligible: true + +- name: Case 3, non-senior homeowner without disability is ineligible for the additional exemption. + period: 2025 + input: + people: + person1: + age: 64 + assessed_property_value: 300_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: TX + output: + tx_over_65_or_disabled_school_district_homestead_exemption_eligible: false + +- name: Case 4, surviving spouse at the age threshold is eligible. + period: 2025 + input: + people: + person1: + age: 55 + is_surviving_spouse: true + assessed_property_value: 300_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: TX + output: + tx_over_65_or_disabled_school_district_homestead_exemption_eligible: true + +- name: Case 5, age 65 spouse is eligible for the additional exemption. + period: 2025 + input: + people: + person1: + age: 40 + is_tax_unit_head: true + assessed_property_value: 300_000 + person2: + age: 65 + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: TX + output: + tx_over_65_or_disabled_school_district_homestead_exemption_eligible: true + +- name: Case 6, elderly disabled dependent is ineligible for the additional exemption. + period: 2025 + input: + people: + person1: + age: 40 + is_tax_unit_head: true + assessed_property_value: 300_000 + person2: + age: 70 + is_disabled: true + is_tax_unit_head: false + is_tax_unit_spouse: false + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: TX + output: + tx_over_65_or_disabled_school_district_homestead_exemption_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/tx/tax/property/school_district_homestead_exemption/tx_school_district_homestead_exemption.yaml b/policyengine_us/tests/policy/baseline/gov/states/tx/tax/property/school_district_homestead_exemption/tx_school_district_homestead_exemption.yaml new file mode 100644 index 00000000000..bffcba958c9 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/tx/tax/property/school_district_homestead_exemption/tx_school_district_homestead_exemption.yaml @@ -0,0 +1,50 @@ +- name: Case 1, general exemption is capped at the statutory amount. + period: 2025 + input: + people: + person1: + age: 40 + assessed_property_value: 300_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: TX + output: + tx_school_district_homestead_exemption: 140_000 + +- name: Case 2, general exemption is limited to assessed property value. + period: 2025 + input: + people: + person1: + age: 40 + assessed_property_value: 100_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: TX + output: + tx_school_district_homestead_exemption: 100_000 + +- name: Case 3, prior-law 2024 general exemption is capped at the statutory amount. + period: 2024 + input: + people: + person1: + age: 40 + assessed_property_value: 300_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: TX + output: + tx_school_district_homestead_exemption: 100_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/tx/tax/property/school_district_homestead_exemption/tx_school_district_homestead_exemption_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/tx/tax/property/school_district_homestead_exemption/tx_school_district_homestead_exemption_eligible.yaml new file mode 100644 index 00000000000..4e4688dfda8 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/tx/tax/property/school_district_homestead_exemption/tx_school_district_homestead_exemption_eligible.yaml @@ -0,0 +1,32 @@ +- name: Case 1, homeowner is eligible for the general school district exemption. + period: 2025 + input: + people: + person1: + age: 40 + assessed_property_value: 300_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: TX + output: + tx_school_district_homestead_exemption_eligible: true + +- name: Case 2, filer without assessed property is ineligible. + period: 2025 + input: + people: + person1: + age: 40 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: TX + output: + tx_school_district_homestead_exemption_eligible: false diff --git a/policyengine_us/variables/gov/states/tx/tax/property/school_district_homestead_exemption/tx_over_65_or_disabled_school_district_homestead_exemption.py b/policyengine_us/variables/gov/states/tx/tax/property/school_district_homestead_exemption/tx_over_65_or_disabled_school_district_homestead_exemption.py new file mode 100644 index 00000000000..8fffca8f13a --- /dev/null +++ b/policyengine_us/variables/gov/states/tx/tax/property/school_district_homestead_exemption/tx_over_65_or_disabled_school_district_homestead_exemption.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +class tx_over_65_or_disabled_school_district_homestead_exemption(Variable): + value_type = float + entity = TaxUnit + label = "Texas age 65 or older or disabled school district residence homestead exemption" + unit = USD + definition_period = YEAR + reference = ( + "https://statutes.capitol.texas.gov/Docs/TX/htm/TX.11.htm#11.13", + "https://comptroller.texas.gov/taxes/property-tax/exemptions/", + ) + defined_for = "tx_over_65_or_disabled_school_district_homestead_exemption_eligible" + + def formula(tax_unit, period, parameters): + remaining_value = max_( + add(tax_unit, period, ["assessed_property_value"]) + - tax_unit("tx_school_district_homestead_exemption", period), + 0, + ) + return min_( + remaining_value, + parameters( + period + ).gov.states.tx.tax.property.school_district_homestead_exemption.over_65_or_disabled_amount, + ) diff --git a/policyengine_us/variables/gov/states/tx/tax/property/school_district_homestead_exemption/tx_over_65_or_disabled_school_district_homestead_exemption_eligible.py b/policyengine_us/variables/gov/states/tx/tax/property/school_district_homestead_exemption/tx_over_65_or_disabled_school_district_homestead_exemption_eligible.py new file mode 100644 index 00000000000..82304959ecf --- /dev/null +++ b/policyengine_us/variables/gov/states/tx/tax/property/school_district_homestead_exemption/tx_over_65_or_disabled_school_district_homestead_exemption_eligible.py @@ -0,0 +1,36 @@ +from policyengine_us.model_api import * + + +class tx_over_65_or_disabled_school_district_homestead_exemption_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Eligible for the Texas age 65 or older or disabled school district residence homestead exemption" + documentation = "Models age, disability, and surviving-spouse eligibility with available person-level inputs; it does not verify the deceased spouse's prior qualification or continued residence occupancy beyond the assessed-property proxy." + definition_period = YEAR + reference = ( + "https://statutes.capitol.texas.gov/Docs/TX/htm/TX.11.htm#11.13", + "https://comptroller.texas.gov/taxes/property-tax/exemptions/", + ) + defined_for = StateCode.TX + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.tx.tax.property.school_district_homestead_exemption + age_or_disability_eligible = ( + tax_unit("greater_age_head_spouse", period) >= p.age_threshold + ) | tax_unit("disabled_tax_unit_head_or_spouse", period) + + person = tax_unit.members + head_or_spouse = person("is_tax_unit_head_or_spouse", period) + age = person("age", period.this_year) + is_surviving_spouse = person("is_surviving_spouse", period) + surviving_spouse = tax_unit.any( + (age >= p.surviving_spouse_age_threshold) + & is_surviving_spouse + & head_or_spouse, + ) + + return (age_or_disability_eligible | surviving_spouse) & tax_unit( + "tx_school_district_homestead_exemption_eligible", period + ) diff --git a/policyengine_us/variables/gov/states/tx/tax/property/school_district_homestead_exemption/tx_school_district_homestead_exemption.py b/policyengine_us/variables/gov/states/tx/tax/property/school_district_homestead_exemption/tx_school_district_homestead_exemption.py new file mode 100644 index 00000000000..b1a59462d4a --- /dev/null +++ b/policyengine_us/variables/gov/states/tx/tax/property/school_district_homestead_exemption/tx_school_district_homestead_exemption.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class tx_school_district_homestead_exemption(Variable): + value_type = float + entity = TaxUnit + label = "Texas school district residence homestead exemption" + unit = USD + definition_period = YEAR + reference = ( + "https://statutes.capitol.texas.gov/Docs/TX/htm/TX.11.htm#11.13", + "https://comptroller.texas.gov/taxes/property-tax/exemptions/", + ) + defined_for = "tx_school_district_homestead_exemption_eligible" + + def formula(tax_unit, period, parameters): + return min_( + add(tax_unit, period, ["assessed_property_value"]), + parameters( + period + ).gov.states.tx.tax.property.school_district_homestead_exemption.general_amount, + ) diff --git a/policyengine_us/variables/gov/states/tx/tax/property/school_district_homestead_exemption/tx_school_district_homestead_exemption_eligible.py b/policyengine_us/variables/gov/states/tx/tax/property/school_district_homestead_exemption/tx_school_district_homestead_exemption_eligible.py new file mode 100644 index 00000000000..2146b44c391 --- /dev/null +++ b/policyengine_us/variables/gov/states/tx/tax/property/school_district_homestead_exemption/tx_school_district_homestead_exemption_eligible.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class tx_school_district_homestead_exemption_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Eligible for the Texas school district residence homestead exemption" + documentation = "Approximates residence homestead eligibility with positive assessed property value because PolicyEngine does not currently distinguish principal-residence homestead property from other assessed property." + definition_period = YEAR + reference = ( + "https://statutes.capitol.texas.gov/Docs/TX/htm/TX.11.htm#11.13", + "https://comptroller.texas.gov/taxes/property-tax/exemptions/", + ) + defined_for = StateCode.TX + + def formula(tax_unit, period, parameters): + return add(tax_unit, period, ["assessed_property_value"]) > 0 diff --git a/policyengine_us/variables/gov/states/tx/tax/property/school_district_homestead_exemption/tx_total_school_district_homestead_exemption.py b/policyengine_us/variables/gov/states/tx/tax/property/school_district_homestead_exemption/tx_total_school_district_homestead_exemption.py new file mode 100644 index 00000000000..88e8b6e24c8 --- /dev/null +++ b/policyengine_us/variables/gov/states/tx/tax/property/school_district_homestead_exemption/tx_total_school_district_homestead_exemption.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class tx_total_school_district_homestead_exemption(Variable): + value_type = float + entity = TaxUnit + label = "Texas total school district residence homestead exemption" + unit = USD + definition_period = YEAR + reference = ( + "https://statutes.capitol.texas.gov/Docs/TX/htm/TX.11.htm#11.13", + "https://comptroller.texas.gov/taxes/property-tax/exemptions/", + ) + defined_for = "tx_school_district_homestead_exemption_eligible" + adds = [ + "tx_school_district_homestead_exemption", + "tx_over_65_or_disabled_school_district_homestead_exemption", + ]