• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/internals/providercreator.php
  • Класс: BitrixSaleInternalsProviderCreator
  • Вызов: ProviderCreator::createItemForReserveByShipmentItem
public function createItemForReserveByShipmentItem(SaleShipmentItem $shipmentItem) : array
{
	$basketItem = $shipmentItem->getBasketItem();

	$result = [
		'PROVIDER_NAME' => $basketItem->getProviderName(),
		'BASKET_ITEM' => $basketItem,
		'SHIPMENT_ITEM' => $shipmentItem,
		'QUANTITY' => 0,
		'RESERVED_QUANTITY' => 0,
	];

	if (!$basketItem->isReservableItem())
	{
		return $result;
	}

	$shipmentItemQuantity = $shipmentItem->getQuantity();
	if ($shipmentItemQuantity == 0)
	{
		$storeId = SaleConfiguration::getDefaultStoreId();

		$result['QUANTITY_BY_STORE'][$storeId] = $shipmentItemQuantity - $shipmentItem->getReservedQuantity();
		$result['QUANTITY'] += $result['QUANTITY_BY_STORE'][$storeId];

		$result['RESERVED_QUANTITY_BY_STORE'][$storeId] = $shipmentItem->getReservedQuantity();
		$result['RESERVED_QUANTITY'] += $result['RESERVED_QUANTITY_BY_STORE'][$storeId];
	}
	else
	{
		$quantityStoreList = [];

		/** @var SaleShipmentItemStoreCollection $shipmentItemStoreCollection */
		$shipmentItemStoreCollection = $shipmentItem->getShipmentItemStoreCollection();
		if ($shipmentItemStoreCollection)
		{
			/** @var SaleShipmentItemStore $itemStore */
			foreach ($shipmentItemStoreCollection as $itemStore)
			{
				$storeId = $itemStore->getStoreId();
				if (!isset($quantityStoreList[$storeId]))
				{
					$quantityStoreList[$storeId] = 0;
				}

				$quantityStoreList[$storeId] += $itemStore->getQuantity();
				$shipmentItemQuantity -= $itemStore->getQuantity();
			}
		}

		if ($shipmentItemQuantity > 0)
		{
			$storeId = SaleConfiguration::getDefaultStoreId();
			if (!isset($quantityStoreList[$storeId]))
			{
				$quantityStoreList[$storeId] = 0;
			}

			$quantityStoreList[$storeId] += $shipmentItemQuantity;
		}

		$result['QUANTITY_BY_STORE'] = [];
		$result['RESERVED_QUANTITY_BY_STORE'] = [];

		$shipmentItemReservedQuantity = $shipmentItem->getReservedQuantity();
		foreach ($quantityStoreList as $storeId => $quantity)
		{
			$reserveQuantity = 0;

			/** @var SaleReserveQuantityCollection $reserveQuantityCollection */
			$reserveQuantityCollection = $basketItem->getReserveQuantityCollection();

			if ($reserveQuantityCollection && $shipmentItemReservedQuantity > 0)
			{
				$reserveQuantity = $reserveQuantityCollection->getQuantityByStoreId($storeId);
				if ($reserveQuantity > $shipmentItemReservedQuantity)
				{
					$reserveQuantity = $shipmentItemReservedQuantity;
				}

				$shipmentItemReservedQuantity -= $reserveQuantity;
			}

			$result['QUANTITY_BY_STORE'][$storeId] = $quantity - $reserveQuantity;
			$result['QUANTITY'] += $result['QUANTITY_BY_STORE'][$storeId];

			$result['RESERVED_QUANTITY_BY_STORE'][$storeId] = $reserveQuantity;
			$result['RESERVED_QUANTITY'] += $result['RESERVED_QUANTITY_BY_STORE'][$storeId];
		}
	}

	return $result;
}