• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/internals/providerbuilder.php
  • Класс: BitrixSaleInternalsProviderBuilder
  • Вызов: ProviderBuilder::setItemsResultAfterTryShip
public function setItemsResultAfterTryShip(PoolQuantity $pool, array $productTryShipList)
{
	$products = $this->getItems();

	if (empty($products))
	{
		return new SaleResult();
	}

	foreach ($products as $productId => $productData)
	{
		if (!isset($productTryShipList[$productId]))
		{
			continue;
		}

		if (empty($productData['SHIPMENT_ITEM_DATA_LIST']))
		{
			continue;
		}

		if (empty($productData['SHIPMENT_ITEM_LIST']))
		{
			continue;
		}

		/**
		 * @var int $shipmentItemIndex
		 * @var SaleShipmentItem $shipmentItem
		 */
		foreach ($productData['SHIPMENT_ITEM_DATA_LIST'] as $shipmentItemIndex => $shipmentItemQuantity)
		{
			$shipmentItem = $productData['SHIPMENT_ITEM_LIST'][$shipmentItemIndex] ?? null;
			if ($shipmentItem === null)
			{
				continue;
			}

			$shipment = $shipmentItem->getCollection()->getShipment();

			$coefficient = -1;
			if ($shipment->needShip() === SaleInternalsCatalogProvider::SALE_TRANSFER_PROVIDER_SHIPMENT_NEED_NOT_SHIP)
			{
				$coefficient = 1;
			}

			$shipmentItemQuantity = $shipmentItem->getQuantity();

			/** @var SaleShipmentItemStoreCollection $shipmentItemStoreCollection */
			$shipmentItemStoreCollection = $shipmentItem->getShipmentItemStoreCollection();
			if ($shipmentItemStoreCollection)
			{
				/** @var SaleShipmentItemStore $shipmentItemStore */
				foreach ($shipmentItemStoreCollection as $shipmentItemStore)
				{
					$quantity = $coefficient * $shipmentItemStore->getQuantity();
					$pool->addByStore(PoolQuantity::POOL_QUANTITY_TYPE, $productId, $shipmentItemStore->getStoreId(), $quantity);

					$shipmentItemQuantity -= $shipmentItemStore->getQuantity();
				}
			}

			if ($shipmentItemQuantity > 0)
			{
				$pool->add(PoolQuantity::POOL_QUANTITY_TYPE, $productId, $shipmentItemQuantity);
			}

			$foundItem = false;
			$poolItems = SaleInternalsItemsPool::get($shipment->getOrder()->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($shipment->getOrder()->getInternalId(), $productId, $shipmentItem);
			}
		}
	}

	return new SaleResult();
}