- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/providerbase.php
- Класс: BitrixSaleProviderBase
- Вызов: ProviderBase::tryReserveBasketItem
static function tryReserveBasketItem(BasketItem $basketItem, $quantity)
{
$result = new Result();
$provider = $basketItem->getProvider();
if (!$basketItem->isBundleChild())
{
/** @var Basket $basket */
$basket = $basketItem->getCollection();
}
else
{
/** @var BasketItem $parentBasketItem */
$parentBasketItem = $basketItem->getParentBasketItem();
/** @var Basket $basket */
$basket = $parentBasketItem->getCollection();
}
$order = $basket->getOrder();
$hasProvider = false;
$quantityTrace = null;
$poolQuantity = static::getReservationPoolItem($order->getInternalId(), $basketItem);
$tryQuantity = $quantity + $poolQuantity;
if ($provider && array_key_exists("IBXSaleProductProvider", class_implements($provider)))
{
$hasProvider = true;
$r = static::checkAvailableProductQuantity($basketItem, $tryQuantity);
$availableQuantityData = $r->getData();
if (array_key_exists('AVAILABLE_QUANTITY', $availableQuantityData))
{
$availableQuantity = floatval($availableQuantityData['AVAILABLE_QUANTITY']);
}
else
{
$result->addWarning(new ResultWarning(Loc::getMessage('SALE_PROVIDER_BASKET_ITEM_WRONG_AVAILABLE_QUANTITY', array(
'#PRODUCT_NAME#' => $basketItem->getField('NAME')
)), 'PROVIDER_BASKET_ITEM_WRONG_AVAILABLE_QUANTITY'));
return $result;
}
if (array_key_exists('QUANTITY_TRACE', $availableQuantityData))
{
$quantityTrace = $availableQuantityData['QUANTITY_TRACE'];
}
if (!$r->isSuccess())
{
$result->addErrors($r->getErrors());
}
elseif ($r->hasWarnings())
{
$result->addWarnings($r->getWarnings());
}
$availableQuantity -= floatval($poolQuantity);
}
else
{
$availableQuantity = $quantity;
}
$fields = array(
'AVAILABLE_QUANTITY' => $availableQuantity,
'HAS_PROVIDER' => $hasProvider,
);
if ($quantityTrace !== null)
{
$fields['QUANTITY_TRACE'] = $quantityTrace;
}
$result->setData($fields);
return $result;
}