diff --git a/changelog.d/8310.added.md b/changelog.d/8310.added.md new file mode 100644 index 00000000000..d70de04aa31 --- /dev/null +++ b/changelog.d/8310.added.md @@ -0,0 +1 @@ +Added the Ohio Homestead Exemption property tax reduction. diff --git a/policyengine_us/parameters/gov/states/oh/tax/property/homestead_exemption/age_threshold.yaml b/policyengine_us/parameters/gov/states/oh/tax/property/homestead_exemption/age_threshold.yaml new file mode 100644 index 00000000000..10b468ee46b --- /dev/null +++ b/policyengine_us/parameters/gov/states/oh/tax/property/homestead_exemption/age_threshold.yaml @@ -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(A)(1)(a)(ii) | Reductions in taxable value + href: https://codes.ohio.gov/ohio-revised-code/section-323.152 diff --git a/policyengine_us/parameters/gov/states/oh/tax/property/homestead_exemption/amount.yaml b/policyengine_us/parameters/gov/states/oh/tax/property/homestead_exemption/amount.yaml new file mode 100644 index 00000000000..cbc436f5da7 --- /dev/null +++ b/policyengine_us/parameters/gov/states/oh/tax/property/homestead_exemption/amount.yaml @@ -0,0 +1,13 @@ +description: Ohio provides this market value 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(A)(1)(c)(i) | Reductions in taxable value + href: https://codes.ohio.gov/ohio-revised-code/section-323.152 + - title: Ohio Legislative Service Commission, Fiscal Note for House Bill 261, 136th General Assembly + href: https://www.legislature.ohio.gov/download?key=27544 diff --git a/policyengine_us/parameters/gov/states/oh/tax/property/homestead_exemption/assessment_rate.yaml b/policyengine_us/parameters/gov/states/oh/tax/property/homestead_exemption/assessment_rate.yaml new file mode 100644 index 00000000000..e4919e27d3d --- /dev/null +++ b/policyengine_us/parameters/gov/states/oh/tax/property/homestead_exemption/assessment_rate.yaml @@ -0,0 +1,12 @@ +description: Ohio uses this share of market value as assessed value under the Homestead Exemption program. +values: + 2025-01-01: 0.35 +metadata: + unit: /1 + period: year + label: Ohio homestead exemption assessment rate + reference: + - title: Ohio Revised Code Section 323.152(A)(1)(c)(ii) | Reductions in taxable value + href: https://codes.ohio.gov/ohio-revised-code/section-323.152 + - title: Ohio Revised Code Section 5715.01(B) | Tax commissioner to supervise assessments by county auditors + href: https://codes.ohio.gov/ohio-revised-code/section-5715.01 diff --git a/policyengine_us/parameters/gov/states/oh/tax/property/homestead_exemption/income_limit.yaml b/policyengine_us/parameters/gov/states/oh/tax/property/homestead_exemption/income_limit.yaml new file mode 100644 index 00000000000..876ef02b8ca --- /dev/null +++ b/policyengine_us/parameters/gov/states/oh/tax/property/homestead_exemption/income_limit.yaml @@ -0,0 +1,15 @@ +description: Ohio limits modified adjusted gross income to this amount under the Homestead Exemption program. +values: + 2025-01-01: 40_000 + 2026-01-01: 41_000 +metadata: + unit: currency-USD + period: year + label: Ohio homestead exemption income limit + reference: + - title: Ohio Revised Code Section 323.152(A)(1)(b)(iii) | Reductions in taxable value + href: https://codes.ohio.gov/ohio-revised-code/section-323.152 + - title: Ohio Legislative Service Commission, Fiscal Note for House Bill 103, 136th General Assembly + href: https://www.legislature.ohio.gov/download?key=25178 + - title: Ohio Legislative Service Commission, Fiscal Note for House Bill 261, 136th General Assembly + href: https://www.legislature.ohio.gov/download?key=27544 diff --git a/policyengine_us/parameters/gov/states/oh/tax/property/homestead_exemption/surviving_spouse_age_threshold.yaml b/policyengine_us/parameters/gov/states/oh/tax/property/homestead_exemption/surviving_spouse_age_threshold.yaml new file mode 100644 index 00000000000..e98d3a4c260 --- /dev/null +++ b/policyengine_us/parameters/gov/states/oh/tax/property/homestead_exemption/surviving_spouse_age_threshold.yaml @@ -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(A)(1)(a)(iii) | Reductions in taxable value + href: https://codes.ohio.gov/ohio-revised-code/section-323.152 diff --git a/policyengine_us/tests/policy/baseline/gov/states/oh/tax/property/homestead_exemption/oh_homestead_exemption.yaml b/policyengine_us/tests/policy/baseline/gov/states/oh/tax/property/homestead_exemption/oh_homestead_exemption.yaml new file mode 100644 index 00000000000..2c22e35249a --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/oh/tax/property/homestead_exemption/oh_homestead_exemption.yaml @@ -0,0 +1,129 @@ +- name: Case 1, exemption uses the 2026 indexed amount. + absolute_error_margin: 0.01 + period: 2026 + input: + people: + person1: + age: 65 + assessed_property_value: 200_000 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1] + oh_homestead_exemption_total_income: 30_000 + households: + household: + members: [person1] + state_code: OH + output: + oh_homestead_exemption: 10_395 + +- name: Case 2, exemption is limited to assessed property value. + absolute_error_margin: 0.01 + period: 2026 + input: + people: + person1: + age: 65 + assessed_property_value: 8_000 + real_estate_taxes: 400 + tax_units: + tax_unit: + members: [person1] + oh_homestead_exemption_total_income: 30_000 + households: + household: + members: [person1] + state_code: OH + output: + oh_homestead_exemption: 8_000 + +- name: Case 3, exemption uses the 2025 amount. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 65 + assessed_property_value: 200_000 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1] + oh_homestead_exemption_total_income: 30_000 + households: + household: + members: [person1] + state_code: OH + output: + oh_homestead_exemption: 10_150 + +- name: Case 4, exemption excludes non-joint adult property value. + absolute_error_margin: 0.01 + period: 2026 + input: + people: + person1: + age: 65 + assessed_property_value: 8_000 + real_estate_taxes: 400 + person2: + age: 40 + assessed_property_value: 200_000 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1, person2] + filing_status: SINGLE + oh_homestead_exemption_total_income: 30_000 + households: + household: + members: [person1, person2] + state_code: OH + output: + oh_homestead_exemption: 8_000 + +- name: Case 5, filer over the income limit receives no exemption. + absolute_error_margin: 0.01 + period: 2026 + input: + people: + person1: + age: 65 + assessed_property_value: 200_000 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1] + oh_homestead_exemption_total_income: 41_001 + households: + household: + members: [person1] + state_code: OH + output: + oh_homestead_exemption: 0 + +- name: Case 6, joint spouse property value qualifies. + absolute_error_margin: 0.01 + period: 2026 + input: + people: + person1: + age: 40 + is_tax_unit_head: true + person2: + age: 65 + is_tax_unit_spouse: true + assessed_property_value: 8_000 + real_estate_taxes: 400 + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + oh_homestead_exemption_total_income: 30_000 + households: + household: + members: [person1, person2] + state_code: OH + output: + oh_homestead_exemption: 8_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/oh/tax/property/homestead_exemption/oh_homestead_exemption_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/oh/tax/property/homestead_exemption/oh_homestead_exemption_eligible.yaml new file mode 100644 index 00000000000..1e2f2cc6dae --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/oh/tax/property/homestead_exemption/oh_homestead_exemption_eligible.yaml @@ -0,0 +1,278 @@ +- name: Case 1, senior homeowner under the income limit is eligible. + period: 2026 + input: + people: + person1: + age: 65 + assessed_property_value: 200_000 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1] + oh_homestead_exemption_total_income: 41_000 + households: + household: + members: [person1] + state_code: OH + output: + oh_homestead_exemption_eligible: true + +- name: Case 2, permanently and totally disabled homeowner under age 65 is eligible. + period: 2026 + input: + people: + person1: + age: 40 + is_permanently_and_totally_disabled: true + assessed_property_value: 200_000 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1] + oh_homestead_exemption_total_income: 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 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1] + oh_homestead_exemption_total_income: 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 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1] + oh_homestead_exemption_total_income: 30_000 + households: + household: + members: [person1] + state_code: OH + output: + oh_homestead_exemption_eligible: false + +- name: Case 5, qualifying surviving spouse at the age threshold is eligible. + period: 2026 + input: + people: + person1: + age: 59 + assessed_property_value: 200_000 + real_estate_taxes: 2_000 + oh_homestead_exemption_qualifying_surviving_spouse: true + tax_units: + tax_unit: + members: [person1] + oh_homestead_exemption_total_income: 30_000 + households: + household: + members: [person1] + state_code: OH + output: + oh_homestead_exemption_eligible: true + +- name: Case 6, generic disability alone is ineligible. + period: 2026 + input: + people: + person1: + age: 40 + is_disabled: true + assessed_property_value: 200_000 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1] + oh_homestead_exemption_total_income: 30_000 + households: + household: + members: [person1] + state_code: OH + output: + oh_homestead_exemption_eligible: false + +- name: Case 7, federal surviving spouse filing status alone is ineligible. + period: 2026 + input: + people: + person1: + age: 59 + assessed_property_value: 200_000 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1] + filing_status: SURVIVING_SPOUSE + oh_homestead_exemption_total_income: 30_000 + households: + household: + members: [person1] + state_code: OH + output: + oh_homestead_exemption_eligible: false + +- name: Case 8, prior-year total income controls eligibility. + 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: 0 + oh_homestead_exemption_total_income: 41_001 + households: + household: + members: [person1] + state_code: OH + output: + oh_homestead_exemption_eligible: false + +- name: Case 9, homeowner without property tax proxy is ineligible. + period: 2026 + input: + people: + person1: + age: 65 + assessed_property_value: 200_000 + tax_units: + tax_unit: + members: [person1] + oh_homestead_exemption_total_income: 30_000 + households: + household: + members: [person1] + state_code: OH + output: + oh_homestead_exemption_eligible: false + +- name: Case 10, senior filer with only non-joint adult property tax is ineligible. + period: 2026 + input: + people: + person1: + age: 65 + person2: + age: 40 + assessed_property_value: 200_000 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1, person2] + filing_status: SINGLE + oh_homestead_exemption_total_income: 30_000 + households: + household: + members: [person1, person2] + state_code: OH + output: + oh_homestead_exemption_eligible: false + +- name: Case 11, 2025 senior homeowner at the income limit is eligible. + period: 2025 + input: + people: + person1: + age: 65 + assessed_property_value: 200_000 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1] + oh_homestead_exemption_total_income: 40_000 + households: + household: + members: [person1] + state_code: OH + output: + oh_homestead_exemption_eligible: true + +- name: Case 12, 2025 senior homeowner above the income limit is ineligible. + period: 2025 + input: + people: + person1: + age: 65 + assessed_property_value: 200_000 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1] + oh_homestead_exemption_total_income: 40_001 + households: + household: + members: [person1] + state_code: OH + output: + oh_homestead_exemption_eligible: false + +- name: Case 13, qualifying surviving spouse below the age threshold is ineligible. + period: 2026 + input: + people: + person1: + age: 58 + assessed_property_value: 200_000 + real_estate_taxes: 2_000 + oh_homestead_exemption_qualifying_surviving_spouse: true + tax_units: + tax_unit: + members: [person1] + oh_homestead_exemption_total_income: 30_000 + households: + household: + members: [person1] + state_code: OH + output: + oh_homestead_exemption_eligible: false + +- name: Case 14, joint spouse property tax can satisfy ownership proxy. + period: 2026 + input: + people: + person1: + age: 40 + is_tax_unit_head: true + person2: + age: 65 + is_tax_unit_spouse: true + assessed_property_value: 200_000 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + oh_homestead_exemption_total_income: 30_000 + households: + household: + members: [person1, person2] + state_code: OH + output: + oh_homestead_exemption_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/oh/tax/property/homestead_exemption/oh_homestead_exemption_total_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/oh/tax/property/homestead_exemption/oh_homestead_exemption_total_income.yaml new file mode 100644 index 00000000000..e62a7dbcf78 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/oh/tax/property/homestead_exemption/oh_homestead_exemption_total_income.yaml @@ -0,0 +1,41 @@ +- name: Case 1, prior-year Ohio modified adjusted gross income controls total income. + period: 2026 + input: + people: + person1: + age: 65 + tax_units: + tax_unit: + members: [person1] + oh_modified_agi: + 2025: 35_000 + 2026: 99_000 + households: + household: + members: [person1] + state_code: + 2025: OH + 2026: OH + output: + oh_homestead_exemption_total_income: 35_000 + +- name: Case 2, current-year Ohio modified adjusted gross income is ignored. + period: 2026 + input: + people: + person1: + age: 65 + tax_units: + tax_unit: + members: [person1] + oh_modified_agi: + 2025: 39_000 + 2026: 60_000 + households: + household: + members: [person1] + state_code: + 2025: OH + 2026: OH + output: + oh_homestead_exemption_total_income: 39_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/oh/tax/property/homestead_exemption/oh_homestead_property_tax_reduction.yaml b/policyengine_us/tests/policy/baseline/gov/states/oh/tax/property/homestead_exemption/oh_homestead_property_tax_reduction.yaml new file mode 100644 index 00000000000..8ed2d79415e --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/oh/tax/property/homestead_exemption/oh_homestead_property_tax_reduction.yaml @@ -0,0 +1,149 @@ +- name: Case 1, reduction equals the property tax on the exempt share of value. + absolute_error_margin: 0.01 + period: 2026 + input: + people: + person1: + age: 65 + assessed_property_value: 200_000 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1] + oh_homestead_exemption_total_income: 30_000 + households: + household: + members: [person1] + state_code: OH + output: + oh_homestead_property_tax_reduction: 103.95 + +- name: Case 2, reduction cannot exceed property taxes. + absolute_error_margin: 0.01 + period: 2026 + input: + people: + person1: + age: 65 + assessed_property_value: 8_000 + real_estate_taxes: 400 + tax_units: + tax_unit: + members: [person1] + oh_homestead_exemption_total_income: 30_000 + households: + household: + members: [person1] + state_code: OH + output: + oh_homestead_property_tax_reduction: 400 + +- name: Case 3, ineligible filer gets no reduction. + absolute_error_margin: 0.01 + period: 2026 + input: + people: + person1: + age: 64 + assessed_property_value: 200_000 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1] + oh_homestead_exemption_total_income: 30_000 + households: + household: + members: [person1] + state_code: OH + output: + oh_homestead_property_tax_reduction: 0 + +- name: Case 4, reduction excludes non-joint adult property tax. + absolute_error_margin: 0.01 + period: 2026 + input: + people: + person1: + age: 65 + assessed_property_value: 8_000 + real_estate_taxes: 400 + person2: + age: 40 + assessed_property_value: 200_000 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1, person2] + filing_status: SINGLE + oh_homestead_exemption_total_income: 30_000 + households: + household: + members: [person1, person2] + state_code: OH + output: + oh_homestead_property_tax_reduction: 400 + +- name: Case 5, filer over the income limit receives no reduction. + absolute_error_margin: 0.01 + period: 2026 + input: + people: + person1: + age: 65 + assessed_property_value: 200_000 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1] + oh_homestead_exemption_total_income: 41_001 + households: + household: + members: [person1] + state_code: OH + output: + oh_homestead_property_tax_reduction: 0 + +- name: Case 6, reduction uses the 2025 exemption amount. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 65 + assessed_property_value: 200_000 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1] + oh_homestead_exemption_total_income: 30_000 + households: + household: + members: [person1] + state_code: OH + output: + oh_homestead_property_tax_reduction: 101.5 + +- name: Case 7, joint spouse property tax qualifies for reduction. + absolute_error_margin: 0.01 + period: 2026 + input: + people: + person1: + age: 40 + is_tax_unit_head: true + person2: + age: 65 + is_tax_unit_spouse: true + assessed_property_value: 8_000 + real_estate_taxes: 400 + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + oh_homestead_exemption_total_income: 30_000 + households: + household: + members: [person1, person2] + state_code: OH + output: + oh_homestead_property_tax_reduction: 400 diff --git a/policyengine_us/variables/gov/states/oh/tax/property/homestead_exemption/oh_homestead_exemption.py b/policyengine_us/variables/gov/states/oh/tax/property/homestead_exemption/oh_homestead_exemption.py new file mode 100644 index 00000000000..a0dbd4af495 --- /dev/null +++ b/policyengine_us/variables/gov/states/oh/tax/property/homestead_exemption/oh_homestead_exemption.py @@ -0,0 +1,27 @@ +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): + person = tax_unit.members + head = person("is_tax_unit_head", period) + spouse_in_joint = person("is_tax_unit_spouse", period) & person.tax_unit( + "tax_unit_is_joint", period + ) + assessed_value = tax_unit.sum( + person("assessed_property_value", period) * (head | spouse_in_joint) + ) + p = parameters(period).gov.states.oh.tax.property.homestead_exemption + assessed_exemption_amount = p.amount * p.assessment_rate + return min_( + assessed_value, + assessed_exemption_amount, + ) diff --git a/policyengine_us/variables/gov/states/oh/tax/property/homestead_exemption/oh_homestead_exemption_eligible.py b/policyengine_us/variables/gov/states/oh/tax/property/homestead_exemption/oh_homestead_exemption_eligible.py new file mode 100644 index 00000000000..b434246e9c3 --- /dev/null +++ b/policyengine_us/variables/gov/states/oh/tax/property/homestead_exemption/oh_homestead_exemption_eligible.py @@ -0,0 +1,44 @@ +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 + person = tax_unit.members + head = person("is_tax_unit_head", period) + spouse_in_joint = person("is_tax_unit_spouse", period) & person.tax_unit( + "tax_unit_is_joint", period + ) + head_or_spouse = head | spouse_in_joint + age = person("age", period.this_year) + is_disabled = person("is_permanently_and_totally_disabled", period) + aged_or_disabled = tax_unit.any( + ((age >= p.age_threshold) | is_disabled) & head_or_spouse, + ) + # Surviving spouses age 65+ already qualify through the age path. + surviving_spouse = tax_unit.any( + (age >= p.surviving_spouse_age_threshold) + & person("oh_homestead_exemption_qualifying_surviving_spouse", period) + & head_or_spouse, + ) + # PolicyEngine has no principal-residence input, so real estate tax + # paid by the qualifying owner proxies for ownership and occupancy. + owns_and_occupies_homestead = tax_unit.any( + (person("real_estate_taxes", period) > 0) & head_or_spouse + ) + + return ( + (aged_or_disabled | surviving_spouse) + & ( + tax_unit("oh_homestead_exemption_total_income", period) + <= p.income_limit + ) + & owns_and_occupies_homestead + ) diff --git a/policyengine_us/variables/gov/states/oh/tax/property/homestead_exemption/oh_homestead_exemption_qualifying_surviving_spouse.py b/policyengine_us/variables/gov/states/oh/tax/property/homestead_exemption/oh_homestead_exemption_qualifying_surviving_spouse.py new file mode 100644 index 00000000000..df29e629cab --- /dev/null +++ b/policyengine_us/variables/gov/states/oh/tax/property/homestead_exemption/oh_homestead_exemption_qualifying_surviving_spouse.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +# PolicyEngine does not observe the deceased spouse's qualification status +# or the surviving spouse's age when the spouse died, so this is an input. +class oh_homestead_exemption_qualifying_surviving_spouse(Variable): + value_type = bool + entity = Person + label = "Ohio homestead exemption qualifying surviving spouse" + definition_period = YEAR + reference = "https://codes.ohio.gov/ohio-revised-code/section-323.152" diff --git a/policyengine_us/variables/gov/states/oh/tax/property/homestead_exemption/oh_homestead_exemption_total_income.py b/policyengine_us/variables/gov/states/oh/tax/property/homestead_exemption/oh_homestead_exemption_total_income.py new file mode 100644 index 00000000000..6e1052f5ee8 --- /dev/null +++ b/policyengine_us/variables/gov/states/oh/tax/property/homestead_exemption/oh_homestead_exemption_total_income.py @@ -0,0 +1,14 @@ +from policyengine_us.model_api import * + + +class oh_homestead_exemption_total_income(Variable): + value_type = float + entity = TaxUnit + label = "Ohio homestead exemption total income" + unit = USD + definition_period = YEAR + reference = "https://codes.ohio.gov/ohio-revised-code/section-323.151" + + def formula(tax_unit, period, parameters): + # Ohio uses modified adjusted gross income from the year before application. + return tax_unit("oh_modified_agi", period.last_year) diff --git a/policyengine_us/variables/gov/states/oh/tax/property/homestead_exemption/oh_homestead_property_tax_reduction.py b/policyengine_us/variables/gov/states/oh/tax/property/homestead_exemption/oh_homestead_property_tax_reduction.py new file mode 100644 index 00000000000..bbe48a162e9 --- /dev/null +++ b/policyengine_us/variables/gov/states/oh/tax/property/homestead_exemption/oh_homestead_property_tax_reduction.py @@ -0,0 +1,32 @@ +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): + person = tax_unit.members + head = person("is_tax_unit_head", period) + spouse_in_joint = person("is_tax_unit_spouse", period) & person.tax_unit( + "tax_unit_is_joint", period + ) + head_or_spouse = head | spouse_in_joint + assessed_value = tax_unit.sum( + person("assessed_property_value", period) * head_or_spouse + ) + real_estate_taxes = tax_unit.sum( + person("real_estate_taxes", period) * head_or_spouse + ) + + return where( + assessed_value > 0, + real_estate_taxes + * (tax_unit("oh_homestead_exemption", period) / assessed_value), + 0, + )