- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/providerbase.php
- Класс: BitrixSaleProviderBase
- Вызов: ProviderBase::tryUnreserveShipmentItem
static function tryUnreserveShipmentItem(ShipmentItem $shipmentItem)
{
$result = new Result();
/** @var ShipmentItemCollection $shipmentItemCollection */
if (!$shipmentItemCollection = $shipmentItem->getCollection())
{
throw new ObjectNotFoundException('Entity "ShipmentItemCollection" not found');
}
/** @var Shipment $shipment */
if (!$shipment = $shipmentItemCollection->getShipment())
{
throw new ObjectNotFoundException('Entity "Shipment" not found');
}
/** @var ShipmentCollection $shipmentCollection */
if (!$shipmentCollection = $shipment->getCollection())
{
throw new ObjectNotFoundException('Entity "ShipmentCollection" not found');
}
/** @var Order $order */
if (!$order = $shipmentCollection->getOrder())
{
throw new ObjectNotFoundException('Entity "Order" not found');
}
/** @var BasketItem $basketItem */
if (!$basketItem = $shipmentItem->getBasketItem())
{
$result->addError(new ResultError(
Loc::getMessage(
'SALE_PROVIDER_BASKET_ITEM_NOT_FOUND',
[
'#BASKET_ITEM_ID#' => $shipmentItem->getBasketId(),
'#SHIPMENT_ID#' => $shipment->getId(),
'#SHIPMENT_ITEM_ID#' => $shipmentItem->getId(),
]
),
'PROVIDER_TRY_UNRESERVED_SHIPMENT_ITEM_WRONG_BASKET_ITEM')
);
return $result;
}
if ($basketItem->isBundleParent())
{
return $result;
}
$quantity = $shipmentItem->getReservedQuantity();
$canReserve = false;
$providerName = $basketItem->getProvider();
$providerExists = false;
$availableQuantityData = array(
'HAS_PROVIDER' => true,
'AVAILABLE_QUANTITY' => $quantity
);
if (class_exists($providerName))
{
$providerClass = new $providerName();
if ($providerClass instanceof SaleProviderBase)
{
$providerExists = true;
}
}
if (!$providerExists)
{
if (!array_key_exists("IBXSaleProductProvider", class_implements($providerName)))
{
$availableQuantityData['HAS_PROVIDER'] = false;
}
}
if (array_key_exists('HAS_PROVIDER', $availableQuantityData))
{
$canReserve = $availableQuantityData['HAS_PROVIDER'];
}
if ($canReserve)
{
static::addReservationPoolItem($order->getInternalId(), $shipmentItem->getBasketItem(), $quantity);
$reservedQuantity = ($shipmentItem->getReservedQuantity() > 0 ? $shipmentItem->getReservedQuantity() + $quantity : 0);
$needShip = $shipment->needShip();
if ($needShip)
{
$shipmentItem->setFieldNoDemand('RESERVED_QUANTITY', $reservedQuantity);
}
else
{
$r = $shipmentItem->setField('RESERVED_QUANTITY', $reservedQuantity);
if (!$r->isSuccess())
{
$result->addErrors($r->getErrors());
}
}
}
$result->addData([
'CAN_RESERVE' => $canReserve,
]);
return $result;
}