Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/mt-newborn-credit.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add Montana newborn credit reform.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
description: Montana limits child age to this threshold under the newborn credit program.

values:
2027-01-01: 1

metadata:
unit: year
period: year
label: Montana newborn credit child age limit
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
description: Montana provides this amount per qualifying child under the newborn credit program.

values:
2027-01-01: 1_000

metadata:
unit: currency-USD
period: year
label: Montana newborn credit amount
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
description: Montana uses this indicator to determine whether the newborn credit reform is in effect.

values:
0000-01-01: false

metadata:
unit: bool
period: year
label: Montana newborn credit in effect
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
description: Montana sets this amount as the phase-out reduction per income increment under the newborn credit program.

values:
2027-01-01: 50

metadata:
unit: currency-USD
period: year
label: Montana newborn credit reduction amount
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
description: Montana sets this amount as the income increment for phase-out calculations under the newborn credit program.

values:
2027-01-01: 1_000

metadata:
unit: currency-USD
period: year
label: Montana newborn credit reduction increment
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
description: Montana limits the newborn credit to taxpayers with AGI at or below this amount.

SINGLE:
values:
2027-01-01: 60_000

HEAD_OF_HOUSEHOLD:
values:
2027-01-01: 60_000

JOINT:
values:
2027-01-01: 120_000

SEPARATE:
values:
2027-01-01: 60_000

SURVIVING_SPOUSE:
values:
2027-01-01: 120_000

metadata:
unit: currency-USD
period: year
label: Montana newborn credit phase-out threshold
breakdown:
- filing_status
5 changes: 5 additions & 0 deletions policyengine_us/reforms/reforms.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,9 @@
from .states.mt.ctc import (
create_mt_ctc_reform,
)
from .states.mt.newborn_credit import (
create_mt_newborn_credit_reform,
)
from .congress.golden import (
create_fisc_act_reform,
)
Expand Down Expand Up @@ -281,6 +284,7 @@ def create_structural_reforms_from_parameters(parameters, period):
create_nyc_school_tax_credit_with_phase_out_reform(parameters, period)
)
mt_ctc = create_mt_ctc_reform(parameters, period)
mt_newborn_credit = create_mt_newborn_credit_reform(parameters, period)
fisc_act = create_fisc_act_reform(parameters, period)
tax_employer_social_security_tax = (
create_tax_employer_social_security_tax_reform(parameters, period)
Expand Down Expand Up @@ -409,6 +413,7 @@ def create_structural_reforms_from_parameters(parameters, period):
limit_salt_deduction_to_property_taxes,
nyc_school_tax_credit_with_phase_out,
mt_ctc,
mt_newborn_credit,
fisc_act,
tax_employer_social_security_tax,
tax_employer_medicare_tax,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .mt_newborn_credit import create_mt_newborn_credit_reform
122 changes: 122 additions & 0 deletions policyengine_us/reforms/states/mt/newborn_credit/mt_newborn_credit.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
from policyengine_us.model_api import *
from policyengine_core.periods import period as period_
from policyengine_core.periods import instant


def create_mt_newborn_credit() -> Reform:
"""Montana newborn credit reform.

Provides a $1,000 refundable credit per qualifying child under
age 1 with phase-out based on AGI. This is a PolicyEngine-designed
contrib reform; no enacted legislation exists.
"""

class mt_newborn_credit_eligible_child(Variable):
value_type = bool
entity = Person
label = "Montana newborn credit eligible child"
definition_period = YEAR
defined_for = StateCode.MT

def formula(person, period, parameters):
p = parameters(period).gov.contrib.states.mt.newborn_credit
age = person("age", period)
is_dependent = person("is_tax_unit_dependent", period)
has_ssn = person("meets_eitc_identification_requirements", period)
return (age < p.age_limit) & is_dependent & has_ssn

class mt_newborn_credit_eligible(Variable):
value_type = bool
entity = TaxUnit
label = "Eligible for the Montana newborn credit"
definition_period = YEAR
defined_for = StateCode.MT

def formula(tax_unit, period, parameters):
has_earned_income = tax_unit("tax_unit_earned_income", period) > 0
has_qualifying_children = (
add(
tax_unit,
period,
["mt_newborn_credit_eligible_child"],
)
> 0
)
person = tax_unit.members
head_or_spouse = person("is_tax_unit_head_or_spouse", period)
has_ssn = person("meets_eitc_identification_requirements", period)
# Uses any() not all(): at least one filer needs SSN,
# unlike EITC which requires all filers to have SSN.
filer_has_ssn = tax_unit.any(head_or_spouse & has_ssn)
return has_earned_income & has_qualifying_children & filer_has_ssn

class mt_newborn_credit(Variable):
value_type = float
entity = TaxUnit
label = "Montana newborn credit"
definition_period = YEAR
unit = USD
defined_for = "mt_newborn_credit_eligible"

def formula(tax_unit, period, parameters):
p = parameters(period).gov.contrib.states.mt.newborn_credit
qualifying_children = add(
tax_unit, period, ["mt_newborn_credit_eligible_child"]
)
base_credit = p.amount * qualifying_children
filing_status = tax_unit("filing_status", period)
agi = tax_unit("adjusted_gross_income", period)
threshold = p.reduction.threshold[filing_status]
excess = max_(agi - threshold, 0)
# Ceiling: any fraction of an increment triggers reduction
increments = np.ceil(excess / p.reduction.increment)
reduction = p.reduction.amount * increments
return max_(base_credit - reduction, 0)

def modify_parameters(parameters):
# NOTE: MT CTC reform hard-codes the refundable credits list,
# so this reform must run after MT CTC in reforms.py to
# correctly append mt_newborn_credit via read-then-append.
refundable = parameters.gov.states.mt.tax.income.credits.refundable
current_refundable = refundable(instant("2027-01-01"))
if "mt_newborn_credit" not in current_refundable:
new_refundable = list(current_refundable) + ["mt_newborn_credit"]
refundable.update(
start=instant("2027-01-01"),
stop=instant("2100-12-31"),
value=new_refundable,
)
return parameters

class reform(Reform):
def apply(self):
self.update_variable(mt_newborn_credit_eligible_child)
self.update_variable(mt_newborn_credit_eligible)
self.update_variable(mt_newborn_credit)
self.modify_parameters(modify_parameters)

return reform


def create_mt_newborn_credit_reform(parameters, period, bypass: bool = False):
if bypass:
return create_mt_newborn_credit()

p = parameters.gov.contrib.states.mt.newborn_credit

reform_active = False
current_period = period_(period)

for _ in range(5):
if p(current_period).in_effect:
reform_active = True
break
current_period = current_period.offset(1, "year")

if reform_active:
return create_mt_newborn_credit()
else:
return None


mt_newborn_credit = create_mt_newborn_credit_reform(None, None, bypass=True)
Loading