Заказать проект
Оставьте заявку для получения коммерческого предложения.
Заполните форму и мы вышлем Вам предложение в котором решим,
чем можем вам помочь.
Телефония Битрикс24: как не пропустить ни одного звонка

Телефония Битрикс24: как не пропустить ни одного звонка

29 Июня 2018
Владимир Сидлецкий
Back End Developer
Владимир Сидлецкий
следующая статья

В большинстве компаний, интернет-магазинах или организациях,  в основном, продажи напрямую связаны с телефонными переговорами. Для менеджеров разрабатываются специальные скрипты общения с клиентами, проводятся тренинги. Но даже эти действия не исключают человеческие ошибки. 

Чтобы минимизировать потери новых или действующих клиентов, многие компании переходят на IP телефонию. Ведь с ее помощью можно контролировать все этапы общения и тем самим анализировать уровень обслуживания (например, прослушивать записи разговоров менеджера). После таких действий, работники более ответственно относятся к своей работе, ведь знает, что его разговоры все время под контролем и он не сможет уйти от общения.

Чтобы не терять потенциального клиента будем использовать API Битрикса. Для этого нам нужно создать функциональный механизм, который позволит помнить про каждого клиента и вовремя связываться с ним. Давайте разберемся как мы это можем сделать с помощью Битрикс 24 и его телефонии.

В первую очередь, это виртуальная АТС, с помощью которой вы можете распределять “очередь” входящих звонков между сотрудниками. Записывать все беседы и потом выборочно проводить контроль качества обслуживания клиентов посредством прослушивания записей руководителями направлений. Ну и в дополнение —  ставить приветствие на телефон, свою мелодию ожидания, перенаправлять звонки, фиксировать звонки от клиентов, сохранять записи разговоров и т.д.

Для обработки звонка будем использовать событие onCallEnd (cобытие вызывается при окончании разговора (запись в историю)) - https://dev.1c-bitrix.ru/api_help/telephony/events/oncallend.php. Создаем обработчик события:

AddEventHandler("voximplant", "onCallEnd", "AddTaskSkipCall");
     	function AddTaskSkipCall($arFields){} // в массив $arFields поступает массив с данными

Проверяем значение параметра CALL_FAILED_CODE – если он равен 304 (пропущенный звонок), то продолжаем обработку:

if($arFields['CALL_FAILED_CODE'] == '304'){};

Чтобы выяснить присутствует ли звонивший в нашей базе делаем его поиск по телефону:

	if(CModule::IncludeModule('crm')){
  	     	$arFilterPhone = array("TYPE_ID" => "PHONE", "VALUE_TYPE" => "WORK", "VALUE" => $arFields['PHONE_NUMBER']);
    	     	$obFields = CCrmFieldMulti::GetList(array(), $arFilterPhone);
    	     	while($arField = $obFields->Fetch()){
    	     	     	if ($arField['ENTITY_ID'] == 'CONTACT') {
                             	$contact_id = $arField['ELEMENT_ID'];
    	              	}
    	     	}
    	     	if($contact_id){
    	     	     	$obCRMContacts = CCrmContact::GetList($arOrder = array('DATE_CREATE' => 'DESC'), $arFilter = array("ID"=>$contact_id), $arSelect = array('NAME', 'LAST_NAME', 'ASSIGNED_BY_ID'), false);
	                  	$arContact = $obCRMContacts->Fetch();
                      	$contact = $arContact['NAME'].' '.$arContact['LAST_NAME']; // получаем ФИО
                                                         	$responsible_id = $arContact['ASSIGNED_BY_ID']; // получаем ответственного
    	     	}
 	}
 

Чтобы не откладывать задачу в долгий ящик, поставим дедлайн в одни сутки. Для этого из массива $arFields получим объект с датой звонка. На основании полученных данных определим крайний срок задачи:

