/** * Initialization discount save information. * * @param int $mode Discount manager mode. * @param array $config Initial params (site, currency, order). * @return void */ public static function init($mode = self::MODE_CLIENT, $config = array()) { if (self::$init) { return; } self::clearErrors(); self::initUseMode($mode, $config); if (!self::isSuccess()) { return; } self::$basketBasePrice = array(); self::$basketDiscountList = array(); self::$useCompatible = true; Sale\OrderDiscountManager::setManagerConfig(self::$config); self::$saved = false; self::$init = true; }
/** * Calculate discounts. * * @return Result * @throws Main\ArgumentNullException */ public function calculate() { /** @var Result $result */ $result = new Result(); $process = true; $this->discountsCache = array(); $this->couponsCache = array(); $order = $this->getOrder(); if ($order === null) { throw new Main\ArgumentNullException('order'); } $orderId = (int) $order->getId(); if ($this->newOrder === null) { $this->newOrder = $orderId <= 0; } if (!$order->isNotEmptyBasket()) { return $result; } if ($order->isExternal()) { return $result; } if (Compatible\DiscountCompatibility::isUsed()) { return $result; } if ($this->newOrder) { $this->setUseMode(self::USE_MODE_FULL); } else { $orderMode = $order->getCalculateType(); /* if ($orderMode == Order::SALE_ORDER_CALC_TYPE_REFRESH) $this->setUseMode(self::USE_MODE_FULL); elseif ($this->isMixedBasket()) $this->setUseMode(self::USE_MODE_MIXED); else $this->setUseMode(self::USE_MODE_APPLY); */ if ($orderMode == Order::SALE_ORDER_CALC_TYPE_REFRESH || $this->isMixedBasket()) { $this->setUseMode(self::USE_MODE_FULL); } else { $this->setUseMode(self::USE_MODE_APPLY); } } $this->fillEmptyOrderData($order); $orderResult = $this->loadOrderData(); if (!$orderResult->isSuccess()) { $process = false; $result->addErrors($orderResult->getErrors()); } unset($orderResult); OrderDiscountManager::setManagerConfig(array('SITE_ID' => $order->getSiteId(), 'CURRENCY' => $order->getCurrency())); if ($process) { $this->resetBasketPrices(); switch ($this->getUseMode()) { case self::USE_MODE_APPLY: $calculateResult = $this->calculateApply(); break; case self::USE_MODE_MIXED: $calculateResult = $this->calculateMixed(); break; case self::USE_MODE_FULL: $calculateResult = $this->calculateFull(); break; default: $calculateResult = new Result(); $calculateResult->addError(new Main\Entity\EntityError(Loc::getMessage('BX_SALE_DISCOUNT_ERR_BAD_USE_MODE'), self::ERROR_ID)); break; } if (!$calculateResult->isSuccess()) { $result->addErrors($calculateResult->getErrors()); } else { $result->setData($this->fillDiscountResult()); } unset($calculateResult); } return $result; }