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

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

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

	if (!empty($this->discountResult['APPLY_BLOCKS']))
	{
		DiscountActions::setUseMode(
			DiscountActions::MODE_MANUAL,
			array(
				'USE_BASE_PRICE' => $this->saleOptions['USE_BASE_PRICE'],
				'SITE_ID' => $this->orderData['SITE_ID'],
				'CURRENCY' => $this->orderData['CURRENCY']
			)
		);

		$currentCounter = $this->discountResultCounter;

		foreach (array_keys($this->discountResult['APPLY_BLOCKS']) as $counter)
		{
			$this->discountResultCounter = $counter;
			$blockResult = $this->calculateApplyDiscountBlock();
			if (!$blockResult->isSuccess())
			{
				$result->addErrors($blockResult->getErrors());
				unset($blockResult);

				return $result;
			}
			unset($blockResult);
		}

		$this->discountResultCounter = $currentCounter;
		unset($currentCounter);
	}

	if ($result->isSuccess())
	{
		DiscountActions::setUseMode(
			DiscountActions::MODE_CALCULATE,
			array(
				'USE_BASE_PRICE' => $this->saleOptions['USE_BASE_PRICE'],
				'SITE_ID' => $this->orderData['SITE_ID'],
				'CURRENCY' => $this->orderData['CURRENCY']
			)
		);

		$this->clearCurrentApplyBlock();

		$this->getRoundForBasePrices();
		$this->checkBasketDiscounts();

		$basketDiscountResult = $this->calculateFullBasketDiscount();
		if (!$basketDiscountResult->isSuccess())
		{
			$result->addErrors($basketDiscountResult->getErrors());
			unset($basketDiscountResult);
			return $result;
		}
		unset($basketDiscountResult);

		if ($this->isRoundMode(self::ROUND_MODE_BASKET_DISCOUNT))
			$this->roundFullBasketPrices();

		$couponsResult = $this->calculateApplyAdditionalCoupons();
		if (!$couponsResult->isSuccess())
		{
			$result->addErrors($couponsResult->getErrors());
			unset($couponsResult);
			return $result;
		}
		unset($couponsResult);

		if ($this->isRoundMode(self::ROUND_MODE_FINAL_PRICE))
			$this->roundChangedBasketPrices();
	}

	return $result;
}