Возможности программирования Elastix практически безграничны. Можно создавать собственные алгоритмы обработки вызовов, использующие обращения к базам данных, к веб-страницам, к внешним программам на PHP и на других языках. Разработчиками Elastix приветствуется написание бесплатных и коммерческих модулей (Addons), после сертификации доступных другим пользователям платформы.
Примеры этой главы описывают как простейшие примеры создания собственных алгоритмов обработки вызовов на примере добавления функции автодозвона, так и более сложные изменения, использующие базу данных вызовов (CDR) для снижения нагрузки на секретарей.
Доступ к Очередям и Группам звонков при входящих звонках из города
По умолчанию номера, присвоенные Очередям (Queues) и Группам звонков (Ring Groups) не доступны извне. Абонент, позвонивший из города, не сможет в IVR набрать номер Очереди или Группы звонков и соединиться с ней. Можно для каждой Очереди и Группы звонков создать Виртуальные номера (Virtual Extension), но это непрактично – придется не только поддерживать записи в актуальном состоянии, но и помнить разные номера для звонков из города и с офисного телефона. Это недоразумение легко исправить:
• открыть меню PBX / Tools / Asterisk File Editor
• открыть файл extensions_custom.conf
• добавить три строки
[from-did-direct-ivr-custom]
include => ext-queues
include => ext-group
• сохранить изменения, нажав кнопку Save
• применить настройки, нажав кнопку Reload Asterisk
Определить, что добавить эти строки нужно именно в [from-did-direct-ivr-custom], можно просмотрев файл extensions_additional.conf, создаваемый Elastix после изменения настроек системы – номера всех созданных телефонов прописываются в контексте [from-did-direct-ivr], который включает в себя контекст [from-did-direct-ivr-custom]:
Настройка функции Автодозвона
Следует иметь в виду, что автоматический дозвон до занятого/не доступного абонента создает повышенную нагрузку как на вашу станцию Elastix, так и на сети провайдеров связи (если вызываемый абонент находится вне Elastix). Лучше всего найти способ известить абонента другими способами о необходимости с ним переговорить. Однако, если собеседник не слишком заинтересован в беседе, сотрудникам может помочь функция автодозвона:
• откройте меню PBX / Tools / Asterisk File Editor
• откройте файл extensions_custom.conf
• добавите строки
[from-internal-custom]
include => autoredial
[autoredial]
exten => _99.,1,Dial(Local/${EXTEN:2}@from-internal,40,tr)
exten => _99.,n,GotoIF($["${DIALSTATUS}" == "ANSWER"]?end)
exten => _99.,n,GotoIF($["${DIALSTATUS}" == "ANSWERED"]?end)
exten => _99.,n,GotoIF($[${CDR(billsec)} >0]?end)
exten => _99.,n,Wait(10)
exten => _99.,n,Goto(${EXTEN},1)
exten => _99.,n(end),Hangup
• сохраните изменения, нажав кнопку Save
• примените настройки, нажав кнопку Reload Asterisk
Теперь ваши сотрудники могут набрать префикс «99» перед требуемым номером, нажать «#» и ждать пока абонент поднимет трубку. Elastix будет бесконечно вызывать абонента, ожидать ответа 40 секунд, при отсутствии ответа или при ошибке соединения ждать 10 секунд и повторять набор.
Например:
• «9984956881001#» – поможет дозвониться до техподдержки 1С
• «994123#» – поможет дозвониться до абонента Elastix 4123, если абонент долго висит на трубке, очень нужен, но лишен других, известных Вам, средств связи
Сохранение в CDR рекламного номера
Оплачивая городские номера полезно знать насколько часто каждый из них используется. По умолчанию Elastix сохраняет информацию о том кто звонил и с кем разговаривал, но информация об использованном для входящей связи номере нигде не сохраняется, хотя зачастую известна системе. Один из способов сохранять эту информацию – создать свою подпрограмму (контекст) для обработки входящих вызовов, заполняя в ней поле accountcode, которое сохраняется в CDR (Call Detail Records – детальная информация о звонках). Сделать это достаточно просто:
• откройте меню PBX / Tools / Asterisk File Editor
• откройте файл extensions_custom.conf
• добавьте строки
[from-trunk-accountcode]
exten => _.,1,Set(CDR(accountcode)=i:${EXTEN})
exten => _.,n,Goto(from-trunk,${EXTEN},1)
exten => h,1,Macro(hangupcall,)
• сохраните изменения, нажав кнопку Save
• откройте каждую Внешнюю линию (Trunk) и укажите «from-trunk-accountcode» в поле «USER Context»
• примените настройки, нажав «Apply Configuration Changes Here»
Теперь в CDR будет сохраняться информация об используемых для входящей связи городских номерах, которые можно увидеть в меню Reports \ CDR Report:
В целях анализа статистики использования городских линий можно выгрузить информацию из CDR в Excel:
Также можно предварительно обработать данные из CDR примерно так:
чтобы выгрузить только по одной записи о каждом входящем звонке, тем самым упростив анализ:
Для подключения к базе CDR указанным выше способом требуется установить phpmyadmin, подключившись по SSH с правами root, выполнить команды:
sudo yum install phpmyadmin
sudo service httpd restart
Подпрограмма соединения звонящего с последним собеседником (SmartCallback)
Не редко мы пытаемся с офисного телефона позвонить кому-то на мобильный, но абонент оказывается не доступен или занят. Когда искомый нами человек перезванивает по пропущенному вызову, он слышит в ответ название компании, из которой ему звонили, но не всегда может догадаться кому он был нужен. В то же время, Elastix хранит информацию о вызовах и знает разгадку – кто и когда пытался с ним связаться. Если мы, получив такой звонок, соединим абонента с последним, кто ему звонил, скорее всего окажем услугу – сэкономим время обоих. Такой функционал не входит в стандартный набор функций, но может быть относительно просто реализован нами самостоятельно. Для этого потребуется:
• настроить подпрограмму (которую мы назовем SmartCallback) и присвоить ей номер 661234 (файл «extensions_custom.conf»)
• настроить запрос к статистике соединений и назвать его «LASTCALL» (файл «func_odbc.conf»)
• настроить подключение к базе данных CDR со статистикой соединений (файлы «res_odbc.conf» и «/etc/odbc.ini»)
• настроить Собственную функцию (Misc Destination) «SmartCallback» и присвоить ей вызов подпрограммы «661234»
• настроить Внутреннюю функцию (Misc Application) «NoSmartCallback», присвоив ей номер «601234», чтобы переключать на нее вызовы, не обработанные функцией «SmartCallback»
• настроить в правилах входящей связи (Inbound Routes) вызов Собственной функции (Misc Destination) «SmartCallback»
Настройка подпрограммы (контекста) SmartCallback
Собственные функции можно писать разными способами:
• в синтаксисе настраиваемого плана набора (файл «extensions_custom.conf»)
• на языке AEL (Asterisk Extension Language) (файл «extensions.ael»)
• на PHP или на другом языке, используя функцию AGI (Asterisk Gateway Interface)
Наша задача легко решается использованием файла «extensions_custom.conf». Для редактирования требуется открыть меню PBX / Tools / Asterisk File Editor:
открыть для редактирования «extensions_custom.conf» и добавить в него подпрограмму (контекст) [SmartCallback] с номером «661234»:
[SmartCallback]
exten => 661234,1,SET(CALL2B=${ODBC_LASTCALL(${CALLERID(number)})})
exten => 661234,n,Set(DIAL=${DB(DEVICE/${CALL2B}/dial)})
exten => 661234,n,GotoIf($["${DIAL}" = ""]?nfound)
exten => 661234,n,Set(CDR(accountcode)=B:${CDR(accountcode)})
exten => 661234,n,DIAL(${DIAL},12,)
exten => 661234,n,GotoIf($["s${DIALSTATUS}" = "sANSWER"]?endcon)
exten => 661234,n(nfound),Goto(601234,1)
exten => 661234,n(endcon),Hangup()
[ext-did-custom]
include => SmartCallback
Наша функция:
• вызывает еще не созданный нами запрос к статистике вызовов под названием «LASTCALL» (запросу передаем номер звонящего – «CALLERID(number)»)
• находит как следует сделать набор абонента, который вызывал звонящего последним
• добавляет к полю «accountcode» префикс «B:», чтобы в статистике сохранилась информация, что вызов был переключен на сотрудника нашей подпрограммой «SmartCallback»
• пытается в течение 12 секунд вызвать найденного абонента
• если абонент не найден или не ответил, переключает на еще не созданный номер «601234»
Создание запроса к CDR
Описания запросов хранятся в файле «func_odbc.conf», который по аналогии открываем через меню PBX / Tools / Asterisk File Editor и добавляем следующий текст:
[LASTCALL]
dsn=getcdr
readsql=SELECT src FROM cdr WHERE calldate > CURDATE() – 2 AND RIGHT(dst,10) = RIGHT('${SQL_ESC(${ARG1})}',10) ORDER BY calldate DESC LIMIT 0,1
Здесь «getcdr» – название еще не созданного источника данных, ARG1 – номер звонящего абонента. Чтобы учесть разные способы набора номера, используем последние 10 цифр от номера абонента («RIGHT(…,10)»). Поскольку в статистике могут храниться очень старые вызовы, ограничиваем поиск последними двумя днями («CURDATE() – 2»). Сортируем историю вызовов от последнего звонка к более старым («ORDER BY calldate DESC») и возвращаем первую из найденных записей («LIMIT 0,1»).
Настройка источника данных в Asterisk
Описание подключений к рес