
Создал входящий вебхук 


" .
В настройках сайта указал данные
Департамент тоже прописал
Код обработчика тоже нормальный:
class Service_Bitrix
{
const VOLKOV_ANTON_BITRIX_ID = 11;
const VOLKOV_ANTON_ID = 9;
private function doRequest($method, $params = null)
{
require_once 'Zend/Http/Client.php';
require_once 'Zend/Http/Cookie.php';
$key = config('bitrix.webhook_key');
$company_name = config('bitrix.company_name');
$hookid = config('bitrix.hook_id');
$url = "https://$company_name.bitrix24.ru/rest/$hookid/$key/$method/";
$http_client = new Zend_Http_Client($url, [
'strictredirects' => true,
'timeout' => 30,
'keepalive' => true,
]);
if ($params) {
$http_client->setParameterPost($params);
}
$request = $http_client->request('POST');
$body = json_decode($request->getBody());
if ($request->getStatus() == 200) {
return $body;
} else {
if ($body->error == 'QUERY_LIMIT_EXCEEDED') {
sleep(1);
}
echo $method . ' ' . $body->error_description . '
';
';
var_dump($params);
var_dump($request->getBody());
return false;
}
}
/**
* Вернуть сделки
*/
public function getDeals()
{
$result = $this->doRequest('crm.deal.list');
var_dump($result);
}
/**
* Вернуть продукты
*/
public function getProducts()
{
$result = $this->doRequest('crm.product.list');
var_dump($result);
}
/**
* Добаить категорию
* @param array $data
* @return boolean
*/
public function addCategory($data)
{
$result = $this->doRequest('crm.productsection.add', [
'fields' => [
'NAME' => $data['name'],
'SECTION_ID' => $data['parent_id'],
],
]);
if ($result) {
$bitrix_id = (int)$result->result;
Mel_db::update('category', ['bitrix_id' => $bitrix_id], ['id' => $data['id']]);
return $bitrix_id;
} else {
return false;
}
}
/**
* Добавить категории
*/
public function addCategories()
{
$categories = Mel_Db::select('category', 'id,name,parent_id', 'bitrix_id is null', 'parent_id,id');
$id_trans = Mel_db::getPair("SELECT id,bitrix_id FROM category");
foreach ($categories as $category) {
if ($category['parent_id'] and !isset($id_trans[$category['parent_id']])) {
continue;
}
$bitrix_id = $this->addCategory([
'id' => $category['id'],
'name' => $category['name'],
'parent_id' => $category['parent_id'] ? $id_trans[$category['parent_id']] : 0,
]);
$id_trans[$category['id']] = $bitrix_id;
sleep(1);
}
}
/**
* Вернуть категории
*/
public function getCategories()
{
$result = $this->doRequest('crm.productsection.list');
var_dump($result);
}
/**
* Вернуть контакт
* @param string $user_email
*/
public function getContactId($user_email)
{
$result = $this->doRequest('crm.contact.list', [
'order' => ["DATE_CREATE" => "ASC"],
'filter' => ["TYPE_ID" => "CLIENT", "EMAIL" => $user_email],
'select' => ["ID"],
]);
if ($result->result) {
return $result->result[0]->ID;
} else {
return false;
}
}
/**
* Добавить контакт
* @param array $contact_data
* @param int $bitrix_manager_id
* @return boolean
*/
public function addContact(array $contact_data, int $bitrix_manager_id=null)
{
$result = $this->doRequest('crm.contact.add', [
'fields' => [
"LAST_NAME" => $contact_data['user_surname'],
"NAME" => $contact_data['user_firstname'],
"SECOND_NAME" => $contact_data['user_patronymic'],
"ASSIGNED_BY_ID" => $bitrix_manager_id,
"OPENED" => "Y",
"TYPE_ID" => "CLIENT",
"SOURCE_ID" => "SELF",
"EMAIL" => [
[
"VALUE" => $contact_data['user_email'],
"VALUE_TYPE" => "HOME",
],
],
"ADDRESS" => $contact_data['delivery_address'],
"PHONE" => [
[
"VALUE" => $contact_data['user_phone'],
"VALUE_TYPE" => "WORK",
],
],
],
'params' => ["REGISTER_SONET_EVENT" => "N"],
]);
if ($result) {
return (int)$result->result;
} else {
return false;
}
}
/**
* Обновить контакт в битриксе
* @param $bitrix_contact_id
* @param array $data
* @param int $bitrix_manager_id
* @return false|int
*/
public function updateContact($bitrix_contact_id, array $data, int $bitrix_manager_id)
{
$request_params = [
'id' => $bitrix_contact_id,
'fields' => [
"LAST_NAME" => $data['user_surname'],
"NAME" => $data['user_firstname'],
"SECOND_NAME" => $data['user_patronymic'],
"OPENED" => "Y",
"ASSIGNED_BY_ID" => $bitrix_manager_id,
"TYPE_ID" => "CLIENT",
"SOURCE_ID" => "SELF",
"EMAIL" => [
[
"VALUE" => $data['user_email'],
"VALUE_TYPE" => "HOME",
],
],
"PHONE" => [
[
"VALUE" => $data['user_phone'],
"VALUE_TYPE" => "WORK",
],
],
],
'params' => ["REGISTER_SONET_EVENT" => "N"],
];
if (isset($data['delivery_address']) and $data['delivery_address']) {
$request_params['fields']['ADDRESS'] = $data['delivery_address'];
}
$result = $this->doRequest('crm.contact.update', $request_params);
if ($result) {
return (int)$result->result;
} else {
return false;
}
}
/**
* Добавить продукт
* @param Model_Order_Item $item
* @return boolean
*/
public function addProductItem(Model_Order_Item $item)
{
include_once 'simple_html_dom.php';
$poster = $item->poster;
$product_name = 'арт. ' . $poster->getArticul() . ', ' . $poster->getName();
$product_info_arr = [];
$poster_view = View::factory('content/studio/poster/info');
$poster_view->poster = $poster;
$dom = str_get_html($poster_view);
foreach ($dom->find('.rows .row') as $row) {
$rub = '';
$value_dom = $row->find('.value');
$label_dom = $row->find('.label');
if ($value_dom and isset($value_dom[0]) and $value_dom[0]->getAttribute('data-price')) {
$rub = ' руб.';
}
$d = [];
if ($label_dom and isset($label_dom[0])) {
$d[] = trim($label_dom[0]->outertext());
}
if ($value_dom and isset($value_dom[0])) {
$d[] = '' . trim($value_dom[0]->outertext()) . $rub . '';
}
$product_info_arr[] = preg_replace('/\s+/', ' ', implode("\n", $d));
}
$product_info = "
https://tvoyposter.ru" . $poster->getShareUrl() . "' target='_blank'>
" . $product_name . "
";
if ($poster instanceof Model_Poster and isset($poster->image->ext_link) and $poster->image->ext_link) {
}
$product_info .= "
Количество: {$item->amount} шт.
" .
implode("
", $product_info_arr);
", $product_info_arr);
return $product_info;
}
/**
* Добавить заказ
* @param Model_Order $order
* @return bool
* @throws Exception_500
*/
public function addOrder(Model_Order $order)
{
if (!$order->bitrix_manager_id) {
$this->attachManager($order);
}
$comment = [];
//данные для JSON
$order_json = [
'origin' => 'tvoyposter',
'number' => $order->order_id,
'datetime' => date('Y-m-dTH:i:s+03:00', $order->add_time),
'comments' => $order->comments,
'discount_percent' => $order->getDiscount(),
'discount_value' => $order->getDiscountValue($order->getDiscount()),
'total' => (int)$order->sum_final,
'delivery' => [
'type' => $order->delivery->name,
'address' => $order->delivery_address,
],
'payment_type' => $order->payment->name,
'contact' => [
'name' => $order->getUserName(),
'phone' => $order->user_phone,
'email' => $order->user_email,
],
'products' => [],
];
$items_proccess = 0;
$items_sum_total = 0;
/** @var Model_Order_Item $item */
foreach ($order->items as $item) {
$product_data = [
'amount' => $item->amount,
'price' => $item->price,
'sum' => $item->sum,
'type' => $item->type,
'name' => $item->poster->getName(),
'width' => $item->poster->getFullWidth(),
'height' => $item->poster->getFullHeight(),
'params' => $item->poster->getParamsFor1C(),
];
if ($item->poster instanceof Model_Poster
and isset($item->poster->image->ext_link)
and $item->poster->image->ext_link) {
$product_data['ext_link'] = $item->poster->image->ext_link;
}
$order_json['products'][] = $product_data;
$items_sum_total += $item->sum;
$comment[] = $this->addProductItem($item);
$items_proccess++;
}
$order_item_count = (int)Mel_Db::getOne("SELECT count(*) as c FROM order_item where order_id={$order->id}");
if ($items_proccess != $order_item_count) {
Helper_Log::log('bitrix', "$order->id количество не совпадает $order_item_count / $items_proccess");
return false;
}
Helper_Log::log('bitrix', $order->id . ' ' . count($order->getItems()) . '/' . $items_proccess);
$comment = $order->comments . '
' .
' .
'
- ' .
implode('', $comment) .
'';
$add_comment = '';
if ($order->used_points) {
$add_comment .= 'Использовано баллов : ' . $order->used_points;
}
$discount_value = $order->getDiscountValue($order->getDiscount());
if ($discount_value) {
$add_comment .= '
Размер скидки: ' . $discount_value . ' руб';
Размер скидки: ' . $discount_value . ' руб';
}
$STANDART_TIME_ID = 3; //стандартное время изготовления
if ($order->time and $order->time->id !== $STANDART_TIME_ID) {
$add_comment .= '
' . $order->time->name . ' ' . $order->time_price . ' руб';
' . $order->time->name . ' ' . $order->time_price . ' руб';
}
if ($add_comment) {
$comment .= '
' . $add_comment;
' . $add_comment;
}
//получаем ID контакта
$contact_id = $this->getContactId($order->user_email);
if ($contact_id) {
$this->updateContact($contact_id, $order->getParams(), $order->bitrix_manager_id);
} else {
$contact_id = $this->addContact($order->getParams(), $order->bitrix_manager_id);
}
$pdf_rand_path = uniqid() . '.pdf';
$command = '/usr/bin/wkhtmltopdf https://tvoyposter.ru/order/list_products?order_id=' . $order->id . ' ' . realpath(Treebika::docroot()) . '/temp/pdf/' . $pdf_rand_path;
exec(escapeshellcmd($command), $output, $exit_code);
$pdf_link = "https://tvoyposter.ru/temp/pdf/$pdf_rand_path'>PDF
";
";
$files_list = '';
if ($order->files) {
$files = unserialize($order->files);
if ($files and is_array($files)) {
$files_list = 'Загруженные файлы:
- ';
foreach ($files as $file) {
$files_list .= "$file ";
}
$files_list .= '
';
';
}
}
$comment = $pdf_link . $files_list . $comment;
$result = $this->doRequest('crm.deal.add', [
'fields' => [
"ASSIGNED_BY_ID" => $order->bitrix_manager_id,
"TITLE" => "Заказ №" . $order->order_id,
"TYPE_ID" => "GOODS",
"STAGE_ID" => "NEW",
"CONTACT_ID" => $contact_id,
"OPENED" => "Y",
"PROBABILITY" => 100,
"CURRENCY_ID" => "RUB",
"OPPORTUNITY" => $order->sum_final,
"BEGINDATE" => date('Y-m-dTH:i:s+03:00', $order->add_time),
"CLOSEDATE" => date('Y-m-dTH:i:s+03:00', $order->add_time),
"COMMENTS" => $comment,
//скидка
"UF_CRM_1495396920" => $order->getDiscount(),
//доставка
"UF_CRM_1495396944" => $order->delivery->name,
//итого
"UF_CRM_1496345886" => number_format($order->getFinalPrice(true, $order->getDiscount()), 0, '.', ' '),
"UF_CRM_1507733012" => $order->delivery_address,
"UF_CRM_1507893389" => json_encode($order_json),
"UF_CRM_1509029611" => $order->time ? $order->time->name : '',
"UF_CRM_1510661912" => $order->delivery_cdek,
"UF_CRM_1533293178" => date('Y-m-dTH:i:s+03:00', $order->add_time),
],
'params' => ["REGISTER_SONET_EVENT" => "N"],
]);
$bitrix_order_id = (int)$result->result;
$order->bitrix_sended = 1;
$order->save();
$this->sendMessage($order->bitrix_manager_id,
'Новый https://tvoy-portret.bitrix24.ru/crm/deal/show/' . $bitrix_order_id . '/">заказ №' . $order->order_id . '');
return true;
}
/**
* Добавить заявку с сайта в заказы
* @param $data
* @return bool
*/
public function addRequestFromSite($data)
{
$contact_id = $this->getContactId($data['user_email']);
if (!$contact_id) {
$contact_id = $this->addContact($data);
}
//определяем ID ответственного менеджера в Битриксе
//для заказов "Вызов дизайнера" или "Заказ визуализации" всегда ставим ответственного Волкова Антона
if (in_array($data['type'], ['Вызов дизайнера', 'Заказ визуализации'])) {
$manager_bitrix_id = Service_Bitrix::VOLKOV_ANTON_BITRIX_ID;
} else {
$manager_bitrix_id = 0;
$managers = $this->getSavedManagers();
if (!$managers or count($managers) == 0) {
return false;
}
$request_last_manager_id = Helper_Params::get('request_last_manager_id'); //ID последнего менеджера
$request_last_manager_id = $request_last_manager_id ? $request_last_manager_id : 0;
foreach ($managers as $n => $manager) {
if ($manager->bitrix_id > $request_last_manager_id) {
$manager_bitrix_id = $manager->bitrix_id;
break;
}
}
if (!$manager_bitrix_id) {
$manager_bitrix_id = $managers[0]->bitrix_id;
}
Helper_Params::save('request_last_manager_id', $manager_bitrix_id);
}
$result = $this->doRequest('crm.deal.add', [
'fields' => [
"ASSIGNED_BY_ID" => $manager_bitrix_id,
"TITLE" => $data['type'],
"TYPE_ID" => "GOODS",
"STAGE_ID" => "NEW",
"CONTACT_ID" => $contact_id,
"OPENED" => "Y",
"PROBABILITY" => 100,
"CURRENCY_ID" => "RUB",
"BEGINDATE" => date('Y-m-dTH:i:s+03:00'),
"COMMENTS" => $data['commentary'],
],
'params' => ["REGISTER_SONET_EVENT" => "N"],
]);
}
public function checkOrder()
{
}
/**
* Вернуть заказ
* @param int $order_id
*/
public function getOrder($order_id)
{
$result = $this->doRequest('crm.deal.get', ['id' => $order_id]);
var_dump($result);
}
/**
* Добавить лид
* type - тип лида
* name - имя
* commentary - комментарий
* email - емейл
* phone - телефон
* address - адрес
* @param array $data
*/
public function addLead($data, $manager_bitrix_id = 0)
{
if (!$manager_bitrix_id) {
$managers = $this->getSavedManagers();
}
$result = $this->doRequest('crm.lead.add', [
'fields' => [
'ASSIGNED_BY_ID' => $manager_bitrix_id,
'TITLE' => $data['type'],
'NAME' => $data['name'],
'SOURCE_ID' => 'WEB',
'SOURCE_DESCRIPTION' => $data['commentary'],
'COMMENTS' => $data['commentary'],
"EMAIL" => [
[
"VALUE" => $data['email'],
"VALUE_TYPE" => "HOME",
],
],
"ADDRESS" => $data['address'],
"PHONE" => [
[
"VALUE" => $data['phone'],
"VALUE_TYPE" => "WORK",
],
],
],
'params' => ["REGISTER_SONET_EVENT" => "N"],
]);
}
/**
* Вернуть лида
* @param mixed $lead_id
*/
public function getLead($lead_id)
{
$result = $this->doRequest('crm.lead.get', ['id' => $lead_id]);
var_dump($result);
}
/**
* Обновить сохраненных менеджеров
* @return mixed
* @throws Exception_500
*/
public function updateManagers()
{
$manager_departament_id = config('bitrix.manager_departament_id');
$result = $this->doRequest('user.get', [
'FILTER' => [
'UF_DEPARTMENT' => $manager_departament_id,
'ACTIVE' => 1,
],
]);
$managers_info = [];
foreach ($result->result as $m) {
if ($m->ID == 38) {
continue;
}
$managers_info[$m->ID] = $m->NAME . ' ' . $m->LAST_NAME;
$stored_manager = new Model_Manager(['bitrix_id' => $m->ID]);
if ($stored_manager->id) {
$stored_manager->email = $m->EMAIL;
$stored_manager->save();
} else {
$new_manager = new Model_Manager();
$new_manager->name = $m->NAME;
$new_manager->surname = $m->LAST_NAME;
$new_manager->email = $m->EMAIL;
$new_manager->bitrix_id = $m->ID;
$new_manager->hidden = 0;
$new_manager->save();
}
}
Helper_Params::save('manager_info', $managers_info);
return $managers_info;
}
/**
* Вернуть массив сохраненных менеджеров
* @return array
*/
public function getSavedManagers()
{
return Model_Manager::get(Model_Manager::class, ['hidden' => 0], 'id');
}
public function getTimeManStatus($user_id)
{
$result = $this->doRequest('timeman.status', [
'USER_ID' => $user_id,
]);
var_dump($result);
}
public function sendMessage($user_bitrix_id, $message)
{
$result = $this->doRequest('im.notify', [
'to' => $user_bitrix_id,
'message' => $message,
'type' => 'SYSTEM',
]);
}
/**
* Присоединить к заказу менеджера
* @param Model_Order $order
* @return Model_Order|void
* @throws Exception_500
*/
public function attachManager(Model_Order $order)
{
$manager = $this->getNextManager($order->sum_total);
$order->manager_id = $manager->id;
$order->bitrix_manager_id = $manager->bitrix_id;
$order->save();
return $order;
}
/**
* Вернуть ID ответственного менеджера
* @param int $sum
* @return void|Model_Manager
*/
public function getNextManager($sum)
{
$managers = $this->getSavedManagers();
if (!$managers) {
return;
}
if ($sum < 3000) {
$range = 'sum_total < 3000';
} else {
if ($sum < 10000) {
$range = 'sum_total >= 3000 and sum_total < 10000';
} else {
$range = 'sum_total >= 10000';
}
}
$last_in_range_order_managers_id = Mel_Db::getColumn("
SELECT manager_id
FROM `order`
WHERE user_name !='AUTOTEST' AND $range AND manager_id IS NOT NULL
ORDER BY id DESC
LIMIT 0, " . count($managers) * 2);
$found = false;
if ($last_in_range_order_managers_id) {
$last_in_range_order_manager_id = $last_in_range_order_managers_id[0];
foreach ($managers as $manager) {
if ($manager->id > $last_in_range_order_manager_id) {
//Волков
if ($manager->id == self::VOLKOV_ANTON_ID) {
//убираем с Волкова распределение заказов дороже 15000 руб.
if ($sum > 15000) {
continue;
}
//так же Волков должен "пропускать" один круг распределения
for ($i = 0; $i < count($last_in_range_order_managers_id); $i++) {
if ($last_in_range_order_managers_id[$i] == self::VOLKOV_ANTON_ID and $i < count($managers)) {
continue 2;
}
}
}
$found = true;
break;
}
}
}
if (!$found) {
$manager = array_shift($managers);
}
return $manager;
}
}
Но данные заказа с сайта все равно в Битрикс24 не уходят, можете подсказать где ту косяк?
Для персональной подписи, участник не представляет организацию.
Нет комментариев
Предыдущие комментарии
для добавления комментариев необходимо авторизоваться

Горячие темы форума
Форум
18.05.2020 5 20.05.202009:14
Как добавить в карточке сделки визуальное отображение что клиент это дизайнер?
CRM18.05.2020 5 20.05.202009:14