• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/internals/shipmentrules.php
  • Класс: BitrixSaleInternalsShipmentRules
  • Вызов: ShipmentRules::createShipRule
static function createShipRule(SaleShipmentItem $shipmentItem, PoolQuantity $pool)
{
	$basketItem = $shipmentItem->getBasketItem();
	if (!$basketItem->isReservableItem())
	{
		return false;
	}

	$poolQuantitiesList = $pool->getQuantitiesWithStore(PoolQuantity::POOL_QUANTITY_TYPE);
	if (empty($poolQuantitiesList))
	{
		return false;
	}

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

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

	$needUseReserve = $coefficient < 1 || SaleConfiguration::isEnableAutomaticReservation();

	$productId = $basketItem->getProductId();

	$rule = array(
		'SHIPMENT_ITEM' => $shipmentItem,
		'BASKET_ITEM' => $basketItem,
		'PRODUCT_ID' => $productId,
		'PROVIDER_NAME' => $basketItem->getProvider(),
	);

	$storeData = SaleInternalsCatalogProvider::createMapShipmentItemStoreData($shipmentItem, $needUseReserve);
	if (!empty($storeData))
	{
		$reservedQuantity = 0;
		$needReserveByStore = [];
		foreach ($storeData as $item)
		{
			$reservedQuantity += $item['RESERVED_QUANTITY'];

			$needReserveByStore[$item['STORE_ID']] = $item['RESERVED_QUANTITY'] > 0;
		}

		$rule['STORE_DATA'] = [
			$shipmentItem->getInternalIndex() => $storeData
		];

		$rule['NEED_RESERVE'] = $reservedQuantity > 0;

		$rule['NEED_RESERVE_BY_STORE'] = [
			$shipmentItem->getInternalIndex() => $needReserveByStore
		];
	}
	else
	{
		$rule['NEED_RESERVE'] = $basketItem->getReservedQuantity() > 0;
		$rule['NEED_RESERVE_BY_STORE'] = [
			$shipmentItem->getInternalIndex() => [
				SaleConfiguration::getDefaultStoreId() => $rule['NEED_RESERVE']
			]
		];

		$reservedQuantity = 0;

		/** @var SaleReserveQuantityCollection $reserveQuantityCollection */
		$reserveQuantityCollection = $basketItem->getReserveQuantityCollection();
		if ($reserveQuantityCollection)
		{
			$reservedQuantity = $reserveQuantityCollection->getQuantityByStoreId(
				SaleConfiguration::getDefaultStoreId()
			);
		}

		if ($shipmentItem->getQuantity() < $reservedQuantity)
		{
			$reservedQuantity = $shipmentItem->getQuantity();
		}

		$rule['RESERVED_QUANTITY'] = $reservedQuantity;
		$rule['RESERVED_QUANTITY_BY_STORE'] = [
			$shipmentItem->getInternalIndex() => [
				SaleConfiguration::getDefaultStoreId() => $reservedQuantity
			]
		];
	}

	if (array_key_exists($productId, $poolQuantitiesList))
	{
		$quantityByStore = [];
		foreach ($storeData as $item)
		{
			$storeId = $item['STORE_ID'];
			$quantity = $coefficient * $item['QUANTITY'];

			if (!isset($quantityByStore[$storeId]))
			{
				$quantityByStore[$storeId] = 0;
			}

			$quantityByStore[$storeId] += $quantity;

			$poolQuantity = $poolQuantitiesList[$productId][$storeId] - $quantity;

			$pool->setByStore(PoolQuantity::POOL_QUANTITY_TYPE, $productId, $storeId, $poolQuantity);
		}

		if ($quantityByStore)
		{
			$rule['ACTION'][PoolQuantity::POOL_QUANTITY_TYPE] = [
				'QUANTITY_BY_STORE' => $quantityByStore,
				'QUANTITY' => array_sum($quantityByStore)
			];
		}
		else
		{
			$storeId = SaleConfiguration::getDefaultStoreId();

			$quantity = $coefficient * $shipmentItem->getQuantity();

			$rule['ACTION'][PoolQuantity::POOL_QUANTITY_TYPE] = [
				'QUANTITY' => $quantity,
				'QUANTITY_BY_STORE' => [
					$storeId => $quantity
				]
			];
		}
	}

	return $rule;
}