• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/delivery/requests/manager.php
  • Класс: BitrixSaleDeliveryRequestsManager
  • Вызов: Manager::createDeliveryRequest
static function createDeliveryRequest($deliveryId, array $shipmentIds, array $additional = array())
{
	$result = new Result();

	if (!($deliveryRequestHandler = self::getDeliveryRequestHandlerByDeliveryId($deliveryId)))
	{
		$result->addError(
			new MainError(
				Loc::getMessage(
					'SALE_DLVR_REQ_MNGR_ERROR_NOT_SUPPORT',
					array('#DELIVERY_LINK#' => Helper::getDeliveryEditLink($deliveryId))
		)));
		self::sendOnCreateDeliveryRequestEvent($result, $deliveryId, $shipmentIds, $additional);

		return $result;
	}

	/** @var ShipmentResult[] $checkResults */
	$checkResults = self::checkShipmentIdsBeforeAdd($shipmentIds);

	foreach ($checkResults as $res)
	{
		if ($res->isSuccess())
			continue;

		$result->addResult(
			self::processShipmentResult(
				$res
		));

		unset($shipmentIds[array_search($res->getInternalId(), $shipmentIds)]);
	}

	if (empty($shipmentIds))
	{
		$result->addError(new MainError(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_SHP_ABSENT')));
		self::sendOnCreateDeliveryRequestEvent($result, $deliveryId, $shipmentIds, $additional);

		return $result;
	}

	$handlerResult = $deliveryRequestHandler->create($shipmentIds, $additional);
	if ($handlerResult->isSuccess())
	{
		$result->addResults($handlerResult->getResults());
	}
	else
	{
		$result->addErrors($handlerResult->getErrors());

		foreach ($handlerResult->getShipmentResults() as $sRes)
		{
			$result->addResult(self::processShipmentResult($sRes));
		}
		self::sendOnCreateDeliveryRequestEvent($result, $deliveryId, $shipmentIds, $additional);

		return $result;
	}

	$results = $result->getResults();

	if (!is_array($results) || empty($results))
	{
		$result->addError(new MainError(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_RES_UNKNOWN')));

		self::sendOnCreateDeliveryRequestEvent($result, $deliveryId, $shipmentIds, $additional);

		return $result;
	}

	/** @var  ShipmentResult|RequestResult $requestResult */
	foreach ($results as $resId => $requestResult)
	{
		if ($requestResult instanceof ShipmentResult)
		{
			$requestResult = self::processShipmentResult($requestResult);
		}
		elseif ($requestResult instanceof RequestResult)
		{
			$requestId = 0;
			/** @var RequestResult  $requestResult*/
			if ($requestResult->isSuccess())
			{
				$handlerResultData = $handlerResult->getData();

				$res = RequestTable::add(array(
					'DELIVERY_ID' => $deliveryRequestHandler->getHandlingDeliveryServiceId(),
					'EXTERNAL_ID' => $requestResult->getExternalId(),
					'CREATED_BY' => ($GLOBALS['USER'] instanceof CUser && (int)$GLOBALS['USER']->GetID() > 0)
						? (int)$GLOBALS['USER']->GetID()
						: null,
					'STATUS' => Manager::STATUS_SENT,
					'EXTERNAL_STATUS' => $handlerResultData['STATUS'] ?? null,
					'EXTERNAL_STATUS_SEMANTIC' => $handlerResultData['STATUS_SEMANTIC'] ?? null,
					'EXTERNAL_PROPERTIES' => (isset($handlerResultData['PROPERTIES']) && is_array($handlerResultData['PROPERTIES']))
						? $handlerResultData['PROPERTIES']
						: [],
				));

				if (!$res->isSuccess())
				{
					$requestResult->addErrors($res->getErrors());
					continue;
				}

				$requestId = $res->getId();

				if ($requestId > 0)
				{
					$requestResult->setInternalId($requestId);
				}
			}

			$shipmentsResults = $requestResult->getShipmentResults();

			if (empty($shipmentsResults))
				continue;

			foreach ($shipmentsResults as $sResIdx => $shipmentResult)
			{
				$shipmentsResults[$sResIdx] = self::processShipmentResult($shipmentResult, $requestId);
			}

			$requestResult->setResults($shipmentsResults);
		}
		else
		{
			$result->addError(new MainError(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_ANSW_TYPE').' "'.get_class($requestResult).'"'));
			continue;
		}

		$results[$resId] = $requestResult;
	}

	$result->setResults($results);
	self::sendOnCreateDeliveryRequestEvent($result, $deliveryId, $shipmentIds, $additional);

	return $result;
}