Skip to content

Commit be20add

Browse files
Merge remote-tracking branch 'origin/MC-34733' into 2.3-develop-pr52
2 parents a10b7be + 26e2c3c commit be20add

File tree

2 files changed

+42
-11
lines changed

2 files changed

+42
-11
lines changed

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

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

439439
foreach ($items as $item) {
440440
//Skipping child items to avoid double calculations
441-
if ($item->getParentItemId()) {
442-
continue;
443-
}
444-
if (!$rule->getActions()->validate($item)) {
445-
continue;
446-
}
447-
if (!$this->canApplyDiscount($item)) {
441+
if (!$this->isValidItemForRule($item, $rule)) {
448442
continue;
449443
}
450444
$qty = $this->validatorUtility->getItemQty($item, $rule);
@@ -464,6 +458,30 @@ public function initTotals($items, Address $address)
464458
return $this;
465459
}
466460

461+
/**
462+
* Determine if quote item is valid for a given sales rule
463+
*
464+
* @param AbstractItem $item
465+
* @param Rule $rule
466+
* @return bool
467+
*/
468+
private function isValidItemForRule(AbstractItem $item, Rule $rule)
469+
{
470+
if ($item->getParentItemId()) {
471+
return false;
472+
}
473+
if ($item->getParentItem()) {
474+
return false;
475+
}
476+
if (!$rule->getActions()->validate($item)) {
477+
return false;
478+
}
479+
if (!$this->canApplyDiscount($item)) {
480+
return false;
481+
}
482+
return true;
483+
}
484+
467485
/**
468486
* Return item price
469487
*

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

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -386,11 +386,14 @@ public function testInitTotalsCanApplyDiscount()
386386
'getDiscountCalculationPrice',
387387
'getBaseDiscountCalculationPrice',
388388
'getCalculationPrice',
389-
'getParentItemId'
389+
'getParentItemId',
390+
'getParentItem'
390391
]
391392
);
392393
$item2 = clone $item1;
393-
$items = [$item1, $item2];
394+
$item3 = clone $item1;
395+
$item4 = clone $item1;
396+
$items = [$item1, $item2, $item3, $item4];
394397

395398
$rule->expects($this->any())
396399
->method('getSimpleAction')
@@ -407,12 +410,22 @@ public function testInitTotalsCanApplyDiscount()
407410
$validator->expects($this->at(0))->method('isValid')->with($item1)->willReturn(false);
408411
$validator->expects($this->at(1))->method('isValid')->with($item2)->willReturn(true);
409412

410-
$item1->expects($this->any())->method('getParentItemId')->willReturn(false);
413+
$item1->expects($this->any())->method('getParentItemId')->willReturn(null);
414+
$item1->expects($this->any())->method('getParentItem')->willReturn(null);
411415
$item1->expects($this->never())->method('getDiscountCalculationPrice');
412416
$item1->expects($this->never())->method('getBaseDiscountCalculationPrice');
413-
$item2->expects($this->any())->method('getParentItemId')->willReturn(false);
417+
$item2->expects($this->any())->method('getParentItemId')->willReturn(null);
418+
$item2->expects($this->any())->method('getParentItem')->willReturn(null);
414419
$item2->expects($this->any())->method('getDiscountCalculationPrice')->willReturn(50);
415420
$item2->expects($this->once())->method('getBaseDiscountCalculationPrice')->willReturn(50);
421+
$item3->expects($this->any())->method('getParentItemId')->willReturn(null);
422+
$item3->expects($this->any())->method('getParentItem')->willReturn($item1);
423+
$item3->expects($this->never())->method('getDiscountCalculationPrice');
424+
$item3->expects($this->never())->method('getBaseDiscountCalculationPrice');
425+
$item4->expects($this->any())->method('getParentItemId')->willReturn(12345);
426+
$item4->expects($this->any())->method('getParentItem')->willReturn(null);
427+
$item4->expects($this->never())->method('getDiscountCalculationPrice');
428+
$item4->expects($this->never())->method('getBaseDiscountCalculationPrice');
416429
$this->utility->expects($this->once())->method('getItemQty')->willReturn(1);
417430
$this->utility->expects($this->any())->method('canProcessRule')->willReturn(true);
418431

0 commit comments

Comments
 (0)