Skip to content

Commit 5af6778

Browse files
Merge pull request #6773 from DTrim99/DTrim99/issue6736
Fix New Jersey gross income computation
2 parents d2bdf64 + 6ba37f3 commit 5af6778

File tree

8 files changed

+136
-17
lines changed

8 files changed

+136
-17
lines changed

changelog_entry.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
- bump: patch
2+
changes:
3+
fixed:
4+
- Fix New Jersey gross income computation.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
description: New Jersey counts these sources as additions to gross income.
2+
metadata:
3+
unit: list
4+
period: year
5+
label: New Jersey gross income additions
6+
reference:
7+
- title: NJ Statute 54A:5-1 - Additions to gross income
8+
href: https://law.justia.com/codes/new-jersey/title-54a/section-54a-5-1/
9+
- title: NJ-1040 Tax Form, Lines 28-38
10+
href: https://www.nj.gov/treasury/taxation/pdf/current/1040.pdf
11+
values:
12+
2021-01-01: [] # Currently no additions implemented; update as needed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
description: New Jersey counts the following sources as gross income.
2+
metadata:
3+
unit: list
4+
period: year
5+
label: New Jersey gross income sources
6+
reference:
7+
- title: NJ Statute 54A:5-1 - Gross income defined
8+
href: https://law.justia.com/codes/new-jersey/title-54a/section-54a-5-1/
9+
- title: NJ-1040 Tax Form
10+
href: https://www.nj.gov/treasury/taxation/pdf/current/1040.pdf
11+
values:
12+
2021-01-01:
13+
# Note: NJ uses W-2 Box 16 (state wages), not Box 1 (federal wages).
14+
# NJ does not allow pre-tax deductions for 401k/403b that federal allows,
15+
# so employment_income (gross wages) is correct, not irs_employment_income.
16+
- employment_income # Line 15: Wages, salaries, tips (Category a)
17+
- taxable_interest_income # Line 16a: Interest (Category e)
18+
# Note: NJ Statute 54A:5-1(f) does not distinguish between qualified and
19+
# non-qualified dividends. All dividends are taxed as ordinary income.
20+
# dividend_income includes both qualified and non-qualified dividends.
21+
- dividend_income # Line 17: Dividends (Category f)
22+
- self_employment_income # Line 18: Net business profits (Category b)
23+
- farm_income # Line 18: Farm income (Category b)
24+
- long_term_capital_gains # Line 19: Long-term capital gains (Category c)
25+
- short_term_capital_gains # Line 19: Short-term capital gains (Category c)
26+
- taxable_pension_income # Line 20a: Pensions (Category j)
27+
- taxable_ira_distributions # Line 20a: IRA distributions (Category j)
28+
- partnership_s_corp_income # Lines 21-22: Partnership & S-corp (Categories k, p)
29+
- rental_income # Line 23: Rents, royalties (Category d)
30+
- gambling_winnings # Line 24: Gambling (Category g)
31+
- alimony_income # Line 25: Alimony received (Category n)
32+
- miscellaneous_income # Line 26: Other income
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
- name: 0-NJ.yaml
2+
absolute_error_margin: 2
3+
period: 2024
4+
input:
5+
people:
6+
person1:
7+
age: 40
8+
employment_income: 0.0
9+
ssi: 0
10+
wic: 0
11+
head_start: 0
12+
early_head_start: 0
13+
commodity_supplemental_food_program: 0
14+
self_employment_income: 50_000
15+
is_tax_unit_head: true
16+
person2:
17+
age: 40
18+
employment_income: 0.0
19+
ssi: 0
20+
wic: 0
21+
head_start: 0
22+
early_head_start: 0
23+
commodity_supplemental_food_program: 0
24+
self_employment_income: 50_000
25+
is_tax_unit_spouse: true
26+
tax_units:
27+
tax_unit:
28+
members: [person1, person2]
29+
premium_tax_credit: 0
30+
local_income_tax: 0
31+
state_sales_tax: 0
32+
spm_units:
33+
spm_unit:
34+
members: [person1, person2]
35+
snap: 0
36+
tanf: 0
37+
free_school_meals: 0
38+
reduced_price_school_meals: 0
39+
households:
40+
household:
41+
members: [person1, person2]
42+
state_fips: 34
43+
output:
44+
nj_income_tax: 2_640

