Blind transfer

Hi,

I use FreePBX 2.0.1
When I make a blind transfert, I would like my call ring again my extension after a timeout, if the called extension does not pickup, even if the called extension has an active voicemail.

Thanks very much for help

After some corrections, here is the working code.
If someone as a better idea, it is welcome.

[code:1]
; Ring an extension, if the extension is busy or there is no answer send it
; to voicemail
; ARGS: $VMBOX, $EXT
[macro-exten-vm]
exten => s,1,Macro(user-callerid)
exten => s,2,Set(FROMCONTEXT=exten-vm)
exten => s,3,Macro(record-enable,${ARG2},IN)
exten => s,4,Macro(dial,${RINGTIMER},${DIAL_OPTIONS},${ARG2});<-------------NUMEROTATION PAR MACRO DIAL CI-DESSUS
exten => s,5,GotoIf($["${CHANNEL:0:5}" = “Local”]?s-${DIALSTATUS},1) ; if the channel is Local, then do not go to voicemail. This is primarily to avoid vm for call-forwarded extensions in ring groups
exten => s,6,GotoIf($["${ARG1}" = “novm”]?s-${DIALSTATUS},1) ; no voicemail in use for this extension
exten => s,7,NoOp(Sending to Voicemail box ${ARG2})
exten => s,8,Macro(vm,${ARG1},${DIALSTATUS})
;BEFORE
;exten => s-BUSY,1,NoOp(Extension is reporting BUSY and has no Voicemail)STOP OCCUPE ET PAS DE BOITE**
;exten => s-BUSY,2,Busy()
;exten => s-BUSY,3,Wait(60)
;exten => s-BUSY,4,NoOp()
;AFTER
exten => s-BUSY,1,GotoIf($[${LEN(${BLINDTRANSFER})} > 0]?100) ;//Si on était issu d’un blind transfer, on jumpe en 100
exten => s-BUSY,2,NoOp(Extension is reporting BUSY and has no Voicemail)STOP OCCUPE ET PAS DE BOITE**
exten => s-BUSY,3,Busy()
exten => s-BUSY,4,Wait(60)
exten => s-BUSY,5,NoOp()
exten => s-BUSY,100,Macro(comeback-blind-transfer);//On renvoie l’appel à celui qui a effectué le blind transfert

exten => _s-.,1,GotoIf($[${LEN(${BLINDTRANSFER})} > 0]?100)
exten => _s-.,2,Congestion()
exten => _s-.,100,Macro(comeback-blind-transfer)

;BEFORE
;[macro-vm]
;exten => s,1,Macro(user-callerid)
;exten => s,2,Goto(s-${ARG2},1)
;exten => s-BUSY,1,Macro(get-vmcontext,${ARG1})
;exten => s-BUSY,2,Voicemail(b${ARG1}@${VMCONTEXT}) ; Voicemail Busy message ********STOP Déclenchement boite vocale car occupé
;exten => s-BUSY,3,Hangup()
;exten => _s-.,1,Macro(get-vmcontext,${ARG1})
;exten => _s-.,2,Voicemail(u${ARG1}@${VMCONTEXT}) ; Voicemail Unavailable message ******STOP Déclenchement boite vocale injoignable
;exten => _s-.,3,Hangup()
;exten => o,1,Background(one-moment-please) ; si appui sur 0 pendant message boite vocale on arrive ici
;exten => o,2,GotoIf($[“foo${FROM_DID}” = “foo”]?from-pstn,s,1:from-pstn,${FROM_DID},1);on renvoie l’appel sur le standard
;exten => a,1,Macro(get-vmcontext,${ARG1})
;exten => a,2,VoiceMailMain(${ARG1}@${VMCONTEXT})
;exten => a,3,Hangup

;AFTER
[macro-vm]
exten => s,1,NoOp(Début Macro vm : DialedPeerNb=${DIALEDPEERNUMBER})
exten => s,2,Macro(user-callerid)
exten => s,3,Goto(s-${ARG2},1)
exten => s-BUSY,1,GotoIf($[${LEN(${BLINDTRANSFER})} > 0]?100) ;//Si on était issu d’un blind transfer, on jumpe en 100
exten => s-BUSY,2,Macro(get-vmcontext,${ARG1})
exten => s-BUSY,3,Voicemail(b${ARG1}@${VMCONTEXT}) ; Voicemail Busy message ********STOP Déclenchement boite vocale car occupé
exten => s-BUSY,4,Hangup()
exten => s-BUSY,100,Macro(comeback-blind-transfer);//On renvoie l’appel à celui qui a effectué le blind transfert

