Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/8310.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Added the Ohio Homestead Exemption property tax reduction.
Original file line number Diff line number Diff line change
Expand Up @@ -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
- oh_homestead_property_tax_reduction
- ok_ptc
- ri_property_tax_credit
- wi_homestead_credit
- wi_property_tax_credit
- wv_homestead_excess_property_tax_credit

metadata:
unit: list
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
description: Ohio limits age-based eligibility to filers at or above this age under the Homestead Exemption program.
values:
2025-01-01: 65
metadata:
unit: year
period: year
label: Ohio homestead exemption age threshold
reference:
- title: Ohio Revised Code Section 323.152 | Reductions in taxable value
href: https://codes.ohio.gov/ohio-revised-code/section-323.152
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
description: Ohio provides this amount as a homestead exemption under the Homestead Exemption program.
values:
2025-01-01: 29_000
2026-01-01: 29_700
metadata:
unit: currency-USD
period: year
label: Ohio homestead exemption amount
reference:
- title: Ohio Revised Code Section 323.152 | Reductions in taxable value
href: https://codes.ohio.gov/ohio-revised-code/section-323.152
- title: Ohio Legislative Service Commission, Bill Analysis for House Bill 186, 136th General Assembly
href: https://www.legislature.ohio.gov/download?key=24920&format=pdf
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
description: Ohio limits modified adjusted gross income to this amount under the Homestead Exemption program.
values:
2025-01-01: 41_000
metadata:
unit: currency-USD
period: year
label: Ohio homestead exemption income limit
reference:
- title: Ohio Revised Code Section 323.152 | Reductions in taxable value
href: https://codes.ohio.gov/ohio-revised-code/section-323.152
- title: Ohio Legislative Service Commission, Bill Analysis for House Bill 186, 136th General Assembly
href: https://www.legislature.ohio.gov/download?key=24920&format=pdf
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
description: Ohio limits surviving spouse eligibility to filers at or above this age under the Homestead Exemption program.
values:
2025-01-01: 59
metadata:
unit: year
period: year
label: Ohio homestead exemption surviving spouse age threshold
reference:
- title: Ohio Revised Code Section 323.152 | Reductions in taxable value
href: https://codes.ohio.gov/ohio-revised-code/section-323.152
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
- name: Case 1, exemption uses the 2026 indexed amount.
period: 2026
input:
people:
person1:
age: 65
assessed_property_value: 200_000
tax_units:
tax_unit:
members: [person1]
oh_modified_agi: 30_000
households:
household:
members: [person1]
state_code: OH
output:
oh_homestead_exemption: 29_700

- name: Case 2, exemption is limited to assessed property value.
period: 2026
input:
people:
person1:
age: 65
assessed_property_value: 20_000
tax_units:
tax_unit:
members: [person1]
oh_modified_agi: 30_000
households:
household:
members: [person1]
state_code: OH
output:
oh_homestead_exemption: 20_000

- name: Case 3, exemption uses the 2025 amount.
period: 2025
input:
people:
person1:
age: 65
assessed_property_value: 200_000
tax_units:
tax_unit:
members: [person1]
oh_modified_agi: 30_000
households:
household:
members: [person1]
state_code: OH
output:
oh_homestead_exemption: 29_000
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
- name: Case 1, senior homeowner under the income limit is eligible.
period: 2026
input:
people:
person1:
age: 65
assessed_property_value: 200_000
tax_units:
tax_unit:
members: [person1]
oh_modified_agi: 41_000
households:
household:
members: [person1]
state_code: OH
output:
oh_homestead_exemption_eligible: true

- name: Case 2, disabled homeowner under age 65 is eligible.
period: 2026
input:
people:
person1:
age: 40
is_disabled: true
assessed_property_value: 200_000
tax_units:
tax_unit:
members: [person1]
oh_modified_agi: 30_000
households:
household:
members: [person1]
state_code: OH
output:
oh_homestead_exemption_eligible: true

