Кастомизация очередей во Freepbx
Для реализации многих задач может хватить и стандартного функционала FreePBX, однако, также возможно кастомизировать очереди под какие-либо требования. Статья-обзор стандартного функционала очередей во FreePBX 13 Создадим используемую очередь. Задержка вызова операторов Пенальти в очереди Если необходимо в очереди сделать задержку вызова у некоторых операторов при стратегиях, подразумевающих вызов сразу на нескольких абонентов (например ringall) необходимо […]
Для реализации многих задач может хватить и стандартного функционала FreePBX, однако, также возможно кастомизировать очереди под какие-либо требования.
Статья-обзор стандартного функционала очередей во FreePBX 13
Создадим используемую очередь.
Задержка вызова операторов
Пенальти в очереди
Если необходимо в очереди сделать задержку вызова у некоторых операторов при стратегиях, подразумевающих вызов сразу на нескольких абонентов (например ringall) необходимо внести изменения в диалплан. На примере очереди 600, задержка у операторов 112(10 с) и 113(20 с):
[from-queue]
exten => 600,n,ExecIf($[${QAGENT}=112]?Wait(10))
exten => 600,n,ExecIf($[${QAGENT}=113]?Wait(20))
exten => 600,n(nodelay),Goto(from-internal,${QAGENT},1)
Попадание в IVR если все операторы заняты (оповещение, выбор пунктов меню)
Чтобы абоненты попадали в очередь с занятыми (разговаривающими) операторами и имели выбор –сделать какой либо выбор в предварительном меню (заказать обратный звонок) и сбросить, или, прослушав оповещение перед попаданием в очередь, немного подождать необходимо внести изменения в диалплан.
Также, на вкладке Capacity Options(Размер очереди) установить параметры входа(Join Empty) и выхода(Leave Empty) из очереди в Strict(ограниченный).
В примере переписывается очередь 600, ранее созданная в веб-интерфейсе. Диалплан, относящийся к очереди 600 необходимо скопировать в конфигурационный файл extensions_override_freepbx.conf.
;START
;попадание в предварительную IVR (если в очереди операторы заняты)
[ext-queues]
exten => 600,1,Macro(user-callerid,)
exten => 600,n,Progress
exten => 600,n,NoOp(DIALSTATUS BEFORE ${DIALSTATUS})
exten => 600,n,NoOp(CDR BEFORE ${CDR(disposition)})
exten => 600,n,DumpChan
exten => 600,n,Macro(blkvm-set,reset)
exten => 600,n,ExecIf($["${REGEX("(M[(]auto-blkvm[)])" ${DIAL_OPTIONS})}" != "1"]?Set(_DIAL_OPTIONS=${DIAL_OPTIONS}M(auto-blkvm)))
exten => 600,n,Set(__NODEST=${EXTEN})
exten => 600,n,Set(QCIDPP=${IF($[${LEN(${VQ_CIDPP})}>0]?${VQ_CIDPP}: )})
exten => 600,n,Set(VQ_CIDPP=)
exten => 600,n,ExecIf($["${QCIDPP}"!=""]?Macro(prepend-cid,${QCIDPP}))
exten => 600,n,Set(QAINFO=${IF($[${LEN(${VQ_AINFO})}>0]?${VQ_AINFO}: )})
exten => 600,n,Set(VQ_AINFO=)
exten => 600,n,ExecIf($["${QAINFO}"!=""]?Set(__ALERT_INFO=${QAINFO}))
exten => 600,n,Set(QJOINMSG=${IF($[${LEN(${VQ_JOINMSG})}>0]?${IF($["${VQ_JOINMSG}"!="0"]?${VQ_JOINMSG}: )}:custom/deny-out)})
exten => 600,n,Set(VQ_JOINMSG=)
exten => 600,n,Set(QRETRY=${IF($[${LEN(${VQ_RETRY})}>0]?${VQ_RETRY}: )})
exten => 600,n,Set(VQ_RETRY=)
exten => 600,n(qoptions),Set(QOPTIONS=${IF($[${LEN(${VQ_OPTIONS})}>0]?${VQ_OPTIONS}:t)}${QCANCELMISSED}${QRINGOPTS}${QRETRY})
exten => 600,n,Set(VQ_OPTIONS=)
exten => 600,n(qgosub),Set(QGOSUB=${IF($[${LEN(${VQ_GOSUB})}>0]?${VQ_GOSUB}:${QGOSUB})})
exten => 600,n,Set(VQ_GOSUB=)
exten => 600,n(qagi),Set(QAGI=${IF($[${LEN(${VQ_AGI})}>0]?${VQ_AGI}:${QAGI})})
exten => 600,n,Set(VQ_AGI=)
exten => 600,n(qrule),Set(QRULE=${IF($[${LEN(${VQ_RULE})}>0]?${IF($["${VQ_RULE}"!="0"]?${VQ_RULE}: )}:${QRULE})})
exten => 600,n,Set(VQ_RULE=)
exten => 600,n(qposition),Set(QPOSITION=${IF($[${LEN(${VQ_POSITION})}>0]?${VQ_POSITION}:${QPOSITION})})
exten => 600,n,Set(VQ_POSITION=)
exten => 600,n,Gosub(sub-record-check,s,1(q,600,force))
exten => 600,n,Set(__CWIGNORE=TRUE)
exten => 600,n,Set(__CFIGNORE=TRUE)
exten => 600,n,Set(__FORWARD_CONTEXT=block-cf)
;Переписывание оповещения, если нет свободных операторов
;exten => 600,n,ExecIf($["${QJOINMSG}"!="" && ${QUEUE_MEMBER(600,ready)}<1]?Playback(${QJOINMSG}, noanswer))
exten => 600,n,GoToIf($[${QUEUE_MEMBER(600,ready)}<1]?announce-ivr-q600,600,1:ext-queues,600,continuedial)
exten => 600,n(continuedial),QueueLog(600,${UNIQUEID},NONE,DID,${FROM_DID})
exten => 600,n,NoOp(ready ${QUEUE_MEMBER(${EXTEN},ready)})
exten => 600,n,NoOp(free ${QUEUE_MEMBER(${EXTEN},free)})
exten => 600,n,Set(QAANNOUNCE=${IF($[${LEN(${VQ_AANNOUNCE})}>0]?${IF($["${VQ_AANNOUNCE}"!="0"]?${VQ_AANNOUNCE}: )}: )})
exten => 600,n,Set(VQ_AANNOUNCE=)
exten => 600,n,Set(QMOH=${IF($["${VQ_MOH}"!=""]?${VQ_MOH}: )})
exten => 600,n,Set(VQ_MOH=)
exten => 600,n,ExecIf($["${QMOH}"!=""]?Set(__MOHCLASS=${QMOH}))
exten => 600,n,ExecIf($["${MOHCLASS}"!=""]?Set(CHANNEL(musicclass)=${MOHCLASS}))
exten => 600,n,Set(QMAXWAIT=${IF($[${LEN(${VQ_MAXWAIT})}>0]?${VQ_MAXWAIT}:1800)})
exten => 600,n,Set(VQ_MAXWAIT=)
exten => 600,n,Set(QUEUENUM=600)
exten => 600,n,Set(QUEUEJOINTIME=${EPOCH})
exten => 600,n(qcall),Queue(600,${QOPTIONS},,${QAANNOUNCE},${QMAXWAIT},${QAGI},,${QGOSUB},${QRULE},${QPOSITION})
exten => 600,n,Macro(blkvm-clr,)
exten => 600,n,Gosub(sub-record-cancel,s,1())
exten => 600,n,Set(__NODEST=)
exten => 600,n,Set(_QUEUE_PRIO=0)
exten => 600,n,Set(__CWIGNORE=)
exten => 600,n,Set(__CFIGNORE=)
exten => 600,n,Set(__FORWARD_CONTEXT=from-internal)
exten => 600,n,Set(QDEST=${VQ_DEST})
exten => 600,n,Set(VQ_DEST=)
exten => 600,n(gotodest),GotoIf($["${QDEST}"=""]?app-blackhole,hangup,1:${CUT(QDEST,^,1)},${CUT(QDEST,^,2)},${CUT(QDEST,^,3)})
exten => h,1,NoOp(Оповещение о пропущенном вызове)
exten => h,n,System(/usr/local/bin/sendEmail.pl -f "AsteriskPBX <[email protected]>" -t [email protected] -u "Queue ${NODEST} - ${CALLERID(num)}" -m "Не дождался ответа: ${CALLERID(num)} \\nВремя ожидания: ${CDR(duration)} сек \\nЗвонок поступил в очередь ${CDR(dst)} \\nВремя: ${STRFTIME(${EPOCH},,%d/%m %H:%M:%S)}" -o message-charset=UTF-8 & disown -h )
exten => h,n,Macro(hangupcall,)
[announce-ivr-q600]
exten => 600,1,NoOp(Announce IVR - нет свободных операторов)
exten => 600,n(skip),Set(IVR_MSG=${QJOINMSG})
exten => 600,n(start),Set(TIMEOUT(digit)=3)
exten => 600,n,NoOp(DIALSTATUS DO ANNOUNCE- ${DIALSTATUS})
exten => 600,n,NoOp(CDR DO ${CDR(disposition)})
exten => 600,n,ExecIf($["${IVR_MSG}" != ""]?Background(${IVR_MSG},noanswer))
exten => 600,n,NoOp(DIALSTATUS AFTER ANNOUNCE- ${DIALSTATUS})
exten => 600,n,NoOp(CDR AFTER ${CDR(disposition)})
exten => 600,n,WaitExten(5,)
exten => 1,1(ivrsel-1),Goto(send-mail,s,1)
exten => i,1(final),Goto(ext-queues,600,continuedial)
exten => t,1(final),Goto(ext-queues,600,continuedial)
exten => h,1,NoOp(Оповещение о пропущенном вызове)
exten => h,n,System(/usr/local/bin/sendEmail.pl -f "AsteriskPBX <[email protected]>" -t [email protected] -u "Queue ${NODEST} - ${CALLERID(num)}" -m "Не дождался ответа: ${CALLERID(num)} \\nВремя ожидания: ${CDR(duration)} сек \\nЗвонок поступил в очередь ${CDR(dst)} \\nВремя: ${STRFTIME(${EPOCH},,%d/%m %H:%M:%S)}" -o message-charset=UTF-8 & disown -h )
exten => h,n,Macro(hangupcall,)
;
;END
;
;попадание в предварительную IVR (если в очереди операторы заняты)
Также, см. статью об отправке почты с помощью Postfix
Остались вопросы?
Я - Виталий Шелест, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.
категории
- DECT
- Linux
- Вспомогательный софт при работе с Asterisk
- Интеграция с CRM и другими системами
- Интеграция с другими АТС
- Использование Elastix
- Использование FreePBX
- Книга
- Мониторинг и траблшутинг
- Настройка Asterisk
- Настройка IP-телефонов
- Настройка VoIP-оборудования
- Новости и Статьи
- Подключение операторов связи
- Разработка под Asterisk
- Установка Asterisk
VoIP оборудование
ближайшие курсы
Новые статьи
10 доводов в пользу Asterisk
Распространяется бесплатно.
Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.
Безопасен в использовании.
Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.
Надежен в эксплуатации.
Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.
Гибкий в настройке.
Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.
Имеет огромный функционал.
Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.
Интегрируется с любыми системами.
То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.
Позволяет телефонизировать офис за считанные часы.
В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.
Отличная масштабируемость.
Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.
Повышает управляемость бизнеса.
Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.
Снижает расходы на связь.
Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.