Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/fix-mt-rebate-wiring.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Correct the Montana 2021 income tax rebate's reported value outside its eligibility year: without the 2022 sunset the amount backdates forward, so the variable reported a phantom rebate in 2022 and later. Montana income tax is unaffected, as the non-refundable credit list already excludes the rebate from 2022.
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,27 @@ metadata:
unit: currency-USD
label: Montana income tax rebate amount
reference:
- title: Montana Code Annotated 2023, Title 15, Chapter 30, Part 21, Section 15-30-2191 (b)
href: https://archive.legmt.gov/bills/mca/title_0150/chapter_0300/part_0210/section_0910/0150-0300-0210-0910.html
- title: MCA 15-30-2191(1)(b)(i)-(ii) (rebate amounts) and (2) (line-20 cap)
href: https://web.archive.org/web/20250210203531/https://archive.legmt.gov/bills/mca/title_0150/chapter_0300/part_0210/section_0910/0150-0300-0210-0910.html
- title: Montana HB 192 (Ch. 44, L. 2023), enrolled bill, sec. 2
href: https://web.archive.org/web/20230626082025/https://leg.mt.gov/bills/2023/billpdf/HB0192.pdf
- title: Montana Department of Revenue, Income tax and property tax rebate report, May 2024, p. 8
href: https://archive.legmt.gov/content/Committees/Interim/2023-2024/Revenue/Meetings/May-2024/5.1-DOR-rebate-report.pdf#page=8
breakdown:
- filing_status

SINGLE:
2021-01-01: 1_250
2022-01-01: 0
HEAD_OF_HOUSEHOLD:
2021-01-01: 1_250
2022-01-01: 0
JOINT:
2021-01-01: 2_500
2022-01-01: 0
SURVIVING_SPOUSE:
2021-01-01: 2_500
2022-01-01: 0
SEPARATE:
2021-01-01: 1_250
2021-01-01: 1_250
2022-01-01: 0
Original file line number Diff line number Diff line change
@@ -1,35 +1,249 @@
# The rebate is keyed to the 2021 tax year (MCA 15-30-2191(1)); it was paid out
# in 2023 but is booked in the eligibility year. All active-year cases therefore
# run at period 2021. Cases at 2022 and 2023 guard the year-scoping added by
# amount.yaml's `2022-01-01: 0` entries: without them, backdating fills the 2021
# amounts forward and the variable reports a phantom rebate.

- name: Single filer receives the full single rebate
period: 2023
period: 2021
input:
people:
person1:
age: 45
employment_income: 50_000
tax_units:
tax_unit:
members: [person1]
households:
household:
members: [person1]
state_code: MT
output:
mt_income_tax_rebate: [1_250]

- name: Head of household receives the single-status rebate amount
period: 2021
input:
filing_status: SINGLE
state_code: MT
people:
person1:
age: 45
employment_income: 50_000
child:
age: 10
tax_units:
tax_unit:
members: [person1, child]
households:
household:
members: [person1, child]
state_code: MT
output:
# MCA 15-30-2191(1)(b)(i): $1,250 for a head of household. Dependents get
# nothing, since the amount is gated on is_tax_unit_head_or_spouse.
filing_status: HEAD_OF_HOUSEHOLD
mt_income_tax_rebate: [1_250, 0]

- name: Surviving spouse receives the joint rebate amount
period: 2021
input:
people:
person1:
age: 45
employment_income: 50_000
child:
age: 10
tax_units:
tax_unit:
members: [person1, child]
filing_status: SURVIVING_SPOUSE
households:
household:
members: [person1, child]
state_code: MT
output:
mt_income_tax_rebate: 1_250
# The statute does not name a surviving spouse. Montana derives filing
# status from the federal return, where a qualifying surviving spouse uses
# the joint rate schedule, so the $2,500 joint maximum is the consistent
# reading. Only one filer claims it here, so it is not split.
mt_income_tax_rebate: [2_500, 0]

- name: Joint filers split the per-return rebate across each spouse's column
period: 2023
period: 2021
absolute_error_margin: 0.01
input:
people:
person1:
is_tax_unit_head: true
age: 45
employment_income: 60_000
person2:
is_tax_unit_spouse: true
age: 45
marital_units:
marital_unit:
members: [person1, person2]
tax_units:
tax_unit:
members: [person1, person2]
filing_status: JOINT
households:
household:
members: [person1, person2]
state_code: MT
output:
# $2,500 per-return cap split $1,250 per spouse (sums to $2,500, not $5,000)
mt_income_tax_rebate: [1_250, 1_250]
# End to end: 2,518.22 pre-credit - 2,500 pooled rebate = 18.22.
# The 2022 clone of this household below is the year boundary.
mt_income_tax_before_non_refundable_credits_joint: 2_518.22
mt_income_tax: 18.22

- name: The same joint household owes more in 2022, when no rebate applies
period: 2022
absolute_error_margin: 0.01
input:
people:
person1:
age: 45
employment_income: 60_000
person2:
age: 45
marital_units:
marital_unit:
members: [person1, person2]
tax_units:
tax_unit:
members: [person1, person2]
households:
household:
members: [person1, person2]
state_code: MT
output:
# Boundary pair with the 2021 case above. The pre-credit joint base is
# lower in 2022 than in 2021 (2,394.50 against 2,518.22), yet net tax is
# far higher (2,394.50 against 18.22), because the $2,500 rebate applies
# only in 2021. Nothing else offsets the base here.
mt_income_tax_rebate: [0, 0]
mt_income_tax_before_non_refundable_credits_joint: 2_394.50
mt_non_refundable_credits: [0, 0]
mt_income_tax: 2_394.50

