diff --git a/changelog.d/ma-excess-business-loss.fixed.md b/changelog.d/ma-excess-business-loss.fixed.md new file mode 100644 index 00000000000..7be27950ec5 --- /dev/null +++ b/changelog.d/ma-excess-business-loss.fixed.md @@ -0,0 +1 @@ +Add the excess business loss back to Massachusetts 5.0% income for tax years 2022 through 2028 (Schedule X, line 6), measured from 2026 against a Massachusetts threshold that does not adopt the OBBBA reset, with new excess_business_loss and net_business_loss variables. diff --git a/policyengine_us/parameters/gov/states/ma/tax/income/excess_business_loss/in_effect.yaml b/policyengine_us/parameters/gov/states/ma/tax/income/excess_business_loss/in_effect.yaml new file mode 100644 index 00000000000..1d391bb5042 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ma/tax/income/excess_business_loss/in_effect.yaml @@ -0,0 +1,39 @@ +description: Massachusetts adds the excess business loss back to 5.0% income if this is true. + +values: + 2018-01-01: false + # Massachusetts conforms to the Code as amended on January 1, 2022 for tax + # years beginning on or after January 1, 2022 (St. 2022, c. 126, ss. 30 and + # 189), including Section 461(l) (TIR 23-5), and to the Code as amended on + # January 1, 2024 from tax year 2024 (St. 2024, c. 140, ss. 100 and 251). + 2022-01-01: true + # The Code as amended on January 1, 2024 limits excess business losses + # through the 2028 taxable year (TIR 24-14). Massachusetts does not conform + # to the OBBBA extension of the limitation (TIR 26-4). + 2029-01-01: false + +metadata: + unit: bool + period: year + label: Massachusetts excess business loss add-back in effect + reference: + - title: M.G.L. c. 62, s. 1(c), definition of Code + href: https://malegislature.gov/Laws/GeneralLaws/PartI/TitleIX/Chapter62/Section1 + - title: TIR 23-1, Tax Provisions in the Fiscal Year 2023 Budget, Including Massachusetts Personal Income Tax Code Update (Code section 461(l)) + href: https://www.mass.gov/technical-information-release/working-draft-tir-tax-provisions-in-the-fiscal-year-2023-budget-including-massachusetts-personal-income-tax-code-update + - title: TIR 23-5, Chapter 62 Conformity to Select Provisions of the 2022 Internal Revenue Code (Code section 461(l)) + href: https://www.mass.gov/technical-information-release/tir-23-5-chapter-62-conformity-to-select-provisions-of-the-2022-internal-revenue-code + - title: TIR 24-14, Tax Provisions in the Fiscal Year 2025 Budget, II.A.1 Limitation on Noncorporate Excess Business Losses + href: https://www.mass.gov/technical-information-release/tir-24-14-tax-provisions-in-the-fiscal-year-2025-budget + - title: TIR 26-4, Massachusetts Conformity to Certain Provisions in Public Law No. 119-21 (Sec. 70601) + href: https://www.mass.gov/technical-information-release/tir-26-4-massachusetts-conformity-to-certain-provisions-in-public-law-no-119-21 + - title: 2022 Form 1 instructions, Updated IRC Conformity Date ("Code Update") + href: https://web.archive.org/web/20230616200742/https://www.mass.gov/doc/2022-form-1-instructions/download#page=4 + - title: 2022 Form 1 instructions, Schedule X, line 6 Excess Business Loss Adjustment + href: https://web.archive.org/web/20230616200742/https://www.mass.gov/doc/2022-form-1-instructions/download#page=20 + - title: 2023 Form 1 instructions, Schedule X, line 6 Excess Business Loss Adjustment + href: https://www.mass.gov/doc/2023-form-1-instructions/download#page=20 + - title: 2024 Form 1 instructions, Schedule X, line 6 Excess Business Loss Adjustment + href: https://www.mass.gov/doc/2024-form-1-instructions/download#page=20 + - title: 2025 Form 1 instructions, Schedule X, line 6 Excess Business Loss Adjustment + href: https://www.mass.gov/doc/2025-form-1-instructions/download#page=21 diff --git a/policyengine_us/parameters/gov/states/ma/tax/income/excess_business_loss/threshold.yaml b/policyengine_us/parameters/gov/states/ma/tax/income/excess_business_loss/threshold.yaml new file mode 100644 index 00000000000..381fcb62d45 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ma/tax/income/excess_business_loss/threshold.yaml @@ -0,0 +1,109 @@ +description: Massachusetts treats business losses above business income plus this threshold as an excess business loss, under Section 461(l) of the Code as Massachusetts adopts it; only joint returns receive twice the nonjoint threshold. +metadata: + propagate_metadata_to_children: true + label: Massachusetts excess business loss threshold + breakdown: + - filing_status + unit: currency-USD + period: year + reference: + - title: M.G.L. c. 62, s. 1(c), definition of Code (as amended on January 1, 2024) + href: https://malegislature.gov/Laws/GeneralLaws/PartI/TitleIX/Chapter62/Section1 + - title: TIR 26-4, Massachusetts Conformity to Certain Provisions in Public Law No. 119-21 (Sec. 70601, no conformity) + href: https://www.mass.gov/technical-information-release/tir-26-4-massachusetts-conformity-to-certain-provisions-in-public-law-no-119-21 + - title: Revenue Procedure 2021-45, section 3.32 (2022 threshold) + href: https://www.irs.gov/pub/irs-drop/rp-21-45.pdf#page=19 + - title: Revenue Procedure 2022-38, section 3.32 (2023 threshold) + href: https://www.irs.gov/pub/irs-drop/rp-22-38.pdf#page=18 + - title: Revenue Procedure 2023-34, section 3.32 (2024 threshold) + href: https://www.irs.gov/pub/irs-drop/rp-23-34.pdf#page=17 + - title: Revenue Procedure 2024-40, section 2.32 (2025 threshold) + href: https://www.irs.gov/pub/irs-drop/rp-24-40.pdf#page=17 + - title: 2022 Form 1 instructions, Schedule X, line 6 Excess Business Loss Adjustment + href: https://web.archive.org/web/20230616200742/https://www.mass.gov/doc/2022-form-1-instructions/download#page=20 + - title: 2024 Form 1 instructions, Schedule X, line 6 Excess Business Loss Adjustment + href: https://www.mass.gov/doc/2024-form-1-instructions/download#page=20 + - title: 2025 Form 1 instructions, Schedule X, line 6 Excess Business Loss Adjustment + href: https://www.mass.gov/doc/2025-form-1-instructions/download#page=21 +# Through 2025 the Massachusetts threshold is the federal threshold: Schedule X, +# line 6 is the excess business loss on U.S. Form 1040, Schedule 1, line 8p. +# The 2023 Form 1 instructions still print $270,000 / $540,000, but line 8p +# uses the 2023 federal $289,000 / $578,000 (Rev. Proc. 2022-38). +# From 2026 the federal threshold uses the OBBBA reset ($256,000 / $512,000, +# Rev. Proc. 2025-32, section 4.31), which Massachusetts does not adopt +# (TIR 26-4). The 2026 values follow Section 461(l)(3)(C) as of January 1, +# 2024: $250,000 times the Section 1(f)(3) cost-of-living adjustment with +# "2017" for "2016" (average C-CPI-U for the 12 months ending August 31), +# rounded to the nearest $1,000. 250,000 x 177.1137 / 138.2368 = 320,309, +# so $320,000 ($640,000 joint). The same computation gives every published +# figure for 2022-2025 (269,580; 289,140; 304,634; 313,038). The Department +# of Revenue has not printed a 2026 figure (TIR 26-4; 2025 Form 1 +# instructions, page 21). 320,309 is about $200 below the 320,500 rounding +# boundary, so a different CPI series could give $321,000. +HEAD_OF_HOUSEHOLD: + metadata: + uprating: + parameter: gov.irs.uprating + rounding: + type: nearest + interval: 1_000 + values: + 2022-01-01: 270_000 + 2023-01-01: 289_000 + 2024-01-01: 305_000 + 2025-01-01: 313_000 + 2026-01-01: 320_000 +JOINT: + metadata: + uprating: + parameter: gov.irs.uprating + rounding: + # Twice the rounded nonjoint threshold under section 461(l)(3). + type: nearest + interval: 2_000 + values: + 2022-01-01: 540_000 + 2023-01-01: 578_000 + 2024-01-01: 610_000 + 2025-01-01: 626_000 + 2026-01-01: 640_000 +SEPARATE: + metadata: + uprating: + parameter: gov.irs.uprating + rounding: + type: nearest + interval: 1_000 + values: + 2022-01-01: 270_000 + 2023-01-01: 289_000 + 2024-01-01: 305_000 + 2025-01-01: 313_000 + 2026-01-01: 320_000 +SINGLE: + metadata: + uprating: + parameter: gov.irs.uprating + rounding: + type: nearest + interval: 1_000 + values: + 2022-01-01: 270_000 + 2023-01-01: 289_000 + 2024-01-01: 305_000 + 2025-01-01: 313_000 + 2026-01-01: 320_000 +SURVIVING_SPOUSE: + metadata: + uprating: + parameter: gov.irs.uprating + rounding: + type: nearest + interval: 1_000 + # Section 461(l)(3)(A) doubles the threshold only for a joint return. + values: + 2022-01-01: 270_000 + 2023-01-01: 289_000 + 2024-01-01: 305_000 + 2025-01-01: 313_000 + 2026-01-01: 320_000 diff --git a/policyengine_us/tests/policy/baseline/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/excess_business_loss.yaml b/policyengine_us/tests/policy/baseline/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/excess_business_loss.yaml new file mode 100644 index 00000000000..198e0945d8f --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/excess_business_loss.yaml @@ -0,0 +1,82 @@ +- name: An S corporation loss above the 2022 joint threshold is an excess business loss + period: 2022 + input: + people: + head: + age: 50 + partnership_s_corp_income: -1_000_000 + spouse: + age: 50 + tax_units: + tax_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: TX + output: + net_business_loss: 1_000_000 + # 1,000,000 - 540,000 (Rev. Proc. 2021-45) + excess_business_loss: 460_000 + loss_ald: 540_000 + +- name: Business income of the other spouse raises the allowed loss + period: 2022 + input: + people: + head: + age: 50 + partnership_s_corp_income: -1_000_000 + spouse: + age: 50 + self_employment_income: 200_000 + tax_units: + tax_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: TX + output: + # 1,000,000 - (200,000 + 540,000) + excess_business_loss: 260_000 + +- name: No excess business loss below the 2025 single threshold + period: 2025 + input: + people: + head: + age: 50 + self_employment_income: -300_000 + tax_units: + tax_unit: + members: [head] + households: + household: + members: [head] + state_code: TX + output: + # The 2025 single threshold is $313,000 (Form 461, line 15). + excess_business_loss: 0 + +- name: A dependent's business loss is on their own return + period: 2022 + input: + people: + head: + age: 50 + partnership_s_corp_income: -400_000 + dependent: + age: 20 + is_tax_unit_dependent: true + partnership_s_corp_income: -500_000 + tax_units: + tax_unit: + members: [head, dependent] + households: + household: + members: [head, dependent] + state_code: TX + output: + # 400,000 - 270,000 + excess_business_loss: 130_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.yaml b/policyengine_us/tests/policy/baseline/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.yaml new file mode 100644 index 00000000000..26fa9401fa3 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.yaml @@ -0,0 +1,210 @@ +# Massachusetts adds the federal excess business loss (Schedule 1, line 8p) +# back to 5.0% income from 2022 (Schedule X, line 6). From 2026 the loss is +# measured against the Massachusetts threshold, not the OBBBA-reset federal +# one, and the add-back ends after 2028. The interest is Massachusetts bank +# interest, so it is 5.0% income. + +- name: 2022 joint return adds back the loss above $540,000 + period: 2022 + absolute_error_margin: 0.01 + input: + people: + head: + age: 50 + taxable_interest_income: 2_000_000 + partnership_s_corp_income: -1_000_000 + spouse: + age: 50 + tax_units: + tax_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: MA + output: + ma_excess_business_loss_adjustment: 460_000 + # 2,000,000 - 1,000,000 + 460,000 + ma_gross_income: 1_460_000 + # 1,460,000 - 200 bank interest exemption - 8,800 exemption + ma_part_b_taxable_income: 1_451_000 + ma_income_tax_before_credits: 72_550 + +- name: 2022 single return adds back the loss above $270,000 + period: 2022 + absolute_error_margin: 0.01 + input: + people: + head: + age: 50 + taxable_interest_income: 2_000_000 + partnership_s_corp_income: -1_000_000 + tax_units: + tax_unit: + members: [head] + households: + household: + members: [head] + state_code: MA + output: + ma_excess_business_loss_adjustment: 730_000 + # 2,000,000 - 270,000 - 100 bank interest exemption - 4,400 exemption + ma_part_b_taxable_income: 1_725_500 + +- name: 2024 joint return uses the $610,000 threshold + period: 2024 + absolute_error_margin: 0.01 + input: + people: + head: + age: 50 + taxable_interest_income: 2_000_000 + partnership_s_corp_income: -1_000_000 + spouse: + age: 50 + tax_units: + tax_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: MA + output: + ma_excess_business_loss_adjustment: 390_000 + # 2,000,000 - 610,000 - 8,800 exemption (no bank interest exemption from 2024) + ma_part_b_taxable_income: 1_381_200 + +- name: No add-back in 2021, before the Code Update + period: 2021 + absolute_error_margin: 0.01 + input: + people: + head: + age: 50 + taxable_interest_income: 2_000_000 + partnership_s_corp_income: -1_000_000 + spouse: + age: 50 + tax_units: + tax_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: MA + output: + ma_excess_business_loss_adjustment: 0 + # 2,000,000 - 1,000,000 - 200 - 8,800 + ma_part_b_taxable_income: 991_000 + +- name: 2023 single return with a loss equal to the $289,000 threshold adds back nothing + period: 2023 + absolute_error_margin: 0.01 + input: + people: + head: + age: 50 + self_employment_income: -289_000 + tax_units: + tax_unit: + members: [head] + households: + household: + members: [head] + state_code: MA + output: + # 289,000 - 289,000 (Rev. Proc. 2022-38, section 3.32) = 0. Schedule X, + # line 6 is the line 8p amount, although the 2023 instructions print + # $270,000, which would give 19,000. + excess_business_loss: 0 + ma_excess_business_loss_adjustment: 0 + +- name: 2026 single return with a loss equal to the $320,000 Massachusetts threshold adds back nothing + period: 2026 + absolute_error_margin: 0.01 + input: + people: + head: + age: 50 + self_employment_income: -320_000 + tax_units: + tax_unit: + members: [head] + households: + household: + members: [head] + state_code: MA + output: + # Federal: 320,000 - 256,000 (Rev. Proc. 2025-32, section 4.31) + excess_business_loss: 64_000 + # Massachusetts: 320,000 - 320,000 = 0 (no OBBBA reset, TIR 26-4) + ma_excess_business_loss_adjustment: 0 + +- name: 2026 single return with wages and a Schedule C loss below the Massachusetts threshold + period: 2026 + absolute_error_margin: 0.01 + input: + people: + head: + age: 50 + employment_income: 500_000 + self_employment_income: -300_000 + tax_units: + tax_unit: + members: [head] + households: + household: + members: [head] + state_code: MA + output: + # Federal: 300,000 - 256,000 + excess_business_loss: 44_000 + # Massachusetts: 300,000 is below 320,000. + ma_excess_business_loss_adjustment: 0 + # 500,000 wages - 300,000 Form 1, line 6a loss + 0 + ma_gross_income: 200_000 + +- name: 2026 joint return adds back the loss above $640,000 + period: 2026 + absolute_error_margin: 0.01 + input: + people: + head: + age: 50 + partnership_s_corp_income: -1_000_000 + spouse: + age: 50 + tax_units: + tax_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: MA + output: + # Federal: 1,000,000 - 512,000 + excess_business_loss: 488_000 + # Massachusetts: 1,000,000 - 640,000 + ma_excess_business_loss_adjustment: 360_000 + +- name: No add-back from 2029, after the limitation ends + period: 2029 + absolute_error_margin: 0.01 + input: + people: + head: + age: 50 + partnership_s_corp_income: -1_000_000 + spouse: + age: 50 + tax_units: + tax_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: MA + output: + # The Code as amended on January 1, 2024 limits excess business losses + # through the 2028 taxable year (TIR 24-14). + ma_excess_business_loss_adjustment: 0 diff --git a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/excess_business_loss.py b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/excess_business_loss.py new file mode 100644 index 00000000000..2ffe5180fe1 --- /dev/null +++ b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/excess_business_loss.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class excess_business_loss(Variable): + value_type = float + entity = TaxUnit + label = "Excess business loss" + unit = USD + documentation = ( + "Business losses above business income plus the Section 461(l) " + "threshold, which loss_ald does not deduct (Form 461, line 16; " + "Form 1040, Schedule 1, line 8p)." + ) + definition_period = YEAR + reference = ( + "https://www.law.cornell.edu/uscode/text/26/461#l", + "https://www.irs.gov/pub/irs-prior/f461--2025.pdf", + ) + + def formula(tax_unit, period, parameters): + filing_status = tax_unit("filing_status", period) + threshold = parameters(period).gov.irs.ald.loss.max[filing_status] + net_business_loss = tax_unit("net_business_loss", period) + return max_(0, net_business_loss - threshold) diff --git a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/net_business_loss.py b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/net_business_loss.py new file mode 100644 index 00000000000..43268f9c73e --- /dev/null +++ b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/net_business_loss.py @@ -0,0 +1,37 @@ +from policyengine_us.model_api import * + + +class net_business_loss(Variable): + value_type = float + entity = TaxUnit + label = "Net business loss" + unit = USD + documentation = ( + "Aggregate business deductions above aggregate business income and " + "gains, before the Section 461(l) threshold (Form 461, line 14, as a " + "positive amount)." + ) + definition_period = YEAR + reference = ( + "https://www.law.cornell.edu/uscode/text/26/461#l_3_A", + "https://www.irs.gov/pub/irs-prior/f461--2025.pdf", + ) + + def formula(tax_unit, period, parameters): + # The same head and spouse business items as loss_ald. The excess of + # aggregate business deductions over aggregate business income is + # the negative of their net total. + net_business_income = tax_unit_non_dep_add( + tax_unit, + period, + [ + "total_self_employment_income", + "farm_operations_income", + "rental_income", + "farm_rent_income", + "estate_income", + "partnership_s_corp_income", + "other_net_gain", + ], + ) + return max_(0, -net_business_income) diff --git a/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.py b/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.py new file mode 100644 index 00000000000..1cf161eb6db --- /dev/null +++ b/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_excess_business_loss_adjustment.py @@ -0,0 +1,30 @@ +from policyengine_us.model_api import * + + +class ma_excess_business_loss_adjustment(Variable): + value_type = float + entity = TaxUnit + label = "MA excess business loss adjustment" + documentation = ( + "Massachusetts Schedule X, line 6: the excess business loss under " + "Section 461(l) as Massachusetts adopts it, added back to 5.0% income." + ) + unit = USD + definition_period = YEAR + reference = ( + "https://www.mass.gov/doc/2024-form-1-instructions/download#page=20", + "https://www.mass.gov/doc/2025-form-1-instructions/download#page=21", + "https://www.mass.gov/technical-information-release/tir-26-4-massachusetts-conformity-to-certain-provisions-in-public-law-no-119-21", + ) + defined_for = StateCode.MA + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.ma.tax.income.excess_business_loss + filing_status = tax_unit("filing_status", period) + # Through 2025 this is the federal excess business loss (Form 1040, + # Schedule 1, line 8p). Massachusetts does not adopt the OBBBA + # threshold reset from 2026, so the loss is measured against the + # Massachusetts threshold. + net_business_loss = tax_unit("net_business_loss", period) + excess_business_loss = max_(0, net_business_loss - p.threshold[filing_status]) + return p.in_effect * excess_business_loss diff --git a/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_gross_income.py b/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_gross_income.py index 02d305f5263..ca107287104 100644 --- a/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_gross_income.py +++ b/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_gross_income.py @@ -20,6 +20,8 @@ def formula(tax_unit, period, parameters): federal_gross_income = add(tax_unit, period, ["irs_gross_income"]) # Add back lines 6/7 losses dropped by irs_gross_income. loss_adjustment = tax_unit("ma_gross_income_loss_adjustment", period) + # Add back the excess business loss (Schedule X, line 6). + excess_business_loss = tax_unit("ma_excess_business_loss_adjustment", period) # Under M.G.L. c. 62 ยง 2(a)(1)(C), earned income from foreign sources # excluded under section 911 of the Code is added to MA gross income. # It is neither interest, dividends nor capital gains, so the Part B @@ -47,5 +49,9 @@ def formula(tax_unit, period, parameters): deductions = social_security_in_agi + salt_refund_income + public_pension return max_( 0, - federal_gross_income + loss_adjustment + foreign_earned_income - deductions, + federal_gross_income + + loss_adjustment + + excess_business_loss + + foreign_earned_income + - deductions, )