Skip to content

Commit 98e1d32

Browse files
committed
ACP2E-3403: Cart Price Rules Miscalculating Discount
1 parent 49e2003 commit 98e1d32

File tree

3 files changed

+8
-10
lines changed

3 files changed

+8
-10
lines changed

app/code/Magento/Quote/Model/Quote/Item/AbstractItem.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -678,9 +678,7 @@ public function getTotalDiscountAmount()
678678
foreach ($children as $child) {
679679
$totalDiscountAmount += $child->getDiscountAmount();
680680
}
681-
} else {
682-
$totalDiscountAmount = $this->getDiscountAmount();
683681
}
684-
return $totalDiscountAmount;
682+
return $totalDiscountAmount + $this->getDiscountAmount();
685683
}
686684
}

app/code/Magento/SalesRule/Model/Quote/Discount.php

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -221,15 +221,12 @@ public function collect(
221221
unset($itemsToApplyRules[$key]);
222222
}
223223

224-
if ($item->getChildren() && $item->isChildrenCalculated()) {
225-
$childTotal = 0;
226-
foreach ($item->getChildren() as $child) {
227-
$childTotal += $child->getBaseDiscountAmount();
224+
if (($children = $item->getChildren()) && $item->isChildrenCalculated()) {
225+
foreach ($children as $child) {
226+
$totalDiscount[$child->getId()] = $child->getBaseDiscountAmount();
228227
}
229-
$totalDiscount[$item->getId()] = $childTotal;
230-
} else {
231-
$totalDiscount[$item->getId()] = $item->getBaseDiscountAmount();
232228
}
229+
$totalDiscount[$item->getId()] = $item->getBaseDiscountAmount();
233230
}
234231
$address->setBaseDiscountAmount(array_sum(array_values($totalDiscount)));
235232
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,9 @@ public function calculate($rule, $item, $qty)
141141
$baseDiscountAmount = min($baseItemPrice * $qty, $baseDiscountAmount);
142142
if ($ruleItemsCount <= 1) {
143143
$this->deltaPriceRound->reset($discountType);
144+
if ($baseDiscountAmount > $availableDiscountAmount) {
145+
$baseDiscountAmount = $availableDiscountAmount;
146+
}
144147
} else {
145148
$this->validator->decrementRuleItemTotalsCount($rule->getId());
146149
}

0 commit comments

Comments
 (0)