diff --git a/changelog.d/mt-rebate-double-count-9012.fixed.md b/changelog.d/mt-rebate-double-count-9012.fixed.md new file mode 100644 index 00000000000..e8b35e6385b --- /dev/null +++ b/changelog.d/mt-rebate-double-count-9012.fixed.md @@ -0,0 +1 @@ +Fixed the Montana 2021 income tax rebate double-count by applying the per-return cap once, splitting it across each spouse's column rather than projecting the tax-unit rebate onto every member. diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/rebate/mt_income_tax_rebate.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/rebate/mt_income_tax_rebate.yaml index f8b22b4ca3f..ce17b615090 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/rebate/mt_income_tax_rebate.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/rebate/mt_income_tax_rebate.yaml @@ -1,4 +1,4 @@ -- name: Single filer +- name: Single filer receives the full single rebate period: 2023 input: filing_status: SINGLE @@ -6,13 +6,25 @@ output: mt_income_tax_rebate: 1_250 -- name: Joint filers +- name: Joint filers split the per-return rebate across each spouse's column period: 2023 input: - filing_status: JOINT - state_code: MT + people: + person1: + is_tax_unit_head: true + person2: + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + households: + household: + members: [person1, person2] + state_code: MT output: - mt_income_tax_rebate: 2_500 + # $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] - name: Not in Montana period: 2023 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/integration.yaml index 42a09bb5f67..4efb44b8865 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/integration.yaml @@ -94,15 +94,16 @@ person1: age: 59 taxable_interest_income: 5_505 + mt_income_tax_rebate: 0 # not in TAXSIM35 person2: age: 59 employment_income: 27010 taxable_interest_income: 5_505 + mt_income_tax_rebate: 0 # not in TAXSIM35 tax_units: tax_unit: members: [person1, person2] aca_ptc: 0 # not in TAXSIM35 - mt_income_tax_rebate: 0 spm_units: spm_unit: members: [person1, person2] @@ -124,10 +125,12 @@ age: 33 employment_income: 7010 taxable_interest_income: 5505 + mt_income_tax_rebate: 0 # not in TAXSIM35 person2: age: 33 employment_income: 136010 taxable_interest_income: 5505 + mt_income_tax_rebate: 0 # not in TAXSIM35 person3: age: 16 person4: @@ -140,7 +143,6 @@ tax_unit: members: [person1, person2, person3, person4, person5, person6] local_income_tax: 0 # not in TAXSIM35 - mt_income_tax_rebate: 0 spm_units: spm_unit: members: [person1, person2, person3, person4, person5, person6] @@ -162,10 +164,12 @@ age: 66 employment_income: 17010 taxable_interest_income: 5505.0 + mt_income_tax_rebate: 0 # not in TAXSIM35 person2: age: 66 employment_income: 7010 taxable_interest_income: 5505.0 + mt_income_tax_rebate: 0 # not in TAXSIM35 person3: age: 11 person4: @@ -178,7 +182,6 @@ tax_unit: members: [person1, person2, person3, person4, person5, person6] aca_ptc: 0 # not in TAXSIM35 - mt_income_tax_rebate: 0 spm_units: spm_unit: members: [person1, person2, person3, person4, person5, person6] @@ -511,3 +514,28 @@ mt_regular_income_tax_joint: 1_918 mt_capital_gains_tax_joint: 1_022.8 mt_income_tax: 2_940.8 + +- name: MT 2021 joint couple rebate applies once per return, not per spouse (issue 9012) + period: 2021 + absolute_error_margin: 0.01 + input: + people: + head: + age: 45 + employment_income: 90_000 + spouse: + age: 45 + employment_income: 70_000 + tax_units: + tax_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: MT + output: + # $2,500 per-return cap split $1,250 per spouse (was double-counted to $5,000) + mt_income_tax_rebate: [1_250, 1_250] + # Files separately: 5,099.51 - 1,250 + 3,719.51 - 1,250 = 6,319.02 + # (old double-count subtracted $2,500 per column, understating tax by $2,500) + mt_income_tax: 6_319.02 diff --git a/policyengine_us/variables/gov/states/mt/tax/income/credits/rebate/mt_income_tax_rebate.py b/policyengine_us/variables/gov/states/mt/tax/income/credits/rebate/mt_income_tax_rebate.py index 031e5cd790f..ae19961fc22 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/credits/rebate/mt_income_tax_rebate.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/credits/rebate/mt_income_tax_rebate.py @@ -3,15 +3,25 @@ class mt_income_tax_rebate(Variable): value_type = float - entity = TaxUnit + entity = Person 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" defined_for = StateCode.MT - # The rebate is based on 2021 income tax liability, but provided in 2023 - def formula(tax_unit, period, parameters): + # 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. + def formula(person, period, parameters): p = parameters(period).gov.states.mt.tax.income.credits.rebate - filing_status = tax_unit("filing_status", period) - return p.amount[filing_status] + filing_status = person.tax_unit("filing_status", period) + statuses = filing_status.possible_values + head_or_spouse = person("is_tax_unit_head_or_spouse", period) + per_person_amount = where( + filing_status == statuses.JOINT, + p.amount["SEPARATE"], + p.amount[filing_status], + ) + return head_or_spouse * per_person_amount