exten => _s-.,1,GotoIf($[${LEN(${BLINDTRANSFER})} > 0]?100) ;//Si on était issu d’un blind transfer, on jumpe en 100
exten => _s-.,2,Macro(get-vmcontext,${ARG1})
exten => _s-.,3,Voicemail(u${ARG1}@${VMCONTEXT}) ; Voicemail Unavailable message ******STOP Déclenchement boite vocale injoignable
exten => _s-.,4,Hangup()
exten => _s-.,100,Macro(comeback-blind-transfer);//On renvoie l’appel à celui qui a effectué le blind transfert

exten => o,1,Background(one-moment-please) ; si appui sur 0 pendant message boite vocale on arrive ici
exten => o,2,GotoIf($[“foo${FROM_DID}” = “foo”]?from-pstn,s,1:from-pstn,${FROM_DID},1);on renvoie l’appel sur le standard
exten => a,1,Macro(get-vmcontext,${ARG1})
exten => a,2,VoiceMailMain(${ARG1}@${VMCONTEXT})
exten => a,3,Hangup

;make a blind transfer come back if the target is unreachable
[macro-comeback-blind-transfer]
exten => s,1,NoOp(Entrée call-back-blind. BlindTransfer=${BLINDTRANSFER}.Longueur=${LEN(${BLINDTRANSFER})})
exten => s,2,Cut(RETOUR=BLINDTRANSFER,/,2);On extrait dans RETOUR L’extension débarrassée de "SIP/"
exten => s,3,Cut(RETOUR=RETOUR,-,1);On extrait dans RETOUR l’extension débarrassée de l’ID de channel
exten => s,4,NoOp(Le numéro de callback extrait est :${RETOUR})
exten => s,5,SetVar(BLINDTRANSFER=);On réinitialise BLINDTRANSFER car asterisk ne le fait pas seul
exten => s,6,Ringing();//On fournit une sonnerie à l’oreille de celui qui est en train d’attendre qu’on le ballade…
exten => s,7,Wait(10);//Attente pour permettre le raccoché de celui qui a transféré sur les postes analogiques
exten => s,8,Goto(ext-local,${RETOUR},1);//On renvoie l’appel vers celui qui a tenté le blind transfert…

[/code:1]

off the top of my head, that would take some custom work, don’t think you are going to get it with the standard dialplan. If you have a specific extension that you want to do this with, you could setup a queue with it to transfer the call to, which would loop back to you if they aren’t there. But otherwise, you’ll need to use something like call parking or do some custom work (I think).

p

At first, thanks for replie.

I solved my problem, and i think it could be an improvement of the basic extensions.conf of freepbx, as in this case, a blind transfer never cause a lost call.
So, the solution is pretty simple.
If it can be useful for someone, follows how I wrote this behaviour.
Just be indulgent, as I am an asterisk beginner, and my english is very bad!

At first, I add an macro in extensions.conf:

[code:1]
;make a blind transfer come back if the target is unreachable
[macro-comeback-blind-transfer]
exten => s,1,Cut(RETOUR=BLINDTRANSFER,/,2);On extrait dans RETOUR L’extension débarrassée de "SIP/"
exten => s,2,Cut(RETOUR=RETOUR,-,1);On extrait dans RETOUR l’extension débarrassée de l’ID de channel
exten => s,3,Ringing();//On fournit une sonnerie à l’oreille de celui qui est en train d’attendre qu’on le ballade…
exten => s,4,Wait(10);//Attente pour permettre le raccoché de celui qui a transféré sur les postes analogiques
exten => s,5,Goto(ext-local,${RETOUR},1);//On renvoie l’appel vers celui qui a tenté le blind transfert…
[/code:1]

Second, I have changed the vm and exten-vm macros as follows

