• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/discountbase.php
  • Класс: BitrixSaleDiscountBase
  • Вызов: DiscountBase::roundChangedBasketPrices
protected function roundChangedBasketPrices()
{
	$basketCodeList = array();
	$applyBlock = $this->discountResult['APPLY_BLOCKS'][$this->discountResultCounter];
	switch ($this->getUseMode())
	{
		case self::USE_MODE_APPLY:
			if (!empty($applyBlock['BASKET']))
			{
				foreach (array_keys($applyBlock['BASKET']) as $basketCode)
				{
					$basketCodeList[$basketCode] = $basketCode;
				}
				unset($basketCode);
			}
			if (!empty($applyBlock['ORDER']))
			{
				foreach ($applyBlock['ORDER'] as $discount)
				{
					if (empty($discount['RESULT']['BASKET']))
						continue;
					foreach (array_keys($discount['RESULT']['BASKET']) as $basketCode)
					{
						$basketCodeList[$basketCode] = $basketCode;
					}
				}
				unset($basketCode, $discount);
			}
			break;
		case self::USE_MODE_MIXED:
			if (!empty($applyBlock['BASKET']))
			{
				foreach (array_keys($applyBlock['BASKET']) as $basketCode)
				{
					$basketCodeList[$basketCode] = $basketCode;
				}
				unset($basketCode);
			}
			if (!empty($applyBlock['ORDER']))
			{
				foreach ($applyBlock['ORDER'] as $discount)
				{
					if (empty($discount['RESULT']['BASKET']))
						continue;
					foreach (array_keys($discount['RESULT']['BASKET']) as $basketCode)
					{
						$basketCodeList[$basketCode] = $basketCode;
					}
				}
				unset($basketCode, $discount);
			}
			foreach ($this->getBasketCodes(true) as $basketCode)
				$basketCodeList[$basketCode] = $basketCode;
			break;
	}

	if (!empty($basketCodeList))
	{
		$roundBlock = &$this->discountResult['APPLY_BLOCKS'][$this->discountResultCounter]['BASKET_ROUND'];
		$orderData = $this->orderData;
		unset($orderData['BASKET_ITEMS']);
		$basket = array_intersect_key(
			$this->orderData['BASKET_ITEMS'],
			array_fill_keys($basketCodeList, true)
		);

		/** @var OrderDiscount $storageClassName */
		$storageClassName = $this->getOrderDiscountClassName();

		$result = $storageClassName::roundBasket(
			$basket,
			array(),
			$orderData
		);

		foreach ($result as $basketCode => $roundResult)
		{
			if (empty($roundResult) || !is_array($roundResult))
				continue;
			if (!$this->isExistBasketItem($basketCode))
				continue;
			$this->orderData['BASKET_ITEMS'][$basketCode]['PRICE'] = $roundResult['PRICE'];
			$this->orderData['BASKET_ITEMS'][$basketCode]['DISCOUNT_PRICE'] = $roundResult['DISCOUNT_PRICE'];

			$roundBlock[$basketCode] = array(
				'APPLY' => 'Y',
				'ROUND_RULE' => $roundResult['ROUND_RULE']
			);
		}
		unset($basketCode, $roundResult, $result);
		unset($storageClassName);
		unset($basket, $orderData);
		unset($roundBlock);
	}
	unset($basketCodeList);
}