Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

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

- name: 2 Test that NJ AGI cannot be negative
period: 2021
input:
adjusted_gross_income: 10_000
nj_additions: 1_000
nj_agi_subtractions: 20_000
employment_income: [5_000]
taxable_interest_income: [5_000]
state_code: NJ
output:
nj_agi: 0
nj_total_income: 10_000
nj_agi: 10_000

- name: 3 NJ taxpayer with taxable pension income
absolute_error_margin: 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,14 @@
class nj_additions(Variable):
value_type = float
entity = Person
label = "New Jersey additions to federal AGI by person"
label = "New Jersey additions to gross income"
unit = USD
documentation = "Additions to federal AGI to get NJ total income."
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."
definition_period = YEAR
reference = "https://law.justia.com/codes/new-jersey/2022/title-54/section-54-8a-36/"
reference = (
"https://law.justia.com/codes/new-jersey/title-54a/section-54a-5-1/",
"https://www.nj.gov/treasury/taxation/pdf/current/1040.pdf", # Lines 28-38
)
defined_for = StateCode.NJ

adds = "gov.states.nj.tax.income.additions"
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from policyengine_us.model_api import *


class nj_gross_income(Variable):
value_type = float
entity = Person
label = "New Jersey gross income"
unit = USD
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."
definition_period = YEAR
reference = (
"https://law.justia.com/codes/new-jersey/title-54a/section-54a-5-1/",
"https://www.nj.gov/treasury/taxation/pdf/current/1040.pdf", # Lines 15-27
)
defined_for = StateCode.NJ

adds = "gov.states.nj.tax.income.gross_income_sources"
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,20 @@
class nj_total_income(Variable):
value_type = float
entity = Person
label = "New Jersey total income by person"
label = "New Jersey total income"
unit = USD
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."
definition_period = YEAR
reference = "https://law.justia.com/codes/new-jersey/2022/title-54/section-54-8a-36/"
reference = (
"https://law.justia.com/codes/new-jersey/title-54a/section-54a-5-1/",
"https://www.nj.gov/treasury/taxation/pdf/current/1040.pdf",
)
defined_for = StateCode.NJ

def formula(person, period, parameters):
agi = person("adjusted_gross_income_person", period)
nj_additions = person("nj_additions", period)
nj_subtractions = person("nj_agi_subtractions", period)
return max_(0, agi + nj_additions - nj_subtractions)
# NJ Total Income = Gross Income + Additions - Subtractions
# Per NJ Statute 54A:5-1 and Form NJ-1040
gross_income = person("nj_gross_income", period)
additions = person("nj_additions", period)
subtractions = person("nj_agi_subtractions", period)
return max_(0, gross_income + additions - subtractions)