• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/providerbase.php
  • Класс: BitrixSaleProviderBase
  • Вызов: ProviderBase::setShipmentItemReserved
static function setShipmentItemReserved(Shipment $shipment)
{

	$result = new Result();

	$needShip = $shipment->needShip();

	if ($needShip === null
		|| ($needShip === false && !$shipment->isReserved()))
	{
		return $result;
	}

	$order = $shipment->getParentOrder();
	if (!$order)
	{
		throw new ObjectNotFoundException('Entity "Order" not found');
	}

	if (
		Configuration::isEnableAutomaticReservation()
		&& !$shipment->needReservation()
	)
	{
		if ($needShip === false)
		{
			if (!InternalsActionEntity::isTypeExists(
					$order->getInternalId(),
					InternalsActionEntity::ACTION_ENTITY_SHIPMENT_COLLECTION_RESERVED_QUANTITY
				)
			)
			{
				InternalsActionEntity::add(
					$order->getInternalId(),
					InternalsActionEntity::ACTION_ENTITY_SHIPMENT_COLLECTION_RESERVED_QUANTITY,
					array(
						'METHOD' => 'BitrixSaleShipmentCollection::updateReservedFlag',
						'PARAMS' => array($shipment->getCollection())
					)
				);
			}
		}

		return $result;
	}

	/** @var ShipmentItemCollection $shipmentItemCollection */
	$shipmentItemCollection = $shipment->getShipmentItemCollection();

	/** @var ShipmentItem $shipmentItem */
	foreach ($shipmentItemCollection as $shipmentItem)
	{

		/** @var BasketItem $basketItem */
		$basketItem = $shipmentItem->getBasketItem();
		if (!$basketItem)
		{
			$result->addError(new ResultError(
				Loc::getMessage(
					'SALE_PROVIDER_BASKET_ITEM_NOT_FOUND',
					[
						'#BASKET_ITEM_ID#' => $shipmentItem->getBasketId(),
						'#SHIPMENT_ID#' => $shipment->getId(),
						'#SHIPMENT_ITEM_ID#' => $shipmentItem->getId(),
					]
				),
				'PROVIDER_SET_SHIPMENT_ITEM_RESERVED_WRONG_BASKET_ITEM')
			);

			return $result;
		}

		$providerName = $basketItem->getProvider();
		$providerClass = null;

		if (class_exists($providerName))
		{
			$providerClass = new $providerName();
		}
		if ($providerClass && ($providerClass instanceof SaleProviderBase))
		{
			continue;
		}

		$setReservedQuantity = 0;
		if ($needShip === false)
		{
			if ($basketItem->isBundleParent())
			{
				continue;
			}
			$setReservedQuantity = $shipmentItem->getQuantity();
		}

		$shipmentItem->setFieldNoDemand('RESERVED_QUANTITY', $setReservedQuantity);
	}

	if ($needShip === false)
	{
		if (!InternalsActionEntity::isTypeExists(
				$order->getInternalId(),
				InternalsActionEntity::ACTION_ENTITY_SHIPMENT_COLLECTION_RESERVED_QUANTITY
			)
		)
		{
			InternalsActionEntity::add(
				$order->getInternalId(),
				InternalsActionEntity::ACTION_ENTITY_SHIPMENT_COLLECTION_RESERVED_QUANTITY,
				array(
					'METHOD' => 'BitrixSaleShipmentCollection::updateReservedFlag',
					'PARAMS' => array($shipment->getCollection())
				)
			);
		}
	}

	return $result;
}