Теперь начнем создавать контекст для входящих номеров. Для начала, один из своих SIP телефонов я перевел в другой контекст – incoming, на который в дальнейшем будут заведены входящие звонки, без добавочного номера. В контексте incoming мы будем использовать встроенное расширение s (входящий звонок без набора номера).
Точка входа
В моем случае, звонок может прийти с одной линии, но с разных номеров. При этом, логика обработки таких звонков тоже должна быть разная.
Если честно, я не очень представляю – как находить эти различия (т.к. пока что я не могу подключить внешнюю линию), да и логика набора мне понятна только для одного случая, но, в любом случае, это надо предусмотреть.
Сформируем задачу так: при звонке на контекст incoming отправить его в контекст incoming_rittal.
; контекст для входящих извне звонков
exten => s,1,NoOp(incoming callerid ${CALLERID(NUM)})
; пока безо всяких условий перебросим звонок в
; контекст incoming_rittal
exten => s,n,Dial(Local/s@incoming_rittal);
exten => s,n,Hangup();
; если пришел звонок на неизвестный экстеншн, то рекурсивно
; вызовем себя без указания номера
exten => _X!,1,NoOp(unknown extension ${EXTEN} from ${CALLERID(NUM)})
exten => _X!,n,Dial(Local/s@incoming)
exten => _X!,n,Hangup()
Обрабатывающий входящий контекст
Именно этот контекст (incoming_rittal) возьмет на себя основной «удар» входящих звонков.
Пока при звонке на него будет возможно:
- набрать внутренний номер на 1 или 6;
- набрать трехзначный номер, тогда будет проиграно сообщение о 4-значном номере и он будет набран с префиксом 1;
- нажать 0, тогда звонок будет переведен на секретарей (эту функцию распишем позднее);
- нажать 9, тогда звонок будет отправлен на факс (эту функцию распишем позднее, т.к. я хочу протестировать астерисковский факс для этих целей);
- если ничего не нажимать, звонок так же уйдет на секретарей.
При этом, сразу после набора должен проиграться звуковой файл, предлагающий понажимать на кнопки.
; основной входящий контекст для rittal
exten => s,1,NoOp(incoming_rittal from ${CALLERID(NUM)})
exten => s,n,Answer();
; запускаем в фоне сообщение о том, что можно сделать
exten => s,n,Background(rittal/intro)
; ждем 11 секунд - 9 - само сообщение,
; еще 2 секунды - на случай набора
exten => s,n,WaitExten(3)
; если набрали 0 - переводим на секретарей
exten => 0,1,Dial(Local/s@group_rittal_secretary,,m)
exten => 0,n,Hangup()
; если набрали 9 - переводим на софт-факс
exten => 9,1,Dial(Local/fax@group_rittal_softfax_receive)
exten => 9,n,Hangup()
; если набрали 3 цифры
; воспроизводим сообщение об ошибочном наборе
exten => _[2-8]XX,1,Playback(rittal/3_digits_old_number)
exten => _[2-8]XX,n,Macro(dial_internal_number,1${EXTEN})
exten => _[2-8]XX,n,Hangup()
; если набрали 4 цифры с 1 или 6
; то уводим в набор внутреннего номера
exten => _[16]XXX,1,Macro(dial_internal_number,${EXTEN})
exten => _[16]XXX,n,Hangup()
; в случае таймаута - переводим звонок в секретарский контекст
exten => t,1,Dial(Local/s@group_rittal_secretary,,m)
exten => t,n,Hangup()
; если набрали неизвестный экстеншн,
; сообщаем об этом и переводим на секретарей
exten => i,1,Playback(rittal/number_is_wrong)
exten => i,n,Dial(Local/s@group_rittal_secretary,,m)
exten => i,n,Hangup()