• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/shipment.php
  • Класс: BitrixSaleShipment
  • Вызов: Shipment::updateReservedFlag
static function updateReservedFlag(Shipment $shipment)
{
	$shipmentReserved = true;

	$shipmentItemList = $shipment->getShipmentItemCollection()->getShippableItems();

	if ($shipmentItemList->count() === 0)
	{
		$shipmentReserved = false;
	}

	/** @var ShipmentItem $shipmentItem */
	foreach ($shipmentItemList as $shipmentItem)
	{
		if ($shipmentItem->getQuantity() - $shipmentItem->getReservedQuantity())
		{
			$shipmentReserved = false;
			break;
		}
	}

	$shipmentReservedValue = $shipmentReserved ? "Y" : "N";
	$currentValue = $shipment->getField('RESERVED');
	if ($shipment->getField('RESERVED') != $shipmentReservedValue)
	{
		$eventManager = MainEventManager::getInstance();
		$eventsList = $eventManager->findEventHandlers('sale', EventActions::EVENT_ON_BEFORE_SHIPMENT_RESERVE);
		if (!empty($eventsList))
		{
			/** @var MainEntityEvent $event */
			$event = new MainEvent('sale', EventActions::EVENT_ON_BEFORE_SHIPMENT_RESERVE, [
				'ENTITY' => $shipment,
				'VALUE' => $shipmentReservedValue,
			]);

			$event->send();

			if ($event->getResults())
			{
				$result = new Result();
				/** @var MainEventResult $eventResult */
				foreach($event->getResults() as $eventResult)
				{
					if($eventResult->getType() === MainEventResult::ERROR)
					{
						$errorMsg = new ResultError(MainLocalizationLoc::getMessage('SALE_EVENT_ON_BEFORE_SHIPMENT_RESERVE_ERROR'), 'SALE_EVENT_ON_BEFORE_SHIPMENT_RESERVE_ERROR');

						$eventResultData = $eventResult->getParameters();
						if ($eventResultData)
						{
							if (isset($eventResultData) && $eventResultData instanceof ResultError)
							{
								/** @var ResultError $errorMsg */
								$errorMsg = $eventResultData;
							}
						}

						$result->addError($errorMsg);

					}
				}

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

		$shipment->setFieldNoDemand('RESERVED', $shipmentReserved ? "Y" : "N");

		InternalsEventsPool::addEvent('s'.$shipment->getInternalIndex(), EventActions::EVENT_ON_SHIPMENT_RESERVED, [
			'ENTITY' => $shipment,
			'VALUE' => $shipmentReservedValue,
			'OLD_VALUE' => $currentValue,
		]);
	}

	return new Result();
}