Monday, September 17, 2012

Предача Clid при переводе звонка

Так получилось, что необходимость это сделать переросла из "было бы неплохо" до "надо сделать".
Начальные условия: телефоны делают transfer не средствами станции, а своими. Тот, кому звонят должен как-то увидеть, что звонок переводится.
Сделано для варианта вызова простым Dial, но с очередью проблем быть не должно, просто другая переменная.

Смысл такой: при ответе вызывается макрос, которые заносит номера пары звонящий/ответивший в базу. При завершении разговора эта запись стирается. При вызове ответившего по второй линии (что и делается при переводе) его номер заменяется на номер звонящего (можно с модификациями, типа Перевожу ХХХ).

При использовании очередей также можно использовать этот метод, но надо доработать  macro-StoreCLID на предмет анализа не DIALEDPEERNUMBER, а MEMBERINTERFACE, или, в в случае перехвата - BRIDGEPEER. Только предварительно их обработав типа
...
exten => s,n,Set(AnsweredPeer=${CUT(BRIDGEPEER,/,2)})
exten => s,n,Set(AnsweredPeer=${CUT(AnsweredPeer,-,1)})
...
...
exten => s,n,GoToIf($["${DIALEDPEERNUMBER}x" != "x"]?DPNPresent)
exten => s,n,Set(DIALEDPEERNUMBER=${CUT(MEMBERINTERFACE,/,2)})
exten => s,n(DPNPresent),n,NoOp("No DIALEDPEERNUMBER present...")
...
[macro-StoreCLID]

exten => s,1,NoOp(Answered is = ${DIALEDPEERNUMBER})
exten => s,n,Set(DB(CLIDT/${DIALEDPEERNUMBER})=${ExternalCLID})


[IncomingCallContext]
...
exten => s,n,Set(__ExternalCLID=${CALLERID(num)})
exten => s,n,Dial(${ALLOP},20,M(StoreCLID))
...
exten => h,1,NoOp(${DB_DELETE(CLIDT/${DIALEDPEERNUMBER})})

[InternalCallsContext]

exten => _X,1,Set(TransferredCLID=${DB_DELETE(CLIDT/${CALLERID(num)})})
exten => _X,n,GotoIf($[ "x${TransferredCLID}" = "x"]?ClearCall)
exten => _X,n,Set(CALLERID(num)=${TransferredCLID})
exten => _X,n(ClearCall),.....



При использовании очередей также можно использовать этот метод, но надо доработать  macro-StoreCLID на предмет анализа не только DIALEDPEERNUMBER, а MEMBERINTERFACE, или, в в случае перехвата - BRIDGEPEER. Только предварительно их обработав типа

...
exten => s,n,Set(AnsweredPeer=${CUT(BRIDGEPEER,/,2)})
exten => s,n,Set(AnsweredPeer=${CUT(AnsweredPeer,-,1)})

...
...
exten => s,n,GoToIf($["${DIALEDPEERNUMBER}x" != "x"]?DPNPresent)
exten => s,n,Set(DIALEDPEERNUMBER=${CUT(MEMBERINTERFACE,/,2)})

exten => s,n(DPNPresent),n,NoOp("No DIALEDPEERNUMBER present...")
...

Вообще таким образом можно получить номер ответившего пира в экстеншене h, что позволяет более правильно организовать записи.