• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/internals/catalog/provider.php
  • Класс: BitrixSaleInternalsCatalogProvider
  • Вызов: Provider::tryUnreserveShipmentItem
static function tryUnreserveShipmentItem(SaleShipmentItem $shipmentItem) : SaleResult
{
	$result = new SaleResult();

	/** @var SaleOrder $order */
	$order = $shipmentItem->getCollection()->getShipment()->getOrder();

	$pool = PoolQuantity::getInstance($order->getInternalId());

	/** @var SaleBasketItem $basketItem */
	$basketItem = $shipmentItem->getBasketItem();

	$productId = $basketItem->getProductId();

	$reservedQuantity = $shipmentItem->getReservedQuantity();

	if ($reservedQuantity == 0)
	{
		return $result;
	}

	$pool->add(SaleInternalsPoolQuantity::POOL_RESERVE_TYPE, $productId, -1 * $reservedQuantity);

	$foundItem = false;
	$poolItems = SaleInternalsItemsPool::get($order->getInternalId(), $productId);
	if (!empty($poolItems))
	{
		/** @var SaleShipmentItem $poolItem */
		foreach ($poolItems as $poolItem)
		{
			if (
				$poolItem instanceof SaleShipmentItem
				&& $poolItem->getInternalIndex() == $shipmentItem->getInternalIndex()
			)
			{
				$foundItem = true;
				break;
			}
		}
	}

	if (!$foundItem)
	{
		SaleInternalsItemsPool::add($order->getInternalId(), $productId, $shipmentItem);
	}

	$r = $shipmentItem->setField('RESERVED_QUANTITY', $shipmentItem->getReservedQuantity() + -1 * $reservedQuantity);
	if (!$r->isSuccess())
	{
		$result->addErrors($r->getErrors());
	}

	return $result;
}