From 35c69e7da5051732972a4227dec97b391b234b38 Mon Sep 17 00:00:00 2001 From: Alexandru Plapana Date: Wed, 16 Oct 2024 16:19:54 +0300 Subject: [PATCH 01/10] ACP2E-3403: Cart Price Rules Miscalculating Discount --- app/code/Magento/SalesRule/Model/Quote/Discount.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/SalesRule/Model/Quote/Discount.php b/app/code/Magento/SalesRule/Model/Quote/Discount.php index 2f2133c5e066d..43865c439839b 100644 --- a/app/code/Magento/SalesRule/Model/Quote/Discount.php +++ b/app/code/Magento/SalesRule/Model/Quote/Discount.php @@ -238,8 +238,9 @@ public function collect( $this->eventManager->dispatch('sales_quote_address_discount_item', $eventArgs); $this->aggregateItemDiscount($child, $total); } + } else { + $this->aggregateItemDiscount($item, $total); } - $this->aggregateItemDiscount($item, $total); if ($item->getExtensionAttributes()) { $this->aggregateDiscountPerRule($item, $address); } From ec03a27b0546c8e705b8c08906b4b87b69f0cf01 Mon Sep 17 00:00:00 2001 From: Alexandru Plapana Date: Thu, 17 Oct 2024 09:34:17 +0300 Subject: [PATCH 02/10] ACP2E-3403: Cart Price Rules Miscalculating Discount --- app/code/Magento/SalesRule/Model/Quote/Discount.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/code/Magento/SalesRule/Model/Quote/Discount.php b/app/code/Magento/SalesRule/Model/Quote/Discount.php index 43865c439839b..2f2133c5e066d 100644 --- a/app/code/Magento/SalesRule/Model/Quote/Discount.php +++ b/app/code/Magento/SalesRule/Model/Quote/Discount.php @@ -238,9 +238,8 @@ public function collect( $this->eventManager->dispatch('sales_quote_address_discount_item', $eventArgs); $this->aggregateItemDiscount($child, $total); } - } else { - $this->aggregateItemDiscount($item, $total); } + $this->aggregateItemDiscount($item, $total); if ($item->getExtensionAttributes()) { $this->aggregateDiscountPerRule($item, $address); } From 98e1d327b1d4736d76455f99837946b09e74b091 Mon Sep 17 00:00:00 2001 From: Alexandru Plapana Date: Thu, 17 Oct 2024 14:11:33 +0300 Subject: [PATCH 03/10] ACP2E-3403: Cart Price Rules Miscalculating Discount --- .../Magento/Quote/Model/Quote/Item/AbstractItem.php | 4 +--- app/code/Magento/SalesRule/Model/Quote/Discount.php | 11 ++++------- .../Model/Rule/Action/Discount/CartFixed.php | 3 +++ 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php b/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php index 058411abe720b..b7b55f7b14a79 100644 --- a/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php +++ b/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php @@ -678,9 +678,7 @@ public function getTotalDiscountAmount() foreach ($children as $child) { $totalDiscountAmount += $child->getDiscountAmount(); } - } else { - $totalDiscountAmount = $this->getDiscountAmount(); } - return $totalDiscountAmount; + return $totalDiscountAmount + $this->getDiscountAmount(); } } diff --git a/app/code/Magento/SalesRule/Model/Quote/Discount.php b/app/code/Magento/SalesRule/Model/Quote/Discount.php index b5a349502ed9a..1bb622e6cbf32 100644 --- a/app/code/Magento/SalesRule/Model/Quote/Discount.php +++ b/app/code/Magento/SalesRule/Model/Quote/Discount.php @@ -221,15 +221,12 @@ public function collect( unset($itemsToApplyRules[$key]); } - if ($item->getChildren() && $item->isChildrenCalculated()) { - $childTotal = 0; - foreach ($item->getChildren() as $child) { - $childTotal += $child->getBaseDiscountAmount(); + if (($children = $item->getChildren()) && $item->isChildrenCalculated()) { + foreach ($children as $child) { + $totalDiscount[$child->getId()] = $child->getBaseDiscountAmount(); } - $totalDiscount[$item->getId()] = $childTotal; - } else { - $totalDiscount[$item->getId()] = $item->getBaseDiscountAmount(); } + $totalDiscount[$item->getId()] = $item->getBaseDiscountAmount(); } $address->setBaseDiscountAmount(array_sum(array_values($totalDiscount))); } diff --git a/app/code/Magento/SalesRule/Model/Rule/Action/Discount/CartFixed.php b/app/code/Magento/SalesRule/Model/Rule/Action/Discount/CartFixed.php index 485b98c22565c..c18d6ab7efc0b 100644 --- a/app/code/Magento/SalesRule/Model/Rule/Action/Discount/CartFixed.php +++ b/app/code/Magento/SalesRule/Model/Rule/Action/Discount/CartFixed.php @@ -141,6 +141,9 @@ public function calculate($rule, $item, $qty) $baseDiscountAmount = min($baseItemPrice * $qty, $baseDiscountAmount); if ($ruleItemsCount <= 1) { $this->deltaPriceRound->reset($discountType); + if ($baseDiscountAmount > $availableDiscountAmount) { + $baseDiscountAmount = $availableDiscountAmount; + } } else { $this->validator->decrementRuleItemTotalsCount($rule->getId()); } From e63347d4e233c2342fe06d79d8e2ecd3460a1074 Mon Sep 17 00:00:00 2001 From: Alexandru Plapana Date: Thu, 17 Oct 2024 16:37:15 +0300 Subject: [PATCH 04/10] ACP2E-3403: Cart Price Rules Miscalculating Discount --- app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php | 3 +-- .../Magento/SalesRule/Model/Rule/Action/Discount/CartFixed.php | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php b/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php index b7b55f7b14a79..014fcd458f0b9 100644 --- a/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php +++ b/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php @@ -18,7 +18,6 @@ * - custom_price - new price that can be declared by user and recalculated during calculation process * - original_custom_price - original defined value of custom price without any conversion * - * @api * @method float getDiscountAmount() * @method \Magento\Quote\Model\Quote\Item\AbstractItem setDiscountAmount(float $amount) * @method float getBaseDiscountAmount() @@ -255,7 +254,7 @@ public function setMessage($messages) /** * Add message of quote item to array of messages * - * @param string $message + * @param mixed $message * @return $this */ public function addMessage($message) diff --git a/app/code/Magento/SalesRule/Model/Rule/Action/Discount/CartFixed.php b/app/code/Magento/SalesRule/Model/Rule/Action/Discount/CartFixed.php index c18d6ab7efc0b..5018f0748d387 100644 --- a/app/code/Magento/SalesRule/Model/Rule/Action/Discount/CartFixed.php +++ b/app/code/Magento/SalesRule/Model/Rule/Action/Discount/CartFixed.php @@ -194,6 +194,7 @@ public function calculate($rule, $item, $qty) * Set information about usage cart fixed rule by quote address * * @deprecated 101.2.0 should be removed as it is not longer used + * @see Nothing * @param int $ruleId * @param int $itemId * @return void @@ -207,6 +208,7 @@ protected function setCartFixedRuleUsedForAddress($ruleId, $itemId) * Retrieve information about usage cart fixed rule by quote address * * @deprecated 101.2.0 should be removed as it is not longer used + * @see Nothing * @param int $ruleId * @return int|null */ From b834f223c021fbe8c435ea12fddc66a562d9c45b Mon Sep 17 00:00:00 2001 From: Alexandru Plapana Date: Thu, 17 Oct 2024 17:30:28 +0300 Subject: [PATCH 05/10] ACP2E-3403: Cart Price Rules Miscalculating Discount --- app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php b/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php index 014fcd458f0b9..c4f461fd9d435 100644 --- a/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php +++ b/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php @@ -18,6 +18,7 @@ * - custom_price - new price that can be declared by user and recalculated during calculation process * - original_custom_price - original defined value of custom price without any conversion * + * @api * @method float getDiscountAmount() * @method \Magento\Quote\Model\Quote\Item\AbstractItem setDiscountAmount(float $amount) * @method float getBaseDiscountAmount() From ebe57d15d57e84f7caf06b3a49e11281214e6fac Mon Sep 17 00:00:00 2001 From: Alexandru Plapana Date: Fri, 18 Oct 2024 18:33:07 +0300 Subject: [PATCH 06/10] ACP2E-3403: Cart Price Rules Miscalculating Discount --- app/code/Magento/SalesRule/Model/Quote/Discount.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/code/Magento/SalesRule/Model/Quote/Discount.php b/app/code/Magento/SalesRule/Model/Quote/Discount.php index 1bb622e6cbf32..6600f7e85ddb8 100644 --- a/app/code/Magento/SalesRule/Model/Quote/Discount.php +++ b/app/code/Magento/SalesRule/Model/Quote/Discount.php @@ -188,10 +188,10 @@ public function collect( $items = $this->calculator->sortItemsByPriority($items, $address); $itemsToApplyRules = $items; $rules = $this->calculator->getRules($address); - $totalDiscount = []; $address->setBaseDiscountAmount(0); /** @var Rule $rule */ foreach ($rules as $rule) { + $ruleTotalDiscount = 0; /** @var Item $item */ foreach ($itemsToApplyRules as $key => $item) { if ($item->getNoDiscount() || !$this->calculator->canApplyDiscount($item) || $item->getParentItem()) { @@ -221,14 +221,14 @@ public function collect( unset($itemsToApplyRules[$key]); } - if (($children = $item->getChildren()) && $item->isChildrenCalculated()) { - foreach ($children as $child) { - $totalDiscount[$child->getId()] = $child->getBaseDiscountAmount(); + if ($item->getChildren() && $item->isChildrenCalculated()) { + foreach ($item->getChildren() as $child) { + $ruleTotalDiscount += $child->getBaseDiscountAmount(); } } - $totalDiscount[$item->getId()] = $item->getBaseDiscountAmount(); + $ruleTotalDiscount += $item->getBaseDiscountAmount(); } - $address->setBaseDiscountAmount(array_sum(array_values($totalDiscount))); + $address->setBaseDiscountAmount($ruleTotalDiscount); } $this->calculator->initTotals($items, $address); foreach ($items as $item) { From ff92690ba9ae0a4cf023d45e239c36978b1b9c9f Mon Sep 17 00:00:00 2001 From: Alexandru Plapana Date: Mon, 21 Oct 2024 12:23:33 +0300 Subject: [PATCH 07/10] ACP2E-3403: Cart Price Rules Miscalculating Discount --- .../Quote/Test/Unit/Model/Quote/Item/AbstractItemTest.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/Quote/Test/Unit/Model/Quote/Item/AbstractItemTest.php b/app/code/Magento/Quote/Test/Unit/Model/Quote/Item/AbstractItemTest.php index a6a809f623066..e1f6f2c58a6b1 100644 --- a/app/code/Magento/Quote/Test/Unit/Model/Quote/Item/AbstractItemTest.php +++ b/app/code/Magento/Quote/Test/Unit/Model/Quote/Item/AbstractItemTest.php @@ -82,6 +82,7 @@ public static function dataProviderGetTotalDiscountAmount() $testCase->getMockForAbstractItem($childTwoDiscountAmount); $valueHasNoEffect = 0; + $parentDiscountAmount = 10; $data = [ 'no_children' => [ @@ -97,10 +98,10 @@ public static function dataProviderGetTotalDiscountAmount() 10, ], 'one_kid' => [ - $childOneDiscountAmount, + $childOneDiscountAmount + $parentDiscountAmount, [$childOneItemMock], true, - $valueHasNoEffect, + $parentDiscountAmount, ], 'two_kids' => [ $childOneDiscountAmount + $childTwoDiscountAmount, From 2194208202656abd4499ac5fe0aec7de73da6954 Mon Sep 17 00:00:00 2001 From: Alexandru Plapana Date: Mon, 4 Nov 2024 10:44:13 +0200 Subject: [PATCH 08/10] ACP2E-3403: Cart Price Rules Miscalculating Discount --- app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php | 4 ++-- .../Quote/Test/Unit/Model/Quote/Item/AbstractItemTest.php | 4 ++-- .../SalesRule/Model/Rule/Action/Discount/CartFixed.php | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php b/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php index c4f461fd9d435..3d0e1acca00ed 100644 --- a/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php +++ b/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php @@ -1,7 +1,7 @@ Date: Mon, 4 Nov 2024 15:09:26 +0200 Subject: [PATCH 09/10] ACP2E-3403: Cart Price Rules Miscalculating Discount --- .../Quote/Test/Unit/Model/Quote/Item/AbstractItemTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/Quote/Test/Unit/Model/Quote/Item/AbstractItemTest.php b/app/code/Magento/Quote/Test/Unit/Model/Quote/Item/AbstractItemTest.php index 75693c5ca9bce..fea82729d4950 100644 --- a/app/code/Magento/Quote/Test/Unit/Model/Quote/Item/AbstractItemTest.php +++ b/app/code/Magento/Quote/Test/Unit/Model/Quote/Item/AbstractItemTest.php @@ -50,7 +50,8 @@ public function testGetTotalDiscountAmount($expectedDiscountAmount, $children, $ $this->assertEquals($expectedDiscountAmount, $totalDiscountAmount); } - protected function getMockForAbstractItem($childDiscountAmount) { + protected function getMockForAbstractItem($childDiscountAmount) + { $childItemMock = $this->getMockForAbstractClass( AbstractItem::class, [], From 128a79a7a3314098362394c1fe751708be83f411 Mon Sep 17 00:00:00 2001 From: Alexandru Plapana Date: Thu, 7 Nov 2024 11:19:12 +0200 Subject: [PATCH 10/10] ACP2E-3403: Cart Price Rules Miscalculating Discount --- app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php b/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php index c4f461fd9d435..a9d9b6f7f8963 100644 --- a/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php +++ b/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php @@ -18,6 +18,7 @@ * - custom_price - new price that can be declared by user and recalculated during calculation process * - original_custom_price - original defined value of custom price without any conversion * + * phpcs:disable Magento2.Classes.AbstractApi * @api * @method float getDiscountAmount() * @method \Magento\Quote\Model\Quote\Item\AbstractItem setDiscountAmount(float $amount)