• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/providerbase.php
  • Класс: BitrixSaleProviderBase
  • Вызов: ProviderBase::getProductAvailableQuantity
static function getProductAvailableQuantity(Basket $basketCollection, BasketItem $refreshItem = null)
{

	static $proxyProductAvailableQuantity = array();
	$resultList = array();
	$userId = null;

	if (($order = $basketCollection->getOrder()) !== null)
	{
		$userId = $order->getUserId();
	}

	$basketList = static::makeArrayFromBasketCollection($basketCollection, $refreshItem);

	$basketProviderMap = static::createProviderBasketMap($basketList);
	$basketProviderList = static::redistributeToProviders($basketProviderMap);

	$context = array();
	$productsList = array();
	$providerList = array();
	$basketCodeIndex = array();
	if (!empty($basketProviderList))
	{
		foreach ($basketProviderList as $provider => $providerBasketItemList)
		{
			if (array_key_exists("IBXSaleProductProvider", class_implements($provider)))
			{
				foreach ($providerBasketItemList as $providerBasketItemData)
				{

					$proxyProductKey = $providerBasketItemData['PRODUCT_ID']."|".$userId;
					if (!empty($proxyProductAvailableQuantity[$proxyProductKey]) && is_array($proxyProductAvailableQuantity[$proxyProductKey]))
					{
						$resultProductData = $proxyProductAvailableQuantity[$proxyProductKey];
					}
					else
					{
						$resultProductData = $resultProductData = $provider::getProductAvailableQuantity($providerBasketItemData['PRODUCT_ID'], $userId);
						$proxyProductAvailableQuantity[$proxyProductKey] = $resultProductData;
					}


					$basketCode = $providerBasketItemData['BASKET_ITEM']->getBasketCode();
					$resultList[$basketCode] = $resultProductData;
				}
			}
			elseif (class_exists($provider))
			{
				if (empty($context))
				{
					if ($order)
					{
						$context = array(
							'USER_ID' => $order->getUserId(),
							'SITE_ID' => $order->getSiteId(),
							'CURRENCY' => $order->getCurrency(),
						);
					}
					else
					{
						global $USER;
						$context = array(
							'USER_ID' => $USER->getId(),
							'SITE_ID' => SITE_ID,
							'CURRENCY' => CurrencyCurrencyManager::getBaseCurrency(),
						);
					}
				}

				$providerClass = new $provider($context);
				if (!$providerClass instanceof SaleProviderBase)
				{
					continue;
				}

				/** @var BasketItem $basketItem */
				foreach ($providerBasketItemList as $providerBasketItemData)
				{
					$basketItem = $providerBasketItemData['BASKET_ITEM'];

					$productId = $basketItem->getProductId();
					$basketCode = $basketItem->getBasketCode();
					$basketCodeIndex[$productId][] = $basketItem->getBasketCode();

					$providerList[$provider] = $providerClass;

					if (empty($productsList[$provider][$productId]))
					{
						$productsList[$provider][$productId] = $providerBasketItemData;
					}

					$productsList[$provider][$productId]['QUANTITY_LIST'][$basketCode] = $basketItem->getQuantity();
					$resultList[$basketCode] = 0;
				}
			}
			else
			{
				foreach ($providerBasketItemList as $providerBasketItemData)
				{
					$resultProductData = CSaleBasket::ExecuteCallbackFunction(
						$providerBasketItemData['CALLBACK_FUNC'],
						$providerBasketItemData['MODULE'],
						$providerBasketItemData['PRODUCT_ID']
					);

					$basketCode = $providerBasketItemData['BASKET_ITEM']->getBasketCode();
					$resultList[$basketCode] = $resultProductData;
				}
			}
		}


		if (!empty($productsList))
		{
			foreach ($productsList as $providerName => $products)
			{
				/** @var SaleProviderBase $providerClass */
				$providerClass = $providerList[$providerName];

				$r = $providerClass->getAvailableQuantity($products);
				if ($r->isSuccess())
				{
					$resultData = $r->getData();
					if (!empty($resultData['AVAILABLE_QUANTITY_LIST']))
					{

						foreach ($resultData['AVAILABLE_QUANTITY_LIST'] as $productId => $availableQuantity)
						{
							if (!empty($basketCodeIndex[$productId]))
							{
								foreach ($basketCodeIndex[$productId] as $basketCode)
								{
									$resultList[$basketCode] = $availableQuantity;
								}
							}
						}
					}
				}
			}
		}
	}

	return $resultList;
}