Asterisk - пример обращения от АТС
Материал из BiTel WiKi
Простой пример, обработки обращения от АТС к CRM. Данный пример описывает ситуацию, когда операторская очередь сильно загружена и предлагает клиенту ожидающему ответа оператора заказать CALLBACK. При этом, в CRM открывается процесс, куда передается АОН звонящего.
Описание среды
- Asterisk + PHPAGI + модуль Dialplan Injection
- BGCRM
Asterisk
создаем скрипт, которым АТС будет обращаться к динамическому классу CRM (http://docs.bitel.ru/pages/viewpage.action?pageId=6193591). входящий параметр АОН звонящего.
#/var/lib/asterisk/agi-bin/dndoperator.php
#!/usr/bin/php <? require_once "phpagi.php"; $agi = new AGI(); $phone = isset($argv[1])? strval(trim($argv[1])) : ""; $json = file_get_contents("http://127.0.0.1:9088/admin/dynamic.do?action=runDynamicClass&class=ru.bgcrm.dyn.utils.asterisk.AsteriskIn&sub=dndoperator&aon=$phone&authToSession=0&j_username=USERNAME&j_password=USERPWD"); $data = json_decode($json,true);
в Asterisk создаем Dialplan Injection, который собственно будет обращаться к скрипту dndoperator.php
#/etc/asterisk/extensions_additional.conf
[injection-1] include => injection-1-custom exten => _.,1,Noop(Entering Injection: DNDoperators) exten => _.,n,AGI(dndoperator.php,${CALLERID(name)}) exten => _.,n,Goto(app-blackhole,hangup,1) exten => h,1,Macro(hangupcall,) ;--== end of [injection-1] ==--;
там же создаем IVR, которая будет наговаривать предупреждающий текст и реагировать на нажатие кнопки "1" по которой будет происходить обращение к Dialplan Injection. Структура IVR в данном случае подогнана под требования следующего пункта настройки АТС
[ivr-1] ; DNDoperator include => ivr-1-custom exten => s,1,Set(_IVR_CONTEXT_${CONTEXT}=${IVR_CONTEXT}) exten => s,n,Set(_IVR_CONTEXT=${CONTEXT}) exten => s,n,Set(__IVR_RETVM=) exten => s,n,GotoIf($["${CDR(disposition)}" = "ANSWERED"]?skip) exten => s,n,Answer exten => s,n,Wait(1) exten => s,n(skip),Set(IVR_MSG=custom/IVR_DND_OPERATORS) exten => s,n(start),Set(TIMEOUT(digit)=3) exten => s,n,ExecIf($["${IVR_MSG}" != ""]?Background(${IVR_MSG})) exten => s,n,WaitExten(0,) exten => 1,1,Macro(blkvm-clr,) exten => 1,n,Set(__NODEST=) exten => 1,n(ivrsel-1),Goto(injection-1,${EXTEN},1) exten => i,1,Playback(sorry-youre-having-problems) exten => i,n,Goto(hang,1) exten => t,1,Playback(sorry-youre-having-problems) exten => t,n,Goto(hang,1) exten => return,1,Set(_IVR_CONTEXT=${CONTEXT}) exten => return,n,Set(_IVR_CONTEXT_${CONTEXT}=${IVR_CONTEXT_${CONTEXT}}) exten => return,n,Set(IVR_MSG=custom/IVR_DND_OPERATORS) exten => return,n,Goto(s,start) exten => h,1,Hangup exten => hang,1,Playback(vm-goodbye) exten => hang,n,Hangup ;--== end of [ivr-1] ==--;
Собственно говоря, на этом у нас есть готовый инструмент, которым мы можем оповещать звонящего о чем то и ожидать его действий. В нашем случае мы ссылаемся на эту IVR в очереди операторской линии как IVR Break Out Menu:
#/etc/asterisk/queues_additional.conf
[999] announce-frequency=30 announce-holdtime=yes announce-position=yes timeout=30 timeoutpriority=app timeoutrestart=yes context=ivr-5 periodic-announce=custom/IVR_DND_OPERATORS
- тут только значимые для задачи параметры настройки очереди