From 5457ce30716838f87c9c7c9f2527f194ee450162 Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Fri, 3 Oct 2025 23:29:57 +0000 Subject: [PATCH 1/6] Gradual adjustment calculation and tests --- .../adjustment_limit_basis.yaml | 13 +++++++++ .../gradual_adjustment/exemption_rate.yaml | 13 +++++++++ .../tax/income/gradual_adjustment/rate.yaml | 12 ++++++++ .../income/gradual_adjustment/threshold.yaml | 13 +++++++++ .../pr_gradual_adjustment_amount.yaml | 29 +++++++++++++++++++ .../pr_gradual_adjustment_eligibility.yaml | 15 ++++++++++ .../pr_gradual_adjustment_amount.py | 25 ++++++++++++++++ .../pr_gradual_adjustment_eligibility.py | 21 ++++++++++++++ .../exemptions/pr_exemptions.py | 12 ++++++++ .../taxable_income/pr_net_taxable_income.py | 10 +++++++ 10 files changed, 163 insertions(+) create mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/gradual_adjustment/adjustment_limit_basis.yaml create mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/gradual_adjustment/exemption_rate.yaml create mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/gradual_adjustment/rate.yaml create mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/gradual_adjustment/threshold.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_amount.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_eligibility.yaml create mode 100644 policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_amount.py create mode 100644 policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_eligibility.py create mode 100644 policyengine_us/variables/gov/territories/pr/tax/income/taxable_income/exemptions/pr_exemptions.py create mode 100644 policyengine_us/variables/gov/territories/pr/tax/income/taxable_income/pr_net_taxable_income.py diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/gradual_adjustment/adjustment_limit_basis.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/gradual_adjustment/adjustment_limit_basis.yaml new file mode 100644 index 00000000000..979799ffe85 --- /dev/null +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/gradual_adjustment/adjustment_limit_basis.yaml @@ -0,0 +1,13 @@ +description: Puerto Rico provides the following basis amount for the gradual adjustment limit. +values: + 2024-01-01: 8_895 +metadata: + unit: currency-USD + period: year + label: Puerto Rico gradual adjustment limit basis + # discrepancy between legal form and tax form for the basis amount + reference: + - title: Gov. of Puerto Rico Form 482.0 2024 + href: https://hacienda.pr.gov/sites/default/files/individuals_2024_rev._jul_12_24_9-30-24_informative.pdf#page=52 + - title: P.R. Laws tit. 13, § 30061 (b)(5)(c) + href: https://law.justia.com/codes/puerto-rico/title-thirteen/subtitle-17/part-ii/chapter-1004/subchapter-a/30061/ diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/gradual_adjustment/exemption_rate.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/gradual_adjustment/exemption_rate.yaml new file mode 100644 index 00000000000..0097044cdac --- /dev/null +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/gradual_adjustment/exemption_rate.yaml @@ -0,0 +1,13 @@ +description: Puerto Rico provides the following rate to reduce the total exemptions when calculating the gradual adjustment limit. +values: + 2024-01-01: 0.33 +metadata: + unit: /1 + period: year + label: Puerto Rico gradual adjustment rate for exemptions + # discrepancy between legal form and tax form for the exemptions rate + reference: + - title: Gov. of Puerto Rico Form 482.0 2024 + href: https://hacienda.pr.gov/sites/default/files/individuals_2024_rev._jul_12_24_9-30-24_informative.pdf#page=52 + - title: P.R. Laws tit. 13, § 30061 (b)(5)(c) + href: https://law.justia.com/codes/puerto-rico/title-thirteen/subtitle-17/part-ii/chapter-1004/subchapter-a/30061/ diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/gradual_adjustment/rate.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/gradual_adjustment/rate.yaml new file mode 100644 index 00000000000..341ea585ad2 --- /dev/null +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/gradual_adjustment/rate.yaml @@ -0,0 +1,12 @@ +description: Puerto Rico provides the following rate to reduce the taxable net income when calculating gradual adjustment. +values: + 2024-01-01: 0.05 +metadata: + unit: /1 + period: year + label: Puerto Rico gradual adjustment rate for taxable net income + reference: + - title: Gov. of Puerto Rico Form 482.0 2024 + href: https://hacienda.pr.gov/sites/default/files/individuals_2024_rev._jul_12_24_9-30-24_informative.pdf#page=52 + - title: P.R. Laws tit. 13, § 30061 (b)(1)-(4) + href: https://law.justia.com/codes/puerto-rico/title-thirteen/subtitle-17/part-ii/chapter-1004/subchapter-a/30061/ diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/gradual_adjustment/threshold.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/gradual_adjustment/threshold.yaml new file mode 100644 index 00000000000..c09e230c36c --- /dev/null +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/gradual_adjustment/threshold.yaml @@ -0,0 +1,13 @@ +description: Puerto Rico provides the following income amount as a threshold for the gradual adjustment amount. +values: + 2024-01-01: 500_000 +metadata: + unit: currency-USD + period: year + label: Puerto Rico gradual adjustment amount income threshold + # discrepancy between legal form and tax form for the income threshold + reference: + - title: Gov. of Puerto Rico Form 482.0 2024 + href: https://hacienda.pr.gov/sites/default/files/individuals_2024_rev._jul_12_24_9-30-24_informative.pdf#page=52 + - title: P.R. Laws tit. 13, § 30061 (b)(4)) + href: https://law.justia.com/codes/puerto-rico/title-thirteen/subtitle-17/part-ii/chapter-1004/subchapter-a/30061/ diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_amount.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_amount.yaml new file mode 100644 index 00000000000..ffebc57a814 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_amount.yaml @@ -0,0 +1,29 @@ +- name: Not eligible, income below threshold + period: 2024 + input: + pr_gradual_adjustment_eligibility: False + pr_net_taxable_income: 70_000 + pr_exemptions: 4_000 + state_code: PR + output: + pr_gradual_adjustment_amount: 0 + +- name: Amount lower than limit + period: 2024 + input: + pr_gradual_adjustment_eligibility: True + pr_net_taxable_income: 501_000 + pr_exemptions: 1_300 + state_code: PR + output: + pr_gradual_adjustment_amount: 50 + +- name: Limit lower than amount + period: 2024 + input: + pr_gradual_adjustment_eligibility: True + pr_net_taxable_income: 700_000 + pr_exemptions: 1_000 + state_code: PR + output: + pr_gradual_adjustment_amount: 9_225 \ No newline at end of file diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_eligibility.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_eligibility.yaml new file mode 100644 index 00000000000..573c5832ce0 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_eligibility.yaml @@ -0,0 +1,15 @@ +- name: Not eligible + period: 2024 + input: + pr_net_taxable_income: 500_000 + state_code: PR + output: + pr_gradual_adjustment_eligibility: False + +- name: Eligible + period: 2024 + input: + pr_net_taxable_income: 500_001 + state_code: PR + output: + pr_gradual_adjustment_eligibility: True \ No newline at end of file diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_amount.py b/policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_amount.py new file mode 100644 index 00000000000..d310baddf34 --- /dev/null +++ b/policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_amount.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class pr_gradual_adjustment_amount(Variable): + value_type = float + entity = TaxUnit + label = "Puerto Rico gradual adjustment amount" + documentation = "An additional amount added to tax amount for high income filers." + unit = USD + definition_period = YEAR + defined_for = "pr_gradual_adjustment_eligibility" + reference = "https://hacienda.pr.gov/sites/default/files/individuals_2024_rev._jul_12_24_9-30-24_informative.pdf#page=3" + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.territories.pr.tax.income.gradual_adjustment + net_taxable_income = tax_unit( + "pr_net_taxable_income", period + ) + amount = (net_taxable_income - p.threshold) * p.rate + exemptions = tax_unit("pr_exemptions", period) + limit = p.adjustment_limit_basis + p.exemption_rate * exemptions + + return min_(amount, limit) \ No newline at end of file diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_eligibility.py b/policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_eligibility.py new file mode 100644 index 00000000000..955169aa01d --- /dev/null +++ b/policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_eligibility.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class pr_gradual_adjustment_eligibility(Variable): + value_type = float + entity = TaxUnit + label = "Puerto Rico gradual adjustment eligibility" + unit = USD + definition_period = YEAR + defined_for = StateCode.PR + reference = "https://hacienda.pr.gov/sites/default/files/individuals_2024_rev._jul_12_24_9-30-24_informative.pdf#page=3" + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.territories.pr.tax.income.gradual_adjustment + net_taxable_income = tax_unit( + "pr_net_taxable_income", period + ) + + return net_taxable_income > p.threshold \ No newline at end of file diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/taxable_income/exemptions/pr_exemptions.py b/policyengine_us/variables/gov/territories/pr/tax/income/taxable_income/exemptions/pr_exemptions.py new file mode 100644 index 00000000000..11e24a4c475 --- /dev/null +++ b/policyengine_us/variables/gov/territories/pr/tax/income/taxable_income/exemptions/pr_exemptions.py @@ -0,0 +1,12 @@ +from policyengine_us.model_api import * + + +class pr_exemptions(Variable): + value_type = float + entity = TaxUnit + label = "Puerto Rico exemptions" + definition_period = YEAR + unit = USD + reference = "https://law.justia.com/codes/puerto-rico/title-thirteen/subtitle-17/part-ii/chapter-1005/subchapter-c/30138/" + + adds = "gov.territories.pr.tax.income.taxable_income.exemptions.sources" \ No newline at end of file diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/taxable_income/pr_net_taxable_income.py b/policyengine_us/variables/gov/territories/pr/tax/income/taxable_income/pr_net_taxable_income.py new file mode 100644 index 00000000000..4b743f3375b --- /dev/null +++ b/policyengine_us/variables/gov/territories/pr/tax/income/taxable_income/pr_net_taxable_income.py @@ -0,0 +1,10 @@ +from policyengine_us.model_api import * + + +class pr_net_taxable_income(Variable): + value_type = float + entity = TaxUnit + label = "Puerto Rico net taxable income" + reference = "https://hacienda.pr.gov/sites/default/files/individuals_2024_rev._jul_12_24_9-30-24_informative.pdf#page=2" + unit = USD + definition_period = YEAR \ No newline at end of file From 64dd824fd5a36711522233b25cc7e78fd61f88b2 Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Fri, 3 Oct 2025 23:32:53 +0000 Subject: [PATCH 2/6] Format and changelog --- changelog_entry.yaml | 4 ++++ .../pr_gradual_adjustment_amount.py | 16 +++++++--------- .../pr_gradual_adjustment_eligibility.py | 10 +++------- .../taxable_income/exemptions/pr_exemptions.py | 2 +- .../taxable_income/pr_net_taxable_income.py | 2 +- 5 files changed, 16 insertions(+), 18 deletions(-) diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb2d..956196fd2c8 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,4 @@ +- bump: minor + changes: + added: + - Puerto Rico gradual adjustment amount. diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_amount.py b/policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_amount.py index d310baddf34..7989b0dd330 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_amount.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_amount.py @@ -5,21 +5,19 @@ class pr_gradual_adjustment_amount(Variable): value_type = float entity = TaxUnit label = "Puerto Rico gradual adjustment amount" - documentation = "An additional amount added to tax amount for high income filers." + documentation = ( + "An additional amount added to tax amount for high income filers." + ) unit = USD definition_period = YEAR defined_for = "pr_gradual_adjustment_eligibility" reference = "https://hacienda.pr.gov/sites/default/files/individuals_2024_rev._jul_12_24_9-30-24_informative.pdf#page=3" def formula(tax_unit, period, parameters): - p = parameters( - period - ).gov.territories.pr.tax.income.gradual_adjustment - net_taxable_income = tax_unit( - "pr_net_taxable_income", period - ) - amount = (net_taxable_income - p.threshold) * p.rate + p = parameters(period).gov.territories.pr.tax.income.gradual_adjustment + net_taxable_income = tax_unit("pr_net_taxable_income", period) + amount = (net_taxable_income - p.threshold) * p.rate exemptions = tax_unit("pr_exemptions", period) limit = p.adjustment_limit_basis + p.exemption_rate * exemptions - return min_(amount, limit) \ No newline at end of file + return min_(amount, limit) diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_eligibility.py b/policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_eligibility.py index 955169aa01d..b8ebc14377e 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_eligibility.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_eligibility.py @@ -11,11 +11,7 @@ class pr_gradual_adjustment_eligibility(Variable): reference = "https://hacienda.pr.gov/sites/default/files/individuals_2024_rev._jul_12_24_9-30-24_informative.pdf#page=3" def formula(tax_unit, period, parameters): - p = parameters( - period - ).gov.territories.pr.tax.income.gradual_adjustment - net_taxable_income = tax_unit( - "pr_net_taxable_income", period - ) + p = parameters(period).gov.territories.pr.tax.income.gradual_adjustment + net_taxable_income = tax_unit("pr_net_taxable_income", period) - return net_taxable_income > p.threshold \ No newline at end of file + return net_taxable_income > p.threshold diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/taxable_income/exemptions/pr_exemptions.py b/policyengine_us/variables/gov/territories/pr/tax/income/taxable_income/exemptions/pr_exemptions.py index 11e24a4c475..f2e92ae04e6 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/taxable_income/exemptions/pr_exemptions.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/taxable_income/exemptions/pr_exemptions.py @@ -9,4 +9,4 @@ class pr_exemptions(Variable): unit = USD reference = "https://law.justia.com/codes/puerto-rico/title-thirteen/subtitle-17/part-ii/chapter-1005/subchapter-c/30138/" - adds = "gov.territories.pr.tax.income.taxable_income.exemptions.sources" \ No newline at end of file + adds = "gov.territories.pr.tax.income.taxable_income.exemptions.sources" diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/taxable_income/pr_net_taxable_income.py b/policyengine_us/variables/gov/territories/pr/tax/income/taxable_income/pr_net_taxable_income.py index 4b743f3375b..c0757ee1286 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/taxable_income/pr_net_taxable_income.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/taxable_income/pr_net_taxable_income.py @@ -7,4 +7,4 @@ class pr_net_taxable_income(Variable): label = "Puerto Rico net taxable income" reference = "https://hacienda.pr.gov/sites/default/files/individuals_2024_rev._jul_12_24_9-30-24_informative.pdf#page=2" unit = USD - definition_period = YEAR \ No newline at end of file + definition_period = YEAR From 0ad625a268a6c127fd7d3a9a4c5ac48d1c4cfa01 Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Fri, 3 Oct 2025 23:58:46 +0000 Subject: [PATCH 3/6] Regular tax before credits computation --- changelog_entry.yaml | 4 ++++ .../income/normal_tax_percent_reduction.yaml | 19 ++++++++++++++++ .../pr/tax/income/pr_tax_before_credits.yaml | 19 ++++++++++++++++ .../pr_gradual_adjustment_amount.py | 14 ++++++++++++ .../gov/territories/pr/tax/income/pr_tax.py | 11 ++++++++++ .../pr/tax/income/pr_tax_before_credits.py | 22 +++++++++++++++++++ 6 files changed, 89 insertions(+) create mode 100644 policyengine_us/parameters/gov/territories/pr/tax/income/normal_tax_percent_reduction.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/pr_tax_before_credits.yaml create mode 100644 policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_amount.py create mode 100644 policyengine_us/variables/gov/territories/pr/tax/income/pr_tax.py create mode 100644 policyengine_us/variables/gov/territories/pr/tax/income/pr_tax_before_credits.py diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb2d..dcee65f5ee4 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,4 @@ +- bump: minor + changes: + added: + - Puerto Rico regular tax before credits. diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/normal_tax_percent_reduction.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/normal_tax_percent_reduction.yaml new file mode 100644 index 00000000000..4421d7e981e --- /dev/null +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/normal_tax_percent_reduction.yaml @@ -0,0 +1,19 @@ +description: Puerto Rico determines the percentage reduction of normal tax based on gross income. +brackets: + - threshold: + 2024-01-01: 0 + amount: + 2024-01-01: 0.92 + - threshold: + 2024-01-01: 100_001 + amount: + 2024-01-01: 0.95 +metadata: + amount_unit: /1 + threshold_unit: currency-USD + type: single_amount + label: Puerto Rico normal tax percentage reduction + period: year + reference: + - title: Gov. of Puerto Rico Form 482.0 2024 + href: https://hacienda.pr.gov/sites/default/files/individuals_2024_rev._jul_12_24_9-30-24_informative.pdf#page=3 diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/pr_tax_before_credits.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/pr_tax_before_credits.yaml new file mode 100644 index 00000000000..65de494185a --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/pr_tax_before_credits.yaml @@ -0,0 +1,19 @@ +- name: Lower bracket + period: 2024 + input: + state_code: PR + pr_gross_income: 100_000 + pr_tax: 2_000 + pr_gradual_adjustment_amount: 0 + output: + pr_tax_before_credits: 1_840 + +- name: Upper bracket + period: 2024 + input: + state_code: PR + pr_gross_income: 100_001 + pr_tax: 1_000 + pr_gradual_adjustment_amount: 500 + output: + pr_tax_before_credits: 1_425 \ No newline at end of file diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_amount.py b/policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_amount.py new file mode 100644 index 00000000000..68271cdbf8f --- /dev/null +++ b/policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_amount.py @@ -0,0 +1,14 @@ +from policyengine_us.model_api import * + + +class pr_gradual_adjustment_amount(Variable): + value_type = float + entity = TaxUnit + label = "Puerto Rico gradual adjustment amount" + documentation = ( + "An additional amount added to tax amount for high income filers." + ) + unit = USD + definition_period = YEAR + defined_for = "pr_gradual_adjustment_eligibility" + reference = "https://hacienda.pr.gov/sites/default/files/individuals_2024_rev._jul_12_24_9-30-24_informative.pdf#page=3" diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/pr_tax.py b/policyengine_us/variables/gov/territories/pr/tax/income/pr_tax.py new file mode 100644 index 00000000000..e5212fe9914 --- /dev/null +++ b/policyengine_us/variables/gov/territories/pr/tax/income/pr_tax.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class pr_tax(Variable): + value_type = float + entity = TaxUnit + label = "Puerto Rico tax" + unit = USD + definition_period = YEAR + defined_for = StateCode.PR + reference = "https://law.justia.com/codes/puerto-rico/title-thirteen/subtitle-17/part-ii/chapter-1004/subchapter-a/30061/" diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/pr_tax_before_credits.py b/policyengine_us/variables/gov/territories/pr/tax/income/pr_tax_before_credits.py new file mode 100644 index 00000000000..ba234dab858 --- /dev/null +++ b/policyengine_us/variables/gov/territories/pr/tax/income/pr_tax_before_credits.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class pr_tax_before_credits(Variable): + value_type = float + entity = TaxUnit + label = "Puerto Rico regular tax before credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.PR + reference = "https://hacienda.pr.gov/sites/default/files/inst_individuals_2023.pdf#page=19" + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.territories.pr.tax.income + gross_income = tax_unit("pr_gross_income", period) + tax = tax_unit("pr_tax", period) + gradual_adjustment = tax_unit("pr_gradual_adjustment_amount", period) + total_normal_tax = tax + gradual_adjustment + + return total_normal_tax * p.normal_tax_percent_reduction.calc( + gross_income + ) From 812c183c997fd49444cc1ca5d689704d488b3879 Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Mon, 13 Oct 2025 07:03:48 +0000 Subject: [PATCH 4/6] Combined with gradual adjustment, language changes --- .../gradual_adjustment/adjustment_limit_basis.yaml | 5 ++--- .../percentage.yaml} | 4 ++-- .../pr_gradual_adjustment_amount.py | 2 +- .../pr/tax/income/pr_tax_before_credits.py | 12 +++++------- 4 files changed, 10 insertions(+), 13 deletions(-) rename policyengine_us/parameters/gov/territories/pr/tax/income/{normal_tax_percent_reduction.yaml => regular_tax/percentage.yaml} (74%) diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/gradual_adjustment/adjustment_limit_basis.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/gradual_adjustment/adjustment_limit_basis.yaml index 979799ffe85..c66430fcad1 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/gradual_adjustment/adjustment_limit_basis.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/gradual_adjustment/adjustment_limit_basis.yaml @@ -5,9 +5,8 @@ metadata: unit: currency-USD period: year label: Puerto Rico gradual adjustment limit basis - # discrepancy between legal form and tax form for the basis amount reference: - title: Gov. of Puerto Rico Form 482.0 2024 href: https://hacienda.pr.gov/sites/default/files/individuals_2024_rev._jul_12_24_9-30-24_informative.pdf#page=52 - - title: P.R. Laws tit. 13, § 30061 (b)(5)(c) - href: https://law.justia.com/codes/puerto-rico/title-thirteen/subtitle-17/part-ii/chapter-1004/subchapter-a/30061/ + - title: P.R. Laws tit. 13, § 30061 (b)(5)(e) + href: https://bvirtualogp.pr.gov/ogp/Bvirtual/leyesreferencia/PDF/2-ingles/1-2011.pdf#page=32 diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/normal_tax_percent_reduction.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/regular_tax/percentage.yaml similarity index 74% rename from policyengine_us/parameters/gov/territories/pr/tax/income/normal_tax_percent_reduction.yaml rename to policyengine_us/parameters/gov/territories/pr/tax/income/regular_tax/percentage.yaml index 4421d7e981e..285f5151423 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/normal_tax_percent_reduction.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/regular_tax/percentage.yaml @@ -1,4 +1,4 @@ -description: Puerto Rico determines the percentage reduction of normal tax based on gross income. +description: Puerto Rico taxes this percentage of total normal taxes, based on gross income. brackets: - threshold: 2024-01-01: 0 @@ -12,7 +12,7 @@ metadata: amount_unit: /1 threshold_unit: currency-USD type: single_amount - label: Puerto Rico normal tax percentage reduction + label: Puerto Rico regular tax percentage period: year reference: - title: Gov. of Puerto Rico Form 482.0 2024 diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_amount.py b/policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_amount.py index 12d5155c6d4..7989b0dd330 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_amount.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/gradual_adjustment/pr_gradual_adjustment_amount.py @@ -20,4 +20,4 @@ def formula(tax_unit, period, parameters): exemptions = tax_unit("pr_exemptions", period) limit = p.adjustment_limit_basis + p.exemption_rate * exemptions - return min_(amount, limit) \ No newline at end of file + return min_(amount, limit) diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/pr_tax_before_credits.py b/policyengine_us/variables/gov/territories/pr/tax/income/pr_tax_before_credits.py index ba234dab858..539664aa478 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/pr_tax_before_credits.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/pr_tax_before_credits.py @@ -11,12 +11,10 @@ class pr_tax_before_credits(Variable): reference = "https://hacienda.pr.gov/sites/default/files/inst_individuals_2023.pdf#page=19" def formula(tax_unit, period, parameters): - p = parameters(period).gov.territories.pr.tax.income + p = parameters(period).gov.territories.pr.tax.income.regular_tax gross_income = tax_unit("pr_gross_income", period) - tax = tax_unit("pr_tax", period) - gradual_adjustment = tax_unit("pr_gradual_adjustment_amount", period) - total_normal_tax = tax + gradual_adjustment - - return total_normal_tax * p.normal_tax_percent_reduction.calc( - gross_income + total_normal_tax = add( + tax_unit, period, ["pr_tax", "pr_gradual_adjustment_amount"] ) + + return total_normal_tax * p.percentage.calc(gross_income) From 72ded8fb2df94bff5c68478c3c10047c053f9280 Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Mon, 13 Oct 2025 19:42:31 +0000 Subject: [PATCH 5/6] Add legal reference to percentage parameter --- .../gov/territories/pr/tax/income/regular_tax/percentage.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/policyengine_us/parameters/gov/territories/pr/tax/income/regular_tax/percentage.yaml b/policyengine_us/parameters/gov/territories/pr/tax/income/regular_tax/percentage.yaml index 285f5151423..c92fb4923db 100644 --- a/policyengine_us/parameters/gov/territories/pr/tax/income/regular_tax/percentage.yaml +++ b/policyengine_us/parameters/gov/territories/pr/tax/income/regular_tax/percentage.yaml @@ -17,3 +17,5 @@ metadata: reference: - title: Gov. of Puerto Rico Form 482.0 2024 href: https://hacienda.pr.gov/sites/default/files/individuals_2024_rev._jul_12_24_9-30-24_informative.pdf#page=3 + - title: P.R. Laws tit. 13, § 30061 (c) + href: https://bvirtualogp.pr.gov/ogp/Bvirtual/leyesreferencia/PDF/2-ingles/1-2011.pdf#page=33 \ No newline at end of file From 28dbaac7a464cae4640eea75d174ed4d65e9e6ac Mon Sep 17 00:00:00 2001 From: Lucy Lennemann <78785519+llennemann@users.noreply.github.com> Date: Mon, 13 Oct 2025 20:49:10 +0000 Subject: [PATCH 6/6] Variable change and format --- .../territories/pr/tax/income/pr_tax_before_credits.yaml | 8 ++++---- .../pr/tax/income/{pr_tax.py => pr_normal_tax.py} | 4 ++-- ...before_credits.py => pr_regular_tax_before_credits.py} | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) rename policyengine_us/variables/gov/territories/pr/tax/income/{pr_tax.py => pr_normal_tax.py} (80%) rename policyengine_us/variables/gov/territories/pr/tax/income/{pr_tax_before_credits.py => pr_regular_tax_before_credits.py} (82%) diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/pr_tax_before_credits.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/pr_tax_before_credits.yaml index 65de494185a..e7f6198cb1e 100644 --- a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/pr_tax_before_credits.yaml +++ b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/pr_tax_before_credits.yaml @@ -3,17 +3,17 @@ input: state_code: PR pr_gross_income: 100_000 - pr_tax: 2_000 + pr_normal_tax: 2_000 pr_gradual_adjustment_amount: 0 output: - pr_tax_before_credits: 1_840 + pr_regular_tax_before_credits: 1_840 - name: Upper bracket period: 2024 input: state_code: PR pr_gross_income: 100_001 - pr_tax: 1_000 + pr_normal_tax: 1_000 pr_gradual_adjustment_amount: 500 output: - pr_tax_before_credits: 1_425 \ No newline at end of file + pr_regular_tax_before_credits: 1_425 \ No newline at end of file diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/pr_tax.py b/policyengine_us/variables/gov/territories/pr/tax/income/pr_normal_tax.py similarity index 80% rename from policyengine_us/variables/gov/territories/pr/tax/income/pr_tax.py rename to policyengine_us/variables/gov/territories/pr/tax/income/pr_normal_tax.py index e5212fe9914..2db4752a560 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/pr_tax.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/pr_normal_tax.py @@ -1,10 +1,10 @@ from policyengine_us.model_api import * -class pr_tax(Variable): +class pr_normal_tax(Variable): value_type = float entity = TaxUnit - label = "Puerto Rico tax" + label = "Puerto Rico normal tax" unit = USD definition_period = YEAR defined_for = StateCode.PR diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/pr_tax_before_credits.py b/policyengine_us/variables/gov/territories/pr/tax/income/pr_regular_tax_before_credits.py similarity index 82% rename from policyengine_us/variables/gov/territories/pr/tax/income/pr_tax_before_credits.py rename to policyengine_us/variables/gov/territories/pr/tax/income/pr_regular_tax_before_credits.py index 539664aa478..e48b8e6f6cd 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/pr_tax_before_credits.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/pr_regular_tax_before_credits.py @@ -1,7 +1,7 @@ from policyengine_us.model_api import * -class pr_tax_before_credits(Variable): +class pr_regular_tax_before_credits(Variable): value_type = float entity = TaxUnit label = "Puerto Rico regular tax before credits" @@ -14,7 +14,7 @@ def formula(tax_unit, period, parameters): p = parameters(period).gov.territories.pr.tax.income.regular_tax gross_income = tax_unit("pr_gross_income", period) total_normal_tax = add( - tax_unit, period, ["pr_tax", "pr_gradual_adjustment_amount"] + tax_unit, period, ["pr_normal_tax", "pr_gradual_adjustment_amount"] ) return total_normal_tax * p.percentage.calc(gross_income)