Телефонія Бітрікс24: як не пропустити жодного дзвінка
29 Червня 2018
наступна стаття
У більшості компаній, інтернет-магазинів або організацій, в основному, продажі безпосередньо пов'язані з телефонними переговорами. Для менеджерів розробляються спеціальні скрипти спілкування з клієнтами, проводяться тренінги. Але навіть ці дії не виключають людські помилки.
Щоб мінімізувати втрати нових або наявних клієнтів, багато компаній переходять на 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; // співвиконавці задачі
Наостанок додам, що завжди можна доповнити даний код оброблювачем для створення завдання. Навіть якщо дзвінок був успішний, ви зможете бачити всі ваші дзвінки і доповнювати завдання їх результатами для повнішої картини.
Ось і все, тепер ви не пропустіть жодного дзвінка і ваші клієнти будуть в надійних руках))

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