Входящий звонок 10.05.2011

Теперь начнем создавать контекст для входящих номеров. Для начала, один из своих SIP телефонов я перевел в другой контекст – incoming, на который в дальнейшем будут заведены входящие звонки, без добавочного номера. В контексте incoming мы будем использовать встроенное расширение s (входящий звонок без набора номера).

Точка входа

В моем случае, звонок может прийти с одной линии, но с разных номеров. При этом, логика обработки таких звонков тоже должна быть разная.

Если честно, я не очень представляю – как находить эти различия (т.к. пока что я не могу подключить внешнюю линию), да и логика набора мне понятна только для одного случая, но, в любом случае, это надо предусмотреть.

Сформируем задачу так: при звонке на контекст incoming отправить его в контекст incoming_rittal.

[incoming]
; контекст для входящих извне звонков
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, тогда звонок будет отправлен на факс (эту функцию распишем позднее, т.к. я хочу протестировать астерисковский факс для этих целей);
  • если ничего не нажимать, звонок так же уйдет на секретарей.

При этом, сразу после набора должен проиграться звуковой файл, предлагающий понажимать на кнопки.

[incoming_rittal]
; основной входящий контекст для 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()