Как стать автором
Обновить

Automatic Call Distribution или организация очередей на AVAYA и Asterisk

Операторский центр – это метод организации персонала и оборудования для достижения определенных деловых целей. Офисная АТС должна «уметь» работать как система, автоматически распределяющая поступающие вызовы (ACD — Automatic Call Distribution), позволяющая связаться с несколькими людьми через один номер или обработать несколько вызовов одновременно. В службах поддержки, и не только, это очень полезная возможность. Пользователь звонит на один из номеров, а на звонок отвечает свободный в данное время сотрудник.



Рассмотрим конфигурацию ACD на базе Asterisk и AVAYA. И в том и в другом случае работа центра основана на организации сотрудников (называемых агентами), в группы поиска. Установим группу поиска для внутренней линии справки/помощи. Назначим троих сотрудников (агентов) с собственными добавочными номерами для обслуживания нашей линии справки/помощи. Вызовы будут поступать к любому из свободных сотрудников. И так AVAYA — вводим add hunt-group next:



  • Group Name — имя группы — Helpdesk.
  • Group Extension — соответствующий номер телефона.
  • Group Type — код метода распределения вызовов. ucd-loa вызов будет поступать к агенту, имеющему наименьший показатель процентного содержания рабочего времени с момента входа в систему.

Укажем системе, как поступить с вызовом группы поиска, если он не может быть обработан сразу. Такой вызов устанавливается в “очередь”. Определим, что в очереди может находиться до 5 вызовов, но если вызов находится в очереди более 30 секунд, то системе следует уведомить об этом. Также требуется, чтобы система предупреждала о том, что в очереди находится 3 или более вызовов.


  • Queue — y.
  • Queue Length — максимальное число вызовов, которые могут находиться в очереди — 5.
  • Calls Warning Threshold — максимальное число вызовов в очереди, при превышении которого в системе вспыхнут кнопки состояния очереди — 3.


На третьей странице экрана HUNT GROUP добавим добавочные номера агентов.



Из методов распределения вызовов доступны:



  • circ — следующий свободный агент в последовательности.
  • UCD-MIA - свободный агент, который не был задействован дольше всех с момента последнего вызова.
  • UCD-LOA — свободный агент, имеющий наименьший показатель процентного содержания рабочего времени с момента входа в систему.
  • EAD-MIA — свободный агент с наивысшей квалификацией, который не был задействован дольше всех с момента последнего вызова.
  • EAD-LOA — свободный агент, имеющий наивысшую квалификацию и наименьший показатель процентного содержания рабочего времени с момента входа в систему.
  • DDC — первый агент, администрированный в этой группе поиска. В случае занятости первого агента вызов поступает ко второму агенту, и так далее.





Выполним аналогичные настройки на IP PBX Asterisk.

В отличии от AVAYA, Asterisk-агенты не привязаны к одному номеру и могут подключаться с любых. Для этого пользователь должен позвонить по определенному внутреннему номеру и ввести свой ID, пароль и номер телефона, к которому его нужно привязать. То есть агент – это как бы еще один виртуальный номер телефона. Позволим нашему внутреннему номеру быть агентом.



Данная операция внесет новый параметр в файл users.conf, в описание номера:


  • hasagent = yes.

Кроме того нам не придется редактировать файл agents.conf и вносить запись типа: agent => 3001,1234,Vasja Pupkin. Определим очереди для обработки вызовов и выберем агентов(в нашем случае он один :) ).



Asterisk может использовать шесть стратегий распределения вызовов между агентами.


  • ringall (звонить всем) Очередь звонит всем доступным агентам и устанавливает соединение с агентом, ответившим первым (это по умолчанию).
  • roundrobin (циклический) – устаревший Очередь последовательно перебирает всех агентов до тех пор, пока не найдет того, кто может принять вызов. roundrobin не учитывает загруженности агентов. Также, поскольку roundrobin всегда начинает с первого агента в очереди, эта стратегия подходит только в среде, где агенты более высокого ранга должны обрабатывать все вызовы, и только в случае их занятости принять вызов могут агенты с более низким рангом.
  • leastrecent (самый давний) Вызов направляется на обработку агенту, который не получал вызовы дольше всех.
  • fewestcalls (меньше всего вызовов) Вызов направляется на обработку агенту, который получил меньше всего звонков. Эта стратегия не учитывает фактической загруженности агента; она учитывает только количество принятых им вызовов (например, агент, принявший 3 вызова по 10 мин каждый, будет предпочтительнее агента, принявшего 5 вызовов по 2 мин каждый).
  • random (случайный) Как следует из имени этого параметра, выбор агента осуществляется случайным образом. Для небольшого центра обработки вызовов эта стратегия, вероятно, наиболее предпочтительная.
  • rrmemory Очередь перебирает список обработчиков очереди вызовов, отслеживая, кто из них получил вызов последним. При поступлении следующего вызова Asterisk начнет с этого участника. (Эта стратегия известна как циклическая память (round-robin memory)). Она обеспечивает более или менее равномерное распределение вызовов между агентами.

