Найти тему
Merion Academy

Оценка работы оператора после звонка на Asterisk

Оглавление

Клиентский сервис и его постоянное совершенствование – задачи, которые решают все организации, которые любят своих клиентов. Как оценить удовлетворенность клиента, после звонка в контактный – центр? Ответ простой – спросите его.

В статье мы покажем как настроить функционал оценки оператора после звонка (конечно не только, вы можете строить любые опросы, которые захотите). Работает это так:

  • Клиент и оператор контактного центра разговаривают;
  • После завершения разговора оператор просит оценить удовлетворенность разговором клиента;
  • Оператор кладет трубку;
  • Автоматический сервис предлагает ввести клиенту от 1 до 5, в зависимости от удовлетворенности обслуживанием;
  • Введенные данные сохраняются в таблицу MySQL и отправляются в групповой чат в Telegram, в котором эти оценки уже готовы оценить супервизоры;

Спешите настроить – ваш руководитель точно оценит :)

Решение обкатано и работает на сборке FreePBX Distro (FreePBX 13 + 13.10.0)

НАСТРОЙКА ОЧЕРЕДИ

Создайте обычную очередь обслуживания вызовов через FreePBX, но только без одной опции – не добавляйте в нее операторов (раздел Queue Agents) – мы сделаем это вручную, через конфигурационные файлы.

Сделали? Отлично. Теперь переходим в консоль сервера, открываем файл /etc/asterisk/queues_post_custom.conf и добавляем в него следующую конструкцию:

member=Local/111@customer-survey-ivr/n,0,111,hint:111@ext-local

Где 111 - это внутренний экстеншен, который должен быть членом этой очереди. Идем вперед.

НАСТРОЙКА ДИАЛПЛАНА

Открываем файл /etc/asterisk/extensions_custom.conf и добавляем в него следующую конструкцию:

[customer-survey-ivr]
exten => _X.,1,NoOp(Post call survey beginning)
exten => _X.,n,DIAL(SIP/${EXTEN},,trg) //добавляем опцию g - когда вызываемый абонент вешает трубку, мы продолжим выполнение команд далее по текущему контексту.
exten => _X.,n,GotoIf($[${DIALSTATUS}=BUSY]?busy:answered) //проверяем, был ли отвечен вызов
exten => _X.,n(busy),Hangup()
exten => _X.,n(answered),Goto(assessment,${EXTEN},1)


[assessment]
exten => _X.,1,Answer
exten => _X.,n,Wait(1)
exten => _X.,n(skip),Set(IVR_MSG=en/beep)
exten => _X.,n(start),Set(TIMEOUT(digit)=1)
exten => _X.,n,Background(/var/lib/asterisk/sounds/ru/custom/ocenite-8khz,m) //озвучиваем предложение об оценке клиенту
exten => _X.,n,WaitExten(5,)

exten => 1,1,AGI(survey.php, ${CDR(src)}, ${DIALEDPEERNUMBER}, ${NODEST}, 1) //если клиент вводит 1, то отправляем даные через AGI в скрипт, который отправляет их в Telegram и SQL
exten => 1,n,Playback(/var/lib/asterisk/sounds/ru/custom/bye-8khz,skip) //благодарим клиента и прощаемся

exten => 2,1,AGI(survey.php, ${CDR(src)}, ${DIALEDPEERNUMBER}, ${NODEST}, 2)
exten => 2,n,Playback(/var/lib/asterisk/sounds/ru/custom/bye-8khz,skip)

exten => 3,1,AGI(survey.php, ${CDR(src)}, ${DIALEDPEERNUMBER}, ${NODEST}, 3)
exten => 3,n,Playback(/var/lib/asterisk/sounds/ru/custom/bye-8khz,skip)

exten => 4,1,AGI(survey.php, ${CDR(src)}, ${DIALEDPEERNUMBER}, ${NODEST}, 4)
exten => 4,n,Playback(/var/lib/asterisk/sounds/ru/custom/bye-8khz,skip)

exten => 5,1,AGI(survey.php, ${CDR(src)}, ${DIALEDPEERNUMBER}, ${NODEST}, 5)
exten => 5,n,Playback(/var/lib/asterisk/sounds/ru/custom/bye-8khz,skip)

exten => t,1,Playback(/var/lib/asterisk/sounds/ru/custom/bye-8khz,skip)
exten => e,1,Playback(/var/lib/asterisk/sounds/ru/custom/bye-8khz,skip)
  • /var/lib/asterisk/sounds/ru/custom/ocenite-8khz - заранее записанный звуковой файл следующего содержания: «Пожалуйста, оцените работу оператора по шкале от 1 до 5»;
  • /var/lib/asterisk/sounds/ru/custom/bye-8khz - заранее записанный звуковой файл следующего содержания: «Спасибо за оценку! Всего доброго»;

