policyengine-us 1.423.0__py3-none-any.whl → 1.424.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of policyengine-us might be problematic. Click here for more details.
- policyengine_us/parameters/gov/contrib/states/ri/ctc/age_limit.yaml +9 -0
- policyengine_us/parameters/gov/contrib/states/ri/ctc/amount.yaml +9 -0
- policyengine_us/parameters/gov/contrib/states/ri/ctc/in_effect.yaml +9 -0
- policyengine_us/parameters/gov/contrib/states/ri/ctc/phaseout/rate.yaml +9 -0
- policyengine_us/parameters/gov/contrib/states/ri/ctc/phaseout/threshold.yaml +23 -0
- policyengine_us/parameters/gov/contrib/states/ri/ctc/refundability/cap.yaml +9 -0
- policyengine_us/parameters/gov/contrib/states/ri/dependent_exemption/age_limit/in_effect.yaml +9 -0
- policyengine_us/parameters/gov/contrib/states/ri/dependent_exemption/age_limit/threshold.yaml +9 -0
- policyengine_us/parameters/gov/contrib/states/ri/dependent_exemption/amount.yaml +15 -0
- policyengine_us/parameters/gov/contrib/states/ri/dependent_exemption/in_effect.yaml +9 -0
- policyengine_us/parameters/gov/contrib/states/ri/dependent_exemption/phaseout/rate.yaml +9 -0
- policyengine_us/parameters/gov/contrib/states/ri/dependent_exemption/phaseout/threshold.yaml +23 -0
- policyengine_us/parameters/gov/states/ca/tax/income/agi/subtractions.yaml +1 -0
- policyengine_us/parameters/gov/states/co/tax/income/credits/refundable.yaml +1 -0
- policyengine_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/amount/scale.yaml +1 -1
- policyengine_us/parameters/gov/states/co/tax/income/credits/tabor/joint.yaml +12 -0
- policyengine_us/parameters/gov/states/co/tax/income/credits/tabor/single.yaml +12 -0
- policyengine_us/parameters/gov/states/de/tax/income/credits/refundable.yaml +2 -2
- policyengine_us/parameters/gov/states/de/tax/income/credits/relief_rebate/amount.yaml +1 -1
- policyengine_us/parameters/gov/states/ga/tax/income/credits/non_refundable.yaml +1 -4
- policyengine_us/parameters/gov/states/ga/tax/income/credits/surplus_tax_rebate/amount.yaml +5 -5
- policyengine_us/parameters/gov/states/hi/tax/income/credits/act_115_rebate/joint.yaml +20 -0
- policyengine_us/parameters/gov/states/hi/tax/income/credits/act_115_rebate/single.yaml +20 -0
- policyengine_us/parameters/gov/states/hi/tax/income/credits/refundable.yaml +6 -0
- policyengine_us/parameters/gov/states/id/tax/income/credits/2022_rebate/floor.yaml +1 -1
- policyengine_us/parameters/gov/states/id/tax/income/credits/2022_rebate/rate.yaml +1 -1
- policyengine_us/parameters/gov/states/id/tax/income/credits/refundable.yaml +4 -4
- policyengine_us/parameters/gov/states/id/tax/income/credits/special_seasonal_rebate/floor.yaml +5 -5
- policyengine_us/parameters/gov/states/id/tax/income/credits/special_seasonal_rebate/rate.yaml +1 -1
- policyengine_us/parameters/gov/states/il/tax/income/credits/income_tax_rebate/amount/dependent.yaml +10 -0
- policyengine_us/parameters/gov/states/il/tax/income/credits/income_tax_rebate/amount/joint.yaml +20 -0
- policyengine_us/parameters/gov/states/il/tax/income/credits/income_tax_rebate/amount/other.yaml +20 -0
- policyengine_us/parameters/gov/states/il/tax/income/credits/income_tax_rebate/max_dependents.yaml +10 -0
- policyengine_us/parameters/gov/states/il/tax/income/credits/refundable.yaml +5 -0
- policyengine_us/parameters/gov/states/in/tax/income/credits/automatic_refund_rebate/amount/additional.yaml +10 -0
- policyengine_us/parameters/gov/states/in/tax/income/credits/automatic_refund_rebate/amount/base.yaml +12 -0
- policyengine_us/parameters/gov/states/in/tax/income/credits/refundable.yaml +6 -1
- policyengine_us/parameters/gov/states/ma/tax/income/credits/refundable.yaml +12 -0
- policyengine_us/parameters/gov/states/ma/tax/income/credits/taxpayer_refund_rebate/rate.yaml +10 -0
- policyengine_us/parameters/gov/states/me/tax/income/credits/refundable.yaml +6 -0
- policyengine_us/parameters/gov/states/me/tax/income/credits/relief_rebate/amount.yaml +10 -0
- policyengine_us/parameters/gov/states/me/tax/income/credits/relief_rebate/income_limit.yaml +21 -0
- policyengine_us/parameters/gov/states/mn/tax/income/credits/cwfc/ctc/age_limit.yaml +14 -0
- policyengine_us/parameters/gov/states/mt/tax/income/credits/non_refundable.yaml +1 -4
- policyengine_us/parameters/gov/states/mt/tax/income/credits/rebate/amount.yaml +5 -5
- policyengine_us/parameters/gov/states/ri/tax/income/credits/child_tax_rebate/amount.yaml +1 -1
- policyengine_us/parameters/gov/states/ri/tax/income/credits/child_tax_rebate/limit/age.yaml +1 -1
- policyengine_us/parameters/gov/states/ri/tax/income/credits/child_tax_rebate/limit/child.yaml +1 -1
- policyengine_us/parameters/gov/states/ri/tax/income/credits/child_tax_rebate/limit/income.yaml +5 -5
- policyengine_us/parameters/gov/states/ri/tax/income/credits/refundable.yaml +1 -4
- policyengine_us/parameters/gov/states/sc/tax/income/credits/2022_rebate/amount.yaml +12 -0
- policyengine_us/parameters/gov/states/sc/tax/income/credits/non_refundable.yaml +7 -1
- policyengine_us/parameters/gov/states/va/tax/income/credits/non_refundable.yaml +6 -2
- policyengine_us/parameters/gov/states/va/tax/income/rebate/amount.yaml +10 -0
- policyengine_us/reforms/reforms.py +8 -0
- policyengine_us/reforms/states/ri/__init__.py +2 -0
- policyengine_us/reforms/states/ri/ctc/__init__.py +1 -0
- policyengine_us/reforms/states/ri/ctc/ri_ctc_reform.py +176 -0
- policyengine_us/reforms/states/ri/exemption/__init__.py +1 -0
- policyengine_us/reforms/states/ri/exemption/ri_exemption_reform.py +137 -0
- policyengine_us/tests/policy/baseline/gov/irs/integration/us_itemize.yaml +1 -1
- policyengine_us/tests/policy/baseline/gov/states/ca/tax/income/integration.yaml +50 -0
- policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/co_tabor_cash_back.yaml +71 -0
- policyengine_us/tests/policy/baseline/gov/states/co/tax/income/integration.yaml +38 -0
- policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/credits/hi_act_115_rebate.yaml +35 -0
- policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/integration.yaml +63 -0
- policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_income_tax_rebate.yaml +49 -0
- policyengine_us/tests/policy/baseline/gov/states/il/tax/income/credits/il_income_tax_rebate_eligible.yaml +35 -0
- policyengine_us/tests/policy/baseline/gov/states/in/tax/income/credits/in_automatic_refund_rebate.yaml +47 -0
- policyengine_us/tests/policy/baseline/gov/states/ma/tax/income/credits/ma_taxpayer_refund_rebate.yaml +42 -0
- policyengine_us/tests/policy/baseline/gov/states/ma/tax/income/integration_ma.yaml +6 -0
- policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/me_relief_rebate.yaml +26 -0
- policyengine_us/tests/policy/baseline/gov/states/me/tax/income/credits/me_relief_rebate_eligible.yaml +35 -0
- policyengine_us/tests/policy/baseline/gov/states/mn/tax/income/credits/mn_child_and_working_families_credits_ctc_eligible_child.yaml +26 -0
- policyengine_us/tests/policy/baseline/gov/states/mn/tax/income/mn_integration.yaml +55 -0
- policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/integration.yaml +3 -0
- policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/integration.yaml +47 -0
- policyengine_us/tests/policy/baseline/gov/states/sc/tax/income/credits/sc_2022_rebate.yaml +76 -0
- policyengine_us/tests/policy/baseline/gov/states/va/tax/income/integration.yaml +2 -0
- policyengine_us/tests/policy/contrib/states/ri/ctc_reform_test.yaml +177 -0
- policyengine_us/tests/policy/contrib/states/ri/exemption_reform_test.yaml +88 -0
- policyengine_us/variables/gov/states/co/tax/income/credits/co_tabor_cash_back.py +17 -0
- policyengine_us/variables/gov/states/hi/tax/income/credits/hi_act_115_rebate.py +32 -0
- policyengine_us/variables/gov/states/il/tax/income/credits/il_income_tax_rebate.py +27 -0
- policyengine_us/variables/gov/states/il/tax/income/credits/il_income_tax_rebate_eligible.py +24 -0
- policyengine_us/variables/gov/states/in/tax/income/credits/in_automatic_refund_rebate.py +26 -0
- policyengine_us/variables/gov/states/ma/tax/income/credits/ma_taxpayer_refund_rebate.py +29 -0
- policyengine_us/variables/gov/states/me/tax/income/credits/me_relief_rebate.py +16 -0
- policyengine_us/variables/gov/states/me/tax/income/credits/me_relief_rebate_eligible.py +17 -0
- policyengine_us/variables/gov/states/mn/tax/income/credits/mn_child_and_working_families_credits.py +5 -1
- policyengine_us/variables/gov/states/mn/tax/income/credits/mn_child_and_working_families_credits_ctc_eligible_child.py +24 -0
- policyengine_us/variables/gov/states/mt/tax/income/credits/rebate/mt_income_tax_rebate.py +1 -2
- policyengine_us/variables/gov/states/sc/tax/income/credits/sc_2022_rebate.py +29 -0
- {policyengine_us-1.423.0.dist-info → policyengine_us-1.424.1.dist-info}/METADATA +1 -1
- {policyengine_us-1.423.0.dist-info → policyengine_us-1.424.1.dist-info}/RECORD +98 -46
- policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/credits/hi_low_income_household_renters/integration.yaml +0 -61
- policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/agi/subtractions/taxable_retirement_income/integration.yaml +0 -45
- {policyengine_us-1.423.0.dist-info → policyengine_us-1.424.1.dist-info}/WHEEL +0 -0
- {policyengine_us-1.423.0.dist-info → policyengine_us-1.424.1.dist-info}/entry_points.txt +0 -0
- {policyengine_us-1.423.0.dist-info → policyengine_us-1.424.1.dist-info}/licenses/LICENSE +0 -0
policyengine_us/parameters/gov/states/ri/tax/income/credits/child_tax_rebate/limit/income.yaml
CHANGED
|
@@ -13,12 +13,12 @@ metadata:
|
|
|
13
13
|
href: http://webserver.rilin.state.ri.us/Statutes/TITLE44/44-30/44-VI/44-30-103.htm
|
|
14
14
|
|
|
15
15
|
SINGLE:
|
|
16
|
-
|
|
16
|
+
2021-01-01: 100_000
|
|
17
17
|
JOINT:
|
|
18
|
-
|
|
18
|
+
2021-01-01: 200_000
|
|
19
19
|
SEPARATE:
|
|
20
|
-
|
|
20
|
+
2021-01-01: 100_000
|
|
21
21
|
HEAD_OF_HOUSEHOLD:
|
|
22
|
-
|
|
22
|
+
2021-01-01: 100_000
|
|
23
23
|
SURVIVING_SPOUSE:
|
|
24
|
-
|
|
24
|
+
2021-01-01: 100_000
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
description: South Carolina provides a 2022 rebate of this amount.
|
|
2
|
+
values:
|
|
3
|
+
2021-01-01: 800
|
|
4
|
+
metadata:
|
|
5
|
+
unit: currency-USD
|
|
6
|
+
period: year
|
|
7
|
+
label: South Carolina 2022 rebate amount
|
|
8
|
+
reference:
|
|
9
|
+
- title: South Carolina General Assembly, S1087, Section 6, (B)
|
|
10
|
+
# The house bill initially appropriated a $700 rebate which was increased to $800 due to sufficient funds
|
|
11
|
+
# https://dor.sc.gov/rebate-2022
|
|
12
|
+
href: https://www.scstatehouse.gov/sess124_2021-2022/bills/1087.htm
|
|
@@ -1,11 +1,17 @@
|
|
|
1
|
-
description: South Carolina non-refundable tax credits.
|
|
1
|
+
description: South Carolina provides the following non-refundable tax credits.
|
|
2
2
|
values:
|
|
3
3
|
2021-01-01:
|
|
4
4
|
- sc_cdcc
|
|
5
5
|
- sc_eitc
|
|
6
6
|
- sc_two_wage_earner_credit
|
|
7
|
+
- sc_2022_rebate
|
|
8
|
+
2022-01-01:
|
|
9
|
+
- sc_cdcc
|
|
10
|
+
- sc_eitc
|
|
11
|
+
- sc_two_wage_earner_credit
|
|
7
12
|
metadata:
|
|
8
13
|
unit: list
|
|
14
|
+
period: year
|
|
9
15
|
label: South Carolina non-refundable tax credits
|
|
10
16
|
reference:
|
|
11
17
|
- title: SC 1040 tax form (2021)
|
|
@@ -1,12 +1,16 @@
|
|
|
1
|
-
description: Virginia non-refundable tax credits.
|
|
1
|
+
description: Virginia provides the following non-refundable tax credits.
|
|
2
2
|
values:
|
|
3
3
|
2021-01-01:
|
|
4
4
|
- va_non_refundable_eitc
|
|
5
|
+
- va_rebate
|
|
6
|
+
2022-01-01:
|
|
7
|
+
- va_non_refundable_eitc
|
|
5
8
|
2023-01-01:
|
|
6
9
|
- va_non_refundable_eitc
|
|
7
10
|
- va_rebate
|
|
8
|
-
|
|
11
|
+
2024-01-01:
|
|
9
12
|
- va_non_refundable_eitc
|
|
13
|
+
|
|
10
14
|
metadata:
|
|
11
15
|
unit: list
|
|
12
16
|
period: year
|
|
@@ -19,12 +19,22 @@ metadata:
|
|
|
19
19
|
# House Bill 1600 reauthorized rebate for tax year 2024
|
|
20
20
|
|
|
21
21
|
JOINT:
|
|
22
|
+
2021-01-01: 500
|
|
23
|
+
2022-01-01: 0
|
|
22
24
|
2023-01-01: 400
|
|
23
25
|
SINGLE:
|
|
26
|
+
2021-01-01: 250
|
|
27
|
+
2022-01-01: 0
|
|
24
28
|
2023-01-01: 200
|
|
25
29
|
SEPARATE:
|
|
30
|
+
2021-01-01: 250
|
|
31
|
+
2022-01-01: 0
|
|
26
32
|
2023-01-01: 200
|
|
27
33
|
HEAD_OF_HOUSEHOLD:
|
|
34
|
+
2021-01-01: 250
|
|
35
|
+
2022-01-01: 0
|
|
28
36
|
2023-01-01: 200
|
|
29
37
|
SURVIVING_SPOUSE:
|
|
38
|
+
2021-01-01: 250
|
|
39
|
+
2022-01-01: 0
|
|
30
40
|
2023-01-01: 200
|
|
@@ -110,6 +110,10 @@ from .crfb import (
|
|
|
110
110
|
create_non_refundable_ss_credit_reform,
|
|
111
111
|
create_senior_deduction_extension_reform,
|
|
112
112
|
)
|
|
113
|
+
from .states.ri.ctc.ri_ctc_reform import create_ri_ctc_reform
|
|
114
|
+
from .states.ri.exemption.ri_exemption_reform import (
|
|
115
|
+
create_ri_exemption_reform_fn,
|
|
116
|
+
)
|
|
113
117
|
from .aca import (
|
|
114
118
|
create_aca_ptc_additional_bracket_reform,
|
|
115
119
|
create_aca_ptc_simplified_bracket_reform,
|
|
@@ -257,6 +261,8 @@ def create_structural_reforms_from_parameters(parameters, period):
|
|
|
257
261
|
ctc_minimum_refundable_amount = (
|
|
258
262
|
create_ctc_minimum_refundable_amount_reform(parameters, period)
|
|
259
263
|
)
|
|
264
|
+
ri_ctc = create_ri_ctc_reform(parameters, period)
|
|
265
|
+
ri_exemption = create_ri_exemption_reform_fn(parameters, period)
|
|
260
266
|
aca_ptc_additional_bracket = create_aca_ptc_additional_bracket_reform(
|
|
261
267
|
parameters, period
|
|
262
268
|
)
|
|
@@ -314,6 +320,8 @@ def create_structural_reforms_from_parameters(parameters, period):
|
|
|
314
320
|
ctc_per_child_phase_out,
|
|
315
321
|
ctc_per_child_phase_in,
|
|
316
322
|
ctc_minimum_refundable_amount,
|
|
323
|
+
ri_ctc,
|
|
324
|
+
ri_exemption,
|
|
317
325
|
aca_ptc_additional_bracket,
|
|
318
326
|
aca_ptc_simplified_bracket,
|
|
319
327
|
]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .ri_ctc_reform import create_ri_ctc_reform
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
from policyengine_us.model_api import *
|
|
2
|
+
from policyengine_core.periods import period as period_
|
|
3
|
+
from policyengine_core.periods import instant
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def create_ri_ctc() -> Reform:
|
|
7
|
+
class ri_ctc_eligible_children(Variable):
|
|
8
|
+
value_type = int
|
|
9
|
+
entity = TaxUnit
|
|
10
|
+
label = "Rhode Island CTC eligible children count"
|
|
11
|
+
definition_period = YEAR
|
|
12
|
+
defined_for = StateCode.RI
|
|
13
|
+
|
|
14
|
+
def formula(tax_unit, period, parameters):
|
|
15
|
+
p = parameters(period).gov.contrib.states.ri.ctc
|
|
16
|
+
|
|
17
|
+
person = tax_unit.members
|
|
18
|
+
age = person("age", period)
|
|
19
|
+
is_dependent = person("is_tax_unit_dependent", period)
|
|
20
|
+
|
|
21
|
+
# Check age eligibility
|
|
22
|
+
meets_age = age < p.age_limit
|
|
23
|
+
|
|
24
|
+
eligible = is_dependent & meets_age
|
|
25
|
+
return tax_unit.sum(eligible)
|
|
26
|
+
|
|
27
|
+
class ri_ctc_maximum(Variable):
|
|
28
|
+
value_type = float
|
|
29
|
+
entity = TaxUnit
|
|
30
|
+
label = "Rhode Island CTC maximum amount before phaseout"
|
|
31
|
+
unit = USD
|
|
32
|
+
definition_period = YEAR
|
|
33
|
+
defined_for = StateCode.RI
|
|
34
|
+
|
|
35
|
+
def formula(tax_unit, period, parameters):
|
|
36
|
+
p = parameters(period).gov.contrib.states.ri.ctc
|
|
37
|
+
|
|
38
|
+
eligible_children = tax_unit("ri_ctc_eligible_children", period)
|
|
39
|
+
return eligible_children * p.amount
|
|
40
|
+
|
|
41
|
+
class ri_ctc_phaseout(Variable):
|
|
42
|
+
value_type = float
|
|
43
|
+
entity = TaxUnit
|
|
44
|
+
label = "Rhode Island CTC phaseout amount"
|
|
45
|
+
unit = USD
|
|
46
|
+
definition_period = YEAR
|
|
47
|
+
defined_for = StateCode.RI
|
|
48
|
+
|
|
49
|
+
def formula(tax_unit, period, parameters):
|
|
50
|
+
p = parameters(period).gov.contrib.states.ri.ctc
|
|
51
|
+
|
|
52
|
+
filing_status = tax_unit("filing_status", period)
|
|
53
|
+
agi = tax_unit("ri_agi", period)
|
|
54
|
+
|
|
55
|
+
threshold = p.phaseout.threshold[filing_status]
|
|
56
|
+
excess_income = max_(agi - threshold, 0)
|
|
57
|
+
return excess_income * p.phaseout.rate
|
|
58
|
+
|
|
59
|
+
class ri_total_ctc(Variable):
|
|
60
|
+
value_type = float
|
|
61
|
+
entity = TaxUnit
|
|
62
|
+
label = "Rhode Island Child Tax Credit"
|
|
63
|
+
unit = USD
|
|
64
|
+
definition_period = YEAR
|
|
65
|
+
defined_for = StateCode.RI
|
|
66
|
+
|
|
67
|
+
def formula(tax_unit, period, parameters):
|
|
68
|
+
p = parameters(period).gov.contrib.states.ri.ctc
|
|
69
|
+
|
|
70
|
+
# Calculate maximum credit
|
|
71
|
+
maximum = tax_unit("ri_ctc_maximum", period)
|
|
72
|
+
|
|
73
|
+
# Apply phaseout
|
|
74
|
+
phaseout = tax_unit("ri_ctc_phaseout", period)
|
|
75
|
+
|
|
76
|
+
return max_(maximum - phaseout, 0)
|
|
77
|
+
|
|
78
|
+
class ri_refundable_ctc(Variable):
|
|
79
|
+
value_type = float
|
|
80
|
+
entity = TaxUnit
|
|
81
|
+
label = "Rhode Island CTC refundable portion"
|
|
82
|
+
unit = USD
|
|
83
|
+
definition_period = YEAR
|
|
84
|
+
defined_for = StateCode.RI
|
|
85
|
+
|
|
86
|
+
def formula(tax_unit, period, parameters):
|
|
87
|
+
p = parameters(period).gov.contrib.states.ri.ctc
|
|
88
|
+
|
|
89
|
+
total_credit = tax_unit("ri_total_ctc", period)
|
|
90
|
+
|
|
91
|
+
# The refundable portion is the minimum of the cap and total credit
|
|
92
|
+
# This ensures the refundable amount never exceeds the total credit
|
|
93
|
+
# - If cap = 0: credit is nonrefundable
|
|
94
|
+
# - If 0 < cap < total_credit: credit is partially refundable
|
|
95
|
+
# - If cap >= total_credit: credit is fully refundable
|
|
96
|
+
return min_(total_credit, p.refundability.cap)
|
|
97
|
+
|
|
98
|
+
class ri_non_refundable_ctc(Variable):
|
|
99
|
+
value_type = float
|
|
100
|
+
entity = TaxUnit
|
|
101
|
+
label = "Rhode Island CTC non-refundable portion"
|
|
102
|
+
unit = USD
|
|
103
|
+
definition_period = YEAR
|
|
104
|
+
defined_for = StateCode.RI
|
|
105
|
+
|
|
106
|
+
def formula(tax_unit, period, parameters):
|
|
107
|
+
p = parameters(period).gov.contrib.states.ri.ctc
|
|
108
|
+
|
|
109
|
+
total_credit = tax_unit("ri_total_ctc", period)
|
|
110
|
+
refundable_portion = tax_unit("ri_refundable_ctc", period)
|
|
111
|
+
return max_(total_credit - refundable_portion, 0)
|
|
112
|
+
|
|
113
|
+
def modify_parameters(parameters):
|
|
114
|
+
# Add ri_refundable_ctc to refundable credits list
|
|
115
|
+
refundable = parameters.gov.states.ri.tax.income.credits.refundable
|
|
116
|
+
current_refundable = refundable(instant("2025-01-01"))
|
|
117
|
+
if "ri_refundable_ctc" not in current_refundable:
|
|
118
|
+
new_refundable = list(current_refundable) + ["ri_refundable_ctc"]
|
|
119
|
+
refundable.update(
|
|
120
|
+
start=instant("2025-01-01"),
|
|
121
|
+
stop=instant("2100-12-31"),
|
|
122
|
+
value=new_refundable,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
# Add ri_non_refundable_ctc to non-refundable credits list
|
|
126
|
+
non_refundable = (
|
|
127
|
+
parameters.gov.states.ri.tax.income.credits.non_refundable
|
|
128
|
+
)
|
|
129
|
+
current_non_refundable = non_refundable(instant("2025-01-01"))
|
|
130
|
+
if "ri_non_refundable_ctc" not in current_non_refundable:
|
|
131
|
+
new_non_refundable = list(current_non_refundable) + [
|
|
132
|
+
"ri_non_refundable_ctc"
|
|
133
|
+
]
|
|
134
|
+
non_refundable.update(
|
|
135
|
+
start=instant("2025-01-01"),
|
|
136
|
+
stop=instant("2100-12-31"),
|
|
137
|
+
value=new_non_refundable,
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
return parameters
|
|
141
|
+
|
|
142
|
+
class reform(Reform):
|
|
143
|
+
def apply(self):
|
|
144
|
+
self.update_variable(ri_ctc_eligible_children)
|
|
145
|
+
self.update_variable(ri_ctc_maximum)
|
|
146
|
+
self.update_variable(ri_ctc_phaseout)
|
|
147
|
+
self.update_variable(ri_total_ctc)
|
|
148
|
+
self.update_variable(ri_refundable_ctc)
|
|
149
|
+
self.update_variable(ri_non_refundable_ctc)
|
|
150
|
+
self.modify_parameters(modify_parameters)
|
|
151
|
+
|
|
152
|
+
return reform
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def create_ri_ctc_reform(parameters, period, bypass: bool = False):
|
|
156
|
+
if bypass:
|
|
157
|
+
return create_ri_ctc()
|
|
158
|
+
|
|
159
|
+
p = parameters.gov.contrib.states.ri.ctc
|
|
160
|
+
|
|
161
|
+
reform_active = False
|
|
162
|
+
current_period = period_(period)
|
|
163
|
+
|
|
164
|
+
for i in range(5):
|
|
165
|
+
if p(current_period).in_effect:
|
|
166
|
+
reform_active = True
|
|
167
|
+
break
|
|
168
|
+
current_period = current_period.offset(1, "year")
|
|
169
|
+
|
|
170
|
+
if reform_active:
|
|
171
|
+
return create_ri_ctc()
|
|
172
|
+
else:
|
|
173
|
+
return None
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
ri_ctc = create_ri_ctc_reform(None, None, bypass=True)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .ri_exemption_reform import create_ri_exemption_reform_fn
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
from policyengine_us.model_api import *
|
|
2
|
+
from policyengine_core.periods import period as period_
|
|
3
|
+
from policyengine_core.periods import instant
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def create_ri_exemption_reform() -> Reform:
|
|
7
|
+
class ri_eligible_dependents_count(Variable):
|
|
8
|
+
value_type = int
|
|
9
|
+
entity = TaxUnit
|
|
10
|
+
label = "Rhode Island eligible dependents count"
|
|
11
|
+
definition_period = YEAR
|
|
12
|
+
defined_for = StateCode.RI
|
|
13
|
+
|
|
14
|
+
def formula(tax_unit, period, parameters):
|
|
15
|
+
p = parameters(period).gov.contrib.states.ri.dependent_exemption
|
|
16
|
+
|
|
17
|
+
person = tax_unit.members
|
|
18
|
+
age = person("age", period)
|
|
19
|
+
is_dependent = person("is_tax_unit_dependent", period)
|
|
20
|
+
|
|
21
|
+
# Apply age limit if in effect
|
|
22
|
+
if p.age_limit.in_effect:
|
|
23
|
+
age_threshold = p.age_limit.threshold
|
|
24
|
+
eligible_dependents = is_dependent & (age < age_threshold)
|
|
25
|
+
else:
|
|
26
|
+
eligible_dependents = is_dependent
|
|
27
|
+
|
|
28
|
+
return tax_unit.sum(eligible_dependents)
|
|
29
|
+
|
|
30
|
+
class ri_dependent_exemption_maximum(Variable):
|
|
31
|
+
value_type = float
|
|
32
|
+
entity = TaxUnit
|
|
33
|
+
label = "Rhode Island dependent exemption maximum before phaseout"
|
|
34
|
+
unit = USD
|
|
35
|
+
definition_period = YEAR
|
|
36
|
+
defined_for = StateCode.RI
|
|
37
|
+
|
|
38
|
+
def formula(tax_unit, period, parameters):
|
|
39
|
+
p = parameters(period).gov.contrib.states.ri.dependent_exemption
|
|
40
|
+
|
|
41
|
+
dependents_count = tax_unit("ri_eligible_dependents_count", period)
|
|
42
|
+
return dependents_count * p.amount
|
|
43
|
+
|
|
44
|
+
class ri_dependent_exemption_phaseout(Variable):
|
|
45
|
+
value_type = float
|
|
46
|
+
entity = TaxUnit
|
|
47
|
+
label = "Rhode Island dependent exemption phaseout amount"
|
|
48
|
+
unit = USD
|
|
49
|
+
definition_period = YEAR
|
|
50
|
+
defined_for = StateCode.RI
|
|
51
|
+
|
|
52
|
+
def formula(tax_unit, period, parameters):
|
|
53
|
+
p = parameters(period).gov.contrib.states.ri.dependent_exemption
|
|
54
|
+
|
|
55
|
+
filing_status = tax_unit("filing_status", period)
|
|
56
|
+
agi = tax_unit("ri_agi", period)
|
|
57
|
+
|
|
58
|
+
threshold = p.phaseout.threshold[filing_status]
|
|
59
|
+
excess_income = max_(agi - threshold, 0)
|
|
60
|
+
return excess_income * p.phaseout.rate
|
|
61
|
+
|
|
62
|
+
class ri_dependent_exemption(Variable):
|
|
63
|
+
value_type = float
|
|
64
|
+
entity = TaxUnit
|
|
65
|
+
label = "Rhode Island dependent exemption"
|
|
66
|
+
unit = USD
|
|
67
|
+
definition_period = YEAR
|
|
68
|
+
defined_for = StateCode.RI
|
|
69
|
+
|
|
70
|
+
def formula(tax_unit, period, parameters):
|
|
71
|
+
p = parameters(period).gov.contrib.states.ri.dependent_exemption
|
|
72
|
+
|
|
73
|
+
maximum = tax_unit("ri_dependent_exemption_maximum", period)
|
|
74
|
+
phaseout = tax_unit("ri_dependent_exemption_phaseout", period)
|
|
75
|
+
|
|
76
|
+
return max_(maximum - phaseout, 0)
|
|
77
|
+
|
|
78
|
+
class ri_exemptions(Variable):
|
|
79
|
+
value_type = float
|
|
80
|
+
entity = TaxUnit
|
|
81
|
+
label = "Rhode Island exemptions"
|
|
82
|
+
unit = USD
|
|
83
|
+
definition_period = YEAR
|
|
84
|
+
defined_for = StateCode.RI
|
|
85
|
+
|
|
86
|
+
def formula(tax_unit, period, parameters):
|
|
87
|
+
p_base = parameters(period).gov.states.ri.tax.income.exemption
|
|
88
|
+
|
|
89
|
+
# Personal exemptions use baseline amount
|
|
90
|
+
filing_status = tax_unit("filing_status", period)
|
|
91
|
+
personal_exemptions = where(
|
|
92
|
+
filing_status == filing_status.possible_values.JOINT,
|
|
93
|
+
2,
|
|
94
|
+
1,
|
|
95
|
+
)
|
|
96
|
+
personal_exemption_amount = personal_exemptions * p_base.amount
|
|
97
|
+
|
|
98
|
+
# Add dependent exemption
|
|
99
|
+
dependent_exemption_amount = tax_unit(
|
|
100
|
+
"ri_dependent_exemption", period
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
return personal_exemption_amount + dependent_exemption_amount
|
|
104
|
+
|
|
105
|
+
class reform(Reform):
|
|
106
|
+
def apply(self):
|
|
107
|
+
self.update_variable(ri_eligible_dependents_count)
|
|
108
|
+
self.update_variable(ri_dependent_exemption_maximum)
|
|
109
|
+
self.update_variable(ri_dependent_exemption_phaseout)
|
|
110
|
+
self.update_variable(ri_dependent_exemption)
|
|
111
|
+
self.update_variable(ri_exemptions)
|
|
112
|
+
|
|
113
|
+
return reform
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def create_ri_exemption_reform_fn(parameters, period, bypass: bool = False):
|
|
117
|
+
if bypass:
|
|
118
|
+
return create_ri_exemption_reform()
|
|
119
|
+
|
|
120
|
+
p = parameters.gov.contrib.states.ri.dependent_exemption
|
|
121
|
+
|
|
122
|
+
reform_active = False
|
|
123
|
+
current_period = period_(period)
|
|
124
|
+
|
|
125
|
+
for i in range(5):
|
|
126
|
+
if p(current_period).in_effect:
|
|
127
|
+
reform_active = True
|
|
128
|
+
break
|
|
129
|
+
current_period = current_period.offset(1, "year")
|
|
130
|
+
|
|
131
|
+
if reform_active:
|
|
132
|
+
return create_ri_exemption_reform()
|
|
133
|
+
else:
|
|
134
|
+
return None
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
ri_exemption_reform = create_ri_exemption_reform_fn(None, None, bypass=True)
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
members: [person1]
|
|
50
50
|
state_code: IL # state income tax that does not depend on US tax
|
|
51
51
|
output:
|
|
52
|
-
state_income_tax:
|
|
52
|
+
state_income_tax: 4_526.4375
|
|
53
53
|
adjusted_gross_income: 100_000
|
|
54
54
|
taxable_income_deductions_if_not_itemizing: 12_550
|
|
55
55
|
taxable_income_deductions_if_itemizing: 8_000 + 10_000
|
|
@@ -59,3 +59,53 @@
|
|
|
59
59
|
state_fips: 6
|
|
60
60
|
output:
|
|
61
61
|
ca_income_tax: 791_292
|
|
62
|
+
|
|
63
|
+
- name: 0-CA.yaml
|
|
64
|
+
absolute_error_margin: 2
|
|
65
|
+
period: 2024
|
|
66
|
+
input:
|
|
67
|
+
people:
|
|
68
|
+
person1:
|
|
69
|
+
age: 40
|
|
70
|
+
employment_income: 0.0
|
|
71
|
+
ssi: 0
|
|
72
|
+
wic: 0
|
|
73
|
+
head_start: 0
|
|
74
|
+
early_head_start: 0
|
|
75
|
+
commodity_supplemental_food_program: 0
|
|
76
|
+
unemployment_compensation: 5440.0
|
|
77
|
+
qualified_dividend_income: 4.3401766
|
|
78
|
+
long_term_capital_gains: 27410.084
|
|
79
|
+
taxable_interest_income: 113.7181
|
|
80
|
+
is_tax_unit_head: true
|
|
81
|
+
person2:
|
|
82
|
+
age: 40
|
|
83
|
+
employment_income: 0.0
|
|
84
|
+
ssi: 0
|
|
85
|
+
wic: 0
|
|
86
|
+
head_start: 0
|
|
87
|
+
early_head_start: 0
|
|
88
|
+
commodity_supplemental_food_program: 0
|
|
89
|
+
qualified_dividend_income: 4.3401766
|
|
90
|
+
long_term_capital_gains: 27410.084
|
|
91
|
+
taxable_interest_income: 113.7181
|
|
92
|
+
is_tax_unit_spouse: true
|
|
93
|
+
tax_units:
|
|
94
|
+
tax_unit:
|
|
95
|
+
members: [person1, person2]
|
|
96
|
+
premium_tax_credit: 0
|
|
97
|
+
local_income_tax: 0
|
|
98
|
+
state_sales_tax: 0
|
|
99
|
+
spm_units:
|
|
100
|
+
spm_unit:
|
|
101
|
+
members: [person1, person2]
|
|
102
|
+
snap: 0
|
|
103
|
+
tanf: 0
|
|
104
|
+
free_school_meals: 0
|
|
105
|
+
reduced_price_school_meals: 0
|
|
106
|
+
households:
|
|
107
|
+
household:
|
|
108
|
+
members: [person1, person2]
|
|
109
|
+
state_fips: 6
|
|
110
|
+
output:
|
|
111
|
+
ca_income_tax: 371
|
policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/co_tabor_cash_back.yaml
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
- name: Non-joint tax unit receives single amount
|
|
2
|
+
period: 2021
|
|
3
|
+
input:
|
|
4
|
+
state_code: CO
|
|
5
|
+
tax_unit_is_joint: false
|
|
6
|
+
output:
|
|
7
|
+
co_tabor_cash_back: 750
|
|
8
|
+
|
|
9
|
+
- name: Joint tax unit receives joint amount
|
|
10
|
+
period: 2021
|
|
11
|
+
input:
|
|
12
|
+
state_code: CO
|
|
13
|
+
tax_unit_is_joint: true
|
|
14
|
+
output:
|
|
15
|
+
co_tabor_cash_back: 1_500
|
|
16
|
+
|
|
17
|
+
- name: Single filer receives single amount
|
|
18
|
+
period: 2021
|
|
19
|
+
input:
|
|
20
|
+
state_code: CO
|
|
21
|
+
filing_status: SINGLE
|
|
22
|
+
output:
|
|
23
|
+
co_tabor_cash_back: 750
|
|
24
|
+
|
|
25
|
+
- name: Joint filer receives joint amount
|
|
26
|
+
period: 2021
|
|
27
|
+
input:
|
|
28
|
+
state_code: CO
|
|
29
|
+
filing_status: JOINT
|
|
30
|
+
output:
|
|
31
|
+
co_tabor_cash_back: 1_500
|
|
32
|
+
|
|
33
|
+
- name: Married filing separately receives single amount
|
|
34
|
+
period: 2021
|
|
35
|
+
input:
|
|
36
|
+
state_code: CO
|
|
37
|
+
filing_status: SEPARATE
|
|
38
|
+
output:
|
|
39
|
+
co_tabor_cash_back: 750
|
|
40
|
+
|
|
41
|
+
- name: No cash back outside Colorado - non-joint
|
|
42
|
+
period: 2021
|
|
43
|
+
input:
|
|
44
|
+
state_code: CA
|
|
45
|
+
tax_unit_is_joint: false
|
|
46
|
+
output:
|
|
47
|
+
co_tabor_cash_back: 0
|
|
48
|
+
|
|
49
|
+
- name: No cash back outside Colorado - joint
|
|
50
|
+
period: 2021
|
|
51
|
+
input:
|
|
52
|
+
state_code: NY
|
|
53
|
+
tax_unit_is_joint: true
|
|
54
|
+
output:
|
|
55
|
+
co_tabor_cash_back: 0
|
|
56
|
+
|
|
57
|
+
- name: Head of household receives single amount
|
|
58
|
+
period: 2021
|
|
59
|
+
input:
|
|
60
|
+
state_code: CO
|
|
61
|
+
filing_status: HEAD_OF_HOUSEHOLD
|
|
62
|
+
output:
|
|
63
|
+
co_tabor_cash_back: 750
|
|
64
|
+
|
|
65
|
+
- name: Surviving spouse receives single amount
|
|
66
|
+
period: 2021
|
|
67
|
+
input:
|
|
68
|
+
state_code: CO
|
|
69
|
+
filing_status: SURVIVING_SPOUSE
|
|
70
|
+
output:
|
|
71
|
+
co_tabor_cash_back: 750
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
tax_unit:
|
|
22
22
|
members: [person1, person2]
|
|
23
23
|
aca_ptc: 0 # not in TAXSIM35
|
|
24
|
+
co_tabor_cash_back: 0
|
|
24
25
|
spm_units:
|
|
25
26
|
spm_unit:
|
|
26
27
|
members: [person1, person2]
|
|
@@ -31,3 +32,40 @@
|
|
|
31
32
|
output: # expected results from patched TAXSIM35 2023-08-31 version
|
|
32
33
|
co_taxable_income: 38230.00
|
|
33
34
|
co_income_tax: 1608.35
|
|
35
|
+
|
|
36
|
+
- name: 0-CO.yaml
|
|
37
|
+
absolute_error_margin: 2
|
|
38
|
+
period: 2024
|
|
39
|
+
input:
|
|
40
|
+
people:
|
|
41
|
+
person1:
|
|
42
|
+
age: 70
|
|
43
|
+
employment_income: 0.0
|
|
44
|
+
ssi: 0
|
|
45
|
+
wic: 0
|
|
46
|
+
head_start: 0
|
|
47
|
+
early_head_start: 0
|
|
48
|
+
commodity_supplemental_food_program: 0
|
|
49
|
+
short_term_capital_gains: -2020.4384
|
|
50
|
+
taxable_interest_income: 0.4384
|
|
51
|
+
is_tax_unit_head: true
|
|
52
|
+
tax_units:
|
|
53
|
+
tax_unit:
|
|
54
|
+
members: [person1]
|
|
55
|
+
premium_tax_credit: 0
|
|
56
|
+
local_income_tax: 0
|
|
57
|
+
state_sales_tax: 0
|
|
58
|
+
spm_units:
|
|
59
|
+
spm_unit:
|
|
60
|
+
members: [person1]
|
|
61
|
+
snap: 0
|
|
62
|
+
tanf: 0
|
|
63
|
+
free_school_meals: 0
|
|
64
|
+
reduced_price_school_meals: 0
|
|
65
|
+
households:
|
|
66
|
+
household:
|
|
67
|
+
members: [person1]
|
|
68
|
+
state_fips: 8
|
|
69
|
+
output:
|
|
70
|
+
co_sales_tax_refund: 177
|
|
71
|
+
co_income_tax: -977
|