Очередь звонков 16.05.2011

Разумеется, в нашей компании есть секретари, которые обрабатывают звонки. И, разумеется, количество звонящих в один момент времени бывает больше, чем количество готовых ответить.

Соответственно, нужна очередь звонков.

Для начала, создадим файл /etc/asterisk/queues.conf. В нем можно задать очень много возможностей и опций, я для теста выбрал только несколько из них.

[general]
persistentmembers = yes
autofill = yes

; очередь секретарей риттал
[secretary_rittal]
; музыку играем по-умолчанию
musicclass = default

; звоним сразу всем, кто может отвечать.
; возможно, потом стоит поменять на linear
strategy=ringall
; для статистики установим уровень сервиса
; в одну минуту
servicelevel = 60

; время, по итечение которого агент считается недоступным
; и звонок возвращается в очередь
timeout = 10
retry = 5

; разрешаем входить в очередь, в которой нет агентов, могущих ответить
joinempty=yes

; не принимать звонки тем, кто уже разговаривает
ringinuse=no

Участников очереди мы будем хранить в таблице MySQL, для чего создадим таблицу

CREATE TABLE tbl_queue_member (
uniqueid INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
membername varchar(40),
queue_name varchar(128),
interface varchar(128),
penalty INT(11),
paused INT(11),
UNIQUE KEY queue_interface (queue_name, interface)
);

В этой таблице необходимо заполнять, как минимум, queue_name – имя очереди (например, secretary_rittal), и interface – куда отправить вызов (например, SIP/1261).

В /etc/asterisk/extconfig.conf добавляем

queue_members => odbc,asterisk,tbl_queue_member

Перегружаем астериск и смотрим

asterisk*CLI> queue show secretary_rittal
secretary_rittal has 0 calls (max unlimited) in 'ringall' strategy (0s holdtime, 0s talktime), W:0, C:0, A:0, SL:0.0% within 60s
   Members:
      SIP/1401 (realtime) (Not in use) has taken no calls yet
      SIP/1261 (realtime) (Not in use) has taken no calls yet
   No Callers

Теперь ограничим количество одновременных звонков на один телефон (более интересный вариант показан здесь).

В /etc/asterisk/sip.conf, в секцию general добавляем строчку limitonpeer=yes

В таблицу tbl_sip_conf добавляем столбец

call-limit int(11) NOT NULL default '1'

Все, астериск начал контролировать занятость!

Контекст очереди крайне прост:

[group_rittal_secretary]
; контекст для отправки звонка секретарям.
; пока просто сообщает о переводе звонка.
exten => s,1,NoOp(group_rittal_secretary from ${CALLERID(NUM)})
; сообщаем, что звонок переведен секретарям. Возможно,
; потом стоит это делать в самой очереди
exten => s,n,Playback(rittal/call_go_to_secretary)

; загоняем вызов в очередь
; из опций - разрешаем оператору переадресовать вызов
exten => s,n,Queue(secretary_rittal,t)

exten => s,n,Hangup()