Skip to content

Commit 14a9aa2

Browse files
committed
ACP2E-3332: Issue sales rules with Fixed amount discount and "Maximum Qty Discount is Applied To"
1 parent b34c0a7 commit 14a9aa2

File tree

4 files changed

+44
-28
lines changed

4 files changed

+44
-28
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ public function calculate($rule, $item, $qty)
2727
$itemPrice = $this->validator->getItemPrice($item);
2828
$baseItemPrice = $this->validator->getItemBasePrice($item);
2929

30-
$discountAmountMin = min(($itemPrice * $qty) - $itemDiscountAmount, $discountAmount * $qty);
31-
$baseDiscountAmountMin = min(($baseItemPrice * $qty) - $itemBaseDiscountAmount, $baseDiscountAmount * $qty);
30+
$discountAmountMin = min(($itemPrice * $item->getQty()) - $itemDiscountAmount, $discountAmount * $qty);
31+
$baseDiscountAmountMin =
32+
min(($baseItemPrice * $item->getQty()) - $itemBaseDiscountAmount, $baseDiscountAmount * $qty);
3233

3334
$discountData->setAmount($discountAmountMin);
3435
$discountData->setBaseAmount($baseDiscountAmountMin);

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,9 @@ public function minFix(
147147
$itemDiscountAmount = $item->getDiscountAmount();
148148
$itemBaseDiscountAmount = $item->getBaseDiscountAmount();
149149

150-
$discountAmount = min($itemDiscountAmount + $discountData->getAmount(), $itemPrice * $qty);
151-
$baseDiscountAmount = min($itemBaseDiscountAmount + $discountData->getBaseAmount(), $baseItemPrice * $qty);
150+
$discountAmount = min($itemDiscountAmount + $discountData->getAmount(), $itemPrice * $item->getQty());
151+
$baseDiscountAmount =
152+
min($itemBaseDiscountAmount + $discountData->getBaseAmount(), $baseItemPrice * $item->getQty());
152153

153154
$discountData->setAmount($discountAmount);
154155
$discountData->setBaseAmount($baseDiscountAmount);

app/code/Magento/SalesRule/Test/Unit/Model/Rule/Action/Discount/ByFixedTest.php

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,9 @@ public function testCalculate(
123123
'getQuote',
124124
'getAddress',
125125
'getOptionByCode',
126+
'getQty'
126127
]
127128
)->getMock();
128-
129129
$this->validator->expects(
130130
$this->atLeastOnce()
131131
)->method(
@@ -170,32 +170,12 @@ public function testCalculate(
170170
)->with(
171171
$ruleData['discountAmount'],
172172
$store
173-
)->willReturn(
174-
$validItemData['baseOriginalPrice']
175-
);
176-
177-
$rule->expects(
178-
$this->atLeastOnce()
179-
)->method(
180-
'getDiscountAmount'
181173
)->willReturn(
182174
$ruleData['discountAmount']
183175
);
184176

185-
$item->expects(
186-
$this->atLeastOnce()
187-
)->method(
188-
'getDiscountAmount'
189-
)->willReturn(
190-
$itemData['discountAmount']
191-
);
192-
$item->expects(
193-
$this->atLeastOnce()
194-
)->method(
195-
'getBaseDiscountAmount'
196-
)->willReturn(
197-
$itemData['baseDiscountAmount']
198-
);
177+
$this->setUpMockData($ruleData, $rule);
178+
$this->setUpMockData($itemData, $item);
199179
$item->expects($this->atLeastOnce())->method('getQuote')->willReturn($quote);
200180

201181
$discountData->expects($this->once())->method('setAmount')->with($expectedDiscountData['amount']);
@@ -218,6 +198,22 @@ public function testCalculate(
218198
$this->assertEquals($discountData, $this->model->calculate($rule, $item, $qty));
219199
}
220200

201+
/**
202+
* Sets up mock object data
203+
*
204+
* @param array $data
205+
* @param MockObject $mockObject
206+
* @return void
207+
*/
208+
private function setUpMockData(array $data, MockObject $mockObject): void
209+
{
210+
foreach ($data as $method => $returnValue) {
211+
$mockObject->expects($this->atLeastOnce())
212+
->method('get' . ucfirst($method))
213+
->willReturn($returnValue);
214+
}
215+
}
216+
221217
/**
222218
* @return array
223219
*/
@@ -227,7 +223,7 @@ public function calculateDataProvider()
227223
[
228224
'qty' => 2,
229225
'ruleData' => ['discountAmount' => 100],
230-
'itemData' => ['discountAmount' => 139, 'baseDiscountAmount' => 139],
226+
'itemData' => ['discountAmount' => 139, 'baseDiscountAmount' => 139, 'qty' => 2],
231227
'validItemData' => [
232228
'price' => 139,
233229
'basePrice' => 139,
@@ -240,6 +236,23 @@ public function calculateDataProvider()
240236
'originalAmount' => 0,
241237
'baseOriginalAmount' => 0,
242238
],
239+
],
240+
[
241+
'qty' => 1,
242+
'ruleData' => ['discountAmount' => 1000],
243+
'itemData' => ['discountAmount' => 9100, 'baseDiscountAmount' => 9100, 'qty' => 13],
244+
'validItemData' => [
245+
'price' => 9000,
246+
'basePrice' => 9000,
247+
'originalPrice' => 9000,
248+
'baseOriginalPrice' => 9000,
249+
],
250+
'expectedDiscountData' => [
251+
'amount' => 1000,
252+
'baseAmount' => 1000,
253+
'originalAmount' => 0,
254+
'baseOriginalAmount' => 0,
255+
],
243256
]
244257
];
245258
}

app/code/Magento/SalesRule/Test/Unit/Model/UtilityTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,7 @@ public function testMinFix(): void
426426
$this->getItemBasePrice();
427427
$this->item->setDiscountAmount($amount);
428428
$this->item->setBaseDiscountAmount($baseAmount);
429+
$this->item->setQty($qty);
429430
$discountData = $this->createMock(Data::class);
430431
$discountData->expects($this->atLeastOnce())
431432
->method('getAmount')

0 commit comments

Comments
 (0)