9 июля 2015 г.

Астериск (FreePBX): прозваниваем не отвеченные вызовы через тот же транк, через который они и приходили.


Ситуация:
На АТС заведено несколько транков, каждый из которых принадлежит отдельной  виртуальной компании. На эти номера звонят клиенты и , бывает, не дозваниваются. Необходимо, что бы звонки менеджера,  обзванивающего не отвеченные вызовы, уходили через тот же транк, через который клиент совершал вызов ранее.


Как сделано:

1. Для "подписи" звонков кто откуда пришел используется стандартный инструмент SetCallerID. Старое значение CallerID Name "${CALLERID(name)}" заменяем на "ARTWEB - ${CALLERID(name)}". "ARTWEB" - название виртуальной компании, куда попадает звонок.
ЭТО ЖЕ название будет позже использоваться для получения информации, откуда пришел звонок.
Итак, делаем новый  SetCallerID, заворачиваем в него входящий маршрут. Точкой выхода из него служит остальная часть вашего диалплана.
Дополнительно получаем профит в виде: а) на экране телефона менеджер сразу видит в какую компанию приходит звонок б) в сдр логе ТАК ЖЕ будет эта запись.

2. Настраиваем исходящие маршруты. Для каждой компании может быть несколько маршрутов. Обязательное условие - наличие уникального префикса для каждой компании. В данном случае 998 для Артвеб, 997 для Мегабит

3. Настраиваем кастомную часть диалплана, ответственного за ручную маршрутизацию исходящих звонков как нам надо. Открываем extensions_custom.conf и вставляем:

------------------------------------------------------
[from-internal-custom]
exten => _X.,1,NoOp(AMPUSER = $["${AMPUSER}"])
exten => _X.,n,NoOp(UNIQUEID = $["${UNIQUEID}"])
exten => _X.,n,NoOp(CALLERID NAME = ${CALLERID(name)})
exten => _X.,n,NoOp(CALLERID NUMBER = ${CALLERID(number)})

# Mb its a internal number - goto exit
exten => _X.,n,GotoIf($[LEN(${EXTEN}) < 7]?990)

exten => _X.,n,MYSQL(Connect connid localhost freepbxuser superpassword asteriskcdrdb)
exten => _X.,n,MYSQL(Query resultid ${connid} select clid from cdr where src like '%${EXTEN}%' and calldate > NOW() - INTERVAL 7 DAY  order by calldate desc limit 1)
exten => _X.,n,MYSQL(Fetch fetchid ${resultid} TEMPNAME)
exten => _X.,n,MYSQL(Clear ${resultid})
exten => _X.,n,MYSQL(Disconnect ${connid})

# External number not found in DB - goto default
exten => _X.,n,GotoIf($[${fetchid} = 0]?980)

exten => _X.,n,Set(TEMPNAME=${TEMPNAME:1:5})
exten => _X.,n,NoOp(TEMPNAME = $[${TEMPNAME}])

exten => _X.,n,GotoIf($[${TEMPNAME} = MEGAB]?951:960)
exten => _X.,951,NoOp(EXTEN ${EXTEN} go to 997 MEGABIT)
exten => _X.,952,Goto(from-internal-additional,997${EXTEN},1)

exten => _X.,960,GotoIf($[${TEMPNAME} = ARTWE]?961:970)
exten => _X.,961,NoOp(EXTEN ${EXTEN} go to 998 ARTWEB)
exten => _X.,962,Goto(from-internal-additional,998${EXTEN},1)

exten => _X.,970,GotoIf($[${TEMPNAME} = UNDER]?971:980)
exten => _X.,971,NoOp(EXTEN ${EXTEN} go to 999 UNDERNET)
exten => _X.,972,Goto(from-internal-additional,999${EXTEN},1)

# Default for external numbers
exten => _X.,980,NoOp(Number ${EXTEN} not found in DB)
exten => _X.,n,Goto(from-internal-additional,998${EXTEN},1)

# Default for internal numbers
exten => _X.,990,Goto(from-internal-additional,,1)

exten => h,1,Hangup

------------------------------------------------------
По диалплану:
Исходящие звонки совершаются из контекста from-internal. Экстеншн длиной меньше семи цифр считается внутренним номером и следуат дальнейшему диалплану (from-internal-additional) без изменений. Номер более семи цифр считается исходящим (менеджер совершает звонок). Этот номер ищется в БД MySQL (которая же, конечно, должна быть настроена на хранение логов звонков) за последние семь дней. Если номер найден, то выбирается его clid вида "ARTWEB - 380679999999 "<380679999999>. Далее к исходящему номеру добавляется ПРЕФИКС соответствующей компании, как было ранее описано при настройке исходящих маршрутов и звонок отправляется по своему законному маршруту в контекст from-internal-additional.
В случае, если номер не найден в БД, звонок идет в марштут "по умолчанию". В данном случае с префиксом 998.

 Собственно, вот и вся магия.


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

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