• Модуль: salescenter
  • Путь к файлу: ~/bitrix/modules/salescenter/lib/controller/order.php
  • Класс: BitrixSalesCenterControllerOrder
  • Вызов: Order::createPaymentAction
public function createPaymentAction(array $basketItems = array(), array $options = [])
{
	if (Bitrix24Manager::getInstance()->isPaymentsLimitReached())
	{
		$this->addError(
			new MainError(Loc::getMessage('SALESCENTER_CONTROLLER_ORDER_PAYMENTS_LIMIT_REACHED'))
		);

		return [];
	}

	if ((int)$options['orderId'] <= 0 && CrmManager::getInstance()->isOrderLimitReached())
	{
		$this->addError(
			new MainError('You have reached the order limit for your plan')
		);

		return [];
	}

	// if pay from chat - find lead id
	$crmInfo = ImOpenLinesManager::getInstance()->setSessionId($options['sessionId'])->getCrmInfo();
	$dialogLeadId = $crmInfo ? (int)$crmInfo['LEAD'] : null;

	$basketItems = VatRate::prepareTaxPrices($basketItems);
	$basketItems = $this->processBasketItems($basketItems);

	$options['basketItems'] = $basketItems;

	$isEnabledAutomaticReservation = SaleConfiguration::isEnableAutomaticReservation();
	if ($isEnabledAutomaticReservation)
	{
		SaleConfiguration::disableAutomaticReservation();
	}

	/** @var CrmOrderOrder $order */
	$order = $this->buildOrder(
		$options,
		[
			'orderErrorsFilter' => [
				'SALE_BASKET_AVAILABLE_QUANTITY',
				'SALE_BASKET_ITEM_WRONG_AVAILABLE_QUANTITY',
			],
		]
	);
	if ($order === null)
	{
		// if throw error not in 'orderErrorsFilter'
		if ($this->errorCollection->count() === 0)
		{
			$this->addError(
				new Error(Loc::getMessage('SALESCENTER_CONTROLLER_ORDER_CANT_BUILD_ORDER'))
			);
		}

		return [];
	}

	$shipment = $this->findNewShipment($order);
	$payment = $this->findNewPayment($order);

	$result = $order->save();

	if ($isEnabledAutomaticReservation)
	{
		SaleConfiguration::enableAutomaticReservation();
	}

	if ($result->isSuccess())
	{
		$isPaymentSaved = $payment && $payment->getId();

		Bitrix24Manager::getInstance()->increasePaymentsCount();

		$binding = $order->getEntityBinding();

		$entityTypeId = $binding ? $binding->getOwnerTypeId() : 0;
		$entityId = $binding ? $binding->getOwnerId() : 0;

		$productManager = new CrmOrderProductManager($entityTypeId, $entityId);
		$productManager->setOrder($order)->syncOrderProducts($basketItems);

		$data = [
			'order' => [
				'number' => $order->getField('ACCOUNT_NUMBER'),
				'id' => $order->getId(),
				'paymentId' => $payment ? $payment->getId() : null,
				'shipmentId' => $shipment ? $shipment->getId() : null,
			],
		];

		if (isset($options['stageOnOrderPaid']))
		{
			CrmManager::getInstance()->saveTriggerOnOrderPaid(
				$entityId,
				$entityTypeId,
				$options['stageOnOrderPaid']
			);
		}

		if (isset($options['stageOnDeliveryFinished']))
		{
			CrmManager::getInstance()->saveTriggerOnDeliveryFinished(
				$entityId,
				$entityTypeId,
				$options['stageOnDeliveryFinished']
			);
		}

		if ($entityTypeId === CCrmOwnerType::Deal)
		{
			if ($dialogLeadId)
			{
				$this->convertionLeadWithExistDeal($dialogLeadId, $entityId);
			}

			if (!empty($options['sessionId']) && (int)$options['ownerId'] <= 0)
			{
				$this->onAfterDealAdd($entityId, $options['sessionId']);
			}

			$dealPrimaryContactId = $this->getDealPrimaryContactId($entityId);
			if ($shipment && $dealPrimaryContactId)
			{
				$this->tryToFillContactDeliveryAddress($dealPrimaryContactId, $shipment->getId());
			}

			if (isset($options['mode']) && $options['mode'] === ReceivePaymentModeDictionary::PAYMENT)
			{
				$this->setDefaultReceivePaymentMode(ReceivePaymentModeDictionary::PAYMENT);
			}

			// back compatibility ??
			$data['deal'] = $this->getEntityData($entityTypeId, $entityId);
		}

		if ($isPaymentSaved)
		{
			$this->processDocumentSelectorOptions($payment->getId(), $options);

			if (SaleManager::getInstance()->isTelegramOrder($order))
			{
				ImConnectorManager::getInstance()->sendTelegramPaymentNotification($payment, $options['sendingMethodDesc']);
			}
		}

		$data['entity'] = $this->getEntityData($entityTypeId, $entityId);

		if ($shipment)
		{
			$this->saveDeliveryAddressFrom($shipment->getId());
		}

		if ($options['sendingMethod'] === 'sms')
		{
			if ($isPaymentSaved)
			{
				$isSent = CrmManager::getInstance()->sendPaymentBySms($payment, $options['sendingMethodDesc'], $shipment);
				if (!$isSent)
				{
					$this->addError(
						new Error(Loc::getMessage('SALESCENTER_CONTROLLER_ORDER_SEND_SMS_ERROR'), 10)
					);
				}
			}
			else
			{
				$this->addError(
					new Error(Loc::getMessage('SALESCENTER_CONTROLLER_ORDER_CANT_SEND_SMS_PAYMENT_NOT_CREATED'))
				);
			}
		}
		elseif ($options['dialogId'])
		{
			if ($isPaymentSaved)
			{
				$r = new MainResult();

				$binding = $order->getEntityBinding();
				if ($binding && $binding->getOwnerTypeId() === CCrmOwnerType::Deal)
				{
					$dealId = $binding->getOwnerId();

					if ($dealId && (int)$options['ownerId'] <= 0)
					{
						$r = ImOpenLinesManager::getInstance()->sendDealNotify($dealId, $options['dialogId']);
					}

				}

				if ($r->isSuccess())
				{
					$r = ImOpenLinesManager::getInstance()->sendPaymentNotify($payment, $options['dialogId']);
				}
			}
			else
			{
				$r = ImOpenLinesManager::getInstance()->sendOrderNotify($order, $options['dialogId']);
			}

			if (!$r->isSuccess())
			{
				$this->addErrors($r->getErrors());
			}

			if (
				$isPaymentSaved
				&& (
					!isset($options['skipPublicMessage'])
					|| $options['skipPublicMessage'] === 'n'
				)
			)
			{
				$paymentData = [];
				$paySystemService = SalePaySystemManager::getObjectById($payment->getPaymentSystemId());

				if ($options['connector'] === 'imessage'
					&& $paySystemService
					&& SaleManager::getInstance()->isApplePayPayment($paySystemService->getFieldsValues())
				)
				{
					$request = MainContext::getCurrent()->getRequest();
					$request->set(array_merge($request->toArray(), [
						"action" => "getIMessagePaymentAction",
					]));

					$initiatePayResult = $paySystemService->initiatePay(
						$payment,
						$request,
						SalePaySystemBaseServiceHandler::STRING
					);
					if ($initiatePayResult->isSuccess())
					{
						$paymentData = $initiatePayResult->getData();
					}
					else
					{
						$this->addErrors($initiatePayResult->getErrors());
					}
				}

				$result = ImOpenLinesManager::getInstance()->sendPaymentMessage($payment, $options['dialogId'], $paymentData);
				if (!$result->isSuccess())
				{
					$this->addErrors($result->getErrors());
				}
			}
		}
		else
		{
			if ($isPaymentSaved)
			{
				$publicUrl = ImOpenLinesManager::getInstance()->getPublicUrlInfoForPayment($payment);

				if ($options['context'] === SalesCenterComponentContextDictionary::SMS)
				{
					$smsTemplate = CrmManager::getInstance()->getSmsTemplate();
					$smsTitle = str_replace('#LINK#', $publicUrl['url'], $smsTemplate);
					$previewData = [
						'title' => $smsTitle,
					];
				}
				else
				{
					$previewData = ImOpenLinesManager::getInstance()->getPaymentPreviewData($payment);
				}
			}
			else
			{
				$previewData = ImOpenLinesManager::getInstance()->getOrderPreviewData($order);
				$publicUrl = ImOpenLinesManager::getInstance()->getPublicUrlInfoForOrder($order);
			}

			$data['order']['title'] = $previewData['title'];
			$data['order']['url'] = $publicUrl['url'];
		}

		// save restriction pay systems for order payment
		$availablePaySystemIds = (array) ($options['availablePaySystemsIds'] ?? []);
		if (
			$isPaymentSaved
			&& $availablePaySystemIds
		)
		{
			$result = PaymentAvailablesPaySystems::setBindings($payment->getId(), $availablePaySystemIds);
			if (!$result->isSuccess())
			{
				$this->addErrors($result->getErrors());
			}
		}

		return $data;
	}
	else
	{
		$this->addErrors($result->getErrors());
	}

	return [];
}