• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/compatible/ordercompatibility.php
  • Класс: BitrixSaleCompatibleOrderCompatibility
  • Вызов: OrderCompatibility::reserve
static function reserve($orderId, $value)
{
	$result = new SaleResult();

	$registry = SaleRegistry::getInstance(static::getRegistryType());

	/** @var SaleOrder $orderClassName */
	$orderClassName = $registry->getOrderClassName();
	if (!$order = $orderClassName::load($orderId))
	{
		$result->addError( new SaleResultError(MainLocalizationLoc::getMessage('SALE_COMPATIBLE_ORDER_NOT_FOUND'), 'SALE_COMPATIBLE_ORDER_NOT_FOUND') );
		return $result;
	}

	/** @var SaleShipmentCollection $shipmentCollection */
	if (!$shipmentCollection = $order->getShipmentCollection())
	{
		throw new MainObjectNotFoundException('Entity "ShipmentCollection" not found');
	}

	/** @var SaleShipment $shipment */
	foreach ($shipmentCollection as $shipment)
	{
		if ($shipment->isSystem())
			continue;

		if ($value == "Y")
		{
			/** @var SaleResult $r */
			$r = $shipment->tryReserve();
			if (!$r->isSuccess())
			{
				$registry = SaleRegistry::getInstance(static::getRegistryType());

				/** @var SaleEntityMarker $entityMarkerClassName */
				$entityMarkerClassName = $registry->getEntityMarkerClassName();
				$entityMarkerClassName::addMarker($order, $shipment, $r);
				if (!$shipment->isSystem())
				{
					$shipment->setField('MARKED', 'Y');
				}

				$result->addErrors($r->getErrors());
			}
		}
		else
		{
			if (!$shipment->isShipped())
			{
				/** @var SaleResult $r */
				$r = $shipment->tryUnreserve();
				if (!$r->isSuccess())
				{
					$registry = SaleRegistry::getInstance(static::getRegistryType());

					/** @var SaleEntityMarker $entityMarkerClassName */
					$entityMarkerClassName = $registry->getEntityMarkerClassName();
					$entityMarkerClassName::addMarker($order, $shipment, $r);
					if (!$shipment->isSystem())
					{
						$shipment->setField('MARKED', 'Y');
					}
					$result->addErrors($r->getErrors());
				}
			}
		}
	}

	/** @var SaleResult $r */
	$r = $order->save();
	if (!$r->isSuccess())
	{
		$result->addErrors($r->getErrors());
	}

	return $result;
}