diff --git a/changelog.d/id-hb559-senior-deduction.added.md b/changelog.d/id-hb559-senior-deduction.added.md new file mode 100644 index 00000000000..6a0fae51447 --- /dev/null +++ b/changelog.d/id-hb559-senior-deduction.added.md @@ -0,0 +1 @@ +Added Idaho conformity to the federal enhanced senior deduction through Idaho's qualified business income and federal Schedule 1-A deduction path starting in 2025. diff --git a/policyengine_us/parameters/gov/irs/deductions/senior_deduction/amount.yaml b/policyengine_us/parameters/gov/irs/deductions/senior_deduction/amount.yaml index f7a1c9ce1e0..fba3d10ea73 100644 --- a/policyengine_us/parameters/gov/irs/deductions/senior_deduction/amount.yaml +++ b/policyengine_us/parameters/gov/irs/deductions/senior_deduction/amount.yaml @@ -1,6 +1,7 @@ description: The IRS provides a deduction for seniors of this amount. values: + 2018-01-01: 0 2025-01-01: 6_000 metadata: diff --git a/policyengine_us/parameters/gov/irs/deductions/senior_deduction/phase_out_rate/joint.yaml b/policyengine_us/parameters/gov/irs/deductions/senior_deduction/phase_out_rate/joint.yaml index ee3af732f69..443ae86f8d3 100644 --- a/policyengine_us/parameters/gov/irs/deductions/senior_deduction/phase_out_rate/joint.yaml +++ b/policyengine_us/parameters/gov/irs/deductions/senior_deduction/phase_out_rate/joint.yaml @@ -11,10 +11,12 @@ metadata: brackets: - threshold: - 2025-01-01: 0 + 2018-01-01: 0 rate: - 2025-01-01: 0 + 2018-01-01: 0 - threshold: + 2018-01-01: 150_000 2025-01-01: 150_000 rate: + 2018-01-01: 0 2025-01-01: 0.06 diff --git a/policyengine_us/parameters/gov/irs/deductions/senior_deduction/phase_out_rate/other.yaml b/policyengine_us/parameters/gov/irs/deductions/senior_deduction/phase_out_rate/other.yaml index f254d8e63c4..1a4a410ac4a 100644 --- a/policyengine_us/parameters/gov/irs/deductions/senior_deduction/phase_out_rate/other.yaml +++ b/policyengine_us/parameters/gov/irs/deductions/senior_deduction/phase_out_rate/other.yaml @@ -11,10 +11,12 @@ metadata: brackets: - threshold: - 2025-01-01: 0 + 2018-01-01: 0 rate: - 2025-01-01: 0 + 2018-01-01: 0 - threshold: + 2018-01-01: 75_000 2025-01-01: 75_000 rate: + 2018-01-01: 0 2025-01-01: 0.06 diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_additional_senior_deduction.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_additional_senior_deduction.yaml new file mode 100644 index 00000000000..0952a1cfd7f --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_additional_senior_deduction.yaml @@ -0,0 +1,329 @@ +- name: Idaho conforms to the federal additional senior deduction in 2025. + period: 2025 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + person2: + age: 70 + is_tax_unit_spouse: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + adjusted_gross_income: 200_000 + salt_deduction: 0 + standard_deduction: 0 + households: + household: + members: [person1, person2] + state_code: ID + output: + # Joint, both age 70, AGI $200k: per-senior allowed is + # max($6,000 - 6% * ($200,000 - $150,000), 0) = $3,000, + # times 2 eligible seniors = $6,000 (Schedule 1-A per-senior phase-out). + additional_senior_deduction: 6_000 + id_additional_senior_deduction: 6_000 + +- name: Idaho senior deduction is zero before 2025. + period: 2024 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1] + filing_status: SINGLE + adjusted_gross_income: 50_000 + households: + household: + members: [person1] + state_code: ID + output: + id_additional_senior_deduction: 0 + +- name: Single filer senior deduction with non-joint phase-out + period: 2025 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1] + filing_status: SINGLE + adjusted_gross_income: 100_000 + salt_deduction: 0 + standard_deduction: 0 + households: + household: + members: [person1] + state_code: ID + output: + # $6,000 base - 6% * ($100,000 - $75,000) = $6,000 - $1,500 = $4,500 + id_additional_senior_deduction: 4_500 + +- name: Age 64 does not qualify for senior deduction + period: 2025 + input: + people: + person1: + age: 64 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1] + filing_status: SINGLE + adjusted_gross_income: 50_000 + households: + household: + members: [person1] + state_code: ID + output: + id_additional_senior_deduction: 0 + +- name: Age 65 qualifies for senior deduction + period: 2025 + input: + people: + person1: + age: 65 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1] + filing_status: SINGLE + adjusted_gross_income: 50_000 + salt_deduction: 0 + standard_deduction: 0 + households: + household: + members: [person1] + state_code: ID + output: + # Below $75k threshold, no phase-out + id_additional_senior_deduction: 6_000 + +- name: Phase-out fully eliminates senior deduction + period: 2025 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1] + filing_status: SINGLE + adjusted_gross_income: 200_000 + salt_deduction: 0 + standard_deduction: 0 + households: + household: + members: [person1] + state_code: ID + output: + # 6% * ($200,000 - $75,000) = $7,500 > $6,000, so capped at 0 + id_additional_senior_deduction: 0 + +- name: Single filer just below $75,000 phase-out threshold. + period: 2025 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1] + filing_status: SINGLE + adjusted_gross_income: 74_999 + salt_deduction: 0 + standard_deduction: 0 + households: + household: + members: [person1] + state_code: ID + output: + id_additional_senior_deduction: 6_000 + +- name: Single filer at $75,000 phase-out threshold. + period: 2025 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1] + filing_status: SINGLE + adjusted_gross_income: 75_000 + salt_deduction: 0 + standard_deduction: 0 + households: + household: + members: [person1] + state_code: ID + output: + id_additional_senior_deduction: 6_000 + +- name: Single filer one dollar above $75,000 phase-out threshold. + period: 2025 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1] + filing_status: SINGLE + adjusted_gross_income: 75_001 + salt_deduction: 0 + standard_deduction: 0 + households: + household: + members: [person1] + state_code: ID + output: + # max($6,000 - 6% * $1, 0) = $5,999.94 + id_additional_senior_deduction: 5_999.94 + +- name: Joint filer just below $150,000 phase-out threshold. + period: 2025 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + person2: + age: 70 + is_tax_unit_spouse: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + adjusted_gross_income: 149_999 + salt_deduction: 0 + standard_deduction: 0 + households: + household: + members: [person1, person2] + state_code: ID + output: + id_additional_senior_deduction: 12_000 + +- name: Joint filer at $150,000 phase-out threshold. + period: 2025 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + person2: + age: 70 + is_tax_unit_spouse: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + adjusted_gross_income: 150_000 + salt_deduction: 0 + standard_deduction: 0 + households: + household: + members: [person1, person2] + state_code: ID + output: + id_additional_senior_deduction: 12_000 + +- name: Joint filer one dollar above $150,000 phase-out threshold. + period: 2025 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + person2: + age: 70 + is_tax_unit_spouse: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + adjusted_gross_income: 150_001 + salt_deduction: 0 + standard_deduction: 0 + households: + household: + members: [person1, person2] + state_code: ID + output: + # Per senior: max($6,000 - 6% * $1, 0) = $5,999.94, times two seniors = $11,999.88. + id_additional_senior_deduction: 11_999.88 + +- name: Joint filer fully phased out at $350,000 AGI. + period: 2025 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + person2: + age: 70 + is_tax_unit_spouse: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + adjusted_gross_income: 350_000 + salt_deduction: 0 + standard_deduction: 0 + households: + household: + members: [person1, person2] + state_code: ID + output: + # 6% * ($350,000 - $150,000) = $12,000 >= $6,000 per senior, so deduction is fully phased out. + id_additional_senior_deduction: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_qualified_business_income_and_federal_schedule_1a_deductions.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_qualified_business_income_and_federal_schedule_1a_deductions.yaml new file mode 100644 index 00000000000..e6f30277308 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/deductions/id_qualified_business_income_and_federal_schedule_1a_deductions.yaml @@ -0,0 +1,8 @@ +- name: Idaho qualified business income and federal Schedule 1-A deductions include the senior deduction + period: 2025 + input: + qualified_business_income_deduction: 2_000 + id_additional_senior_deduction: 9_000 + state_code: ID + output: + id_qualified_business_income_and_federal_schedule_1a_deductions: 11_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/id_taxable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/id_taxable_income.yaml index 80309f2e9dd..5589eb3bc4f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/id_taxable_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/id_taxable_income.yaml @@ -12,17 +12,27 @@ input: id_agi: 500 id_deductions: 1_000 - qualified_business_income_deduction: 200 + id_qualified_business_income_and_federal_schedule_1a_deductions: 200 state_code: ID output: id_taxable_income: 0 -- name: AGI after deductions is reduced by QBID +- name: AGI after deductions is reduced by Idaho conformity deductions period: 2021 input: id_agi: 1_000 id_deductions: 500 - qualified_business_income_deduction: 300 + id_qualified_business_income_and_federal_schedule_1a_deductions: 300 state_code: ID output: id_taxable_income: 200 + +- name: Idaho conformity deductions include the federal senior deduction in 2025 + period: 2025 + input: + id_agi: 200_000 + id_deductions: 60_000 + id_qualified_business_income_and_federal_schedule_1a_deductions: 6_000 + state_code: ID + output: + id_taxable_income: 134_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/integration.yaml index 775a31e31f8..a96995acc78 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/id/tax/income/integration.yaml @@ -228,3 +228,41 @@ output: # Grocery credit: 2 people * $155 = $310 (aged credit not in effect for 2025) id_grocery_credit: 310 + +- name: Idaho joint senior filers receive the OBBBA enhanced senior deduction in 2025 + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 70 + taxable_interest_income: 100_000 + is_tax_unit_head: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + person2: + age: 70 + taxable_interest_income: 100_000 + is_tax_unit_spouse: true + is_tax_unit_head_or_spouse: true + ssn_card_type: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + itemized_taxable_income_deductions: 60_000 + id_salt_deduction: 0 + spm_units: + spm_unit: + members: [person1, person2] + snap: 0 + tanf: 0 + households: + household: + members: [person1, person2] + state_fips: 16 + output: + additional_senior_deduction: 6_000 + id_additional_senior_deduction: 6_000 + id_qualified_business_income_and_federal_schedule_1a_deductions: 6_000 + id_taxable_income: 134_000 diff --git a/policyengine_us/variables/gov/states/id/tax/income/deductions/id_additional_senior_deduction.py b/policyengine_us/variables/gov/states/id/tax/income/deductions/id_additional_senior_deduction.py new file mode 100644 index 00000000000..02b95877619 --- /dev/null +++ b/policyengine_us/variables/gov/states/id/tax/income/deductions/id_additional_senior_deduction.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + + +class id_additional_senior_deduction(Variable): + value_type = float + entity = TaxUnit + label = "Idaho additional senior deduction" + unit = USD + definition_period = YEAR + defined_for = StateCode.ID + reference = ( + "https://legislature.idaho.gov/statutesrules/idstat/Title63/T63CH30/SECT63-3004/", + "https://legislature.idaho.gov/sessioninfo/2026/legislation/H0559/", + "https://tax.idaho.gov/pressrelease/update-on-filing-2025-idaho-income-taxes-now-that-conformity-is-law/", + ) + adds = ["additional_senior_deduction"] diff --git a/policyengine_us/variables/gov/states/id/tax/income/deductions/id_deductions.py b/policyengine_us/variables/gov/states/id/tax/income/deductions/id_deductions.py index 4d1b6f308c3..d10534624fe 100644 --- a/policyengine_us/variables/gov/states/id/tax/income/deductions/id_deductions.py +++ b/policyengine_us/variables/gov/states/id/tax/income/deductions/id_deductions.py @@ -16,5 +16,6 @@ class id_deductions(Variable): def formula(tax_unit, period, parameters): itm_ded = tax_unit("id_itemized_deductions", period) std_ded = tax_unit("standard_deduction", period) - # We do not model qualified business income deduction for Idaho + # Idaho qualified business income and federal Schedule 1-A deductions + # are modeled separately. return max_(itm_ded, std_ded) diff --git a/policyengine_us/variables/gov/states/id/tax/income/deductions/id_qualified_business_income_and_federal_schedule_1a_deductions.py b/policyengine_us/variables/gov/states/id/tax/income/deductions/id_qualified_business_income_and_federal_schedule_1a_deductions.py new file mode 100644 index 00000000000..4d24963a410 --- /dev/null +++ b/policyengine_us/variables/gov/states/id/tax/income/deductions/id_qualified_business_income_and_federal_schedule_1a_deductions.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class id_qualified_business_income_and_federal_schedule_1a_deductions(Variable): + value_type = float + entity = TaxUnit + label = "Idaho qualified business income and federal Schedule 1-A deductions" + unit = USD + definition_period = YEAR + defined_for = StateCode.ID + reference = ( + "https://tax.idaho.gov/wp-content/uploads/forms/EIN00046/EIN00046_03-02-2026.pdf#page=11", + "https://tax.idaho.gov/pressrelease/update-on-filing-2025-idaho-income-taxes-now-that-conformity-is-law/", + ) + + adds = [ + "qualified_business_income_deduction", + "id_additional_senior_deduction", + "tip_income_deduction", + "overtime_income_deduction", + "auto_loan_interest_deduction", + ] diff --git a/policyengine_us/variables/gov/states/id/tax/income/id_taxable_income.py b/policyengine_us/variables/gov/states/id/tax/income/id_taxable_income.py index fe4e3b7e173..7674bd07552 100644 --- a/policyengine_us/variables/gov/states/id/tax/income/id_taxable_income.py +++ b/policyengine_us/variables/gov/states/id/tax/income/id_taxable_income.py @@ -6,13 +6,15 @@ class id_taxable_income(Variable): entity = TaxUnit label = "Idaho taxable income" unit = USD - documentation = "Idaho taxable income" definition_period = YEAR - reference = "https://tax.idaho.gov/wp-content/uploads/forms/EFO00089/EFO00089_12-30-2022.pdf#page=1" + reference = "https://tax.idaho.gov/wp-content/uploads/forms/EIN00046/EIN00046_03-02-2026.pdf#page=30" defined_for = StateCode.ID def formula(tax_unit, period, parameters): agi = tax_unit("id_agi", period) deductions = tax_unit("id_deductions", period) - qbid = tax_unit("qualified_business_income_deduction", period) - return max_(0, agi - deductions - qbid) + conformity_deductions = tax_unit( + "id_qualified_business_income_and_federal_schedule_1a_deductions", + period, + ) + return max_(0, agi - deductions - conformity_deductions)