Bitrix24 создание сделки на основе нового заказа на сайте под управлением Bitrix
12 ноя 2022
1263
Пусть стоит задача - создавать в Битрикс24 новую сделку на основании заказа на сайте, под управлением 1C-Bitrix.
Для этого нам требуется зарегистрировать обработчик события, на основании сохранения заказа: событие OnSaleOrderSaved.
Для этого нужно добавить в файл init.php следующий код:
//Обработчик события после сохранения заказа
Bitrix\Main\EventManager::getInstance()->addEventHandler('sale', 'OnSaleOrderSaved', 'newOrderInB24');
// Функция которая отправляет запрос на Веб-хук в Битрикс 24
function sendB24(string $method, array $params) {
$webhookUrl = 'https://#адрес_портала#/rest/1/fsdfasdfasdfadfs/'; //Адрес веб-хука портала
$httpClient = new HttpClient();
$response = $httpClient->post($webhookUrl.$method, $params);
return json_decode($response, true);
}
function newOrderInB24(Bitrix\Main\Event $event)
{
$order = $event->getParameter("ENTITY");
// Проверяем проверяем новый ли заказ, в Б24 мы будем отправлять только поступающие заказы.
if ($event->getParameter("IS_NEW")){
$basket = $order->getBasket(); // Получаем корзину привязанную к заказу
$order_props = $order->getPropertyCollection(); // Получаем свойства заказа
$name = $order_props->getPayerName()->getValue(); // Получаем Имя клиента из св-ва заказа
$phone = $order_props->getPhone()->getValue(); // Получаем Номер телефона из св-ва заказа
$email = $order_props->getUserEmail()->getValue(); // Получаем Email из св-ва заказа
// Если заполнен номер телефона, пробуем найти контакт клиента по номеру телефона в Б24
if ($phone){
$params = [
'filter' => [ "PHONE" => $phone],
'select' => [ "ID", "NAME"]
];
$contactId = sendB24('crm.contact.list.json', $params)['result'][0]['ID'];
}
elseif ($email) {
// Если номер телефона не заполнен, ищем клиента по указанному Email
$params = [
'filter' => [ "EMAIL" => $email ],
'select' => [ "ID", "NAME" ]
];
$contactId = sendB24('crm.contact.list.json', $params)['result'][0]['ID'];
}
// Если контакт не найден в Б24, тогда создаём новый Контакт.
if (!$contactId){
$arContactFields = [
'fields' => [
"NAME" => $name,
"OPENED" => "Y",
"ASSIGNED_BY_ID" => 1,
"TYPE_ID" => "CLIENT",
"SOURCE_ID" => "WEB",
'PHONE' => isset($phone) ? array(array('VALUE' => $phone, 'VALUE_TYPE' => 'WORK')) : array(),
'EMAIL' => isset($email) ? array(array('VALUE' => $email, 'VALUE_TYPE' => 'WORK')) : array(),
],
'params' => array("REGISTER_SONET_EVENT" => "Y")
];
$contactId = sendB24('crm.contact.add.json', $arContactFields)['result'];
}
// Заполняем параметры для новой Сделки
$arDealFields = [
'fields' => array(
'TITLE' => 'Новый заказ товара: №'.$order->getId() , // Название сделки
'CONTACT_ID' => $contactId, // Клиент
'ASSIGNED_BY_ID' => '8', //ID ответственного сотрудника за Сделку
'SOURCE_ID' => 'WEB' // ID источника сделки
),
'params' => array("REGISTER_SONET_EVENT" => "Y")
];
// Создаём новую сделку для найденного или нового Клиента
$deal = sendB24('crm.deal.add.json', $arDealFields)['result'];
// Если у заказа есть привязанные товара, тогда привяжем эти товары для созданной сделки
if (count($basket->getQuantityList()) > 0 && $deal) {
$productParams = [
'id' => $deal
];
foreach ($basket as $basketItem){
$productParams['rows'][] = [
'PRODUCT_NAME' => $basketItem->getField('NAME'),
'PRICE' => $basketItem->getPrice(),
'QUANTITY' => $basketItem->getQuantity()
];
}
sendB24('crm.deal.productrows.set', $productParams);
}
}
}
Статья была полезна? Поблагодарите автора.
Самые читаемые
4 авг 2019
21 июл 2020
3 мар 2019