diff --git a/changelog.d/ri-2027-tax-updates.added.md b/changelog.d/ri-2027-tax-updates.added.md new file mode 100644 index 00000000000..fed9ba7586a --- /dev/null +++ b/changelog.d/ri-2027-tax-updates.added.md @@ -0,0 +1 @@ +Add Rhode Island's 2027 Child Tax Credit, high-income surtax, and Social Security subtraction age-gate removal. diff --git a/policyengine_us/parameters/gov/states/ri/tax/income/agi/subtractions/social_security/limit/birth_year.yaml b/policyengine_us/parameters/gov/states/ri/tax/income/agi/subtractions/social_security/limit/birth_year.yaml index 1f5ab50bf16..7aa06a8cd3c 100644 --- a/policyengine_us/parameters/gov/states/ri/tax/income/agi/subtractions/social_security/limit/birth_year.yaml +++ b/policyengine_us/parameters/gov/states/ri/tax/income/agi/subtractions/social_security/limit/birth_year.yaml @@ -6,6 +6,8 @@ values: 2023-01-01: 1957 # 1957-07-01 2024-01-01: 1958 # 1958-05-01 2025-01-01: 1959 # 1959-03-01 + 2026-01-01: 1960 # 1960-01-01 + 2027-01-01: 9999 # Age condition removed under 2026 R.I. H 7127 Substitute A. metadata: unit: year @@ -27,3 +29,5 @@ metadata: # full or unreduced social security retirement benefits" - title: R.I. Gen. Laws § 44-30-12 (c), (8), (i), (A) href: http://webserver.rilin.state.ri.us/Statutes/title44/44-30/44-30-12.HTM + - title: 2026 R.I. H 7127 Substitute A as amended, Article 6, Section 5, § 44-30-12(c)(8) + href: https://webserver.rilegislature.gov/BillText/BillText26/HouseText26/H7127Aaa.html#:~:text=For%20the%20tax%20years%20beginning%20on%20or%20after%20January%201%2C%202027 diff --git a/policyengine_us/parameters/gov/states/ri/tax/income/agi/subtractions/taxable_retirement_income/birth_year.yaml b/policyengine_us/parameters/gov/states/ri/tax/income/agi/subtractions/taxable_retirement_income/birth_year.yaml new file mode 100644 index 00000000000..4f25b984bf6 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ri/tax/income/agi/subtractions/taxable_retirement_income/birth_year.yaml @@ -0,0 +1,27 @@ +description: Rhode Island allows taxable retirement income subtractions for taxpayers or spouses born on or before this year. + +values: + 2021-01-01: 1955 # 1955-11-01 + 2022-01-01: 1956 # 1956-09-01 + 2023-01-01: 1957 # 1957-07-01 + 2024-01-01: 1958 # 1958-05-01 + 2025-01-01: 1959 # 1959-03-01 + 2026-01-01: 1960 # 1960-01-01 + +metadata: + unit: year + period: year + label: Rhode Island taxable retirement income subtraction birth year threshold + reference: + - title: 2025 RI-1040 Instructions page I-10 + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2025-12/2025%201040R%20Instructions%20122025.pdf#page=10 + - title: Rhode Island 2024 RI-1040 Instructions + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2024-12/2024%201040R%20Instructions%20-%20updated%2012092024.pdf#page=9 + - title: Rhode Island 2023 RI-1040 Instructions + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2023-12/2023%201040R%20Instructions.pdf#page=9 + - title: Rhode Island 2022 RI-1040 Instructions + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-12/2022%20NR%20Instructions_v4_w.pdf#page=11 + - title: Rhode Island 2021 RI-1040 Instructions + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2021-12/2021-1040r-instructions.pdf#page=8 + - title: R.I. Gen. Laws § 44-30-12 (c), (9) + href: http://webserver.rilin.state.ri.us/Statutes/title44/44-30/44-30-12.HTM diff --git a/policyengine_us/parameters/gov/states/ri/tax/income/credits/ctc/age_limit.yaml b/policyengine_us/parameters/gov/states/ri/tax/income/credits/ctc/age_limit.yaml new file mode 100644 index 00000000000..623198e4a7f --- /dev/null +++ b/policyengine_us/parameters/gov/states/ri/tax/income/credits/ctc/age_limit.yaml @@ -0,0 +1,10 @@ +description: Rhode Island limits child age to this threshold under the Child Tax Credit program. +values: + 2027-01-01: 18 +metadata: + unit: year + period: year + label: Rhode Island Child Tax Credit age limit + reference: + - title: 2026 R.I. H 7127 Substitute A as amended, Article 6, Section 4, § 44-30-104(a)(1) + href: https://webserver.rilegislature.gov/BillText/BillText26/HouseText26/H7127Aaa.html#:~:text=%E2%80%9CChild%E2%80%9D%20means%20an%20individual%20who%20is%20eighteen%20years%20of%20age%20or%20under diff --git a/policyengine_us/parameters/gov/states/ri/tax/income/credits/ctc/amount.yaml b/policyengine_us/parameters/gov/states/ri/tax/income/credits/ctc/amount.yaml new file mode 100644 index 00000000000..87854886181 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ri/tax/income/credits/ctc/amount.yaml @@ -0,0 +1,16 @@ +description: Rhode Island provides this amount per eligible child under the Child Tax Credit program. +values: + 2026-01-01: 0 + 2027-01-01: 330 +metadata: + unit: currency-USD + period: year + label: Rhode Island Child Tax Credit amount + uprating: + parameter: gov.irs.uprating + rounding: + type: downwards + interval: 5 + reference: + - title: 2026 R.I. H 7127 Substitute A as amended, Article 6, Section 4, § 44-30-104(b) + href: https://webserver.rilegislature.gov/BillText/BillText26/HouseText26/H7127Aaa.html#:~:text=the%20amount%20of%20three%20hundred%20thirty%20dollars%20(%24330) diff --git a/policyengine_us/parameters/gov/states/ri/tax/income/credits/ctc/phase_out/increment.yaml b/policyengine_us/parameters/gov/states/ri/tax/income/credits/ctc/phase_out/increment.yaml new file mode 100644 index 00000000000..02dcf6475a5 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ri/tax/income/credits/ctc/phase_out/increment.yaml @@ -0,0 +1,53 @@ +description: Rhode Island sets this adjusted gross income increment under the Child Tax Credit program. +metadata: + unit: currency-USD + period: year + label: Rhode Island Child Tax Credit phase-out increment + breakdown: + - filing_status + breakdown_label: + - Filing status + reference: + - title: 2026 R.I. H 7127 Substitute A as amended, Article 6, Section 4, § 44-30-104(c) + href: https://webserver.rilegislature.gov/BillText/BillText26/HouseText26/H7127Aaa.html#:~:text=two%20thousand%20eight%20hundred%20seventy-five%20(%242%2C875) + +SINGLE: + values: + 2027-01-01: 2_875 + uprating: + parameter: gov.irs.uprating + rounding: + type: downwards + interval: 5 +JOINT: + values: + 2027-01-01: 3_590 + uprating: + parameter: gov.irs.uprating + rounding: + type: downwards + interval: 5 +SEPARATE: + values: + 2027-01-01: 2_875 + uprating: + parameter: gov.irs.uprating + rounding: + type: downwards + interval: 5 +HEAD_OF_HOUSEHOLD: + values: + 2027-01-01: 2_875 + uprating: + parameter: gov.irs.uprating + rounding: + type: downwards + interval: 5 +SURVIVING_SPOUSE: + values: + 2027-01-01: 2_875 + uprating: + parameter: gov.irs.uprating + rounding: + type: downwards + interval: 5 diff --git a/policyengine_us/parameters/gov/states/ri/tax/income/credits/ctc/phase_out/rate.yaml b/policyengine_us/parameters/gov/states/ri/tax/income/credits/ctc/phase_out/rate.yaml new file mode 100644 index 00000000000..e13b692756e --- /dev/null +++ b/policyengine_us/parameters/gov/states/ri/tax/income/credits/ctc/phase_out/rate.yaml @@ -0,0 +1,10 @@ +description: Rhode Island sets this reduction percentage under the Child Tax Credit program. +values: + 2027-01-01: 0.2 +metadata: + unit: /1 + period: year + label: Rhode Island Child Tax Credit phase-out rate + reference: + - title: 2026 R.I. H 7127 Substitute A as amended, Article 6, Section 4, § 44-30-104(c) + href: https://webserver.rilegislature.gov/BillText/BillText26/HouseText26/H7127Aaa.html#:~:text=applicable%20percentage%E2%80%9D%20for%20purposes%20of%20this%20subsection%20means%20twenty%20(20) diff --git a/policyengine_us/parameters/gov/states/ri/tax/income/credits/ctc/phase_out/threshold.yaml b/policyengine_us/parameters/gov/states/ri/tax/income/credits/ctc/phase_out/threshold.yaml new file mode 100644 index 00000000000..ed99ab89a64 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ri/tax/income/credits/ctc/phase_out/threshold.yaml @@ -0,0 +1,53 @@ +description: Rhode Island sets this adjusted gross income threshold under the Child Tax Credit program. +metadata: + unit: currency-USD + period: year + label: Rhode Island Child Tax Credit phase-out threshold + breakdown: + - filing_status + breakdown_label: + - Filing status + reference: + - title: 2026 R.I. H 7127 Substitute A as amended, Article 6, Section 4, § 44-30-104(c) + href: https://webserver.rilegislature.gov/BillText/BillText26/HouseText26/H7127Aaa.html#:~:text=exceeds%20eighty-eight%20thousand%20five%20hundred%20dollars + +SINGLE: + values: + 2027-01-01: 88_500 + uprating: + parameter: gov.irs.uprating + rounding: + type: downwards + interval: 5 +JOINT: + values: + 2027-01-01: 110_640 + uprating: + parameter: gov.irs.uprating + rounding: + type: downwards + interval: 5 +SEPARATE: + values: + 2027-01-01: 88_500 + uprating: + parameter: gov.irs.uprating + rounding: + type: downwards + interval: 5 +HEAD_OF_HOUSEHOLD: + values: + 2027-01-01: 88_500 + uprating: + parameter: gov.irs.uprating + rounding: + type: downwards + interval: 5 +SURVIVING_SPOUSE: + values: + 2027-01-01: 88_500 + uprating: + parameter: gov.irs.uprating + rounding: + type: downwards + interval: 5 diff --git a/policyengine_us/parameters/gov/states/ri/tax/income/credits/refundable.yaml b/policyengine_us/parameters/gov/states/ri/tax/income/credits/refundable.yaml index 70870700115..9f2347bacf8 100644 --- a/policyengine_us/parameters/gov/states/ri/tax/income/credits/refundable.yaml +++ b/policyengine_us/parameters/gov/states/ri/tax/income/credits/refundable.yaml @@ -7,6 +7,10 @@ values: 2022-01-01: - ri_eitc - ri_property_tax_credit + 2027-01-01: + - ri_eitc + - ri_property_tax_credit + - ri_ctc metadata: unit: list @@ -20,3 +24,13 @@ metadata: # Child tax rebate source - title: R.I. Gen. Law §44-30-103. Child Tax Rebates. href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-08/H7123Aaa_CTR_0.pdf#page=1 + # The budget bill establishes the CTC amount, eligibility, and phase-out; + # the budget report and signing press release describe the enacted CTC as refundable. + - title: Rhode Island Senate Fiscal Office FY2027 Budget as Passed by House Finance, page 8 + href: https://www.rilegislature.gov/sfiscal/Budget%20Analyses/FY2027%20SFO%20Budget%20as%20passed%20by%20House%20Finance.pdf#page=8 + - title: Governor McKee signs fiscal year 2027 budget advancing key affordability for all Rhode Islanders + href: https://governor.ri.gov/press-releases/governor-mckee-signs-fiscal-year-2027-budget-advancing-key-affordability-all + - title: Sen. Vargas lauds child tax credit in state budget bill + href: https://www.rilegislature.gov/pressrelease/_layouts/15/ril.pressrelease.inputform/DisplayForm.aspx?List=c8baae31-3c10-431c-8dcd-9dbbe21ce3e9&ID=376675 + - title: 2026 R.I. H 7127 Substitute A as amended, Article 6, Section 4, § 44-30-104 + href: https://webserver.rilegislature.gov/BillText/BillText26/HouseText26/H7127Aaa.html#:~:text=44-30-104.%20Child%20Tax%20Credit diff --git a/policyengine_us/parameters/gov/states/ri/tax/income/high_earner_tax/rate.yaml b/policyengine_us/parameters/gov/states/ri/tax/income/high_earner_tax/rate.yaml new file mode 100644 index 00000000000..82bba151b85 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ri/tax/income/high_earner_tax/rate.yaml @@ -0,0 +1,13 @@ +description: Rhode Island sets this high-income surtax percentage under the personal income tax. +values: + 2026-01-01: 0 + 2027-01-01: 0.01 + 2028-01-01: 0.02 + 2029-01-01: 0.03 +metadata: + unit: /1 + period: year + label: Rhode Island high-income surtax rate + reference: + - title: 2026 R.I. H 7127 Substitute A as amended, Article 6, Section 5, § 44-30-2.6(c)(3)(A)(I)(2) + href: https://webserver.rilegislature.gov/BillText/BillText26/HouseText26/H7127Aaa.html#:~:text=High-income%20surtax diff --git a/policyengine_us/parameters/gov/states/ri/tax/income/high_earner_tax/threshold.yaml b/policyengine_us/parameters/gov/states/ri/tax/income/high_earner_tax/threshold.yaml new file mode 100644 index 00000000000..fc1ef493769 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ri/tax/income/high_earner_tax/threshold.yaml @@ -0,0 +1,15 @@ +description: Rhode Island sets this taxable income threshold under the high-income surtax. +values: + 2027-01-01: 1_000_000 # 2027 value is not indexed; uprating applies from 2028. +metadata: + unit: currency-USD + period: year + label: Rhode Island high-income surtax threshold + uprating: + parameter: gov.irs.uprating + rounding: + type: downwards + interval: 50 + reference: + - title: 2026 R.I. H 7127 Substitute A as amended, Article 6, Section 5, § 44-30-2.6(c)(3)(A)(I)(2) + href: https://webserver.rilegislature.gov/BillText/BillText26/HouseText26/H7127Aaa.html#:~:text=Rhode%20Island%20taxable%20income%20over%20one%20million%20dollars diff --git a/policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/agi/subtractions/social_security/ri_social_security_modification.yaml b/policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/agi/subtractions/social_security/ri_social_security_modification.yaml index b7e90e8dbab..41d94462b36 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/agi/subtractions/social_security/ri_social_security_modification.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/agi/subtractions/social_security/ri_social_security_modification.yaml @@ -109,3 +109,25 @@ ri_social_security_modification_eligible: true output: ri_social_security_modification: 96_000 + +- name: Under full retirement age receives social security modification in 2027 + absolute_error_margin: 0.01 + period: 2027 + input: + people: + person1: + is_tax_unit_head: true + social_security: 20_000 + taxable_social_security: 10_000 + birth_year: 1990 + tax_units: + tax_unit: + members: [person1] + filing_status: SINGLE + adjusted_gross_income: 70_000 + households: + household: + members: [person1] + state_code: RI + output: + ri_social_security_modification: 10_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/agi/subtractions/social_security/ri_social_security_modification_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/agi/subtractions/social_security/ri_social_security_modification_eligible.yaml index f915ff5ca7f..ca837f777ad 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/agi/subtractions/social_security/ri_social_security_modification_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/agi/subtractions/social_security/ri_social_security_modification_eligible.yaml @@ -1,5 +1,4 @@ - name: Age not eligible for social security modification - absolute_error_margin: 0.01 period: 2021 input: adjusted_gross_income: 70_000 @@ -10,7 +9,6 @@ ri_social_security_modification_eligible: false - name: Income not eligible for social security modification - absolute_error_margin: 0.01 period: 2021 input: adjusted_gross_income: 100_000 @@ -21,7 +19,6 @@ ri_social_security_modification_eligible: false - name: Eligible for the social security modification - absolute_error_margin: 0.01 period: 2021 input: adjusted_gross_income: 70_000 @@ -33,7 +30,6 @@ # 2025 tests - Birth year threshold: 1959, Income limits vary by filing status - name: 2025 - Age eligible (born 1959) for social security modification - absolute_error_margin: 2 period: 2025 input: adjusted_gross_income: 80_000 @@ -44,7 +40,6 @@ ri_social_security_modification_eligible: true - name: 2025 - Age not eligible (born 1960) for social security modification - absolute_error_margin: 2 period: 2025 input: adjusted_gross_income: 80_000 @@ -55,7 +50,6 @@ ri_social_security_modification_eligible: false - name: 2025 - Income not eligible for single filer (above $107,000) - absolute_error_margin: 2 period: 2025 input: adjusted_gross_income: 110_000 @@ -66,7 +60,6 @@ ri_social_security_modification_eligible: false - name: 2025 - Joint filer eligible (income below $133,750) - absolute_error_margin: 2 period: 2025 input: adjusted_gross_income: 125_000 @@ -77,7 +70,6 @@ ri_social_security_modification_eligible: true - name: 2025 - Joint filer not eligible (income above $133,750) - absolute_error_margin: 2 period: 2025 input: adjusted_gross_income: 135_000 @@ -86,3 +78,98 @@ state_code: RI output: ri_social_security_modification_eligible: false + +- name: 2027 - Age not required for social security modification + period: 2027 + input: + adjusted_gross_income: 70_000 + filing_status: SINGLE + older_spouse_birth_year: 1990 + state_code: RI + output: + ri_social_security_modification_eligible: true + +- name: 2027 - Income limit still applies after age requirement removal + period: 2027 + input: + adjusted_gross_income: 200_000 + filing_status: SINGLE + older_spouse_birth_year: 1990 + state_code: RI + output: + ri_social_security_modification_eligible: false + +- name: 2026 - Under full retirement age remains ineligible + period: 2026 + input: + adjusted_gross_income: 70_000 + filing_status: SINGLE + older_spouse_birth_year: 1990 + state_code: RI + output: + ri_social_security_modification_eligible: false + +# 2027 income limits remain at 2025 levels because the uprating index is 1.0 through 2027. +- name: 2027 - Single filer just below income limit is eligible + period: 2027 + input: + adjusted_gross_income: 106_999 + filing_status: SINGLE + older_spouse_birth_year: 1990 + state_code: RI + output: + ri_social_security_modification_eligible: true + +- name: 2027 - Single filer at income limit is ineligible + period: 2027 + input: + adjusted_gross_income: 107_000 + filing_status: SINGLE + older_spouse_birth_year: 1990 + state_code: RI + output: + ri_social_security_modification_eligible: false + +- name: 2027 - Joint filer just below income limit is eligible + period: 2027 + input: + adjusted_gross_income: 133_749 + filing_status: JOINT + older_spouse_birth_year: 1990 + state_code: RI + output: + ri_social_security_modification_eligible: true + +- name: 2027 - Joint filer at income limit is ineligible + period: 2027 + input: + adjusted_gross_income: 133_750 + filing_status: JOINT + older_spouse_birth_year: 1990 + state_code: RI + output: + ri_social_security_modification_eligible: false + +- name: 2027 - Joint filers under full retirement age are eligible + period: 2027 + input: + people: + person1: + age: 37 + birth_year: 1990 + is_tax_unit_head: true + person2: + age: 37 + birth_year: 1990 + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person1, person2] + adjusted_gross_income: 100_000 + filing_status: JOINT + households: + household: + members: [person1, person2] + state_code: RI + output: + ri_social_security_modification_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/agi/subtractions/taxable_retirement_income/ri_retirement_income_subtraction_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/agi/subtractions/taxable_retirement_income/ri_retirement_income_subtraction_eligible.yaml index eb9a2cdb87e..68211766d34 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/agi/subtractions/taxable_retirement_income/ri_retirement_income_subtraction_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/agi/subtractions/taxable_retirement_income/ri_retirement_income_subtraction_eligible.yaml @@ -50,7 +50,6 @@ # 2025 tests - Birth year threshold: 1959, Income limits: $107,000 (single/HOH/separate), $133,750 (joint/widow) - name: 2025 - Single filer eligible (income below $107,000) - absolute_error_margin: 0.01 period: 2025 input: state_code: RI @@ -61,7 +60,6 @@ ri_retirement_income_subtraction_eligible: true - name: 2025 - Single filer ineligible (income at $107,000) - absolute_error_margin: 0.01 period: 2025 input: state_code: RI @@ -72,7 +70,6 @@ ri_retirement_income_subtraction_eligible: false - name: 2025 - Joint filer eligible (income below $133,750) - absolute_error_margin: 0.01 period: 2025 input: state_code: RI @@ -83,7 +80,6 @@ ri_retirement_income_subtraction_eligible: true - name: 2025 - Joint filer ineligible (income at $133,750) - absolute_error_margin: 0.01 period: 2025 input: state_code: RI @@ -94,7 +90,6 @@ ri_retirement_income_subtraction_eligible: false - name: 2025 - Surviving spouse eligible (income below $133,750) - absolute_error_margin: 0.01 period: 2025 input: state_code: RI @@ -105,7 +100,6 @@ ri_retirement_income_subtraction_eligible: true - name: 2025 - Age ineligible (born 1960) - absolute_error_margin: 0.01 period: 2025 input: state_code: RI @@ -114,3 +108,13 @@ older_spouse_birth_year: 1960 output: ri_retirement_income_subtraction_eligible: false + +- name: 2027 - Age still required for taxable retirement income modification + period: 2027 + input: + state_code: RI + adjusted_gross_income: 80_000 + filing_status: SINGLE + older_spouse_birth_year: 1990 + output: + ri_retirement_income_subtraction_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/credits/ctc/ri_ctc.yaml b/policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/credits/ctc/ri_ctc.yaml new file mode 100644 index 00000000000..68efe744a88 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/credits/ctc/ri_ctc.yaml @@ -0,0 +1,302 @@ +- name: Rhode Island Child Tax Credit is unavailable before 2027 + period: 2026 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 35 + is_tax_unit_dependent: false + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [parent, child] + filing_status: SINGLE + ri_agi: 0 + households: + household: + members: [parent, child] + state_code: RI + output: + ri_ctc: 0 + +- name: Rhode Island Child Tax Credit provides $330 per eligible child in 2027 + period: 2027 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 35 + is_tax_unit_dependent: false + child1: + age: 8 + is_tax_unit_dependent: true + child2: + age: 18 + is_tax_unit_dependent: true + child3: + age: 19 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [parent, child1, child2, child3] + filing_status: SINGLE + ri_agi: 0 + households: + household: + members: [parent, child1, child2, child3] + state_code: RI + output: + ri_ctc_eligible_children: 2 + ri_ctc: 660 + +- name: Rhode Island Child Tax Credit phases out by 20 percent per single-filer step + period: 2027 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 35 + is_tax_unit_dependent: false + child1: + age: 8 + is_tax_unit_dependent: true + child2: + age: 12 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [parent, child1, child2] + filing_status: SINGLE + ri_agi: 91_376 + households: + household: + members: [parent, child1, child2] + state_code: RI + output: + ri_ctc: 396 + +- name: Rhode Island Child Tax Credit uses the joint-filer phase-out increment + period: 2027 + absolute_error_margin: 0.01 + input: + people: + parent1: + age: 35 + is_tax_unit_head: true + parent2: + age: 35 + is_tax_unit_spouse: true + child1: + age: 8 + is_tax_unit_dependent: true + child2: + age: 12 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [parent1, parent2, child1, child2] + filing_status: JOINT + ri_agi: 113_516 + households: + household: + members: [parent1, parent2, child1, child2] + state_code: RI + output: + ri_ctc: 528 + +- name: Rhode Island Child Tax Credit is fully refundable + period: 2027 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 35 + is_tax_unit_dependent: false + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [parent, child] + filing_status: SINGLE + ri_agi: 0 + ri_income_tax_before_refundable_credits: 0 + households: + household: + members: [parent, child] + state_code: RI + output: + ri_ctc: 330 + ri_income_tax: -330 + +- name: Rhode Island Child Tax Credit is unreduced at the single-filer threshold + period: 2027 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 35 + is_tax_unit_dependent: false + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [parent, child] + filing_status: SINGLE + ri_agi: 88_500 + households: + household: + members: [parent, child] + state_code: RI + output: + ri_ctc: 330 + +- name: Rhode Island Child Tax Credit reduces at the start of a new single-filer increment + period: 2027 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 35 + is_tax_unit_dependent: false + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [parent, child] + filing_status: SINGLE + ri_agi: 91_376 + households: + household: + members: [parent, child] + state_code: RI + output: + ri_ctc: 198 + +- name: Rhode Island Child Tax Credit fully phases out + period: 2027 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 35 + is_tax_unit_dependent: false + child1: + age: 8 + is_tax_unit_dependent: true + child2: + age: 12 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [parent, child1, child2] + filing_status: SINGLE + ri_agi: 100_001 + households: + household: + members: [parent, child1, child2] + state_code: RI + output: + ri_ctc: 0 + +- name: Rhode Island Child Tax Credit reduces once at the exact single-filer increment + period: 2027 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 35 + is_tax_unit_dependent: false + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [parent, child] + filing_status: SINGLE + ri_agi: 91_375 + households: + household: + members: [parent, child] + state_code: RI + output: + ri_ctc: 264 + +- name: Rhode Island Child Tax Credit is unreduced at the joint-filer threshold + period: 2027 + absolute_error_margin: 0.01 + input: + people: + parent1: + age: 35 + is_tax_unit_head: true + parent2: + age: 35 + is_tax_unit_spouse: true + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [parent1, parent2, child] + filing_status: JOINT + ri_agi: 110_640 + households: + household: + members: [parent1, parent2, child] + state_code: RI + output: + ri_ctc: 330 + +- name: Rhode Island Child Tax Credit reduces just above the joint-filer threshold + period: 2027 + absolute_error_margin: 0.01 + input: + people: + parent1: + age: 35 + is_tax_unit_head: true + parent2: + age: 35 + is_tax_unit_spouse: true + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [parent1, parent2, child] + filing_status: JOINT + ri_agi: 110_641 + households: + household: + members: [parent1, parent2, child] + state_code: RI + output: + ri_ctc: 264 + +- name: Rhode Island Child Tax Credit uses the single-filer threshold for head of household + period: 2027 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 35 + is_tax_unit_head: true + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [parent, child] + filing_status: HEAD_OF_HOUSEHOLD + ri_agi: 88_501 + households: + household: + members: [parent, child] + state_code: RI + output: + ri_ctc: 264 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/integration.yaml index fa21fc07bee..98d32b32ff8 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/integration.yaml @@ -195,3 +195,34 @@ tax_unit_itemizes: true ri_cdcc: 0 ri_income_tax: -398 + +- name: 2027 RI CTC and high-income surtax apply in the same tax unit + absolute_error_margin: 0.01 + period: 2027 + input: + people: + person1: + age: 40 + is_tax_unit_head: true + birth_year: 1990 + social_security: 20_000 + taxable_social_security: 10_000 + child: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, child] + filing_status: SINGLE + adjusted_gross_income: 70_000 + ri_agi: 0 + ri_taxable_income: 1_250_000 + households: + household: + members: [person1, child] + state_code: RI + output: + ri_ctc: 330 + ri_high_earner_tax: 2_500 + ri_social_security_modification: 10_000 + ri_income_tax: 73_993.54 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/ri_high_earner_tax.yaml b/policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/ri_high_earner_tax.yaml new file mode 100644 index 00000000000..63ef2066b52 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/ri_high_earner_tax.yaml @@ -0,0 +1,64 @@ +- name: Rhode Island high-income surtax is unavailable before 2027 + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: RI + ri_taxable_income: 1_250_000 + output: + ri_high_earner_tax: 0 + +- name: Rhode Island high-income surtax applies at 1 percent in 2027 + period: 2027 + absolute_error_margin: 0.01 + input: + state_code: RI + ri_taxable_income: 1_250_000 + output: + ri_high_earner_tax: 2_500 + +- name: Rhode Island high-income surtax applies at 2 percent in 2028 + period: 2028 + absolute_error_margin: 0.01 + input: + state_code: RI + ri_taxable_income: 1_250_000 + output: + # 2% of ($1,250,000 - $1,020,750). + ri_high_earner_tax: 4_585 + +- name: Rhode Island high-income surtax applies at 3 percent in 2029 + period: 2029 + absolute_error_margin: 0.01 + input: + state_code: RI + ri_taxable_income: 1_250_000 + output: + # 3% of ($1,250,000 - $1,042,800). + ri_high_earner_tax: 6_216 + +- name: Rhode Island high-income surtax is added before non-refundable credits + period: 2027 + absolute_error_margin: 0.01 + input: + state_code: RI + ri_taxable_income: 1_250_000 + output: + ri_income_tax_before_non_refundable_credits: 74_323.54 + +- name: Rhode Island high-income surtax does not apply at the threshold + period: 2027 + absolute_error_margin: 0.01 + input: + state_code: RI + ri_taxable_income: 1_000_000 + output: + ri_high_earner_tax: 0 + +- name: Rhode Island high-income surtax applies just above the threshold + period: 2027 + absolute_error_margin: 0.01 + input: + state_code: RI + ri_taxable_income: 1_000_001 + output: + ri_high_earner_tax: 0.01 diff --git a/policyengine_us/variables/gov/states/ri/tax/income/agi/subtractions/social_security/ri_social_security_modification.py b/policyengine_us/variables/gov/states/ri/tax/income/agi/subtractions/social_security/ri_social_security_modification.py index d720faa192d..10bf367e5b2 100644 --- a/policyengine_us/variables/gov/states/ri/tax/income/agi/subtractions/social_security/ri_social_security_modification.py +++ b/policyengine_us/variables/gov/states/ri/tax/income/agi/subtractions/social_security/ri_social_security_modification.py @@ -7,7 +7,10 @@ class ri_social_security_modification(Variable): label = "Rhode Island Social Security Modification" unit = USD definition_period = YEAR - reference = "https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-12/Social%20Security%20Worksheet_w.pdf" + reference = ( + "https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-12/Social%20Security%20Worksheet_w.pdf", + "https://webserver.rilegislature.gov/BillText/BillText26/HouseText26/H7127Aaa.html#:~:text=For%20the%20tax%20years%20beginning%20on%20or%20after%20January%201%2C%202027", + ) defined_for = "ri_social_security_modification_eligible" def formula(tax_unit, period, parameters): @@ -19,8 +22,8 @@ def formula(tax_unit, period, parameters): period ).gov.states.ri.tax.income.agi.subtractions.social_security.limit - aged = birth_year <= p.birth_year - head_or_spouse_aged = head_or_spouse & aged + social_security_subtraction_eligible = birth_year <= p.birth_year + head_or_spouse_aged = head_or_spouse & social_security_subtraction_eligible total_social_security = person("social_security", period) aged_head_or_spouse_ss = tax_unit.sum( diff --git a/policyengine_us/variables/gov/states/ri/tax/income/agi/subtractions/social_security/ri_social_security_modification_eligible.py b/policyengine_us/variables/gov/states/ri/tax/income/agi/subtractions/social_security/ri_social_security_modification_eligible.py index f23260e93e3..ab6690c489f 100644 --- a/policyengine_us/variables/gov/states/ri/tax/income/agi/subtractions/social_security/ri_social_security_modification_eligible.py +++ b/policyengine_us/variables/gov/states/ri/tax/income/agi/subtractions/social_security/ri_social_security_modification_eligible.py @@ -6,7 +6,10 @@ class ri_social_security_modification_eligible(Variable): entity = TaxUnit label = "Eligible for the Rhode Island Social Security Modification" definition_period = YEAR - reference = "https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-12/Social%20Security%20Worksheet_w.pdf" + reference = ( + "https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-12/Social%20Security%20Worksheet_w.pdf", + "https://webserver.rilegislature.gov/BillText/BillText26/HouseText26/H7127Aaa.html#:~:text=For%20the%20tax%20years%20beginning%20on%20or%20after%20January%201%2C%202027", + ) # MODIFICATION FOR TAXABLE SOCIAL SECURITY INCOME WORKSHEET STEP 1: Eligibility defined_for = StateCode.RI @@ -19,7 +22,6 @@ def formula(tax_unit, period, parameters): period ).gov.states.ri.tax.income.agi.subtractions.social_security.limit - # Age eligibility. age_eligible = birth_year <= p.birth_year # Income eligibility. diff --git a/policyengine_us/variables/gov/states/ri/tax/income/agi/subtractions/taxable_retirement_income/ri_retirement_income_subtraction_eligible.py b/policyengine_us/variables/gov/states/ri/tax/income/agi/subtractions/taxable_retirement_income/ri_retirement_income_subtraction_eligible.py index c69feb64fcb..87560847bd1 100644 --- a/policyengine_us/variables/gov/states/ri/tax/income/agi/subtractions/taxable_retirement_income/ri_retirement_income_subtraction_eligible.py +++ b/policyengine_us/variables/gov/states/ri/tax/income/agi/subtractions/taxable_retirement_income/ri_retirement_income_subtraction_eligible.py @@ -7,9 +7,6 @@ class ri_retirement_income_subtraction_eligible(Variable): label = "Eligible for the Rhode Island retirement income subtraction" definition_period = YEAR reference = "http://webserver.rilin.state.ri.us/Statutes/title44/44-30/44-30-12.HTM" - # Eligibility is the same as Social Security's eligibility - # https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-12/Social%20Security%20Worksheet_w.pdf - # STEP 1: Eligibility defined_for = StateCode.RI def formula(tax_unit, period, parameters): @@ -17,15 +14,10 @@ def formula(tax_unit, period, parameters): filing_status = tax_unit("filing_status", period) older_spouse_birth_year = tax_unit("older_spouse_birth_year", period) - p_ss = parameters( - period - ).gov.states.ri.tax.income.agi.subtractions.social_security.limit - age_eligible = older_spouse_birth_year <= p_ss.birth_year - - # Income eligibility. p_tri = parameters( period ).gov.states.ri.tax.income.agi.subtractions.taxable_retirement_income + age_eligible = older_spouse_birth_year <= p_tri.birth_year income_eligible = income < p_tri.income_limit[filing_status] return age_eligible & income_eligible diff --git a/policyengine_us/variables/gov/states/ri/tax/income/credits/ctc/ri_ctc.py b/policyengine_us/variables/gov/states/ri/tax/income/credits/ctc/ri_ctc.py new file mode 100644 index 00000000000..4f8151ee7a6 --- /dev/null +++ b/policyengine_us/variables/gov/states/ri/tax/income/credits/ctc/ri_ctc.py @@ -0,0 +1,26 @@ +from policyengine_us.model_api import * + + +class ri_ctc(Variable): + value_type = float + entity = TaxUnit + label = "Rhode Island Child Tax Credit" + unit = USD + definition_period = YEAR + defined_for = StateCode.RI + reference = "https://webserver.rilegislature.gov/BillText/BillText26/HouseText26/H7127Aaa.html#:~:text=44-30-104.%20Child%20Tax%20Credit" + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.ri.tax.income.credits.ctc + filing_status = tax_unit("filing_status", period) + ri_agi = tax_unit("ri_agi", period) + children = tax_unit("ri_ctc_eligible_children", period) + maximum = children * p.amount + + threshold = p.phase_out.threshold[filing_status] + increment = p.phase_out.increment[filing_status] + excess = max_(ri_agi - threshold, 0) + increments = np.ceil(excess / increment) + phase_out_rate = min_(increments * p.phase_out.rate, 1) + + return maximum * (1 - phase_out_rate) diff --git a/policyengine_us/variables/gov/states/ri/tax/income/credits/ctc/ri_ctc_eligible_child.py b/policyengine_us/variables/gov/states/ri/tax/income/credits/ctc/ri_ctc_eligible_child.py new file mode 100644 index 00000000000..24dd46420ef --- /dev/null +++ b/policyengine_us/variables/gov/states/ri/tax/income/credits/ctc/ri_ctc_eligible_child.py @@ -0,0 +1,15 @@ +from policyengine_us.model_api import * + + +class ri_ctc_eligible_child(Variable): + value_type = bool + entity = Person + label = "Rhode Island Child Tax Credit eligible child" + definition_period = YEAR + defined_for = "is_tax_unit_dependent" + reference = "https://webserver.rilegislature.gov/BillText/BillText26/HouseText26/H7127Aaa.html#:~:text=%E2%80%9CChild%E2%80%9D%20means%20an%20individual%20who%20is%20eighteen%20years%20of%20age%20or%20under" + + def formula(person, period, parameters): + p = parameters(period).gov.states.ri.tax.income.credits.ctc + age = person("age", period) + return age <= p.age_limit diff --git a/policyengine_us/variables/gov/states/ri/tax/income/credits/ctc/ri_ctc_eligible_children.py b/policyengine_us/variables/gov/states/ri/tax/income/credits/ctc/ri_ctc_eligible_children.py new file mode 100644 index 00000000000..6c350d39e47 --- /dev/null +++ b/policyengine_us/variables/gov/states/ri/tax/income/credits/ctc/ri_ctc_eligible_children.py @@ -0,0 +1,12 @@ +from policyengine_us.model_api import * + + +class ri_ctc_eligible_children(Variable): + value_type = int + entity = TaxUnit + label = "Rhode Island Child Tax Credit eligible children" + definition_period = YEAR + defined_for = StateCode.RI + reference = "https://webserver.rilegislature.gov/BillText/BillText26/HouseText26/H7127Aaa.html#:~:text=%E2%80%9CChild%E2%80%9D%20means%20an%20individual%20who%20is%20eighteen%20years%20of%20age%20or%20under" + + adds = ["ri_ctc_eligible_child"] diff --git a/policyengine_us/variables/gov/states/ri/tax/income/ri_high_earner_tax.py b/policyengine_us/variables/gov/states/ri/tax/income/ri_high_earner_tax.py new file mode 100644 index 00000000000..6f92edb9255 --- /dev/null +++ b/policyengine_us/variables/gov/states/ri/tax/income/ri_high_earner_tax.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class ri_high_earner_tax(Variable): + value_type = float + entity = TaxUnit + label = "Rhode Island high-income surtax" + defined_for = StateCode.RI + unit = USD + definition_period = YEAR + reference = "https://webserver.rilegislature.gov/BillText/BillText26/HouseText26/H7127Aaa.html#:~:text=High-income%20surtax" + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.ri.tax.income.high_earner_tax + taxable_income = tax_unit("ri_taxable_income", period) + taxable_income_above_threshold = max_( + taxable_income - p.threshold, + 0, + ) + return taxable_income_above_threshold * p.rate diff --git a/policyengine_us/variables/gov/states/ri/tax/income/ri_income_tax_before_non_refundable_credits.py b/policyengine_us/variables/gov/states/ri/tax/income/ri_income_tax_before_non_refundable_credits.py index b83f42f6400..983309aee48 100644 --- a/policyengine_us/variables/gov/states/ri/tax/income/ri_income_tax_before_non_refundable_credits.py +++ b/policyengine_us/variables/gov/states/ri/tax/income/ri_income_tax_before_non_refundable_credits.py @@ -12,4 +12,5 @@ class ri_income_tax_before_non_refundable_credits(Variable): def formula(tax_unit, period, parameters): income = tax_unit("ri_taxable_income", period) rate = parameters(period).gov.states.ri.tax.income.rate - return rate.calc(income) + high_earner_tax = tax_unit("ri_high_earner_tax", period) + return rate.calc(income) + high_earner_tax