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
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 raccocḫ̩ 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 raccocḫ̩ 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…