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..912ea9ff854 --- /dev/null +++ b/policyengine_us/parameters/gov/states/tx/tax/property/school_district_homestead_exemption/age_threshold.yaml @@ -0,0 +1,10 @@ +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 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..3bef6fe6a22 --- /dev/null +++ b/policyengine_us/parameters/gov/states/tx/tax/property/school_district_homestead_exemption/general_amount.yaml @@ -0,0 +1,12 @@ +description: Texas provides this amount as a school district residence homestead exemption under the Residence Homestead Exemption program. +values: + 2025-01-01: 140_000 +metadata: + unit: currency-USD + period: year + label: Texas school district residence homestead exemption amount + reference: + - 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..f3f4de8d3dd --- /dev/null +++ b/policyengine_us/parameters/gov/states/tx/tax/property/school_district_homestead_exemption/over_65_or_disabled_amount.yaml @@ -0,0 +1,12 @@ +description: Texas provides this amount as an additional school district residence homestead exemption under the Age 65 or Older or Disabled Persons program. +values: + 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 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..7a57e5817b3 --- /dev/null +++ b/policyengine_us/parameters/gov/states/tx/tax/property/school_district_homestead_exemption/surviving_spouse_age_threshold.yaml @@ -0,0 +1,10 @@ +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 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..a1ade35f552 --- /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,53 @@ +- 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 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..01d78d6490e --- /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,69 @@ +- 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 + assessed_property_value: 300_000 + tax_units: + tax_unit: + members: [person1] + filing_status: SURVIVING_SPOUSE + households: + household: + members: [person1] + state_code: TX + output: + tx_over_65_or_disabled_school_district_homestead_exemption_eligible: true 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..73f6c093d8a --- /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,33 @@ +- 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 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..d78fb4dcc7c --- /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,24 @@ +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://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..3bea2ae878b --- /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,32 @@ +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" + definition_period = YEAR + reference = "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 + filing_status = tax_unit("filing_status", period) + person = tax_unit.members + head_or_spouse = person("is_tax_unit_head_or_spouse", period) + age = person("age", period.this_year) + is_disabled = person("is_disabled", period) + age_or_disability_eligible = tax_unit.any( + ((age >= p.age_threshold) | is_disabled) & head_or_spouse, + ) + surviving_spouse = ( + filing_status == filing_status.possible_values.SURVIVING_SPOUSE + ) & tax_unit.any( + (age >= p.surviving_spouse_age_threshold) & 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..990f3600aa3 --- /dev/null +++ b/policyengine_us/variables/gov/states/tx/tax/property/school_district_homestead_exemption/tx_school_district_homestead_exemption.py @@ -0,0 +1,19 @@ +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://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..d993f8ae123 --- /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,13 @@ +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" + definition_period = YEAR + reference = "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..4243b40e141 --- /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,15 @@ +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://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", + ]