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
  • тут только значимые для задачи параметры настройки очереди
Личные инструменты