Или что то-же самое, в «ручную» правим файл queues.conf.


[6500]


  • fullname=helpdesk
  • strategy=ringall
  • timeout=15
  • wrapuptime=15
  • autofill=no
  • autopause=no
  • joinempty=yes
  • leavewhenempty=no
  • reportholdtime=no
  • maxlen=0
  • musicclass=default
  • member=Agent/6008

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



Или правим в «ручную».
[queues]
  • exten=6500,1,Queue(${EXTEN})
  • exten=6006,1,agentlogin()

Теперь, чтобы зарегистрировать агента, набираем номер 6006 и по подсказкам системы вводим сначала ID = 6008 и #, затем пароль XXXX (как вы заметили с тем-же с которым вы регистрируетесь на SIP аккаунте asterisk) и #. Получим сообщение о регистрации агента.


pbx*CLI>


== Agent '6008' logged in (format ulaw/ulaw)


Оператор с этого момента находится на линии и ему проигрывается музыка до тех пор пока не поступит входящий вызов. Когда агенту поступает на обработку вызов из очереди, он услышит звуковой сигнал (beep) и вызывающий абонент соединяется непосредственно с агентом. Используя функцию agentlogin(), «выход» агента происходит при опускании трубки.



Функция AgentCallbackLogin хоть и присутствует в интерфейсе управления но уже не используется.




Это приложение является устаревшим, его функциональность замещена логикой «диалплана» на AEL, размещенного в файле doc/queues-with-callback-members.txt в папке исходного кода Asterisk. Рассмотрим как организовать регистрацию агента с возможностью «обратного вызова». Обеспечим возможность динамической регистрации агента, для этого редактируем файл extensions.ael и добавим новый контекст queues-loginout.


context queues-loginout {


6010 => {


Answer();


Read(AGENT_NUMBER,agent-user);


VMAuthenticate(${AGENT_NUMBER}@default,s);


Set(queue-announce-success=1);


goto queues-manip,I${AGENT_NUMBER},1;


};




6011 => {


Answer();


Read(AGENT_NUMBER,agent-user);


Set(queue-announce-success=1);


goto queues-manip,O${AGENT_NUMBER},1;


};


};


В данном контексте мы описали два внутренних номера, один из которых (6010) предназначен для регистрации агента, второй (6011) для выхода. Коротко остановимся на функциях. Read — проигрывает приглашение agent-user.gsm и считывает в указанную переменную — AGENT_NUMBER, вводимую пользователем, DTMF последовательность, завершенную символом '#'.


VMAuthenticate — эта команда ведет себя аналогично приложению Authenticate(), за тем исключением, что пароли для проверки берутся из файла voicemail.conf, попросту говоря Вы проходите аутентификацию по паролю почтового ящика. И в заключении переходим в контекст queues-manip.


context queues-manip {


includes {


queues;


};


_[IO]60XX => {


&queue-addremove(6500,0,${EXTEN});


&queue-success(${EXTEN});


};


};


Из данного контекста вызываются два макроса. В первый в качестве параметра передается имя очереди описанное в queues.conf, приоритет (penalty) и номер абонента, где и происходит динамическая регистрация агента. Содержание макроса queue-addremove.


macro queue-addremove(queuename,penalty,exten) {


switch(${exten:0:1})


{


case I: // Login


AddQueueMember(${queuename},Local/${exten:1}@agents,${penalty});


break;


case O: // Logout


RemoveQueueMember(${queuename},Local/${exten:1}@agents);


break;


};


};


Макрос queue-success проосто проигрывает соответствующие звуковые файлы о регистрации или выходе.


macro queue-success(exten) {


if( ${queue-announce-success} > 0 )


{


switch(${exten:0:1})


{


case I:


Playback(agent-loginok);


Hangup();


break;


case O:


Playback(agent-loggedoff);


Hangup();


break;



Контекст agents и макрос callagent для возможности совершить «обратный вызов» и отключить не отвечающего агента.


context agents {


6008 => &callagent(SIP/6008,${EXTEN});


};


//***********************************************************************




macro callagent(device,exten) {


if( ${GROUP_COUNT(${exten}@agents)}=0 )


{


Set(OUTBOUND_GROUP=${exten}@agents);


Dial(${device},300,t);


switch(${DIALSTATUS})


{


case BUSY:


Busy();


break;


case NOANSWER:


Set(queue-announce-success=0);


goto queues-manip,O${exten},1;


default:


Hangup();


break;


};


}


else


{


Busy();


};


}









Для проверки зарегистрируемся в качестве агента. Для этого набираем номер 6010 и следуя подсказкам вводим номер и пароль, завершая символом '#'.



Получаем сообщение об успешной регистрации. С этого момента вызовы попадающие в очередь — 6500, будут направлены агенту. В случае его занятости, будет проигрываться музыка и сообщения о состоянии очереди. В случае не ответа агента — он будет отключен из обслуживания данной очереди. Для мониторинга состояния очереди применяем команду queue show.


Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.