Skip to content

Commit c49a8c8

Browse files
committed
ACP2E-3498: Incorrect discount value when multiple cart price rules are applied simultaneously with discounted/special priced products
1 parent f0e5c5f commit c49a8c8

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

app/code/Magento/SalesRule/Model/Rule/Action/Discount/CartFixed.php

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,13 @@ public function calculate($rule, $item, $qty)
7979
$discountData = $this->discountFactory->create();
8080

8181
$ruleTotals = $this->validator->getRuleItemTotalsInfo($rule->getId());
82+
if (is_null($rule->getExistingDiscounts())) {
83+
$existingRuleDiscount = 0;
84+
foreach ($ruleTotals['affected_items'] as $ruleItem) {
85+
$existingRuleDiscount += $ruleItem->getBaseDiscountAmount() * $qty;
86+
}
87+
$rule->setExistingDiscounts($existingRuleDiscount);
88+
}
8289
$baseRuleTotals = $ruleTotals['base_items_price'] ?? 0.0;
8390
$ruleItemsCount = $ruleTotals['items_count'] ?? 0;
8491

@@ -93,6 +100,7 @@ public function calculate($rule, $item, $qty)
93100
$baseItemPrice = $this->validator->getItemBasePrice($item);
94101
$itemOriginalPrice = $this->validator->getItemOriginalPrice($item);
95102
$baseItemOriginalPrice = $this->validator->getItemBaseOriginalPrice($item);
103+
$baseItemDiscountAmount = (float) $item->getBaseDiscountAmount();
96104

97105
$cartRules = $quote->getCartFixedRules();
98106
if (!isset($cartRules[$rule->getId()])) {
@@ -131,10 +139,11 @@ public function calculate($rule, $item, $qty)
131139
$ruleDiscount,
132140
$qty,
133141
$baseItemPrice,
134-
0,
135-
$baseRuleTotals,
142+
$baseItemDiscountAmount,
143+
$baseRuleTotals - $rule->getExistingDiscounts(),
136144
$discountType
137145
);
146+
138147
}
139148
$discountAmount = $this->priceCurrency->convert($baseDiscountAmount, $store);
140149
$baseDiscountAmount = min($baseItemPrice * $qty, $baseDiscountAmount);

app/code/Magento/SalesRule/Model/Validator.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,7 @@ public function initTotals($items, Address $address)
576576
$ruleTotalBaseItemsDiscountAmount = 0;
577577
$validItemsCount = 0;
578578

579+
$affectedItems = [];
579580
/** @var Quote\Item $item */
580581
foreach ($items as $item) {
581582
if (!$this->isValidItemForRule($item, $rule)) {
@@ -587,6 +588,7 @@ public function initTotals($items, Address $address)
587588
$ruleTotalItemsDiscountAmount += $item->getDiscountAmount();
588589
$ruleTotalBaseItemsDiscountAmount += $item->getBaseDiscountAmount();
589590
$validItemsCount++;
591+
$affectedItems[] = $item;
590592
}
591593

592594
$this->_rulesItemTotals[$rule->getId()] = [
@@ -595,6 +597,7 @@ public function initTotals($items, Address $address)
595597
'base_items_price' => $ruleTotalBaseItemsPrice,
596598
'base_items_discount_amount' => $ruleTotalBaseItemsDiscountAmount,
597599
'items_count' => $validItemsCount,
600+
'affected_items' => $affectedItems
598601
];
599602
}
600603

0 commit comments

Comments
 (0)