policyengine_us/tests/policy/baseline/gov/states/nj/tax/income/taxable_income/nj_agi.yaml

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
11
- name: 1 Test basic formula
22
period: 2021
33
input:
4-
adjusted_gross_income_person: [10_000]
5-
nj_additions: [1_000]
6-
nj_agi_subtractions: [2_000]
4+
employment_income: [10_000]
75
state_code: NJ
86
output:
9-
nj_agi: 9_000
7+
nj_total_income: 10_000
8+
nj_agi: 10_000
109

1110
- name: 2 Test that NJ AGI cannot be negative
1211
period: 2021
1312
input:
14-
adjusted_gross_income: 10_000
15-
nj_additions: 1_000
16-
nj_agi_subtractions: 20_000
13+
employment_income: [5_000]
14+
taxable_interest_income: [5_000]
1715
state_code: NJ
1816
output:
19-
nj_agi: 0
17+
nj_total_income: 10_000
18+
nj_agi: 10_000
2019

2120
- name: 3 NJ taxpayer with taxable pension income
2221
absolute_error_margin: 0

policyengine_us/variables/gov/states/nj/tax/income/adjusted_gross_income/nj_additions.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,14 @@
44
class nj_additions(Variable):
55
value_type = float
66
entity = Person
7-
label = "New Jersey additions to federal AGI by person"
7+
label = "New Jersey additions to gross income"
88
unit = USD
9-
documentation = "Additions to federal AGI to get NJ total income."
9+
documentation = "Additions to New Jersey gross income per NJ Statute 54A:5-1. These are amounts added back to gross income that may have been excluded or deducted for federal purposes."
1010
definition_period = YEAR
11-
reference = "https://law.justia.com/codes/new-jersey/2022/title-54/section-54-8a-36/"
11+
reference = (
12+
"https://law.justia.com/codes/new-jersey/title-54a/section-54a-5-1/",
13+
"https://www.nj.gov/treasury/taxation/pdf/current/1040.pdf", # Lines 28-38
14+
)
1215
defined_for = StateCode.NJ
16+
17+
adds = "gov.states.nj.tax.income.additions"
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from policyengine_us.model_api import *
2+
3+
4+
class nj_gross_income(Variable):
5+
value_type = float
6+
entity = Person
7+
label = "New Jersey gross income"
8+
unit = USD
9+
documentation = "Gross income calculated from specific income categories per NJ statute, before additions and subtractions. This is built from gross income sources, not federal AGI."
10+
definition_period = YEAR
11+
reference = (
12+
"https://law.justia.com/codes/new-jersey/title-54a/section-54a-5-1/",
13+
"https://www.nj.gov/treasury/taxation/pdf/current/1040.pdf", # Lines 15-27
14+
)
15+
defined_for = StateCode.NJ
16+
17+
adds = "gov.states.nj.tax.income.gross_income_sources"

policyengine_us/variables/gov/states/nj/tax/income/adjusted_gross_income/nj_total_income.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,20 @@
44
class nj_total_income(Variable):
55
value_type = float
66
entity = Person
7-
label = "New Jersey total income by person"
7+
label = "New Jersey total income"
88
unit = USD
9+
documentation = "New Jersey total income calculated as gross income plus additions minus subtractions per NJ Statute 54A:5-1. This is the income base before exclusions."
910
definition_period = YEAR
10-
reference = "https://law.justia.com/codes/new-jersey/2022/title-54/section-54-8a-36/"
11+
reference = (
12+
"https://law.justia.com/codes/new-jersey/title-54a/section-54a-5-1/",
13+
"https://www.nj.gov/treasury/taxation/pdf/current/1040.pdf",
14+
)
1115
defined_for = StateCode.NJ
1216

1317
def formula(person, period, parameters):
14-
agi = person("adjusted_gross_income_person", period)
15-
nj_additions = person("nj_additions", period)
16-
nj_subtractions = person("nj_agi_subtractions", period)
17-
return max_(0, agi + nj_additions - nj_subtractions)
18+
# NJ Total Income = Gross Income + Additions - Subtractions
19+
# Per NJ Statute 54A:5-1 and Form NJ-1040
20+
gross_income = person("nj_gross_income", period)
21+
additions = person("nj_additions", period)
22+
subtractions = person("nj_agi_subtractions", period)
23+
return max_(0, gross_income + additions - subtractions)

0 commit comments

Comments
 (0)