Данную статью я писал в 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

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

Можно этот список сформировать в 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). Чем выше приоритет, тем выше в очереди будет звонок (быстрее вызов попадет к оператору). Звонки с одинаковым приоритетом будут обрабатываться по очереди.

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

Комментарии (0)