53 просмотров
от (540 баллов) в категории Тонкая настройка
редактировать от

В "Сценарии и кейсы" описано, как реализовать паузу для агента очереди.  Надо для нажатия *46 создать диалплан с кодом -

1,Answer()
n,Set(PeerNumber=${CHANNEL(endpoint)})
n,Set(MemberStatus=${DB(QueueMemberOnPause/${PeerNumber}})
n,Set(AppName=${IF($[ "${MemberStatus}" != "1" ]?PauseQueueMember:UnpauseQueueMember)})
n,Set(NewMemberStatus=${IF($[ "${MemberStatus}" == "1" ]?0:1)})
n,Exec(${AppName}(,Local/${PeerNumber}@internal/n))
n,Set(DB(QueueMemberOnPause/${PeerNumber})=${NewMemberStatus})
n,Playback(beep)
n,Hangup()

Хорошо, но все нажатия *46 как для включения, так и отключения паузы проходят для агента очереди одинаково. И вполне вероятно, если его что-то отвлекает, он может не сообразить, нажал он уже *46 или нет. Делать ли повторное нажатие и состояние испортить? Нужна броская индикация состояния. Предлагаю в конце делать beep одинарный, если в результате пауза включена, и двойной, если выключена.

Прошу внести соответствующую доработку в код. Сам я пока затрудняюсь корректно это сделать. Спасибо!

А можно ли так устроить, чтобы коллеги агента могли видеть его состояние пауза/нет по лампочке его кнопки на своем телефоне?

1 Ответ

от (123 тыс. баллов)

Может быть тогда проще вовсе разложить на два "Приложения":

Первое (пауза, один beep)

1,Answer()
n,Set(PeerNumber=${CHANNEL(endpoint)})
n,PauseQueueMember(,Local/${PeerNumber}@internal/n)
n,Set(DB(QueueMemberOnPause/${PeerNumber})=1)
n,Playback(beep)
n,Hangup()

Второе (снять паузу и два beep)

1,Answer()
n,Set(PeerNumber=${CHANNEL(endpoint)})
n,UnpauseQueueMember(,Local/${PeerNumber}@internal/n)
n,Set(DB(QueueMemberOnPause/${PeerNumber})=0)
n,Playback(beep)

n,Playback(beep)
n,Hangup()

от (540 баллов)
Два приложения - это значит два разных кода для ввода, т.е. *46 и, скажем, *47? Ну, это возможно, но тогда придется две разных кнопки на аппаратах задействовать, а у нас их не так много, чтобы разбрасываться кнопками.

Различие в числе beep вполне решает задачу. Если агент при очередном нажатии кнопки услышит не надлежащее число beep (что надеюсь, происходить будет редко), то просто нажмет еще раз. Поэтому возвращаюсь к первоначальной просьбе - сделать разное число beep в одном приложении.
от (540 баллов)
редактировать от

Не владея (совсем!) языком написания приложений, действуя чисто по аналогии, осмелюсь предположить, что для желаемого мною решения следует в исходный текст после Playback(beep) вставить такую строку
n,IF($[ "${MemberStatus}" == "0" ]?Playback(beep))
Годится?

от (123 тыс. баллов)

Не совсем, нужно другую функцию использовать попробовать

n,ExecIf($[ "${MemberStatus}" == "0" ]?Playback(beep))

от (540 баллов)

Спасибо, сегодня испытаю. Но остался еще мой последний вопрос из исходного моего запроса -

А можно ли так устроить, чтобы коллеги агента могли видеть его состояние пауза/нет по лампочке его кнопки на своем телефоне?

от (123 тыс. баллов)

можно, но это станет равносильным DND

n,ExecIf($[ "${MemberStatus}" == "1" ]?Set(DEVICE_STATE(Custom:${PeerNumber})=BUSY))
n,ExecIf($[ "${MemberStatus}" == "0" ]?Set(DEVICE_STATE(Custom:${PeerNumber})=NOT_INUSE))
от (540 баллов)

Сегодня подключил и потестировал паузу. Есть ряд вопросов.

1. Самое главное - пауза включается, но потом не отключается! С beep и лампочкой на кнопке всё в порядке срабытывает, но по факту возвращение сотрудника к работе в очереди не происходит, его телефон не звонит! Если его вывести из состава очереди и опять ввести, то телефон в очереди восстанавливается и звонит. В чем тут может быть загвоздка? К опубликованному коду диалплана изменения для beep и лампочки носят косметический характер и вставлены в самый конец. Вот используемый у меня код -

1,Answer()

n,Set(PeerNumber=${CHANNEL(endpoint)})

n,Set(MemberStatus=${DB(QueueMemberOnPause/${PeerNumber}})

n,Set(AppName=${IF($[ "${MemberStatus}" != "1" ]?PauseQueueMember:UnpauseQueueMember)})

n,Set(NewMemberStatus=${IF($[ "${MemberStatus}" == "1" ]?0:1)})

n,Exec(${AppName}(,Local/${PeerNumber}@internal/n))

n,Set(DB(QueueMemberOnPause/${PeerNumber})=${NewMemberStatus})

n,Playback(beep)

n,ExecIf($[ "${MemberStatus}" != "1" ]?Playback(silence/1))

n,ExecIf($[ "${MemberStatus}" != "1" ]?Playback(beep))

n,ExecIf($[ "${MemberStatus}" == "1" ]?Set(DEVICE_STATE(Custom:${PeerNumber})=BUSY))

n,ExecIf($[ "${MemberStatus}" != "1" ]?Set(DEVICE_STATE(Custom:${PeerNumber})=NOT_INUSE))

n,Playback(silence/1)

n,Hangup()

2. Что индикация на кнопке стала как для DND, для меня некритично. У нас DND не используют. Но тем не менее, возможно ли поиграться и с другими состояниями, чтобы индикация стала другой? Можно узнать полный список возможных значений DEVICE_STATE?

3. Индикация на кнопке интересна не только коллегам, но и самому сотруднику, чтобы наглядно видеть свое текущее состояние в очереди. Но для этого ему надо завести кнопку самого себя. Можно, но как я уже писал, кнопок у нас не так много, чтобы ими разбрасываться. В порядке бреда - а как бы сделать индикацию на самой кнопке вкл/откл паузы, т.е. где запрограмирован код *46?

4. Сигнал beep сливается с сигналами отбоя, можно не разобрать. А двойной beep тоже не очень разделяется. Думаю, стоит вставить silence как перед отбоем, так и между beep. Я вставил silence/1 - это самый короткий промежуток? Я бы между beep поставил вдвое короче.

5. Наверное, в последней строке лучше MemberStatus сравнивать не на == "0", а на != "1" как это делается в начале исходного текста?

6. Если сотрудник числится в 2 или более очередях, то код *46 управляет паузой сразу во всех. Но для некоторых сотрудников было бы удобно управлять паузой по очередям врозь. Как бы ввести дифференциацию, скажем, кодом *46<очередь>?

от (540 баллов)

Разобрался с диалпланом паузы. Была перепутана индикация. Поправил, заодно немного оптимизировал код, сделал чуть понагляднее. Все работает. Вот такой получился код -

1,Answer()

n,Set(PeerNumber=${CHANNEL(endpoint)})

n,Set(MemberStatus=${DB(QueueMemberOnPause/${PeerNumber}})

n,Set(NewMemberStatus=${IF($[ "${MemberStatus}" != "1" ]?1:0)})

n,Set(DB(QueueMemberOnPause/${PeerNumber})=${NewMemberStatus})

n,Set(AppName=${IF($[ "${MemberStatus}" != "1" ]?PauseQueueMember:UnpauseQueueMember)})

n,Exec(${AppName}(,Local/${PeerNumber}@internal/n))

n,Set(DEVICE_STATE(Custom:${PeerNumber})=${IF($[ "${MemberStatus}" != "1" ]?BUSY:NOT_INUSE)})

n,ExecIf($[ "${MemberStatus}" == "1" ]?Playback(beep&silence/1))

n,Playback(beep&silence/1)

n,Hangup()

Так что вопрос работоспособности кода снят. А что насчет остальных?

На этом сайте можно бесплатно задать вопрос разработчикам MikoPBX и другим членам сообщества. Время ответа не регламентированно, но мы стараемся несколько раз в день заглядывать сюда. Для срочного решения проблем обращайтесь на платную линию поддержки

Популярные теги

askozia входящие-вызовы настройка исходящие маршрутизация провайдер запись-разговоров входящие ivr исходящие-звонки обновление битрикс24 ошибка очередь провайдеры очередь-вызовов переадресация запись установка маршрут история-звонков mikopbx транк панель-телефонии-1с перевод-вызова перевод askozia7 askozia6 битрикс callerid интеграция голосовая-почта логи модуль перехват-вызова ростелеком нерабочее-время bitrix24 факс nat docker запись-разговора веб-интерфейс goip настройка-провайдер история диалплан почта журнал-звонков релиз gsm вызовы звонок внешние-номера web-интерфейс zabbix маршруты cdr sip панель pjsip переадресация-мобильный voicemail ascozia телефонная-книга аон мобильный звонков лицензирование вызовов редактор номер asterisk лицензия ami регистрация оповещения провайдеров время голосовая fax trunk разговоров группы-пользователей #mikopbx пропущенные-звонки донабор beeline monitoring тишина smtp cisco мобильные мультифон мегафон шлюз не-работает электронная-почта не-слышно-звук

2.8 тыс. вопросов

2.4 тыс. ответов

6.7 тыс. комментариев

465 тыс. пользователей

...