Showing posts with label CLID. Show all posts
Showing posts with label CLID. Show all posts

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, что позволяет более правильно организовать записи.