Skip to content

Commit 863772d

Browse files
authored
ENGCOM-6824: #26622 - Check quote item for parentItem instead of parentItemId #26623
2 parents c61a2c6 + 6d0081d commit 863772d

File tree

2 files changed

+43
-12
lines changed

2 files changed

+43
-12
lines changed

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

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -383,13 +383,7 @@ public function initTotals($items, Address $address)
383383

384384
foreach ($items as $item) {
385385
//Skipping child items to avoid double calculations
386-
if ($item->getParentItemId()) {
387-
continue;
388-
}
389-
if (!$rule->getActions()->validate($item)) {
390-
continue;
391-
}
392-
if (!$this->canApplyDiscount($item)) {
386+
if (!$this->isValidItemForRule($item, $rule)) {
393387
continue;
394388
}
395389
$qty = $this->validatorUtility->getItemQty($item, $rule);
@@ -409,6 +403,30 @@ public function initTotals($items, Address $address)
409403
return $this;
410404
}
411405

406+
/**
407+
* Determine if quote item is valid for a given sales rule
408+
*
409+
* @param AbstractItem $item
410+
* @param Rule $rule
411+
* @return bool
412+
*/
413+
private function isValidItemForRule(AbstractItem $item, Rule $rule)
414+
{
415+
if ($item->getParentItemId()) {
416+
return false;
417+
}
418+
if ($item->getParentItem()) {
419+
return false;
420+
}
421+
if (!$rule->getActions()->validate($item)) {
422+
return false;
423+
}
424+
if (!$this->canApplyDiscount($item)) {
425+
return false;
426+
}
427+
return true;
428+
}
429+
412430
/**
413431
* Return item price
414432
*

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

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
use PHPUnit\Framework\MockObject\MockObject;
1414

1515
/**
16-
* Class ValidatorTest
16+
* Tests for Magento\SalesRule\Model\Validator
1717
* @@SuppressWarnings(PHPMD.CouplingBetweenObjects)
1818
*/
1919
class ValidatorTest extends \PHPUnit\Framework\TestCase
@@ -346,11 +346,14 @@ public function testInitTotalsCanApplyDiscount()
346346
'getDiscountCalculationPrice',
347347
'getBaseDiscountCalculationPrice',
348348
'getCalculationPrice',
349-
'getParentItemId'
349+
'getParentItemId',
350+
'getParentItem'
350351
]
351352
);
352353
$item2 = clone $item1;
353-
$items = [$item1, $item2];
354+
$item3 = clone $item1;
355+
$item4 = clone $item1;
356+
$items = [$item1, $item2, $item3, $item4];
354357

355358
$rule->expects($this->any())
356359
->method('getSimpleAction')
@@ -367,12 +370,22 @@ public function testInitTotalsCanApplyDiscount()
367370
$validator->expects($this->at(0))->method('isValid')->with($item1)->willReturn(false);
368371
$validator->expects($this->at(1))->method('isValid')->with($item2)->willReturn(true);
369372

370-
$item1->expects($this->any())->method('getParentItemId')->willReturn(false);
373+
$item1->expects($this->any())->method('getParentItemId')->willReturn(null);
374+
$item1->expects($this->any())->method('getParentItem')->willReturn(null);
371375
$item1->expects($this->never())->method('getDiscountCalculationPrice');
372376
$item1->expects($this->never())->method('getBaseDiscountCalculationPrice');
373-
$item2->expects($this->any())->method('getParentItemId')->willReturn(false);
377+
$item2->expects($this->any())->method('getParentItemId')->willReturn(null);
378+
$item2->expects($this->any())->method('getParentItem')->willReturn(null);
374379
$item2->expects($this->any())->method('getDiscountCalculationPrice')->willReturn(50);
375380
$item2->expects($this->once())->method('getBaseDiscountCalculationPrice')->willReturn(50);
381+
$item3->expects($this->any())->method('getParentItemId')->willReturn(null);
382+
$item3->expects($this->any())->method('getParentItem')->willReturn($item1);
383+
$item3->expects($this->never())->method('getDiscountCalculationPrice');
384+
$item3->expects($this->never())->method('getBaseDiscountCalculationPrice');
385+
$item4->expects($this->any())->method('getParentItemId')->willReturn(12345);
386+
$item4->expects($this->any())->method('getParentItem')->willReturn(null);
387+
$item4->expects($this->never())->method('getDiscountCalculationPrice');
388+
$item4->expects($this->never())->method('getBaseDiscountCalculationPrice');
376389
$this->utility->expects($this->once())->method('getItemQty')->willReturn(1);
377390
$this->utility->expects($this->any())->method('canProcessRule')->willReturn(true);
378391

0 commit comments

Comments
 (0)