$refValue = new \ReflectionClass($arFields['CALL_START_DATE']);
     	$propValue = $refValue->getProperty('value');
     	$propValue->setAccessible(true);
     	$value = $propValue->getValue($arFields['CALL_START_DATE']);
     	$sDate = $value->date;
     	$arDate = explode('.', $sDate);
     	$date = new DateTime($arDate[0]);
     	$date->add(new DateInterval('P1D'));
     	$deadline = $date->format('m/d/Y h:i:s a'); // наш дедлайн

Добавляем название задачи:

$taskTitle = "Skipped call fr om ".$arFields['PHONE_NUMBER']; // название задачи

На основании того, существует ли наш контакт, придумываем описание задачи, а заодно и ответственного, если он ещё не задан:

if ($contact) {
             	$description = "Call back to ".$contact.". The call was skipped at ".$arDate[0];
     	}else{
             	$description = "Call back to ".$arFields['PHONE_NUMBER'].". The call was skipped at ".$arDate[0];
             	$responsible_id = TASK_CREATED_BY; //ответственный (по умолчанию выбрали администратора)
        }

С помощью метода CTaskItem::Add (https://dev.1c-bitrix.ru/api_help/tasks/classes/ctaskitem/add.php) создаём задачу:

	$task = new \Bitrix\Tasks\Item\Task(0, TASK_CREATED_BY);
     	// массив полей данных для задачи
     	$task['TITLE'] = $taskTitle; // название задачи
     	$task['DESCRIPTION'] = $description; // описание задачи
     	$task['RESPONSIBLE_ID'] = $responsible_id; // ответственный задачи
     	$task['CREATED_BY'] = TASK_CREATED_BY; // идентификатор постановщика задачи (администратор)
     	$task['DEADLINE'] = $deadline; // крайний срок
     	// создаём задачу
     	$result = $task->save();  

Также в задачу можно добавить соисполнителей (ACCOMPLICES). В случае, когда настроена система голосового меню (IVR), на конкретные кнопки ответов можно определить группы пользователей, ответственные за какое-либо действие. Именно эти группы мы можем использовать как соисполнителей задачи для более точного распределения обязанностей. В данном случае нужно будет из БД вытаскивать лог звонка по ID звонка ($arFields['CALL_ID']):

global $DB;
     	$ob = $DB->Query("SEL ECT F.CALL_LOG FR OM b_voximplant_statistic F WH ERE F.CALL_ID = '".$arFields['CALL_ID']."'");
     	$res = $ob->Fetch();
     	$urlCallLog = $res['CALL_LOG']; // адрес лога

Из самого файла лога будем вытаскивать код нажатой кнопки и соответственно определять пользователей по определенным заранее айдишкам групп, в которых они находятся:

$find_str = 'Received tone ';
     	$str = file_get_contents($urlCallLog);
     	$pos = strpos($str, $find_str);
     	$ivrButton = substr($str, $pos+strlen($find), 1);
     	if ($ivrButton == 2) {
             	$userGroup = CGroup::GetGroupUser(SUPPORT_GROUP_ID);
     	}elseif ($ivrButton == 1) {
             	$userGroup = CGroup::GetGroupUser(SALES_GROUP_ID);
     	}elseif ($ivrButton == 3) {
             	$userGroup = CGroup::GetGroupUser(BILLING_GROUP_ID);
    	}

Добавляем в массив перед созданием задачи:

$task['ACCOMPLICES'] = $userGroup; // соисполнители задачи

Напоследок добавлю, что всегда можно дополнить данный код обработчиком для создания задачи. Даже если звонок был успешен, вы сможете видеть все ваши звонки и дополнять задачи их результатами для более полной картины.

Вот и всё, теперь вы не пропустите ни единого звонка и ваши клиенты будут в надёжных руках ))

Need help?

Ask a question.

Chat Now
Записаться На Консультацию
Записаться На Консультацию
Мы свяжемся
с вами
в течении
10 минут
laptop
Мы свяжемся с вами в течении 10 минут