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