Asterisk: кто ответил клиенту в очереди

Нам нужно получить номер оператора, который ответил клиенту в очереди. В случае, если мы используем Asterisk CDR Viewer Mod, то в поле Куда звонили нам нужно отображать номер оператора принявшего звонок. На данный момент в случае работы очереди, там отображается "s" (триггер по умолчанию также отображал неверный номер при использовании очереди).
Сначала добавим новое поле в mysql базу, потом научим астериск писать туда номер ответившего сотрудника, далее напишем mysql триггер, который будет перезаписывать поле dst нужным номером в случае попадания в очередь (из диалплана dst доступен только для чтения, поэтому мы будем подменять его триггером).
Первым делом добавляем в секцию [general] файла /etc/asterisk/queues.conf 2 строчки:
;установка значения переменной MEMBERINTERFACE которая хранит номер оператора, поднявшего трубку
setinterfacevar=yes
;задать переменные очереди
setqueuevar=yes
Добавляем колонку queueanswer в таблицу CDR:
mysql -uroot -p
use asteriskcdrdb;
ALTER TABLE `cdr` ADD `queueanswer` VARCHAR(80) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' AFTER `filename`;
Если MySql отказывается добавлять новое поле по причине: "Некорректное значение по умолчанию", то вам нужно отключить строгий режим работы Mysql добавив в конфиг в секцию [mysqld] строку:
sql_mode = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
/etc/init.d/mysql restart
Меняем диалплан. Находим место, где клиент попадает в очередь. Добавить номер оператора можно 2 способами: вызовом контекста при разрыве связи или выполнением макроса при ответе в очереди. В примере я использую оба способа.
;входящие звонки в офис
[office]
;включаем запись разговора
exten => s,1,GoSub(recording,s,1(${CALLERID(num)},${EXTEN}))
;указываем куда идти после hangup
same => n,Set(CHANNEL(hangup_handler_push)=hangup-handler,s,1)
;идём в очередь и запускаем макрос logagentnumber при ответе
same => n,Queue(queue-name,TtxX,,,180,,logagentnumber)
same => n,Hangup

;в конце разговора выполняем
[hangup-handler]
;пишем в колонку куда звонили номер ответившего оператора
exten => s,1,Set(CDR(queueanswer)=${CUT(MEMBERINTERFACE,/,2)})
;exten => s,1,Set(CDR(queueanswer)=${CDR(dstchannel):4:3});или так
same => n,Return()

;в случае если клиенту ответили выполняем
[macro-logagentnumber]
exten => s,1,Set(CDR(queueanswer)=${CUT(MEMBERINTERFACE,/,2)})
Создаем алиас для записи в колонку queueanswer. Добавляем в файл /etc/asterisk/cdr_mysql.conf в секцию [columns] строку:
alias queueanswer => queueanswer
Далее нам осталось обновить/добавить следующий триггер к таблице cdr базы mysql:
BEGIN
 IF ((NEW.dst = 's' OR NEW.dst = '~~s~~') AND NEW.queueanswer != '') THEN 
  SET NEW.dst = NEW.queueanswer;
 END IF;
Перезапускаем astertisk и проверяем работу.

UPDATE 31.12.2019
Если у вас переменная MEMBERINTERFACE все равно оказалась пустой, вы можете взять номер ответившего оператора из ${CDR(dstchannel)}, для этого замените в примере выше переменную ${CUT(MEMBERINTERFACE,/,2)} на ${CDR(dstchannel):4:3}.

Комментариев нет:

Отправить комментарий