From 559e9946150f054bf7af181f71a316bab6bb5ff1 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 3 Oct 2026 16:40:21 -0400 Subject: [PATCH] Fix Arizona property tax credit Schedule 2 thresholds ARS 43-1072(B)(2) and Form 140PTC Schedule 2 (2021-2025) give the bands for a claimant living with others as $0-2,500 -> $502, 2,501-2,650 -> $479, ..., 5,351-5,500 -> $56, 5,501 and up -> $0. The single_amount scale stored each band's lower bound one dollar low (2,500, 2,650, ..., 5,500), so incomes of exactly 2,500, 2,650, ..., 5,500 got the next band's amount and 5,500 got nothing. Each threshold after zero is now one dollar higher, as Schedule 1 already is. Both schedule files document how cents between whole-dollar bands are treated (the lower band, matching the (A)(3) "less than" limits), cite each year's form PDF directly, and Schedule 1's 2022 reference no longer points at the 2021 form. Tests: YAML cases at every band edge of both schedules, the (A)(3) limits, cents between bands and the household path; a differential test of every whole-dollar income and of cents around every edge against a transcription of the statute, 2021-2026, through the scales and a vectorised simulation; monotonicity and bounds invariants. The existing case at $5,500 expected $0 and now expects $56. Co-Authored-By: Claude Opus 5.5 --- .../fix-az-ptc-schedule-2-thresholds.fixed.md | 1 + .../property_tax/amount/cohabitating.yaml | 70 +- .../property_tax/amount/living_alone.yaml | 30 +- .../credits/az_property_tax_credit.yaml | 5 +- .../az_property_tax_credit_schedules.yaml | 1722 +++++++++++++++++ .../test_az_property_tax_credit_schedules.py | 237 +++ 6 files changed, 2026 insertions(+), 39 deletions(-) create mode 100644 changelog.d/fix-az-ptc-schedule-2-thresholds.fixed.md create mode 100644 policyengine_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_property_tax_credit_schedules.yaml create mode 100644 policyengine_us/tests/test_az_property_tax_credit_schedules.py diff --git a/changelog.d/fix-az-ptc-schedule-2-thresholds.fixed.md b/changelog.d/fix-az-ptc-schedule-2-thresholds.fixed.md new file mode 100644 index 00000000000..98e1d880137 --- /dev/null +++ b/changelog.d/fix-az-ptc-schedule-2-thresholds.fixed.md @@ -0,0 +1 @@ +Fix the Arizona property tax credit Schedule 2 thresholds, which were each one dollar low: a claimant living with others with household income of exactly $2,500, $2,650, ..., $5,500 got the next band's amount ($5,500 got none) instead of the ARS 43-1072(B)(2) amount. diff --git a/policyengine_us/parameters/gov/states/az/tax/income/credits/property_tax/amount/cohabitating.yaml b/policyengine_us/parameters/gov/states/az/tax/income/credits/property_tax/amount/cohabitating.yaml index 44d30a6a5f6..29dc77cdb9b 100644 --- a/policyengine_us/parameters/gov/states/az/tax/income/credits/property_tax/amount/cohabitating.yaml +++ b/policyengine_us/parameters/gov/states/az/tax/income/credits/property_tax/amount/cohabitating.yaml @@ -1,107 +1,119 @@ description: Arizona provides this property tax credit amount for filers cohabitating with other people, based on income. metadata: reference: - - 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 - - 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 - - title: 2022 Property Tax Refund (Credit) Claim Form 140PTC + - title: 2025 Property Tax Refund (Credit) Claim Form 140PTC, page 2, Schedule 2 + href: https://azdor.gov/sites/default/files/document/FORMS_INDIVIDUAL_2025_140PTC_f.pdf#page=2 + - title: 2024 Property Tax Refund (Credit) Claim Form 140PTC, page 2, Schedule 2 + href: https://azdor.gov/sites/default/files/document/FORMS_INDIVIDUAL_2024_140PTC_f.pdf#page=2 + - title: 2023 Property Tax Refund (Credit) Claim Form 140PTC, page 2, Schedule 2 + href: https://azdor.gov/sites/default/files/2023-12/FORMS_INDIVIDUAL_2023_140PTC_f.pdf#page=2 + - title: 2022 Property Tax Refund (Credit) Claim Form 140PTC, page 2, Schedule 2 href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140PTC.pdf#page=2 - - title: 2021 Property Tax Refund (Credit) Claim Form 140PTC + - title: 2021 Property Tax Refund (Credit) Claim Form 140PTC, page 2, Schedule 2 href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140PTC.pdf#page=2 - - title: 43-1072. Earned credit for property taxes; residents sixty-five years of age or older - (B) (2) + - title: 43-1072. Earned credit for property taxes; residents sixty-five years of age or older - (A)(3)(b), (B)(2) href: https://www.azleg.gov/viewdocument/?docName=https://www.azleg.gov/ars/43/01072.htm threshold_unit: currency-USD rate_unit: currency-USD type: single_amount period: year - label: Arizona property tax credit cohabitating amount + label: Arizona property tax credit cohabitating amount +# Each threshold is the lower bound of a band in ARS 43-1072(B)(2), and a +# band runs up to, but not including, the next band's lower bound. The +# statute lists whole-dollar bands ($0-2,500, 2,501-2,650, ...) and sets +# the income limit in (A)(3)(b) as "less than" $5,501, one dollar above the +# last band's upper bound, so the last band covers every income below $5,501. +# Reading every band the same way puts cents between two whole-dollar bands +# in the lower one: $2,500.50 gets the $0-2,500 amount, as if the cents +# were dropped. Form 140PTC line 10 takes whole dollars, and the 2025 Form +# 140 instructions (page 4) round to the nearest dollar, which would instead +# move 50 cents or more into the next band. brackets: - threshold: 2021-01-01: 0 amount: 2021-01-01: 502 - threshold: - 2021-01-01: 2_500 + 2021-01-01: 2_501 amount: 2021-01-01: 479 - threshold: - 2021-01-01: 2_650 + 2021-01-01: 2_651 amount: 2021-01-01: 457 - threshold: - 2021-01-01: 2_800 + 2021-01-01: 2_801 amount: 2021-01-01: 435 - threshold: - 2021-01-01: 2_950 + 2021-01-01: 2_951 amount: 2021-01-01: 412 - threshold: - 2021-01-01: 3_100 + 2021-01-01: 3_101 amount: 2021-01-01: 390 - threshold: - 2021-01-01: 3_250 + 2021-01-01: 3_251 amount: 2021-01-01: 368 - threshold: - 2021-01-01: 3_400 + 2021-01-01: 3_401 amount: 2021-01-01: 345 - threshold: - 2021-01-01: 3_550 + 2021-01-01: 3_551 amount: 2021-01-01: 323 - threshold: - 2021-01-01: 3_700 + 2021-01-01: 3_701 amount: 2021-01-01: 301 - threshold: - 2021-01-01: 3_850 + 2021-01-01: 3_851 amount: 2021-01-01: 279 - threshold: - 2021-01-01: 4_000 + 2021-01-01: 4_001 amount: 2021-01-01: 256 - threshold: - 2021-01-01: 4_150 + 2021-01-01: 4_151 amount: 2021-01-01: 234 - threshold: - 2021-01-01: 4_300 + 2021-01-01: 4_301 amount: 2021-01-01: 212 - threshold: - 2021-01-01: 4_450 + 2021-01-01: 4_451 amount: 2021-01-01: 189 - threshold: - 2021-01-01: 4_600 + 2021-01-01: 4_601 amount: 2021-01-01: 167 - threshold: - 2021-01-01: 4_750 + 2021-01-01: 4_751 amount: 2021-01-01: 145 - threshold: - 2021-01-01: 4_900 + 2021-01-01: 4_901 amount: 2021-01-01: 123 - threshold: - 2021-01-01: 5_050 + 2021-01-01: 5_051 amount: 2021-01-01: 100 - threshold: - 2021-01-01: 5_200 + 2021-01-01: 5_201 amount: 2021-01-01: 78 - threshold: - 2021-01-01: 5_350 + 2021-01-01: 5_351 amount: 2021-01-01: 56 - threshold: - 2021-01-01: 5_500 + 2021-01-01: 5_501 amount: 2021-01-01: 0 diff --git a/policyengine_us/parameters/gov/states/az/tax/income/credits/property_tax/amount/living_alone.yaml b/policyengine_us/parameters/gov/states/az/tax/income/credits/property_tax/amount/living_alone.yaml index 0020ff70632..4147a0a11ac 100644 --- a/policyengine_us/parameters/gov/states/az/tax/income/credits/property_tax/amount/living_alone.yaml +++ b/policyengine_us/parameters/gov/states/az/tax/income/credits/property_tax/amount/living_alone.yaml @@ -1,21 +1,33 @@ description: Arizona provides this property tax credit amount for filers living alone, based on income. metadata: reference: - - 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 - - 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 - - title: 2022 Property Tax Refund (Credit) Claim Form 140PTC + - title: 2025 Property Tax Refund (Credit) Claim Form 140PTC, page 2, Schedule 1 + href: https://azdor.gov/sites/default/files/document/FORMS_INDIVIDUAL_2025_140PTC_f.pdf#page=2 + - title: 2024 Property Tax Refund (Credit) Claim Form 140PTC, page 2, Schedule 1 + href: https://azdor.gov/sites/default/files/document/FORMS_INDIVIDUAL_2024_140PTC_f.pdf#page=2 + - title: 2023 Property Tax Refund (Credit) Claim Form 140PTC, page 2, Schedule 1 + href: https://azdor.gov/sites/default/files/2023-12/FORMS_INDIVIDUAL_2023_140PTC_f.pdf#page=2 + - title: 2022 Property Tax Refund (Credit) Claim Form 140PTC, page 2, Schedule 1 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140PTC.pdf#page=2 + - title: 2021 Property Tax Refund (Credit) Claim Form 140PTC, page 2, Schedule 1 href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140PTC.pdf#page=2 - - 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 - - title: 43-1072. Earned credit for property taxes; residents sixty-five years of age or older - (B) (1) + - title: 43-1072. Earned credit for property taxes; residents sixty-five years of age or older - (A)(3)(a), (B)(1) href: https://www.azleg.gov/viewdocument/?docName=https://www.azleg.gov/ars/43/01072.htm threshold_unit: currency-USD rate_unit: currency-USD type: single_amount period: year - label: Arizona property tax credit living alone amount + label: Arizona property tax credit living alone amount +# Each threshold is the lower bound of a band in ARS 43-1072(B)(1), and a +# band runs up to, but not including, the next band's lower bound. The +# statute lists whole-dollar bands ($0-1,750, 1,751-1,850, ...) and sets +# the income limit in (A)(3)(a) as "less than" $3,751, one dollar above the +# last band's upper bound, so the last band covers every income below $3,751. +# Reading every band the same way puts cents between two whole-dollar bands +# in the lower one: $1,750.50 gets the $0-1,750 amount, as if the cents +# were dropped. Form 140PTC line 10 takes whole dollars, and the 2025 Form +# 140 instructions (page 4) round to the nearest dollar, which would instead +# move 50 cents or more into the next band. brackets: - threshold: 2021-01-01: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_property_tax_credit.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_property_tax_credit.yaml index 2f4afe51114..aa50bb2e5e7 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_property_tax_credit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_property_tax_credit.yaml @@ -89,7 +89,10 @@ real_estate_taxes: 100 rent: 1_500 output: - az_property_tax_credit: 0 + # ARS 43-1072(B)(2): $5,500 is in the $5,351-5,500 band ($56), below the + # (A)(3)(b) limit of "less than" $5,501. Taxes paid: 100 + 0.15 * 1,500 = + # 325, so the credit is the $56 table amount. + az_property_tax_credit: 56 - name: tax unit head does not meet the criteria period: 2023 diff --git a/policyengine_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_property_tax_credit_schedules.yaml b/policyengine_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_property_tax_credit_schedules.yaml new file mode 100644 index 00000000000..bfa052616af --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_property_tax_credit_schedules.yaml @@ -0,0 +1,1722 @@ +# ARS 43-1072(B) Schedules 1 and 2 (Form 140PTC page 2, identical in +# 2021-2025): every band edge on both sides, the (A)(3) income limits +# ("less than" $3,751 living alone and $5,501 living with others), and +# cents between whole-dollar bands, which stay in the lower band (see the +# note in each schedule's parameter file). Property taxes paid ($1,000) exceed +# every table amount, so the credit equals the table amount. + +# Schedule 1: ARS 43-1072(B)(1), living alone. + +- name: Schedule 1 (living alone), income of $0 gets $502 + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 0 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 502 + +- name: Schedule 1 (living alone), income of $1,750 is the upper edge of the $0-1,750 band ($502) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 1_750 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 502 + +- name: Schedule 1 (living alone), income of $1,750.50 is between bands and stays in $0-1,750 ($502) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 1_750.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 502 + +- name: Schedule 1 (living alone), income of $1,751 is the lower edge of the $1,751-1,850 band ($479) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 1_751 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 479 + +- name: Schedule 1 (living alone), income of $1,850 is the upper edge of the $1,751-1,850 band ($479) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 1_850 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 479 + +- name: Schedule 1 (living alone), income of $1,850.50 is between bands and stays in $1,751-1,850 ($479) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 1_850.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 479 + +- name: Schedule 1 (living alone), income of $1,851 is the lower edge of the $1,851-1,950 band ($457) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 1_851 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 457 + +- name: Schedule 1 (living alone), income of $1,950 is the upper edge of the $1,851-1,950 band ($457) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 1_950 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 457 + +- name: Schedule 1 (living alone), income of $1,950.50 is between bands and stays in $1,851-1,950 ($457) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 1_950.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 457 + +- name: Schedule 1 (living alone), income of $1,951 is the lower edge of the $1,951-2,050 band ($435) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 1_951 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 435 + +- name: Schedule 1 (living alone), income of $2,050 is the upper edge of the $1,951-2,050 band ($435) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_050 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 435 + +- name: Schedule 1 (living alone), income of $2,050.50 is between bands and stays in $1,951-2,050 ($435) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_050.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 435 + +- name: Schedule 1 (living alone), income of $2,051 is the lower edge of the $2,051-2,150 band ($412) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_051 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 412 + +- name: Schedule 1 (living alone), income of $2,150 is the upper edge of the $2,051-2,150 band ($412) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_150 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 412 + +- name: Schedule 1 (living alone), income of $2,150.50 is between bands and stays in $2,051-2,150 ($412) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_150.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 412 + +- name: Schedule 1 (living alone), income of $2,151 is the lower edge of the $2,151-2,250 band ($390) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_151 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 390 + +- name: Schedule 1 (living alone), income of $2,250 is the upper edge of the $2,151-2,250 band ($390) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_250 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 390 + +- name: Schedule 1 (living alone), income of $2,250.50 is between bands and stays in $2,151-2,250 ($390) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_250.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 390 + +- name: Schedule 1 (living alone), income of $2,251 is the lower edge of the $2,251-2,350 band ($368) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_251 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 368 + +- name: Schedule 1 (living alone), income of $2,350 is the upper edge of the $2,251-2,350 band ($368) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_350 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 368 + +- name: Schedule 1 (living alone), income of $2,350.50 is between bands and stays in $2,251-2,350 ($368) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_350.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 368 + +- name: Schedule 1 (living alone), income of $2,351 is the lower edge of the $2,351-2,450 band ($345) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_351 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 345 + +- name: Schedule 1 (living alone), income of $2,450 is the upper edge of the $2,351-2,450 band ($345) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_450 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 345 + +- name: Schedule 1 (living alone), income of $2,450.50 is between bands and stays in $2,351-2,450 ($345) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_450.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 345 + +- name: Schedule 1 (living alone), income of $2,451 is the lower edge of the $2,451-2,550 band ($323) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_451 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 323 + +- name: Schedule 1 (living alone), income of $2,550 is the upper edge of the $2,451-2,550 band ($323) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_550 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 323 + +- name: Schedule 1 (living alone), income of $2,550.50 is between bands and stays in $2,451-2,550 ($323) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_550.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 323 + +- name: Schedule 1 (living alone), income of $2,551 is the lower edge of the $2,551-2,650 band ($301) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_551 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 301 + +- name: Schedule 1 (living alone), income of $2,650 is the upper edge of the $2,551-2,650 band ($301) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_650 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 301 + +- name: Schedule 1 (living alone), income of $2,650.50 is between bands and stays in $2,551-2,650 ($301) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_650.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 301 + +- name: Schedule 1 (living alone), income of $2,651 is the lower edge of the $2,651-2,750 band ($279) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_651 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 279 + +- name: Schedule 1 (living alone), income of $2,750 is the upper edge of the $2,651-2,750 band ($279) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_750 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 279 + +- name: Schedule 1 (living alone), income of $2,750.50 is between bands and stays in $2,651-2,750 ($279) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_750.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 279 + +- name: Schedule 1 (living alone), income of $2,751 is the lower edge of the $2,751-2,850 band ($256) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_751 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 256 + +- name: Schedule 1 (living alone), income of $2,850 is the upper edge of the $2,751-2,850 band ($256) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_850 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 256 + +- name: Schedule 1 (living alone), income of $2,850.50 is between bands and stays in $2,751-2,850 ($256) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_850.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 256 + +- name: Schedule 1 (living alone), income of $2,851 is the lower edge of the $2,851-2,950 band ($234) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_851 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 234 + +- name: Schedule 1 (living alone), income of $2,950 is the upper edge of the $2,851-2,950 band ($234) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_950 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 234 + +- name: Schedule 1 (living alone), income of $2,950.50 is between bands and stays in $2,851-2,950 ($234) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_950.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 234 + +- name: Schedule 1 (living alone), income of $2,951 is the lower edge of the $2,951-3,050 band ($212) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_951 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 212 + +- name: Schedule 1 (living alone), income of $3,050 is the upper edge of the $2,951-3,050 band ($212) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_050 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 212 + +- name: Schedule 1 (living alone), income of $3,050.50 is between bands and stays in $2,951-3,050 ($212) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_050.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 212 + +- name: Schedule 1 (living alone), income of $3,051 is the lower edge of the $3,051-3,150 band ($189) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_051 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 189 + +- name: Schedule 1 (living alone), income of $3,150 is the upper edge of the $3,051-3,150 band ($189) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_150 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 189 + +- name: Schedule 1 (living alone), income of $3,150.50 is between bands and stays in $3,051-3,150 ($189) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_150.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 189 + +- name: Schedule 1 (living alone), income of $3,151 is the lower edge of the $3,151-3,250 band ($167) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_151 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 167 + +- name: Schedule 1 (living alone), income of $3,250 is the upper edge of the $3,151-3,250 band ($167) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_250 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 167 + +- name: Schedule 1 (living alone), income of $3,250.50 is between bands and stays in $3,151-3,250 ($167) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_250.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 167 + +- name: Schedule 1 (living alone), income of $3,251 is the lower edge of the $3,251-3,350 band ($145) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_251 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 145 + +- name: Schedule 1 (living alone), income of $3,350 is the upper edge of the $3,251-3,350 band ($145) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_350 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 145 + +- name: Schedule 1 (living alone), income of $3,350.50 is between bands and stays in $3,251-3,350 ($145) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_350.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 145 + +- name: Schedule 1 (living alone), income of $3,351 is the lower edge of the $3,351-3,450 band ($123) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_351 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 123 + +- name: Schedule 1 (living alone), income of $3,450 is the upper edge of the $3,351-3,450 band ($123) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_450 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 123 + +- name: Schedule 1 (living alone), income of $3,450.50 is between bands and stays in $3,351-3,450 ($123) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_450.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 123 + +- name: Schedule 1 (living alone), income of $3,451 is the lower edge of the $3,451-3,550 band ($100) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_451 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 100 + +- name: Schedule 1 (living alone), income of $3,550 is the upper edge of the $3,451-3,550 band ($100) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_550 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 100 + +- name: Schedule 1 (living alone), income of $3,550.50 is between bands and stays in $3,451-3,550 ($100) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_550.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 100 + +- name: Schedule 1 (living alone), income of $3,551 is the lower edge of the $3,551-3,650 band ($78) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_551 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 78 + +- name: Schedule 1 (living alone), income of $3,650 is the upper edge of the $3,551-3,650 band ($78) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_650 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 78 + +- name: Schedule 1 (living alone), income of $3,650.50 is between bands and stays in $3,551-3,650 ($78) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_650.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 78 + +- name: Schedule 1 (living alone), income of $3,651 is the lower edge of the $3,651-3,750 band ($56) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_651 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 56 + +- name: Schedule 1 (living alone), income of $3,750 is the upper edge of the $3,651-3,750 band ($56) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_750 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 56 + +- name: Schedule 1 (living alone), income of $3,750.50 is between bands and stays in $3,651-3,750 ($56) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_750.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 56 + +- name: Schedule 1 (living alone), income of $3,750.99 is below the "less than $3,751" limit of (A)(3)(a) ($56) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_750.99 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 56 + +- name: Schedule 1 (living alone), income of $3,751 is not "less than $3,751" under (A)(3)(a) ($0) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_751 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 0 + +- name: Schedule 1 (living alone), income of $1,750 is the upper edge of the $0-1,750 band in 2021 ($502) + period: 2021 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 1_750 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 502 + +- name: Schedule 1 (living alone), income of $3,750 is the upper edge of the $3,651-3,750 band in 2021 ($56) + period: 2021 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_750 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 56 + +- name: Schedule 1 (living alone), income of $3,751 is at the limit in 2021 ($0) + period: 2021 + input: + state_code: AZ + cohabitating_spouses: false + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_751 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 0 + +# Schedule 2: ARS 43-1072(B)(2), living with others. + +- name: Schedule 2 (living with others), income of $0 gets $502 + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 0 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 502 + +- name: Schedule 2 (living with others), income of $2,500 is the upper edge of the $0-2,500 band ($502) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_500 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 502 + +- name: Schedule 2 (living with others), income of $2,500.50 is between bands and stays in $0-2,500 ($502) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_500.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 502 + +- name: Schedule 2 (living with others), income of $2,501 is the lower edge of the $2,501-2,650 band ($479) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_501 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 479 + +- name: Schedule 2 (living with others), income of $2,650 is the upper edge of the $2,501-2,650 band ($479) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_650 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 479 + +- name: Schedule 2 (living with others), income of $2,650.50 is between bands and stays in $2,501-2,650 ($479) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_650.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 479 + +- name: Schedule 2 (living with others), income of $2,651 is the lower edge of the $2,651-2,800 band ($457) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_651 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 457 + +- name: Schedule 2 (living with others), income of $2,800 is the upper edge of the $2,651-2,800 band ($457) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_800 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 457 + +- name: Schedule 2 (living with others), income of $2,800.50 is between bands and stays in $2,651-2,800 ($457) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_800.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 457 + +- name: Schedule 2 (living with others), income of $2,801 is the lower edge of the $2,801-2,950 band ($435) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_801 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 435 + +- name: Schedule 2 (living with others), income of $2,950 is the upper edge of the $2,801-2,950 band ($435) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_950 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 435 + +- name: Schedule 2 (living with others), income of $2,950.50 is between bands and stays in $2,801-2,950 ($435) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_950.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 435 + +- name: Schedule 2 (living with others), income of $2,951 is the lower edge of the $2,951-3,100 band ($412) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_951 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 412 + +- name: Schedule 2 (living with others), income of $3,100 is the upper edge of the $2,951-3,100 band ($412) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_100 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 412 + +- name: Schedule 2 (living with others), income of $3,100.50 is between bands and stays in $2,951-3,100 ($412) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_100.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 412 + +- name: Schedule 2 (living with others), income of $3,101 is the lower edge of the $3,101-3,250 band ($390) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_101 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 390 + +- name: Schedule 2 (living with others), income of $3,250 is the upper edge of the $3,101-3,250 band ($390) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_250 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 390 + +- name: Schedule 2 (living with others), income of $3,250.50 is between bands and stays in $3,101-3,250 ($390) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_250.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 390 + +- name: Schedule 2 (living with others), income of $3,251 is the lower edge of the $3,251-3,400 band ($368) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_251 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 368 + +- name: Schedule 2 (living with others), income of $3,400 is the upper edge of the $3,251-3,400 band ($368) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_400 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 368 + +- name: Schedule 2 (living with others), income of $3,400.50 is between bands and stays in $3,251-3,400 ($368) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_400.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 368 + +- name: Schedule 2 (living with others), income of $3,401 is the lower edge of the $3,401-3,550 band ($345) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_401 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 345 + +- name: Schedule 2 (living with others), income of $3,550 is the upper edge of the $3,401-3,550 band ($345) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_550 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 345 + +- name: Schedule 2 (living with others), income of $3,550.50 is between bands and stays in $3,401-3,550 ($345) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_550.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 345 + +- name: Schedule 2 (living with others), income of $3,551 is the lower edge of the $3,551-3,700 band ($323) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_551 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 323 + +- name: Schedule 2 (living with others), income of $3,700 is the upper edge of the $3,551-3,700 band ($323) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_700 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 323 + +- name: Schedule 2 (living with others), income of $3,700.50 is between bands and stays in $3,551-3,700 ($323) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_700.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 323 + +- name: Schedule 2 (living with others), income of $3,701 is the lower edge of the $3,701-3,850 band ($301) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_701 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 301 + +- name: Schedule 2 (living with others), income of $3,850 is the upper edge of the $3,701-3,850 band ($301) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_850 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 301 + +- name: Schedule 2 (living with others), income of $3,850.50 is between bands and stays in $3,701-3,850 ($301) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_850.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 301 + +- name: Schedule 2 (living with others), income of $3,851 is the lower edge of the $3,851-4,000 band ($279) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 3_851 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 279 + +- name: Schedule 2 (living with others), income of $4,000 is the upper edge of the $3,851-4,000 band ($279) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 4_000 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 279 + +- name: Schedule 2 (living with others), income of $4,000.50 is between bands and stays in $3,851-4,000 ($279) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 4_000.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 279 + +- name: Schedule 2 (living with others), income of $4,001 is the lower edge of the $4,001-4,150 band ($256) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 4_001 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 256 + +- name: Schedule 2 (living with others), income of $4,150 is the upper edge of the $4,001-4,150 band ($256) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 4_150 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 256 + +- name: Schedule 2 (living with others), income of $4,150.50 is between bands and stays in $4,001-4,150 ($256) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 4_150.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 256 + +- name: Schedule 2 (living with others), income of $4,151 is the lower edge of the $4,151-4,300 band ($234) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 4_151 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 234 + +- name: Schedule 2 (living with others), income of $4,300 is the upper edge of the $4,151-4,300 band ($234) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 4_300 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 234 + +- name: Schedule 2 (living with others), income of $4,300.50 is between bands and stays in $4,151-4,300 ($234) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 4_300.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 234 + +- name: Schedule 2 (living with others), income of $4,301 is the lower edge of the $4,301-4,450 band ($212) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 4_301 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 212 + +- name: Schedule 2 (living with others), income of $4,450 is the upper edge of the $4,301-4,450 band ($212) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 4_450 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 212 + +- name: Schedule 2 (living with others), income of $4,450.50 is between bands and stays in $4,301-4,450 ($212) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 4_450.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 212 + +- name: Schedule 2 (living with others), income of $4,451 is the lower edge of the $4,451-4,600 band ($189) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 4_451 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 189 + +- name: Schedule 2 (living with others), income of $4,600 is the upper edge of the $4,451-4,600 band ($189) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 4_600 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 189 + +- name: Schedule 2 (living with others), income of $4,600.50 is between bands and stays in $4,451-4,600 ($189) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 4_600.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 189 + +- name: Schedule 2 (living with others), income of $4,601 is the lower edge of the $4,601-4,750 band ($167) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 4_601 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 167 + +- name: Schedule 2 (living with others), income of $4,750 is the upper edge of the $4,601-4,750 band ($167) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 4_750 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 167 + +- name: Schedule 2 (living with others), income of $4,750.50 is between bands and stays in $4,601-4,750 ($167) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 4_750.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 167 + +- name: Schedule 2 (living with others), income of $4,751 is the lower edge of the $4,751-4,900 band ($145) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 4_751 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 145 + +- name: Schedule 2 (living with others), income of $4,900 is the upper edge of the $4,751-4,900 band ($145) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 4_900 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 145 + +- name: Schedule 2 (living with others), income of $4,900.50 is between bands and stays in $4,751-4,900 ($145) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 4_900.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 145 + +- name: Schedule 2 (living with others), income of $4,901 is the lower edge of the $4,901-5,050 band ($123) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 4_901 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 123 + +- name: Schedule 2 (living with others), income of $5,050 is the upper edge of the $4,901-5,050 band ($123) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 5_050 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 123 + +- name: Schedule 2 (living with others), income of $5,050.50 is between bands and stays in $4,901-5,050 ($123) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 5_050.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 123 + +- name: Schedule 2 (living with others), income of $5,051 is the lower edge of the $5,051-5,200 band ($100) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 5_051 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 100 + +- name: Schedule 2 (living with others), income of $5,200 is the upper edge of the $5,051-5,200 band ($100) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 5_200 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 100 + +- name: Schedule 2 (living with others), income of $5,200.50 is between bands and stays in $5,051-5,200 ($100) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 5_200.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 100 + +- name: Schedule 2 (living with others), income of $5,201 is the lower edge of the $5,201-5,350 band ($78) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 5_201 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 78 + +- name: Schedule 2 (living with others), income of $5,350 is the upper edge of the $5,201-5,350 band ($78) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 5_350 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 78 + +- name: Schedule 2 (living with others), income of $5,350.50 is between bands and stays in $5,201-5,350 ($78) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 5_350.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 78 + +- name: Schedule 2 (living with others), income of $5,351 is the lower edge of the $5,351-5,500 band ($56) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 5_351 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 56 + +- name: Schedule 2 (living with others), income of $5,500 is the upper edge of the $5,351-5,500 band ($56) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 5_500 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 56 + +- name: Schedule 2 (living with others), income of $5,500.50 is between bands and stays in $5,351-5,500 ($56) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 5_500.50 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 56 + +- name: Schedule 2 (living with others), income of $5,500.99 is below the "less than $5,501" limit of (A)(3)(b) ($56) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 5_500.99 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 56 + +- name: Schedule 2 (living with others), income of $5,501 is not "less than $5,501" under (A)(3)(b) ($0) + period: 2025 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 5_501 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 0 + +- name: Schedule 2 (living with others), income of $2,500 is the upper edge of the $0-2,500 band in 2021 ($502) + period: 2021 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 2_500 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 502 + +- name: Schedule 2 (living with others), income of $5,500 is the upper edge of the $5,351-5,500 band in 2021 ($56) + period: 2021 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 5_500 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 56 + +- name: Schedule 2 (living with others), income of $5,501 is at the limit in 2021 ($0) + period: 2021 + input: + state_code: AZ + cohabitating_spouses: true + az_property_tax_credit_eligible: true + az_property_tax_credit_income: 5_501 + real_estate_taxes: 1_000 + rent: 0 + output: + az_property_tax_credit: 0 + +# Household path: household income computed from its components and the +# schedule chosen from the household, not given as inputs. + +- name: Married couple with $2,500 of income gets the Schedule 2 $0-2,500 amount + period: 2025 + input: + people: + head: {age: 70, taxable_interest_income: 2_500, real_estate_taxes: 1_000} + spouse: {age: 70} + tax_units: {tax_unit: {members: [head, spouse]}} + households: {household: {members: [head, spouse], state_code: AZ}} + output: + az_property_tax_credit_income: 2_500 + az_property_tax_credit: 502 + +- name: Married couple with $2,501 of income gets the Schedule 2 $2,501-2,650 amount + period: 2025 + input: + people: + head: {age: 70, taxable_interest_income: 2_501, real_estate_taxes: 1_000} + spouse: {age: 70} + tax_units: {tax_unit: {members: [head, spouse]}} + households: {household: {members: [head, spouse], state_code: AZ}} + output: + az_property_tax_credit_income: 2_501 + az_property_tax_credit: 479 + +# ARS 43-1072(A)(3)(b): a single claimant living with an adult child uses +# Schedule 2, and $5,500 is less than $5,501. +- name: Single claimant living with an adult child at $5,500 gets the Schedule 2 $56 + period: 2025 + input: + people: + head: {age: 70, taxable_interest_income: 5_500, real_estate_taxes: 1_000} + child: {age: 40, is_tax_unit_dependent: false} + tax_units: + claimant: {members: [head]} + child_unit: {members: [child]} + households: {household: {members: [head, child], state_code: AZ}} + output: + az_property_tax_credit_income: [5_500, 0] + az_property_tax_credit: [56, 0] + +- name: Single claimant living with an adult child at $5,501 gets no credit + period: 2025 + input: + people: + head: {age: 70, taxable_interest_income: 5_501, real_estate_taxes: 1_000} + child: {age: 40, is_tax_unit_dependent: false} + tax_units: + claimant: {members: [head]} + child_unit: {members: [child]} + households: {household: {members: [head, child], state_code: AZ}} + output: + az_property_tax_credit_income: [5_501, 0] + az_property_tax_credit: [0, 0] + +# ARS 43-1072(A)(3)(a): living alone, $3,750 is less than $3,751. +- name: Single claimant living alone at $3,750 gets the Schedule 1 $56 + period: 2025 + input: + people: + head: {age: 70, taxable_interest_income: 3_750, real_estate_taxes: 1_000} + tax_units: {tax_unit: {members: [head]}} + households: {household: {members: [head], state_code: AZ}} + output: + az_property_tax_credit_income: 3_750 + az_property_tax_credit: 56 + +- name: Single claimant living alone at $3,751 gets no credit + period: 2025 + input: + people: + head: {age: 70, taxable_interest_income: 3_751, real_estate_taxes: 1_000} + tax_units: {tax_unit: {members: [head]}} + households: {household: {members: [head], state_code: AZ}} + output: + az_property_tax_credit_income: 3_751 + az_property_tax_credit: 0 diff --git a/policyengine_us/tests/test_az_property_tax_credit_schedules.py b/policyengine_us/tests/test_az_property_tax_credit_schedules.py new file mode 100644 index 00000000000..bab9cfed6cd --- /dev/null +++ b/policyengine_us/tests/test_az_property_tax_credit_schedules.py @@ -0,0 +1,237 @@ +"""Arizona property tax credit Schedules 1 and 2: differential and invariant tests. + +ARS 43-1072(B) gives the credit as a table of whole-dollar household income +bands: (B)(1) for a claimant who did not live with anyone ($0-1,750 -> $502, +1,751-1,850 -> $479, ..., 3,651-3,750 -> $56) and (B)(2) for one who lived with +a spouse or other persons ($0-2,500 -> $502, 2,501-2,650 -> $479, ..., +5,351-5,500 -> $56). (A)(3) limits the credit to income "less than" $3,751 +and $5,501. Form 140PTC page 2 prints the same tables in 2021-2025. The +parameter files store each band's lower bound as a single_amount threshold, so +a band runs up to, but not including, the next band's lower bound, and cents +between two whole-dollar bands stay in the lower band. + +Schedule 2's thresholds were once each one dollar low (2,500, 2,650, ..., +5,500), so incomes of exactly 2,500, 2,650, ..., 5,500 got the next band's +amount and 5,500 got nothing. + +Differential tests compare every whole-dollar income from $0 to $7,000, and +cents near every band edge, against an independent transcription of the +statute's tables, in every year from 2021 to 2026: + +- through the parameter scales, and +- through az_property_tax_credit in one vectorised simulation per schedule. + +Invariants: +- Transcription: each table's bands are contiguous whole-dollar ranges from + $0, and the last band's upper bound is one dollar below the (A)(3) limit. +- The amount never rises as income rises. +- The amount is between $56 and $502 below the (A)(3) limit and $0 at or + above it. +- An income with cents gets the same amount as its whole dollars. +""" + +import numpy as np +import pytest + +from policyengine_us import Simulation +from policyengine_us.system import system + +YEARS = range(2021, 2027) + +# ARS 43-1072(B)(1): (lower bound, upper bound, tax credit); (A)(3)(a) limit. +SCHEDULE_1 = [ + (0, 1_750, 502), + (1_751, 1_850, 479), + (1_851, 1_950, 457), + (1_951, 2_050, 435), + (2_051, 2_150, 412), + (2_151, 2_250, 390), + (2_251, 2_350, 368), + (2_351, 2_450, 345), + (2_451, 2_550, 323), + (2_551, 2_650, 301), + (2_651, 2_750, 279), + (2_751, 2_850, 256), + (2_851, 2_950, 234), + (2_951, 3_050, 212), + (3_051, 3_150, 189), + (3_151, 3_250, 167), + (3_251, 3_350, 145), + (3_351, 3_450, 123), + (3_451, 3_550, 100), + (3_551, 3_650, 78), + (3_651, 3_750, 56), +] +SCHEDULE_1_LIMIT = 3_751 + +# ARS 43-1072(B)(2): (lower bound, upper bound, tax credit); (A)(3)(b) limit. +SCHEDULE_2 = [ + (0, 2_500, 502), + (2_501, 2_650, 479), + (2_651, 2_800, 457), + (2_801, 2_950, 435), + (2_951, 3_100, 412), + (3_101, 3_250, 390), + (3_251, 3_400, 368), + (3_401, 3_550, 345), + (3_551, 3_700, 323), + (3_701, 3_850, 301), + (3_851, 4_000, 279), + (4_001, 4_150, 256), + (4_151, 4_300, 234), + (4_301, 4_450, 212), + (4_451, 4_600, 189), + (4_601, 4_750, 167), + (4_751, 4_900, 145), + (4_901, 5_050, 123), + (5_051, 5_200, 100), + (5_201, 5_350, 78), + (5_351, 5_500, 56), +] +SCHEDULE_2_LIMIT = 5_501 + +SCHEDULES = { + "living_alone": (SCHEDULE_1, SCHEDULE_1_LIMIT), + "cohabitating": (SCHEDULE_2, SCHEDULE_2_LIMIT), +} + +WHOLE_DOLLARS = np.arange(0, 7_001, dtype=float) +CENTS = np.array([0.01, 0.25, 0.49, 0.5, 0.51, 0.75, 0.99]) + + +def statute_amount(table, limit, income): + """The table amount for each income: the band holding its whole dollars.""" + dollars = np.floor(income) + amount = np.zeros_like(income) + for lower, upper, credit in table: + amount = np.where((dollars >= lower) & (dollars <= upper), credit, amount) + return np.where(income < limit, amount, 0) + + +def scale(name, year): + return getattr( + system.parameters( + f"{year}-01-01" + ).gov.states.az.tax.income.credits.property_tax.amount, + name, + ) + + +def edge_incomes(table, limit): + """Cents on each side of every band edge and of the (A)(3) limit.""" + edges = [lower for lower, _, _ in table[1:]] + [limit] + return np.array( + sorted( + {round(e - 1 + c, 2) for e in edges for c in CENTS} + | {round(e + c, 2) for e in edges for c in CENTS} + ) + ) + + +@pytest.mark.parametrize("name", SCHEDULES) +def test_transcription_is_contiguous_and_ends_below_the_limit(name): + table, limit = SCHEDULES[name] + assert table[0][0] == 0 + for (_, upper, _), (next_lower, _, _) in zip(table, table[1:]): + assert next_lower == upper + 1 + assert table[-1][1] + 1 == limit + + +def test_both_schedules_pay_the_same_amounts(): + assert [a for *_, a in SCHEDULE_1] == [a for *_, a in SCHEDULE_2] + + +@pytest.mark.parametrize("year", YEARS) +@pytest.mark.parametrize("name", SCHEDULES) +def test_scale_matches_statute_at_every_whole_dollar(name, year): + table, limit = SCHEDULES[name] + got = scale(name, year).calc(WHOLE_DOLLARS) + expected = statute_amount(table, limit, WHOLE_DOLLARS) + wrong = WHOLE_DOLLARS[got != expected] + assert wrong.size == 0, f"{name} {year}: wrong at {wrong[:10]}" + + +@pytest.mark.parametrize("year", YEARS) +@pytest.mark.parametrize("name", SCHEDULES) +def test_scale_matches_statute_at_cents_around_every_edge(name, year): + table, limit = SCHEDULES[name] + income = edge_incomes(table, limit) + got = scale(name, year).calc(income) + expected = statute_amount(table, limit, income) + wrong = income[got != expected] + assert wrong.size == 0, f"{name} {year}: wrong at {wrong[:10]}" + + +@pytest.mark.parametrize("year", YEARS) +@pytest.mark.parametrize("name", SCHEDULES) +def test_cents_get_the_amount_of_their_whole_dollars(name, year): + s = scale(name, year) + whole = s.calc(WHOLE_DOLLARS) + for c in CENTS: + assert (s.calc(WHOLE_DOLLARS + c) == whole).all(), (name, year, c) + + +@pytest.mark.parametrize("year", YEARS) +@pytest.mark.parametrize("name", SCHEDULES) +def test_amount_never_rises_with_income(name, year): + income = np.arange(0, 7_000, 0.25) + amount = scale(name, year).calc(income) + assert (np.diff(amount) <= 0).all() + + +@pytest.mark.parametrize("year", YEARS) +@pytest.mark.parametrize("name", SCHEDULES) +def test_amount_is_positive_below_the_limit_and_zero_from_it(name, year): + _, limit = SCHEDULES[name] + income = np.arange(0, 7_000, 0.25) + amount = scale(name, year).calc(income) + below = income < limit + assert ((amount[below] >= 56) & (amount[below] <= 502)).all() + assert (amount[~below] == 0).all() + + +def _credit_by_income(cohabitating, incomes, year): + """az_property_tax_credit for one eligible tax unit per income, vectorised.""" + n = len(incomes) + situation = { + "people": {"head": {"age": {year: 70}}}, + "tax_units": { + "tax_unit": { + "members": ["head"], + "cohabitating_spouses": {year: cohabitating}, + "az_property_tax_credit_eligible": {year: True}, + } + }, + "households": {"household": {"members": ["head"], "state_code": {year: "AZ"}}}, + "axes": [ + [ + { + "name": "az_property_tax_credit_income", + "min": 0, + "max": n - 1, + "count": n, + "period": year, + } + ] + ], + } + sim = Simulation(situation=situation) + # Taxes paid exceed every table amount, so the credit is the table amount. + sim.set_input("real_estate_taxes", year, np.full(n, 1_000.0)) + sim.set_input("az_property_tax_credit_income", year, np.asarray(incomes)) + return sim.calculate("az_property_tax_credit", year) + + +@pytest.mark.parametrize( + "name, cohabitating", [("living_alone", False), ("cohabitating", True)] +) +def test_credit_matches_statute_in_a_vectorised_simulation(name, cohabitating): + table, limit = SCHEDULES[name] + year = 2025 + incomes = np.concatenate([WHOLE_DOLLARS, edge_incomes(table, limit)]) + got = _credit_by_income(cohabitating, incomes, year) + expected = statute_amount(table, limit, incomes) + # az_property_tax_credit_income is stored as float32; every income here + # rounds to a float32 on the same side of each band edge. + wrong = incomes[got != expected] + assert wrong.size == 0, f"{name}: wrong at {wrong[:10]}"