From cf67d90d125972d46d332e0bbde693df03e4de11 Mon Sep 17 00:00:00 2001 From: Daphne Hansell <128793799+daphnehanse11@users.noreply.github.com> Date: Thu, 14 May 2026 16:00:48 -0400 Subject: [PATCH 1/2] Add Pennsylvania property tax rent rebate --- changelog.d/8181.added.md | 1 + .../household/state_property_tax_credits.yaml | 20 +++++ .../age_threshold.yaml | 10 +++ .../property_tax_or_rent_rebate/amount.yaml | 31 +++++++ .../disability_age_threshold.yaml | 10 +++ .../income_limit.yaml | 10 +++ .../widow_age_threshold.yaml | 10 +++ .../pa_property_tax_or_rent_rebate.yaml | 71 +++++++++++++++ ..._property_tax_or_rent_rebate_eligible.yaml | 90 +++++++++++++++++++ .../pa_property_tax_or_rent_rebate.py | 17 ++++ ...pa_property_tax_or_rent_rebate_eligible.py | 33 +++++++ 11 files changed, 303 insertions(+) create mode 100644 changelog.d/8181.added.md create mode 100644 policyengine_us/parameters/gov/states/pa/tax/property/property_tax_or_rent_rebate/age_threshold.yaml create mode 100644 policyengine_us/parameters/gov/states/pa/tax/property/property_tax_or_rent_rebate/amount.yaml create mode 100644 policyengine_us/parameters/gov/states/pa/tax/property/property_tax_or_rent_rebate/disability_age_threshold.yaml create mode 100644 policyengine_us/parameters/gov/states/pa/tax/property/property_tax_or_rent_rebate/income_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/pa/tax/property/property_tax_or_rent_rebate/widow_age_threshold.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/pa/tax/property/property_tax_or_rent_rebate/pa_property_tax_or_rent_rebate.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/pa/tax/property/property_tax_or_rent_rebate/pa_property_tax_or_rent_rebate_eligible.yaml create mode 100644 policyengine_us/variables/gov/states/pa/tax/property/property_tax_or_rent_rebate/pa_property_tax_or_rent_rebate.py create mode 100644 policyengine_us/variables/gov/states/pa/tax/property/property_tax_or_rent_rebate/pa_property_tax_or_rent_rebate_eligible.py diff --git a/changelog.d/8181.added.md b/changelog.d/8181.added.md new file mode 100644 index 00000000000..d23a6d3ccaf --- /dev/null +++ b/changelog.d/8181.added.md @@ -0,0 +1 @@ +Added the Pennsylvania Property Tax/Rent Rebate standard rebate. 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..42c575e41d4 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 + - 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 + - pa_property_tax_or_rent_rebate + - 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/pa/tax/property/property_tax_or_rent_rebate/age_threshold.yaml b/policyengine_us/parameters/gov/states/pa/tax/property/property_tax_or_rent_rebate/age_threshold.yaml new file mode 100644 index 00000000000..badacc7df44 --- /dev/null +++ b/policyengine_us/parameters/gov/states/pa/tax/property/property_tax_or_rent_rebate/age_threshold.yaml @@ -0,0 +1,10 @@ +description: Pennsylvania limits age-based eligibility to filers at or above this age under the Property Tax/Rent Rebate program. +values: + 2025-01-01: 65 +metadata: + unit: year + period: year + label: Pennsylvania Property Tax/Rent Rebate age threshold + reference: + - title: Pennsylvania Department of Revenue | Property Tax/Rent Rebate Program + href: https://www.pa.gov/agencies/revenue/ptrr diff --git a/policyengine_us/parameters/gov/states/pa/tax/property/property_tax_or_rent_rebate/amount.yaml b/policyengine_us/parameters/gov/states/pa/tax/property/property_tax_or_rent_rebate/amount.yaml new file mode 100644 index 00000000000..8d8355a66eb --- /dev/null +++ b/policyengine_us/parameters/gov/states/pa/tax/property/property_tax_or_rent_rebate/amount.yaml @@ -0,0 +1,31 @@ +description: Pennsylvania provides this rebate amount under the Property Tax/Rent Rebate program. +metadata: + threshold_unit: currency-USD + rate_unit: currency-USD + type: single_amount + period: year + label: Pennsylvania Property Tax/Rent Rebate amount + reference: + - title: Pennsylvania Department of Revenue | Property Tax/Rent Rebate Program + href: https://www.pa.gov/agencies/revenue/ptrr +brackets: + - threshold: + 2025-01-01: 0 + amount: + 2025-01-01: 1_000 + - threshold: + 2025-01-01: 8_551 + amount: + 2025-01-01: 770 + - threshold: + 2025-01-01: 16_041 + amount: + 2025-01-01: 460 + - threshold: + 2025-01-01: 19_241 + amount: + 2025-01-01: 380 + - threshold: + 2025-01-01: 48_111 + amount: + 2025-01-01: 0 diff --git a/policyengine_us/parameters/gov/states/pa/tax/property/property_tax_or_rent_rebate/disability_age_threshold.yaml b/policyengine_us/parameters/gov/states/pa/tax/property/property_tax_or_rent_rebate/disability_age_threshold.yaml new file mode 100644 index 00000000000..c76c8131e69 --- /dev/null +++ b/policyengine_us/parameters/gov/states/pa/tax/property/property_tax_or_rent_rebate/disability_age_threshold.yaml @@ -0,0 +1,10 @@ +description: Pennsylvania limits disability-based eligibility to filers at or above this age under the Property Tax/Rent Rebate program. +values: + 2025-01-01: 18 +metadata: + unit: year + period: year + label: Pennsylvania Property Tax/Rent Rebate disability age threshold + reference: + - title: Pennsylvania Department of Revenue | Property Tax/Rent Rebate Program + href: https://www.pa.gov/agencies/revenue/ptrr diff --git a/policyengine_us/parameters/gov/states/pa/tax/property/property_tax_or_rent_rebate/income_limit.yaml b/policyengine_us/parameters/gov/states/pa/tax/property/property_tax_or_rent_rebate/income_limit.yaml new file mode 100644 index 00000000000..6bd6d3c07ef --- /dev/null +++ b/policyengine_us/parameters/gov/states/pa/tax/property/property_tax_or_rent_rebate/income_limit.yaml @@ -0,0 +1,10 @@ +description: Pennsylvania limits income to this amount under the Property Tax/Rent Rebate program. +values: + 2025-01-01: 48_110 +metadata: + unit: currency-USD + period: year + label: Pennsylvania Property Tax/Rent Rebate income limit + reference: + - title: Pennsylvania Department of Revenue | Property Tax/Rent Rebate Program + href: https://www.pa.gov/agencies/revenue/ptrr diff --git a/policyengine_us/parameters/gov/states/pa/tax/property/property_tax_or_rent_rebate/widow_age_threshold.yaml b/policyengine_us/parameters/gov/states/pa/tax/property/property_tax_or_rent_rebate/widow_age_threshold.yaml new file mode 100644 index 00000000000..f3cdff44345 --- /dev/null +++ b/policyengine_us/parameters/gov/states/pa/tax/property/property_tax_or_rent_rebate/widow_age_threshold.yaml @@ -0,0 +1,10 @@ +description: Pennsylvania limits widow and widower eligibility to filers at or above this age under the Property Tax/Rent Rebate program. +values: + 2025-01-01: 50 +metadata: + unit: year + period: year + label: Pennsylvania Property Tax/Rent Rebate widow and widower age threshold + reference: + - title: Pennsylvania Department of Revenue | Property Tax/Rent Rebate Program + href: https://www.pa.gov/agencies/revenue/ptrr diff --git a/policyengine_us/tests/policy/baseline/gov/states/pa/tax/property/property_tax_or_rent_rebate/pa_property_tax_or_rent_rebate.yaml b/policyengine_us/tests/policy/baseline/gov/states/pa/tax/property/property_tax_or_rent_rebate/pa_property_tax_or_rent_rebate.yaml new file mode 100644 index 00000000000..7347ef4cb91 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/pa/tax/property/property_tax_or_rent_rebate/pa_property_tax_or_rent_rebate.yaml @@ -0,0 +1,71 @@ +- name: Case 1, lowest income bracket receives the maximum standard rebate. + period: 2025 + input: + people: + person1: + age: 65 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 8_550 + households: + household: + members: [person1] + state_code: PA + output: + pa_property_tax_or_rent_rebate: 1_000 + +- name: Case 2, rebate follows the second income bracket. + period: 2025 + input: + people: + person1: + age: 65 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 8_551 + households: + household: + members: [person1] + state_code: PA + output: + pa_property_tax_or_rent_rebate: 770 + +- name: Case 3, rebate follows the top income bracket. + period: 2025 + input: + people: + person1: + age: 65 + rent: 9_600 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 48_110 + households: + household: + members: [person1] + state_code: PA + output: + pa_property_tax_or_rent_rebate: 380 + +- name: Case 4, rebate is limited by rent and property tax paid. + period: 2025 + input: + people: + person1: + age: 65 + real_estate_taxes: 300 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 8_000 + households: + household: + members: [person1] + state_code: PA + output: + pa_property_tax_or_rent_rebate: 300 diff --git a/policyengine_us/tests/policy/baseline/gov/states/pa/tax/property/property_tax_or_rent_rebate/pa_property_tax_or_rent_rebate_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/pa/tax/property/property_tax_or_rent_rebate/pa_property_tax_or_rent_rebate_eligible.yaml new file mode 100644 index 00000000000..5a29ace8fda --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/pa/tax/property/property_tax_or_rent_rebate/pa_property_tax_or_rent_rebate_eligible.yaml @@ -0,0 +1,90 @@ +- name: Case 1, senior homeowner under the income limit is eligible. + period: 2025 + input: + people: + person1: + age: 65 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 48_110 + households: + household: + members: [person1] + state_code: PA + output: + pa_property_tax_or_rent_rebate_eligible: true + +- name: Case 2, surviving spouse age 50 is eligible. + period: 2025 + input: + people: + person1: + age: 50 + rent: 9_600 + tax_units: + tax_unit: + members: [person1] + filing_status: SURVIVING_SPOUSE + adjusted_gross_income: 30_000 + households: + household: + members: [person1] + state_code: PA + output: + pa_property_tax_or_rent_rebate_eligible: true + +- name: Case 3, disabled adult is eligible. + period: 2025 + input: + people: + person1: + age: 18 + is_disabled: true + rent: 9_600 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 30_000 + households: + household: + members: [person1] + state_code: PA + output: + pa_property_tax_or_rent_rebate_eligible: true + +- name: Case 4, income above the limit is ineligible. + period: 2025 + input: + people: + person1: + age: 65 + real_estate_taxes: 2_000 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 48_111 + households: + household: + members: [person1] + state_code: PA + output: + pa_property_tax_or_rent_rebate_eligible: false + +- name: Case 5, filer without rent or property tax is ineligible. + period: 2025 + input: + people: + person1: + age: 65 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 30_000 + households: + household: + members: [person1] + state_code: PA + output: + pa_property_tax_or_rent_rebate_eligible: false diff --git a/policyengine_us/variables/gov/states/pa/tax/property/property_tax_or_rent_rebate/pa_property_tax_or_rent_rebate.py b/policyengine_us/variables/gov/states/pa/tax/property/property_tax_or_rent_rebate/pa_property_tax_or_rent_rebate.py new file mode 100644 index 00000000000..8c9340fad16 --- /dev/null +++ b/policyengine_us/variables/gov/states/pa/tax/property/property_tax_or_rent_rebate/pa_property_tax_or_rent_rebate.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class pa_property_tax_or_rent_rebate(Variable): + value_type = float + entity = TaxUnit + label = "Pennsylvania Property Tax/Rent Rebate" + unit = USD + definition_period = YEAR + reference = "https://www.pa.gov/agencies/revenue/ptrr" + defined_for = "pa_property_tax_or_rent_rebate_eligible" + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.pa.tax.property.property_tax_or_rent_rebate + income = tax_unit("adjusted_gross_income", period) + rent_and_property_tax = add(tax_unit, period, ["rent", "real_estate_taxes"]) + return min_(p.amount.calc(income), rent_and_property_tax) diff --git a/policyengine_us/variables/gov/states/pa/tax/property/property_tax_or_rent_rebate/pa_property_tax_or_rent_rebate_eligible.py b/policyengine_us/variables/gov/states/pa/tax/property/property_tax_or_rent_rebate/pa_property_tax_or_rent_rebate_eligible.py new file mode 100644 index 00000000000..0f14f9fde2b --- /dev/null +++ b/policyengine_us/variables/gov/states/pa/tax/property/property_tax_or_rent_rebate/pa_property_tax_or_rent_rebate_eligible.py @@ -0,0 +1,33 @@ +from policyengine_us.model_api import * + + +class pa_property_tax_or_rent_rebate_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Eligible for the Pennsylvania Property Tax/Rent Rebate" + definition_period = YEAR + reference = "https://www.pa.gov/agencies/revenue/ptrr" + defined_for = StateCode.PA + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.pa.tax.property.property_tax_or_rent_rebate + 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_eligible = tax_unit.any((age >= p.age_threshold) & head_or_spouse) + widow_eligible = ( + filing_status == filing_status.possible_values.SURVIVING_SPOUSE + ) & tax_unit.any( + (age >= p.widow_age_threshold) & head_or_spouse, + ) + disabled_eligible = tax_unit.any( + (age >= p.disability_age_threshold) & is_disabled & head_or_spouse, + ) + + return ( + (age_eligible | widow_eligible | disabled_eligible) + & (tax_unit("adjusted_gross_income", period) <= p.income_limit) + & (add(tax_unit, period, ["rent", "real_estate_taxes"]) > 0) + ) From c4bffaf4a493614f75b56794c8b721557d9e7bfd Mon Sep 17 00:00:00 2001 From: Daphne Hansell <128793799+daphnehanse11@users.noreply.github.com> Date: Thu, 14 May 2026 16:53:59 -0400 Subject: [PATCH 2/2] Rename changelog fragment for PR 8315 --- changelog.d/{8181.added.md => 8315.added.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename changelog.d/{8181.added.md => 8315.added.md} (100%) diff --git a/changelog.d/8181.added.md b/changelog.d/8315.added.md similarity index 100% rename from changelog.d/8181.added.md rename to changelog.d/8315.added.md