- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/internals/catalog/provider.php
- Класс: BitrixSaleInternalsCatalogProvider
- Вызов: Provider::tryReserve
static function tryReserve(SaleReserveQuantity $reserveQuantity, array $context = array())
{
$result = new SaleResult();
$basketItem = $reserveQuantity->getCollection()->getBasketItem();
$order = $basketItem->getBasket()->getOrder();
$context = self::prepareContext($order, $context);
$r = self::checkContext($context);
if (!$r->isSuccess())
{
return $r;
}
$creator = SaleInternalsProviderCreator::create($context);
$productData = $creator->createItemForReserve($reserveQuantity);
$creator->addProductData($productData);
$availableQuantityList = [];
$r = $creator->getAvailableQuantityByStore();
if ($r->isSuccess())
{
$data = $r->getData();
if (array_key_exists('AVAILABLE_QUANTITY_LIST_BY_STORE', $data))
{
$availableQuantityList = $data['AVAILABLE_QUANTITY_LIST_BY_STORE'];
}
}
else
{
return $result->addErrors($r->getErrors());
}
if ($r->hasWarnings())
{
$result->addWarnings($r->getWarnings());
}
$pool = PoolQuantity::getInstance($order->getInternalId());
$providerName = $basketItem->getProviderName();
$providerName = self::clearProviderName($providerName);
$storeId = $reserveQuantity->getStoreId();
$availableQuantity = $availableQuantityList[$providerName][$basketItem->getProductId()][$storeId] ?? 0;
if ($availableQuantity < $productData['QUANTITY'])
{
$result->addError(
new SaleResultError(
MainLocalizationLoc::getMessage('SALE_PROVIDER_RESERVE_WRONG_AVAILABLE_QUANTITY'),
'SALE_PROVIDER_RESERVE_WRONG_AVAILABLE_QUANTITY'
)
);
}
else
{
$pool->addByStore(
SaleInternalsPoolQuantity::POOL_RESERVE_TYPE,
$basketItem->getProductId(),
$storeId,
$productData['QUANTITY']
);
$foundItem = false;
$poolItems = SaleInternalsItemsPool::get($order->getInternalId(), $basketItem->getProductId());
if (!empty($poolItems))
{
foreach ($poolItems as $poolItem)
{
if (
$poolItem instanceof SaleReserveQuantity
&& $poolItem->getInternalIndex() === $reserveQuantity->getInternalIndex()
&& $poolItem->getCollection()->getBasketItem()->getInternalIndex() === $reserveQuantity->getCollection()->getBasketItem()->getInternalIndex()
)
{
$foundItem = true;
break;
}
}
}
if (!$foundItem)
{
SaleInternalsItemsPool::add(
$order->getInternalId(),
$basketItem->getProductId(),
$reserveQuantity
);
}
}
return $result;
}