• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/controller/action/entity/saveorderaction.php
  • Класс: BitrixSaleControllerActionEntitySaveOrderAction
  • Вызов: SaveOrderAction::saveOrder
private function saveOrder(array $fields)
{
	$result = new SaleResult();

	$resultData = [];

	$prepareOrderResult = $this->prepareOrder($fields);
	if ($prepareOrderResult->isSuccess())
	{
		$getOrderData = $prepareOrderResult->getData();

		/** @var SaleOrder $order */
		$order = $getOrderData['order'];

		$setUserResult = $this->setUser($order, $fields);
		if ($setUserResult->isSuccess())
		{
			$resultData['USER'] = $setUserResult->getData();
		}
		else
		{
			$this->fillErrorCollection(
				$result,
				$setUserResult->getErrors(),
				SaleControllerErrorEnumeration::SAVE_ORDER_ACTION_SET_USER
			);
			return $result;
		}

		$userProfileData = $fields['USER_PROFILE'] ?? null;
		$setProfileResult = $this->setProfile($order, $userProfileData);
		if (!$setProfileResult->isSuccess())
		{
			$this->fillErrorCollection(
				$result,
				$setProfileResult->getErrors(),
				SaleControllerErrorEnumeration::SAVE_ORDER_ACTION_SET_PROFILE
			);
			return $result;
		}

		$doFinalActionsResult = $this->doFinalActions($order);
		if (!$doFinalActionsResult->isSuccess())
		{
			$this->fillErrorCollection(
				$result,
				$doFinalActionsResult->getErrors(),
				SaleControllerErrorEnumeration::SAVE_ORDER_ACTION_FINAL_ACTIONS
			);
			return $result;
		}

		$saveResult = $order->save();
		if (!$saveResult->isSuccess())
		{
			$this->fillErrorCollection(
				$result,
				$saveResult->getErrors(),
				SaleControllerErrorEnumeration::SAVE_ORDER_ACTION_SAVE
			);
			return $result;
		}

		if (
			MainLoader::includeModule('crm')
			&& class_exists(CrmIntegrationCompilationManager::class)
		)
		{
			if (isset($this->compilationDealId))
			{
				Manager::copyOrderProductsToDeal($order, $this->compilationDealId);
			}

			CrmIntegrationCompilationManager::sendOrderBoundEvent($order);
			CrmIntegrationCompilationManager::sendToCompilationDealTimeline($order);
		}

		$resultData['ORDER'] = $order;
		$result->setData($resultData);
	}
	else
	{
		$result->addErrors($prepareOrderResult->getErrors());
	}

	return $result;
}