From d99ae12c65c245fdfcf9dc4aa7d4bab89c6c7769 Mon Sep 17 00:00:00 2001 From: quterorta Date: Fri, 28 Feb 2025 16:58:41 +0200 Subject: [PATCH 1/4] magento/magento2#39036: Issue with multiple percentage discounts - fixed incorrect discount percent calculation --- .../SalesRule/Model/Rule/Action/Discount/ByPercent.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/SalesRule/Model/Rule/Action/Discount/ByPercent.php b/app/code/Magento/SalesRule/Model/Rule/Action/Discount/ByPercent.php index 836e1fc8956dc..d0b99067d6df0 100644 --- a/app/code/Magento/SalesRule/Model/Rule/Action/Discount/ByPercent.php +++ b/app/code/Magento/SalesRule/Model/Rule/Action/Discount/ByPercent.php @@ -3,6 +3,7 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ + namespace Magento\SalesRule\Model\Rule\Action\Discount; class ByPercent extends AbstractDiscount @@ -68,7 +69,9 @@ protected function _calculate($rule, $item, $qty, $rulePercent) ); if (!$rule->getDiscountQty() || $rule->getDiscountQty() >= $qty) { - $discountPercent = min(100, $item->getDiscountPercent() + $rulePercent); + $previousDiscountPercent = $item->getDiscountPercent() ?: 0.0; + $totalDiscountPercent = ($rulePercent + $previousDiscountPercent) - (($rulePercent * $previousDiscountPercent)/100); + $discountPercent = min(100, $totalDiscountPercent); $item->setDiscountPercent($discountPercent); } From beca8774d6de554f2e8da361bcba90bd6338c036 Mon Sep 17 00:00:00 2001 From: quterorta Date: Fri, 28 Feb 2025 16:59:32 +0200 Subject: [PATCH 2/4] magento/magento2#39036: Issue with multiple percentage discounts - change copyright --- .../SalesRule/Model/Rule/Action/Discount/ByPercent.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/SalesRule/Model/Rule/Action/Discount/ByPercent.php b/app/code/Magento/SalesRule/Model/Rule/Action/Discount/ByPercent.php index d0b99067d6df0..808d6938b02c6 100644 --- a/app/code/Magento/SalesRule/Model/Rule/Action/Discount/ByPercent.php +++ b/app/code/Magento/SalesRule/Model/Rule/Action/Discount/ByPercent.php @@ -1,7 +1,7 @@ Date: Wed, 2 Apr 2025 14:12:59 +0530 Subject: [PATCH 3/4] 39036:Fixed Unit & Static Test Cases --- .../SalesRule/Model/Rule/Action/Discount/ByPercent.php | 4 +++- .../Test/Unit/Model/Rule/Action/Discount/ByPercentTest.php | 4 ++-- .../Test/Unit/Model/Rule/Action/Discount/ToPercentTest.php | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/code/Magento/SalesRule/Model/Rule/Action/Discount/ByPercent.php b/app/code/Magento/SalesRule/Model/Rule/Action/Discount/ByPercent.php index 808d6938b02c6..55dd206014204 100644 --- a/app/code/Magento/SalesRule/Model/Rule/Action/Discount/ByPercent.php +++ b/app/code/Magento/SalesRule/Model/Rule/Action/Discount/ByPercent.php @@ -70,7 +70,9 @@ protected function _calculate($rule, $item, $qty, $rulePercent) if (!$rule->getDiscountQty() || $rule->getDiscountQty() >= $qty) { $previousDiscountPercent = $item->getDiscountPercent() ?: 0.0; - $totalDiscountPercent = ($rulePercent + $previousDiscountPercent) - (($rulePercent * $previousDiscountPercent)/100); + $totalDiscountPercent = ($rulePercent + $previousDiscountPercent) - ( + ($rulePercent * $previousDiscountPercent)/100 + ); $discountPercent = min(100, $totalDiscountPercent); $item->setDiscountPercent($discountPercent); } diff --git a/app/code/Magento/SalesRule/Test/Unit/Model/Rule/Action/Discount/ByPercentTest.php b/app/code/Magento/SalesRule/Test/Unit/Model/Rule/Action/Discount/ByPercentTest.php index 95a359cf8a9b9..cb860ef253914 100644 --- a/app/code/Magento/SalesRule/Test/Unit/Model/Rule/Action/Discount/ByPercentTest.php +++ b/app/code/Magento/SalesRule/Test/Unit/Model/Rule/Action/Discount/ByPercentTest.php @@ -218,7 +218,7 @@ public static function calculateDataProvider() 'originalPrice' => 60, 'baseOriginalPrice' => 55, ], - 'expectedRuleDiscountQty' => 85, + 'expectedRuleDiscountQty' => 68.5, 'expectedDiscountData' => [ 'amount' => 42, 'baseAmount' => 25.5, @@ -236,7 +236,7 @@ public static function calculateDataProvider() 'originalPrice' => 60, 'baseOriginalPrice' => 55, ], - 'expectedRuleDiscountQty' => 85, + 'expectedRuleDiscountQty' => 68.5, 'expectedDiscountData' => [ 'amount' => 72, 'baseAmount' => 52.5, diff --git a/app/code/Magento/SalesRule/Test/Unit/Model/Rule/Action/Discount/ToPercentTest.php b/app/code/Magento/SalesRule/Test/Unit/Model/Rule/Action/Discount/ToPercentTest.php index 8b710cf46d63c..6861b1bd70ace 100644 --- a/app/code/Magento/SalesRule/Test/Unit/Model/Rule/Action/Discount/ToPercentTest.php +++ b/app/code/Magento/SalesRule/Test/Unit/Model/Rule/Action/Discount/ToPercentTest.php @@ -218,7 +218,7 @@ public static function calculateDataProvider() 'originalPrice' => 60, 'baseOriginalPrice' => 55, ], - 'expectedRuleDiscountQty' => 100, + 'expectedRuleDiscountQty' => 86.5, 'expectedDiscountData' => [ 'amount' => 98, 'baseAmount' => 59.49999999999999, From f8051d38bd5a251807e9a518c31dd77d945bbe76 Mon Sep 17 00:00:00 2001 From: engcom-Dash Date: Wed, 2 Apr 2025 16:49:31 +0530 Subject: [PATCH 4/4] Fixed Copyright issue --- .../Test/Unit/Model/Rule/Action/Discount/ByPercentTest.php | 4 ++-- .../Test/Unit/Model/Rule/Action/Discount/ToPercentTest.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/code/Magento/SalesRule/Test/Unit/Model/Rule/Action/Discount/ByPercentTest.php b/app/code/Magento/SalesRule/Test/Unit/Model/Rule/Action/Discount/ByPercentTest.php index cb860ef253914..861ed4215a264 100644 --- a/app/code/Magento/SalesRule/Test/Unit/Model/Rule/Action/Discount/ByPercentTest.php +++ b/app/code/Magento/SalesRule/Test/Unit/Model/Rule/Action/Discount/ByPercentTest.php @@ -1,7 +1,7 @@