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
1 change: 1 addition & 0 deletions changelog.d/fix-educator-expense-cap.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Cap the federal educator expense deduction at each eligible educator's limit under 26 U.S.C. 62(a)(2)(D) and (d)(3): $250 through 2021, $300 for 2022 through 2025 and $350 for 2026, indexed after that. On a joint return each spouse is capped separately, and a tax unit dependent's expenses stay off the filer's return. Previously the raw expense input was deducted in full.
8 changes: 4 additions & 4 deletions policyengine_us/parameters/gov/irs/ald/deductions.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ values:
- student_loan_interest_ald
- early_withdrawal_penalty
- alimony_expense_ald
- educator_expense
- educator_expense_ald
- capped_qualified_tuition_expenses_ald
- domestic_production_ald
- health_savings_account_ald
Expand All @@ -23,7 +23,7 @@ values:
- student_loan_interest_ald
- early_withdrawal_penalty
- alimony_expense_ald
- educator_expense
- educator_expense_ald
- capped_qualified_tuition_expenses_ald
- health_savings_account_ald
- self_employed_health_insurance_ald
Expand All @@ -39,7 +39,7 @@ values:
- student_loan_interest_ald
- early_withdrawal_penalty
- alimony_expense_ald
- educator_expense
- educator_expense_ald
- health_savings_account_ald
- self_employed_health_insurance_ald
- self_employed_pension_contribution_ald
Expand All @@ -54,7 +54,7 @@ values:
- student_loan_interest_ald
- early_withdrawal_penalty
- alimony_expense_ald
- educator_expense
- educator_expense_ald
- health_savings_account_ald
- self_employed_health_insurance_ald
- self_employed_pension_contribution_ald
Expand Down
61 changes: 61 additions & 0 deletions policyengine_us/parameters/gov/irs/ald/educator_expense/cap.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
description: The IRS caps the educator expense deduction at this amount for each eligible educator.
values:
# 26 USC 62(a)(2)(D), added for 2002 by Pub. L. 107-147 and extended
# retroactively through 2015, when Pub. L. 114-113 made it permanent and
# indexed it from 2016 (26 USC 62(d)(3)).
2002-01-01: 250
2016-01-01: 250
2017-01-01: 250
2018-01-01: 250
2019-01-01: 250
2020-01-01: 250
2021-01-01: 250
2022-01-01: 300
2023-01-01: 300
2024-01-01: 300
2025-01-01: 300
2026-01-01: 350
metadata:
unit: currency-USD
period: year
label: Educator expense deduction cap
# Values after the last IRS publication are computed in
# parameters/uprating_extensions.py per 26 U.S.C. 62(d)(3): the statutory
# $250 increased by the 1(f)(3) cost-of-living adjustment with calendar
# year 2014 as the base year, each increase rounded to the nearest multiple
# of $50. Computing from the $250 base rather than chaining from the
# rounded $350 puts each projected $50 step in the year the statute does on
# the model's CPI projection; those values supersede this uprating rule,
# which describes the index and rounding.
uprating:
parameter: gov.irs.uprating
rounding:
type: nearest
interval: 50
reference:
- title: 26 U.S. Code § 62(a)(2)(D) - Educator expenses
href: https://www.law.cornell.edu/uscode/text/26/62#a_2_D
- title: 26 U.S. Code § 62(d)(3) - Inflation adjustment
href: https://www.law.cornell.edu/uscode/text/26/62#d_3
- title: 2016 Form 1040 instructions, line 23, educator expenses (2016)
href: https://www.irs.gov/pub/irs-prior/i1040gi--2016.pdf#page=31
- title: Rev. Proc. 2016-55, section 3.12 (2017)
href: https://www.irs.gov/pub/irs-drop/rp-16-55.pdf#page=14
- title: Rev. Proc. 2017-58, section 3.12 (2018)
href: https://www.irs.gov/pub/irs-drop/rp-17-58.pdf#page=12
- title: Rev. Proc. 2018-57, section 3.14 (2019)
href: https://www.irs.gov/pub/irs-drop/rp-18-57.pdf#page=15
- title: Rev. Proc. 2019-44, section 3.14 (2020)
href: https://www.irs.gov/pub/irs-drop/rp-19-44.pdf#page=12
- title: Rev. Proc. 2020-45, section 3.14 (2021)
href: https://www.irs.gov/pub/irs-drop/rp-20-45.pdf#page=12
- title: Rev. Proc. 2021-45, section 3.13 (2022)
href: https://www.irs.gov/pub/irs-drop/rp-21-45.pdf#page=13
- title: Rev. Proc. 2022-38, section 3.13 (2023)
href: https://www.irs.gov/pub/irs-drop/rp-22-38.pdf#page=12
- title: Rev. Proc. 2023-34, section 3.13 (2024)
href: https://www.irs.gov/pub/irs-drop/rp-23-34.pdf#page=11
- title: Rev. Proc. 2024-40, section 2.13 (2025)
href: https://www.irs.gov/pub/irs-drop/rp-24-40.pdf#page=11
- title: Rev. Proc. 2025-32, section 4.12 (2026)
href: https://www.irs.gov/pub/irs-drop/rp-25-32.pdf#page=17
37 changes: 37 additions & 0 deletions policyengine_us/parameters/uprating_extensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,38 @@ def extend_dependent_standard_deduction_parameters(
)


