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