- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/providerbase.php
- Класс: BitrixSaleProviderBase
- Вызов: ProviderBase::reserveShipmentItem
static function reserveShipmentItem(ShipmentItem $shipmentItem, $quantity)
{
global $APPLICATION;
$result = new Result();
$fields = array();
/** @var ShipmentItemCollection $shipmentItemCollection */
$shipmentItemCollection = $shipmentItem->getCollection();
if (!$shipmentItemCollection)
{
throw new ObjectNotFoundException('Entity "ShipmentItemCollection" not found');
}
/** @var Shipment $shipment */
$shipment = $shipmentItemCollection->getShipment();
if (!$shipment)
{
throw new ObjectNotFoundException('Entity "Shipment" not found');
}
/** @var BasketItem $basketItem */
$basketItem = $shipmentItem->getBasketItem();
if (!$basketItem)
{
$result->addError(new ResultError(
Loc::getMessage(
'SALE_PROVIDER_BASKET_ITEM_NOT_FOUND',
array(
'#BASKET_ITEM_ID#' => $shipmentItem->getBasketId(),
'#SHIPMENT_ID#' => $shipment->getId(),
'#SHIPMENT_ITEM_ID#' => $shipmentItem->getId(),
)
),
'PROVIDER_RESERVE_SHIPMENT_ITEM_WRONG_BASKET_ITEM')
);
return $result;
}
$provider = $basketItem->getProvider();
if ($provider && array_key_exists("IBXSaleProductProvider", class_implements($provider)))
{
$data = array(
"PRODUCT_ID" => $basketItem->getProductId(),
"UNDO_RESERVATION" => "N",
"QUANTITY_ADD" => $quantity,
"ORDER_DEDUCTED" => $shipment->isShipped()? "Y" : "N",
);
$APPLICATION->ResetException();
if (($resultReserveData = $provider::ReserveProduct($data)))
{
if ($resultReserveData['RESULT'])
{
$fields['QUANTITY'] = $resultReserveData['QUANTITY_RESERVED'];
if (isset($resultReserveData['QUANTITY_NOT_RESERVED']) && floatval($resultReserveData['QUANTITY_NOT_RESERVED']) > 0)
{
$fields['QUANTITY'] = $shipmentItem->getReservedQuantity() + ($shipmentItem->getQuantity() - $shipmentItem->getReservedQuantity()) - $resultReserveData['QUANTITY_NOT_RESERVED'];
}
$result->setData($fields);
return $result;
}
else
{
if ($ex = $APPLICATION->GetException())
{
if ($ex->GetID() != "ALREADY_FLAG")
$result->addError(new ResultError($ex->GetString())) ;
}
else
{
$result->addError(new ResultError(Loc::getMessage('SALE_PROVIDER_RESERVE_BASKET_ITEM_ERROR'), 'SALE_PROVIDER_RESERVE_BASKET_ITEM_ERROR')) ;
}
}
}
}
elseif (class_exists($provider))
{
/** @var ShipmentCollection $shipmentCollection */
$shipmentCollection = $shipment->getCollection();
if (!$shipmentCollection)
{
throw new ObjectNotFoundException('Entity "ShipmentCollection" not found');
}
/** @var Order $order */
$order = $shipmentCollection->getOrder();
if (!$order)
{
throw new ObjectNotFoundException('Entity "Order" not found');
}
$context = array(
'SITE_ID' => $order->getSiteId(),
'CURRENCY' => $order->getCurrency(),
);
if ($order->getUserId() > 0)
{
$context['USER_ID'] = $order->getUserId();
}
else
{
global $USER;
$context['USER_ID'] = $USER->getId();
}
/** @var SaleProviderBase $providerClass */
$providerClass = new $provider($context);
if ($providerClass && $providerClass instanceof SaleProviderBase)
{
$creator = InternalsProviderCreator::create($context);
$creator->addShipmentItem($shipmentItem);
$r = $creator->reserve();
if (!$r->isSuccess())
{
$result->addErrors($r->getErrors());
}
}
}
if (!empty($fields))
{
$result->setData($fields);
}
return $result;
}