Совершенствование качества сервиса организации - крайне важная составляющая успешной работы компании. Механизм оценки работы оператора будет полезен любому бизнесу.
В текущей статье предлагаем пример реализации механизма оценки качества клиентом для АТС MikoPBX.
Для начала дополним логику обработки входящих звонков:
1. Перейдите в раздел Маршрутизация → Провайдеры телефонии. Откройте для редактирования учетную запись провайдера для редактирования. Скопируйте в адресной строке ID провайдера, через которого абоненты звонят Вам в компанию. Обращаем Ваше внимание, что в нашем примере используется единственный провайдер Zadarma. Если у Вас настроено подключение нескольких провайдеров, то ниже описанные действия необходимо выполнить для каждого провайдера.
В нашем примере ID провайдера принимает вид: SIP-PROVIDER-B63EE3497989BF6597FF8C9DEC77EB49.
2. Перейдите в раздел Система → Кастомизация системных файлов.
3. Откройте для редактирования конфигурационный файл extensions.conf. Установите режим «Добавлять в конец файла».
4. В черное окно добавьте следующий фрагмент кода:
[SIP-PROVIDER-B63EE3497989BF6597FF8C9DEC77EB49-after-dial-custom] exten => _.!,1,Goto(quality-start,s,1) same => n,return [SIP-PROVIDER-B63EE3497989BF6597FF8C9DEC77EB49-outgoing-custom] exten => _.!,1,Set(DOPTIONS=${DOPTIONS}F(quality-start,s,1)) same => n,return [quality-start] exten => _.!,1,NoOp(--- Quality assessment ---) same => n,ExecIf($[${M_DIALSTATUS}!=ANSWER]?return) ;Описываем путь к файлу завершения разговора. Благодарим за оценку качества. same => n,Set(filename_bye=/storage/usbdisk1/quality/sounds/bye) ; Описываем пути к файлам опроса. same => n,Set(filename_1=/storage/usbdisk1/quality/sounds/miko_hello) same => n,Set(filename_2=/storage/usbdisk1/quality/sounds/q_1) same => n,Set(filename_3=/storage/usbdisk1/quality/sounds/q_2) same => n,Set(f_num=0); same => n,Goto(ivr-quality,s,1) [ivr-quality] exten => s,1,NoOP( start ivr quality ) same => n,Set(f_num=$[${f_num} + 1]) same => n,Set(filename=${filename_${f_num}}) same => n,GotoIf($["x${filename}" == "x"]?ivr-quality,bye,1); same => n,Background(${filename}) same => n,WaitExten(5) exten => _[1-5],1,NoOP( quality is ${EXTEN}) ; AGI скрипт, который сохранит результат оценки разговора клиентом. same => n,AGI(/storage/usbdisk1/quality/quality_agi.php) same => n,Goto(ivr-quality,s,1) exten => _[06-9],Goto(ivr-quality,s,1) exten => bye,1,ExecIf($["x${filename_bye}" != "x"]?Playback(${filename_bye})); same => n,Hangup()
В выше приведенном фрагменте кода Вам необходимо составить правильное наименование контекста.
Формат создаваемого контекста:
[ID-ПРОВАЙДЕРА-outgoing-custom] [ID-ПРОВАЙДЕРА-after-dial-custom]
chmod +x /storage/usbdisk1/quality/quality_agi.php
Пример реализации quality_agi.php:
#!/usr/bin/php <?php require_once 'phpagi.php'; require_once 'globals.php'; $agi = new AGI(); $linkedid = $agi->get_variable('CDR(linkedid)', true); $arr = [ 'quality' => $agi->request['agi_extension'], 'f_num' => $agi->get_variable('f_num', true), 'filename' => $agi->get_variable('filename', true), // 'Оцененный оператор:' => $operator, 'linkedid' => $linkedid, 'date' => date('Y-m-d H:i:s'), 'callerid' => $agi->request['agi_callerid'] ]; $file_log = '/storage/usbdisk1/quality/'.$linkedid.'.log'; Util::mw_mkdir(dirname($file_log)); file_put_contents($file_log, json_encode($arr)."\n", FILE_APPEND);
Пример файла:
{"quality":"1","f_num":"1","filename":"\/offload\/asterisk\/sounds\/other\/miko_hello","linkedid":"mikopbx-1574331248.66","date":"2019-11-21 13:14:13","callerid":"79265775289"} {"quality":"2","f_num":"2","filename":"beep","linkedid":"mikopbx-1574331248.66","date":"2019-11-21 13:14:15","callerid":"79265775289"} {"quality":"3","f_num":"3","filename":"\/offload\/asterisk\/sounds\/other\/out_work_times","linkedid":"mikopbx-1574331248.66","date":"2019-11-21 13:14:16","callerid":"79265775289"}