Сохраните конфигурацию в файле. После этого, в консоль сервера необходимо дать команду:

dialplan reload

РАЗБИРАЕМСЯ С SQL

Наверняка вы согласитесь с тем, что данные оценки нам нужно как то хранить: для всяких там BI (business intelligence) и прочих систем. Делать это будем с помощью SQL. Создаем таблицу survey, наполняем ее, создаем пользователя, который будет иметь права на внесение данных в эту таблицу:

mysql
mysql> use asteriskcdrdb;
mysql> CREATE TABLE survey(num varchar(20),operator varchar(20),queue varchar(20),valuation varchar(20),date datetime);
mysql> CREATE USER 'логин_mysql'@'localhost' IDENTIFIED BY 'пароль_mysql';
mysql> GRANT INSERT ON asteriskcdrdb.survey TO 'логин_mysql';

Проверяем, что за таблица у нас получилась:

mysql
mysql> describe survey;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| num | varchar(20) | YES | | NULL | |
| operator | varchar(20) | YES | | NULL | |
| queue | varchar(20) | YES | | NULL | |
| valuation | varchar(20) | YES | | NULL | |
| date | datetime | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+

Чудесно. Мы на финишной прямой – собираем AGI скрипт, который будет дергать Telegarm API и SQL.

AGI СКРИПТ

Перед продолжением, хотим спросить – у вас есть Telegram бот? Если нет, то прыгайте по ссылке ниже. Вернуться вам нужно оттуда с токеном от бота и с ID группового чата :)

Надеемся, вы перешли по ссылке и получили необходимые данные. Теперь переходим к скрипту:

#!/usr/bin/php -q
<?php
#парсим данные из AGI
require('phpagi.php');
$agi = new AGI();
$num = $agi->request['agi_arg_1'];
$operator = $agi->request['agi_arg_2'];
$queue = $agi->request['agi_arg_3'];
$valuation = $agi->request['agi_arg_4'];
#параметры подключения к API Telegram и групповой ID - чата
$token = "ваш_api_от_Telegram";
$chat_id = "ID_чата";
#дата
$date = date("Y-m-d H:i:s");
#массив для Telegram чата супервизоров
$arr = array(
'Получена оценка оператора клиентом:' => '',
'Звонящий:' => $num,
'Оцененный оператор:' => $operator,
'Очередь звонка:' => $queue,
'Поставлена оценка (1-5)' => $valuation,
'Дата оценки:' => $date,
);
foreach($arr as $key => $value) {
$txt .= "<b>".$key."</b> ".$value."%0A";
};
fopen("
https://api.telegram.org/bot{$token}/sendMessage?chat_id={$chat_id}&parse_mode=html&text={$txt}","r");
#параметры подключения к БД
$hostname = "localhost";
$username = "логин_mysql";
$password = "пароль_mysql";
$dbName = "asteriskcdrdb";
#парсим данные через SQL по звонкам
mysql_connect($hostname,$username,$password) OR DIE("Не могу создать соединение ");
mysql_select_db($dbName) or die(mysql_error());
$query = "INSERT INTO survey (`num`, `operator`, `queue`, `valuation`, `date`) VALUES ('$num', '$operator', '$queue', '$valuation', '$date');";
$res=mysql_query($query) or die(mysql_error());
?>

СКАЧАТЬ СКРИПТ

В случае скачивания, поменяйте расширение файла с .txt на .php

Не забывайте поменять переменные $token, $chat_id, $username и $password поменять на свои. Сохраните этот скрипт как survey.php и загружаем его в папку /var/lib/asterisk/agi-bin. Это можно сделать с помощью WinSCP, например. Далее, в консоли через SSH доступ на сервер Asterisk дайте следующие команды:

dos2unix /var/lib/asterisk/agi-bin/survey.php
chown asterisk:asterisk /var/lib/asterisk/agi-bin/survey.php
chmod 775 /var/lib/asterisk/agi-bin/survey.php

Мы молодцы. Теперь самое интересное – проверяем, что у нас получилось.

ФИНАЛЬНАЯ ПРОВЕРКА

Звоним на очередь, разговариваем с указанным оператором, после чего, оператор прощается с нами и кладет трубку. Что происходит? :) Мы слышим просьбу ввести оценку, от 1 до 5. Вводим. Голос прощается с нами и вызов завершается, а в Telegram – чат к супервизорам прилетает следующая информация:

А что мы видим в SQL?