• Модуль: catalog
  • Путь к файлу: ~/bitrix/modules/catalog/lib/discount/discountmanager.php
  • Класс: BitrixCatalogDiscountDiscountManager
  • Вызов: DiscountManager::roundBasket
static function roundBasket(array $basket, array $basketRoundData = [], array $order = []): array
{
	if (empty($basket))
		return [];

	$result = [];
	$basket = array_filter($basket, 'BitrixCatalogDiscountDiscountManager::basketFilter');
	if (!empty($basket))
	{
		$priceTypes = [];
		$loadPriceId = [];
		$loadBasketCodes = [];
		foreach ($basket as $basketCode => $basketItem)
		{
			if (!empty($basketRoundData[$basketCode]))
				continue;
			$priceTypeId = 0;
			if (isset($basketItem['PRICE_TYPE_ID']))
				$priceTypeId = (int)$basketItem['PRICE_TYPE_ID'];
			if ($priceTypeId <= 0 && isset($basketItem['CATALOG_GROUP_ID']))
				$priceTypeId = (int)$basketItem['CATALOG_GROUP_ID'];
			if ($priceTypeId <= 0 && isset($basketItem['PRODUCT_PRICE_ID']))
			{
				$priceId = (int)$basketItem['PRODUCT_PRICE_ID'];
				if ($priceId > 0)
				{
					$cachedPrice = self::getPriceDataByPriceId($priceId);
					if (!empty($cachedPrice))
						$priceTypeId = (int)$cachedPrice['CATALOG_GROUP_ID'];
					if ($priceTypeId <= 0)
					{
						$loadPriceId[] = $priceId;
						$loadBasketCodes[$priceId] = $basketCode;
					}
				}
			}

			$basket[$basketCode]['PRICE_TYPE_ID'] = $priceTypeId;
			if ($priceTypeId > 0)
				$priceTypes[$priceTypeId] = $priceTypeId;

		}
		unset($priceId, $priceTypeId, $basketCode, $basketItem);

		if (!empty($loadPriceId))
		{
			sort($loadPriceId);
			foreach (array_chunk($loadPriceId, 500) as $pageIds)
			{
				$iterator = CatalogPriceTable::getList([
					'select' => ['ID', 'CATALOG_GROUP_ID'],
					'filter' => ['@ID' => $pageIds]
				]);
				while ($row = $iterator->fetch())
				{
					$id = (int)$row['ID'];
					$priceTypeId = (int)$row['CATALOG_GROUP_ID'];
					if (!isset($loadBasketCodes[$id]))
						continue;
					$basket[$loadBasketCodes[$id]]['PRICE_TYPE_ID'] = $priceTypeId;
					$priceTypes[$priceTypeId] = $priceTypeId;
				}
				unset($priceTypeId, $id, $row, $iterator);
			}
		}
		unset($loadBasketCodes, $loadPriceId);

		if (!empty($priceTypes))
			CatalogProductPrice::loadRoundRules($priceTypes);
		unset($priceTypes);

		foreach ($basket as $basketCode => $basketItem)
		{
			if (!empty($basketRoundData[$basketCode]))
			{
				$roundData = $basketRoundData[$basketCode];
			}
			else
			{
				$roundData = CatalogProductPrice::searchRoundRule(
					$basketItem['PRICE_TYPE_ID'],
					$basketItem['PRICE'],
					$basketItem['CURRENCY']
				);
			}

			if (empty($roundData))
			{
				continue;
			}

			$result[$basketCode] = self::getRoundResult($basketItem, $roundData);
		}
		unset($roundData, $basketCode, $basketItem, $basketRoundData);
	}
	unset($basket);

	return $result;
}