/** * Calculate quote totals for each rule and save results * * @param mixed $items * @param Address $address * @return $this */ public function initTotals($items, Address $address) { $address->setCartFixedRules(array()); if (!$items) { return $this; } /** @var \Magento\SalesRule\Model\Rule $rule */ foreach ($this->_getRules() as $rule) { if (\Magento\SalesRule\Model\Rule::CART_FIXED_ACTION == $rule->getSimpleAction() && $this->validatorUtility->canProcessRule($rule, $address)) { $ruleTotalItemsPrice = 0; $ruleTotalBaseItemsPrice = 0; $validItemsCount = 0; foreach ($items as $item) { //Skipping child items to avoid double calculations if ($item->getParentItemId()) { continue; } if (!$rule->getActions()->validate($item)) { continue; } if (!$this->canApplyDiscount($item)) { continue; } $qty = $this->validatorUtility->getItemQty($item, $rule); $ruleTotalItemsPrice += $this->getItemPrice($item) * $qty; $ruleTotalBaseItemsPrice += $this->getItemBasePrice($item) * $qty; $validItemsCount++; } $this->_rulesItemTotals[$rule->getId()] = array('items_price' => $ruleTotalItemsPrice, 'base_items_price' => $ruleTotalBaseItemsPrice, 'items_count' => $validItemsCount); } } return $this; }
/** * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item * @param int[] $appliedRuleIds * @return $this */ public function setAppliedRuleIds(\Magento\Quote\Model\Quote\Item\AbstractItem $item, array $appliedRuleIds) { $address = $item->getAddress(); $quote = $item->getQuote(); $item->setAppliedRuleIds(join(',', $appliedRuleIds)); $address->setAppliedRuleIds($this->validatorUtility->mergeIds($address->getAppliedRuleIds(), $appliedRuleIds)); $quote->setAppliedRuleIds($this->validatorUtility->mergeIds($quote->getAppliedRuleIds(), $appliedRuleIds)); return $this; }
public function testReset() { $this->utility->expects($this->once())->method('resetRoundingDeltas'); $quoteMock = $this->getMockBuilder('Magento\\Sales\\Model\\Quote')->disableOriginalConstructor()->getMock(); $addressMock = $this->getMockBuilder('Magento\\Sales\\Model\\Quote\\Address')->disableOriginalConstructor()->getMock(); $addressMock->expects($this->once())->method('getQuote')->willReturn($quoteMock); $this->model->init($this->model->getWebsiteId(), $this->model->getCustomerGroupId(), $this->model->getCouponCode()); $this->assertInstanceOf('\\Magento\\SalesRule\\Model\\Validator', $this->model->reset($addressMock)); }
protected function applyRule($item, $rule) { $qty = 2; $discountCalc = $this->getMock('Magento\\SalesRule\\Model\\Rule\\Action\\Discount', ['fixQuantity', 'calculate'], [], '', false); $discountData = $this->getMock('Magento\\SalesRule\\Model\\Rule\\Action\\Discount\\Data', [], ['amount' => 30, 'baseAmount' => 30, 'originalAmount' => 30, 'baseOriginalAmount' => 30], '', false); $this->validatorUtility->expects($this->any())->method('getItemQty')->with($this->anything(), $this->anything())->will($this->returnValue($qty)); $discountCalc->expects($this->any())->method('fixQuantity')->with($this->equalTo($qty), $this->equalTo($rule))->will($this->returnValue($qty)); $discountCalc->expects($this->any())->method('calculate')->with($this->equalTo($rule), $this->equalTo($item), $this->equalTo($qty))->will($this->returnValue($discountData)); $this->calculatorFactory->expects($this->any())->method('create')->with($this->anything())->will($this->returnValue($discountCalc)); }
public function testResetRoundingDeltas() { $this->assertNull($this->utility->resetRoundingDeltas()); }