Выставление приоритетов в очереди для «важных» клиентов

от автора

Данную статью я писал в 2016 году, но тогда ее вернули на дооформление, которое мне было делать лень. Да и ничего революционного я тут не описывал. Тем не менее нашел неопубликованную статью у себя в профиле сегодня и решил все же доделать, вдруг кому еще пригодится.

Итак, предистория

На работе (я тогда работал в банке) встала задача реализовать функционал, позволяющий ВИП-клиентам дозваниваться до операторов нашего call-центра с минимальным ожиданием.

Некоторое время искал на просторах интернета готовое решение.

Нашел всего пару статей, видимо не очень популярная тема.

Одна из них здесь же на Хабре:

https://habr.com/ru/post/270125/

Я не программист и на тот момент python не знал вообще, так что я не до конца разобрался в методике. Мне данный способ показался сложным.

Второй ресурс мне помог больше:

https://voxlink.ru/kb/asterisk-configuration/queue-prio/

Этим способом я и решил воспользоваться, однако и тут я столкнулся с проблемами. Не знаю, обновлялись ли с тех пор с статьи с приведенных ссылок и но ниже опишу, что у меня тогда не заработало. Тем не менее получившийся у меня вариант отличается от приведенных выше и возможно кому-то будет все же полезен.

У меня была установлена система Asterisk FreePBX 12 версии.

Формируем список VIP-номеров

В меню Admin->Phonebook добавляем нужные номера. В поле «Name» пишем P=1 (почему так, объясню ниже). В поле «Number» указываем номер клиента. Поле «Set dial code» оставляем пустым и снимаем галочку с параметра «Set Speed Dial» (иначе автоматически создатся код быстрого набора — он нам не нужен).

Чтобы не добавлять номера вручную, особенно если список большой, то можно их добавить через csv-файл.

csv-файл должен быть следующего формата:

P=1,79123456789

P=1,79129876543

P=2,79129876534

Первое значение — имя контакта, второе — сам номер. Имя контакта мы будем использовать для определения «веса» номера в очереди.

Можно этот список сформировать в EXEL, потом сохранить как csv с разделителями запятая.

Вносим изменения в логику звонка

Основная звонковая логика в Asterisk настраивается в extensions.conf . Однако для различных сборок, в частности FreePBX данный файл «перенаваривается» при любом изменении в Web-интерфейсе.

Для различных правок контекста есть файлы extensions_override_freepbx.conf и extensions_custom.conf

Я делал изменения в extensions_custom.conf

Изначально он пуст.

Скопированный с сайта voxlink.ru контекст у меня не заработал (иначе я бы за эту статью не брался). Возможно повлияла разница версий, но вот с чем я столкнулся.

  • Во-первых, там оказалось несколько синтаксических ошибок (лишние пробелы).

  • Во-вторых, у меня почему то мой asterisk не воспринимал same (хотя стандартная функция Asterisk), пришлось везде прописывать exten, но это не принципиально и не намного удлиняет код.В третьих, функция Execif у меня вроде работала, правильное значение приоритета получала, но не применяла его к очереди.

    Я решил делать просто через оператор сравнения IF.

  • В третьих, функция Execif у меня вроде работала, правильное значение приоритета получала, но не применяла его к очереди.

В итоге у меня получился такой вариант:

[from-city] exten => _X.,n,Goto(priorities,${EXTEN},1);  [priorities] exten => _X.,1,NoOp(SET Priority); exten => _X.,n,Set(__QUEUE_PRIO=${IF('${DB(cidname/${CID}):0:1}'='P'?${DB(cidname/${CID}):2:1})}:0);0) ; exten => _X.,n,Goto(from-pstn,${EXTEN},1);

С помощью функции Goto отправляем наши вызовы на проверку в секцию priorities. Первый exten в этой секции просто выводит в лог сообщение, при необходимости эту строчку можно не писать. Основное действие происходит в следующей строчке. Делается поиск из нашей книги контактов, если находим совпадение, от имени данного контакта берется первый символ. Если он равен «Р», Тогда от имени этого контакта отсекаем первые 2 символа, оставшееся значение и есть наш приоритет (или «вес» звонка в очереди). Далее отправляем наш звонок на обычную обработку, но уже с другим приоритетом очереди.

После сохранения изменений, не забываем перезапустить сервис, чтобы изменения применились:

service asterisk restart

Через GUI указываем в нужном транке наш конекст в поле Incoming Settings-> User Details.

Он должен быть примерно такого вида:

type=friend trunk=yes secret='YOUSECRETPASSWORD' Language=ru disallow=all context=from-city allow=alaw

Заключение

Если вдруг кто не знает, в Asterisk, по умолчанию, у всех звонков приоритет 0. Поэтому нам достаточно выставлять приоритет 1. При желании можно сделать несколько групп номеров с разным приоритетом («важные»=1, «VIP»=2, «суперVIP»=3 и т. д. до 9). Чем выше приоритет, тем выше в очереди будет звонок (быстрее вызов попадет к оператору). Звонки с одинаковым приоритетом будут обрабатываться по очереди.

Спасибо за внимание.


ссылка на оригинал статьи https://habr.com/ru/post/670672/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *