/
gewoehnlich
/
test
Обзор
Документация
Войти
/
gewoehnlich
/
test
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
test_update
webform_bitrix_integration.php
721 строка
27 KB
gewoehnlich
upload files test update
23 дек 2024, 13:58
23 дек 2024, 13:58
dac7570
Код
Авторство
О чём код?
<?php require_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_before.php"); CModule::IncludeModule('crm'); ob_start(); echo '<pre>'; print_r($_REQUEST); echo '</pre>'; file_put_contents($_SERVER["DOCUMENT_ROOT"] . "/local/tilda/debug.log", PHP_EOL . ob_get_clean(), FILE_APPEND); global $USER; if (!$USER->IsAuthorized()) { $USER->Authorize(1); } $ob = new WebformBitrixIntegration($_REQUEST); $USER->Logout(); class WebformBitrixIntegration { private $data; private $LOG_FILENAME; private $dealFactory; private $contactFactory; private $companyFactory; private $default_assigned_by_id; private $deal_category_id; private $deal_stage_id; private $contact_parameters = []; private $deal_parameters = []; private $deal_id; private $city_hashmap = []; private $utm = []; private $company_parameters = []; private $contact_id; private $company_id; private $services; private $phone; private $email; public function __construct($data) { $this->data = $data; $this->LOG_FILENAME = $_SERVER["DOCUMENT_ROOT"] . "/local/tilda/debug.log"; $this->dealFactory = \Bitrix\Crm\Service\Container::getInstance()->getFactory(\CCrmOwnerType::Deal); $this->contactFactory = \Bitrix\Crm\Service\Container::getInstance()->getFactory(\CCrmOwnerType::Contact); $this->companyFactory = \Bitrix\Crm\Service\Container::getInstance()->getFactory(\CCrmOwnerType::Company); $this->default_assigned_by_id = 8573; $this->deal_category_id = 12; $this->deal_stage_id = "C12:NEW"; $this->city_hashmap = [ 'Владивосток' => 1287, 'Екатеринбург' => 364, 'Ижевск' => 1311, 'Иркутск' => 1288, 'Казань' => 1312, 'Красноярск' => 1289, 'Нижний Новгород' => 1313, 'Нижний Тагил' => 1064, 'Новосибирск' => 372, 'Омск' => 368, 'Оренбург' => 1290, 'Пермь' => 1259, 'Ростов-на-Дону' => 1291, 'Самара' => 1292, 'Сургут' => 1314, 'Тобольск' => 1315, 'Тольятти' => 1293, 'Тюмень' => 366, 'Уфа' => 1294, 'Хабаровск' => 1295, 'Челябинск' => 370 ]; $this->utm = [ 'UTM_SOURCE' => !empty($data['utm_source']) ? $data['utm_source'] : '', 'UTM_CAMPAIGN' => !empty($data['utm_campaign']) ? $data['utm_campaign'] : '', 'UTM_CONTENT' => !empty($data['utm_content']) ? $data['utm_content'] : '', 'UTM_MEDIUM' => !empty($data['utm_medium']) ? $data['utm_medium'] : '', 'UTM_TERM' => !empty($data['utm_term']) ? $data['utm_term'] : '' ]; $this->services = [ "Покупка ингредиентов" => 1847, "Терминалы безналичной оплаты" => 1848, "Подбор запасных частей" => 1849, "Ремонт оборудования" => 1850, "Прием монет" => 1851, "Подбор локации" => 1852, "Видеоинструкции" => 1853, "Обслуживание вендинга" => 1854, "Оформление торговых автоматов" => 1855, "Изготовление корнеров" => 1856, "Проведение промо-дегустаций" => 1857, "Предоставление склада" => 1858, ]; $this->main(); echo "ok"; } private function writeLog($message, string $level = 'ЛОГ'): void { if (empty($this->LOG_FILENAME)) { return; } if (!is_string($message)) { $message = json_encode($message); } $timestamp = date('Y-m-d H:i:s'); $logEntry = "[{$timestamp}] [{$level}] : {$message}" . PHP_EOL; file_put_contents($this->LOG_FILENAME, PHP_EOL . $logEntry, FILE_APPEND); } private function print($text) { echo "<pre>"; print_r($text); echo "</pre>"; } private function main() { $fm = []; $phone = $this->data['Phone'] ?? $this->data['PHONE'] ?? $this->data['phone'] ?? $this->data['Телефон']; if ($phone) { $fm["PHONE"] = [ "n0" => [ "VALUE" => $phone, "VALUE_TYPE" => "WORK", ], ]; } $email = $this->data['Email'] ?? $this->data['EMAIL'] ?? $this->data['email']; if ($email) { $fm["EMAIL"] = [ "n0" => [ "VALUE" => $email, "VALUE_TYPE" => "WORK", ], ]; } $this->contact_parameters = [ "FM" => $fm ]; $form_id = $this->data['formid']; switch ($form_id) { // 2) Подпишитесь на рассылку case "form200579856": $fm = []; $phone = $this->data['Phone'] ?? $this->data['PHONE']; if ($phone) { $fm["PHONE"] = [ "n0" => [ "VALUE" => $phone, "VALUE_TYPE" => "WORK", ], ]; } $email = $this->data['Email'] ?? $this->data['EMAIL']; if ($email) { $fm["EMAIL"] = [ "n0" => [ "VALUE" => $email, "VALUE_TYPE" => "WORK", ], ]; } $this->contact_parameters["NAME"] = $this->data['EMAIL']; $this->contact_id = $this->getContactId(); $this->deal_parameters = [ "TITLE" => 'Заполнение формы "Подпишитесь на наши новости" на umvend.ru', "SOURCE_ID" => 79634417683, // umvend.ru "SOURCE_DESCRIPTION" => 'Заполнение формы "Подпишитесь на наши новости" на umvend.ru', ]; $this->createNewDeal(); break; // 3) Корзина case "form225730334": $this->contact_parameters["NAME"] = $this->data['Name']; $this->contact_parameters["LAST_NAME"] = $this->data['surname']; $this->contact_parameters["UF_CRM_6628C0A782C82"] = $this->data['card_number']; $this->contact_id = $this->getContactId(); $this->deal_parameters = [ "TITLE" => 'Заказ из корзины на umvend.ru', "SOURCE_ID" => 79634417683, // umvend.ru "SOURCE_DESCRIPTION" => 'Заказ из корзины на umvend.ru', "UF_CRM_6627963AAD941" => $this->data['payment']['delivery_address'], "UF_CRM_6627963AF2D5E" => $this->data['payment']['delivery'], "UF_CRM_6627963B35D91" => $this->data['payment']['delivery_price'], "UF_CRM_6627963C0578E" => $this->data['payment']['delivery_zip'], "UF_CRM_6627963C2F738" => $this->data['payment']['delivery_fio'], "UF_CRM_6628BE70B4B0C" => $this->data['payment']['promocode'], // ????? "UF_CRM_6628C0A7B4655" => $this->data['card_number'], "COMMENTS" => $this->data['payment']['delivery_comment'], ]; $this->createNewDeal(); $this->assignProductRows(); break; // 4) Стань партнером case "form433043389": $this->contact_parameters["NAME"] = $this->data['Name']; $this->contact_parameters["EMAIL"] = $this->data['Email']; $this->contact_parameters["PHONE"] = $this->data['Phone']; $this->contact_parameters["UF_CRM_6368C709057DF"] = $this->city_hashmap[$this->data['city']] ?? ""; $this->contact_id = $this->getContactId(); $this->company_parameters = [ "TITLE" => $this->data['company_name'] ?? "тест", "EMAIL" => $this->data['Email'], "PHONE" => $this->data['Phone'], "UF_CRM_6368C709057DF" => $this->city_hashmap[$this->data['city']] ?? "", "UF_CRM_1734506248645" => $this->data['Количество_торговых_автоматов_в_сети'] ?? "", // количество торговых автоматов в сети ]; // $this->company_id = $this->getCompanyId(); // $this->addContactToCompany(); $this->deal_parameters = [ "TITLE" => 'Заполнение формы "Стань партнером" на umvend.ru/union', "SOURCE_ID" => 79634417683, // umvend.ru "SOURCE_DESCRIPTION" => 'Заполнение формы "Стань партнером" на umvend.ru/union', "UF_CRM_6368C7093BE5F" => $this->city_hashmap[$this->data['city']] ?? "", ]; $this->createNewDeal(); break; // 4.1) Стань партнером case "form433064750": // $this->contact_parameters["NAME"] = $this->data['Name']; $this->contact_parameters["EMAIL"] = $this->data['Email']; $this->contact_parameters["PHONE"] = $this->data['Phone']; $this->contact_parameters["UF_CRM_6368C709057DF"] = $this->city_hashmap[$this->data['city']] ?? ""; $this->contact_id = $this->getContactId(); $this->company_parameters = [ "TITLE" => $this->data['company'] ?? "тест", "UF_CRM_6368C709057DF" => $this->city_hashmap[$this->data['city']] ?? "", "UF_CRM_1734506248645" => $this->data['Количество_торговых_автоматов_в_сети'] ?? "", // количество торговых автоматов в сети ]; // $this->company_id = $this->getCompanyId(); // $this->addContactToCompany(); $this->deal_parameters = [ "TITLE" => 'Заполнение формы "Стань партнером" на umvend.ru/union', "SOURCE_ID" => 79634417683, // umvend.ru "SOURCE_DESCRIPTION" => 'Заполнение формы "Стань партнером" на umvend.ru/union', "UF_CRM_6368C7093BE5F" => $this->city_hashmap[$this->data['city']] ?? "", // ????? ]; $this->createNewDeal(); break; // 5) Стать Слушателем case "form433011907": // $this->contact_parameters["NAME"] = $this->data['Name']; $this->contact_parameters["UF_CRM_6368C709057DF"] = $this->city_hashmap[$this->data['Input']] ?? ""; $this->contact_id = $this->getContactId(); $dateString = $this->data["Date"]; $date = DateTime::createFromFormat('d-m-Y', $dateString); $date = $date->format('d.m.Y'); $this->deal_parameters = [ "TITLE" => 'Заполнение формы "Стать слушателем" на umvend.ru/union', "SOURCE_ID" => 79634417683, // umvend.ru "SOURCE_DESCRIPTION" => 'Заполнение формы "Стать слушателем" на umvend.ru/union', "UF_CRM_6368C7093BE5F" => $this->city_hashmap[$this->data['Input']] ?? "", // ????? "UF_CRM_1734508098625" => $date // ????? ]; $this->createNewDeal(); break; // 6) Узнать преимущества Активного партнера case "form439804809": // $this->contact_parameters["NAME"] = $this->data['Name']; $this->contact_parameters["UF_CRM_6368C709057DF"] = $this->city_hashmap[$this->data['Input']] ?? ""; $this->contact_id = $this->getContactId(); $this->deal_parameters = [ "TITLE" => 'Заполнение формы "Узнать преимущества Активного партнера" на umvend.ru/union', "SOURCE_ID" => 79634417683, // umvend.ru "SOURCE_DESCRIPTION" => 'Заполнение формы "Узнать преимущества Активного партнера" на umvend.ru/union', "UF_CRM_6368C7093BE5F" => $this->city_hashmap[$this->data['Input']] ?? "" // ????? ]; $this->createNewDeal(); break; // 7) Услуги case "form423609500": $this->contact_parameters["NAME"] = $this->data['Name']; $this->contact_id = $this->getContactId(); $this->deal_parameters = [ "TITLE" => 'Заполнение формы "Услуги" на umvend.ru/services', "SOURCE_ID" => 79634417683, // umvend.ru "SOURCE_DESCRIPTION" => 'Заполнение формы "Узнать преимущества Активного партнера" на umvend.ru', "UF_CRM_DEAL_SERVICES" => $this->services[$this->data['Выберете_услугу']], ]; $this->createNewDeal(); break; // 8) Трейдин case "form450945461": $this->contact_parameters["NAME"] = $this->data['Name']; $this->contact_id = $this->getContactId(); $this->deal_parameters = [ "TITLE" => 'Заполнение формы "Трейдин" на umvend.ru/trade-in', "SOURCE_ID" => 79634417683, // umvend.ru "SOURCE_DESCRIPTION" => 'Заполнение формы "Трейдин" на umvend.ru/trade-in', ]; $this->createNewDeal(); break; // 9) Мини-кофейня case "form618821455": $this->contact_parameters["NAME"] = $this->data['name']; $this->contact_id = $this->getContactId(); $this->deal_parameters = [ "TITLE" => 'Заполнение формы "Мини-кофейня" на umvend.ru/coffee-points', "SOURCE_ID" => 79634417683, // umvend.ru "SOURCE_DESCRIPTION" => 'Заполнение формы "Мини-кофейня" на umvend.ru/coffee-points', ]; $this->createNewDeal(); break; // 10) Вендинг 2.0 для вашего бизнеса case "form569534671": $this->contact_parameters["NAME"] = $this->data['Имя']; $this->contact_id = $this->getContactId(); $this->deal_parameters = [ "TITLE" => 'Заполнение формы "Вендинг 2.0 для вашего бизнеса" на umvend.ru/forbusiness', "SOURCE_ID" => 79634417683, // umvend.ru "SOURCE_DESCRIPTION" => 'Заполнение формы "Мини-кофейня" на umvend.ru/forbusiness', ]; $this->createNewDeal(); break; // 11) Хотите установить мини-кофейню? case "form321123937": $this->contact_parameters["NAME"] = $this->data['Phone']; $this->contact_parameters["UF_CRM_6368C709057DF"] = $this->city_hashmap[$this->data['Input']] ?? ""; $this->contact_id = $this->getContactId(); $this->deal_parameters = [ "TITLE" => 'Заполнение формы "Хотите установить мини-кофейню?" на umvend.ru', "SOURCE_ID" => 79634417683, // umvend.ru "SOURCE_DESCRIPTION" => 'Заполнение формы "Хотите установить мини-кофейню?" на umvend.ru', "UF_CRM_6368C7093BE5F" => $this->city_hashmap[$this->data['Input']] ?? "", ]; $this->createNewDeal(); break; // 12) Установка вендинга для бизнеса case "form618821510": $this->contact_parameters["NAME"] = $this->data['Имя']; $this->contact_id = $this->getContactId(); $this->deal_parameters = [ "TITLE" => 'Заполнение формы "Установка вендинга для бизнеса" на umvend.ru/coffee-points', "SOURCE_ID" => 79634417683, // umvend.ru "SOURCE_DESCRIPTION" => 'Заполнение формы "Хотите установить мини-кофейню?" на umvend.ru/coffee-points' ]; $this->createNewDeal(); break; default: break; }; } private function createNewDeal() { $item = $this->dealFactory->createItem(); $item->set("CATEGORY_ID", $this->deal_category_id); $item->set("STAGE_ID", $this->deal_stage_id); if (!empty($this->contact_id)) { $item->set("CONTACT_ID", $this->contact_id); } if (!empty($this->company_id)) { $item->set("COMPANY_ID", $this->company_id); } foreach ($this->deal_parameters as $key => $value) { $item->set($key, $value); } foreach ($this->utm as $key => $value) { $item->set($key, $value); } $result = $item->save(); $context = \Bitrix\Crm\Service\Container::getInstance()->getContext(); $saveOperation = $this->dealFactory->getAddOperation($item, $context); $res = $saveOperation->launch(); $this->deal_id = $item->getId(); } private function getContactId(): int | null { $contact_id_by_phone_result = $this->searchForContactByPhone(); if (!empty($contact_id_by_phone_result)) { return $contact_id_by_phone_result; } $contact_id_by_email_result = $this->searchForContactByEmail(); if (!empty($contact_id_by_email_result)) { return $contact_id_by_email_result; } $created_contact_id = $this->addNewContact(); return $created_contact_id; } private function searchForContactByPhone(): int | null { $phone = $this->data['Phone'] ?? $this->data['PHONE']; if (empty($phone)) { return null; } $contactCollection = $this->contactFactory->getItems([ 'filter' => [ 'PHONE' => $phone ], 'select' => [ 'ID' ] ]); foreach ($contactCollection as $contactData) { $contact_id = $contactData->getId(); return $contact_id; } return null; } private function searchForContactByEmail(): int | null { $email = $this->data['Email'] ?? $this->data['EMAIL']; if (empty($email)) { return null; } $contactCollection = $this->contactFactory->getItems([ 'filter' => [ 'EMAIL' => $email ], 'select' => [ 'ID' ] ]); foreach ($contactCollection as $contactData) { $contact_id = $contactData->getId(); return $contact_id; } return null; } private function addNewContact(): int | null { $contact = new CCrmContact(false); $this->contact_parameters["UF_CRM_CONTACT_1728836063899"] = "неизвестно"; $this->contact_parameters["UF_CRM_CONTACT_1729060205591"] = "неизвестно"; $this->contact_parameters["UF_CRM_CONTACT_1729060241350"] = "неизвестно"; $this->contact_parameters["UF_CRM_CONTACT_1733128543933"] = "0|RUB"; $this->contact_parameters["ASSIGNED_BY_ID"] = $this->default_assigned_by_id; $contact_id = $contact->Add($this->contact_parameters); return $contact_id; } private function assignProductRows() { foreach ($this->data['payment']['products'] as $product_row) { $product = $this->findProductByGUID($product_row['externalid']); if (!empty($product)) { $this->addProductToOrder($product, $product_row); } else { $productId = $this->makeNewProduct($product_row); $this->addProductToOrder($productId, $product_row); } } } private function findProductByGUID($product_GUID) { $result = CCatalogProduct::GetList( $arOrder = array(), $arFilter = array( '=ELEMENT_XML_ID' => $product_GUID ), $arGroupBy = false, $arNavStartParams = false, $arSelectFields = array(), $arOptions = array() )->Fetch(); return $result['ID']; } private function addProductToOrder($product_id, $product_row) { $product_info = [ 'OWNER_TYPE' => 'D', 'OWNER_ID' => $this->deal_id, 'PRODUCT_ID' => $product_id, 'QUANTITY' => $product_row['quantity'], 'PRICE' => $product_row['price'], "PRICE_EXCLUSIVE" => $product_row['price'], "PRICE_NETTO" => $product_row['price'], "PRICE_BRUTTO" => $product_row['price'], "PRICE_ACCOUNT" => $product_row['price'], 'MEASURE_CODE' => 796, "PRODUCT_NAME" => $product_row["name"], "CURRENCY_ID" => "RUB" ]; $result = CCrmProductRow::Add( $product_info, $checkPerms = true, $regEvent = true ); } private function makeNewProduct($product_row) { $iblockElement = new CIBlockElement; $iblockFields = array( 'IBLOCK_SECTION_ID' => 1, 'IBLOCK_ID' => 24, 'NAME' => $product_row['name'], 'ACTIVE' => 'Y', 'XML_ID' => $product_row['externalid'] ); $productId = $iblockElement->Add($iblockFields, false, true, true); if ($productId) { $productFields = [ 'ID' => $productId, 'AVAILABLE' => 'Y', "NAME" => $product_row['name'], "MEASURE" => 9, "ELEMENT_XML_ID" => $product_row['externalid'], "PRODUCT_NAME" => $product_row['name'], "SECTION_ID" => 1 ]; $result = CCatalogProduct::Add($productFields); $productPriceFields = [ 'PRODUCT_ID' => $productId, 'CATALOG_GROUP_ID' => 2, 'PRICE' => $product_row['price'], "CURRENCY" => "RUB", ]; $price_result = CPrice::Add($productPriceFields); } return $productId; } private function getCompanyId(): int | null { $company_id_by_phone_result = $this->searchForCompanyByPhone(); if (!empty($company_id_by_phone_result)) { return $company_id_by_phone_result; } $company_id_by_email_result = $this->searchForCompanyByEmail(); if (!empty($company_id_by_email_result)) { return $company_id_by_email_result; } $created_company_id = $this->addNewCompany(); return $created_company_id; } private function searchForCompanyByPhone(): int | null { $phone = $this->data['Phone'] ?? $this->data['PHONE']; if (empty($phone)) { return null; } $companyCollection = $this->companyFactory->getItems([ 'filter' => [ 'PHONE' => $phone ], 'select' => [ 'ID' ] ]); foreach ($companyCollection as $companyData) { $company_id = $companyData->getId(); return $company_id; } return null; } private function searchForCompanyByEmail(): int | null { $email = $this->data['Email'] ?? $this->data['EMAIL']; if (empty($email)) { return null; } $companyCollection = $this->companyFactory->getItems([ 'filter' => [ 'EMAIL' => $email ], 'select' => [ 'ID' ] ]); foreach ($companyCollection as $companyData) { $company_id = $companyData->getId(); return $company_id; } return null; } private function addNewCompany(): int | null { if ($this->data['formid'] == "form200579856") { return null; } $item = $this->companyFactory->createItem(); foreach ($this->company_parameters as $key => $value) { if (empty($value)) { continue; } $item->set($key, $value); } $result = $item->save(); $context = \Bitrix\Crm\Service\Container::getInstance()->getContext(); $saveOperation = $this->companyFactory->getAddOperation($item, $context); $saveResult = $saveOperation->launch(); if ($saveResult->isSuccess()) { return $saveResult->getId(); } else { $errors = $saveResult->getErrorMessages(); } return null; } private function addContactToCompany() { if (empty($this->company_id) || empty($this->contact_id)) { return; } $company = $this->companyFactory->getItem($this->company_id); $companyContacts = $company->get("CONTACT"); $companyContacts[] = $this->contact_id; $company->set("CONTACT", $companyContacts); // save } }