Skip to content

Commit 196530e

Browse files
Limit reported SALT to the amount that would zero out regular tax liability
Fixes #5899
1 parent eb5e283 commit 196530e

File tree

9 files changed

+108
-62
lines changed

9 files changed

+108
-62
lines changed

changelog_entry.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
- bump: minor
2+
changes:
3+
added:
4+
- Limit reported SALT to the amount that would zero out regular tax liability.
5+
- Create SALT and reported SALT variables.
6+
fixes:
7+
- Remove itemized deductions limitation at taxable income.

policyengine_us/reforms/salt_phase_out/salt_phase_out_reform.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,7 @@ def formula(tax_unit, period, parameters):
1616
p = parameters(
1717
period
1818
).gov.irs.deductions.itemized.salt_and_real_estate
19-
salt_amount = add(
20-
tax_unit,
21-
period,
22-
p.sources,
23-
)
19+
salt_amount = tax_unit("reported_salt", period)
2420
filing_status = tax_unit("filing_status", period)
2521
cap = p.cap[filing_status]
2622
p_ref = parameters(period).gov.contrib.salt_phase_out
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# - name: SALT capped at taxable income
2+
# period: 2023
3+
# input:
4+
# salt: 100_000
5+
# adjusted_gross_income: 100_000
6+
# exemptions: 2_000
7+
# output:
8+
# reported_salt: 98_000
9+
10+
# - name: SALT below cap
11+
# period: 2023
12+
# input:
13+
# salt: 23_000
14+
# adjusted_gross_income: 100_000
15+
# exemptions: 2_000
16+
# output:
17+
# reported_salt: 23_000
18+
19+
# - name: SALT uncapped
20+
# period: 2023
21+
# input:
22+
# gov.simulation.limit_itemized_deductions_to_taxable_income: False
23+
# salt: 100_000
24+
# adjusted_gross_income: 100_000
25+
# exemptions: 2_000
26+
# output:
27+
# reported_salt: 100_000
28+
29+
- name: Integration test with amt, limit is applied
30+
period: 2026
31+
input:
32+
gov.simulation.limit_itemized_deductions_to_taxable_income: True
33+
salt: 45_000
34+
employment_income: 40_000
35+
output:
36+
adjusted_gross_income: 40_000
37+
exemptions: 5_300
38+
reported_salt: 34_700
39+
amt_income: 40_000
40+
taxable_income: 0
41+
42+
- name: Integration test with amt, limit is not applied
43+
period: 2026
44+
input:
45+
gov.simulation.limit_itemized_deductions_to_taxable_income: False
46+
salt: 45_000
47+
employment_income: 40_000
48+
output:
49+
adjusted_gross_income: 40_000
50+
exemptions: 5_300
51+
reported_salt: 45_000
52+
amt_income: 50_300
53+
taxable_income: 0
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
- name: Capped SALT deduction
2+
period: 2023
3+
input:
4+
reported_salt: 100_000
5+
filing_status: SINGLE
6+
output:
7+
salt_deduction: 10_000
8+
9+
- name: Cap does not apply
10+
period: 2023
11+
input:
12+
reported_salt: 4_000
13+
filing_status: SINGLE
14+
output:
15+
salt_deduction: 4_000

