/**
  * 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;
 }
Exemple #2
0
 /**
  * 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;
 }