• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/discountbase.php
  • Класс: BitrixSaleDiscountBase
  • Вызов: DiscountBase::calculate
public function calculate()
{
	/** @var Result $result */
	$result = new Result;
	$process = true;

	if ($this->stopCalculate())
		return $result;

	$this->discountsCache = array();
	$this->couponsCache = array();

	if (CompatibleDiscountCompatibility::isUsed())
		return $result;

	$this->initUseMode();

	/** @var DiscountCouponsManager $couponClassName */
	$couponClassName = $this->getDiscountCouponClassName();
	if ($this->isOrderExists() && !$this->isOrderNew())
	{
		if ($this->isOrderRefresh())
		{
			$this->setApplyResult(array());
			$couponClassName::useSavedCouponsForApply(true);
		}
	}

	$this->orderData = null;
	$orderResult = $this->loadOrderData();
	if (!$orderResult->isSuccess())
	{
		$process = false;
		$result->addErrors($orderResult->getErrors());
	}
	unset($orderResult);

	if (!$this->isValidState())
		return $result;

	if ($process)
	{
		$couponClassName::setUseOnlySaleDiscounts($this->useOnlySaleDiscounts());
		unset($couponClassName);

		$this->resetOrderState();
		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 MainEntityEntityError(
					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;
}