- Модуль: 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 [];
}