Pull to refresh

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.


Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.