- Модуль: 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;
}