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