- name: Case 3, senior homeowner above the income limit is ineligible.
period: 2026
input:
people:
person1:
age: 65
assessed_property_value: 200_000
tax_units:
tax_unit:
members: [person1]
oh_modified_agi: 41_001
households:
household:
members: [person1]
state_code: OH
output:
oh_homestead_exemption_eligible: false

- name: Case 4, non-senior homeowner without disability is ineligible.
period: 2026
input:
people:
person1:
age: 64
assessed_property_value: 200_000
tax_units:
tax_unit:
members: [person1]
oh_modified_agi: 30_000
households:
household:
members: [person1]
state_code: OH
output:
oh_homestead_exemption_eligible: false

- name: Case 5, surviving spouse at the surviving spouse age threshold is eligible.
period: 2026
input:
people:
person1:
age: 59
assessed_property_value: 200_000
tax_units:
tax_unit:
members: [person1]
filing_status: SURVIVING_SPOUSE
oh_modified_agi: 30_000
households:
household:
members: [person1]
state_code: OH
output:
oh_homestead_exemption_eligible: true
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
- name: Case 1, reduction equals the property tax on the exempt share of value.
period: 2026
input:
people:
person1:
age: 65
assessed_property_value: 200_000
real_estate_taxes: 2_000
tax_units:
tax_unit:
members: [person1]
oh_modified_agi: 30_000
households:
household:
members: [person1]
state_code: OH
output:
oh_homestead_property_tax_reduction: 297

- name: Case 2, reduction cannot exceed property taxes.
period: 2026
input:
people:
person1:
age: 65
assessed_property_value: 20_000
real_estate_taxes: 400
tax_units:
tax_unit:
members: [person1]
oh_modified_agi: 30_000
households:
household:
members: [person1]
state_code: OH
output:
oh_homestead_property_tax_reduction: 400

- name: Case 3, ineligible filer gets no reduction.
period: 2026
input:
people:
person1:
age: 64
assessed_property_value: 200_000
real_estate_taxes: 2_000
tax_units:
tax_unit:
members: [person1]
oh_modified_agi: 30_000
households:
household:
members: [person1]
state_code: OH
output:
oh_homestead_property_tax_reduction: 0
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from policyengine_us.model_api import *


class oh_homestead_exemption(Variable):
value_type = float
entity = TaxUnit
label = "Ohio homestead exemption"
unit = USD
definition_period = YEAR
reference = "https://codes.ohio.gov/ohio-revised-code/section-323.152"
defined_for = "oh_homestead_exemption_eligible"

def formula(tax_unit, period, parameters):
return min_(
add(tax_unit, period, ["assessed_property_value"]),
parameters(period).gov.states.oh.tax.property.homestead_exemption.amount,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from policyengine_us.model_api import *


class oh_homestead_exemption_eligible(Variable):
value_type = bool
entity = TaxUnit
label = "Eligible for the Ohio Homestead Exemption"
definition_period = YEAR
reference = "https://codes.ohio.gov/ohio-revised-code/section-323.152"
defined_for = StateCode.OH

def formula(tax_unit, period, parameters):
p = parameters(period).gov.states.oh.tax.property.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)
aged_or_disabled = 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 (
(aged_or_disabled | surviving_spouse)
& (tax_unit("oh_modified_agi", period) <= p.income_limit)
& (add(tax_unit, period, ["assessed_property_value"]) > 0)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from policyengine_us.model_api import *


class oh_homestead_property_tax_reduction(Variable):
value_type = float
entity = TaxUnit
label = "Ohio homestead property tax reduction"
unit = USD
definition_period = YEAR
reference = "https://codes.ohio.gov/ohio-revised-code/section-323.152"
defined_for = "oh_homestead_exemption_eligible"

def formula(tax_unit, period, parameters):
assessed_value = add(tax_unit, period, ["assessed_property_value"])
return add(tax_unit, period, ["real_estate_taxes"]) * (
tax_unit("oh_homestead_exemption", period) / max_(assessed_value, 1)
)
Loading