diff --git a/changelog.d/8309.added.md b/changelog.d/8309.added.md new file mode 100644 index 00000000000..10717afdd69 --- /dev/null +++ b/changelog.d/8309.added.md @@ -0,0 +1 @@ +Added the Kentucky Homestead Exemption property tax reduction. diff --git a/policyengine_us/parameters/gov/states/household/state_property_tax_credits.yaml b/policyengine_us/parameters/gov/states/household/state_property_tax_credits.yaml index b5c719c31cf..8d9ddbe960e 100644 --- a/policyengine_us/parameters/gov/states/household/state_property_tax_credits.yaml +++ b/policyengine_us/parameters/gov/states/household/state_property_tax_credits.yaml @@ -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 + - ky_homestead_property_tax_reduction + - 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 + - ok_ptc + - ri_property_tax_credit + - wi_homestead_credit + - wi_property_tax_credit + - wv_homestead_excess_property_tax_credit metadata: unit: list diff --git a/policyengine_us/parameters/gov/states/ky/tax/property/homestead_exemption/age_threshold.yaml b/policyengine_us/parameters/gov/states/ky/tax/property/homestead_exemption/age_threshold.yaml new file mode 100644 index 00000000000..8af7896905c --- /dev/null +++ b/policyengine_us/parameters/gov/states/ky/tax/property/homestead_exemption/age_threshold.yaml @@ -0,0 +1,10 @@ +description: Kentucky 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: Kentucky homestead exemption age threshold + reference: + - title: Kentucky Department of Revenue | Homestead Exemption + href: https://revenue.ky.gov/Property/Residential-Farm-Commercial-Property/pages/homestead-exemption.aspx diff --git a/policyengine_us/parameters/gov/states/ky/tax/property/homestead_exemption/amount.yaml b/policyengine_us/parameters/gov/states/ky/tax/property/homestead_exemption/amount.yaml new file mode 100644 index 00000000000..7584fc186f8 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ky/tax/property/homestead_exemption/amount.yaml @@ -0,0 +1,10 @@ +description: Kentucky provides this amount as a homestead exemption under the Homestead Exemption program. +values: + 2025-01-01: 49_100 +metadata: + unit: currency-USD + period: year + label: Kentucky homestead exemption amount + reference: + - title: Kentucky Department of Revenue | Homestead Exemption + href: https://revenue.ky.gov/Property/Residential-Farm-Commercial-Property/pages/homestead-exemption.aspx diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/tax/property/homestead_exemption/ky_homestead_exemption.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/tax/property/homestead_exemption/ky_homestead_exemption.yaml new file mode 100644 index 00000000000..bd74fbaf809 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/tax/property/homestead_exemption/ky_homestead_exemption.yaml @@ -0,0 +1,33 @@ +- name: Case 1, exemption is capped at the statutory amount. + period: 2025 + input: + people: + person1: + age: 65 + assessed_property_value: 200_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KY + output: + ky_homestead_exemption: 49_100 + +- name: Case 2, exemption is limited to assessed property value. + period: 2025 + input: + people: + person1: + age: 65 + assessed_property_value: 40_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KY + output: + ky_homestead_exemption: 40_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/tax/property/homestead_exemption/ky_homestead_exemption_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/tax/property/homestead_exemption/ky_homestead_exemption_eligible.yaml new file mode 100644 index 00000000000..8b54b829b65 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/tax/property/homestead_exemption/ky_homestead_exemption_eligible.yaml @@ -0,0 +1,67 @@ +- name: Case 1, senior homeowner is eligible. + period: 2025 + input: + people: + person1: + age: 65 + assessed_property_value: 200_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KY + output: + ky_homestead_exemption_eligible: true + +- name: Case 2, disabled homeowner under age 65 is eligible. + period: 2025 + input: + people: + person1: + age: 40 + is_disabled: true + assessed_property_value: 200_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KY + output: + ky_homestead_exemption_eligible: true + +- name: Case 3, non-senior homeowner without disability is ineligible. + period: 2025 + input: + people: + person1: + age: 64 + assessed_property_value: 200_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KY + output: + ky_homestead_exemption_eligible: false + +- name: Case 4, senior without assessed property is ineligible. + period: 2025 + input: + people: + person1: + age: 65 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KY + output: + ky_homestead_exemption_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/tax/property/homestead_exemption/ky_homestead_property_tax_reduction.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/tax/property/homestead_exemption/ky_homestead_property_tax_reduction.yaml new file mode 100644 index 00000000000..78b0e5b884a --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/tax/property/homestead_exemption/ky_homestead_property_tax_reduction.yaml @@ -0,0 +1,53 @@ +- name: Case 1, reduction equals the property tax on the exempt share of value. + period: 2025 + input: + people: + person1: + age: 65 + assessed_property_value: 200_000 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KY + output: + ky_homestead_property_tax_reduction: 491 + +- name: Case 2, reduction cannot exceed property taxes. + period: 2025 + input: + people: + person1: + age: 65 + assessed_property_value: 40_000 + real_estate_taxes: 800 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KY + output: + ky_homestead_property_tax_reduction: 800 + +- name: Case 3, ineligible filer gets no reduction. + period: 2025 + input: + people: + person1: + age: 64 + assessed_property_value: 200_000 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: KY + output: + ky_homestead_property_tax_reduction: 0 diff --git a/policyengine_us/variables/gov/states/ky/tax/property/homestead_exemption/ky_homestead_exemption.py b/policyengine_us/variables/gov/states/ky/tax/property/homestead_exemption/ky_homestead_exemption.py new file mode 100644 index 00000000000..eef76af862f --- /dev/null +++ b/policyengine_us/variables/gov/states/ky/tax/property/homestead_exemption/ky_homestead_exemption.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class ky_homestead_exemption(Variable): + value_type = float + entity = TaxUnit + label = "Kentucky homestead exemption" + unit = USD + definition_period = YEAR + reference = "https://revenue.ky.gov/Property/Residential-Farm-Commercial-Property/pages/homestead-exemption.aspx" + defined_for = "ky_homestead_exemption_eligible" + + def formula(tax_unit, period, parameters): + return min_( + add(tax_unit, period, ["assessed_property_value"]), + parameters(period).gov.states.ky.tax.property.homestead_exemption.amount, + ) diff --git a/policyengine_us/variables/gov/states/ky/tax/property/homestead_exemption/ky_homestead_exemption_eligible.py b/policyengine_us/variables/gov/states/ky/tax/property/homestead_exemption/ky_homestead_exemption_eligible.py new file mode 100644 index 00000000000..b0abd6eebd2 --- /dev/null +++ b/policyengine_us/variables/gov/states/ky/tax/property/homestead_exemption/ky_homestead_exemption_eligible.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class ky_homestead_exemption_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Eligible for the Kentucky Homestead Exemption" + definition_period = YEAR + reference = "https://revenue.ky.gov/Property/Residential-Farm-Commercial-Property/pages/homestead-exemption.aspx" + defined_for = StateCode.KY + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.ky.tax.property.homestead_exemption + 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) + owns_assessed_property = add(tax_unit, period, ["assessed_property_value"]) > 0 + + return ( + tax_unit.any(((age >= p.age_threshold) | is_disabled) & head_or_spouse) + & owns_assessed_property + ) diff --git a/policyengine_us/variables/gov/states/ky/tax/property/homestead_exemption/ky_homestead_property_tax_reduction.py b/policyengine_us/variables/gov/states/ky/tax/property/homestead_exemption/ky_homestead_property_tax_reduction.py new file mode 100644 index 00000000000..8393c24f0af --- /dev/null +++ b/policyengine_us/variables/gov/states/ky/tax/property/homestead_exemption/ky_homestead_property_tax_reduction.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class ky_homestead_property_tax_reduction(Variable): + value_type = float + entity = TaxUnit + label = "Kentucky homestead property tax reduction" + unit = USD + definition_period = YEAR + reference = "https://revenue.ky.gov/Property/Residential-Farm-Commercial-Property/pages/homestead-exemption.aspx" + defined_for = "ky_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("ky_homestead_exemption", period) / max_(assessed_value, 1) + )