Разумеется, в нашей компании есть секретари, которые обрабатывают звонки. И, разумеется, количество звонящих в один момент времени бывает больше, чем количество готовых ответить.
Соответственно, нужна очередь звонков.
Для начала, создадим файл /etc/asterisk/queues.conf. В нем можно задать очень много возможностей и опций, я для теста выбрал только несколько из них.
persistentmembers = yes
autofill = yes
; очередь секретарей риттал
[secretary_rittal]
; музыку играем по-умолчанию
musicclass = default
; звоним сразу всем, кто может отвечать.
; возможно, потом стоит поменять на linear
strategy=ringall
; для статистики установим уровень сервиса
; в одну минуту
servicelevel = 60
; время, по итечение которого агент считается недоступным
; и звонок возвращается в очередь
timeout = 10
retry = 5
; разрешаем входить в очередь, в которой нет агентов, могущих ответить
joinempty=yes
; не принимать звонки тем, кто уже разговаривает
ringinuse=no
Участников очереди мы будем хранить в таблице MySQL, для чего создадим таблицу
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 добавляем
Перегружаем астериск и смотрим
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 добавляем столбец
Все, астериск начал контролировать занятость!
Контекст очереди крайне прост:
; контекст для отправки звонка секретарям.
; пока просто сообщает о переводе звонка.
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()