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

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

	/** @var SaleShipmentItem $shipmentItem */
	foreach ($shipmentItemList as $shipmentItem)
	{
		$basketItem = $shipmentItem->getBasketItem();
		if (!$basketItem->isReservableItem())
		{
			continue;
		}

		/** @var SaleReserveQuantityCollection $reserveQuantityCollection */
		$reserveQuantityCollection = $basketItem->getReserveQuantityCollection();
		if (!$reserveQuantityCollection)
		{
			continue;
		}

		$productId = $basketItem->getProductId();

		/** @var SaleOrder $order */
		$order = $basketItem->getBasket()->getOrder();

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

		$reserve = null;

		/** @var SaleReserveQuantity $item */
		foreach ($reserveQuantityCollection as $item)
		{
			if ($item->getStoreId() === $storeId)
			{
				$reserve = $item;
				break;
			}
		}

		if ($reserve === null)
		{
			$reserve = $reserveQuantityCollection->create();
			$reserve->setStoreId($storeId);
		}

		if ($quantity < 0)
		{
			$settableQuantity = $quantity;
			if ($shipmentItem->getReservedQuantity() < $quantity)
			{
				$settableQuantity = $shipmentItem->getReservedQuantity();
			}
		}
		else
		{
			$needQuantity = $basketItem->getQuantity() - $reserve->getQuantity();
			$settableQuantity = (abs($needQuantity) >= abs($quantity)) ? $quantity : $needQuantity;
		}

		$reserve->setFieldNoDemand('QUANTITY', $reserve->getQuantity() + $settableQuantity);

		self::applyReserveToShipmentItem($shipmentItem, $settableQuantity);

		$quantity -= $settableQuantity;

		$pool->addByStore(SaleInternalsPoolQuantity::POOL_RESERVE_TYPE, $productId, $storeId, $settableQuantity);

		$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);
		}
	}

	return $result;
}