policyengine-us 1.434.0__py3-none-any.whl → 1.435.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.
- policyengine_us/reforms/congress/tlaib/__init__.py +4 -3
- policyengine_us/reforms/congress/tlaib/economic_dignity_for_all_agenda/__init__.py +9 -0
- policyengine_us/reforms/congress/tlaib/economic_dignity_for_all_agenda/edaa_end_child_poverty_act.py +237 -0
- policyengine_us/reforms/reforms.py +5 -4
- policyengine_us/tests/policy/baseline/gov/ssa/ssi/integration_tests.yaml +150 -4
- policyengine_us/tests/policy/contrib/congress/tlaib/economic_dignity_for_all_agenda/edaa_end_child_poverty_act.yaml +198 -0
- policyengine_us/variables/gov/ssa/ssi/eligibility/income/deemed/from_ineligible_spouse/is_ssi_spousal_deeming_applies.py +41 -0
- policyengine_us/variables/gov/ssa/ssi/eligibility/income/deemed/from_ineligible_spouse/ssi_income_deemed_from_ineligible_spouse.py +20 -20
- policyengine_us/variables/gov/ssa/ssi/ssi.py +22 -1
- policyengine_us/variables/gov/ssa/ssi/ssi_amount_if_eligible.py +26 -4
- {policyengine_us-1.434.0.dist-info → policyengine_us-1.435.1.dist-info}/METADATA +1 -1
- {policyengine_us-1.434.0.dist-info → policyengine_us-1.435.1.dist-info}/RECORD +24 -36
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/baby_bonus_act/age_limit.yaml +0 -8
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/baby_bonus_act/amount.yaml +0 -13
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/baby_bonus_act/in_effect.yaml +0 -8
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/baby_bonus_act/min_birth_year.yaml +0 -8
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/amount.yaml +0 -13
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/in_effect.yaml +0 -8
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/max_age.yaml +0 -8
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/min_age.yaml +0 -8
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/tax/rate.yaml +0 -8
- policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/tax/threshold.yaml +0 -24
- policyengine_us/reforms/congress/tlaib/income_security_package/__init__.py +0 -17
- policyengine_us/reforms/congress/tlaib/income_security_package/income_security_package.py +0 -453
- policyengine_us/tests/policy/contrib/congress/tlaib/income_security/integration.yaml +0 -154
- policyengine_us/tests/policy/contrib/congress/tlaib/income_security/state_integration.yaml +0 -110
- policyengine_us/tests/policy/contrib/congress/tlaib/income_security/test_individual_acts.yaml +0 -149
- policyengine_us/tests/policy/contrib/congress/tlaib/income_security/unit_tests.yaml +0 -272
- /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/adult_dependent_credit/amount.yaml +0 -0
- /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/adult_dependent_credit/min_age.yaml +0 -0
- /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/child_benefit/age_limit.yaml +0 -0
- /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/filer_credit/amount.yaml +0 -0
- /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/filer_credit/eligibility/max_age.yaml +0 -0
- /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/filer_credit/eligibility/min_age.yaml +0 -0
- /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/filer_credit/phase_out/rate.yaml +0 -0
- /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/filer_credit/phase_out/start.yaml +0 -0
- /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/in_effect.yaml +0 -0
- {policyengine_us-1.434.0.dist-info → policyengine_us-1.435.1.dist-info}/WHEEL +0 -0
- {policyengine_us-1.434.0.dist-info → policyengine_us-1.435.1.dist-info}/entry_points.txt +0 -0
- {policyengine_us-1.434.0.dist-info → policyengine_us-1.435.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
from .end_child_poverty_act import (
|
|
2
2
|
create_end_child_poverty_act_reform,
|
|
3
|
+
end_child_poverty_act,
|
|
3
4
|
)
|
|
4
|
-
from .
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
from .economic_dignity_for_all_agenda import (
|
|
6
|
+
end_child_poverty_act as edaa_end_child_poverty_act,
|
|
7
|
+
create_end_child_poverty_act_reform as create_edaa_end_child_poverty_act_reform,
|
|
7
8
|
)
|
policyengine_us/reforms/congress/tlaib/economic_dignity_for_all_agenda/edaa_end_child_poverty_act.py
ADDED
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
from policyengine_us.model_api import *
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def create_ecpa_only() -> Reform:
|
|
5
|
+
class ecpa_child_benefit(Variable):
|
|
6
|
+
value_type = float
|
|
7
|
+
entity = Person
|
|
8
|
+
definition_period = YEAR
|
|
9
|
+
label = "End Child Poverty Act child benefit"
|
|
10
|
+
unit = USD
|
|
11
|
+
documentation = (
|
|
12
|
+
"Universal child benefit under the End Child Poverty Act"
|
|
13
|
+
)
|
|
14
|
+
reference = "placeholder - bill not yet introduced"
|
|
15
|
+
|
|
16
|
+
def formula(person, period, parameters):
|
|
17
|
+
p = parameters(
|
|
18
|
+
period
|
|
19
|
+
).gov.contrib.congress.tlaib.economic_dignity_for_all_agenda.end_child_poverty_act
|
|
20
|
+
|
|
21
|
+
age = person("age", period)
|
|
22
|
+
is_eligible = age < p.child_benefit.age_limit
|
|
23
|
+
|
|
24
|
+
# Use FPG additional_person amount (CONTIGUOUS_US for all states), rounded to nearest $10
|
|
25
|
+
p_fpg = parameters(period).gov.hhs.fpg
|
|
26
|
+
fpg_amount = p_fpg.additional_person.CONTIGUOUS_US
|
|
27
|
+
amount = round(fpg_amount / 10) * 10
|
|
28
|
+
|
|
29
|
+
return is_eligible * amount
|
|
30
|
+
|
|
31
|
+
class ecpa_adult_dependent_credit(Variable):
|
|
32
|
+
value_type = float
|
|
33
|
+
entity = Person
|
|
34
|
+
definition_period = YEAR
|
|
35
|
+
label = "End Child Poverty Act adult dependent credit"
|
|
36
|
+
unit = USD
|
|
37
|
+
documentation = (
|
|
38
|
+
"Credit for adult dependents under the End Child Poverty Act"
|
|
39
|
+
)
|
|
40
|
+
reference = "placeholder - bill not yet introduced"
|
|
41
|
+
|
|
42
|
+
def formula(person, period, parameters):
|
|
43
|
+
p = parameters(
|
|
44
|
+
period
|
|
45
|
+
).gov.contrib.congress.tlaib.economic_dignity_for_all_agenda.end_child_poverty_act
|
|
46
|
+
|
|
47
|
+
age = person("age", period)
|
|
48
|
+
is_dependent = person("is_tax_unit_dependent", period)
|
|
49
|
+
|
|
50
|
+
is_eligible = (
|
|
51
|
+
age >= p.adult_dependent_credit.min_age
|
|
52
|
+
) & is_dependent
|
|
53
|
+
|
|
54
|
+
return is_eligible * p.adult_dependent_credit.amount
|
|
55
|
+
|
|
56
|
+
class ecpa_filer_credit(Variable):
|
|
57
|
+
value_type = float
|
|
58
|
+
entity = TaxUnit
|
|
59
|
+
definition_period = YEAR
|
|
60
|
+
label = "End Child Poverty Act filer credit"
|
|
61
|
+
unit = USD
|
|
62
|
+
documentation = "Filer credit under the End Child Poverty Act for eligible tax filers"
|
|
63
|
+
reference = "placeholder - bill not yet introduced"
|
|
64
|
+
|
|
65
|
+
def formula(tax_unit, period, parameters):
|
|
66
|
+
p = parameters(
|
|
67
|
+
period
|
|
68
|
+
).gov.contrib.congress.tlaib.economic_dignity_for_all_agenda.end_child_poverty_act
|
|
69
|
+
|
|
70
|
+
person = tax_unit.members
|
|
71
|
+
age = person("age", period)
|
|
72
|
+
|
|
73
|
+
is_head_or_spouse = person("is_tax_unit_head_or_spouse", period)
|
|
74
|
+
|
|
75
|
+
is_eligible_age = (age >= p.filer_credit.eligibility.min_age) & (
|
|
76
|
+
age < p.filer_credit.eligibility.max_age
|
|
77
|
+
)
|
|
78
|
+
is_eligible_filer = is_head_or_spouse & is_eligible_age
|
|
79
|
+
|
|
80
|
+
has_eligible_filer = tax_unit.any(is_eligible_filer)
|
|
81
|
+
|
|
82
|
+
filing_status = tax_unit("filing_status", period)
|
|
83
|
+
amount = p.filer_credit.amount[filing_status]
|
|
84
|
+
|
|
85
|
+
agi = tax_unit("adjusted_gross_income", period)
|
|
86
|
+
excess_agi = max_(
|
|
87
|
+
agi - p.filer_credit.phase_out.start[filing_status], 0
|
|
88
|
+
)
|
|
89
|
+
phase_out = excess_agi * p.filer_credit.phase_out.rate
|
|
90
|
+
|
|
91
|
+
phased_out_amount = max_(amount - phase_out, 0)
|
|
92
|
+
|
|
93
|
+
return has_eligible_filer * phased_out_amount
|
|
94
|
+
|
|
95
|
+
class household_benefits(Variable):
|
|
96
|
+
value_type = float
|
|
97
|
+
entity = Household
|
|
98
|
+
label = "benefits"
|
|
99
|
+
unit = USD
|
|
100
|
+
definition_period = YEAR
|
|
101
|
+
|
|
102
|
+
def formula(household, period, parameters):
|
|
103
|
+
# Start with baseline benefits from parameters
|
|
104
|
+
BENEFITS = list(
|
|
105
|
+
parameters(period).gov.household.household_benefits
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
# Add ECPA child benefit
|
|
109
|
+
BENEFITS.append("ecpa_child_benefit")
|
|
110
|
+
|
|
111
|
+
return add(household, period, BENEFITS)
|
|
112
|
+
|
|
113
|
+
class spm_unit_benefits(Variable):
|
|
114
|
+
value_type = float
|
|
115
|
+
entity = SPMUnit
|
|
116
|
+
label = "Benefits"
|
|
117
|
+
definition_period = YEAR
|
|
118
|
+
unit = USD
|
|
119
|
+
|
|
120
|
+
def formula(spm_unit, period, parameters):
|
|
121
|
+
BENEFITS = [
|
|
122
|
+
"social_security",
|
|
123
|
+
"ssi",
|
|
124
|
+
"ma_state_supplement",
|
|
125
|
+
"ca_cvrp",
|
|
126
|
+
"co_ccap_subsidy",
|
|
127
|
+
"co_state_supplement",
|
|
128
|
+
"co_oap",
|
|
129
|
+
"snap",
|
|
130
|
+
"wic",
|
|
131
|
+
"free_school_meals",
|
|
132
|
+
"reduced_price_school_meals",
|
|
133
|
+
"spm_unit_broadband_subsidy",
|
|
134
|
+
"spm_unit_energy_subsidy",
|
|
135
|
+
"tanf",
|
|
136
|
+
"high_efficiency_electric_home_rebate",
|
|
137
|
+
"residential_efficiency_electrification_rebate",
|
|
138
|
+
"unemployment_compensation",
|
|
139
|
+
"ak_energy_relief",
|
|
140
|
+
"basic_income",
|
|
141
|
+
"ny_drive_clean_rebate",
|
|
142
|
+
]
|
|
143
|
+
|
|
144
|
+
# Add ECPA child benefit
|
|
145
|
+
BENEFITS.append("ecpa_child_benefit")
|
|
146
|
+
|
|
147
|
+
if parameters(period).gov.contrib.ubi_center.flat_tax.deduct_ptc:
|
|
148
|
+
BENEFITS.append("aca_ptc")
|
|
149
|
+
if not parameters(period).gov.hud.abolition:
|
|
150
|
+
BENEFITS.append("spm_unit_capped_housing_subsidy")
|
|
151
|
+
|
|
152
|
+
return add(spm_unit, period, BENEFITS)
|
|
153
|
+
|
|
154
|
+
class income_tax_refundable_credits(Variable):
|
|
155
|
+
value_type = float
|
|
156
|
+
entity = TaxUnit
|
|
157
|
+
definition_period = YEAR
|
|
158
|
+
label = "federal refundable income tax credits"
|
|
159
|
+
unit = USD
|
|
160
|
+
|
|
161
|
+
def formula(tax_unit, period, parameters):
|
|
162
|
+
# Get standard refundable credits, excluding EITC and refundable CTC (ECPA replaces them)
|
|
163
|
+
standard_credits = parameters(period).gov.irs.credits.refundable
|
|
164
|
+
|
|
165
|
+
CREDITS = [
|
|
166
|
+
c
|
|
167
|
+
for c in standard_credits
|
|
168
|
+
if c not in ["eitc", "refundable_ctc"]
|
|
169
|
+
]
|
|
170
|
+
|
|
171
|
+
base_credits = add(tax_unit, period, CREDITS) if CREDITS else 0
|
|
172
|
+
|
|
173
|
+
# Add ECPA credits
|
|
174
|
+
ecpa_filer = tax_unit("ecpa_filer_credit", period)
|
|
175
|
+
ecpa_adult_dep = add(
|
|
176
|
+
tax_unit, period, ["ecpa_adult_dependent_credit"]
|
|
177
|
+
)
|
|
178
|
+
return base_credits + ecpa_filer + ecpa_adult_dep
|
|
179
|
+
|
|
180
|
+
class income_tax_non_refundable_credits(Variable):
|
|
181
|
+
value_type = float
|
|
182
|
+
entity = TaxUnit
|
|
183
|
+
definition_period = YEAR
|
|
184
|
+
label = "federal non-refundable income tax credits"
|
|
185
|
+
unit = USD
|
|
186
|
+
|
|
187
|
+
def formula(tax_unit, period, parameters):
|
|
188
|
+
# Get the base list of non-refundable credits from parameters
|
|
189
|
+
p = parameters(period).gov.irs.credits
|
|
190
|
+
base_credits = list(p.non_refundable)
|
|
191
|
+
|
|
192
|
+
# ECPA removes non_refundable_ctc from the list
|
|
193
|
+
CREDITS = [c for c in base_credits if c != "non_refundable_ctc"]
|
|
194
|
+
|
|
195
|
+
return add(tax_unit, period, CREDITS)
|
|
196
|
+
|
|
197
|
+
class reform(Reform):
|
|
198
|
+
def apply(self):
|
|
199
|
+
# Update only ECPA variables
|
|
200
|
+
self.update_variable(ecpa_child_benefit)
|
|
201
|
+
self.update_variable(ecpa_adult_dependent_credit)
|
|
202
|
+
self.update_variable(ecpa_filer_credit)
|
|
203
|
+
self.update_variable(household_benefits)
|
|
204
|
+
self.update_variable(spm_unit_benefits)
|
|
205
|
+
self.update_variable(income_tax_refundable_credits)
|
|
206
|
+
self.update_variable(income_tax_non_refundable_credits)
|
|
207
|
+
|
|
208
|
+
return reform
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
end_child_poverty_act = create_ecpa_only()
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def create_end_child_poverty_act_reform(
|
|
215
|
+
parameters, period, bypass: bool = False
|
|
216
|
+
):
|
|
217
|
+
"""Auto-application function for structural reforms."""
|
|
218
|
+
if bypass:
|
|
219
|
+
return create_ecpa_only()
|
|
220
|
+
|
|
221
|
+
from policyengine_core.periods import period as period_
|
|
222
|
+
|
|
223
|
+
p = parameters.gov.contrib.congress.tlaib.economic_dignity_for_all_agenda
|
|
224
|
+
|
|
225
|
+
reform_active = False
|
|
226
|
+
current_period = period_(period)
|
|
227
|
+
|
|
228
|
+
for i in range(5):
|
|
229
|
+
if p(current_period).end_child_poverty_act.in_effect:
|
|
230
|
+
reform_active = True
|
|
231
|
+
break
|
|
232
|
+
current_period = current_period.offset(1, "year")
|
|
233
|
+
|
|
234
|
+
if reform_active:
|
|
235
|
+
return create_ecpa_only()
|
|
236
|
+
else:
|
|
237
|
+
return None
|
|
@@ -28,8 +28,9 @@ 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
|
-
|
|
32
|
-
|
|
31
|
+
)
|
|
32
|
+
from .congress.tlaib.economic_dignity_for_all_agenda import (
|
|
33
|
+
create_end_child_poverty_act_reform as create_edaa_end_child_poverty_act_reform,
|
|
33
34
|
)
|
|
34
35
|
from .congress.tlaib.boost import (
|
|
35
36
|
create_boost_middle_class_tax_credit_reform,
|
|
@@ -170,7 +171,7 @@ def create_structural_reforms_from_parameters(parameters, period):
|
|
|
170
171
|
end_child_poverty_act = create_end_child_poverty_act_reform(
|
|
171
172
|
parameters, period
|
|
172
173
|
)
|
|
173
|
-
|
|
174
|
+
edaa_end_child_poverty_act = create_edaa_end_child_poverty_act_reform(
|
|
174
175
|
parameters, period
|
|
175
176
|
)
|
|
176
177
|
boost_middle_class_tax_credit = (
|
|
@@ -288,7 +289,7 @@ def create_structural_reforms_from_parameters(parameters, period):
|
|
|
288
289
|
middle_class_tax_credit,
|
|
289
290
|
rent_relief_tax_credit,
|
|
290
291
|
end_child_poverty_act,
|
|
291
|
-
|
|
292
|
+
edaa_end_child_poverty_act,
|
|
292
293
|
boost_middle_class_tax_credit,
|
|
293
294
|
mn_walz_hf1938,
|
|
294
295
|
or_rebate_state_tax_exempt,
|
|
@@ -68,10 +68,12 @@
|
|
|
68
68
|
output:
|
|
69
69
|
is_ssi_eligible: [true, false, true]
|
|
70
70
|
# Spouse's countable: $2,000 - $20 - $65 - $957.50 = $957.50/month = $11,490/year
|
|
71
|
-
#
|
|
71
|
+
# Since $11,490 > $5,796 (couple - individual FBR diff), deeming applies
|
|
72
|
+
# With deeming, use couple FBR: $1,450/month = $17,400/year
|
|
72
73
|
ssi_income_deemed_from_ineligible_spouse: [11_490, 0, 0]
|
|
73
74
|
ssi_countable_income: [11_490, 0, 0]
|
|
74
|
-
|
|
75
|
+
# Adult1 SSI: $17,400 (couple FBR) - $11,490 (countable) = $5,910
|
|
76
|
+
ssi: [5_910, 0, 11_604] # Adult1: $5,910 with couple rate; Child gets full FBR
|
|
75
77
|
|
|
76
78
|
- name: Case 3 - Both adults healthy with income + disabled child
|
|
77
79
|
period: 2025
|
|
@@ -217,12 +219,14 @@
|
|
|
217
219
|
output:
|
|
218
220
|
is_ssi_eligible: [true, false, true]
|
|
219
221
|
# Spouse's countable: $5,000 - $20 - $65 - $2,457.50 = $2,457.50/month = $29,490/year
|
|
220
|
-
#
|
|
222
|
+
# Since $29,490 > $5,796 (couple - individual FBR diff), deeming applies
|
|
223
|
+
# With deeming, use couple FBR: $1,450/month = $17,400/year
|
|
224
|
+
# Adult1 SSI: $17,400 (couple FBR) - $29,490 (countable) = -$12,090, capped at $0
|
|
221
225
|
ssi_income_deemed_from_ineligible_spouse: [29_490, 0, 0]
|
|
222
226
|
# Parent income deeming to child also gets high amount
|
|
223
227
|
ssi_unearned_income_deemed_from_ineligible_parent: [0, 0, 17_886]
|
|
224
228
|
ssi_countable_income: [29_490, 0, 17_646]
|
|
225
|
-
ssi: [0, 0, 0] # Both disabled members have
|
|
229
|
+
ssi: [0, 0, 0] # Both disabled members have countable income exceeding FBR
|
|
226
230
|
|
|
227
231
|
- name: Case 7 - Illinois single parent with $9,600 income + healthy child
|
|
228
232
|
period: 2024-01
|
|
@@ -254,3 +258,145 @@
|
|
|
254
258
|
ssi_countable_income: [357.50, 0]
|
|
255
259
|
ssi_amount_if_eligible: [943, 943]
|
|
256
260
|
ssi: [585.50, 0]
|
|
261
|
+
|
|
262
|
+
- name: Case 8 - Deeming applies, benefit capped at individual FBR
|
|
263
|
+
period: 2025-01
|
|
264
|
+
input:
|
|
265
|
+
people:
|
|
266
|
+
adult1:
|
|
267
|
+
age: 55
|
|
268
|
+
is_disabled: false
|
|
269
|
+
employment_income: 967 * 12 # $967/month
|
|
270
|
+
adult2:
|
|
271
|
+
age: 60
|
|
272
|
+
is_disabled: true
|
|
273
|
+
employment_income: 0
|
|
274
|
+
tax_units:
|
|
275
|
+
tax_unit:
|
|
276
|
+
members: [adult1, adult2]
|
|
277
|
+
marital_units:
|
|
278
|
+
marital_unit:
|
|
279
|
+
members: [adult1, adult2]
|
|
280
|
+
households:
|
|
281
|
+
household:
|
|
282
|
+
members: [adult1, adult2]
|
|
283
|
+
state_code: NC
|
|
284
|
+
output:
|
|
285
|
+
is_ssi_eligible: [false, true]
|
|
286
|
+
# Step 1: Check if deeming applies
|
|
287
|
+
# Adult1 gross income: $967/month > $483 threshold → Deeming applies
|
|
288
|
+
#
|
|
289
|
+
# Step 2: Calculate deemed income
|
|
290
|
+
# Combined income: $967/month earned
|
|
291
|
+
# Apply exclusions: $967 - $20 (general) - $65 (earned) = $882
|
|
292
|
+
# Take half: $882 / 2 = $441/month
|
|
293
|
+
# Adult2 alone countable: $0
|
|
294
|
+
# Deemed income = $441 - $0 = $441/month
|
|
295
|
+
ssi_income_deemed_from_ineligible_spouse: [0, 441]
|
|
296
|
+
ssi_countable_income: [0, 441]
|
|
297
|
+
#
|
|
298
|
+
# Step 3: Calculate benefit
|
|
299
|
+
# Use couple FBR (deeming applies): $1,450/month
|
|
300
|
+
# Benefit before cap: $1,450 - $441 = $1,009/month
|
|
301
|
+
# Cap at individual FBR: min($1,009, $967) = $967/month
|
|
302
|
+
# Note: This demonstrates the cap is necessary when spouse's gross income
|
|
303
|
+
# is just above $483, resulting in low countable income after exclusions
|
|
304
|
+
ssi: [0, 967]
|
|
305
|
+
|
|
306
|
+
- name: Case 9 - Deeming applies without child
|
|
307
|
+
period: 2025-01
|
|
308
|
+
input:
|
|
309
|
+
people:
|
|
310
|
+
adult1:
|
|
311
|
+
age: 41
|
|
312
|
+
is_disabled: false
|
|
313
|
+
employment_income: 3_000 * 12 # $3,000/month
|
|
314
|
+
adult2:
|
|
315
|
+
age: 40
|
|
316
|
+
is_disabled: true
|
|
317
|
+
employment_income: 0
|
|
318
|
+
tax_units:
|
|
319
|
+
tax_unit:
|
|
320
|
+
members: [adult1, adult2]
|
|
321
|
+
marital_units:
|
|
322
|
+
marital_unit:
|
|
323
|
+
members: [adult1, adult2]
|
|
324
|
+
households:
|
|
325
|
+
household:
|
|
326
|
+
members: [adult1, adult2]
|
|
327
|
+
state_code: NC
|
|
328
|
+
output:
|
|
329
|
+
is_ssi_eligible: [false, true]
|
|
330
|
+
# Step 1: No child allocation (no child present)
|
|
331
|
+
# Adult1 gross income: $3,000/month (no reduction)
|
|
332
|
+
#
|
|
333
|
+
# Step 2: Check if deeming applies
|
|
334
|
+
# Adult1 gross income: $3,000 > $483 threshold → Deeming applies
|
|
335
|
+
#
|
|
336
|
+
# Step 3: Calculate deemed income
|
|
337
|
+
# Combined income: $3,000/month earned
|
|
338
|
+
# Apply exclusions: $3,000 - $20 (general) - $65 (earned) = $2,915
|
|
339
|
+
# Take half: $2,915 / 2 = $1,457.50/month
|
|
340
|
+
# Adult2 alone countable: $0
|
|
341
|
+
# Deemed income = $1,457.50 - $0 = $1,457.50/month
|
|
342
|
+
ssi_income_deemed_from_ineligible_spouse: [0, 1_457.50]
|
|
343
|
+
ssi_countable_income: [0, 1_457.50]
|
|
344
|
+
#
|
|
345
|
+
# Step 4: Calculate benefit
|
|
346
|
+
# Use couple FBR (deeming applies): $1,450/month
|
|
347
|
+
# Benefit before cap: $1,450 - $1,457.50 = -$7.50 (negative)
|
|
348
|
+
# Benefit capped at $0 (cannot be negative)
|
|
349
|
+
ssi: [0, 0]
|
|
350
|
+
|
|
351
|
+
- name: Case 10 - Deeming applies with child allocation (compare to Case 9)
|
|
352
|
+
period: 2025-01
|
|
353
|
+
input:
|
|
354
|
+
people:
|
|
355
|
+
adult1:
|
|
356
|
+
age: 41
|
|
357
|
+
is_disabled: false
|
|
358
|
+
employment_income: 3_000 * 12 # $3,000/month
|
|
359
|
+
adult2:
|
|
360
|
+
age: 40
|
|
361
|
+
is_disabled: true
|
|
362
|
+
employment_income: 0
|
|
363
|
+
child:
|
|
364
|
+
age: 12
|
|
365
|
+
is_disabled: false
|
|
366
|
+
employment_income: 0
|
|
367
|
+
tax_units:
|
|
368
|
+
tax_unit:
|
|
369
|
+
members: [adult1, adult2, child]
|
|
370
|
+
marital_units:
|
|
371
|
+
marital_unit:
|
|
372
|
+
members: [adult1, adult2, child]
|
|
373
|
+
households:
|
|
374
|
+
household:
|
|
375
|
+
members: [adult1, adult2, child]
|
|
376
|
+
state_code: NC
|
|
377
|
+
output:
|
|
378
|
+
is_ssi_eligible: [false, true, false]
|
|
379
|
+
# Step 1: Apply child allocation
|
|
380
|
+
# Child allocation: $1,450 (couple FBR) - $967 (individual FBR) = $483/month
|
|
381
|
+
# Child has $0 income, so full $483 allocation applies
|
|
382
|
+
# Adult1 earned after child allocation: $3,000 - $483 = $2,517/month
|
|
383
|
+
#
|
|
384
|
+
# Step 2: Check if deeming applies
|
|
385
|
+
# Adult1 income after child allocation: $2,517 > $483 threshold → Deeming applies
|
|
386
|
+
#
|
|
387
|
+
# Step 3: Calculate deemed income
|
|
388
|
+
# Combined income: $2,517/month earned (after child allocation)
|
|
389
|
+
# Apply exclusions: $2,517 - $20 (general) - $65 (earned) = $2,432
|
|
390
|
+
# Take half: $2,432 / 2 = $1,216/month
|
|
391
|
+
# Adult2 alone countable: $0
|
|
392
|
+
# Deemed income = $1,216 - $0 = $1,216/month
|
|
393
|
+
ssi_income_deemed_from_ineligible_spouse: [0, 1_216, 0]
|
|
394
|
+
ssi_countable_income: [0, 1_216, 0]
|
|
395
|
+
#
|
|
396
|
+
# Step 4: Calculate benefit
|
|
397
|
+
# Use couple FBR (deeming applies): $1,450/month
|
|
398
|
+
# Benefit before cap: $1,450 - $1,216 = $234/month
|
|
399
|
+
# Cap at individual FBR: min($234, $967) = $234 (no cap needed)
|
|
400
|
+
# Note: Compare to Case 9 - child allocation ($483) reduces deemed income,
|
|
401
|
+
# changing result from $0 to $234/month
|
|
402
|
+
ssi: [0, 234, 0]
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# End Child Poverty Act tests
|
|
2
|
+
|
|
3
|
+
- name: ECPA child benefit for eligible child
|
|
4
|
+
period: 2026
|
|
5
|
+
reforms: policyengine_us.reforms.congress.tlaib.economic_dignity_for_all_agenda.end_child_poverty_act
|
|
6
|
+
input:
|
|
7
|
+
people:
|
|
8
|
+
parent:
|
|
9
|
+
age: 30
|
|
10
|
+
child:
|
|
11
|
+
age: 5
|
|
12
|
+
tax_units:
|
|
13
|
+
tax_unit:
|
|
14
|
+
members: [parent, child]
|
|
15
|
+
filing_status: SINGLE
|
|
16
|
+
adjusted_gross_income: 20_000
|
|
17
|
+
households:
|
|
18
|
+
household:
|
|
19
|
+
members: [parent, child]
|
|
20
|
+
output:
|
|
21
|
+
ecpa_child_benefit: [0, 5_630]
|
|
22
|
+
ecpa_filer_credit: 700
|
|
23
|
+
|
|
24
|
+
- name: ECPA adult dependent credit
|
|
25
|
+
period: 2026
|
|
26
|
+
reforms: policyengine_us.reforms.congress.tlaib.economic_dignity_for_all_agenda.end_child_poverty_act
|
|
27
|
+
input:
|
|
28
|
+
people:
|
|
29
|
+
parent:
|
|
30
|
+
age: 45
|
|
31
|
+
adult_dependent:
|
|
32
|
+
age: 20
|
|
33
|
+
is_tax_unit_dependent: true
|
|
34
|
+
tax_units:
|
|
35
|
+
tax_unit:
|
|
36
|
+
members: [parent, adult_dependent]
|
|
37
|
+
filing_status: SINGLE
|
|
38
|
+
adjusted_gross_income: 15_000
|
|
39
|
+
output:
|
|
40
|
+
ecpa_adult_dependent_credit: [0, 700]
|
|
41
|
+
ecpa_filer_credit: 700
|
|
42
|
+
|
|
43
|
+
- name: ECPA filer credit with phase out
|
|
44
|
+
period: 2026
|
|
45
|
+
reforms: policyengine_us.reforms.congress.tlaib.economic_dignity_for_all_agenda.end_child_poverty_act
|
|
46
|
+
input:
|
|
47
|
+
people:
|
|
48
|
+
filer:
|
|
49
|
+
age: 40
|
|
50
|
+
tax_units:
|
|
51
|
+
tax_unit:
|
|
52
|
+
members: [filer]
|
|
53
|
+
filing_status: SINGLE
|
|
54
|
+
adjusted_gross_income: 24_000
|
|
55
|
+
output:
|
|
56
|
+
ecpa_filer_credit: 500 # 700 - (4,000 * 0.05)
|
|
57
|
+
|
|
58
|
+
- name: ECPA household with children and adult dependent
|
|
59
|
+
period: 2026
|
|
60
|
+
reforms: policyengine_us.reforms.congress.tlaib.economic_dignity_for_all_agenda.end_child_poverty_act
|
|
61
|
+
input:
|
|
62
|
+
people:
|
|
63
|
+
parent:
|
|
64
|
+
age: 45
|
|
65
|
+
child1:
|
|
66
|
+
age: 5
|
|
67
|
+
child2:
|
|
68
|
+
age: 10
|
|
69
|
+
adult_dependent:
|
|
70
|
+
age: 20
|
|
71
|
+
is_tax_unit_dependent: true
|
|
72
|
+
tax_units:
|
|
73
|
+
tax_unit:
|
|
74
|
+
members: [parent, child1, child2, adult_dependent]
|
|
75
|
+
filing_status: SINGLE
|
|
76
|
+
adjusted_gross_income: 30_000
|
|
77
|
+
output:
|
|
78
|
+
ecpa_child_benefit: [0, 5_630, 5_630, 0]
|
|
79
|
+
ecpa_adult_dependent_credit: [0, 0, 0, 700]
|
|
80
|
+
ecpa_filer_credit: 200 # 700 - (10,000 * 0.05)
|
|
81
|
+
|
|
82
|
+
- name: ECPA joint filers with children and adult dependent
|
|
83
|
+
period: 2026
|
|
84
|
+
reforms: policyengine_us.reforms.congress.tlaib.economic_dignity_for_all_agenda.end_child_poverty_act
|
|
85
|
+
input:
|
|
86
|
+
people:
|
|
87
|
+
parent1:
|
|
88
|
+
age: 40
|
|
89
|
+
parent2:
|
|
90
|
+
age: 38
|
|
91
|
+
child:
|
|
92
|
+
age: 8
|
|
93
|
+
adult_dependent:
|
|
94
|
+
age: 22
|
|
95
|
+
is_tax_unit_dependent: true
|
|
96
|
+
tax_units:
|
|
97
|
+
tax_unit:
|
|
98
|
+
members: [parent1, parent2, child, adult_dependent]
|
|
99
|
+
filing_status: JOINT
|
|
100
|
+
adjusted_gross_income: 45_000
|
|
101
|
+
output:
|
|
102
|
+
ecpa_child_benefit: [0, 0, 5_630, 0]
|
|
103
|
+
ecpa_adult_dependent_credit: [0, 0, 0, 700]
|
|
104
|
+
ecpa_filer_credit: 1_150 # 1,400 - (5,000 * 0.05)
|
|
105
|
+
|
|
106
|
+
- name: Oklahoma family - state credits reference federal calculations
|
|
107
|
+
period: 2026
|
|
108
|
+
reforms: policyengine_us.reforms.congress.tlaib.economic_dignity_for_all_agenda.end_child_poverty_act
|
|
109
|
+
absolute_error_margin: 1
|
|
110
|
+
input:
|
|
111
|
+
people:
|
|
112
|
+
parent1:
|
|
113
|
+
age: 35
|
|
114
|
+
employment_income: 30_000
|
|
115
|
+
parent2:
|
|
116
|
+
age: 33
|
|
117
|
+
employment_income: 20_000
|
|
118
|
+
newborn:
|
|
119
|
+
age: 0
|
|
120
|
+
birth_year: 2026
|
|
121
|
+
child:
|
|
122
|
+
age: 8
|
|
123
|
+
birth_year: 2018
|
|
124
|
+
adult_dependent:
|
|
125
|
+
age: 19
|
|
126
|
+
birth_year: 2007
|
|
127
|
+
is_full_time_student: true
|
|
128
|
+
tax_units:
|
|
129
|
+
tax_unit:
|
|
130
|
+
members: [parent1, parent2, newborn, child, adult_dependent]
|
|
131
|
+
filing_status: JOINT
|
|
132
|
+
households:
|
|
133
|
+
household:
|
|
134
|
+
members: [parent1, parent2, newborn, child, adult_dependent]
|
|
135
|
+
state_code: OK
|
|
136
|
+
output:
|
|
137
|
+
# Federal CTC/EITC calculated for state reference
|
|
138
|
+
ctc: 4_900
|
|
139
|
+
eitc: 4_244
|
|
140
|
+
|
|
141
|
+
# Oklahoma credits (5% of federal)
|
|
142
|
+
ok_child_care_child_tax_credit:
|
|
143
|
+
2026: 245 # 5% of $4,900
|
|
144
|
+
ok_eitc:
|
|
145
|
+
2026: 72.07
|
|
146
|
+
|
|
147
|
+
# ECPA benefits
|
|
148
|
+
ecpa_child_benefit:
|
|
149
|
+
2026: [0, 0, 5_630, 5_630, 0]
|
|
150
|
+
ecpa_adult_dependent_credit:
|
|
151
|
+
2026: [0, 0, 0, 0, 700]
|
|
152
|
+
ecpa_filer_credit:
|
|
153
|
+
2026: 900 # $1,400 - ($50k - $40k) * 0.05
|
|
154
|
+
|
|
155
|
+
# Federal refundable credits exclude CTC/EITC
|
|
156
|
+
income_tax_refundable_credits:
|
|
157
|
+
2026: 1_600 # ECPA filer ($900) + adult dependent ($700)
|
|
158
|
+
|
|
159
|
+
- name: Maine single parent - state EITC percentage of federal
|
|
160
|
+
period: 2026
|
|
161
|
+
reforms: policyengine_us.reforms.congress.tlaib.economic_dignity_for_all_agenda.end_child_poverty_act
|
|
162
|
+
absolute_error_margin: 1
|
|
163
|
+
input:
|
|
164
|
+
people:
|
|
165
|
+
parent:
|
|
166
|
+
age: 28
|
|
167
|
+
employment_income: 25_000
|
|
168
|
+
child1:
|
|
169
|
+
age: 3
|
|
170
|
+
birth_year: 2023
|
|
171
|
+
child2:
|
|
172
|
+
age: 10
|
|
173
|
+
birth_year: 2016
|
|
174
|
+
tax_units:
|
|
175
|
+
tax_unit:
|
|
176
|
+
members: [parent, child1, child2]
|
|
177
|
+
filing_status: HEAD_OF_HOUSEHOLD
|
|
178
|
+
households:
|
|
179
|
+
household:
|
|
180
|
+
members: [parent, child1, child2]
|
|
181
|
+
state_code: ME
|
|
182
|
+
output:
|
|
183
|
+
# Federal calculations
|
|
184
|
+
ctc: 4_400
|
|
185
|
+
eitc: 7_071
|
|
186
|
+
|
|
187
|
+
# Maine EITC is 25% of federal
|
|
188
|
+
me_eitc: 1_767
|
|
189
|
+
|
|
190
|
+
# ECPA benefits
|
|
191
|
+
ecpa_child_benefit:
|
|
192
|
+
2026: [0, 5_630, 5_630]
|
|
193
|
+
ecpa_filer_credit:
|
|
194
|
+
2026: 450 # $700 - ($25k - $20k) * 0.05
|
|
195
|
+
|
|
196
|
+
# Federal credits exclude EITC/CTC
|
|
197
|
+
income_tax_refundable_credits:
|
|
198
|
+
2026: 450
|