• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/discountbase.php
  • Класс: BitrixSaleDiscountBase
  • Вызов: DiscountBase::getShowPrices
public function getShowPrices()
{
	if (!$this->isOrderNew() && !$this->isLoaded())
	{
		$this->initUseMode();
		$this->loadOrderData();
	}

	$result = [
		'BASKET' => []
	];

	$checkRound = true;
	$useMode = $this->getUseMode();
	switch ($useMode)
	{
		case self::USE_MODE_APPLY:
		case self::USE_MODE_MIXED:
			if (!$this->isValidState())
				$checkRound = false;
			break;
	}

	if (!empty($this->orderData['BASKET_ITEMS']))
	{
		/** @var OrderDiscount $storageClassName */
		$storageClassName = $this->getOrderDiscountClassName();

		$basket = $this->orderData['BASKET_ITEMS'];
		$order = $this->orderData;
		unset($order['BASKET_ITEMS']);

		switch ($useMode)
		{
			case self::USE_MODE_FULL:
			case self::USE_MODE_APPLY:
				if ($checkRound)
				{
					$basketCodeList = $this->getBasketCodes(true);
					$existRound = array();
					$existRoundRules = array();
					foreach ($basketCodeList as $basketCode)
					{
						if (!empty($this->basketItemsData[$basketCode]['BASE_PRICE_ROUND_RULE']))
						{
							$existRound[$basketCode] = self::resetBasketItemPrice($basket[$basketCode]);
							$existRoundRules[$basketCode] = $this->basketItemsData[$basketCode]['BASE_PRICE_ROUND_RULE'];
						}
					}
					if (!empty($existRound))
					{
						$roundResult = $storageClassName::roundBasket(
							$existRound,
							$existRoundRules,
							$order
						);
						foreach ($roundResult as $basketCode => $row)
						{
							if (empty($row) || !is_array($row))
								continue;
							if (!isset($existRound[$basketCode]))
								continue;
							$basket[$basketCode]['BASE_PRICE'] = $row['PRICE'];
							$basket[$basketCode]['DISCOUNT_PRICE'] = $basket[$basketCode]['BASE_PRICE'] - $basket[$basketCode]['PRICE'];
						}
					}
					unset($existRoundRules, $existRound);
				}
				break;
			case self::USE_MODE_MIXED:
				if ($checkRound)
				{
					$existRound = array();
					$existRoundRules = array();
					foreach ($basket as $basketCode => $item)
					{
						if ($this->isFreezedBasketItem($item))
							continue;
						if (!empty($this->basketItemsData[$basketCode]['BASE_PRICE_ROUND_RULE']))
						{
							$existRound[$basketCode] = self::resetBasketItemPrice($basket[$basketCode]);
							$existRoundRules[$basketCode] = $this->basketItemsData[$basketCode]['BASE_PRICE_ROUND_RULE'];
						}
					}
					unset($code, $item);
					if (!empty($existRound))
					{
						$roundResult = $storageClassName::roundBasket(
							$existRound,
							$existRoundRules,
							$order
						);
						foreach ($roundResult as $basketCode => $row)
						{
							if (empty($row) || !is_array($row))
								continue;
							if (!isset($existRound[$basketCode]))
								continue;
							$basket[$basketCode]['BASE_PRICE'] = $row['PRICE'];
							$basket[$basketCode]['DISCOUNT_PRICE'] = $basket[$basketCode]['BASE_PRICE'] - $basket[$basketCode]['PRICE'];
						}
					}
					unset($existRoundRules, $existRound);
				}
				break;
		}

		foreach ($basket as $basketCode => $basketItem)
		{
			$result['BASKET'][$basketCode] = $this->getShowBasketItemPrice($basketCode, $basketItem);
			$result['BASKET'][$basketCode]['REAL_BASE_PRICE'] = $this->orderData['BASKET_ITEMS'][$basketCode]['BASE_PRICE'];
			$result['BASKET'][$basketCode]['REAL_PRICE'] = $this->orderData['BASKET_ITEMS'][$basketCode]['PRICE'];
			$result['BASKET'][$basketCode]['REAL_DISCOUNT'] = $this->orderData['BASKET_ITEMS'][$basketCode]['DISCOUNT_PRICE'];
		}
		unset($basketCode, $basketItem);
	}

	return $result;
}