From 87d089979c4881895f2d2df51ceab7c66e88712e Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Tue, 14 Jan 2025 17:40:05 +0000 Subject: [PATCH 01/19] Puerto Rico Earned Income Credit Fixes #5467 --- .../earned_income/net_income_limit.yaml | 10 ++++++++++ .../credits/earned_income/percent_income.yaml | 16 ++++++++++++++++ .../percent_income_upper_bracket.yaml | 11 +++++++++++ .../upper_bracket_income_max.yaml | 16 ++++++++++++++++ .../upper_bracket_income_min.yaml | 11 +++++++++++ .../pr_earned_income_credit_eligible.py | 19 +++++++++++++++++++ 6 files changed, 83 insertions(+) create mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/net_income_limit.yaml create mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/percent_income.yaml create mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/percent_income_upper_bracket.yaml create mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/upper_bracket_income_max.yaml create mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/upper_bracket_income_min.yaml create mode 100644 policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.py diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/net_income_limit.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/net_income_limit.yaml new file mode 100644 index 00000000000..029cb731d88 --- /dev/null +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/net_income_limit.yaml @@ -0,0 +1,10 @@ +description: +values: + 2010-12-31: 2_200 +metadata: + unit: currency-USD + label: + period: year + reference: + - title: + href: \ No newline at end of file diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/percent_income.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/percent_income.yaml new file mode 100644 index 00000000000..76bc592c3ae --- /dev/null +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/percent_income.yaml @@ -0,0 +1,16 @@ +description: +values: + 2010-12-31: 3.5 + 2011-12-31: 4 + 2012-12-31: 4.5 + 2013-12-31: 5 + 2014-12-31: 5.5 + 2015-12-31: 6 + +metadata: + unit: percent + label: + period: year + reference: + - title: + href: \ No newline at end of file diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/percent_income_upper_bracket.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/percent_income_upper_bracket.yaml new file mode 100644 index 00000000000..be907c9d6a5 --- /dev/null +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/percent_income_upper_bracket.yaml @@ -0,0 +1,11 @@ +description: +values: + 2010-12-31: 2 + +metadata: + unit: percent + label: + period: year + reference: + - title: + href: \ No newline at end of file diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/upper_bracket_income_max.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/upper_bracket_income_max.yaml new file mode 100644 index 00000000000..8c4617854a5 --- /dev/null +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/upper_bracket_income_max.yaml @@ -0,0 +1,16 @@ +description: +values: + 2010-12-31: 22_500 + 2011-12-31: 25_000 + 2012-12-31: 27_500 + 2013-12-31: 30_000 + 2014-12-31: 32_500 + 2015-12-31: 35_000 + +metadata: + unit: currency-USD + label: + period: year + reference: + - title: + href: \ No newline at end of file diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/upper_bracket_income_min.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/upper_bracket_income_min.yaml new file mode 100644 index 00000000000..bdebc78508d --- /dev/null +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/upper_bracket_income_min.yaml @@ -0,0 +1,11 @@ +description: +values: + 2010-12-31: 10_000 + +metadata: + unit: currency-USD + label: + period: year + reference: + - title: + href: \ 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 new file mode 100644 index 00000000000..5fcdd087dba --- /dev/null +++ b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class pr_earned_income_credit_eligible(Variable): + value_type = bool + unit = USD + entity = Person + label = "" + definition_period = YEAR + reference = "" + + def formula(person, period, parameters): + p = parameters( + period + ).gov.territories.pr.tax.income.credits.earned_income + head_or_spouse = person("is_tax_unit_head_or_spouse", period) + net_income = person("") # if net_income (interest, child care payments etc.) + + return head_or_spouse & net_income < p.net_income_limit \ No newline at end of file From eb9f6befe361213f339819979d754520d5cda079 Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Thu, 16 Jan 2025 08:08:11 +0000 Subject: [PATCH 02/19] Puerto Rico Earned Income Credit Fixes #5467 --- .../ineligible_income_categories.yaml | 14 ++++++++ .../credits/earned_income/max_credit.yaml | 16 +++++++++ .../earned_income/max_investment_income.yaml | 10 ++++++ .../earned_income/net_income_limit.yaml | 10 ------ .../credits/earned_income/percent_income.yaml | 16 --------- .../percent_income_upper_bracket.yaml | 11 ------ .../credits/earned_income/phase_in_rate.yaml | 16 +++++++++ .../credits/earned_income/phase_out_rate.yaml | 27 +++++++++++++++ .../upper_bracket_income_max.yaml | 16 --------- .../upper_bracket_income_min.yaml | 11 ------ .../pr_earned_income_credit_amount.py | 34 +++++++++++++++++++ .../pr_earned_income_credit_eligible.py | 9 +++-- 12 files changed, 121 insertions(+), 69 deletions(-) create mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/ineligible_income_categories.yaml create mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_credit.yaml create mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_investment_income.yaml delete mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/net_income_limit.yaml delete mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/percent_income.yaml delete mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/percent_income_upper_bracket.yaml create mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_in_rate.yaml create mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out_rate.yaml delete mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/upper_bracket_income_max.yaml delete mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/upper_bracket_income_min.yaml create mode 100644 policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.py diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/ineligible_income_categories.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/ineligible_income_categories.yaml new file mode 100644 index 00000000000..6aa0c0323cb --- /dev/null +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/ineligible_income_categories.yaml @@ -0,0 +1,14 @@ +description: The earned income credit will be denied if the sum of the following forms of income is greater than the max limit. +values: + 2010-12-31: + - interest_income + - dividend_income + - rental_income + - capital_gains + - child_support_received +metadata: + unit: list + label: Puerto Rico income sources to calculate for credit denial criteria for earned income credit + reference: + - title: P.R. Laws tit. 13, § 30211 (e) + href: 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 \ No newline at end of file diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_credit.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_credit.yaml new file mode 100644 index 00000000000..314fd3db09d --- /dev/null +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_credit.yaml @@ -0,0 +1,16 @@ +description: Puerto Rico +values: + 2010-12-31: 350 + 2011-12-31: 400 + 2012-12-31: 450 + 2013-12-31: 500 + 2014-12-31: 550 + 2015-12-31: 600 + +metadata: + unit: currency-USD + label: Puerto Rico earned income credit maximum amount + period: year + reference: + - title: P.R. Laws tit. 13, § 30211 (1)-(6) + href: 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 \ No newline at end of file diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_investment_income.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_investment_income.yaml new file mode 100644 index 00000000000..292efa211c7 --- /dev/null +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_investment_income.yaml @@ -0,0 +1,10 @@ +description: The following is the maximum amount allowed in certain forms of income (i.e. child support payments, interest) to receive the earned income credit. +values: + 2010-12-31: 2_200 +metadata: + unit: currency-USD + label: Puerto Rico maximum investment income to receive earned income credit + period: year + reference: + - title: P.R. Laws tit. 13, § 30211 (e) + href: 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 \ No newline at end of file diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/net_income_limit.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/net_income_limit.yaml deleted file mode 100644 index 029cb731d88..00000000000 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/net_income_limit.yaml +++ /dev/null @@ -1,10 +0,0 @@ -description: -values: - 2010-12-31: 2_200 -metadata: - unit: currency-USD - label: - period: year - reference: - - title: - href: \ No newline at end of file diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/percent_income.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/percent_income.yaml deleted file mode 100644 index 76bc592c3ae..00000000000 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/percent_income.yaml +++ /dev/null @@ -1,16 +0,0 @@ -description: -values: - 2010-12-31: 3.5 - 2011-12-31: 4 - 2012-12-31: 4.5 - 2013-12-31: 5 - 2014-12-31: 5.5 - 2015-12-31: 6 - -metadata: - unit: percent - label: - period: year - reference: - - title: - href: \ No newline at end of file diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/percent_income_upper_bracket.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/percent_income_upper_bracket.yaml deleted file mode 100644 index be907c9d6a5..00000000000 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/percent_income_upper_bracket.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: -values: - 2010-12-31: 2 - -metadata: - unit: percent - label: - period: year - reference: - - title: - href: \ No newline at end of file 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 new file mode 100644 index 00000000000..1b15cc65836 --- /dev/null +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_in_rate.yaml @@ -0,0 +1,16 @@ +description: Puerto Rico has a phase in rate to determine the amount of earned income credit for people that have an income below a certain limit. +values: + 2010-12-31: 0.035 + 2011-12-31: 0.04 + 2012-12-31: 0.045 + 2013-12-31: 0.05 + 2014-12-31: 0.055 + 2015-12-31: 0.06 + +metadata: + unit: /1 + label: Puerto Rico earned income credit phase in rate + period: year + reference: + - title: P.R. Laws tit. 13, § 30211 (1)-(6) + href: 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 \ No newline at end of file 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 new file mode 100644 index 00000000000..78ecbbe8666 --- /dev/null +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out_rate.yaml @@ -0,0 +1,27 @@ +description: Puerto Rico has a phase out rate to calculate on any income greater than a certain limit. +brackets: + - threshold: # if below the threshold, no phase out + 2010-12-31: 0 + rate: + 2010-12-31: 0 + - threshold: # if in the middle bracket, phase out percentage which subtracts from phase in part + 2010-12-31: 10_000 + rate: + 2010-12-31: 0.02 + - threshold: # no percentage rate for any amount of income above upper limit + 2010-12-31: 22_500 + 2011-12-31: 25_000 + 2012-12-31: 27_500 + 2013-12-31: 30_000 + 2014-12-31: 32_500 + 2015-12-31: 35_000 + rate: + 2010-12-31: 0 +metadata: + rate_unit: /1 + threshold_unit: currency-USD + label: Puerto Rico earned income credit phase out rate + period: year + reference: + - title: P.R. Laws tit. 13, § 30211 (1)-(6) + href: 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 diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/upper_bracket_income_max.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/upper_bracket_income_max.yaml deleted file mode 100644 index 8c4617854a5..00000000000 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/upper_bracket_income_max.yaml +++ /dev/null @@ -1,16 +0,0 @@ -description: -values: - 2010-12-31: 22_500 - 2011-12-31: 25_000 - 2012-12-31: 27_500 - 2013-12-31: 30_000 - 2014-12-31: 32_500 - 2015-12-31: 35_000 - -metadata: - unit: currency-USD - label: - period: year - reference: - - title: - href: \ No newline at end of file diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/upper_bracket_income_min.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/upper_bracket_income_min.yaml deleted file mode 100644 index bdebc78508d..00000000000 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/upper_bracket_income_min.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: -values: - 2010-12-31: 10_000 - -metadata: - unit: currency-USD - label: - period: year - reference: - - title: - href: \ No newline at end of file diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.py b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.py new file mode 100644 index 00000000000..68a4536d114 --- /dev/null +++ b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.py @@ -0,0 +1,34 @@ +from policyengine_us.model_api import * + +class pr_low_income_credit(Variable): + value_type = float + entity = Person + label = "Puerto Rico earned income credit" + unit = USD + definition_period = YEAR + reference = "" + defined_for = "pr_earned_income_credit_eligible" + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.territories.pr.tax.income.credits.earned_income + + # workflow: + # Calculate credit amount pre phase out + # Income * phase_in_rate capped at max_credit + # Calculate the phase_out + # p.phase_out_rate.calc(income) + # Calculate final value + # credit - phase_out + earned_gross_income = 10_000 # PLACEHOLDER for earned gross income, person level + + # calculate phase in + # what does p.phase_out_amount.threshold return? which threshold? + upper_threshold = p.phase_out_amount.threshold[] + # if gross income > upper threshold, calculate [bottom threshold * phase_in] - [(upper - bottom threshold) * phase_out] + # if gross income > lower threshold, calculate [bottom threshold (i.e. 10k) * phase_in] - [(income - bottom threshold) * phase_out] + # ELSE, calculate income * phase_in_rate + + + return False \ 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 5fcdd087dba..ff4c11e3f78 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 @@ -1,9 +1,7 @@ from policyengine_us.model_api import * - class pr_earned_income_credit_eligible(Variable): value_type = bool - unit = USD entity = Person label = "" definition_period = YEAR @@ -14,6 +12,7 @@ def formula(person, period, parameters): period ).gov.territories.pr.tax.income.credits.earned_income head_or_spouse = person("is_tax_unit_head_or_spouse", period) - net_income = person("") # if net_income (interest, child care payments etc.) - - return head_or_spouse & net_income < p.net_income_limit \ No newline at end of file + adds = "gov.territories.pr.tax.income.credits.earned_income.ineligible_income_categories" + investment_income_amount_allowed = adds < p.max_investment_income + # check that earned income is above 0? + return head_or_spouse & investment_income_amount_allowed \ No newline at end of file From 9b54ff28d17d787d3596acb5af4044f52d97294c Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Tue, 21 Jan 2025 17:41:55 +0000 Subject: [PATCH 03/19] Puerto Rico Earned Income Credit Fixes #5467 --- .../ineligible_income_categories.yaml | 5 +- .../{max_credit.yaml => max_amount.yaml} | 4 +- .../earned_income/max_investment_income.yaml | 4 +- .../credits/earned_income/phase_in_rate.yaml | 2 +- .../credits/earned_income/phase_out_rate.yaml | 12 +++-- .../pr_earned_income_credit_amount.yaml | 47 +++++++++++++++++++ .../pr_earned_income_credit_eligible.yaml | 23 +++++++++ ...arned_income_credit_investment_income.yaml | 0 .../pr_earned_income_credit_amount.py | 28 ++++------- .../pr_earned_income_credit_eligible.py | 11 ++--- ..._earned_income_credit_investment_income.py | 16 +++++++ .../income/pr_gross_income_person_level.py | 10 ++++ 12 files changed, 125 insertions(+), 37 deletions(-) rename policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/{max_credit.yaml => max_amount.yaml} (77%) create mode 100644 policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.yaml create mode 100644 policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py create mode 100644 policyengine_us/variables/gov/territories/pr/tax/income/pr_gross_income_person_level.py diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/ineligible_income_categories.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/ineligible_income_categories.yaml index 6aa0c0323cb..776d1a8f279 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/ineligible_income_categories.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/ineligible_income_categories.yaml @@ -1,4 +1,4 @@ -description: The earned income credit will be denied if the sum of the following forms of income is greater than the max limit. +description: Puerto Rico will deny the earned income credit if the sum of the following forms of income is greater than the defined maximum limit. values: 2010-12-31: - interest_income @@ -8,7 +8,8 @@ values: - child_support_received metadata: unit: list - label: Puerto Rico income sources to calculate for credit denial criteria for earned income credit + period: year + label: Puerto Rico investment income sources to calculate for credit denial criteria for earned income credit reference: - title: P.R. Laws tit. 13, § 30211 (e) href: 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 \ No newline at end of file diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_credit.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_amount.yaml similarity index 77% rename from policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_credit.yaml rename to policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_amount.yaml index 314fd3db09d..ec658e4700f 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_credit.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_amount.yaml @@ -1,4 +1,4 @@ -description: Puerto Rico +description: Puerto Rico allows a maximum amount of credit for the earned income credit. values: 2010-12-31: 350 2011-12-31: 400 @@ -9,7 +9,7 @@ values: metadata: unit: currency-USD - label: Puerto Rico earned income credit maximum amount + label: Puerto Rico earned income credit max amount period: year reference: - title: P.R. Laws tit. 13, § 30211 (1)-(6) diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_investment_income.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_investment_income.yaml index 292efa211c7..21c2336d866 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_investment_income.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_investment_income.yaml @@ -1,9 +1,9 @@ -description: The following is the maximum amount allowed in certain forms of income (i.e. child support payments, interest) to receive the earned income credit. +description: Puerto Rico limits the earned income credit to filers with investment income below this threshold. values: 2010-12-31: 2_200 metadata: unit: currency-USD - label: Puerto Rico maximum investment income to receive earned income credit + label: Puerto Rico max investment income to receive earned income credit period: year reference: - title: P.R. Laws tit. 13, § 30211 (e) 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 1b15cc65836..d33c1cdddf7 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 @@ -1,4 +1,4 @@ -description: Puerto Rico has a phase in rate to determine the amount of earned income credit for people that have an income below a certain limit. +description: Puerto Rico has a phase in rate for the earned income credit. values: 2010-12-31: 0.035 2011-12-31: 0.04 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 78ecbbe8666..009426e073b 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,14 +1,17 @@ -description: Puerto Rico has a phase out rate to calculate on any income greater than a certain limit. +description: Puerto Rico has a phase out rate for the earned income credit. brackets: - - threshold: # if below the threshold, no phase out + # if below the threshold, no phase out + - threshold: 2010-12-31: 0 rate: 2010-12-31: 0 - - threshold: # if in the middle bracket, phase out percentage which subtracts from phase in part + # if in the middle bracket, phase out percentage which subtracts from phase in part + - threshold: 2010-12-31: 10_000 rate: 2010-12-31: 0.02 - - threshold: # no percentage rate for any amount of income above upper limit + # no percentage rate for any amount of income above upper limit + - threshold: 2010-12-31: 22_500 2011-12-31: 25_000 2012-12-31: 27_500 @@ -20,6 +23,7 @@ brackets: metadata: rate_unit: /1 threshold_unit: currency-USD + type_marginal: marginal_rate label: Puerto Rico earned income credit phase out rate period: year reference: diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.yaml new file mode 100644 index 00000000000..19730e53dcb --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.yaml @@ -0,0 +1,47 @@ +- name: Not eligible person, 2024 + period: 2024 + input: + pr_gross_income_person: 10_000 + pr_earned_income_credit_eligible: false + output: + pr_earned_income_credit_amount: 0 + +- name: Eligible person in the highest bracket, 2024 + period: 2024 + input: + pr_gross_income_person: 35_000 + pr_earned_income_credit_eligible: true + output: + pr_earned_income_credit_amount: 100 + +- name: Eligible person in the middle bracket, 2024 + period: 2024 + input: + pr_gross_income_person: 34_000 + pr_earned_income_credit_eligible: true + output: + pr_earned_income_credit_amount: 120 + +- name: Eligible person with max credit, 2024 + period: 2024 + input: + pr_gross_income_person: 10_000 + pr_earned_income_credit_eligible: true + output: + pr_earned_income_credit_amount: 600 + +- name: Eligible person in the lower bracket, 2024 + period: 2024 + input: + pr_gross_income_person: 8_000 + pr_earned_income_credit_eligible: true + output: + pr_earned_income_credit_amount: 480 + +- name: Eligible person in the lower bracket, 2011 + period: 2011 + input: + pr_gross_income_person: 8_000 + pr_earned_income_credit_eligible: true + output: + pr_earned_income_credit_amount: 320 \ No newline at end of file diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml new file mode 100644 index 00000000000..fa9c9491542 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml @@ -0,0 +1,23 @@ +- name: Dependent + period: 2024 + input: + is_tax_unit_head_or_spouse: true + pr_earned_income_credit_investment_income: 2_000 + output: + pr_earned_income_credit_eligible: false + +- name: Investment income over the limit + period: 2024 + input: + is_tax_unit_head_or_spouse: false + pr_earned_income_credit_investment_income: 2_201 + output: + pr_earned_income_credit_eligible: false + +- name: Eligible person + period: 2024 + input: + is_tax_unit_head_or_spouse: true + pr_earned_income_credit_investment_income: 2_200 + output: + pr_earned_income_credit_eligible: true \ No newline at end of file diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.yaml new file mode 100644 index 00000000000..e69de29bb2d diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.py b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.py index 68a4536d114..99214ba6aeb 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.py @@ -1,12 +1,12 @@ from policyengine_us.model_api import * -class pr_low_income_credit(Variable): +class pr_earned_income_credit_amount(Variable): value_type = float entity = Person - label = "Puerto Rico earned income credit" + label = "Puerto Rico earned income credit amount" unit = USD definition_period = YEAR - reference = "" + 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" defined_for = "pr_earned_income_credit_eligible" def formula(tax_unit, period, parameters): @@ -14,21 +14,9 @@ def formula(tax_unit, period, parameters): period ).gov.territories.pr.tax.income.credits.earned_income - # workflow: - # Calculate credit amount pre phase out - # Income * phase_in_rate capped at max_credit - # Calculate the phase_out - # p.phase_out_rate.calc(income) - # Calculate final value - # credit - phase_out - earned_gross_income = 10_000 # PLACEHOLDER for earned gross income, person level + 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) - # calculate phase in - # what does p.phase_out_amount.threshold return? which threshold? - upper_threshold = p.phase_out_amount.threshold[] - # if gross income > upper threshold, calculate [bottom threshold * phase_in] - [(upper - bottom threshold) * phase_out] - # if gross income > lower threshold, calculate [bottom threshold (i.e. 10k) * phase_in] - [(income - bottom threshold) * phase_out] - # ELSE, calculate income * phase_in_rate - - - return False \ No newline at end of file + 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 ff4c11e3f78..3d87ab49a92 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 @@ -3,16 +3,15 @@ class pr_earned_income_credit_eligible(Variable): value_type = bool entity = Person - label = "" + label = "Eligible person for Puerto Rico earned income credit" definition_period = YEAR - reference = "" + 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): p = parameters( period ).gov.territories.pr.tax.income.credits.earned_income head_or_spouse = person("is_tax_unit_head_or_spouse", period) - adds = "gov.territories.pr.tax.income.credits.earned_income.ineligible_income_categories" - investment_income_amount_allowed = adds < p.max_investment_income - # check that earned income is above 0? - return head_or_spouse & investment_income_amount_allowed \ No newline at end of file + investment_income = person("pr_earned_income_credit_investment_income", period) + investment_income_amount_under_limit = investment_income < p.max_investment_income + return head_or_spouse & investment_income_amount_under_limit diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py new file mode 100644 index 00000000000..b44efc0cc93 --- /dev/null +++ b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + +class pr_earned_income_credit_investment_income(Variable): + value_type = float + entity = Person + label = "Puerto Rico earned income credit investment income" + definition_period = YEAR + 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): + p = parameters( + period + ).gov.territories.pr.tax.income.credits.earned_income + # sum up all defined categories for investment income + adds = "gov.territories.pr.tax.income.credits.earned_income.ineligible_income_categories" + return adds \ No newline at end of file diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/pr_gross_income_person_level.py b/policyengine_us/variables/gov/territories/pr/tax/income/pr_gross_income_person_level.py new file mode 100644 index 00000000000..8ff663ae065 --- /dev/null +++ b/policyengine_us/variables/gov/territories/pr/tax/income/pr_gross_income_person_level.py @@ -0,0 +1,10 @@ +from policyengine_us.model_api import * + + +class pr_gross_income(Variable): + value_type = float + entity = Person + label = "Puerto Rico gross income person level" + unit = USD + definition_period = YEAR + 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-1005-computation-of-taxable-income/subchapter-a-determination-of-net-income-general-concepts/30101-gross-income" \ No newline at end of file From 4a36ffcb95a2c558cd321f270c2a5f2e148443bd Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Thu, 23 Jan 2025 07:43:44 +0000 Subject: [PATCH 04/19] EITC changes --- .../limit.yaml} | 2 +- .../sources.yaml} | 4 ++-- .../income/credits/earned_income/max_amount.yaml | 2 +- .../income/credits/earned_income/phase_in_rate.yaml | 2 +- .../credits/earned_income/phase_out_rate.yaml | 2 +- .../pr_earned_income_credit_amount.yaml | 2 +- .../pr_earned_income_credit_eligible.yaml | 4 ++-- .../pr_earned_income_credit_investment_income.yaml | 0 .../earned_income/pr_earned_income_credit_amount.py | 7 ++++--- .../pr_earned_income_credit_eligible.py | 13 ++++++++----- .../pr_earned_income_credit_investment_income.py | 10 +++------- ...me_person_level.py => pr_gross_income_person.py} | 6 +++--- 12 files changed, 27 insertions(+), 27 deletions(-) rename policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/{max_investment_income.yaml => investment_income/limit.yaml} (86%) rename policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/{ineligible_income_categories.yaml => investment_income/sources.yaml} (64%) delete mode 100644 policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.yaml rename policyengine_us/variables/gov/territories/pr/tax/income/{pr_gross_income_person_level.py => pr_gross_income_person.py} (76%) diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_investment_income.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/investment_income/limit.yaml similarity index 86% rename from policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_investment_income.yaml rename to policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/investment_income/limit.yaml index 21c2336d866..7640a8253d5 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/max_investment_income.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/investment_income/limit.yaml @@ -3,7 +3,7 @@ values: 2010-12-31: 2_200 metadata: unit: currency-USD - label: Puerto Rico max investment income to receive earned income credit + label: Puerto Rico earned income credit investment income limit period: year reference: - title: P.R. Laws tit. 13, § 30211 (e) diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/ineligible_income_categories.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/investment_income/sources.yaml similarity index 64% rename from policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/ineligible_income_categories.yaml rename to policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/investment_income/sources.yaml index 776d1a8f279..97b0964e5b8 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/ineligible_income_categories.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/investment_income/sources.yaml @@ -1,4 +1,4 @@ -description: Puerto Rico will deny the earned income credit if the sum of the following forms of income is greater than the defined maximum limit. +description: Puerto Rico accounts for the following investment income sources, under the earned income tax credit. values: 2010-12-31: - interest_income @@ -9,7 +9,7 @@ values: metadata: unit: list period: year - label: Puerto Rico investment income sources to calculate for credit denial criteria for earned income credit + label: Puerto Rico earned income credit investment income sources reference: - title: P.R. Laws tit. 13, § 30211 (e) href: 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 \ No newline at end of file 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 ec658e4700f..0c02d009269 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,4 +1,4 @@ -description: Puerto Rico allows a maximum amount of credit for the earned income credit. +description: Puerto Rico provides this maximum earned income credit. values: 2010-12-31: 350 2011-12-31: 400 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 d33c1cdddf7..1074cf8e6b7 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 @@ -1,4 +1,4 @@ -description: Puerto Rico has a phase in rate for the earned income credit. +description: Puerto Rico phases the earned income credit in at this rate of state gross income. values: 2010-12-31: 0.035 2011-12-31: 0.04 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 009426e073b..04c28cc9244 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,4 +1,4 @@ -description: Puerto Rico has a phase out rate for the earned income credit. +description: Puerto Rico phases the earned income credit out at this rate of state gross income. brackets: # if below the threshold, no phase out - threshold: diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.yaml index 19730e53dcb..1e5fa4d6cea 100644 --- a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.yaml +++ b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.yaml @@ -44,4 +44,4 @@ pr_gross_income_person: 8_000 pr_earned_income_credit_eligible: true output: - pr_earned_income_credit_amount: 320 \ No newline at end of file + pr_earned_income_credit_amount: 280 \ No newline at end of file diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml index fa9c9491542..f79897de07d 100644 --- a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml @@ -1,7 +1,7 @@ - name: Dependent period: 2024 input: - is_tax_unit_head_or_spouse: true + is_tax_unit_head_or_spouse: false pr_earned_income_credit_investment_income: 2_000 output: pr_earned_income_credit_eligible: false @@ -9,7 +9,7 @@ - name: Investment income over the limit period: 2024 input: - is_tax_unit_head_or_spouse: false + is_tax_unit_head_or_spouse: true pr_earned_income_credit_investment_income: 2_201 output: pr_earned_income_credit_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.yaml deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.py b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.py index 99214ba6aeb..73cd3439ed6 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.py @@ -1,5 +1,6 @@ from policyengine_us.model_api import * + class pr_earned_income_credit_amount(Variable): value_type = float entity = Person @@ -9,14 +10,14 @@ class pr_earned_income_credit_amount(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" defined_for = "pr_earned_income_credit_eligible" - def formula(tax_unit, period, parameters): + def formula(person, period, parameters): p = parameters( period ).gov.territories.pr.tax.income.credits.earned_income 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_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 \ No newline at end of file + return phase_in - phase_out 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 3d87ab49a92..cffb99fba30 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 @@ -1,17 +1,20 @@ from policyengine_us.model_api import * + class pr_earned_income_credit_eligible(Variable): value_type = bool entity = Person - label = "Eligible person for Puerto Rico earned income credit" + label = "Puerto Rico earned income credit eligibility" definition_period = YEAR 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): p = parameters( period - ).gov.territories.pr.tax.income.credits.earned_income + ).gov.territories.pr.tax.income.credits.earned_income.investment_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.max_investment_income - return head_or_spouse & investment_income_amount_under_limit + 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 diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py index b44efc0cc93..968901a1038 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py @@ -1,16 +1,12 @@ from policyengine_us.model_api import * + class pr_earned_income_credit_investment_income(Variable): value_type = float entity = Person label = "Puerto Rico earned income credit investment income" definition_period = YEAR + unit = USD 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): - p = parameters( - period - ).gov.territories.pr.tax.income.credits.earned_income - # sum up all defined categories for investment income - adds = "gov.territories.pr.tax.income.credits.earned_income.ineligible_income_categories" - return adds \ No newline at end of file + adds = "gov.territories.pr.tax.income.credits.earned_income.ineligible_income_categories" diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/pr_gross_income_person_level.py b/policyengine_us/variables/gov/territories/pr/tax/income/pr_gross_income_person.py similarity index 76% rename from policyengine_us/variables/gov/territories/pr/tax/income/pr_gross_income_person_level.py rename to policyengine_us/variables/gov/territories/pr/tax/income/pr_gross_income_person.py index 8ff663ae065..c448a011f9d 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/pr_gross_income_person_level.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/pr_gross_income_person.py @@ -1,10 +1,10 @@ from policyengine_us.model_api import * -class pr_gross_income(Variable): +class pr_gross_income_person(Variable): value_type = float entity = Person - label = "Puerto Rico gross income person level" + label = "Puerto Rico gross income person" unit = USD definition_period = YEAR - 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-1005-computation-of-taxable-income/subchapter-a-determination-of-net-income-general-concepts/30101-gross-income" \ No newline at end of file + 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-1005-computation-of-taxable-income/subchapter-a-determination-of-net-income-general-concepts/30101-gross-income" From d2a9a8bd4ca21c7471bc89f4c209b4e38e14b432 Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Thu, 23 Jan 2025 17:45:08 +0000 Subject: [PATCH 05/19] Puerto Rico Earned Income Credit Fixes #5467 --- changelog_entry.yaml | 4 ++++ .../pr/tax/income/credits/refundable.yaml | 1 + ...edit_amount.yaml => pr_earned_income_credit.yaml} | 12 ++++++------ ...e_credit_amount.py => pr_earned_income_credit.py} | 2 +- .../pr_earned_income_credit_investment_income.py | 2 +- 5 files changed, 13 insertions(+), 8 deletions(-) rename policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/{pr_earned_income_credit_amount.yaml => pr_earned_income_credit.yaml} (80%) rename policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/{pr_earned_income_credit_amount.py => pr_earned_income_credit.py} (95%) diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb2d..18d9f285de8 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,4 @@ +- bump: minor + changes: + added: + - Puerto Rico earned income credit. diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/refundable.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/refundable.yaml index f6a7a3f7ab2..029bcb1181d 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/refundable.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/refundable.yaml @@ -12,3 +12,4 @@ values: 2021-01-01: - pr_low_income_credit - pr_compensatory_low_income_credit + - pr_earned_income_credit diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.yaml similarity index 80% rename from policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.yaml rename to policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.yaml index 1e5fa4d6cea..60c8e13ce17 100644 --- a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.yaml +++ b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.yaml @@ -4,7 +4,7 @@ pr_gross_income_person: 10_000 pr_earned_income_credit_eligible: false output: - pr_earned_income_credit_amount: 0 + pr_earned_income_credit: 0 - name: Eligible person in the highest bracket, 2024 period: 2024 @@ -12,7 +12,7 @@ pr_gross_income_person: 35_000 pr_earned_income_credit_eligible: true output: - pr_earned_income_credit_amount: 100 + pr_earned_income_credit: 100 - name: Eligible person in the middle bracket, 2024 period: 2024 @@ -20,7 +20,7 @@ pr_gross_income_person: 34_000 pr_earned_income_credit_eligible: true output: - pr_earned_income_credit_amount: 120 + pr_earned_income_credit: 120 - name: Eligible person with max credit, 2024 period: 2024 @@ -28,7 +28,7 @@ pr_gross_income_person: 10_000 pr_earned_income_credit_eligible: true output: - pr_earned_income_credit_amount: 600 + pr_earned_income_credit: 600 - name: Eligible person in the lower bracket, 2024 period: 2024 @@ -36,7 +36,7 @@ pr_gross_income_person: 8_000 pr_earned_income_credit_eligible: true output: - pr_earned_income_credit_amount: 480 + pr_earned_income_credit: 480 - name: Eligible person in the lower bracket, 2011 period: 2011 @@ -44,4 +44,4 @@ pr_gross_income_person: 8_000 pr_earned_income_credit_eligible: true output: - pr_earned_income_credit_amount: 280 \ No newline at end of file + pr_earned_income_credit: 280 \ No newline at end of file diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.py b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.py similarity index 95% rename from policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.py rename to policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.py index 73cd3439ed6..d802bad7085 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_amount.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.py @@ -1,7 +1,7 @@ from policyengine_us.model_api import * -class pr_earned_income_credit_amount(Variable): +class pr_earned_income_credit(Variable): value_type = float entity = Person label = "Puerto Rico earned income credit amount" diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py index 968901a1038..77a26671b23 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py @@ -9,4 +9,4 @@ class pr_earned_income_credit_investment_income(Variable): unit = USD 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" - adds = "gov.territories.pr.tax.income.credits.earned_income.ineligible_income_categories" + adds = "gov.territories.pr.tax.income.credits.earned_income.investment_income.sources" From bfccb2c7579e141c1dbb4057ed8946cc3035ab5d Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Thu, 23 Jan 2025 17:49:35 +0000 Subject: [PATCH 06/19] EITC credit added tax reference form --- .../income/credits/earned_income/investment_income/limit.yaml | 4 +++- .../credits/earned_income/investment_income/sources.yaml | 4 +++- .../pr/tax/income/credits/earned_income/max_amount.yaml | 4 +++- .../pr/tax/income/credits/earned_income/phase_in_rate.yaml | 4 +++- .../pr/tax/income/credits/earned_income/phase_out_rate.yaml | 2 ++ 5 files changed, 14 insertions(+), 4 deletions(-) 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 7640a8253d5..6efba0cb5c4 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 @@ -7,4 +7,6 @@ metadata: period: year reference: - title: P.R. Laws tit. 13, § 30211 (e) - href: 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 \ No newline at end of file + href: 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 + - title: P.R. Anejo CT Individuo + href: https://hacienda.pr.gov/sites/default/files/anejo_ct_rev._15_may_23_informativo_-_instrucciones.pdf \ No newline at end of file diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/investment_income/sources.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/investment_income/sources.yaml index 97b0964e5b8..dd399314290 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/investment_income/sources.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/investment_income/sources.yaml @@ -12,4 +12,6 @@ metadata: label: Puerto Rico earned income credit investment income sources reference: - title: P.R. Laws tit. 13, § 30211 (e) - href: 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 \ No newline at end of file + href: 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 + - title: P.R. Anejo CT Individuo + href: https://hacienda.pr.gov/sites/default/files/anejo_ct_rev._15_may_23_informativo_-_instrucciones.pdf \ No newline at end of file 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 0c02d009269..4fe4482f6ad 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 @@ -13,4 +13,6 @@ metadata: period: year reference: - title: P.R. Laws tit. 13, § 30211 (1)-(6) - href: 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 \ No newline at end of file + href: 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 + - title: P.R. Anejo CT Individuo + href: https://hacienda.pr.gov/sites/default/files/anejo_ct_rev._15_may_23_informativo_-_instrucciones.pdf \ No newline at end of file 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 1074cf8e6b7..ac6bf852ce6 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 @@ -13,4 +13,6 @@ metadata: period: year reference: - title: P.R. Laws tit. 13, § 30211 (1)-(6) - href: 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 \ No newline at end of file + href: 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 + - title: P.R. Anejo CT Individuo + href: https://hacienda.pr.gov/sites/default/files/anejo_ct_rev._15_may_23_informativo_-_instrucciones.pdf \ No newline at end of file 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 04c28cc9244..9b661b6f9d8 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 @@ -29,3 +29,5 @@ metadata: reference: - title: P.R. Laws tit. 13, § 30211 (1)-(6) href: 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 + - title: P.R. Anejo CT Individuo + href: https://hacienda.pr.gov/sites/default/files/anejo_ct_rev._15_may_23_informativo_-_instrucciones.pdf \ No newline at end of file From a5ba90413c71eee7dc773df592f65dd9c08c5eae Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Thu, 30 Jan 2025 20:04:25 +0000 Subject: [PATCH 07/19] Changes to fit tax form --- .../earned_income/eligibility/max.yaml | 9 +++++++ .../earned_income/eligibility/min.yaml | 9 +++++++ .../credits/earned_income/max_amount.yaml | 27 +++++++++++++------ .../credits/earned_income/phase_in_rate.yaml | 25 ++++++++++++++++- .../pr_earned_income_child_count.py | 11 ++++++++ .../pr_earned_income_credit_eligible.py | 3 +++ 6 files changed, 75 insertions(+), 9 deletions(-) create mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/eligibility/max.yaml create mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/eligibility/min.yaml create mode 100644 policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_child_count.py 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 new file mode 100644 index 00000000000..1d7b64b9cb6 --- /dev/null +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/eligibility/max.yaml @@ -0,0 +1,9 @@ +description: Puerto Rico limits EITC eligibility to filers below or equal to this age. +values: + 2023-01-01: 65 +metadata: + unit: year + label: EITC 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 new file mode 100644 index 00000000000..f76a19c1170 --- /dev/null +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/eligibility/min.yaml @@ -0,0 +1,9 @@ +description: Puerto Rico limits EITC eligibility to people of this age or older. +values: + 2023-01-01: 19 +metadata: + unit: year + label: EITC 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 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 4fe4482f6ad..8af739bba42 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,14 +1,25 @@ description: Puerto Rico provides this maximum earned income credit. -values: - 2010-12-31: 350 - 2011-12-31: 400 - 2012-12-31: 450 - 2013-12-31: 500 - 2014-12-31: 550 - 2015-12-31: 600 +brackets: + - threshold: + 2010-12-31: 0 + amount: + 2010-12-31: 1656 + - threshold: + 2010-12-31: 1 + amount: + 2010-12-31: 3864 + - threshold: + 2010-12-31: 2 + amount: + 2010-12-31: 6072 + - threshold: + 2010-12-31: 3 + amount: + 2010-12-31: 7173 metadata: - unit: currency-USD + threshold_unit: child + amount_unit: currency-USD label: Puerto Rico earned income credit max amount period: year reference: 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 ac6bf852ce6..230c1501b5d 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 @@ -1,4 +1,25 @@ description: Puerto Rico phases the earned income credit in at this rate of state gross income. +brackets: + # 0 children + - threshold: + 2010-12-31: 0 + rate: + 2010-12-31: 0 + # 1 child + - threshold: + 2010-12-31: 1 + rate: + 2010-12-31: 0.02 + # 2 children + - threshold: + 2010-12-31: 2 + rate: + 2010-12-31: 0 + # 3 children + - threshold: + 2010-12-31: 3 + rate: + 2010-12-31: 0 values: 2010-12-31: 0.035 2011-12-31: 0.04 @@ -8,7 +29,9 @@ values: 2015-12-31: 0.06 metadata: - unit: /1 + rate_unit: /1 + threshold_unit: + type_marginal: marginal_rate label: Puerto Rico earned income credit phase in rate period: year reference: 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 new file mode 100644 index 00000000000..62cfbe86ee7 --- /dev/null +++ b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_child_count.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class pr_earned_income_child_count(Variable): + value_type = int + entity = TaxUnit + label = "EITC-qualifying children" + definition_period = YEAR + reference = + + adds = ["is_child_dependent"] 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 cffb99fba30..af3a693d795 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,6 +9,9 @@ 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 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 08/19] 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 From b8513fd03cd2dcda969fc91143b57847765be0d7 Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Tue, 4 Feb 2025 20:47:02 +0000 Subject: [PATCH 09/19] Puerto Rico Earned Income Credit Fixes #5467 added filing status, dependent number --- .../credits/earned_income/phase_in_rate.yaml | 23 ++++-------- .../credits/earned_income/phase_out/rate.yaml | 30 ++++++++++++++++ .../threshold/joint.yaml} | 33 +++++++---------- .../phase_out/threshold/single.yaml | 30 ++++++++++++++++ .../earned_income/pr_earned_income_credit.py | 35 +++++++++++++++---- 5 files changed, 107 insertions(+), 44 deletions(-) create mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/rate.yaml rename policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/{phase_out_rate.yaml => phase_out/threshold/joint.yaml} (50%) create mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/single.yaml 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 5a73395e40c..724eb94086b 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 @@ -1,36 +1,25 @@ description: Puerto Rico phases the earned income credit in at this rate of state gross income. +# determine phase in rate percentage by number of children brackets: - # 0 children - threshold: 2010-12-31: 0 rate: - 2010-12-31: 0 - # 1 child + 2010-12-31: 0.15 - threshold: 2010-12-31: 1 rate: - 2010-12-31: 0.02 - # 2 children + 2010-12-31: 0.3398 - threshold: 2010-12-31: 2 rate: - 2010-12-31: 0 - # 3 children + 2010-12-31: 0.4 - threshold: 2010-12-31: 3 rate: - 2010-12-31: 0 -values: - 2010-12-31: 0.035 - 2011-12-31: 0.04 - 2012-12-31: 0.045 - 2013-12-31: 0.05 - 2014-12-31: 0.055 - 2015-12-31: 0.06 - + 2010-12-31: 0.4483 metadata: rate_unit: /1 - threshold_unit: + threshold_unit: child type: marginal_rate label: Puerto Rico earned income credit phase in rate period: year 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 new file mode 100644 index 00000000000..58abe342737 --- /dev/null +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/rate.yaml @@ -0,0 +1,30 @@ +description: +# determine phase-out rate based on number of children +brackets: + - threshold: + 2023-01-01: 0 + rate: + 2023-01-01: 0.15 + - threshold: + 2023-01-01: 1 + rate: + 2023-01-01: 0.2692 + - threshold: + 2023-01-01: 2 + rate: + 2023-01-01: 0.3438 + - threshold: + 2023-01-01: 3 + rate: + 2023-01-01: 0.3421 +metadata: + rate_unit: /1 + threshold_unit: child + type_marginal: marginal_rate + label: Puerto Rico earned income credit phase out rate + period: year + reference: + - title: P.R. Laws tit. 13, § 30211 (1)-(6) + href: 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 + - title: P.R. Anejo CT Individuo + href: https://hacienda.pr.gov/sites/default/files/anejo_ct_rev._15_may_23_informativo_-_instrucciones.pdf \ No newline at end of file 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/threshold/joint.yaml similarity index 50% rename from policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out_rate.yaml rename to policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/joint.yaml index e68f6a2cde8..12df918f5e5 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/threshold/joint.yaml @@ -1,32 +1,25 @@ -# 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. +# determines the threshold for the phase-in rate to be applied based on # of children brackets: - # if below the threshold, no phase out - threshold: - 2010-12-31: 0 + 2023-01-01: 0 rate: - 2010-12-31: 0 - # if in the middle bracket, phase out percentage which subtracts from phase in part + 2023-01-01: 19_870 - threshold: - 2010-12-31: 10_000 + 2023-01-01: 1 rate: - 2010-12-31: 0.02 - # no percentage rate for any amount of income above upper limit + 2023-01-01: 24_280 - threshold: - 2010-12-31: 22_500 - 2011-12-31: 25_000 - 2012-12-31: 27_500 - 2013-12-31: 30_000 - 2014-12-31: 32_500 - 2015-12-31: 35_000 + 2023-01-01: 2 rate: - 2010-12-31: 0 + 2023-01-01: 27_590 + - threshold: + 2023-01-01: 3 + rate: + 2023-01-01: 27_590 metadata: - rate_unit: /1 - threshold_unit: currency-USD + rate_unit: currency-USD + threshold_unit: child type_marginal: marginal_rate label: Puerto Rico earned income credit phase out rate period: year diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/single.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/single.yaml new file mode 100644 index 00000000000..d2526c42c08 --- /dev/null +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/single.yaml @@ -0,0 +1,30 @@ +description: Puerto Rico phases the earned income credit out at this rate of state gross income. +# determines the threshold for the phase-in rate to be applied based on # of children +brackets: + - threshold: + 2023-01-01: 0 + rate: + 2023-01-01: 17_660 + - threshold: + 2023-01-01: 1 + rate: + 2023-01-01: 19_870 + - threshold: + 2023-01-01: 2 + rate: + 2023-01-01: 23_180 + - threshold: + 2023-01-01: 3 + rate: + 2023-01-01: 23_180 +metadata: + rate_unit: currency-USD + threshold_unit: child + type_marginal: marginal_rate + label: Puerto Rico earned income credit phase out rate + period: year + reference: + - title: P.R. Laws tit. 13, § 30211 (1)-(6) + href: 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 + - title: P.R. Anejo CT Individuo + href: https://hacienda.pr.gov/sites/default/files/anejo_ct_rev._15_may_23_informativo_-_instrucciones.pdf \ No newline at end of file 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 e72dc8b4004..d65a70c282d 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 @@ -1,5 +1,14 @@ from policyengine_us.model_api import * +# - computation: +# - need: earned income, number of children +# - (phase-in-rate.yaml[child] * earned income), max with the max credit[child] +# - phase-out = 0 +# - if single, +# - if earned income > single-threshold, phase_out = (earned income - single-threshold) * phase-out-rate[child] +# - if married, +# - if earned income > married-threshold, phase_out = (earned income - joint-threshold) * phase-out-rate[child] +# - phase in - phase out, min 0 class pr_earned_income_credit(Variable): value_type = float @@ -15,12 +24,24 @@ 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 + child_count = person.tax_unit("pr_earned_income_child_count", period) + filing_status = person.tax_unit("filing_status", period) gross_income = person("pr_gross_income_person", period) - 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 \ No newline at end of file + # compute credit + phase_in = min_(gross_income * p.phase_in_rate.calc(child_count), + p.max_amount.calc(child_count)) + phase_out = 0 + + # CHECK ME: what are the possible filing statuses? + phase_out_rate = p.phase_out.rate.calc(child_count) + if filing_status == filing_status.possible_values.SINGLE: + single_threshold = p.phase_out.threshold.single.calc(child_count) + if gross_income > single_threshold: + phase_out = (gross_income - single_threshold) * phase_out_rate + else: # default to married filing status + married_threshold = p.phase_out.threshold.joint.calc(child_count) + if gross_income > married_threshold: + phase_out = (gross_income - married_threshold) * phase_out_rate + + return max_(0, phase_in - phase_out) \ No newline at end of file From e2aa0c032ec3c89faa4c09c1f099a75c6b547bdf Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Thu, 6 Feb 2025 18:59:09 +0000 Subject: [PATCH 10/19] More testing --- .../pr_earned_income_credit.yaml | 22 ++++++++++ .../pr_earned_income_credit_eligible.yaml | 40 ++++++++++++++++++- .../pr_earned_income_child_count.py | 2 +- .../earned_income/pr_earned_income_credit.py | 9 ----- .../pr_earned_income_credit_eligible.py | 14 +++++-- 5 files changed, 72 insertions(+), 15 deletions(-) diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.yaml index 60c8e13ce17..afaf0c4194b 100644 --- a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.yaml @@ -1,11 +1,33 @@ - name: Not eligible person, 2024 period: 2024 input: + pr_earned_income_child_count: 2 + filing_status: SINGLE pr_gross_income_person: 10_000 pr_earned_income_credit_eligible: false output: pr_earned_income_credit: 0 +- name: Eligible person, 0 children with max credit + period: 2024 + input: + pr_earned_income_child_count: 0 + filing_status: SINGLE + pr_gross_income_person: 17_660 + pr_earned_income_credit_eligible: true + output: + pr_earned_income_credit: 1_656 + +- name: Eligible person, 1 child and higher bracket + period: 2024 + input: + pr_earned_income_child_count: 1 + filing_status: SINGLE + pr_gross_income_person: 25_000 + pr_earned_income_credit_eligible: true + output: + pr_earned_income_credit: 2_483.004 + - name: Eligible person in the highest bracket, 2024 period: 2024 input: diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml index f79897de07d..d59ec32a9ed 100644 --- a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml @@ -3,6 +3,38 @@ input: is_tax_unit_head_or_spouse: false pr_earned_income_credit_investment_income: 2_000 + age: 25 + filing_status: JOINT + output: + pr_earned_income_credit_eligible: false + +- name: Filing separately + period: 2024 + input: + is_tax_unit_head_or_spouse: true + pr_earned_income_credit_investment_income: 3_000 + age: 30 + filing_status: SEPARATE + output: + pr_earned_income_credit_eligible: false + +- name: Under the age limit + period: 2024 + input: + is_tax_unit_head_or_spouse: true + pr_earned_income_credit_investment_income: 2_000 + age: 18 + filing_status: JOINT + output: + pr_earned_income_credit_eligible: false + +- name: Over the age limit + period: 2024 + input: + is_tax_unit_head_or_spouse: true + pr_earned_income_credit_investment_income: 2_000 + age: 66 + filing_status: JOINT output: pr_earned_income_credit_eligible: false @@ -10,7 +42,9 @@ period: 2024 input: is_tax_unit_head_or_spouse: true - pr_earned_income_credit_investment_income: 2_201 + pr_earned_income_credit_investment_income: 10_001 + age: 60 + filing_status: SINGLE output: pr_earned_income_credit_eligible: false @@ -18,6 +52,8 @@ period: 2024 input: is_tax_unit_head_or_spouse: true - pr_earned_income_credit_investment_income: 2_200 + pr_earned_income_credit_investment_income: 10_000 + age: 65 + filing_status: SINGLE output: pr_earned_income_credit_eligible: true \ No newline at end of file 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 400f5317c32..a7a567de0ea 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 @@ -6,6 +6,6 @@ class pr_earned_income_child_count(Variable): entity = TaxUnit label = "Puerto Rico EITC-qualifying children" definition_period = YEAR - reference = + reference = "" adds = ["is_child_dependent"] 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 d65a70c282d..4364346c1b0 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 @@ -1,14 +1,5 @@ from policyengine_us.model_api import * -# - computation: -# - need: earned income, number of children -# - (phase-in-rate.yaml[child] * earned income), max with the max credit[child] -# - phase-out = 0 -# - if single, -# - if earned income > single-threshold, phase_out = (earned income - single-threshold) * phase-out-rate[child] -# - if married, -# - if earned income > married-threshold, phase_out = (earned income - joint-threshold) * phase-out-rate[child] -# - phase in - phase out, min 0 class pr_earned_income_credit(Variable): value_type = float 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 9a5cb253516..b79e6a946d3 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 @@ -18,6 +18,14 @@ def formula(person, period, parameters): ) 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 + age_within_range = (age >= p.eligibility.min) & (age <= p.eligibility.max) + filing_status = person.tax_unit("filing_status", period) + not_separate = filing_status != filing_status.possible_values.SEPARATE + + eligible = head_or_spouse & investment_income_amount_under_limit & age_within_range + # if separate filers are eligible + if p.eligibility.separate_filer: + return eligible + # else, filing status needs to be not equal to separate + else: + return eligible & not_separate From 819afefd4d82137c401a7101097b45d5f8ba7f56 Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Mon, 10 Feb 2025 17:56:24 +0000 Subject: [PATCH 11/19] Added references --- .../earned_income/eligibility/max.yaml | 2 +- .../earned_income/eligibility/min.yaml | 2 +- .../eligibility/separate_filer.yaml | 6 +- .../investment_income/limit.yaml | 4 +- .../investment_income/sources.yaml | 4 +- .../credits/earned_income/max_amount.yaml | 7 +- .../credits/earned_income/phase_in_rate.yaml | 6 +- .../credits/earned_income/phase_out/rate.yaml | 8 +- .../phase_out/threshold/joint.yaml | 8 +- .../phase_out/threshold/single.yaml | 8 +- .../pr_earned_income_credit.yaml | 92 ++++++++----------- .../pr_earned_income_child_count.py | 2 +- .../earned_income/pr_earned_income_credit.py | 21 +++-- .../pr_earned_income_credit_eligible.py | 21 ++++- ..._earned_income_credit_investment_income.py | 2 +- 15 files changed, 89 insertions(+), 104 deletions(-) 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 565d5494997..0253e4533b4 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,4 +1,4 @@ -description: Puerto Rico limits the Earned Income Tax Credit to filers of this age or below. +description: Puerto Rico limits the Earned Income Tax Credit to filers of this age or below. values: 2023-01-01: 65 metadata: 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 e6206c3fd9d..44a0a33feac 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 @@ -4,7 +4,7 @@ values: metadata: unit: year period: year - label: Puerto Rico earned income Credit minimum age + 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 \ 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 index 476197275f6..a50b44083c8 100644 --- 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 @@ -1,9 +1,9 @@ -description: Puerto Rico makes married filing separate filers eligible for the EITC when this is true. +description: Puerto Rico allows 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: + - 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/investment_income/limit.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/investment_income/limit.yaml index c0fbc802bdb..55bf4afb510 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 @@ -9,5 +9,5 @@ metadata: reference: - title: P.R. Laws tit. 13, § 30211 (e) href: 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 - - title: P.R. Anejo CT Individuo - href: https://hacienda.pr.gov/sites/default/files/anejo_ct_rev._15_may_23_informativo_-_instrucciones.pdf \ No newline at end of file + - 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=4 \ No newline at end of file diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/investment_income/sources.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/investment_income/sources.yaml index dd399314290..c313178d0e8 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/investment_income/sources.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/investment_income/sources.yaml @@ -13,5 +13,5 @@ metadata: reference: - title: P.R. Laws tit. 13, § 30211 (e) href: 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 - - title: P.R. Anejo CT Individuo - href: https://hacienda.pr.gov/sites/default/files/anejo_ct_rev._15_may_23_informativo_-_instrucciones.pdf \ No newline at end of file + - 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=4 \ No newline at end of file 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 bbe0c579f77..812100971fb 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,4 +1,4 @@ -description: Puerto Rico provides this maximum earned income credit. +description: Puerto Rico provides the following maximum amount of earned income credit. brackets: - threshold: 2023-01-01: 0 @@ -16,7 +16,6 @@ brackets: 2023-01-01: 3 amount: 2023-01-01: 7_173 - metadata: threshold_unit: child amount_unit: currency-USD @@ -25,5 +24,5 @@ metadata: reference: - title: P.R. Laws tit. 13, § 30211 (1)-(6) href: 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 - - title: P.R. Anejo CT Individuo - href: https://hacienda.pr.gov/sites/default/files/anejo_ct_rev._15_may_23_informativo_-_instrucciones.pdf \ No newline at end of file + - 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=2 \ No newline at end of file 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 724eb94086b..0243b07dc29 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 @@ -24,7 +24,5 @@ metadata: label: Puerto Rico earned income credit phase in rate period: year reference: - - title: P.R. Laws tit. 13, § 30211 (1)-(6) - href: 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 - - title: P.R. Anejo CT Individuo - href: https://hacienda.pr.gov/sites/default/files/anejo_ct_rev._15_may_23_informativo_-_instrucciones.pdf \ No newline at end of file + - 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=2 \ No newline at end of file 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 58abe342737..bfaa9620f40 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,4 +1,4 @@ -description: +description: Puerto Rico phases the earned income credit out at this rate of state gross income based on the filer's number of dependents. # determine phase-out rate based on number of children brackets: - threshold: @@ -24,7 +24,5 @@ metadata: label: Puerto Rico earned income credit phase out rate period: year reference: - - title: P.R. Laws tit. 13, § 30211 (1)-(6) - href: 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 - - title: P.R. Anejo CT Individuo - href: https://hacienda.pr.gov/sites/default/files/anejo_ct_rev._15_may_23_informativo_-_instrucciones.pdf \ No newline at end of file + - 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=2 \ No newline at end of file diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/joint.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/joint.yaml index 12df918f5e5..e2e2e3136f0 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/joint.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/joint.yaml @@ -21,10 +21,8 @@ metadata: rate_unit: currency-USD threshold_unit: child type_marginal: marginal_rate - label: Puerto Rico earned income credit phase out rate + label: Puerto Rico earned income credit phase out threshold period: year reference: - - title: P.R. Laws tit. 13, § 30211 (1)-(6) - href: 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 - - title: P.R. Anejo CT Individuo - href: https://hacienda.pr.gov/sites/default/files/anejo_ct_rev._15_may_23_informativo_-_instrucciones.pdf \ No newline at end of file + - 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=2 \ No newline at end of file diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/single.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/single.yaml index d2526c42c08..ec15dedc34c 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/single.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/single.yaml @@ -21,10 +21,8 @@ metadata: rate_unit: currency-USD threshold_unit: child type_marginal: marginal_rate - label: Puerto Rico earned income credit phase out rate + label: Puerto Rico earned income credit phase out threshold period: year reference: - - title: P.R. Laws tit. 13, § 30211 (1)-(6) - href: 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 - - title: P.R. Anejo CT Individuo - href: https://hacienda.pr.gov/sites/default/files/anejo_ct_rev._15_may_23_informativo_-_instrucciones.pdf \ No newline at end of file + - 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=2 \ No newline at end of file diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.yaml index afaf0c4194b..55940733327 100644 --- a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.yaml @@ -1,12 +1,12 @@ -- name: Not eligible person, 2024 - period: 2024 - input: - pr_earned_income_child_count: 2 - filing_status: SINGLE - pr_gross_income_person: 10_000 - pr_earned_income_credit_eligible: false - output: - pr_earned_income_credit: 0 +# - name: Not eligible person, 2024 +# period: 2024 +# input: +# pr_earned_income_child_count: 2 +# filing_status: SINGLE +# pr_gross_income_person: 10_000 +# pr_earned_income_credit_eligible: false +# output: +# pr_earned_income_credit: 0 - name: Eligible person, 0 children with max credit period: 2024 @@ -18,52 +18,32 @@ output: pr_earned_income_credit: 1_656 -- name: Eligible person, 1 child and higher bracket - period: 2024 - input: - pr_earned_income_child_count: 1 - filing_status: SINGLE - pr_gross_income_person: 25_000 - pr_earned_income_credit_eligible: true - output: - pr_earned_income_credit: 2_483.004 +# - name: Eligible person, 1 child and higher bracket +# period: 2024 +# input: +# pr_earned_income_child_count: 1 +# filing_status: SINGLE +# pr_gross_income_person: 25_000 +# pr_earned_income_credit_eligible: true +# output: +# pr_earned_income_credit: 2_483.004 -- name: Eligible person in the highest bracket, 2024 - period: 2024 - input: - pr_gross_income_person: 35_000 - pr_earned_income_credit_eligible: true - output: - pr_earned_income_credit: 100 +# - name: Eligible person, 0 child and filing jointly +# period: 2024 +# input: +# pr_earned_income_child_count: 0 +# filing_status: JOINT +# pr_gross_income_person: 19_870 +# pr_earned_income_credit_eligible: true +# output: +# pr_earned_income_credit: 1_656 -- name: Eligible person in the middle bracket, 2024 - period: 2024 - input: - pr_gross_income_person: 34_000 - pr_earned_income_credit_eligible: true - output: - pr_earned_income_credit: 120 - -- name: Eligible person with max credit, 2024 - period: 2024 - input: - pr_gross_income_person: 10_000 - pr_earned_income_credit_eligible: true - output: - pr_earned_income_credit: 600 - -- name: Eligible person in the lower bracket, 2024 - period: 2024 - input: - pr_gross_income_person: 8_000 - pr_earned_income_credit_eligible: true - output: - pr_earned_income_credit: 480 - -- name: Eligible person in the lower bracket, 2011 - period: 2011 - input: - pr_gross_income_person: 8_000 - pr_earned_income_credit_eligible: true - output: - pr_earned_income_credit: 280 \ No newline at end of file +# - name: Eligible person, 1 child, filing jointly, higher bracket +# period: 2024 +# input: +# pr_earned_income_child_count: 1 +# filing_status: JOINT +# pr_gross_income_person: 25_000 +# pr_earned_income_credit_eligible: true +# output: +# pr_earned_income_credit: 3_670.176 \ No newline at end of file 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 a7a567de0ea..f064fb027bc 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 @@ -6,6 +6,6 @@ class pr_earned_income_child_count(Variable): entity = TaxUnit label = "Puerto Rico EITC-qualifying children" definition_period = YEAR - reference = "" + reference = "https://hacienda.pr.gov/sites/default/files/schedule_ct_rev._jul_5_23_informative_-_instructions.pdf#page=3" adds = ["is_child_dependent"] 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 4364346c1b0..930e50f20a1 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 @@ -3,11 +3,11 @@ class pr_earned_income_credit(Variable): value_type = float - entity = Person - label = "Puerto Rico earned income credit amount" unit = USD + entity = Person + label = "Puerto Rico earned income credit" definition_period = YEAR - 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" + reference = "https://hacienda.pr.gov/sites/default/files/schedule_ct_rev._jul_5_23_informative_-_instructions.pdf#page=2" defined_for = "pr_earned_income_credit_eligible" def formula(person, period, parameters): @@ -18,21 +18,24 @@ def formula(person, period, parameters): child_count = person.tax_unit("pr_earned_income_child_count", period) filing_status = person.tax_unit("filing_status", period) gross_income = person("pr_gross_income_person", period) - + print(p.phase_in_rate.calc(child_count)) # compute credit - phase_in = min_(gross_income * p.phase_in_rate.calc(child_count), - p.max_amount.calc(child_count)) + phase_in = min_( + gross_income * p.phase_in_rate.calc(child_count), + p.max_amount.calc(child_count), + ) + print(p.max_amount.calc(child_count)) phase_out = 0 - # CHECK ME: what are the possible filing statuses? + # CHECK ME: what are the possible filing statuses? phase_out_rate = p.phase_out.rate.calc(child_count) if filing_status == filing_status.possible_values.SINGLE: single_threshold = p.phase_out.threshold.single.calc(child_count) if gross_income > single_threshold: phase_out = (gross_income - single_threshold) * phase_out_rate - else: # default to married filing status + else: # default to married filing status married_threshold = p.phase_out.threshold.joint.calc(child_count) if gross_income > married_threshold: phase_out = (gross_income - married_threshold) * phase_out_rate - return max_(0, phase_in - phase_out) \ No newline at end of file + return max_(0, phase_in - phase_out) 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 b79e6a946d3..21cee586a00 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 @@ -6,26 +6,37 @@ class pr_earned_income_credit_eligible(Variable): entity = Person label = "Puerto Rico earned income credit eligibility" definition_period = YEAR - 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" + reference = "https://hacienda.pr.gov/sites/default/files/schedule_ct_rev._jul_5_23_informative_-_instructions.pdf#page=1" def formula(person, period, parameters): p = parameters( period ).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.investment_income.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) + age_within_range = (age >= p.eligibility.min) & ( + age <= p.eligibility.max + ) + filing_status = person.tax_unit("filing_status", period) not_separate = filing_status != filing_status.possible_values.SEPARATE - eligible = head_or_spouse & investment_income_amount_under_limit & age_within_range + eligible = ( + head_or_spouse + & investment_income_amount_under_limit + & age_within_range + ) # if separate filers are eligible if p.eligibility.separate_filer: return eligible - # else, filing status needs to be not equal to separate + # else, filing status can't be filing separate else: return eligible & not_separate diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py index 77a26671b23..c7ca1959e15 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py @@ -3,10 +3,10 @@ class pr_earned_income_credit_investment_income(Variable): value_type = float + unit = USD entity = Person label = "Puerto Rico earned income credit investment income" definition_period = YEAR - unit = USD 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" adds = "gov.territories.pr.tax.income.credits.earned_income.investment_income.sources" From 101e7078124f854288fed32ad99c487ba7d950f0 Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Tue, 11 Feb 2025 20:29:08 +0000 Subject: [PATCH 12/19] Parameter fixes --- .../credits/earned_income/max_amount.yaml | 3 +- .../credits/earned_income/phase_in_rate.yaml | 18 ++-- .../credits/earned_income/phase_out/rate.yaml | 12 +-- .../phase_out/threshold/joint.yaml | 16 ++-- .../phase_out/threshold/single.yaml | 16 ++-- .../pr_earned_income_credit.yaml | 82 +++++++++++-------- .../earned_income/pr_earned_income_credit.py | 4 +- 7 files changed, 80 insertions(+), 71 deletions(-) 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 812100971fb..03df0dcf012 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 @@ -17,8 +17,9 @@ brackets: amount: 2023-01-01: 7_173 metadata: - threshold_unit: child amount_unit: currency-USD + threshold_unit: child + type: single_amount label: Puerto Rico earned income credit max amount period: year reference: 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 0243b07dc29..5e74f2f9b8a 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 @@ -1,26 +1,26 @@ description: Puerto Rico phases the earned income credit in at this rate of state gross income. # determine phase in rate percentage by number of children brackets: - - threshold: + - threshold: 2010-12-31: 0 - rate: + amount: 2010-12-31: 0.15 - threshold: 2010-12-31: 1 - rate: + amount: 2010-12-31: 0.3398 - - threshold: + - threshold: 2010-12-31: 2 - rate: + amount: 2010-12-31: 0.4 - - threshold: + - threshold: 2010-12-31: 3 - rate: + amount: 2010-12-31: 0.4483 metadata: - rate_unit: /1 + amount_unit: /1 threshold_unit: child - type: marginal_rate + type: single_amount 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 bfaa9620f40..7f9576a7192 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 @@ -3,24 +3,24 @@ description: Puerto Rico phases the earned income credit out at this rate of sta brackets: - threshold: 2023-01-01: 0 - rate: + amount: 2023-01-01: 0.15 - threshold: 2023-01-01: 1 - rate: + amount: 2023-01-01: 0.2692 - threshold: 2023-01-01: 2 - rate: + amount: 2023-01-01: 0.3438 - threshold: 2023-01-01: 3 - rate: + amount: 2023-01-01: 0.3421 metadata: - rate_unit: /1 + amount_unit: /1 threshold_unit: child - type_marginal: marginal_rate + type: single_amount label: Puerto Rico earned income credit phase out rate period: year reference: diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/joint.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/joint.yaml index e2e2e3136f0..3b6f46cbeff 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/joint.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/joint.yaml @@ -1,26 +1,26 @@ -description: Puerto Rico phases the earned income credit out at this rate of state gross income. -# determines the threshold for the phase-in rate to be applied based on # of children +description: Puerto Rico phases the earned income credit out at this amount of state gross income. +# determines the threshold for the phase-in amount to be applied based on # of children brackets: - threshold: 2023-01-01: 0 - rate: + amount: 2023-01-01: 19_870 - threshold: 2023-01-01: 1 - rate: + amount: 2023-01-01: 24_280 - threshold: 2023-01-01: 2 - rate: + amount: 2023-01-01: 27_590 - threshold: 2023-01-01: 3 - rate: + amount: 2023-01-01: 27_590 metadata: - rate_unit: currency-USD + amount_unit: currency-USD threshold_unit: child - type_marginal: marginal_rate + type: single_amount label: Puerto Rico earned income credit phase out threshold period: year reference: diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/single.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/single.yaml index ec15dedc34c..f833545d386 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/single.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/single.yaml @@ -1,26 +1,26 @@ -description: Puerto Rico phases the earned income credit out at this rate of state gross income. -# determines the threshold for the phase-in rate to be applied based on # of children +description: Puerto Rico phases the earned income credit out at this amount of state gross income. +# determines the threshold for the phase-in amount to be applied based on # of children brackets: - threshold: 2023-01-01: 0 - rate: + amount: 2023-01-01: 17_660 - threshold: 2023-01-01: 1 - rate: + amount: 2023-01-01: 19_870 - threshold: 2023-01-01: 2 - rate: + amount: 2023-01-01: 23_180 - threshold: 2023-01-01: 3 - rate: + amount: 2023-01-01: 23_180 metadata: - rate_unit: currency-USD + amount_unit: currency-USD threshold_unit: child - type_marginal: marginal_rate + type: single_amount label: Puerto Rico earned income credit phase out threshold period: year reference: diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.yaml index 55940733327..2d5336f8013 100644 --- a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.yaml @@ -1,12 +1,12 @@ -# - name: Not eligible person, 2024 -# period: 2024 -# input: -# pr_earned_income_child_count: 2 -# filing_status: SINGLE -# pr_gross_income_person: 10_000 -# pr_earned_income_credit_eligible: false -# output: -# pr_earned_income_credit: 0 +- name: Not eligible person, 2024 + period: 2024 + input: + pr_earned_income_child_count: 2 + filing_status: SINGLE + pr_gross_income_person: 10_000 + pr_earned_income_credit_eligible: false + output: + pr_earned_income_credit: 0 - name: Eligible person, 0 children with max credit period: 2024 @@ -18,32 +18,42 @@ output: pr_earned_income_credit: 1_656 -# - name: Eligible person, 1 child and higher bracket -# period: 2024 -# input: -# pr_earned_income_child_count: 1 -# filing_status: SINGLE -# pr_gross_income_person: 25_000 -# pr_earned_income_credit_eligible: true -# output: -# pr_earned_income_credit: 2_483.004 +- name: Eligible person, 1 child and higher bracket + period: 2024 + input: + pr_earned_income_child_count: 1 + filing_status: SINGLE + pr_gross_income_person: 25_000 + pr_earned_income_credit_eligible: true + output: + pr_earned_income_credit: 2_483.004 -# - name: Eligible person, 0 child and filing jointly -# period: 2024 -# input: -# pr_earned_income_child_count: 0 -# filing_status: JOINT -# pr_gross_income_person: 19_870 -# pr_earned_income_credit_eligible: true -# output: -# pr_earned_income_credit: 1_656 +- name: Eligible person, 0 child and filing jointly + period: 2024 + input: + pr_earned_income_child_count: 0 + filing_status: JOINT + pr_gross_income_person: 19_870 + pr_earned_income_credit_eligible: true + output: + pr_earned_income_credit: 1_656 + +- name: Eligible person, 1 child, filing jointly, higher bracket + period: 2024 + input: + pr_earned_income_child_count: 1 + filing_status: JOINT + pr_gross_income_person: 25_000 + pr_earned_income_credit_eligible: true + output: + pr_earned_income_credit: 3_670.176 -# - name: Eligible person, 1 child, filing jointly, higher bracket -# period: 2024 -# input: -# pr_earned_income_child_count: 1 -# filing_status: JOINT -# pr_gross_income_person: 25_000 -# pr_earned_income_credit_eligible: true -# output: -# pr_earned_income_credit: 3_670.176 \ No newline at end of file +- name: Eligible person, 5 child, single, higher bracket + period: 2024 + input: + pr_earned_income_child_count: 5 + filing_status: SINGLE + pr_gross_income_person: 50_000 + pr_earned_income_credit_eligible: true + output: + pr_earned_income_credit: 0 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 930e50f20a1..10797dd9e3d 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 @@ -18,16 +18,14 @@ def formula(person, period, parameters): child_count = person.tax_unit("pr_earned_income_child_count", period) filing_status = person.tax_unit("filing_status", period) gross_income = person("pr_gross_income_person", period) - print(p.phase_in_rate.calc(child_count)) + # compute credit phase_in = min_( gross_income * p.phase_in_rate.calc(child_count), p.max_amount.calc(child_count), ) - print(p.max_amount.calc(child_count)) phase_out = 0 - # CHECK ME: what are the possible filing statuses? phase_out_rate = p.phase_out.rate.calc(child_count) if filing_status == filing_status.possible_values.SINGLE: single_threshold = p.phase_out.threshold.single.calc(child_count) From e7e0dc27a868e0443b9e2436ca6592141bc1f25d Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Wed, 12 Feb 2025 17:03:41 +0000 Subject: [PATCH 13/19] Added not eligible for low income if claim EITC --- .../pr_low_income_credit_eligible_person.yaml | 12 ++++++++++++ .../pr_low_income_credit_eligible_person.py | 4 +++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/low_income/pr_low_income_credit_eligible_person.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/low_income/pr_low_income_credit_eligible_person.yaml index 11868cbcc36..b6e0775ca74 100644 --- a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/low_income/pr_low_income_credit_eligible_person.yaml +++ b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/low_income/pr_low_income_credit_eligible_person.yaml @@ -3,6 +3,7 @@ input: age: 65 is_tax_unit_head_or_spouse: true + pr_earned_income_credit: 0 output: pr_low_income_credit_eligible_person: true @@ -11,6 +12,7 @@ input: age: 64 is_tax_unit_head_or_spouse: true + pr_earned_income_credit: 0 output: pr_low_income_credit_eligible_person: false @@ -19,5 +21,15 @@ input: age: 65 is_tax_unit_head_or_spouse: false + pr_earned_income_credit: 0 + output: + pr_low_income_credit_eligible_person: false + +- name: Claimed EITC + period: 2024 + input: + age: 65 + is_tax_unit_head_or_spouse: true + pr_earned_income_credit: 1000 output: pr_low_income_credit_eligible_person: false diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/credits/low_income/pr_low_income_credit_eligible_person.py b/policyengine_us/variables/gov/territories/pr/tax/income/credits/low_income/pr_low_income_credit_eligible_person.py index fe5cf27917f..ebadcc27683 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/credits/low_income/pr_low_income_credit_eligible_person.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/credits/low_income/pr_low_income_credit_eligible_person.py @@ -13,4 +13,6 @@ def formula(person, period, parameters): p = parameters(period).gov.territories.pr.tax.income.credits.low_income head_or_spouse = person("is_tax_unit_head_or_spouse", period) age_eligible = age >= p.age_threshold - return head_or_spouse & age_eligible + # if you claim earned income credit, aren't eligible for low income credit + eitc_not_claimed = person("pr_earned_income_credit", period) <= 0 + return head_or_spouse & age_eligible & eitc_not_claimed From b9067d8a97a38b3802e21cfc2cbfba853bb5a528 Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Mon, 17 Feb 2025 05:32:35 +0000 Subject: [PATCH 14/19] Changed entity, optimized for microsim --- .../earned_income/eligibility/max.yaml | 10 ------- .../credits/earned_income/integration.yaml | 26 ++++++++++++++++++ .../pr_earned_income_credit_eligible.yaml | 10 ------- .../earned_income/pr_earned_income_credit.py | 27 +++++++++---------- .../pr_earned_income_credit_eligible.py | 4 +-- ..._earned_income_credit_investment_income.py | 2 +- 6 files changed, 40 insertions(+), 39 deletions(-) delete mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/eligibility/max.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/integration.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 deleted file mode 100644 index 0253e4533b4..00000000000 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/eligibility/max.yaml +++ /dev/null @@ -1,10 +0,0 @@ -description: Puerto Rico limits the Earned Income Tax Credit to filers of this age or below. -values: - 2023-01-01: 65 -metadata: - unit: year - 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/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/integration.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/integration.yaml new file mode 100644 index 00000000000..ec2e8a10f8f --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/integration.yaml @@ -0,0 +1,26 @@ +- name: integration test 1, a married couple with 2 dependents + period: 2024 + input: + people: + person1: + employment_income: 15_000 + age: 40 + person2: + employment_income: 10_000 + age: 44 + person3: + employment_income: 0 + age: 5 + person4: + employment_income: 0 + age: 10 + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: PR + output: + pr_earned_income_credit_eligible: true + pr_earned_income_credit: 6_072 \ No newline at end of file diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml index d59ec32a9ed..55ed648817c 100644 --- a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml @@ -28,16 +28,6 @@ output: pr_earned_income_credit_eligible: false -- name: Over the age limit - period: 2024 - input: - is_tax_unit_head_or_spouse: true - pr_earned_income_credit_investment_income: 2_000 - age: 66 - filing_status: JOINT - output: - pr_earned_income_credit_eligible: false - - name: Investment income over the limit period: 2024 input: 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 10797dd9e3d..ceafd9136bc 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 @@ -4,36 +4,33 @@ class pr_earned_income_credit(Variable): value_type = float unit = USD - entity = Person + entity = TaxUnit label = "Puerto Rico earned income credit" definition_period = YEAR reference = "https://hacienda.pr.gov/sites/default/files/schedule_ct_rev._jul_5_23_informative_-_instructions.pdf#page=2" defined_for = "pr_earned_income_credit_eligible" - def formula(person, period, parameters): + def formula(tax_unit, period, parameters): p = parameters( period ).gov.territories.pr.tax.income.credits.earned_income - child_count = person.tax_unit("pr_earned_income_child_count", period) - filing_status = person.tax_unit("filing_status", period) - gross_income = person("pr_gross_income_person", period) + child_count = tax_unit("pr_earned_income_child_count", period) + filing_status = tax_unit("filing_status", period) + gross_income = tax_unit("pr_gross_income", period) # compute credit phase_in = min_( gross_income * p.phase_in_rate.calc(child_count), p.max_amount.calc(child_count), ) - phase_out = 0 phase_out_rate = p.phase_out.rate.calc(child_count) - if filing_status == filing_status.possible_values.SINGLE: - single_threshold = p.phase_out.threshold.single.calc(child_count) - if gross_income > single_threshold: - phase_out = (gross_income - single_threshold) * phase_out_rate - else: # default to married filing status - married_threshold = p.phase_out.threshold.joint.calc(child_count) - if gross_income > married_threshold: - phase_out = (gross_income - married_threshold) * phase_out_rate - + phase_out_threshold = select( + [filing_status == filing_status.possible_values.SINGLE, filing_status == filing_status.possible_values.JOINT], + [p.phase_out.threshold.single.calc(child_count), p.phase_out.threshold.joint.calc(child_count)], + ) + # could be negative if gross income not over threshold, so make the minimum value 0 + phase_out = max_(0, (gross_income - phase_out_threshold) * phase_out_rate) + # minimum value 0 in case person isn't eligible for any amount of credit return max_(0, phase_in - phase_out) 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 21cee586a00..1dfdc387533 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 @@ -22,9 +22,7 @@ def formula(person, period, parameters): ) age = person("age", period) - age_within_range = (age >= p.eligibility.min) & ( - age <= p.eligibility.max - ) + age_within_range = (age >= p.eligibility.min) filing_status = person.tax_unit("filing_status", period) not_separate = filing_status != filing_status.possible_values.SEPARATE diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py index c7ca1959e15..a77708df4a4 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py @@ -4,7 +4,7 @@ class pr_earned_income_credit_investment_income(Variable): value_type = float unit = USD - entity = Person + entity = TaxUnit label = "Puerto Rico earned income credit investment income" definition_period = YEAR 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" From 4209fe0c2fd0a9d29610f06b3a036b9cefd557a0 Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Wed, 19 Feb 2025 23:33:48 +0000 Subject: [PATCH 15/19] Changed entity to taxunit --- .../credits/earned_income/integration.yaml | 14 ++++-- .../pr_earned_income_credit_eligible.yaml | 44 ++--------------- ..._earned_income_credit_eligible_person.yaml | 49 +++++++++++++++++++ .../earned_income/pr_earned_income_credit.py | 19 +++++-- .../pr_earned_income_credit_eligible.py | 40 ++++----------- ...pr_earned_income_credit_eligible_people.py | 11 +++++ ...pr_earned_income_credit_eligible_person.py | 40 +++++++++++++++ ..._earned_income_credit_investment_income.py | 2 +- 8 files changed, 138 insertions(+), 81 deletions(-) create mode 100644 policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible_person.yaml create mode 100644 policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible_people.py create mode 100644 policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible_person.py diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/integration.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/integration.yaml index ec2e8a10f8f..56dc838d157 100644 --- a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/integration.yaml @@ -3,24 +3,28 @@ input: people: person1: - employment_income: 15_000 + pr_gross_income_person: 15_000 age: 40 + is_tax_unit_head_or_spouse: true person2: - employment_income: 10_000 + pr_gross_income_person: 10_000 age: 44 + is_tax_unit_head_or_spouse: true person3: - employment_income: 0 + pr_gross_income_person: 0 age: 5 person4: - employment_income: 0 - age: 10 + pr_gross_income_person: 1_000 + age: 15 tax_units: tax_unit: members: [person1, person2, person3, person4] + filing_status: JOINT households: household: members: [person1, person2, person3, person4] state_code: PR output: + pr_earned_income_credit_eligible_people: 2 pr_earned_income_credit_eligible: true pr_earned_income_credit: 6_072 \ No newline at end of file diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml index 55ed648817c..9f7bee7e10d 100644 --- a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml @@ -1,49 +1,13 @@ -- name: Dependent +- name: No eligible people period: 2024 input: - is_tax_unit_head_or_spouse: false - pr_earned_income_credit_investment_income: 2_000 - age: 25 - filing_status: JOINT + pr_earned_income_credit_eligible_people: 0 output: pr_earned_income_credit_eligible: false -- name: Filing separately +- name: Eligible people exist period: 2024 input: - is_tax_unit_head_or_spouse: true - pr_earned_income_credit_investment_income: 3_000 - age: 30 - filing_status: SEPARATE - output: - pr_earned_income_credit_eligible: false - -- name: Under the age limit - period: 2024 - input: - is_tax_unit_head_or_spouse: true - pr_earned_income_credit_investment_income: 2_000 - age: 18 - filing_status: JOINT - output: - pr_earned_income_credit_eligible: false - -- name: Investment income over the limit - period: 2024 - input: - is_tax_unit_head_or_spouse: true - pr_earned_income_credit_investment_income: 10_001 - age: 60 - filing_status: SINGLE - output: - pr_earned_income_credit_eligible: false - -- name: Eligible person - period: 2024 - input: - is_tax_unit_head_or_spouse: true - pr_earned_income_credit_investment_income: 10_000 - age: 65 - filing_status: SINGLE + pr_earned_income_credit_eligible_people: 1 output: pr_earned_income_credit_eligible: true \ No newline at end of file diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible_person.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible_person.yaml new file mode 100644 index 00000000000..7e29590fc07 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible_person.yaml @@ -0,0 +1,49 @@ +- name: Dependent + period: 2024 + input: + is_tax_unit_head_or_spouse: false + pr_earned_income_credit_investment_income: 2_000 + age: 25 + filing_status: JOINT + output: + pr_earned_income_credit_eligible_person: false + +- name: Filing separately + period: 2024 + input: + is_tax_unit_head_or_spouse: true + pr_earned_income_credit_investment_income: 3_000 + age: 30 + filing_status: SEPARATE + output: + pr_earned_income_credit_eligible_person: false + +- name: Under the age limit + period: 2024 + input: + is_tax_unit_head_or_spouse: true + pr_earned_income_credit_investment_income: 2_000 + age: 18 + filing_status: JOINT + output: + pr_earned_income_credit_eligible_person: false + +- name: Investment income over the limit + period: 2024 + input: + is_tax_unit_head_or_spouse: true + pr_earned_income_credit_investment_income: 10_001 + age: 60 + filing_status: SINGLE + output: + pr_earned_income_credit_eligible_person: false + +- name: Eligible person + period: 2024 + input: + is_tax_unit_head_or_spouse: true + pr_earned_income_credit_investment_income: 10_000 + age: 65 + filing_status: SINGLE + output: + pr_earned_income_credit_eligible_person: true \ No newline at end of file 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 ceafd9136bc..670fe9481a5 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 @@ -17,7 +17,10 @@ def formula(tax_unit, period, parameters): child_count = tax_unit("pr_earned_income_child_count", period) filing_status = tax_unit("filing_status", period) - gross_income = tax_unit("pr_gross_income", period) + gross_income = tax_unit.sum( + tax_unit.members("pr_gross_income_person", period) + * (tax_unit.members("is_tax_unit_head_or_spouse", period)) + ) # compute credit phase_in = min_( @@ -27,10 +30,18 @@ def formula(tax_unit, period, parameters): phase_out_rate = p.phase_out.rate.calc(child_count) phase_out_threshold = select( - [filing_status == filing_status.possible_values.SINGLE, filing_status == filing_status.possible_values.JOINT], - [p.phase_out.threshold.single.calc(child_count), p.phase_out.threshold.joint.calc(child_count)], + [ + filing_status == filing_status.possible_values.SINGLE, + filing_status == filing_status.possible_values.JOINT, + ], + [ + p.phase_out.threshold.single.calc(child_count), + p.phase_out.threshold.joint.calc(child_count), + ], ) # could be negative if gross income not over threshold, so make the minimum value 0 - phase_out = max_(0, (gross_income - phase_out_threshold) * phase_out_rate) + phase_out = max_( + 0, (gross_income - phase_out_threshold) * phase_out_rate + ) # minimum value 0 in case person isn't eligible for any amount of credit return max_(0, phase_in - phase_out) 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 1dfdc387533..eabf297223f 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 @@ -3,38 +3,16 @@ class pr_earned_income_credit_eligible(Variable): value_type = bool - entity = Person - label = "Puerto Rico earned income credit eligibility" + entity = TaxUnit + label = "Puerto Rico earned income credit eligible unit" definition_period = YEAR reference = "https://hacienda.pr.gov/sites/default/files/schedule_ct_rev._jul_5_23_informative_-_instructions.pdf#page=1" + defined_for = "pr_earned_income_credit_eligible_people" - def formula(person, period, parameters): - p = parameters( - period - ).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.investment_income.limit - ) - - age = person("age", period) - age_within_range = (age >= p.eligibility.min) - - filing_status = person.tax_unit("filing_status", period) - not_separate = filing_status != filing_status.possible_values.SEPARATE - - eligible = ( - head_or_spouse - & investment_income_amount_under_limit - & age_within_range + def formula(tax_unit, period, parameters): + # list of eligible people in the tax unit from the adds function + num_eligible_people = tax_unit( + "pr_earned_income_credit_eligible_people", period ) - # if separate filers are eligible - if p.eligibility.separate_filer: - return eligible - # else, filing status can't be filing separate - else: - return eligible & not_separate + eligible_people_exist = num_eligible_people > 0 + return eligible_people_exist diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible_people.py b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible_people.py new file mode 100644 index 00000000000..6bc7be8c62b --- /dev/null +++ b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible_people.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class pr_earned_income_credit_eligible_people(Variable): + value_type = int + entity = TaxUnit + label = "Puerto Rico earned income credit eligible people" + definition_period = YEAR + reference = "https://hacienda.pr.gov/sites/default/files/schedule_ct_rev._jul_5_23_informative_-_instructions.pdf#page=1" + + adds = ["pr_earned_income_credit_eligible_person"] diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible_person.py b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible_person.py new file mode 100644 index 00000000000..042d2b0c454 --- /dev/null +++ b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible_person.py @@ -0,0 +1,40 @@ +from policyengine_us.model_api import * + + +class pr_earned_income_credit_eligible_person(Variable): + value_type = bool + entity = Person + label = "Puerto Rico earned income credit eligible person" + definition_period = YEAR + reference = "https://hacienda.pr.gov/sites/default/files/schedule_ct_rev._jul_5_23_informative_-_instructions.pdf#page=1" + + def formula(person, period, parameters): + p = parameters( + period + ).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.investment_income.limit + ) + + age = person("age", period) + age_within_range = age >= p.eligibility.min + + filing_status = person.tax_unit("filing_status", period) + not_separate = filing_status != filing_status.possible_values.SEPARATE + + eligible = ( + head_or_spouse + & investment_income_amount_under_limit + & age_within_range + ) + # if separate filers are eligible + if p.eligibility.separate_filer: + return eligible + # else, filing status can't be filing separate + else: + return eligible & not_separate diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py index a77708df4a4..c7ca1959e15 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_investment_income.py @@ -4,7 +4,7 @@ class pr_earned_income_credit_investment_income(Variable): value_type = float unit = USD - entity = TaxUnit + entity = Person label = "Puerto Rico earned income credit investment income" definition_period = YEAR 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" From c6bff43c9b27b0a236a35bd44305d5be61ad4e20 Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Mon, 24 Feb 2025 23:18:13 +0000 Subject: [PATCH 16/19] Low income credit fix with EITC --- .../credits/low_income/pr_low_income_credit_eligible_person.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/credits/low_income/pr_low_income_credit_eligible_person.py b/policyengine_us/variables/gov/territories/pr/tax/income/credits/low_income/pr_low_income_credit_eligible_person.py index ebadcc27683..9aab4ba08af 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/credits/low_income/pr_low_income_credit_eligible_person.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/credits/low_income/pr_low_income_credit_eligible_person.py @@ -14,5 +14,5 @@ def formula(person, period, parameters): head_or_spouse = person("is_tax_unit_head_or_spouse", period) age_eligible = age >= p.age_threshold # if you claim earned income credit, aren't eligible for low income credit - eitc_not_claimed = person("pr_earned_income_credit", period) <= 0 + eitc_not_claimed = person.tax_unit("pr_earned_income_credit", period) <= 0 return head_or_spouse & age_eligible & eitc_not_claimed From 8db5e3f74322429cf501b2bf3f9e45902fc456fb Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Mon, 24 Feb 2025 23:20:56 +0000 Subject: [PATCH 17/19] Fixes EITC --- .../low_income/pr_low_income_credit_eligible_person.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/credits/low_income/pr_low_income_credit_eligible_person.py b/policyengine_us/variables/gov/territories/pr/tax/income/credits/low_income/pr_low_income_credit_eligible_person.py index 9aab4ba08af..ad112e28fc2 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/credits/low_income/pr_low_income_credit_eligible_person.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/credits/low_income/pr_low_income_credit_eligible_person.py @@ -14,5 +14,7 @@ def formula(person, period, parameters): head_or_spouse = person("is_tax_unit_head_or_spouse", period) age_eligible = age >= p.age_threshold # if you claim earned income credit, aren't eligible for low income credit - eitc_not_claimed = person.tax_unit("pr_earned_income_credit", period) <= 0 + eitc_not_claimed = ( + person.tax_unit("pr_earned_income_credit", period) <= 0 + ) return head_or_spouse & age_eligible & eitc_not_claimed From a055be59bdffd781ee4004130ec1f6f076795aa2 Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Thu, 27 Feb 2025 02:51:13 +0000 Subject: [PATCH 18/19] Small fixes --- .../earned_income/eligibility/min.yaml | 4 ++- .../eligibility/separate_filer.yaml | 2 ++ .../investment_income/sources.yaml | 2 +- .../credits/earned_income/phase_in_rate.yaml | 20 ++++++----- .../credits/earned_income/phase_out/rate.yaml | 4 ++- .../phase_out/threshold/joint.yaml | 6 ++-- .../phase_out/threshold/single.yaml | 6 ++-- .../pr/tax/income/credits/refundable.yaml | 3 ++ .../credits/earned_income/integration.yaml | 35 ++++++++++++++++++- .../earned_income/pr_earned_income_credit.py | 5 +-- .../pr_earned_income_credit_eligible.py | 7 ++-- ...pr_earned_income_credit_eligible_people.py | 11 ------ 12 files changed, 71 insertions(+), 34 deletions(-) delete mode 100644 policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible_people.py 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 44a0a33feac..f1bd2f5e0c1 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 @@ -7,4 +7,6 @@ metadata: 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 \ No newline at end of file + href: https://hacienda.pr.gov/sites/default/files/schedule_ct_rev._jul_5_23_informative_-_instructions.pdf#page=1 + - title: P.R. Laws tit. 13, § 30211 + href: 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 \ 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 index a50b44083c8..542eb6699ba 100644 --- 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 @@ -7,3 +7,5 @@ metadata: 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 + - title: P.R. Laws tit. 13, § 30211 + href: 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 diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/investment_income/sources.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/investment_income/sources.yaml index c313178d0e8..cb0d2aed297 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/investment_income/sources.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/investment_income/sources.yaml @@ -1,6 +1,6 @@ description: Puerto Rico accounts for the following investment income sources, under the earned income tax credit. values: - 2010-12-31: + 2023-01-01: - interest_income - dividend_income - rental_income 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 5e74f2f9b8a..e863009976d 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 @@ -2,21 +2,21 @@ description: Puerto Rico phases the earned income credit in at this rate of stat # determine phase in rate percentage by number of children brackets: - threshold: - 2010-12-31: 0 + 2023-01-01: 0 amount: - 2010-12-31: 0.15 + 2023-01-01: 0.15 - threshold: - 2010-12-31: 1 + 2023-01-01: 1 amount: - 2010-12-31: 0.3398 + 2023-01-01: 0.3398 - threshold: - 2010-12-31: 2 + 2023-01-01: 2 amount: - 2010-12-31: 0.4 + 2023-01-01: 0.4 - threshold: - 2010-12-31: 3 + 2023-01-01: 3 amount: - 2010-12-31: 0.4483 + 2023-01-01: 0.4483 metadata: amount_unit: /1 threshold_unit: child @@ -25,4 +25,6 @@ metadata: period: year 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=2 \ No newline at end of file + href: https://hacienda.pr.gov/sites/default/files/schedule_ct_rev._jul_5_23_informative_-_instructions.pdf#page=2 + - title: P.R. Laws tit. 13, § 30211 (1) - (6) + href: 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 \ No newline at end of file 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 7f9576a7192..a4cfc264ab9 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 @@ -25,4 +25,6 @@ metadata: period: year 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=2 \ No newline at end of file + href: https://hacienda.pr.gov/sites/default/files/schedule_ct_rev._jul_5_23_informative_-_instructions.pdf#page=2 + - title: P.R. Laws tit. 13, § 30211 (1) - (6) + href: 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 \ No newline at end of file diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/joint.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/joint.yaml index 3b6f46cbeff..7b836b6076d 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/joint.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/joint.yaml @@ -1,4 +1,4 @@ -description: Puerto Rico phases the earned income credit out at this amount of state gross income. +description: Puerto Rico phases the earned income credit out above this threshold of state gross income. # determines the threshold for the phase-in amount to be applied based on # of children brackets: - threshold: @@ -25,4 +25,6 @@ metadata: period: year 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=2 \ No newline at end of file + href: https://hacienda.pr.gov/sites/default/files/schedule_ct_rev._jul_5_23_informative_-_instructions.pdf#page=2 + - title: P.R. Laws tit. 13, § 30211 (1) - (6) + href: 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 \ No newline at end of file diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/single.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/single.yaml index f833545d386..18340045fb7 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/single.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/earned_income/phase_out/threshold/single.yaml @@ -1,4 +1,4 @@ -description: Puerto Rico phases the earned income credit out at this amount of state gross income. +description: Puerto Rico phases the earned income credit above this threshold of state gross income. # determines the threshold for the phase-in amount to be applied based on # of children brackets: - threshold: @@ -25,4 +25,6 @@ metadata: period: year 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=2 \ No newline at end of file + href: https://hacienda.pr.gov/sites/default/files/schedule_ct_rev._jul_5_23_informative_-_instructions.pdf#page=2 + - title: P.R. Laws tit. 13, § 30211 (1) - (6) + href: 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 \ No newline at end of file diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/refundable.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/refundable.yaml index 029bcb1181d..7b6c50380e4 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/credits/refundable.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/credits/refundable.yaml @@ -12,4 +12,7 @@ values: 2021-01-01: - pr_low_income_credit - pr_compensatory_low_income_credit + 2023-01-01: + - pr_low_income_credit + - pr_compensatory_low_income_credit - pr_earned_income_credit diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/integration.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/integration.yaml index 56dc838d157..60b2bace357 100644 --- a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/integration.yaml @@ -27,4 +27,37 @@ output: pr_earned_income_credit_eligible_people: 2 pr_earned_income_credit_eligible: true - pr_earned_income_credit: 6_072 \ No newline at end of file + pr_earned_income_credit: 6_072 + +- name: integration test 2, individual with 4 dependents + period: 2024 + input: + people: + person1: + pr_gross_income_person: 30_000 + age: 35 + is_tax_unit_head_or_spouse: true + person2: + pr_gross_income_person: 500 + age: 5 + person3: + pr_gross_income_person: 0 + age: 15 + person4: + pr_gross_income_person: 0 + age: 2 + person5: + pr_gross_income_person: 0 + age: 11 + tax_units: + tax_unit: + members: [person1, person2, person3, person4, person5] + filing_status: SINGLE + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: PR + output: + pr_earned_income_credit_eligible_people: 1 + pr_earned_income_credit_eligible: true + pr_earned_income_credit: 4_839.878 \ No newline at end of file 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 670fe9481a5..f81a1b197f9 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 @@ -17,9 +17,10 @@ def formula(tax_unit, period, parameters): child_count = tax_unit("pr_earned_income_child_count", period) filing_status = tax_unit("filing_status", period) + person = tax_unit.members gross_income = tax_unit.sum( - tax_unit.members("pr_gross_income_person", period) - * (tax_unit.members("is_tax_unit_head_or_spouse", period)) + person("pr_gross_income_person", period) + * (person("is_tax_unit_head_or_spouse", period)) ) # compute credit 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 eabf297223f..6bfab255774 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 @@ -11,8 +11,7 @@ class pr_earned_income_credit_eligible(Variable): def formula(tax_unit, period, parameters): # list of eligible people in the tax unit from the adds function - num_eligible_people = tax_unit( - "pr_earned_income_credit_eligible_people", period + num_eligible_people = add( + tax_unit, period, ["pr_earned_income_credit_eligible_person"] ) - eligible_people_exist = num_eligible_people > 0 - return eligible_people_exist + return num_eligible_people > 0 diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible_people.py b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible_people.py deleted file mode 100644 index 6bc7be8c62b..00000000000 --- a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible_people.py +++ /dev/null @@ -1,11 +0,0 @@ -from policyengine_us.model_api import * - - -class pr_earned_income_credit_eligible_people(Variable): - value_type = int - entity = TaxUnit - label = "Puerto Rico earned income credit eligible people" - definition_period = YEAR - reference = "https://hacienda.pr.gov/sites/default/files/schedule_ct_rev._jul_5_23_informative_-_instructions.pdf#page=1" - - adds = ["pr_earned_income_credit_eligible_person"] From 8831fb656b927f7730f5d34a9c373c3f7302ef9d Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Thu, 27 Feb 2025 03:25:43 +0000 Subject: [PATCH 19/19] Small fix for tests --- .../income/credits/earned_income/integration.yaml | 2 -- .../pr_earned_income_credit_eligible.yaml | 13 ------------- .../pr_earned_income_credit_eligible.py | 1 - 3 files changed, 16 deletions(-) delete mode 100644 policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/integration.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/integration.yaml index 60b2bace357..2da1520d913 100644 --- a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/integration.yaml @@ -25,7 +25,6 @@ members: [person1, person2, person3, person4] state_code: PR output: - pr_earned_income_credit_eligible_people: 2 pr_earned_income_credit_eligible: true pr_earned_income_credit: 6_072 @@ -58,6 +57,5 @@ members: [person1, person2, person3, person4, person5] state_code: PR output: - pr_earned_income_credit_eligible_people: 1 pr_earned_income_credit_eligible: true pr_earned_income_credit: 4_839.878 \ No newline at end of file diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml deleted file mode 100644 index 9f7bee7e10d..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit_eligible.yaml +++ /dev/null @@ -1,13 +0,0 @@ -- name: No eligible people - period: 2024 - input: - pr_earned_income_credit_eligible_people: 0 - output: - pr_earned_income_credit_eligible: false - -- name: Eligible people exist - period: 2024 - input: - pr_earned_income_credit_eligible_people: 1 - output: - pr_earned_income_credit_eligible: true \ 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 6bfab255774..53147cf76b5 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 @@ -7,7 +7,6 @@ class pr_earned_income_credit_eligible(Variable): label = "Puerto Rico earned income credit eligible unit" definition_period = YEAR reference = "https://hacienda.pr.gov/sites/default/files/schedule_ct_rev._jul_5_23_informative_-_instructions.pdf#page=1" - defined_for = "pr_earned_income_credit_eligible_people" def formula(tax_unit, period, parameters): # list of eligible people in the tax unit from the adds function