• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/providerbase.php
  • Класс: BitrixSaleProviderBase
  • Вызов: ProviderBase::reserveShipmentItem
static function reserveShipmentItem(ShipmentItem $shipmentItem, $quantity)
{
	global $APPLICATION;
	$result = new Result();
	$fields = array();

	/** @var ShipmentItemCollection $shipmentItemCollection */
	$shipmentItemCollection = $shipmentItem->getCollection();
	if (!$shipmentItemCollection)
	{
		throw new ObjectNotFoundException('Entity "ShipmentItemCollection" not found');
	}

	/** @var Shipment $shipment */
	$shipment = $shipmentItemCollection->getShipment();
	if (!$shipment)
	{
		throw new ObjectNotFoundException('Entity "Shipment" not found');
	}

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

		return $result;
	}

	$provider = $basketItem->getProvider();

	if ($provider && array_key_exists("IBXSaleProductProvider", class_implements($provider)))
	{
		$data = array(
			"PRODUCT_ID" => $basketItem->getProductId(),
			"UNDO_RESERVATION" => "N",
			"QUANTITY_ADD"   => $quantity,
			"ORDER_DEDUCTED" => $shipment->isShipped()? "Y" : "N",
		);

		$APPLICATION->ResetException();
		if (($resultReserveData = $provider::ReserveProduct($data)))
		{
			if ($resultReserveData['RESULT'])
			{
				$fields['QUANTITY'] = $resultReserveData['QUANTITY_RESERVED'];

				if (isset($resultReserveData['QUANTITY_NOT_RESERVED']) && floatval($resultReserveData['QUANTITY_NOT_RESERVED']) > 0)
				{
					$fields['QUANTITY'] = $shipmentItem->getReservedQuantity() + ($shipmentItem->getQuantity() - $shipmentItem->getReservedQuantity()) -  $resultReserveData['QUANTITY_NOT_RESERVED'];
				}

				$result->setData($fields);
				return $result;
			}
			else
			{
				if ($ex = $APPLICATION->GetException())
				{
					if ($ex->GetID() != "ALREADY_FLAG")
						$result->addError(new ResultError($ex->GetString())) ;
				}
				else
				{
					$result->addError(new ResultError(Loc::getMessage('SALE_PROVIDER_RESERVE_BASKET_ITEM_ERROR'), 'SALE_PROVIDER_RESERVE_BASKET_ITEM_ERROR')) ;
				}
			}

		}

	}
	elseif (class_exists($provider))
	{
		/** @var ShipmentCollection $shipmentCollection */
		$shipmentCollection = $shipment->getCollection();
		if (!$shipmentCollection)
		{
			throw new ObjectNotFoundException('Entity "ShipmentCollection" not found');
		}

		/** @var Order $order */
		$order = $shipmentCollection->getOrder();
		if (!$order)
		{
			throw new ObjectNotFoundException('Entity "Order" not found');
		}

		$context = array(
			'SITE_ID' => $order->getSiteId(),
			'CURRENCY' => $order->getCurrency(),
		);

		if ($order->getUserId() > 0)
		{
			$context['USER_ID'] = $order->getUserId();
		}
		else
		{
			global $USER;
			$context['USER_ID'] = $USER->getId();
		}

		/** @var SaleProviderBase $providerClass */
		$providerClass = new $provider($context);
		if ($providerClass && $providerClass instanceof SaleProviderBase)
		{

			$creator = InternalsProviderCreator::create($context);
			$creator->addShipmentItem($shipmentItem);

			$r = $creator->reserve();
			if (!$r->isSuccess())
			{
				$result->addErrors($r->getErrors());
			}

		}
	}

	if (!empty($fields))
	{
		$result->setData($fields);
	}
	return $result;
}