/ Bitrix24 создание сделки на основе нового заказа на сайте под управлением Bitrix

Bitrix24 создание сделки на основе нового заказа на сайте под управлением Bitrix

12 ноя 2022
Дмитрий М.
2

Пусть стоит задача - создавать в Битрикс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);
        }

    }

}

Статья была полезна? Поблагодарите автора.

Самые читаемые
#1С Битрикс, #Bitrix CMS, #.htaccess, #настройка редиректов
4 авг 2019
#Хлебные крошки, #1С Битрикс, #Bitrix CMS, #bitrix:breadcrumbs, #component_epilog, #кэширование
1 окт 2018
#ресайз изображений, #1С Битрикс, #Bitrix CMS
3 мар 2019
#Bitrix CMS, #breadcrumb, #bitrix:breadcrumbs, #хлебные крошки, #настройка
13 фев 2019
#bitrix:news, #сортировка, #фильтрация, #bitrix:catalog, #catalog.section, #news.list
16 дек 2020
#bitrix, #robots.txt, #sitemap.xml, #поддомены, #мультисайтовость
16 окт 2018
#bitrix, #bitrix:catalog.section, #скидки, #товары со скидкой, #страница скидок, #страница со скидками
4 окт 2018
#bitrix, #свойства элементов, #обработчик событий, #OnBeforeIBlockElementUpdate, #OnIBlockElementSetPropertyValues
21 июл 2020
#bitrix, #пользовательские свойства, #тип свойств, #привязка к элементам
27 ноя 2019