diff --git a/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php b/app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php index 058411abe720b..7d0c1cd139adc 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 @@ getDiscountAmount(); } - } else { - $totalDiscountAmount = $this->getDiscountAmount(); } - return $totalDiscountAmount; + return $totalDiscountAmount + $this->getDiscountAmount(); } } 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..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 @@ -1,7 +1,7 @@ assertEquals($expectedDiscountAmount, $totalDiscountAmount); } - protected function getMockForAbstractItem($childDiscountAmount) { + protected function getMockForAbstractItem($childDiscountAmount) + { $childItemMock = $this->getMockForAbstractClass( AbstractItem::class, [], @@ -82,6 +83,7 @@ public static function dataProviderGetTotalDiscountAmount() $testCase->getMockForAbstractItem($childTwoDiscountAmount); $valueHasNoEffect = 0; + $parentDiscountAmount = 10; $data = [ 'no_children' => [ @@ -97,10 +99,10 @@ public static function dataProviderGetTotalDiscountAmount() 10, ], 'one_kid' => [ - $childOneDiscountAmount, + $childOneDiscountAmount + $parentDiscountAmount, [$childOneItemMock], true, - $valueHasNoEffect, + $parentDiscountAmount, ], 'two_kids' => [ $childOneDiscountAmount + $childTwoDiscountAmount, diff --git a/app/code/Magento/SalesRule/Model/Quote/Discount.php b/app/code/Magento/SalesRule/Model/Quote/Discount.php index 1b790bf4bfc60..d2daad17f5eb9 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()) { @@ -222,16 +222,13 @@ public function collect( } if ($item->getChildren() && $item->isChildrenCalculated()) { - $childTotal = 0; foreach ($item->getChildren() as $child) { - $childTotal += $child->getBaseDiscountAmount(); + $ruleTotalDiscount += $child->getBaseDiscountAmount(); } - $totalDiscount[$item->getId()] = $childTotal; - } else { - $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) { 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..6cefea2557daa 100644 --- a/app/code/Magento/SalesRule/Model/Rule/Action/Discount/CartFixed.php +++ b/app/code/Magento/SalesRule/Model/Rule/Action/Discount/CartFixed.php @@ -1,7 +1,7 @@ deltaPriceRound->reset($discountType); + if ($baseDiscountAmount > $availableDiscountAmount) { + $baseDiscountAmount = $availableDiscountAmount; + } } else { $this->validator->decrementRuleItemTotalsCount($rule->getId()); } @@ -191,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 @@ -204,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 */