- name: Single filer below the cap keeps only the liability she owes
period: 2021
absolute_error_margin: 0.01
input:
people:
person1:
age: 45
employment_income: 25_000
tax_units:
tax_unit:
members: [person1]
households:
household:
members: [person1]
state_code: MT
output:
# 2021 liability of $625.40 sits strictly between zero and the $1,250
# statutory maximum, so MCA 15-30-2191(2) limits the rebate to $625.40.
# The variable still reports the uncapped $1,250. Both credit paths
# floor at zero, so the cap is realized downstream:
# mt_income_tax_before_refundable_credits_indiv is 0, and because
# mt_files_separately is False here the delivered mt_income_tax comes
# from the joint path, also floored to 0. No refundable credit is in
# play (mt_eitc is 0 at this income).
mt_income_tax_rebate: [1_250]
mt_income_tax_before_non_refundable_credits_indiv: [625.40]
mt_income_tax_before_refundable_credits_indiv: [0]
mt_eitc: [0]
mt_income_tax: 0

- name: Rebate cannot drive liability below zero (MCA 15-30-2191(2))
period: 2021
absolute_error_margin: 0.01
input:
people:
person1:
age: 45
employment_income: 20_000
person2:
age: 45
marital_units:
marital_unit:
members: [person1, person2]
tax_units:
tax_unit:
members: [person1, person2]
households:
household:
members: [person1, person2]
state_code: MT
output:
# The statutory "lesser of the amount or the liability" cap is enforced by
# the ordered credit application, not by the rebate variable: the full
# $2,500 is reported, but the joint path floors at zero, so a household
# whose pre-credit liability is only $252.40 keeps $252.40 of benefit and
# no more. (mt_income_tax itself goes to -33.81 here from the refundable
# Montana EITC, which is unrelated to the rebate.)
mt_income_tax_rebate: [1_250, 1_250]
mt_income_tax_before_non_refundable_credits_joint: 252.40
mt_income_tax_before_refundable_credits_joint: 0

- name: No rebate outside Montana
period: 2021
input:
people:
person1:
age: 45
employment_income: 50_000
tax_units:
tax_unit:
members: [person1]
households:
household:
members: [person1]
state_code: AR
output:
mt_income_tax_rebate: [0]

- name: No phantom rebate value in 2022
period: 2022
absolute_error_margin: 0.01
input:
people:
person1:
age: 45
employment_income: 50_000
tax_units:
tax_unit:
members: [person1]
households:
household:
members: [person1]
state_code: MT
output:
# This is the discriminating assertion: without amount.yaml's 2022
# zeroing, backdating fills the 2021 amount forward and this reads
# 1_250. Montana tax is NOT affected either way, because
# credits/non_refundable.yaml already drops mt_income_tax_rebate from
# the list at 2022-01-01 - so the defect is the variable's reported
# value, which mis-feeds consumers such as the TAXSIM srebate
# comparison, not the tax outcome. mt_income_tax and
# mt_non_refundable_credits are pinned here as unchanged controls.
mt_income_tax_rebate: [0]
mt_non_refundable_credits: [0]
mt_income_tax: 2_246.00

- name: Not in Montana
- name: No rebate in 2023, the year the rebate was actually paid out
period: 2023
input:
filing_status: JOINT
state_code: AR
people:
person1:
age: 45
employment_income: 50_000
tax_units:
tax_unit:
members: [person1]
households:
household:
members: [person1]
state_code: MT
output:
mt_income_tax_rebate: 0
mt_income_tax_rebate: [0]
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,29 @@ class mt_income_tax_rebate(Variable):
label = "Montana 2021 income tax rebate"
unit = USD
definition_period = YEAR
reference = "https://archive.legmt.gov/bills/mca/title_0150/chapter_0300/part_0210/section_0910/0150-0300-0210-0910.html"
reference = [
# MCA 15-30-2191(1)(b)(i)-(ii) (rebate amounts) and (2) (line-20 cap)
"https://web.archive.org/web/20250210203531/https://archive.legmt.gov/bills/mca/title_0150/chapter_0300/part_0210/section_0910/0150-0300-0210-0910.html",
# Montana HB 192 (Ch. 44, L. 2023), enrolled bill, sec. 2
"https://web.archive.org/web/20230626082025/https://leg.mt.gov/bills/2023/billpdf/HB0192.pdf",
# Montana Department of Revenue, income tax and property tax rebate
# report, May 2024, p. 8
"https://archive.legmt.gov/content/Committees/Interim/2023-2024/Revenue/Meetings/May-2024/5.1-DOR-rebate-report.pdf#page=8",
]
defined_for = StateCode.MT

# The rebate is based on 2021 income tax liability, but provided in 2023.
# It applies once per return (MCA 15-30-2191(1)), so joint filers split
# the per-return cap across each spouse's column ($1,250 each) to avoid
# double-counting when the person-level non-refundable credits are pooled.
#
# MCA 15-30-2191(2) caps the rebate at the 2021 liability reported on line
# 20 of Form 2. That cap is not applied here: the ordered non-refundable
# credit application already floors each path at zero, so the effective
# rebate is line-20-capped per filing configuration. The guarding cases are
# "Single filer below the cap" and "Rebate cannot drive liability below
# zero" in the matching test file under
# tests/policy/baseline/gov/states/mt/tax/income/credits/rebate/.
def formula(person, period, parameters):
p = parameters(period).gov.states.mt.tax.income.credits.rebate
filing_status = person.tax_unit("filing_status", period)
Expand Down
Loading