diff --git a/changelog.d/added/8194.md b/changelog.d/added/8194.md new file mode 100644 index 00000000000..fce612e98b7 --- /dev/null +++ b/changelog.d/added/8194.md @@ -0,0 +1 @@ +Add the District of Columbia Senior Citizen or Disabled Property Owner Tax Relief. diff --git a/policyengine_us/parameters/gov/states/dc/tax/property/senior_disabled_property_tax_relief/age_threshold.yaml b/policyengine_us/parameters/gov/states/dc/tax/property/senior_disabled_property_tax_relief/age_threshold.yaml new file mode 100644 index 00000000000..d24b760fb4d --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/tax/property/senior_disabled_property_tax_relief/age_threshold.yaml @@ -0,0 +1,10 @@ +description: The District of Columbia limits senior eligibility to people at or above this age under the Senior Citizen or Disabled Property Owner Tax Relief program. +values: + 2025-01-01: 65 +metadata: + unit: year + period: year + label: DC senior disabled property tax relief age threshold + reference: + - title: Office of Tax and Revenue Real Property Tax Reliefs, Credits, and Deductions, Senior Citizen or Disabled Property Owner Tax Relief + href: https://otr.cfo.dc.gov/page/real-property-tax-reliefs-credits-and-deductions diff --git a/policyengine_us/parameters/gov/states/dc/tax/property/senior_disabled_property_tax_relief/income_limit.yaml b/policyengine_us/parameters/gov/states/dc/tax/property/senior_disabled_property_tax_relief/income_limit.yaml new file mode 100644 index 00000000000..4ecb7f51b2f --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/tax/property/senior_disabled_property_tax_relief/income_limit.yaml @@ -0,0 +1,11 @@ +description: The District of Columbia limits household adjusted gross income to this amount under the Senior Citizen or Disabled Property Owner Tax Relief program. +values: + 2025-01-01: 159_750 + 2026-01-01: 163_500 +metadata: + unit: currency-USD + period: year + label: DC senior disabled property tax relief income limit + reference: + - title: Office of Tax and Revenue Real Property Tax Reliefs, Credits, and Deductions, Senior Citizen or Disabled Property Owner Tax Relief + href: https://otr.cfo.dc.gov/page/real-property-tax-reliefs-credits-and-deductions diff --git a/policyengine_us/parameters/gov/states/dc/tax/property/senior_disabled_property_tax_relief/rate.yaml b/policyengine_us/parameters/gov/states/dc/tax/property/senior_disabled_property_tax_relief/rate.yaml new file mode 100644 index 00000000000..668d5332023 --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/tax/property/senior_disabled_property_tax_relief/rate.yaml @@ -0,0 +1,12 @@ +description: The District of Columbia reduces property tax by this share under the Senior Citizen or Disabled Property Owner Tax Relief program. +values: + 2025-01-01: 0.5 +metadata: + unit: /1 + period: year + label: DC senior disabled property tax relief rate + reference: + - title: Office of Tax and Revenue Real Property Tax Reliefs, Credits, and Deductions, Senior Citizen or Disabled Property Owner Tax Relief + href: https://otr.cfo.dc.gov/page/real-property-tax-reliefs-credits-and-deductions + - title: D.C. Law Library § 47–863. Reduced tax liability for property owners over age 65 and for property owners with disabilities; rules + href: https://code.dccouncil.gov/us/dc/council/code/sections/47-863 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..d1f1b7583a9 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 + - dc_senior_disabled_property_tax_relief + - 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 + - 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/tests/policy/baseline/gov/states/dc/tax/property/senior_disabled_property_tax_relief/dc_senior_disabled_property_tax_relief.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/tax/property/senior_disabled_property_tax_relief/dc_senior_disabled_property_tax_relief.yaml new file mode 100644 index 00000000000..2776e5c89e0 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/tax/property/senior_disabled_property_tax_relief/dc_senior_disabled_property_tax_relief.yaml @@ -0,0 +1,95 @@ +- name: Case 1, senior homeowner receives half of property taxes. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + employment_income: 100_000 + real_estate_taxes: 4_000 + is_tax_unit_head: true + tax_units: + tax_unit: + members: [person1] + takes_up_dc_ptc: false + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: DC + output: + dc_senior_disabled_property_tax_relief: 2_000 + state_property_tax_credit: 2_000 + +- name: Case 2, disabled homeowner receives half of property taxes. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 80_000 + real_estate_taxes: 3_000 + is_permanently_and_totally_disabled: true + is_tax_unit_head: true + tax_units: + tax_unit: + members: [person1] + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: DC + output: + dc_senior_disabled_property_tax_relief: 1_500 + +- name: Case 3, ineligible homeowner receives no relief. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 64 + employment_income: 40_000 + real_estate_taxes: 4_000 + is_tax_unit_head: true + tax_units: + tax_unit: + members: [person1] + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: DC + output: + dc_senior_disabled_property_tax_relief: 0 + +- name: Case 4, homeowner with generic disability receives no relief. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 80_000 + real_estate_taxes: 3_000 + is_disabled: true + is_tax_unit_head: true + tax_units: + tax_unit: + members: [person1] + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: DC + output: + dc_senior_disabled_property_tax_relief: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/tax/property/senior_disabled_property_tax_relief/dc_senior_disabled_property_tax_relief_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/tax/property/senior_disabled_property_tax_relief/dc_senior_disabled_property_tax_relief_eligible.yaml new file mode 100644 index 00000000000..330549f59c9 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/tax/property/senior_disabled_property_tax_relief/dc_senior_disabled_property_tax_relief_eligible.yaml @@ -0,0 +1,133 @@ +- name: Case 1, senior homeowner with income below the limit is eligible. + period: 2026 + input: + people: + person1: + age: 65 + employment_income: 100_000 + real_estate_taxes: 4_000 + is_tax_unit_head: true + tax_units: + tax_unit: + members: [person1] + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: DC + output: + dc_senior_disabled_property_tax_relief_eligible: true + +- name: Case 2, disabled homeowner below the senior age threshold is eligible. + period: 2026 + input: + people: + person1: + age: 40 + employment_income: 80_000 + real_estate_taxes: 3_000 + is_permanently_and_totally_disabled: true + is_tax_unit_head: true + tax_units: + tax_unit: + members: [person1] + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: DC + output: + dc_senior_disabled_property_tax_relief_eligible: true + +- name: Case 3, senior homeowner with income at the limit is ineligible. + period: 2026 + input: + people: + person1: + age: 65 + employment_income: 163_500 + real_estate_taxes: 4_000 + is_tax_unit_head: true + tax_units: + tax_unit: + members: [person1] + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: DC + output: + dc_senior_disabled_property_tax_relief_eligible: false + +- name: Case 4, senior renter is ineligible. + period: 2026 + input: + people: + person1: + age: 65 + employment_income: 40_000 + rent: 12_000 + is_tax_unit_head: true + tax_units: + tax_unit: + members: [person1] + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: DC + output: + dc_senior_disabled_property_tax_relief_eligible: false + +- name: Case 5, non-senior homeowner without disability is ineligible. + period: 2026 + input: + people: + person1: + age: 64 + employment_income: 40_000 + real_estate_taxes: 4_000 + is_tax_unit_head: true + tax_units: + tax_unit: + members: [person1] + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: DC + output: + dc_senior_disabled_property_tax_relief_eligible: false + +- name: Case 6, homeowner with generic disability is ineligible. + period: 2026 + input: + people: + person1: + age: 40 + employment_income: 80_000 + real_estate_taxes: 3_000 + is_disabled: true + is_tax_unit_head: true + tax_units: + tax_unit: + members: [person1] + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: DC + output: + dc_senior_disabled_property_tax_relief_eligible: false diff --git a/policyengine_us/variables/gov/states/dc/tax/property/senior_disabled_property_tax_relief/dc_senior_disabled_property_tax_relief.py b/policyengine_us/variables/gov/states/dc/tax/property/senior_disabled_property_tax_relief/dc_senior_disabled_property_tax_relief.py new file mode 100644 index 00000000000..f099ab782a2 --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/tax/property/senior_disabled_property_tax_relief/dc_senior_disabled_property_tax_relief.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class dc_senior_disabled_property_tax_relief(Variable): + value_type = float + entity = TaxUnit + label = "DC senior disabled property tax relief" + unit = USD + definition_period = YEAR + reference = ( + "https://otr.cfo.dc.gov/page/real-property-tax-reliefs-credits-and-deductions", + "https://code.dccouncil.gov/us/dc/council/code/sections/47-863", + ) + defined_for = "dc_senior_disabled_property_tax_relief_eligible" + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.dc.tax.property.senior_disabled_property_tax_relief + return add(tax_unit, period, ["real_estate_taxes"]) * p.rate diff --git a/policyengine_us/variables/gov/states/dc/tax/property/senior_disabled_property_tax_relief/dc_senior_disabled_property_tax_relief_eligible.py b/policyengine_us/variables/gov/states/dc/tax/property/senior_disabled_property_tax_relief/dc_senior_disabled_property_tax_relief_eligible.py new file mode 100644 index 00000000000..27bb248a8a6 --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/tax/property/senior_disabled_property_tax_relief/dc_senior_disabled_property_tax_relief_eligible.py @@ -0,0 +1,42 @@ +from policyengine_us.model_api import * + + +class dc_senior_disabled_property_tax_relief_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Eligible for the DC senior disabled property tax relief" + definition_period = YEAR + reference = ( + "https://otr.cfo.dc.gov/page/real-property-tax-reliefs-credits-and-deductions", + "https://code.dccouncil.gov/us/dc/council/code/sections/47-863", + ) + defined_for = StateCode.DC + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.dc.tax.property.senior_disabled_property_tax_relief + age_eligible = tax_unit("greater_age_head_spouse", period) >= p.age_threshold + person = tax_unit.members + head_or_spouse = person("is_tax_unit_head_or_spouse", period) + disabled = person("is_permanently_and_totally_disabled", period) | ( + add( + person, + period, + ["ssi", "social_security_disability", "total_disability_payments"], + ) + > 0 + ) + disability_eligible = tax_unit.any(head_or_spouse & disabled) + income = tax_unit.spm_unit( + "dc_senior_disabled_property_tax_relief_income", period + ) + income_eligible = income < p.income_limit + pays_property_taxes = add(tax_unit, period, ["real_estate_taxes"]) > 0 + is_renter = tax_unit("rents", period) + return ( + (age_eligible | disability_eligible) + & income_eligible + & pays_property_taxes + & ~is_renter + ) diff --git a/policyengine_us/variables/gov/states/dc/tax/property/senior_disabled_property_tax_relief/dc_senior_disabled_property_tax_relief_income.py b/policyengine_us/variables/gov/states/dc/tax/property/senior_disabled_property_tax_relief/dc_senior_disabled_property_tax_relief_income.py new file mode 100644 index 00000000000..8c56e79ff49 --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/tax/property/senior_disabled_property_tax_relief/dc_senior_disabled_property_tax_relief_income.py @@ -0,0 +1,12 @@ +from policyengine_us.model_api import * + + +class dc_senior_disabled_property_tax_relief_income(Variable): + value_type = float + entity = SPMUnit + label = "DC senior disabled property tax relief household income" + unit = USD + definition_period = YEAR + defined_for = StateCode.DC + + adds = ["adjusted_gross_income"]