С использованием TRANSFER_CONTEXT
Это, вероятно, самый интересный вариант с возвратом вызова после “слепого” перевода. Зачастую необходимость перевести вызов на другого абонента возникает не только у секретаря. Представьте себе фирму (к примеру, тот же call-центр), в которой осуществляются консалтинговые услуги. При этом множество “секретарей” переводят вызовы на специалистов, специалисты могут переводить вызовы друг на друга, и зачастую нет времени (и желания) перевести вызов, а затем дожидаться на него ответа – а хочется перенаправить вызов на нужного сотрудника, чтобы в случае, если человека нет на месте (или он занят) вызов вернулся обратно автоматически. Таким образом, вызов должен возвращаться не “кому-нибудь”, а именно тому человеку, который его перевел.В этом случае для всех переводимых вызовов настраивается отдельный контекст, в котором они будут обрабатываться (задав значение переменной TRANSFER_CONTEXT). При этом контролируется, был ли ответ на этот переведенный вызов, и при необходимости (используя переменную BLINDTRANSFER) можно вернуть вызов тому абоненту, который осуществлял перевод вызова:
extensions_custom.conf
[globals]
TRANSFER_CONTEXT=blind_transfer_mikhed_ringback
[local_phones]
exten => _XXX,1,Answer()
exten => _XXX,n,Dial(SIP/${EXTEN},45,tT)
exten => _XXX,n,Hangup()
[blind_transfer_mikhed_ringback]
exten => _X.,1,NoOp("Blindtransfer: " ${BLINDTRANSFER})
exten => _X.,n,Set(ExtLength=${LEN(${EXTEN})}).
; ${BLINDTRANSFER} - это не оригинальный номер, а оригинальный канал, например:
; SIP/1111-433242424242
exten => _X.,n,Set(OrigNumber=${BLINDTRANSFER:4:${ExtLength}})
; было :4: поствил :6: и заработало
; делаем основной вызов:
exten => _X.,n,Dial(SIP/${EXTEN},45,tTg)
; если он удался, то завершаем вызов, если нет - возвращаемся к тому, кто переводил
; вызов:
exten => _X.,n,GotoIf($["${DIALSTATUS}" = "ANSWER"]?hangup:callback)
exten => _X.,n(callback),Dial(local/${OrigNumber}@local_phones,45,tT)
; Обратите внимание: здесь делается только одна попытка вернуть вызов.
; Однако на самом деле к моменту возврата вызова сотрудник может быть уже занят.
; Так что имеет смысл делать несколько попыток, или перенаправлять вызовы куда-либо
; еще.
exten => _X.,n(hangup),Hangup().