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