Данную статью я писал в 2016 году, но тогда ее вернули на дооформление, которое мне было делать лень. Да и ничего революционного я тут не описывал. Тем не менее нашел неопубликованную статью у себя в профиле сегодня и решил все же доделать, вдруг кому еще пригодится.
Итак, предистория
На работе (я тогда работал в банке) встала задача реализовать функционал, позволяющий ВИП-клиентам дозваниваться до операторов нашего call-центра с минимальным ожиданием.
Некоторое время искал на просторах интернета готовое решение.
Нашел всего пару статей, видимо не очень популярная тема.
Одна из них здесь же на Хабре:
Я не программист и на тот момент python не знал вообще, так что я не до конца разобрался в методике. Мне данный способ показался сложным.
Второй ресурс мне помог больше:
Этим способом я и решил воспользоваться, однако и тут я столкнулся с проблемами. Не знаю, обновлялись ли с тех пор с статьи с приведенных ссылок и но ниже опишу, что у меня тогда не заработало. Тем не менее получившийся у меня вариант отличается от приведенных выше и возможно кому-то будет все же полезен.
У меня была установлена система 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
Первое значение - имя контакта, второе - сам номер. Имя контакта мы будем использовать для определения "веса" номера в очереди.
Можно этот список сформировать в EXCEL, потом сохранить как 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). Чем выше приоритет, тем выше в очереди будет звонок (быстрее вызов попадет к оператору). Звонки с одинаковым приоритетом будут обрабатываться по очереди.
Спасибо за внимание.