policyengine-us 1.413.2__py3-none-any.whl → 1.417.3__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/aca/ptc_simplified_bracket/brackets.yaml +6 -6
- policyengine_us/parameters/gov/contrib/aca/ptc_simplified_bracket/income_eligibility.yaml +6 -6
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/baby_bonus_act/age_limit.yaml +8 -0
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/baby_bonus_act/amount.yaml +13 -0
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/baby_bonus_act/in_effect.yaml +8 -0
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/baby_bonus_act/min_birth_year.yaml +8 -0
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/amount.yaml +13 -0
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/in_effect.yaml +8 -0
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/max_age.yaml +8 -0
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/min_age.yaml +8 -0
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/tax/rate.yaml +8 -0
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/tax/threshold.yaml +24 -0
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/end_child_poverty_act/adult_dependent_credit/amount.yaml +9 -0
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/end_child_poverty_act/adult_dependent_credit/min_age.yaml +8 -0
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/end_child_poverty_act/child_benefit/age_limit.yaml +8 -0
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/end_child_poverty_act/filer_credit/amount.yaml +20 -0
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/end_child_poverty_act/filer_credit/eligibility/max_age.yaml +10 -0
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/end_child_poverty_act/filer_credit/eligibility/min_age.yaml +8 -0
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/end_child_poverty_act/filer_credit/phase_out/rate.yaml +8 -0
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/end_child_poverty_act/filer_credit/phase_out/start.yaml +20 -0
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/end_child_poverty_act/in_effect.yaml +8 -0
- policyengine_us/parameters/gov/states/tx/fpp/age_threshold.yaml +10 -0
- policyengine_us/parameters/gov/states/tx/fpp/annual_benefit.yaml +12 -0
- policyengine_us/parameters/gov/states/tx/fpp/fpg_percentage.yaml +15 -0
- policyengine_us/reforms/congress/tlaib/__init__.py +4 -0
- policyengine_us/reforms/congress/tlaib/income_security_package/__init__.py +17 -0
- policyengine_us/reforms/congress/tlaib/income_security_package/income_security_package.py +402 -0
- policyengine_us/reforms/ctc/ctc_minimum_refundable_amount.py +11 -0
- policyengine_us/reforms/reforms.py +6 -0
- policyengine_us/tests/policy/baseline/gov/states/tx/fpp/integration.yaml +133 -0
- policyengine_us/tests/policy/baseline/gov/states/tx/fpp/tx_fpp_age_eligible.yaml +39 -0
- policyengine_us/tests/policy/baseline/gov/states/tx/fpp/tx_fpp_benefit.yaml +39 -0
- policyengine_us/tests/policy/baseline/gov/states/tx/fpp/tx_fpp_income_eligible.yaml +53 -0
- policyengine_us/tests/policy/baseline/gov/states/tx/fpp/tx_fpp_income_limit.yaml +44 -0
- policyengine_us/tests/policy/baseline/household/demographic/geographic/in_nyc.yaml +20 -0
- policyengine_us/tests/policy/contrib/aca/ptc_simplified_bracket.yaml +12 -12
- policyengine_us/tests/policy/contrib/congress/tlaib/end_child_poverty_act/integration.yaml +0 -42
- policyengine_us/tests/policy/contrib/congress/tlaib/income_security/integration.yaml +154 -0
- policyengine_us/tests/policy/contrib/congress/tlaib/income_security/state_integration.yaml +115 -0
- policyengine_us/tests/policy/contrib/congress/tlaib/income_security/test_individual_acts.yaml +149 -0
- policyengine_us/tests/policy/contrib/congress/tlaib/income_security/unit_tests.yaml +272 -0
- policyengine_us/variables/gov/states/tx/fpp/tx_fpp_age_eligible.py +16 -0
- policyengine_us/variables/gov/states/tx/fpp/tx_fpp_benefit.py +15 -0
- policyengine_us/variables/gov/states/tx/fpp/tx_fpp_eligible.py +18 -0
- policyengine_us/variables/gov/states/tx/fpp/tx_fpp_income_eligible.py +18 -0
- policyengine_us/variables/gov/states/tx/fpp/tx_fpp_income_limit.py +24 -0
- policyengine_us/variables/household/demographic/geographic/in_nyc.py +12 -3
- {policyengine_us-1.413.2.dist-info → policyengine_us-1.417.3.dist-info}/METADATA +1 -1
- {policyengine_us-1.413.2.dist-info → policyengine_us-1.417.3.dist-info}/RECORD +53 -15
- policyengine_us/parameters/gov/states/tx/index.yaml +0 -4
- /policyengine_us/variables/gov/states/oh/tax/income/{oh_modifed_agi.py → oh_modified_agi.py} +0 -0
- {policyengine_us-1.413.2.dist-info → policyengine_us-1.417.3.dist-info}/WHEEL +0 -0
- {policyengine_us-1.413.2.dist-info → policyengine_us-1.417.3.dist-info}/entry_points.txt +0 -0
- {policyengine_us-1.413.2.dist-info → policyengine_us-1.417.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
from policyengine_us.model_api import *
|
|
2
|
+
from policyengine_core.periods import period as period_
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def create_income_security_package() -> Reform:
|
|
6
|
+
class baby_bonus_act_payment(Variable):
|
|
7
|
+
value_type = float
|
|
8
|
+
entity = Person
|
|
9
|
+
definition_period = YEAR
|
|
10
|
+
label = "Baby Bonus Act payment"
|
|
11
|
+
unit = USD
|
|
12
|
+
documentation = (
|
|
13
|
+
"One-time payment for newborns under the Baby Bonus Act"
|
|
14
|
+
)
|
|
15
|
+
reference = "placeholder - bill not yet introduced"
|
|
16
|
+
|
|
17
|
+
def formula(person, period, parameters):
|
|
18
|
+
p = parameters(
|
|
19
|
+
period
|
|
20
|
+
).gov.contrib.congress.tlaib.income_security_package.baby_bonus_act
|
|
21
|
+
|
|
22
|
+
# Baby bonus is for those born in 2026 and after, paid in their birth year
|
|
23
|
+
birth_year = person("birth_year", period)
|
|
24
|
+
|
|
25
|
+
age = person("age", period)
|
|
26
|
+
|
|
27
|
+
# Payment only in the birth year for those born 2026+
|
|
28
|
+
is_eligible = (birth_year >= p.min_birth_year) & (
|
|
29
|
+
age < p.age_limit
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
return is_eligible * p.amount
|
|
33
|
+
|
|
34
|
+
class boost_act_payment(Variable):
|
|
35
|
+
value_type = float
|
|
36
|
+
entity = Person
|
|
37
|
+
definition_period = YEAR
|
|
38
|
+
label = "BOOST Act payment"
|
|
39
|
+
unit = USD
|
|
40
|
+
documentation = (
|
|
41
|
+
"Monthly payments under the BOOST Act for eligible adults"
|
|
42
|
+
)
|
|
43
|
+
reference = "placeholder - bill not yet introduced"
|
|
44
|
+
|
|
45
|
+
def formula(person, period, parameters):
|
|
46
|
+
p = parameters(
|
|
47
|
+
period
|
|
48
|
+
).gov.contrib.congress.tlaib.income_security_package.boost_act
|
|
49
|
+
|
|
50
|
+
age = person("age", period)
|
|
51
|
+
is_eligible = (age >= p.min_age) & (age <= p.max_age)
|
|
52
|
+
|
|
53
|
+
annual_amount = p.amount * MONTHS_IN_YEAR
|
|
54
|
+
|
|
55
|
+
return is_eligible * annual_amount
|
|
56
|
+
|
|
57
|
+
class boost_act_tax(Variable):
|
|
58
|
+
value_type = float
|
|
59
|
+
entity = TaxUnit
|
|
60
|
+
definition_period = YEAR
|
|
61
|
+
label = "BOOST Act supplemental tax"
|
|
62
|
+
unit = USD
|
|
63
|
+
documentation = "Supplemental tax on AGI to fund the BOOST Act"
|
|
64
|
+
reference = "placeholder - bill not yet introduced"
|
|
65
|
+
|
|
66
|
+
def formula(tax_unit, period, parameters):
|
|
67
|
+
p = parameters(
|
|
68
|
+
period
|
|
69
|
+
).gov.contrib.congress.tlaib.income_security_package.boost_act
|
|
70
|
+
|
|
71
|
+
agi = tax_unit("adjusted_gross_income", period)
|
|
72
|
+
filing_status = tax_unit("filing_status", period)
|
|
73
|
+
|
|
74
|
+
excess_agi = max_(agi - p.tax.threshold[filing_status], 0)
|
|
75
|
+
|
|
76
|
+
return excess_agi * p.tax.rate
|
|
77
|
+
|
|
78
|
+
class ecpa_child_benefit(Variable):
|
|
79
|
+
value_type = float
|
|
80
|
+
entity = Person
|
|
81
|
+
definition_period = YEAR
|
|
82
|
+
label = "End Child Poverty Act child benefit"
|
|
83
|
+
unit = USD
|
|
84
|
+
documentation = (
|
|
85
|
+
"Universal child benefit under the End Child Poverty Act"
|
|
86
|
+
)
|
|
87
|
+
reference = "placeholder - bill not yet introduced"
|
|
88
|
+
|
|
89
|
+
def formula(person, period, parameters):
|
|
90
|
+
p = parameters(
|
|
91
|
+
period
|
|
92
|
+
).gov.contrib.congress.tlaib.income_security_package.end_child_poverty_act
|
|
93
|
+
|
|
94
|
+
age = person("age", period)
|
|
95
|
+
is_eligible = age < p.child_benefit.age_limit
|
|
96
|
+
|
|
97
|
+
# Use FPG additional_person amount (CONTIGUOUS_US for all states), rounded to nearest $10
|
|
98
|
+
p_fpg = parameters(period).gov.hhs.fpg
|
|
99
|
+
fpg_amount = p_fpg.additional_person.CONTIGUOUS_US
|
|
100
|
+
amount = round(fpg_amount / 10) * 10
|
|
101
|
+
|
|
102
|
+
return is_eligible * amount
|
|
103
|
+
|
|
104
|
+
class ecpa_adult_dependent_credit(Variable):
|
|
105
|
+
value_type = float
|
|
106
|
+
entity = Person
|
|
107
|
+
definition_period = YEAR
|
|
108
|
+
label = "End Child Poverty Act adult dependent credit"
|
|
109
|
+
unit = USD
|
|
110
|
+
documentation = (
|
|
111
|
+
"Credit for adult dependents under the End Child Poverty Act"
|
|
112
|
+
)
|
|
113
|
+
reference = "placeholder - bill not yet introduced"
|
|
114
|
+
|
|
115
|
+
def formula(person, period, parameters):
|
|
116
|
+
p = parameters(
|
|
117
|
+
period
|
|
118
|
+
).gov.contrib.congress.tlaib.income_security_package.end_child_poverty_act
|
|
119
|
+
|
|
120
|
+
age = person("age", period)
|
|
121
|
+
is_dependent = person("is_tax_unit_dependent", period)
|
|
122
|
+
|
|
123
|
+
is_eligible = (
|
|
124
|
+
age >= p.adult_dependent_credit.min_age
|
|
125
|
+
) & is_dependent
|
|
126
|
+
|
|
127
|
+
return is_eligible * p.adult_dependent_credit.amount
|
|
128
|
+
|
|
129
|
+
class ecpa_filer_credit(Variable):
|
|
130
|
+
value_type = float
|
|
131
|
+
entity = TaxUnit
|
|
132
|
+
definition_period = YEAR
|
|
133
|
+
label = "End Child Poverty Act filer credit"
|
|
134
|
+
unit = USD
|
|
135
|
+
documentation = "Filer credit under the End Child Poverty Act for eligible tax filers"
|
|
136
|
+
reference = "placeholder - bill not yet introduced"
|
|
137
|
+
|
|
138
|
+
def formula(tax_unit, period, parameters):
|
|
139
|
+
p = parameters(
|
|
140
|
+
period
|
|
141
|
+
).gov.contrib.congress.tlaib.income_security_package.end_child_poverty_act
|
|
142
|
+
|
|
143
|
+
person = tax_unit.members
|
|
144
|
+
age = person("age", period)
|
|
145
|
+
|
|
146
|
+
is_head_or_spouse = person("is_tax_unit_head_or_spouse", period)
|
|
147
|
+
|
|
148
|
+
is_eligible_age = (age >= p.filer_credit.eligibility.min_age) & (
|
|
149
|
+
age < p.filer_credit.eligibility.max_age
|
|
150
|
+
)
|
|
151
|
+
is_eligible_filer = is_head_or_spouse & is_eligible_age
|
|
152
|
+
|
|
153
|
+
has_eligible_filer = tax_unit.any(is_eligible_filer)
|
|
154
|
+
|
|
155
|
+
filing_status = tax_unit("filing_status", period)
|
|
156
|
+
amount = p.filer_credit.amount[filing_status]
|
|
157
|
+
|
|
158
|
+
agi = tax_unit("adjusted_gross_income", period)
|
|
159
|
+
excess_agi = max_(
|
|
160
|
+
agi - p.filer_credit.phase_out.start[filing_status], 0
|
|
161
|
+
)
|
|
162
|
+
phase_out = excess_agi * p.filer_credit.phase_out.rate
|
|
163
|
+
|
|
164
|
+
phased_out_amount = max_(amount - phase_out, 0)
|
|
165
|
+
|
|
166
|
+
return has_eligible_filer * phased_out_amount
|
|
167
|
+
|
|
168
|
+
class household_benefits(Variable):
|
|
169
|
+
value_type = float
|
|
170
|
+
entity = Household
|
|
171
|
+
label = "benefits"
|
|
172
|
+
unit = USD
|
|
173
|
+
definition_period = YEAR
|
|
174
|
+
|
|
175
|
+
def formula(household, period, parameters):
|
|
176
|
+
p = parameters(
|
|
177
|
+
period
|
|
178
|
+
).gov.contrib.congress.tlaib.income_security_package
|
|
179
|
+
|
|
180
|
+
BENEFITS = [
|
|
181
|
+
"social_security",
|
|
182
|
+
"ssi",
|
|
183
|
+
"snap",
|
|
184
|
+
"wic",
|
|
185
|
+
"free_school_meals",
|
|
186
|
+
"reduced_price_school_meals",
|
|
187
|
+
"spm_unit_broadband_subsidy",
|
|
188
|
+
"tanf",
|
|
189
|
+
"high_efficiency_electric_home_rebate",
|
|
190
|
+
"residential_efficiency_electrification_rebate",
|
|
191
|
+
"unemployment_compensation",
|
|
192
|
+
# Contributed.
|
|
193
|
+
"basic_income",
|
|
194
|
+
"spm_unit_capped_housing_subsidy",
|
|
195
|
+
"household_state_benefits",
|
|
196
|
+
]
|
|
197
|
+
|
|
198
|
+
# Add Income Security Package benefits if active
|
|
199
|
+
if p.baby_bonus_act.in_effect:
|
|
200
|
+
BENEFITS.append("baby_bonus_act_payment")
|
|
201
|
+
if p.boost_act.in_effect:
|
|
202
|
+
BENEFITS.append("boost_act_payment")
|
|
203
|
+
if p.end_child_poverty_act.in_effect:
|
|
204
|
+
BENEFITS.append("ecpa_child_benefit")
|
|
205
|
+
|
|
206
|
+
return add(household, period, BENEFITS)
|
|
207
|
+
|
|
208
|
+
class spm_unit_benefits(Variable):
|
|
209
|
+
value_type = float
|
|
210
|
+
entity = SPMUnit
|
|
211
|
+
label = "Benefits"
|
|
212
|
+
definition_period = YEAR
|
|
213
|
+
unit = USD
|
|
214
|
+
|
|
215
|
+
def formula(spm_unit, period, parameters):
|
|
216
|
+
p = parameters(
|
|
217
|
+
period
|
|
218
|
+
).gov.contrib.congress.tlaib.income_security_package
|
|
219
|
+
|
|
220
|
+
BENEFITS = [
|
|
221
|
+
"social_security",
|
|
222
|
+
"ssi",
|
|
223
|
+
"ma_state_supplement", # Massachusetts benefits
|
|
224
|
+
# California programs.
|
|
225
|
+
"ca_cvrp", # California Clean Vehicle Rebate Project.
|
|
226
|
+
# Colorado programs.
|
|
227
|
+
"co_ccap_subsidy",
|
|
228
|
+
"co_state_supplement",
|
|
229
|
+
"co_oap",
|
|
230
|
+
"snap",
|
|
231
|
+
"wic",
|
|
232
|
+
"free_school_meals",
|
|
233
|
+
"reduced_price_school_meals",
|
|
234
|
+
"spm_unit_broadband_subsidy",
|
|
235
|
+
"spm_unit_energy_subsidy",
|
|
236
|
+
"tanf",
|
|
237
|
+
"high_efficiency_electric_home_rebate",
|
|
238
|
+
"residential_efficiency_electrification_rebate",
|
|
239
|
+
"unemployment_compensation",
|
|
240
|
+
# Contributed.
|
|
241
|
+
"basic_income",
|
|
242
|
+
"ny_drive_clean_rebate",
|
|
243
|
+
]
|
|
244
|
+
|
|
245
|
+
# Add Income Security Package benefits if active
|
|
246
|
+
if p.baby_bonus_act.in_effect:
|
|
247
|
+
BENEFITS.append("baby_bonus_act_payment")
|
|
248
|
+
if p.boost_act.in_effect:
|
|
249
|
+
BENEFITS.append("boost_act_payment")
|
|
250
|
+
if p.end_child_poverty_act.in_effect:
|
|
251
|
+
BENEFITS.append("ecpa_child_benefit")
|
|
252
|
+
|
|
253
|
+
if parameters(period).gov.contrib.ubi_center.flat_tax.deduct_ptc:
|
|
254
|
+
BENEFITS.append("aca_ptc")
|
|
255
|
+
if not parameters(period).gov.hud.abolition:
|
|
256
|
+
BENEFITS.append("spm_unit_capped_housing_subsidy")
|
|
257
|
+
|
|
258
|
+
return add(spm_unit, period, BENEFITS)
|
|
259
|
+
|
|
260
|
+
class income_tax(Variable):
|
|
261
|
+
value_type = float
|
|
262
|
+
entity = TaxUnit
|
|
263
|
+
label = "federal income tax"
|
|
264
|
+
unit = USD
|
|
265
|
+
definition_period = YEAR
|
|
266
|
+
|
|
267
|
+
def formula(tax_unit, period, parameters):
|
|
268
|
+
p = parameters(
|
|
269
|
+
period
|
|
270
|
+
).gov.contrib.congress.tlaib.income_security_package
|
|
271
|
+
|
|
272
|
+
# Start with income tax after non-refundable credits
|
|
273
|
+
base_tax = tax_unit("income_tax_before_refundable_credits", period)
|
|
274
|
+
|
|
275
|
+
# Subtract refundable credits
|
|
276
|
+
refundable_credits = tax_unit(
|
|
277
|
+
"income_tax_refundable_credits", period
|
|
278
|
+
)
|
|
279
|
+
|
|
280
|
+
reduced_tax = base_tax - refundable_credits
|
|
281
|
+
|
|
282
|
+
# Add BOOST tax only if active
|
|
283
|
+
if p.boost_act.in_effect:
|
|
284
|
+
boost_tax = tax_unit("boost_act_tax", period)
|
|
285
|
+
return reduced_tax + boost_tax
|
|
286
|
+
else:
|
|
287
|
+
return reduced_tax
|
|
288
|
+
|
|
289
|
+
class income_tax_refundable_credits(Variable):
|
|
290
|
+
value_type = float
|
|
291
|
+
entity = TaxUnit
|
|
292
|
+
definition_period = YEAR
|
|
293
|
+
label = "federal refundable income tax credits"
|
|
294
|
+
unit = USD
|
|
295
|
+
|
|
296
|
+
def formula(tax_unit, period, parameters):
|
|
297
|
+
p = parameters(
|
|
298
|
+
period
|
|
299
|
+
).gov.contrib.congress.tlaib.income_security_package.end_child_poverty_act
|
|
300
|
+
|
|
301
|
+
# Get standard refundable credits, excluding EITC and refundable CTC if ECPA is active
|
|
302
|
+
standard_credits = parameters(period).gov.irs.credits.refundable
|
|
303
|
+
|
|
304
|
+
if p.in_effect:
|
|
305
|
+
# ECPA replaces EITC and refundable CTC
|
|
306
|
+
CREDITS = [
|
|
307
|
+
c
|
|
308
|
+
for c in standard_credits
|
|
309
|
+
if c not in ["eitc", "refundable_ctc"]
|
|
310
|
+
]
|
|
311
|
+
else:
|
|
312
|
+
# Use all standard credits
|
|
313
|
+
CREDITS = list(standard_credits)
|
|
314
|
+
|
|
315
|
+
base_credits = add(tax_unit, period, CREDITS) if CREDITS else 0
|
|
316
|
+
|
|
317
|
+
# Add ECPA credits only if active
|
|
318
|
+
if p.in_effect:
|
|
319
|
+
ecpa_filer = tax_unit("ecpa_filer_credit", period)
|
|
320
|
+
ecpa_adult_dep = add(
|
|
321
|
+
tax_unit, period, ["ecpa_adult_dependent_credit"]
|
|
322
|
+
)
|
|
323
|
+
return base_credits + ecpa_filer + ecpa_adult_dep
|
|
324
|
+
else:
|
|
325
|
+
return base_credits
|
|
326
|
+
|
|
327
|
+
class income_tax_non_refundable_credits(Variable):
|
|
328
|
+
value_type = float
|
|
329
|
+
entity = TaxUnit
|
|
330
|
+
definition_period = YEAR
|
|
331
|
+
label = "federal non-refundable income tax credits"
|
|
332
|
+
unit = USD
|
|
333
|
+
|
|
334
|
+
def formula(tax_unit, period, parameters):
|
|
335
|
+
# Get the base list of non-refundable credits from parameters
|
|
336
|
+
p = parameters(period).gov.irs.credits
|
|
337
|
+
base_credits = list(p.non_refundable)
|
|
338
|
+
|
|
339
|
+
# Check if ECPA is active
|
|
340
|
+
ecpa_params = parameters(
|
|
341
|
+
period
|
|
342
|
+
).gov.contrib.congress.tlaib.income_security_package.end_child_poverty_act
|
|
343
|
+
ecpa_active = ecpa_params.in_effect
|
|
344
|
+
|
|
345
|
+
# If ECPA is active, remove non_refundable_ctc from the list
|
|
346
|
+
if ecpa_active:
|
|
347
|
+
CREDITS = [
|
|
348
|
+
c for c in base_credits if c != "non_refundable_ctc"
|
|
349
|
+
]
|
|
350
|
+
else:
|
|
351
|
+
CREDITS = base_credits
|
|
352
|
+
|
|
353
|
+
return add(tax_unit, period, CREDITS)
|
|
354
|
+
|
|
355
|
+
class reform(Reform):
|
|
356
|
+
def apply(self):
|
|
357
|
+
# Update all variables for the Income Security Package
|
|
358
|
+
self.update_variable(baby_bonus_act_payment)
|
|
359
|
+
self.update_variable(boost_act_payment)
|
|
360
|
+
self.update_variable(boost_act_tax)
|
|
361
|
+
self.update_variable(ecpa_child_benefit)
|
|
362
|
+
self.update_variable(ecpa_adult_dependent_credit)
|
|
363
|
+
self.update_variable(ecpa_filer_credit)
|
|
364
|
+
self.update_variable(household_benefits)
|
|
365
|
+
self.update_variable(spm_unit_benefits)
|
|
366
|
+
self.update_variable(income_tax)
|
|
367
|
+
self.update_variable(income_tax_refundable_credits)
|
|
368
|
+
self.update_variable(income_tax_non_refundable_credits)
|
|
369
|
+
|
|
370
|
+
return reform
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
def create_income_security_package_reform(
|
|
374
|
+
parameters, period, bypass: bool = False
|
|
375
|
+
):
|
|
376
|
+
if bypass:
|
|
377
|
+
return create_income_security_package()
|
|
378
|
+
|
|
379
|
+
p = parameters.gov.contrib.congress.tlaib.income_security_package
|
|
380
|
+
|
|
381
|
+
reform_active = False
|
|
382
|
+
current_period = period_(period)
|
|
383
|
+
|
|
384
|
+
for i in range(5):
|
|
385
|
+
if (
|
|
386
|
+
p(current_period).baby_bonus_act.in_effect
|
|
387
|
+
or p(current_period).boost_act.in_effect
|
|
388
|
+
or p(current_period).end_child_poverty_act.in_effect
|
|
389
|
+
):
|
|
390
|
+
reform_active = True
|
|
391
|
+
break
|
|
392
|
+
current_period = current_period.offset(1, "year")
|
|
393
|
+
|
|
394
|
+
if reform_active:
|
|
395
|
+
return create_income_security_package()
|
|
396
|
+
else:
|
|
397
|
+
return None
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
income_security_package = create_income_security_package_reform(
|
|
401
|
+
None, None, bypass=True
|
|
402
|
+
)
|
|
@@ -95,10 +95,21 @@ def create_ctc_minimum_refundable_amount() -> Reform:
|
|
|
95
95
|
def formula(tax_unit, period, parameters):
|
|
96
96
|
return 0
|
|
97
97
|
|
|
98
|
+
class ctc_value(Variable):
|
|
99
|
+
value_type = float
|
|
100
|
+
entity = TaxUnit
|
|
101
|
+
label = "CTC value"
|
|
102
|
+
unit = USD
|
|
103
|
+
documentation = "Actual value of the Child Tax Credit"
|
|
104
|
+
definition_period = YEAR
|
|
105
|
+
|
|
106
|
+
adds = ["refundable_ctc"]
|
|
107
|
+
|
|
98
108
|
class reform(Reform):
|
|
99
109
|
def apply(self):
|
|
100
110
|
self.update_variable(ctc_minimum_refundable_amount)
|
|
101
111
|
self.update_variable(refundable_ctc)
|
|
112
|
+
self.update_variable(ctc_value)
|
|
102
113
|
self.update_variable(ctc_refundable_maximum)
|
|
103
114
|
self.update_variable(non_refundable_ctc)
|
|
104
115
|
|
|
@@ -28,6 +28,8 @@ from .harris.rent_relief_act.rent_relief_tax_credit import (
|
|
|
28
28
|
)
|
|
29
29
|
from .congress.tlaib import (
|
|
30
30
|
create_end_child_poverty_act_reform,
|
|
31
|
+
income_security_package,
|
|
32
|
+
create_income_security_package_reform,
|
|
31
33
|
)
|
|
32
34
|
from .congress.tlaib.boost import (
|
|
33
35
|
create_boost_middle_class_tax_credit_reform,
|
|
@@ -164,6 +166,9 @@ def create_structural_reforms_from_parameters(parameters, period):
|
|
|
164
166
|
end_child_poverty_act = create_end_child_poverty_act_reform(
|
|
165
167
|
parameters, period
|
|
166
168
|
)
|
|
169
|
+
income_security_package_reform = create_income_security_package_reform(
|
|
170
|
+
parameters, period
|
|
171
|
+
)
|
|
167
172
|
boost_middle_class_tax_credit = (
|
|
168
173
|
create_boost_middle_class_tax_credit_reform(parameters, period)
|
|
169
174
|
)
|
|
@@ -277,6 +282,7 @@ def create_structural_reforms_from_parameters(parameters, period):
|
|
|
277
282
|
middle_class_tax_credit,
|
|
278
283
|
rent_relief_tax_credit,
|
|
279
284
|
end_child_poverty_act,
|
|
285
|
+
income_security_package_reform,
|
|
280
286
|
boost_middle_class_tax_credit,
|
|
281
287
|
mn_walz_hf1938,
|
|
282
288
|
or_rebate_state_tax_exempt,
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
- name: Single adult eligible for FPP
|
|
2
|
+
period: 2026
|
|
3
|
+
input:
|
|
4
|
+
people:
|
|
5
|
+
person1:
|
|
6
|
+
age: 35
|
|
7
|
+
spm_units:
|
|
8
|
+
spm_unit1:
|
|
9
|
+
members: [person1]
|
|
10
|
+
spm_unit_net_income: 25_000
|
|
11
|
+
households:
|
|
12
|
+
household1:
|
|
13
|
+
members: [person1]
|
|
14
|
+
state_code: TX
|
|
15
|
+
output:
|
|
16
|
+
tx_fpp_age_eligible: [true]
|
|
17
|
+
tx_fpp_income_eligible: [true]
|
|
18
|
+
tx_fpp_eligible: [true]
|
|
19
|
+
tx_fpp_benefit: [266.84]
|
|
20
|
+
|
|
21
|
+
- name: Household with multiple people - both eligible
|
|
22
|
+
period: 2026
|
|
23
|
+
input:
|
|
24
|
+
people:
|
|
25
|
+
person1:
|
|
26
|
+
age: 28
|
|
27
|
+
person2:
|
|
28
|
+
age: 32
|
|
29
|
+
spm_units:
|
|
30
|
+
spm_unit1:
|
|
31
|
+
members: [person1, person2]
|
|
32
|
+
spm_unit_net_income: 45_000
|
|
33
|
+
households:
|
|
34
|
+
household1:
|
|
35
|
+
members: [person1, person2]
|
|
36
|
+
state_code: TX
|
|
37
|
+
output:
|
|
38
|
+
tx_fpp_age_eligible: [true, true]
|
|
39
|
+
tx_fpp_income_eligible: [true, true]
|
|
40
|
+
tx_fpp_eligible: [true, true]
|
|
41
|
+
tx_fpp_benefit: [266.84, 266.84]
|
|
42
|
+
|
|
43
|
+
- name: Household with one age-ineligible person
|
|
44
|
+
period: 2026
|
|
45
|
+
input:
|
|
46
|
+
people:
|
|
47
|
+
person1:
|
|
48
|
+
age: 30
|
|
49
|
+
person2:
|
|
50
|
+
age: 70
|
|
51
|
+
spm_units:
|
|
52
|
+
spm_unit1:
|
|
53
|
+
members: [person1, person2]
|
|
54
|
+
spm_unit_net_income: 40_000
|
|
55
|
+
households:
|
|
56
|
+
household1:
|
|
57
|
+
members: [person1, person2]
|
|
58
|
+
state_code: TX
|
|
59
|
+
output:
|
|
60
|
+
tx_fpp_age_eligible: [true, false]
|
|
61
|
+
tx_fpp_income_eligible: [true, true]
|
|
62
|
+
tx_fpp_eligible: [true, false]
|
|
63
|
+
tx_fpp_benefit: [266.84, 0]
|
|
64
|
+
|
|
65
|
+
- name: Household income-ineligible
|
|
66
|
+
period: 2026
|
|
67
|
+
input:
|
|
68
|
+
people:
|
|
69
|
+
person1:
|
|
70
|
+
age: 30
|
|
71
|
+
person2:
|
|
72
|
+
age: 35
|
|
73
|
+
person3:
|
|
74
|
+
age: 8
|
|
75
|
+
spm_units:
|
|
76
|
+
spm_unit1:
|
|
77
|
+
members: [person1, person2, person3]
|
|
78
|
+
spm_unit_net_income: 80_000
|
|
79
|
+
households:
|
|
80
|
+
household1:
|
|
81
|
+
members: [person1, person2, person3]
|
|
82
|
+
state_code: TX
|
|
83
|
+
output:
|
|
84
|
+
tx_fpp_age_eligible: [true, true, true]
|
|
85
|
+
tx_fpp_income_eligible: [false, false, false]
|
|
86
|
+
tx_fpp_eligible: [false, false, false]
|
|
87
|
+
tx_fpp_benefit: [0, 0, 0]
|
|
88
|
+
|
|
89
|
+
- name: Edge case - income exactly at limit for household of 4
|
|
90
|
+
period: 2026
|
|
91
|
+
input:
|
|
92
|
+
people:
|
|
93
|
+
person1:
|
|
94
|
+
age: 40
|
|
95
|
+
person2:
|
|
96
|
+
age: 38
|
|
97
|
+
person3:
|
|
98
|
+
age: 10
|
|
99
|
+
person4:
|
|
100
|
+
age: 7
|
|
101
|
+
spm_units:
|
|
102
|
+
spm_unit1:
|
|
103
|
+
members: [person1, person2, person3, person4]
|
|
104
|
+
spm_unit_net_income: 80_375 # 250% of 2025 FPG for size 4
|
|
105
|
+
households:
|
|
106
|
+
household1:
|
|
107
|
+
members: [person1, person2, person3, person4]
|
|
108
|
+
state_code: TX
|
|
109
|
+
output:
|
|
110
|
+
tx_fpp_age_eligible: [true, true, true, true]
|
|
111
|
+
tx_fpp_income_eligible: [true, true, true, true]
|
|
112
|
+
tx_fpp_eligible: [true, true, true, true]
|
|
113
|
+
tx_fpp_benefit: [266.84, 266.84, 266.84, 266.84]
|
|
114
|
+
|
|
115
|
+
- name: Edge case - age exactly at threshold
|
|
116
|
+
period: 2026
|
|
117
|
+
input:
|
|
118
|
+
people:
|
|
119
|
+
person1:
|
|
120
|
+
age: 64
|
|
121
|
+
spm_units:
|
|
122
|
+
spm_unit1:
|
|
123
|
+
members: [person1]
|
|
124
|
+
spm_unit_net_income: 30_000
|
|
125
|
+
households:
|
|
126
|
+
household1:
|
|
127
|
+
members: [person1]
|
|
128
|
+
state_code: TX
|
|
129
|
+
output:
|
|
130
|
+
tx_fpp_age_eligible: [true]
|
|
131
|
+
tx_fpp_income_eligible: [true]
|
|
132
|
+
tx_fpp_eligible: [true]
|
|
133
|
+
tx_fpp_benefit: [266.84]
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
- name: Age eligible at 64 (at threshold)
|
|
2
|
+
period: 2025
|
|
3
|
+
input:
|
|
4
|
+
state_code: TX
|
|
5
|
+
age: 64
|
|
6
|
+
output:
|
|
7
|
+
tx_fpp_age_eligible: true
|
|
8
|
+
|
|
9
|
+
- name: Age eligible at 30 (below threshold)
|
|
10
|
+
period: 2026
|
|
11
|
+
input:
|
|
12
|
+
state_code: TX
|
|
13
|
+
age: 30
|
|
14
|
+
output:
|
|
15
|
+
tx_fpp_age_eligible: true
|
|
16
|
+
|
|
17
|
+
- name: Age eligible at 18 (young adult)
|
|
18
|
+
period: 2026
|
|
19
|
+
input:
|
|
20
|
+
state_code: TX
|
|
21
|
+
age: 18
|
|
22
|
+
output:
|
|
23
|
+
tx_fpp_age_eligible: true
|
|
24
|
+
|
|
25
|
+
- name: Age ineligible at 65 (above threshold)
|
|
26
|
+
period: 2026
|
|
27
|
+
input:
|
|
28
|
+
state_code: TX
|
|
29
|
+
age: 65
|
|
30
|
+
output:
|
|
31
|
+
tx_fpp_age_eligible: false
|
|
32
|
+
|
|
33
|
+
- name: Age ineligible at 70
|
|
34
|
+
period: 2026
|
|
35
|
+
input:
|
|
36
|
+
state_code: TX
|
|
37
|
+
age: 70
|
|
38
|
+
output:
|
|
39
|
+
tx_fpp_age_eligible: false
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
- name: Benefit for eligible individual
|
|
2
|
+
period: 2026
|
|
3
|
+
input:
|
|
4
|
+
state_code: TX
|
|
5
|
+
age: 30
|
|
6
|
+
spm_unit_size: 1
|
|
7
|
+
spm_unit_net_income: 20_000
|
|
8
|
+
output:
|
|
9
|
+
tx_fpp_benefit: 266.84
|
|
10
|
+
|
|
11
|
+
- name: No benefit for age-ineligible individual
|
|
12
|
+
period: 2026
|
|
13
|
+
input:
|
|
14
|
+
state_code: TX
|
|
15
|
+
age: 65
|
|
16
|
+
spm_unit_size: 1
|
|
17
|
+
spm_unit_net_income: 20_000
|
|
18
|
+
output:
|
|
19
|
+
tx_fpp_benefit: 0
|
|
20
|
+
|
|
21
|
+
- name: No benefit for income-ineligible individual
|
|
22
|
+
period: 2026
|
|
23
|
+
input:
|
|
24
|
+
state_code: TX
|
|
25
|
+
age: 30
|
|
26
|
+
spm_unit_size: 1
|
|
27
|
+
spm_unit_net_income: 50_000
|
|
28
|
+
output:
|
|
29
|
+
tx_fpp_benefit: 0
|
|
30
|
+
|
|
31
|
+
- name: Benefit for eligible person at age threshold
|
|
32
|
+
period: 2026
|
|
33
|
+
input:
|
|
34
|
+
state_code: TX
|
|
35
|
+
age: 64
|
|
36
|
+
spm_unit_size: 2
|
|
37
|
+
spm_unit_net_income: 40_000
|
|
38
|
+
output:
|
|
39
|
+
tx_fpp_benefit: 266.84
|