From 0df449be16904d9bed41ce2de84eea6989d9b954 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Tue, 6 Oct 2026 12:18:56 -0400 Subject: [PATCH] Subtract each spouse's Massachusetts business losses irs_gross_income floors each source at zero for each person, but the Massachusetts loss adjustment netted each source across the head and spouse before taking the loss, so one spouse's Schedule C loss was lost when the other spouse had Schedule C income. Fixes #9909 Co-Authored-By: Claude Opus 5.5 --- .../ma-loss-adjustment-per-person.fixed.md | 1 + .../ma_gross_income_loss_adjustment.yaml | 47 +++++++++++++++++++ .../ma_gross_income_loss_adjustment.py | 40 ++++++++-------- 3 files changed, 68 insertions(+), 20 deletions(-) create mode 100644 changelog.d/ma-loss-adjustment-per-person.fixed.md diff --git a/changelog.d/ma-loss-adjustment-per-person.fixed.md b/changelog.d/ma-loss-adjustment-per-person.fixed.md new file mode 100644 index 00000000000..75cfa24ad46 --- /dev/null +++ b/changelog.d/ma-loss-adjustment-per-person.fixed.md @@ -0,0 +1 @@ +Subtract each spouse's Massachusetts Schedule C, farm, rental, partnership and S corporation losses, so one spouse's loss offsets the other spouse's income. diff --git a/policyengine_us/tests/policy/baseline/gov/states/ma/tax/income/ma_gross_income_loss_adjustment.yaml b/policyengine_us/tests/policy/baseline/gov/states/ma/tax/income/ma_gross_income_loss_adjustment.yaml index 29b26502099..4915ae2935f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ma/tax/income/ma_gross_income_loss_adjustment.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ma/tax/income/ma_gross_income_loss_adjustment.yaml @@ -31,3 +31,50 @@ # parent's wages (line 3) plus rental income (line 7). ma_gross_income_loss_adjustment: 0 ma_gross_income: 42_000 + +- name: One spouse's Schedule C loss offsets the other spouse's Schedule C income + period: 2022 + absolute_error_margin: 0.01 + input: + people: + head: + age: 40 + employment_income: 40_000 + self_employment_income: -20_000 + spouse: + age: 40 + self_employment_income: 50_000 + tax_units: + tax_unit: + members: [head, spouse] + households: + household: + members: [head, spouse] + state_code: MA + output: + ma_gross_income_loss_adjustment: -20_000 + # 40,000 + 50,000 - 20,000 + ma_gross_income: 70_000 + # Matches NBER TAXSIM-35 staxbc for the same return. + ma_income_tax_before_credits: 2_860 + +- name: An SSTB Schedule C loss offsets the same person's other Schedule C income + period: 2024 + absolute_error_margin: 0.01 + input: + people: + head: + age: 40 + employment_income: 40_000 + self_employment_income: 30_000 + sstb_self_employment_income: -10_000 + tax_units: + tax_unit: + members: [head] + households: + household: + members: [head] + state_code: MA + output: + ma_gross_income_loss_adjustment: -10_000 + ma_gross_income: 60_000 diff --git a/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_gross_income_loss_adjustment.py b/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_gross_income_loss_adjustment.py index c09ea512110..0e1c5f14747 100644 --- a/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_gross_income_loss_adjustment.py +++ b/policyengine_us/variables/gov/states/ma/tax/income/gross_income/ma_gross_income_loss_adjustment.py @@ -13,27 +13,27 @@ class ma_gross_income_loss_adjustment(Variable): def formula(tax_unit, period, parameters): # MA Form 1 allows losses on lines 6a, 6b, and 7 to offset # other 5.0% income. irs_gross_income floors each source at - # zero, so this variable captures the losses that were dropped. + # zero for each person, so this variable captures the losses that + # were dropped, person by person: one spouse's loss offsets the + # other spouse's income on the joint return. # Line 10 instruction: "Be sure to subtract any losses # in lines 6 or 7." # irs_gross_income leaves out tax unit dependents, whose items are # on their own returns, so their losses are left out here too. - # Line 6a: Business/profession loss (Schedule C) - se_income = tax_unit_non_dep_add( - tax_unit, period, ["total_self_employment_income"] - ) - # Line 6b: Farm loss (Schedule F) - farm = tax_unit_non_dep_add(tax_unit, period, ["farm_operations_income"]) - # Line 7: Rental, partnership, S-corp, farm rent losses - rental = tax_unit_non_dep_add(tax_unit, period, ["rental_income"]) - partnership = tax_unit_non_dep_add( - tax_unit, period, ["partnership_s_corp_income"] - ) - farm_rent = tax_unit_non_dep_add(tax_unit, period, ["farm_rent_income"]) - return ( - min_(se_income, 0) - + min_(farm, 0) - + min_(rental, 0) - + min_(partnership, 0) - + min_(farm_rent, 0) - ) + person = tax_unit.members + not_dependent = ~person("is_tax_unit_dependent", period) + sources = [ + # Line 6a: Business/profession loss (Schedule C) + "self_employment_income", + "sstb_self_employment_income", + # Line 6b: Farm loss (Schedule F) + "farm_operations_income", + # Line 7: Rental, partnership, S-corp, farm rent losses + "rental_income", + "partnership_s_corp_income", + "farm_rent_income", + ] + losses = 0 + for source in sources: + losses += tax_unit.sum(not_dependent * min_(person(source, period), 0)) + return losses