policyengine_us/tests/policy/baseline/gov/irs/income/taxable_income/deductions/taxable_income_deductions.yaml

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -21,39 +21,3 @@
2121
exemptions: 12_000
2222
output:
2323
taxable_income_deductions: 10_000
24-
25-
- name: Unit itemizes, sim, capped itemized deductions
26-
period: 2024
27-
input:
28-
gov.simulation.limit_itemized_deductions_to_taxable_income: true
29-
tax_unit_itemizes: true
30-
taxable_income_deductions_if_itemizing: 11_000
31-
taxable_income_deductions_if_not_itemizing: 10_000
32-
adjusted_gross_income: 3_000
33-
exemptions: 1_000
34-
output:
35-
taxable_income_deductions: 2_000
36-
37-
- name: Unit itemizes, sim, un-capped itemized deductions
38-
period: 2024
39-
input:
40-
gov.simulation.limit_itemized_deductions_to_taxable_income: true
41-
tax_unit_itemizes: true
42-
taxable_income_deductions_if_itemizing: 11_000
43-
taxable_income_deductions_if_not_itemizing: 10_000
44-
adjusted_gross_income: 23_000
45-
exemptions: 1_000
46-
output:
47-
taxable_income_deductions: 11_000
48-
49-
- name: Unit does not itemize, sim, un-capped itemized deductions
50-
period: 2024
51-
input:
52-
gov.simulation.limit_itemized_deductions_to_taxable_income: true
53-
tax_unit_itemizes: false
54-
taxable_income_deductions_if_itemizing: 11_000
55-
taxable_income_deductions_if_not_itemizing: 10_000
56-
adjusted_gross_income: 1_000
57-
exemptions: 1_000
58-
output:
59-
taxable_income_deductions: 10_000
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from policyengine_us.model_api import *
2+
3+
4+
class reported_salt(Variable):
5+
value_type = float
6+
entity = TaxUnit
7+
definition_period = YEAR
8+
label = "Reported State and local sales or income tax and real estate taxes subject to the SALT deduction limited to taxable income"
9+
unit = USD
10+
11+
def formula(tax_unit, period, parameters):
12+
salt = tax_unit("salt", period)
13+
p = parameters(period).gov.simulation
14+
if p.limit_itemized_deductions_to_taxable_income:
15+
agi = tax_unit("adjusted_gross_income", period)
16+
exemptions = tax_unit("exemptions", period)
17+
agi_less_exemptions = max_(0, agi - exemptions)
18+
return min_(salt, agi_less_exemptions)
19+
return salt
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from policyengine_us.model_api import *
2+
3+
4+
class salt(Variable):
5+
value_type = float
6+
entity = TaxUnit
7+
definition_period = YEAR
8+
label = "State and local sales or income tax and real estate taxes subject to the SALT deduction"
9+
unit = USD
10+
11+
adds = "gov.irs.deductions.itemized.salt_and_real_estate.sources"

policyengine_us/variables/gov/irs/income/taxable_income/deductions/itemizing/salt_deduction.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,6 @@ class salt_deduction(Variable):
1212

1313
def formula(tax_unit, period, parameters):
1414
p = parameters(period).gov.irs.deductions.itemized.salt_and_real_estate
15-
salt_amount = add(
16-
tax_unit,
17-
period,
18-
p.sources,
19-
)
15+
reported_salt = tax_unit("reported_salt", period)
2016
cap = p.cap[tax_unit("filing_status", period)]
21-
return min_(cap, salt_amount)
17+
return min_(cap, reported_salt)

policyengine_us/variables/gov/irs/income/taxable_income/deductions/taxable_income_deductions.py

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,6 @@ def formula(tax_unit, period, parameters):
1616
deductions_if_not_itemizing = tax_unit(
1717
"taxable_income_deductions_if_not_itemizing", period
1818
)
19-
# Limiting itemized deductions to taxable income, if itemizing
20-
p = parameters(period).gov.simulation
21-
if p.limit_itemized_deductions_to_taxable_income:
22-
agi = tax_unit("adjusted_gross_income", period)
23-
exemptions = tax_unit("exemptions", period)
24-
itemizes = tax_unit("tax_unit_itemizes", period)
25-
agi_less_exemptions = max_(0, agi - exemptions)
26-
capped_deductions_if_itemizing = min_(
27-
deductions_if_itemizing, agi_less_exemptions
28-
)
29-
return where(
30-
itemizes,
31-
capped_deductions_if_itemizing,
32-
deductions_if_not_itemizing,
33-
)
3419
return where(
3520
itemizes, deductions_if_itemizing, deductions_if_not_itemizing
3621
)

0 commit comments

Comments
 (0)