diff --git a/changelog.d/mt-pension-exemption.added.md b/changelog.d/mt-pension-exemption.added.md new file mode 100644 index 00000000000..661085b67a7 --- /dev/null +++ b/changelog.d/mt-pension-exemption.added.md @@ -0,0 +1 @@ +Add Montana's 2021–2023 partial pension, annuity, and IRA income exemption. diff --git a/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/pension/cap.yaml b/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/pension/cap.yaml new file mode 100644 index 00000000000..20ba3a7535e --- /dev/null +++ b/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/pension/cap.yaml @@ -0,0 +1,18 @@ +description: Montana caps the partial pension, annuity, and IRA income exemption at this amount for each taxpayer. +values: + 2021-01-01: 4_400 + 2022-01-01: 4_640 + 2023-01-01: 5_060 +metadata: + unit: currency-USD + period: year + label: Montana partial pension, annuity, and IRA income exemption cap + reference: + - title: Montana Code Annotated 2021, 15-30-2110(2)(c)(i) and (17) + href: https://web.archive.org/web/20220630022434/https://leg.mt.gov/bills/mca/title_0150/chapter_0300/part_0210/section_0100/0150-0300-0210-0100.html + - title: 2021 Montana Form 2 instructions, line 35, Partial Pension, Annuity, and IRA Income Exemption + href: https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2021_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=30 + - title: 2022 Montana Form 2 instructions, line 34, Partial Pension, Annuity, and IRA Income Exemption + href: https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2022_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=31 + - title: 2023 Montana Form 2 instructions, line 34, Partial Pension, Annuity, and IRA Income Exemption + href: https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2023_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=34 diff --git a/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/pension/in_effect.yaml b/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/pension/in_effect.yaml new file mode 100644 index 00000000000..9c5031acfc2 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/pension/in_effect.yaml @@ -0,0 +1,16 @@ +description: Montana provides the partial pension, annuity, and IRA income exemption if this is true. +values: + # The exemption also applied before 2021, at lower indexed amounts + # (MCA 15-30-2110(2)(c) and (17)). Those amounts are not listed, so earlier + # years use the 2021 cap and phase-out threshold. + 2021-01-01: true + 2024-01-01: false +metadata: + unit: bool + period: year + label: Montana partial pension, annuity, and IRA income exemption in effect + reference: + - title: Montana Code Annotated 2021, 15-30-2110(2)(c), repealed effective January 1, 2024 (secs. 65, 70(1), Ch. 503, L. 2021) + href: https://web.archive.org/web/20220630022434/https://leg.mt.gov/bills/mca/title_0150/chapter_0300/part_0210/section_0100/0150-0300-0210-0100.html + - title: 2023 Montana Form 2 instructions, line 34, "Beginning in Tax Year 2024, this deduction is repealed" + href: https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2023_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=35 diff --git a/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/pension/phase_out/rate.yaml b/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/pension/phase_out/rate.yaml new file mode 100644 index 00000000000..0b8a8f9c49d --- /dev/null +++ b/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/pension/phase_out/rate.yaml @@ -0,0 +1,12 @@ +description: Montana reduces the partial pension, annuity, and IRA income exemption by this amount for each dollar of federal adjusted gross income above the threshold. +values: + 2021-01-01: 2 +metadata: + unit: /1 + period: year + label: Montana partial pension, annuity, and IRA income exemption phase-out rate + reference: + - title: Montana Code Annotated 2021, 15-30-2110(2)(c)(ii) + href: https://web.archive.org/web/20220630022434/https://leg.mt.gov/bills/mca/title_0150/chapter_0300/part_0210/section_0100/0150-0300-0210-0100.html + - title: 2023 Montana Form 2, Partial Pension, Annuity, and IRA Income Exemption Worksheet, line 6 + href: https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2/2023_Montana_Individual_Income_Tax_Return_Form_2.pdf#page=6 diff --git a/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/pension/phase_out/threshold.yaml b/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/pension/phase_out/threshold.yaml new file mode 100644 index 00000000000..83cb0018d95 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/pension/phase_out/threshold.yaml @@ -0,0 +1,18 @@ +description: Montana reduces the partial pension, annuity, and IRA income exemption when federal adjusted gross income exceeds this amount. +values: + 2021-01-01: 36_700 + 2022-01-01: 38_660 + 2023-01-01: 42_140 +metadata: + unit: currency-USD + period: year + label: Montana partial pension, annuity, and IRA income exemption phase-out threshold + reference: + - title: Montana Code Annotated 2021, 15-30-2110(2)(c)(ii) and (17) + href: https://web.archive.org/web/20220630022434/https://leg.mt.gov/bills/mca/title_0150/chapter_0300/part_0210/section_0100/0150-0300-0210-0100.html + - title: 2021 Montana Form 2 instructions, line 35, Partial Pension, Annuity, and IRA Income Exemption + href: https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2021_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=30 + - title: 2022 Montana Form 2 instructions, line 34, Partial Pension, Annuity, and IRA Income Exemption + href: https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2022_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=31 + - title: 2023 Montana Form 2 instructions, line 34, Partial Pension, Annuity, and IRA Income Exemption + href: https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2023_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=34 diff --git a/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/pension/sources.yaml b/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/pension/sources.yaml new file mode 100644 index 00000000000..3b759e12a8f --- /dev/null +++ b/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/pension/sources.yaml @@ -0,0 +1,30 @@ +description: Montana counts these sources as pension, annuity, and IRA income for the partial pension, annuity, and IRA income exemption. +values: + 2021-01-01: + # Form 2, page 1, lines 4b (IRA distributions) and 5b (pensions and + # annuities). Premature distributions do not qualify (MCA 15-30-2101(25)(d)) + # but are not separately modeled. + - taxable_pension_income + - taxable_retirement_distributions + # Roth conversions are IRA or plan distributions included on line 4b or + # 5b (MCA 15-30-2101(25)(d)). + - taxable_roth_conversions + # Uniformed services retired pay and Survivor Benefit Plan annuities + # (MCA 15-30-2101(25)(b)), reported on line 5b. The line 34 instructions + # qualify Form 1099-R code 7 income, and the 1099-R instructions put + # military pensions and survivor benefit annuities on code 7. Death + # benefits (code 4) do not qualify. + - military_retirement_income +metadata: + unit: list + period: year + label: Montana partial pension, annuity, and IRA income exemption sources + reference: + - title: Montana Code Annotated 2021, 15-30-2101(25), "Pension and annuity income" + href: https://web.archive.org/web/20220127192023/http://leg.mt.gov/bills/mca/title_0150/chapter_0300/part_0210/section_0010/0150-0300-0210-0010.html + - title: 2023 Montana Form 2, Partial Pension, Annuity, and IRA Income Exemption Worksheet, line 2 + href: https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2/2023_Montana_Individual_Income_Tax_Return_Form_2.pdf#page=6 + - title: 2023 Montana Form 2 instructions, line 34, "Qualifying pension, annuity, and IRA income is reported on federal Form 1099-R with distribution code 7" + href: https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2023_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=34 + - title: 2023 Instructions for Forms 1099-R and 5498, Military retirement annuities, "Use Code 7 in box 7 for reporting military pensions or survivor benefit annuities" + href: https://www.irs.gov/pub/irs-prior/i1099r--2023.pdf#page=2 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/pension/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/pension/integration.yaml new file mode 100644 index 00000000000..da8fa9b549d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/pension/integration.yaml @@ -0,0 +1,44 @@ +# Single filer, 20,000 of taxable pension income, no other income, 2023 +# Form 2. Montana AGI: 20,000 - 5,060 = 14,940. Standard deduction: 20% of +# 14,940 = 2,988. Exemptions: 2,960 each. +- name: Single filer aged 60 with a pension + period: 2023 + input: + age: 60 + taxable_private_pension_income: 20_000 + state_code: MT + output: + # Taxable income 14,940 - 2,988 - 2,960 = 8,992; tax 8,992 x 3% - 99. + mt_income_tax: 170.76 + +- name: Single filer aged 70 with a pension + period: 2023 + input: + age: 70 + taxable_private_pension_income: 20_000 + state_code: MT + output: + # Taxable income 14,940 - 2,988 - 2 x 2,960 = 6,032; tax 6,032 x 2% - 36. + mt_income_tax: 84.64 + +- name: Single filer aged 60 with military retired pay + period: 2023 + input: + age: 60 + military_retirement_pay: 20_000 + state_code: MT + output: + # MCA 15-30-2101(25)(b): the same Montana AGI (14,940) and tax as the + # pension case above. + mt_income_tax: 170.76 + +- name: Single filer aged 60 with a Survivor Benefit Plan annuity + period: 2023 + input: + age: 60 + military_retirement_pay_survivors: 20_000 + state_code: MT + output: + # Form 1099-R code 7: the same Montana AGI (14,940) and tax as the + # pension case above. + mt_income_tax: 170.76 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/pension/mt_pension_exemption_before_phase_out.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/pension/mt_pension_exemption_before_phase_out.yaml new file mode 100644 index 00000000000..e3607c0841e --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/pension/mt_pension_exemption_before_phase_out.yaml @@ -0,0 +1,71 @@ +- name: Pension above the 2023 cap is capped at 5,060 + period: 2023 + input: + taxable_private_pension_income: 25_000 + state_code: MT + output: + mt_pension_exemption_before_phase_out: 5_060 + +- name: Pension and IRA income below the 2023 cap are exempt in full + period: 2023 + input: + taxable_private_pension_income: 1_000 + taxable_ira_distributions: 1_300 + state_code: MT + output: + mt_pension_exemption_before_phase_out: 2_300 + +- name: Military retired pay qualifies + period: 2023 + input: + military_retirement_pay: 20_000 + state_code: MT + output: + # MCA 15-30-2101(25)(b), capped at 5,060. + mt_pension_exemption_before_phase_out: 5_060 + +- name: Survivor Benefit Plan annuities qualify + period: 2023 + input: + military_retirement_pay_survivors: 20_000 + state_code: MT + output: + # Form 1099-R code 7 (1099-R instructions, Military retirement + # annuities), which the line 34 instructions qualify; capped at 5,060. + mt_pension_exemption_before_phase_out: 5_060 + +- name: Roth conversions qualify + period: 2023 + input: + taxable_roth_conversions: 3_000 + state_code: MT + output: + # Included on Form 2, page 1, line 4b (worksheet line 2). + mt_pension_exemption_before_phase_out: 3_000 + +- name: A dependent's pension does not qualify + period: 2023 + input: + people: + head: + is_tax_unit_head: true + dependent: + is_tax_unit_dependent: true + taxable_private_pension_income: 3_000 + tax_units: + tax_unit: + members: [head, dependent] + households: + household: + members: [head, dependent] + state_code: MT + output: + mt_pension_exemption_before_phase_out: [0, 0] + +- name: The exemption is repealed from 2024 + period: 2024 + input: + taxable_private_pension_income: 20_000 + state_code: MT + output: + mt_pension_exemption_before_phase_out: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/pension/mt_pension_exemption_indiv.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/pension/mt_pension_exemption_indiv.yaml new file mode 100644 index 00000000000..bd52bb832cc --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/pension/mt_pension_exemption_indiv.yaml @@ -0,0 +1,63 @@ +# Expected values are the examples in the Form 2 instructions: 2021 line 35 +# (PDF page 30), 2022 line 34 (PDF pages 31-32), 2023 line 34 (PDF pages 34-35). +- name: 2021 instructions example, federal AGI of 37,400 + period: 2021 + input: + employment_income: 17_400 + taxable_private_pension_income: 20_000 + state_code: MT + output: + # 4,400 - (700 x 2) = 3,000 + mt_pension_exemption_indiv: 3_000 + +- name: 2022 instructions example, federal AGI of 39,400 + period: 2022 + input: + employment_income: 19_400 + taxable_private_pension_income: 20_000 + state_code: MT + output: + # 4,640 - (740 x 2) = 3,160 + mt_pension_exemption_indiv: 3_160 + +- name: 2023 instructions example, federal AGI of 43,000 + period: 2023 + input: + employment_income: 23_000 + taxable_private_pension_income: 20_000 + state_code: MT + output: + # 5,060 - (860 x 2) = 3,340 + mt_pension_exemption_indiv: 3_340 + +- name: No exemption at the 2023 federal AGI of 44,670 + period: 2023 + input: + employment_income: 24_670 + taxable_private_pension_income: 20_000 + state_code: MT + output: + # 5,060 - (2,530 x 2) = 0 + mt_pension_exemption_indiv: 0 + +- name: On separate returns each spouse uses their own federal AGI + period: 2023 + input: + people: + head: + is_tax_unit_head: true + employment_income: 40_000 + spouse: + is_tax_unit_spouse: true + taxable_private_pension_income: 20_000 + tax_units: + tax_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: MT + output: + # The spouse's separately stated federal AGI, 20,000, is below 42,140. + mt_pension_exemption_indiv: [0, 5_060] + mt_agi_indiv: [40_000, 14_940] diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/pension/mt_pension_exemption_joint.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/pension/mt_pension_exemption_joint.yaml new file mode 100644 index 00000000000..198c6890f5d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/pension/mt_pension_exemption_joint.yaml @@ -0,0 +1,160 @@ +# Jim and Pam examples in the Form 2 instructions: 2021 line 35 (PDF page 30), +# 2022 line 34 (PDF page 31), 2023 line 34 (PDF page 34). Federal AGI is +# 35,400; Jim has a 25,000 and Pam a 2,300 retirement distribution. +- name: 2021 instructions example, Jim and Pam + period: 2021 + input: + people: + jim: + is_tax_unit_head: true + employment_income: 8_100 + taxable_private_pension_income: 25_000 + pam: + is_tax_unit_spouse: true + taxable_private_pension_income: 2_300 + tax_units: + tax_unit: + members: [jim, pam] + households: + household: + members: [jim, pam] + state_code: MT + output: + # 4,400 + 2,300 + mt_pension_exemption_joint: 6_700 + +- name: 2022 instructions example, Jim and Pam + period: 2022 + input: + people: + jim: + is_tax_unit_head: true + employment_income: 8_100 + taxable_private_pension_income: 25_000 + pam: + is_tax_unit_spouse: true + taxable_private_pension_income: 2_300 + tax_units: + tax_unit: + members: [jim, pam] + households: + household: + members: [jim, pam] + state_code: MT + output: + # 4,640 + 2,300 + mt_pension_exemption_joint: 6_940 + +- name: 2023 instructions example, Jim and Pam + period: 2023 + input: + people: + jim: + is_tax_unit_head: true + employment_income: 8_100 + taxable_private_pension_income: 25_000 + pam: + is_tax_unit_spouse: true + taxable_private_pension_income: 2_300 + tax_units: + tax_unit: + members: [jim, pam] + households: + household: + members: [jim, pam] + state_code: MT + output: + # 5,060 + 2,300 + mt_pension_exemption_joint: 7_360 + # 35,400 - 7,360 + mt_agi_joint: 28_040 + +- name: A joint return reduces the exemption by the joint federal AGI + period: 2023 + input: + people: + head: + is_tax_unit_head: true + employment_income: 40_000 + spouse: + is_tax_unit_spouse: true + taxable_private_pension_income: 20_000 + tax_units: + tax_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: MT + output: + # Worksheet lines 3b-7: 5,060 - 2 x (60,000 - 42,140) is below zero. + mt_pension_exemption_joint: 0 + mt_agi_joint: 60_000 + +# In the phase-out range a joint return reduces the combined line 3b amount +# once by the joint federal AGI (worksheet line 7). Reducing each spouse's +# amount separately would give a lower total. +- name: 2021 joint return in the phase-out range + period: 2021 + input: + people: + head: + is_tax_unit_head: true + taxable_private_pension_income: 18_700 + spouse: + is_tax_unit_spouse: true + taxable_private_pension_income: 18_700 + tax_units: + tax_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: MT + output: + # 2 x 4,400 - 2 x (37,400 - 36,700) + mt_pension_exemption_joint: 7_400 + +- name: 2022 joint return in the phase-out range + period: 2022 + input: + people: + head: + is_tax_unit_head: true + taxable_private_pension_income: 19_700 + spouse: + is_tax_unit_spouse: true + taxable_private_pension_income: 19_700 + tax_units: + tax_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: MT + output: + # 2 x 4,640 - 2 x (39,400 - 38,660) + mt_pension_exemption_joint: 7_800 + +- name: 2023 joint return in the phase-out range + period: 2023 + input: + people: + head: + is_tax_unit_head: true + taxable_private_pension_income: 21_500 + spouse: + is_tax_unit_spouse: true + taxable_private_pension_income: 21_500 + tax_units: + tax_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: MT + output: + # 2 x 5,060 - 2 x (43,000 - 42,140) + mt_pension_exemption_joint: 8_400 + # 43,000 - 8,400 + mt_agi_joint: 34_600 diff --git a/policyengine_us/variables/gov/states/mt/tax/income/base/mt_agi_indiv.py b/policyengine_us/variables/gov/states/mt/tax/income/base/mt_agi_indiv.py index ff6e632e58b..043651bfe56 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/base/mt_agi_indiv.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/base/mt_agi_indiv.py @@ -16,7 +16,12 @@ def formula(person, period, parameters): "mt_loss_ald_reallocation", period ) additions = person("mt_additions", period) - subtractions = person("mt_subtractions", period) + # The partial pension, annuity, and IRA income exemption is not in the + # subtractions list: on a separate return each spouse reduces it by + # their own federal AGI, and a joint return reduces it once. + subtractions = person("mt_subtractions", period) + person( + "mt_pension_exemption_indiv", period + ) reduced_agi = max_(agi + additions - subtractions, 0) # Montana taxable social security benefits can be either addition or subtraction # if mt_taxable_social security - taxable_social_security > 0, then addition, else subtraction diff --git a/policyengine_us/variables/gov/states/mt/tax/income/base/mt_agi_joint.py b/policyengine_us/variables/gov/states/mt/tax/income/base/mt_agi_joint.py index 3a081d76218..7dcb593c319 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/base/mt_agi_joint.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/base/mt_agi_joint.py @@ -23,6 +23,9 @@ def formula(tax_unit, period, parameters): on_return = person("is_tax_unit_head_or_spouse", period) additions = tax_unit.sum(person("mt_additions", period) * on_return) subtractions = tax_unit.sum(person("mt_subtractions", period) * on_return) + # A joint return claims the partial pension, annuity, and IRA income + # exemption once, reduced by the joint federal AGI. + subtractions += tax_unit("mt_pension_exemption_joint", period) # Apply pooled subtractions to pooled income reduced_agi = max_(agi + additions - subtractions, 0) diff --git a/policyengine_us/variables/gov/states/mt/tax/income/base/mt_taxable_social_security.py b/policyengine_us/variables/gov/states/mt/tax/income/base/mt_taxable_social_security.py index 053c2a87ab4..0b0c6173385 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/base/mt_taxable_social_security.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/base/mt_taxable_social_security.py @@ -37,7 +37,11 @@ def formula(person, period, parameters): "student_loan_interest_ald", period ) # Line 8 - Montana subtractions + ald - subtractions = person("mt_subtractions", period) + # Subtractions Schedule line 35 includes the partial pension, annuity, + # and IRA income exemption (line 34). + subtractions = person("mt_subtractions", period) + person( + "mt_pension_exemption_indiv", period + ) increased_subtractions = subtractions + ald_less_student_loan # line 9: line 6 -line 8, if line 8 >= line 6, return 0 income_reduced_by_subtractions = max_( diff --git a/policyengine_us/variables/gov/states/mt/tax/income/base/mt_taxable_social_security_joint.py b/policyengine_us/variables/gov/states/mt/tax/income/base/mt_taxable_social_security_joint.py index cebfa573b8f..54029434dd0 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/base/mt_taxable_social_security_joint.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/base/mt_taxable_social_security_joint.py @@ -38,7 +38,11 @@ def formula(tax_unit, period, parameters): tax_unit, period, ["mt_applicable_ald_deductions"] ) - add(tax_unit, period, ["student_loan_interest_ald"]) # line 8: Montana subtractions + ald - subtractions = add(tax_unit, period, ["mt_subtractions"]) + # Subtractions Schedule line 35 includes the partial pension, annuity, + # and IRA income exemption (line 34). + subtractions = add(tax_unit, period, ["mt_subtractions"]) + tax_unit( + "mt_pension_exemption_joint", period + ) increased_subtractions = subtractions + ald_less_student_loan # line 9: line 6 - line 8, if line 8 >= line 6, return 0 income_reduced_by_subtractions = max_( diff --git a/policyengine_us/variables/gov/states/mt/tax/income/subtractions/pension/mt_pension_exemption_before_phase_out.py b/policyengine_us/variables/gov/states/mt/tax/income/subtractions/pension/mt_pension_exemption_before_phase_out.py new file mode 100644 index 00000000000..dd5ee2168bd --- /dev/null +++ b/policyengine_us/variables/gov/states/mt/tax/income/subtractions/pension/mt_pension_exemption_before_phase_out.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class mt_pension_exemption_before_phase_out(Variable): + value_type = float + entity = Person + label = "Montana partial pension, annuity, and IRA income exemption before the phase-out" + unit = USD + definition_period = YEAR + reference = ( + "https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2/2023_Montana_Individual_Income_Tax_Return_Form_2.pdf#page=6", + "https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2023_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=34", + ) + defined_for = StateCode.MT + + def formula(person, period, parameters): + p = parameters(period).gov.states.mt.tax.income.subtractions.pension + if not p.in_effect: + return 0 + # Worksheet lines 1-3a: the smaller of the cap and the taxpayer's own + # pension, annuity, and IRA income. + income = add(person, period, p.sources) + head_or_spouse = person("is_tax_unit_head_or_spouse", period) + return head_or_spouse * min_(p.cap, income) diff --git a/policyengine_us/variables/gov/states/mt/tax/income/subtractions/pension/mt_pension_exemption_indiv.py b/policyengine_us/variables/gov/states/mt/tax/income/subtractions/pension/mt_pension_exemption_indiv.py new file mode 100644 index 00000000000..5ff616e1b51 --- /dev/null +++ b/policyengine_us/variables/gov/states/mt/tax/income/subtractions/pension/mt_pension_exemption_indiv.py @@ -0,0 +1,28 @@ +from policyengine_us.model_api import * + + +class mt_pension_exemption_indiv(Variable): + value_type = float + entity = Person + label = "Montana partial pension, annuity, and IRA income exemption on a separate return" + unit = USD + definition_period = YEAR + reference = ( + "https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2/2023_Montana_Individual_Income_Tax_Return_Form_2.pdf#page=6", + "https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2023_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=34", + ) + defined_for = StateCode.MT + + def formula(person, period, parameters): + p = parameters(period).gov.states.mt.tax.income.subtractions.pension.phase_out + exemption = person("mt_pension_exemption_before_phase_out", period) + # Lines 4-6: a single filer, or each spouse filing separately, reduces + # the exemption by their own federal adjusted gross income. Spouses + # filing separately on the same form divide the return's losses + # equally, as in mt_agi_indiv. + agi = person("adjusted_gross_income_person", period) + person( + "mt_loss_ald_reallocation", period + ) + reduction = p.rate * max_(agi - p.threshold, 0) + # Line 7 + return max_(exemption - reduction, 0) diff --git a/policyengine_us/variables/gov/states/mt/tax/income/subtractions/pension/mt_pension_exemption_joint.py b/policyengine_us/variables/gov/states/mt/tax/income/subtractions/pension/mt_pension_exemption_joint.py new file mode 100644 index 00000000000..238c2efe0eb --- /dev/null +++ b/policyengine_us/variables/gov/states/mt/tax/income/subtractions/pension/mt_pension_exemption_joint.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +class mt_pension_exemption_joint(Variable): + value_type = float + entity = TaxUnit + label = ( + "Montana partial pension, annuity, and IRA income exemption on a joint return" + ) + unit = USD + definition_period = YEAR + reference = ( + "https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2/2023_Montana_Individual_Income_Tax_Return_Form_2.pdf#page=6", + "https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2023_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=34", + ) + defined_for = StateCode.MT + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.mt.tax.income.subtractions.pension.phase_out + # Line 3b: a joint return adds the spouses' line 3a amounts. + exemption = add(tax_unit, period, ["mt_pension_exemption_before_phase_out"]) + # Lines 4-6: the reduction applies once, to the joint federal + # adjusted gross income. + agi = tax_unit("adjusted_gross_income", period) + reduction = p.rate * max_(agi - p.threshold, 0) + # Line 7 + return max_(exemption - reduction, 0)