# 26 U.S.C. 62(d)(3) indexing of the 62(a)(2)(D) educator expense cap:
# statutory dollar amount and 1(f)(3) base year.
EDUCATOR_EXPENSE_CAP_STATUTORY_BASE = (250, 2014)


def extend_educator_expense_cap(parameters: ParameterNode, end_year: int) -> None:
"""Project the per-educator cap on the educator expense deduction.

26 U.S.C. 62(d)(3) increases the $250 amount in 62(a)(2)(D) by the
1(f)(3) cost-of-living adjustment, substituting calendar year 2014 for
2016, and rounds the increase to the nearest multiple of $50. Each year
is computed from the statutory base rather than chained from the last
rounded value, which can put a $50 step a year or more early or late;
IRS values encoded in the YAML take precedence for their own years.
"""
ROUNDING_INTERVAL = 50
base, base_year = EDUCATOR_EXPENSE_CAP_STATUTORY_BASE
cap = parameters.gov.irs.ald.educator_expense.cap
first_projected_year = 1 + max(
int(value.instant_str[:4]) for value in cap.values_list
)
for year in range(first_projected_year, end_year + 1):
cola = get_irs_cola(parameters, year, base_year)
# Nearest multiple of $50; an exact half rounds up.
increase = math.floor(base * cola / ROUNDING_INTERVAL + 0.5) * ROUNDING_INTERVAL
cap.update(period=f"year:{year}-01-01:1", value=float(base + increase))
cap.update(
start=instant(f"{end_year}-01-01"),
value=cap(f"{end_year}-01-01"),
)


def extend_or_ctc_parameters(parameters: ParameterNode, end_year: int) -> None:
"""Project the Oregon Kids' Credit amount and phase-out start.

Expand Down Expand Up @@ -810,4 +842,9 @@ def set_all_uprating_parameters(parameters: ParameterNode) -> ParameterNode:
# projected windows are available.
extend_dependent_standard_deduction_parameters(parameters, end_year=END_YEAR)

# The educator expense cap follows 26 U.S.C. 62(d)(3)'s chained CPI-U
# schedule, computed from the statutory $250 and 2014 base year. Must run
# after the Chained CPI-U extension above.
extend_educator_expense_cap(parameters, end_year=END_YEAR)

return parameters
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@
"alimony_expense_ald_person",
"student_loan_interest_ald",
"early_withdrawal_penalty",
"educator_expense",
"educator_expense_ald_person",
"traditional_ira_contributions",
]
# Person-level amounts that are the filer's wherever they are recorded.
Expand All @@ -82,6 +82,7 @@
"self_employed_health_insurance_ald": "self_employed_health_insurance_ald_person",
"self_employed_pension_contribution_ald": "self_employed_pension_contribution_ald_person",
"alimony_expense_ald": "alimony_expense_ald_person",
"educator_expense_ald": "educator_expense_ald_person",
}
TAX_UNIT_OUTPUTS = [
"adjusted_gross_income",
Expand Down
Loading
Loading