• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/providerbase.php
  • Класс: BitrixSaleProviderBase
  • Вызов: ProviderBase::getAvailableQuantityByProductData
static function getAvailableQuantityByProductData($providerClass, $productData, array $context)
{
	global $APPLICATION;

	$result = new Result();

	$callbackFunction = null;
	$basketItem =  null;
	if (!empty($productData['BASKET_ITEM']))
	{
		$basketItem = $productData['BASKET_ITEM'];
	}

	if (!empty($productData['CALLBACK_FUNC']))
	{
		$callbackFunction = $productData['CALLBACK_FUNC'];
	}

	$resultProductData = array();

	$userId = $context['USER_ID'];
	$siteId = $context['SITE_ID'];

	$productId = $productData['PRODUCT_ID'];

	$productQuantity = 0;
	if (array_key_exists('QUANTITY', $productData))
	{
		$productQuantity = $productData['QUANTITY'];
	}
	elseif (!empty($productData['QUANTITY_LIST']))
	{
		foreach ($productData['QUANTITY_LIST'] as $basketCode => $quantity)
		{
			$productQuantity += $quantity;
		}
	}

	if (!empty($providerClass) && array_key_exists("IBXSaleProductProvider", class_implements($providerClass)))
	{
		if ($productQuantity <= 0)
		{
			$result->setData(
				array(
					'AVAILABLE_QUANTITY' => $productQuantity
				)
			);
			return $result;
		}

		$basketId = null;
		if ($basketItem)
		{
			$basketId = $basketItem->getId();
		}

		$data = array(
			"PRODUCT_ID" => $productId,
			"QUANTITY" => $productQuantity,
			"USER_ID" => $userId,
			"SITE_ID" => $siteId,
			"BASKET_ID" => $basketId,
			"CHECK_QUANTITY" => "Y",
			"AVAILABLE_QUANTITY" => "Y",
			'CHECK_PRICE' => 'N',
			'CHECK_COUPONS' => 'N',
			"SELECT_QUANTITY_TRACE" => "Y",
		);

		// TODO: !
//				if ($deltaQuantity <= 0 || $checkQuantity == 0)
//				{
//					$result->setData(array('AVAILABLE_QUANTITY' => $deltaQuantity));
//					return $result;
//				}

		$hasTrustData = false;

		$trustData = static::getTrustData($siteId, $productData['MODULE'], $productId);

		if (static::isReadTrustData() === true
			&& !empty($trustData) && is_array($trustData))
		{
			$hasTrustData = true;
			$resultProductData = $trustData;
			$productDataRequiredFields = array_merge(static::getProductDataRequiredFields(), array('AVAILABLE_QUANTITY'));
			foreach ($productDataRequiredFields as $requiredField)
			{
				if (!array_key_exists($requiredField, $resultProductData))
				{
					$hasTrustData = false;
					break;
				}
			}

			if ($hasTrustData
				&& roundEx($productQuantity, SALE_VALUE_PRECISION) > roundEx($resultProductData["AVAILABLE_QUANTITY"], SALE_VALUE_PRECISION))
			{
				$hasTrustData = false;
			}

		}

		if(!$hasTrustData)
		{
			$APPLICATION->ResetException();
			$resultProductData = $providerClass::GetProductData($data);
			if ($ex = $APPLICATION->GetException())
			{
				$result->addWarning( new ResultWarning($ex->GetString(), $ex->GetID()) );
			}
		}

	}
	elseif (!empty($callbackFunction))
	{
		$APPLICATION->ResetException();
		$resultProductData = CSaleBasket::ExecuteCallbackFunction(
			$callbackFunction,
			$productData['MODULE'],
			$productId,
			$productQuantity
		);

		if ($ex = $APPLICATION->GetException())
		{
			$result->addWarning( new ResultWarning($ex->GetString(), $ex->GetID()) );
		}
	}
	else
	{
		$result->setData(
			array(
				'AVAILABLE_QUANTITY' => $productQuantity
			)
		);
		return $result;
	}

	$fields = array();

	if (!empty($resultProductData))
	{
		if (array_key_exists('AVAILABLE_QUANTITY', $resultProductData))
		{
			$fields['AVAILABLE_QUANTITY'] = $resultProductData['AVAILABLE_QUANTITY'];
		}

		if (array_key_exists('QUANTITY_TRACE', $resultProductData))
		{
			$fields['QUANTITY_TRACE'] = ($resultProductData['QUANTITY_TRACE'] == "Y");
		}
	}

	if (!empty($fields))
	{
		$result->setData($fields);
	}

	return $result;
}