From f50bd4ec820c5f9c9c4974f6b89659ef38ba67bb Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Tue, 4 Feb 2025 17:47:20 +0000 Subject: [PATCH] Puerto Rico Earned Income Credit Fixes #5467 --- .../credits/earned_income/eligibility/max.yaml | 5 +++-- .../credits/earned_income/eligibility/min.yaml | 7 ++++--- .../eligibility/separate_filer.yaml | 9 +++++++++ .../earned_income/investment_income/limit.yaml | 1 + .../income/credits/earned_income/max_amount.yaml | 16 ++++++++-------- .../credits/earned_income/phase_in_rate.yaml | 2 +- .../credits/earned_income/phase_out_rate.yaml | 4 ++++ .../pr_earned_income_child_count.py | 2 +- .../earned_income/pr_earned_income_credit.py | 7 +++++-- .../pr_earned_income_credit_eligible.py | 12 ++++++------ 10 files changed, 42 insertions(+), 23 deletions(-) create mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/eligibility/separate_filer.yaml diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/eligibility/max.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/eligibility/max.yaml index 1d7b64b9cb6..565d5494997 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/eligibility/max.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/eligibility/max.yaml @@ -1,9 +1,10 @@ -description: Puerto Rico limits EITC eligibility to filers below or equal to this age. +description: Puerto Rico limits the Earned Income Tax Credit to filers of this age or below. values: 2023-01-01: 65 metadata: unit: year - label: EITC maximum age + period: year + label: Puerto Rico earned income credit maximum age reference: - title: Schedule CT Individual, Earned Income Credit, 2023 href: https://hacienda.pr.gov/sites/default/files/schedule_ct_rev._jul_5_23_informative_-_instructions.pdf#page=1 diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/eligibility/min.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/eligibility/min.yaml index f76a19c1170..e6206c3fd9d 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/eligibility/min.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/eligibility/min.yaml @@ -1,9 +1,10 @@ -description: Puerto Rico limits EITC eligibility to people of this age or older. +description: Puerto Rico limits the Earned Income Tax Credit to filers of this age or older. values: 2023-01-01: 19 metadata: unit: year - label: EITC minimum age + period: year + label: Puerto Rico earned income Credit minimum age reference: - title: Schedule CT Individual, Earned Income Credit, 2023 - href: https://hacienda.pr.gov/sites/default/files/schedule_ct_rev._jul_5_23_informative_-_instructions.pdf#page=1 + href: https://hacienda.pr.gov/sites/default/files/schedule_ct_rev._jul_5_23_informative_-_instructions.pdf#page=1 \ No newline at end of file diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/eligibility/separate_filer.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/eligibility/separate_filer.yaml new file mode 100644 index 00000000000..476197275f6 --- /dev/null +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/eligibility/separate_filer.yaml @@ -0,0 +1,9 @@ +description: Puerto Rico makes married filing separate filers eligible for the EITC when this is true. +values: + 2023-01-01: false +metadata: + unit: bool + label: Puerto Rico earned income credit separate filers eligible + reference: + - title: + href: diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/investment_income/limit.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/investment_income/limit.yaml index 6efba0cb5c4..c0fbc802bdb 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/investment_income/limit.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/investment_income/limit.yaml @@ -1,6 +1,7 @@ description: Puerto Rico limits the earned income credit to filers with investment income below this threshold. values: 2010-12-31: 2_200 + 2023-01-01: 10_000 metadata: unit: currency-USD label: Puerto Rico earned income credit investment income limit diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_amount.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_amount.yaml index 8af739bba42..bbe0c579f77 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_amount.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_amount.yaml @@ -1,21 +1,21 @@ description: Puerto Rico provides this maximum earned income credit. brackets: - threshold: - 2010-12-31: 0 + 2023-01-01: 0 amount: - 2010-12-31: 1656 + 2023-01-01: 1_656 - threshold: - 2010-12-31: 1 + 2023-01-01: 1 amount: - 2010-12-31: 3864 + 2023-01-01: 3_864 - threshold: - 2010-12-31: 2 + 2023-01-01: 2 amount: - 2010-12-31: 6072 + 2023-01-01: 6_072 - threshold: - 2010-12-31: 3 + 2023-01-01: 3 amount: - 2010-12-31: 7173 + 2023-01-01: 7_173 metadata: threshold_unit: child diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_in_rate.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_in_rate.yaml index 230c1501b5d..5a73395e40c 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_in_rate.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_in_rate.yaml @@ -31,7 +31,7 @@ values: metadata: rate_unit: /1 threshold_unit: - type_marginal: marginal_rate + type: marginal_rate label: Puerto Rico earned income credit phase in rate period: year reference: diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out_rate.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out_rate.yaml index 9b661b6f9d8..e68f6a2cde8 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out_rate.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out_rate.yaml @@ -1,3 +1,7 @@ +# TODO: phase-in folder, 0 child, 1 child, etc. for phase-out-rate +# phase-out: based on children, based on income +# non-married vs. married threshold based on number of kids, file for rate +# pull those values separately in the variables description: Puerto Rico phases the earned income credit out at this rate of state gross income. brackets: # if below the threshold, no phase out diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_child_count.py b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_child_count.py index 62cfbe86ee7..400f5317c32 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_child_count.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_child_count.py @@ -4,7 +4,7 @@ class pr_earned_income_child_count(Variable): value_type = int entity = TaxUnit - label = "EITC-qualifying children" + label = "Puerto Rico EITC-qualifying children" definition_period = YEAR reference = diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.py b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.py index d802bad7085..e72dc8b4004 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.py @@ -15,9 +15,12 @@ def formula(person, period, parameters): period ).gov.territories.pr.tax.income.credits.earned_income + # calculate # children + num_children = person.tax_unit("pr_earned_income_child_count", period) + + # compute credit amount gross_income = person("pr_gross_income_person", period) - # if in the lower bracket: gross_income * rate. if higher, use max credit phase_in = min_(gross_income * p.phase_in_rate, p.max_amount) phase_out = p.phase_out_rate.calc(gross_income) - return phase_in - phase_out + return phase_in - phase_out \ No newline at end of file diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.py b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.py index af3a693d795..9a5cb253516 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.py @@ -9,15 +9,15 @@ class pr_earned_income_credit_eligible(Variable): reference = "https://casetext.com/statute/laws-of-puerto-rico/title-thirteen-taxation-and-finance/subtitle-17-internal-revenue-code-of-2011/part-ii-income-taxes/chapter-1007-credits-against-tax/subchapter-b-refundable-credits/30211-earned-income-credit" def formula(person, period, parameters): - # workflow: - # WRITE ME: - # taxpayer or spouse must be 19 or older, not a dependent, not filing as married filing separately p = parameters( period - ).gov.territories.pr.tax.income.credits.earned_income.investment_income + ).gov.territories.pr.tax.income.credits.earned_income head_or_spouse = person("is_tax_unit_head_or_spouse", period) investment_income = person( "pr_earned_income_credit_investment_income", period ) - investment_income_amount_under_limit = investment_income <= p.limit - return head_or_spouse & investment_income_amount_under_limit + investment_income_amount_under_limit = investment_income <= p.investment_income.limit + age = person("age", period) + age_within_range = age >= p.eligibility.min & age <= p.eligibility.max + + return head_or_spouse & investment_income_amount_under_limit & age_within_range