Телефонія Бітрікс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 хвилин