/** * Apply rules to current order item * * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item * @param \Magento\SalesRule\Model\Resource\Rule\Collection $rules * @param bool $skipValidation * @param mixed $couponCode * @return array * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function applyRules($item, $rules, $skipValidation, $couponCode) { $address = $item->getAddress(); $appliedRuleIds = []; /* @var $rule \Magento\SalesRule\Model\Rule */ foreach ($rules as $rule) { if (!$this->validatorUtility->canProcessRule($rule, $address)) { continue; } if (!$skipValidation && !$rule->getActions()->validate($item)) { $childItems = $item->getChildren(); $isContinue = true; if (!empty($childItems)) { foreach ($childItems as $childItem) { if ($rule->getActions()->validate($childItem)) { $isContinue = false; } } } if ($isContinue) { continue; } } $this->applyRule($item, $rule, $address, $couponCode); $appliedRuleIds[$rule->getRuleId()] = $rule->getRuleId(); if ($rule->getStopRulesProcessing()) { break; } } return $appliedRuleIds; }
/** * 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; }
/** * Apply rules to current order item * * @param \Magento\Sales\Model\Quote\Item\AbstractItem $item * @param \Magento\SalesRule\Model\Resource\Rule\Collection $rules * @param bool $skipValidation * @param mixed $couponCode * @return array */ public function applyRules($item, $rules, $skipValidation, $couponCode) { $address = $item->getAddress(); $appliedRuleIds = array(); /* @var $rule \Magento\SalesRule\Model\Rule */ foreach ($rules as $rule) { if (!$this->validatorUtility->canProcessRule($rule, $address)) { continue; } if (!$skipValidation && !$rule->getActions()->validate($item)) { continue; } $this->applyRule($item, $rule, $address, $couponCode); $appliedRuleIds[$rule->getRuleId()] = $rule->getRuleId(); if ($rule->getStopRulesProcessing()) { break; } } return $appliedRuleIds; }
/** * Quote does not meet rule's conditions */ public function testCanProcessRule() { $this->rule->setCouponType(\Magento\SalesRule\Model\Rule::COUPON_TYPE_NO_COUPON); $this->rule->expects($this->once())->method('validate')->will($this->returnValue(true)); $this->assertTrue($this->utility->canProcessRule($this->rule, $this->address)); }