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

Администратор, 10.07.2012

Привет, Астерискер!

Пару дней назад ко мне обратился руководитель тех отдела интернет магазина.

Как у всех больших инет магазинов, у них есть свой Колл-центр, построенный на базе Elastix.

Перед ним стояла задача сделать на Elastixе возможность оценки оператора.

Для работы горячей линии используется голосовое меню со сбором статистики.

После отключения оператора, система должна задать клиенту вопрос: «Помогли ли вам специалисты Горячей линии?»

Варианты ответа: Нет — кнопка «0» и Да — кнопка «1»

В реализации требовалось учесть, что используется система Elastix, и надо было писать делать для нее модуль.

Решение

Все шло к тому, чтобы после разговора с оператором клиент попадал в IVR, где смог бы проголосовать, но меня потянуло дальше и этим решением я бы хотел поделиться.

1) Приготовление mysql ДБ:
По умолчанию asterisk ведет запись CDR в базу asteriskcdrdb, для нашей дополнительной статистики добавим туда новую таблицу.

DROP TABLE IF EXISTS `opinion`; CREATE TABLE IF NOT EXISTS `opinion` ( `id` int(11) NOT NULL auto_increment, `callerid` varchar(15) NOT NULL default '', `exten` varchar(15) NOT NULL default '', `queues` varchar(7) NOT NULL, `opinion` char(1) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 


2) Готовим Макро
В /etc/asterisk/extensions_custom.conf добавим:

[macro-press-1] exten => s,1,MYSQL(Connect connid localhost ВАШ_ЮЗЕР ВАШ_ПАСС asteriskcdrdb) exten => s,n,MYSQL(Query resultid ${connid} INSERT INTO opinion (`id`, `callerid`, `exten`, `queues`, `opinion`) VALUES (NULL, ${FROMEXTEN}, ${CDR(dst)}, ${CDR(src)}, 1)) exten => s,n,MYSQL(Clear ${resultid}) exten => s,n,MYSQL(Disconnect ${connid}) [macro-press-0] exten => s,1,MYSQL(Connect connid localhost ВАШ_ЮЗЕР ВАШ_ПАСС asteriskcdrdb) exten => s,n,MYSQL(Query resultid ${connid} INSERT INTO opinion (`id`, `callerid`, `exten`, `queues`, `opinion`) VALUES (NULL, ${FROMEXTEN}, ${CDR(dst)}, ${CDR(src)}, 0)) exten => s,n,MYSQL(Clear ${resultid}) exten => s,n,MYSQL(Disconnect ${connid}) 


Юзер и пароль к базе asteriskcdrdb обычно есть в файле /etc/asterisk/cdr_mysql.conf

3) Добавим Feature Application
В features_applicationmap_custom.conf добавляем нужные нам цифры и привязываем к выполнения макро

press1 => 1,peer/caller,Macro,press-1 press0 => 0,peer/caller,Macro,press-0 


для того чтобы feature application сработал надо еще добавить его в глобальную переменную в диалпалне.
в /etc/asterisk/extensions_override_freepbx.conf добавим

[globals] DYNAMIC_FEATURES = apprecord#press0#press1 


apprecord обычно уже используется в Freepbx его тоже оставим.

Результат



В момент разговора с оператором у клиента есть возможность оценить его нажатием 0 или 1

Лог успешной оценки:
 -- Feature Found: press1 exten: press1 -- Executing [s@macro-press-1:1] MYSQL("Local/299@from-queue-56b8;1", "Connect connid localhost root 123 asteriskcdrdb") in new stack -- Executing [s@macro-press-1:2] MYSQL("Local/299@from-queue-56b8;1", "Query resultid 1 INSERT INTO opinion (`id`, `callerid`, `exten`, `queues`, `opinion`) VALUES (NULL, +74993462198, 299, 1234, 1)") in new stack 


смотрим что в базе

mysql> SELECT * FROM opinion; +----+-------------+-------+--------+---------+ | id | callerid | exten | queues | opinion | +----+-------------+-------+--------+---------+ | 8 | 74993462198 | 299 | 1234 | 1 | | 9 | 74993462198 | 299 | 1234 | 1 | +----+-------------+-------+--------+---------+ 2 rows in set (0.00 sec) 


UPDATE:



Можно ИВР для оценки прикрутить и после того как оператор повесил трубку:

Настройки очереди нужно делать в ВЕБ интерфейсе, если версия FreePbx разрешает в Members указать LOCAL/999@opinion-ivr/n то первый пункт можно пропустить, если нет то Members добавлять в вебе не надо, их добавим в queues_post_custom.conf

member=Local/299@opinion-ivr/n member=Local/999@opinion-ivr/n 


В extensions_custom.conf

[opinion-ivr] exten => _.,1,NoOp(Statrt IVR) exten => _.,n,DIAL(SIP/${EXTEN},,trg) ;опция g позволяет звонку пройти далее по диалплану exten => _.,n,Goto(opinion,,1) [opinion] exten => _X.,1,NoOp(Statrt IVR) exten => _X.,n,Background(Plese_press_0_or_1,m) ; заменить на свой голосовой файл exten => _X.,n,Set(TIMEOUT(absolute)=2) exten => 0,1,MYSQL(Connect connid localhost root 123 asteriskcdrdb) exten => 0,n,MYSQL(Query resultid ${connid} INSERT INTO opinion (`id`, `callerid`, `exten`, `queues`, `opinion`) VALUES (NULL, ${FROMEXTEN}, ${DIALEDPEERNUMBER}, ${NODEST}, 0)) exten => 0,n,MYSQL(Disconnect ${connid}) exten => 1,1,MYSQL(Connect connid localhost root 123 asteriskcdrdb) exten => 1,n,MYSQL(Query resultid ${connid} INSERT INTO opinion (`id`, `callerid`, `exten`, `queues`, `opinion`) VALUES (NULL, ${FROMEXTEN}, ${DIALEDPEERNUMBER}, ${NODEST}, 1)) exten => 1,n,MYSQL(Disconnect ${connid})