diff --git a/changelog.d/add-obbba-schedule-1a-deductions-to-mt-subtractions.fixed.md b/changelog.d/add-obbba-schedule-1a-deductions-to-mt-subtractions.fixed.md new file mode 100644 index 00000000000..b4acbdc1815 --- /dev/null +++ b/changelog.d/add-obbba-schedule-1a-deductions-to-mt-subtractions.fixed.md @@ -0,0 +1 @@ +Flow the federal OBBBA Schedule 1-A deductions (enhanced senior deduction, qualified tip and overtime income exclusions, and passenger-vehicle loan interest) through into Montana taxable income, since Mont. Code Ann. § 15-30-2120 starts from federal taxable income. diff --git a/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/subtractions.yaml b/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/subtractions.yaml index dbb99828d57..d4d23acecb0 100644 --- a/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/subtractions.yaml +++ b/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/subtractions.yaml @@ -12,6 +12,18 @@ values: - mt_tuition_subtraction_person - mt_old_age_subtraction - mt_disability_income_exclusion_person + 2025-01-01: + # Section 15-30-2120 starts from federal taxable income, so federal + # OBBBA Schedule 1-A deductions (enhanced senior deduction, qualified + # tip and overtime exclusions, and passenger-vehicle loan interest) + # flow through into MT taxable income via mt_federal_obbba_subtraction. + - mt_interest_exemption_person + - mt_tuition_subtraction_person + - mt_old_age_subtraction + - mt_disability_income_exclusion_person + # TODO: Remove this subtraction starting in 2029 because the federal + # Schedule 1-A deductions expire after 2028. + - mt_federal_obbba_subtraction metadata: unit: list period: year diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/mt_federal_obbba_subtraction.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/mt_federal_obbba_subtraction.yaml new file mode 100644 index 00000000000..0824cf0bbb2 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/mt_federal_obbba_subtraction.yaml @@ -0,0 +1,160 @@ +- name: MT subtracts the federal OBBBA $6K senior deduction from taxable income (HoH age 75) + # Scenario from issue #8562 / PolicyEngine/policyengine-taxsim#948. + # Per Mont. Code Ann. § 15-30-2120, MT taxable income starts from + # federal taxable income (Form 1040 Line 15), which already nets the + # Schedule 1-A senior deduction. + period: 2025 + absolute_error_margin: 5 + input: + people: + head: + age: 75 + employment_income: 25_000 + taxable_interest_income: 17_510.73 + taxable_pension_income: 12_218.48 + social_security_retirement: 16_731.73 + child: + age: 5 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [head, child] + tax_unit_childcare_expenses: 3_500 + households: + household: + members: [head, child] + state_name: MT + output: + additional_senior_deduction: 6_000 + # Per-person; head receives the projection, dependent child sees 0. + mt_federal_obbba_subtraction: [6_000, 0] + mt_taxable_income_joint: [31_666, 0] + mt_income_tax: 1_488 + +- name: Pre-2025 MT household does not see the OBBBA Schedule 1-A subtraction + # The mt_federal_obbba_subtraction entry only appears in the subtractions + # parameter list from 2025-01-01 onward, matching the OBBBA effective date. + period: 2024 + input: + people: + head: + age: 75 + employment_income: 25_000 + tax_units: + tax_unit: + members: [head] + households: + household: + members: [head] + state_name: MT + output: + # The variable computes the projected federal value (which is zero + # pre-2025) but the parameter list does not include it. + mt_federal_obbba_subtraction: 0 + +- name: Non-senior MT household sees zero subtraction from this variable + period: 2025 + input: + people: + head: + age: 40 + employment_income: 50_000 + tax_units: + tax_unit: + members: [head] + households: + household: + members: [head] + state_name: MT + output: + additional_senior_deduction: 0 + mt_federal_obbba_subtraction: 0 + +- name: MFJ with both spouses 65+ — head receives the full $12K projection, spouse zero + # Both spouses qualify so the federal additional_senior_deduction + # doubles to $12_000; the head-only projection keeps mt_subtractions' + # Person-level sum from double-counting. + period: 2025 + input: + people: + head: + age: 70 + employment_income: 30_000 + spouse: + age: 68 + employment_income: 20_000 + tax_units: + tax_unit: + members: [head, spouse] + marital_units: + marital_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_name: MT + output: + additional_senior_deduction: 12_000 + mt_federal_obbba_subtraction: [12_000, 0] + +- name: Senior phaseout — at $75K MAGI single, deduction is unphased + # OBBBA SEC. 70103 starts the 6% phaseout at $75K MAGI (single). + # At exactly $75K the deduction is still the full $6K. + period: 2025 + input: + people: + head: + age: 70 + employment_income: 75_000 + tax_units: + tax_unit: + members: [head] + households: + household: + members: [head] + state_name: MT + output: + additional_senior_deduction: 6_000 + mt_federal_obbba_subtraction: 6_000 + +- name: Senior phaseout — fully phased out at $300K MAGI single + period: 2025 + input: + people: + head: + age: 70 + employment_income: 300_000 + tax_units: + tax_unit: + members: [head] + households: + household: + members: [head] + state_name: MT + output: + additional_senior_deduction: 0 + mt_federal_obbba_subtraction: 0 + +- name: Tipped worker (non-senior) — tip_income_deduction flows through to MT subtractions + # Exercises the tip_income_deduction branch of the Schedule 1-A sum, + # which the senior-only scenarios above never touch. + period: 2025 + input: + people: + head: + age: 30 + employment_income: 30_000 + tip_income: 8_000 + tip_income_deduction_occupation_requirement_met: true + tax_units: + tax_unit: + members: [head] + tip_income_deduction_ssn_requirement_met: true + households: + household: + members: [head] + state_name: MT + output: + additional_senior_deduction: 0 + tip_income_deduction: 8_000 + mt_federal_obbba_subtraction: 8_000 diff --git a/policyengine_us/variables/gov/states/mt/tax/income/subtractions/mt_federal_obbba_subtraction.py b/policyengine_us/variables/gov/states/mt/tax/income/subtractions/mt_federal_obbba_subtraction.py new file mode 100644 index 00000000000..acbc2d1ab71 --- /dev/null +++ b/policyengine_us/variables/gov/states/mt/tax/income/subtractions/mt_federal_obbba_subtraction.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class mt_federal_obbba_subtraction(Variable): + value_type = float + entity = Person + label = "Montana subtraction for federal OBBBA Schedule 1-A deductions" + unit = USD + definition_period = YEAR + defined_for = StateCode.MT + reference = ( + "https://mca.legmt.gov/bills/mca/title_0150/chapter_0300/part_0210/section_0200/0150-0300-0210-0200.html", + "https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2025_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=7", + "https://www.congress.gov/119/bills/hr1/BILLS-119hr1enr.pdf#page=88", + "https://www.congress.gov/119/bills/hr1/BILLS-119hr1enr.pdf#page=96", + ) + + def formula(person, period, parameters): + is_head = person("is_tax_unit_head", period) + senior = person.tax_unit("additional_senior_deduction", period) + tips = person.tax_unit("tip_income_deduction", period) + overtime = person.tax_unit("overtime_income_deduction", period) + auto = person.tax_unit("auto_loan_interest_deduction", period) + return is_head * (senior + tips + overtime + auto)