[code:1]
[macro-exten-vm]
exten => s,1,Macro(user-callerid)
exten => s,2,Set(FROMCONTEXT=exten-vm)
exten => s,3,Macro(record-enable,${ARG2},IN)
exten => s,4,Macro(dial,${RINGTIMER},${DIAL_OPTIONS},${ARG2})
exten => s,5,GotoIf($["${CHANNEL:0:5}" = “Local”]?s-${DIALSTATUS},1) ; if the channel is Local, then do not go to voicemail. This is primarily to avoid vm for call-forwarded extensions in ring groups
exten => s,6,GotoIf($["${ARG1}" = “novm”]?s-${DIALSTATUS},1) ; no voicemail in use for this extension
exten => s,7,NoOp(Sending to Voicemail box ${ARG2})
exten => s,8,Macro(vm,${ARG1},${DIALSTATUS})
;BEFORE
;exten => s-BUSY,1,NoOp(Extension is reporting BUSY and has no Voicemail)
;exten => s-BUSY,2,Busy()
;exten => s-BUSY,3,Wait(60)
;exten => s-BUSY,4,NoOp()
;AFTER
exten => s-BUSY,1,GotoIf($${LEN(${BLINDTRANSFER})} > 0?100) ;//Si on était issu d’un blind transfer, on jumpe en 100
exten => s-BUSY,2,NoOp(Extension is reporting BUSY and has no Voicemail)
exten => s-BUSY,3,Busy()
exten => s-BUSY,4,Wait(60)
exten => s-BUSY,5,NoOp()

exten => _s-.,1,Congestion()

exten => s-BUSY,100,Macro(comeback-blind-transfer);//On renvoie l’appel à celui qui a effectué le blind transfert

;BEFORE
;[macro-vm]
;exten => s,1,Macro(user-callerid)
;exten => s,2,Goto(s-${ARG2},1)
;exten => s-BUSY,1,Macro(get-vmcontext,${ARG1})
;exten => s-BUSY,2,Voicemail(b${ARG1}@${VMCONTEXT}) ; Voicemail Busy message
;exten => s-BUSY,3,Hangup()
;exten => _s-.,1,Macro(get-vmcontext,${ARG1})
;exten => _s-.,2,Voicemail(u${ARG1}@${VMCONTEXT}) ; Voicemail Unavailable message
;exten => _s-.,3,Hangup()
;exten => o,1,Background(one-moment-please) ; si appui sur 0 pendant message boite vocale on arrive ici
;exten => o,2,GotoIf($[“foo${FROM_DID}” = “foo”]?from-pstn,s,1:from-pstn,${FROM_DID},1);on renvoie l’appel sur le standard
;exten => a,1,Macro(get-vmcontext,${ARG1})
;exten => a,2,VoiceMailMain(${ARG1}@${VMCONTEXT})
;exten => a,3,Hangup

;AFTER
[macro-vm]
exten => s,1,Macro(user-callerid)
exten => s,2,Goto(s-${ARG2},1)
exten => s-BUSY,1,GotoIf($${LEN(${BLINDTRANSFER})} > 0?100) ;//Si on était issu d’un blind transfer, on jumpe en 100
exten => s-BUSY,2,Macro(get-vmcontext,${ARG1})
exten => s-BUSY,3,Voicemail(b${ARG1}@${VMCONTEXT}) ; Voicemail Busy message
exten => s-BUSY,4,Hangup()
exten => s-BUSY,100,Macro(comeback-blind-transfer);//On renvoie l’appel à celui qui a effectué le blind transfert

exten => _s-.,1,GotoIf($${LEN(${BLINDTRANSFER})} > 0?100) ;//Si on était issu d’un blind transfer, on jumpe en 100
exten => _s-.,2,Macro(get-vmcontext,${ARG1})
exten => _s-.,3,Voicemail(u${ARG1}@${VMCONTEXT}) ; Voicemail Unavailable message
exten => _s-.,4,Hangup()
exten => _s-.,100,Macro(comeback-blind-transfer);//On renvoie l’appel à celui qui a effectué le blind transfert

exten => o,1,Background(one-moment-please) ; si appui sur 0 pendant message boite vocale on arrive ici
exten => o,2,GotoIf($[“foo${FROM_DID}” = “foo”]?from-pstn,s,1:from-pstn,${FROM_DID},1);on renvoie l’appel sur le standard
exten => a,1,Macro(get-vmcontext,${ARG1})
exten => a,2,VoiceMailMain(${ARG1}@${VMCONTEXT})
exten => a,3,Hangup
[/code:1]

Thats all!.
How does it works ?
When occurs a blind transfer, if the target is unreachable (busy, no response…) the call is back-forwarded to the “transferer”, no matter if the target as a voicemail or not.
A further direct tranfer to the target’s voice mail always being possible…