diff --git a/vendor/magento/module-sales-rule/Helper/CartFixedDiscount.php b/vendor/magento/module-sales-rule/Helper/CartFixedDiscount.php index a518a00c73520..a5287e57b3e77 100644 --- a/vendor/magento/module-sales-rule/Helper/CartFixedDiscount.php +++ b/vendor/magento/module-sales-rule/Helper/CartFixedDiscount.php @@ -1,7 +1,7 @@ deltaPriceRound->round($ruleDiscount * $ratio, $discountType); + $ratio = min($ratio, 1); - return $discountAmount; + return $this->deltaPriceRound->round($ruleDiscount * $ratio, $discountType); } /** diff --git a/vendor/magento/module-quote/Model/Quote/Item/AbstractItem.php b/vendor/magento/module-quote/Model/Quote/Item/AbstractItem.php index 058411abe720b..c4f461fd9d435 100644 --- a/vendor/magento/module-quote/Model/Quote/Item/AbstractItem.php +++ b/vendor/magento/module-quote/Model/Quote/Item/AbstractItem.php @@ -255,7 +255,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) @@ -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/vendor/magento/module-sales-rule/Model/Quote/Discount.php b/vendor/magento/module-sales-rule/Model/Quote/Discount.php index 9faf5b8785bde..1da3689410733 100644 --- a/vendor/magento/module-sales-rule/Model/Quote/Discount.php +++ b/vendor/magento/module-sales-rule/Model/Quote/Discount.php @@ -187,10 +187,10 @@ public function collect( $items = $this->calculator->sortItemsByPriority($items, $address); $itemsToApplyRules = $items; $rules = $this->calculator->getRules($address); - $totalDiscount = 0; $address->setBaseDiscountAmount(0); /** @var Rule $rule */ foreach ($rules as $rule) { + $ruleTotalDiscount = 0; /** @var Item $item */ foreach ($itemsToApplyRules as $key => $item) { if ($quote->getIsMultiShipping() && $item->getAddress()->getId() !== $address->getId()) { @@ -208,9 +208,14 @@ public function collect( unset($itemsToApplyRules[$key]); } - $totalDiscount += $item->getBaseDiscountAmount(); + if ($item->getChildren() && $item->isChildrenCalculated()) { + foreach ($item->getChildren() as $child) { + $ruleTotalDiscount += $child->getBaseDiscountAmount(); + } + } + $ruleTotalDiscount += $item->getBaseDiscountAmount(); } - $address->setBaseDiscountAmount($totalDiscount); + $address->setBaseDiscountAmount($ruleTotalDiscount); } $this->calculator->initTotals($items, $address); foreach ($items as $item) { diff --git a/vendor/magento/module-sales-rule/Model/Rule/Action/Discount/CartFixed.php b/vendor/magento/module-sales-rule/Model/Rule/Action/Discount/CartFixed.php index 485b98c22565c..5018f0748d387 100644 --- a/vendor/magento/module-sales-rule/Model/Rule/Action/Discount/CartFixed.php +++ b/vendor/magento/module-sales-rule/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()); } @@ -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 */