diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb2d..0b98827ecf3 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,4 @@ +- bump: patch + changes: + fixed: + - Arizona property tax credit now uses correct income definition per ARS 43-1072 and ITR 12-1, excluding only Social Security (not pensions, capital gains, or exemptions) diff --git a/policyengine_us/parameters/gov/states/az/tax/income/credits/property_tax/income_sources.yaml b/policyengine_us/parameters/gov/states/az/tax/income/credits/property_tax/income_sources.yaml index 6de3d730395..76b29218242 100644 --- a/policyengine_us/parameters/gov/states/az/tax/income/credits/property_tax/income_sources.yaml +++ b/policyengine_us/parameters/gov/states/az/tax/income/credits/property_tax/income_sources.yaml @@ -1,22 +1,30 @@ -description: Arizona accounts for the following income sources for the property tax credit. +description: Arizona accounts for the following income sources when computing household income for the property tax credit. values: 2021-01-01: + # Item (7): Capital gains - excluded gains not in Federal AGI - capital_gains_excluded_from_taxable_income + # Item (2): All interest income including tax-exempt - tax_exempt_interest_income - - public_pension_income - - az_agi + # Item (9): Pension income - tax-exempt portions not in Federal AGI + # (taxable pension is already in Federal AGI via az_property_tax_credit_agi) + - tax_exempt_public_pension_income + - tax_exempt_private_pension_income + # Federal AGI minus Social Security (per ARS 43-1072(I) exclusion) + - az_property_tax_credit_agi metadata: unit: list period: year label: Arizona property tax credit income sources reference: - - title: 43-1072. Earned credit for property taxes; residents sixty-five years of age or older(H-6) - href: https://www.azleg.gov/viewdocument/?docName=https://www.azleg.gov/ars/43/01072.htm + - title: ARS 43-1072. Property tax credit - Income definition + href: https://www.azleg.gov/ars/43/01072.htm + - title: ITR 12-1. Income Tax Ruling - Property Tax Credit Household Income + href: https://azdor.gov/sites/default/files/2023-03/RULINGS_INDV_2012_itr12-1.pdf - title: 2024 Property Tax Refund (Credit) Claim Form 140PTC - href: https://azdor.gov/forms/tax-credits-forms/property-tax-refund-credit-claim-form-fillable#page=2 + href: https://azdor.gov/forms/tax-credits-forms/property-tax-refund-credit-claim-form-fillable - title: 2023 Property Tax Refund (Credit) Claim Form 140PTC - href: https://azdor.gov/forms/tax-credits-forms/property-tax-refund-credit-claim-form-fillable#page=2 + href: https://azdor.gov/forms/tax-credits-forms/property-tax-refund-credit-claim-form-fillable - title: 2022 Property Tax Refund (Credit) Claim Form 140PTC - href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140PTC.pdf#page=2 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140PTC.pdf - title: 2021 Property Tax Refund (Credit) Claim Form 140PTC - href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140PTC.pdf#page=2 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140PTC.pdf diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/tax/income/az_property_tax_credit_agi.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/tax/income/az_property_tax_credit_agi.yaml new file mode 100644 index 00000000000..5016feb4b85 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/tax/income/az_property_tax_credit_agi.yaml @@ -0,0 +1,58 @@ +# Per ITR 12-1, property tax credit AGI is Federal AGI minus Social Security. +# Unlike regular AZ income tax, it does NOT exclude pensions, capital gains, etc. + +- name: Basic wages and interest (no Social Security) + period: 2024 + input: + state_code: AZ + adjusted_gross_income: 3_766.08 + tax_unit_taxable_social_security: 0 + output: + az_property_tax_credit_agi: 3_766.08 + +- name: Social Security is excluded from property tax credit AGI + period: 2024 + input: + state_code: AZ + adjusted_gross_income: 20_000 + tax_unit_taxable_social_security: 8_500 + output: + # $20,000 - $8,500 = $11,500 + az_property_tax_credit_agi: 11_500 + +- name: Pension income is NOT excluded (unlike regular AZ income tax) + period: 2024 + input: + state_code: AZ + adjusted_gross_income: 15_000 + tax_unit_taxable_social_security: 0 + output: + az_property_tax_credit_agi: 15_000 + +- name: Capital gains are NOT excluded (unlike regular AZ income tax) + period: 2024 + input: + state_code: AZ + adjusted_gross_income: 25_000 + tax_unit_taxable_social_security: 0 + output: + az_property_tax_credit_agi: 25_000 + +- name: Capped at zero when Social Security exceeds other income + period: 2024 + input: + state_code: AZ + adjusted_gross_income: 5_000 + tax_unit_taxable_social_security: 6_000 + output: + az_property_tax_credit_agi: 0 + +- name: Combined income types with Social Security exclusion + period: 2024 + input: + state_code: AZ + adjusted_gross_income: 22_250 + tax_unit_taxable_social_security: 4_250 + output: + # $22,250 - $4,250 = $18,000 + az_property_tax_credit_agi: 18_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/tax/income/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/tax/income/integration.yaml new file mode 100644 index 00000000000..514aed7417d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/tax/income/integration.yaml @@ -0,0 +1,28 @@ +# Integration tests for Arizona property tax credit income calculation +# Per ARS 43-1072 and ITR 12-1 + +- name: Property tax credit AGI with aged person (issue 6956) + period: 2024 + input: + people: + person1: + age: 75 + employment_income: 3_715.56 + taxable_interest_income: 50.52 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: AZ + output: + # Federal AGI = wages + interest = 3,715.56 + 50.52 = 3,766.08 + adjusted_gross_income: 3_766.08 + # AZ AGI subtracts aged exemption: 3,766.08 - 2,100 = 1,666.08 + az_agi: 1_666.08 + # Property tax credit AGI should NOT subtract exemptions or SS + # No SS, so equals Federal AGI + az_property_tax_credit_agi: 3_766.08 + # Income $3,766.08 > threshold $3,751 for single, so not eligible + az_property_tax_credit: 0 diff --git a/policyengine_us/variables/gov/states/az/tax/income/credits/property_tax_credit/az_property_tax_credit_agi.py b/policyengine_us/variables/gov/states/az/tax/income/credits/property_tax_credit/az_property_tax_credit_agi.py new file mode 100644 index 00000000000..7222e4d7c3c --- /dev/null +++ b/policyengine_us/variables/gov/states/az/tax/income/credits/property_tax_credit/az_property_tax_credit_agi.py @@ -0,0 +1,53 @@ +from policyengine_us.model_api import * + + +class az_property_tax_credit_agi(Variable): + value_type = float + entity = TaxUnit + label = "Arizona adjusted gross income for property tax credit" + unit = USD + definition_period = YEAR + documentation = ( + "Adjusted gross income as defined for Arizona property tax credit purposes. " + "Per ARS 43-1072(H)(6) and ITR 12-1, this starts with Federal AGI and only " + "excludes items specifically listed in ARS 43-1072(I): Social Security, " + "railroad retirement, workers compensation, Arizona unemployment, veterans " + "disability pensions, welfare, and gifts. Unlike regular Arizona income tax, " + "this does NOT exclude pension income, capital gains, or Arizona exemptions." + ) + reference = [ + "https://www.azleg.gov/ars/43/01072.htm", # ARS 43-1072 + "https://azdor.gov/sites/default/files/2023-03/RULINGS_INDV_2012_itr12-1.pdf", # ITR 12-1 + ] + defined_for = StateCode.AZ + + def formula(tax_unit, period, parameters): + # Start with Federal AGI + # Per ITR 12-1, income includes wages, interest, business/farm income, + # rent/royalty, S-corp/partnership income, alimony, capital gains, + # pension/annuity income, and other non-excluded income. + federal_agi = tax_unit("adjusted_gross_income", period) + + # Per ARS 43-1072(I) and ITR 12-1 "Items Excluded from Income", + # we ONLY exclude Social Security benefits (and other items like + # railroad retirement, workers comp, AZ unemployment, veterans + # disability pensions, welfare, and gifts - but these are typically + # not in Federal AGI anyway). + # + # Federal AGI only includes the TAXABLE portion of Social Security, + # but for property tax credit, ALL Social Security should be excluded. + # So we subtract the taxable portion that's in Federal AGI. + taxable_social_security = tax_unit( + "tax_unit_taxable_social_security", period + ) + + # NOTE: We do NOT subtract Arizona's regular subtractions here because: + # - Pension exclusions (az_public_pension_exclusion, + # az_military_retirement_subtraction) should be INCLUDED per + # ITR 12-1 item (9) + # - Capital gains subtraction (az_long_term_capital_gains_subtraction) + # should be INCLUDED per ITR 12-1 item (7) + # - US Government interest should be INCLUDED per ITR 12-1 item (2) + # - Arizona exemptions (aged, blind) should NOT be subtracted + + return max_(0, federal_agi - taxable_social_security) diff --git a/uv.lock b/uv.lock index 55718028732..34952602a88 100644 --- a/uv.lock +++ b/uv.lock @@ -1877,13 +1877,25 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl", hash = "sha256:6c3d97604e4c5ce9f714898e05401a0445a641cfa276432b0a648c80856f6a3f", size = 8046, upload-time = "2025-07-18T01:05:03.843Z" }, ] +[[package]] +name = "roman-numerals" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/20/a6b20239f54814de5c34bf3f504e553b11780c2aad3677ad2daf989f1fb3/roman_numerals-4.0.0.tar.gz", hash = "sha256:231287018a8788bf8c0718482a08c15b90458523ea1d840a18a791a86d4583b3", size = 9027, upload-time = "2025-12-16T01:53:36.309Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/9d/ad950fd3b65cf0974c633862320829f3d461aef125b981504277c8409a93/roman_numerals-4.0.0-py3-none-any.whl", hash = "sha256:4131feb23ba1a542494873e4cee7844ec8d226a750134efc65ceb20939ed33c9", size = 7668, upload-time = "2025-12-16T01:53:34.922Z" }, +] + [[package]] name = "roman-numerals-py" -version = "3.1.0" +version = "4.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/76/48fd56d17c5bdbdf65609abbc67288728a98ed4c02919428d4f52d23b24b/roman_numerals_py-3.1.0.tar.gz", hash = "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d", size = 9017, upload-time = "2025-02-22T07:34:54.333Z" } +dependencies = [ + { name = "roman-numerals", marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7e/02/6cb667fc1872c5fe814971be2973317f0747d86f1c0aac37d0e1a1df1ecc/roman_numerals_py-4.0.0.tar.gz", hash = "sha256:f7fa8dff5b7b7251d3a7586b97c57a0698e2e28898fa42c23bcc0cf51b02aee9", size = 1119, upload-time = "2025-12-16T01:53:43.097Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl", hash = "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c", size = 7742, upload-time = "2025-02-22T07:34:52.422Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b7/c0aa3b0154e022faa8e8b4eadda0c49f53b09b6b8d55ed3b7cd311abfd92/roman_numerals_py-4.0.0-py3-none-any.whl", hash = "sha256:dfcecf6e0cddbf2ee1112e7e2ebf58ba771984f075cb57a30e1811cee4f06332", size = 1244, upload-time = "2025-12-16T01:53:42.369Z" }, ] [[package]]