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

29 Червня 2018

наступна стаття
Володимир Сідлецький

Back End Developer

Володимир Сідлецький
Телефонія Бітрікс24: як не пропустити жодного дзвінка

У більшості компаній, інтернет-магазинів або організацій, в основному, продажі безпосередньо пов'язані з телефонними переговорами. Для менеджерів розробляються спеціальні скрипти спілкування з клієнтами, проводяться тренінги. Але навіть ці дії не виключають людські помилки.

Щоб мінімізувати втрати нових або наявних клієнтів, багато компаній переходять на IP телефонію. Адже з її допомогою можна контролювати всі етапи спілкування і тим самим аналізувати рівень обслуговування (наприклад, прослуховувати записи розмов менеджера). Після таких дій, працівники більш відповідально ставляться до своєї роботи, адже знають, що їх розмови весь час під контролем і вони не зможуть уникнути спілкування.

Щоб не втрачати потенційного клієнта, будемо використовувати API Бітрікс. Для цього нам потрібно створити функціональний механізм, який дозволить пам'ятати про кожного клієнта і вчасно зв'язуватися з ним. З’ясуймо, як ми це можемо зробити за допомогою Бітрікс 24 і його телефонії.

В першу чергу, це віртуальна АТС, за допомогою якої ви можете розподіляти «чергу» вхідних дзвінків між співробітниками, записувати все бесіди і потім вибірково проводити контроль якості обслуговування клієнтів за допомогою прослуховування записів керівниками напрямків. Ну, і на додаток — ставити вітання на телефон, свою мелодію очікування, перенаправляти дзвінки, фіксувати дзвінки від клієнтів, зберігати записи розмов і т.д.

Для обробки дзвінка будемо використовувати подія onCallEnd (Подія викликається при закінченні розмови (запис в історію)) — 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; // співвиконавці задачі

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

Ось і все, тепер ви не пропустіть жодного дзвінка і ваші клієнти будуть в надійних руках))

banner_ukr.png


Схожі статті
Записатись на консультацію

Ми зв'яжемось з Вами протягом 10 хвилин