;* ;* GnuDialer - Complete, free predictive dialer ;* ;* Complete, free predictive dialer for contact centers. ;* ;* Copyright (C) 2003-2008, GnuDialer Project ;* ;* Heath Schultz ;* Richard Lyman ;* ;* This program is free software, distributed under the terms of ;* the GNU General Public License. ;* ; add 4500-4599 to meetme.conf ;[conf] ;exten => _X.,1,Set(MEETME_RECORDINGFORMAT=wav) ;exten => _X.,n,Set(MEETME_RECORDINGFILE=/tmp/${IF(${ISNULL(${CALLERID(dnid)})}?${CALLERID(num)}:${CALLERID(dnid)})}-${IF(${ISNULL(${CAMPAIGN})}?UNKNOWN:${CAMPAIGN})}-${IF(${ISNULL(${LEADID})}?000000:${LEADID})}) ;exten => _X.,n,Meetme,${EXTEN}|dqMr ;;exten => _X.,n,Playback(vm-goodbye) ;exten => _X.,n,Hangup ;;this extension MUST be here for OriginateFailure triggers ;;exten => failed,1,Hangup [conf] exten => _XXXXXXXXXXXXX,1,Set(MEETME_RECORDINGFORMAT=wav) exten => _XXXXXXXXXXXXX,n,Set(MEETME_RECORDINGFILE=/tmp/${IF(${ISNULL(${CALLERID(dnid)})}?${CALLERID(num)}:${CALLERID(dnid)})}-${IF(${ISNULL(${CAMPAIGN})}?UNKNOWN:${CAMPAIGN})}-${IF(${ISNULL(${LEADID})}?000000:${LEADID})}) exten => _XXXXXXXXXXXXX,n,Meetme,${EXTEN}|dqMr exten => _XXXXXXXXXXXXX,n,Hangup exten => _XXXXXXXXXXXXXX,1,Set(MEETME_RECORDINGFORMAT=wav) exten => _XXXXXXXXXXXXXX,n,Set(MEETME_RECORDINGFILE=/tmp/${IF(${ISNULL(${CALLERID(dnid)})}?${CALLERID(num)}:${CALLERID(dnid)})}-${IF(${ISNULL(${CAMPAIGN})}?UNKNOWN:${CAMPAIGN})}-${IF(${ISNULL(${LEADID})}?000000:${LEADID})}) exten => _XXXXXXXXXXXXXX,n,Meetme,${EXTEN}|dqMr exten => _XXXXXXXXXXXXXX,n,Hangup [dialermenu] ;include => conf exten => s,1,Set(TIMEOUT(digit)=10) exten => s,n,Set(TIMEOUT(response)=15) exten => s,n,Background(gnudialer-intro) exten => s,n,Playback(silence/9) exten => s,n,Hangup exten => 1,1,GoTo(dialerlogin,s,1) exten => 2,1,GoTo(dialerlogout,s,1) exten => 3,1,Authenticate(1234) exten => 3,n,ChanSpy(Agent) exten => 3,n,Playback(vm-goodbye) exten => 3,n,Hangup exten => 4,1,SayAlpha(NOT YET AVAILABLE) ; from HERE to the end of THIS context is just various testing ; stuff. you should comment out of delete on a production box ;exten => 7,1,Set(__OPTION=2) ;exten => 7,n,Set(__CAMPAIGN=INBOUND) ;exten => 7,n,Set(__LEADID=1) ;exten => 7,n,Set(__PHONENUM=4083760400) ;exten => 7,n,Set(__DSPMODE=custom) ;exten => 7,n,Set(CALLERID(num)=4083760400) ;this DID number exten => 7,1,Set(CALLERID(num)=4083760400) exten => 7,n,Set(CALLERID(dnid)=4083760400) ;exten => 7,n,AGI(disporec.agi|${OPTION},"399",${CAMPAIGN},${LEADID},"10") exten => 7,n,Goto(gnud_inbound,${CALLERID(dnid)},1) ;exten => 7,n,SetVar(CALLFILENAME=${CAMPAIGN}-${LEADID}) ;exten => 7,n,Monitor(wav,${CALLFILENAME},m) ;exten => 7,n,SetVar(CALLFILENAME=agent-${CAMPAIGN}-${PHONENUM}-${EXTEN}-${LEADID}-${TIMESTAMP}) ;exten => 7,n,Monitor(gsm,${CALLFILENAME},m) ;exten => 7,n,Monitor(gsm,agent-${CAMPAIGN}-${PHONENUM}-${EXTEN}-${LEADID}-${TIMESTAMP},m) ;exten => 7,n,NoOp(${CALLFILENAME}) ;exten => 7,n,EXECIF(IF($[${CALLFILENAME}])?Monitor(gsm,${CALLFILENAME},m) ;exten => 7,n,Dial(Agent/300||t) ;exten => 7,n,Wait(10) ;exten => 7,1,Set(__FROM=INBOUND) ;exten => 7,2,EXECIF($["${FROM}" = "TESTCLOSERCALLBACK"]?AGI(printrec.agi|11,699,${CAMPAIGN},${LEADID},"CLOSER FAILURE - UnVerified Sale")) ;Exec(${IF($[${EXISTS(${MY_CDR_USERFIELD})}]?Set(CDR(userfield)=${MY_CDR_USERFIELD}):NoOp(Nothing to do))}) ;exten => 7,2,IF($["${FROM}" = "CLOSERCALLBACK"]?closerloop,s,1) ;exten => 7,2,GoToIf($["${AMDSTATUS}" = "HUMAN"]+$["${AMDSTATUS}" = "NOTSURE"]?talk,1:dsp-msg,1) ;exten => 7,n,Hangup() ;exten => 8,1,Set(__FROM=CLOSERCALLBACK) ;exten => 8,2,GoTo(closerloop,s,1) ;exten => 8,1,GoTo(closerloop,999,1) exten => 8,1,Set(__CAMPAIGN=INBOUND) exten => 8,n,Set(__LEADID=1) exten => 8,n,Set(__PHONENUM=4083760400) exten => 8,n,Set(CALLERID(num)=4083760400) ;exten => 8,n,Set(__DISPO=) ;exten => 8,n,UserEvent(${IF(${ISNULL(${ISTRANSFER})}?Pickup:CallbackPickup)}${IF($["${ASTVER}"="1.4"]}?|Channel: ${CHANNEL})}|CallerIDName: ${CALLERID(name)})) exten => 8,n,Set(__MYCHAN=${CHANNEL}) exten => 8,n,UserEvent(EXISTS: ${IF($[${EXISTS(${ASTVER})}]?|${MYCHAN})} ) exten => 8,n,UserEvent(ISNULL: ${IF($[${ISNULL(${ASTVER})}]?:|${MYCHAN})} ) exten => 8,n,UserEvent(EQUALS: ${IF($[${ASTVER}=1.4]?|${MYCHAN})} ) exten => 8,n,UserEvent( YADDA: ${IF($[${ISNULL(${ASTVER})}]?:${IF($[${ASTVER}=1.4]?|${MYCHAN})})}) exten => 8,n,GoTo(agent,300,1) exten => 9,1,Authenticate(1234) exten => 9,n,ChanSpy(Zap) ;include => conf ;IF($[${ASTVER}=1.4]?|Channel: ${CHANNEL}) exten => t,1,Playback(vm-goodbye) exten => t,2,Hangup exten => i,1,Playback(pbx-invalid&vm-goodbye) exten => i,n,Hangup [dialerlogin] exten => s,1,AgentLogin() ;exten => s,1,AgentCallBackLogin(${CALLERID(num)}|s|${CALLERID(num)}@somewhere) exten => s,n,Hangup [dialerlogout] exten => s,1,AgentCallbackLogin(${CALLERID(num)}|s|'#') exten => s,n,Hangup ;[icd_dialerlogin] ;exten => s,1,icd_agent(|noauth=0) [backtomain] exten => s,1,GoTo(gdincoming,s,1) ; you MUST read the README.inbound before using this ; all the comments in this section are old or for testing ; you can remove them [gnud_inbound] exten => _X.,1,Set(TIMEOUT(digit)=1) exten => _X.,2,Set(TIMEOUT(response)=1) exten => _X.,3,Wait(2) ; this is so callerid is passed exten => _X.,4,NoOp(${CALLERID(num)} ${IF(${ISNULL(${CALLERID(dnid)})}?${EXTEN}:${CALLERID(dnid)})}) ; we should have callerid by now, if not, we never will exten => _X.,5,Answer() ; answer so asterisk knows to wake up ; various lookup methods on the _X.,6 exten ;exten => _X.,6,AGI(agiIVR.agi|${CALLERID(num)},${IF(${ISNULL(${CALLERID(dnid)})}?${EXTEN}:${CALLERID(dnid)})}) exten => _X.,6,AGI(dnidlookup.agi|${CALLERID(num)},${IF(${ISNULL(${CALLERID(dnid)})}?${EXTEN}:${CALLERID(dnid)})}) ;exten => _X.,6,AGI(clid_lookup.agi) ; attempt to find this clid in all the campaign tables ; you need to write and agi to take that callerid number ; and attempt to find the leadid (or campaign and leadid) ; and use that to fill the below vars, if a record does not ; exist, create one, then fill in the leadid with the ; newly created record number. (this is so the agent will ; get a page that they can fill in and all the ; rest of the gnudialer/astcrm code can update something !!! exten => _X.,n,Set(__ISTRANSFER=) ; remember the __ so it is inherited on on variable names exten => _X.,n,Set(__PHONENUM=${CALLERID(num)}) ; we fill phonenum var so we can track it throughout call exten => _X.,n,Set(CALLERID(name)=~${CAMPAIGN}-${LEADID}-true~) ; this is a function, so not __ here ; the 'true' part is if you are using a ; closer or not, so it's true or false exten => _X.,n,Set(__FROM=INBOUND) exten => _X.,n,Playback(greeting) ; this is your greeting.. exten => _X.,n,SetMusicOnHold(inbound) ; are you ready to enjoy... exten => _X.,n,Set(x=$[ 0 ]) ; incrementor for retry loop exten => _X.,n,Goto(gdincoming,talk,1) ; send the call into the dialplan area for the agents ; remember, that everything gnudialer/crm updates is based ; on parsing the calleridname [gdincoming] exten => s,1,Answer() exten => s,n,Set(CALLERID(num)=${PHONENUM}) exten => s,n,GotoIf($["dsp-${DSPMODE}"="dsp-none"]+$["${ISTRANSFER}"="TRANSFER"]+$["foo${AGENTNUM}"!="foo"]?talk,1:dsp-${DSPMODE:0:3},1) ; shouldn't get here exten => s,n,NoOp(Oopsie!) exten => dsp-bac,1,BackgroundDetect(silence/3|500|300|1050) exten => dsp-bac,n,Hangup() exten => dsp-wai,1,WaitForSilence(500|2) exten => dsp-wai,n,GoTo(talk,1) exten => dsp-nvf,1,NVFaxDetect(2||700) exten => dsp-nvf,n,Hangup() exten => dsp-amd,1,AMD(2500|1500|800|5000|100|50|3|256) exten => dsp-amd,n,GoToIf($["${AMDSTATUS}" = "HUMAN"]+$["${AMDSTATUS}" = "NOTSURE"]?talk,1:dsp-msg,1) exten => dsp-cus,1,GoTo(gdcustom,s,1) exten => dsp-msg,1,hangup ;exten => dsp-msg,1,GoToIf($["${AMDSTATUS}" = "MACHINE"]?2:4) ;exten => dsp-msg,n,Playback(nbdy-avail-to-take-call&all-reps-busy)) ;exten => dsp-msg,n,hangup ; these 2 will effect gnudialer statusing (DO NOT USE THEM in gdincoming) ;exten => t,1,Goto(s,4) ;exten => i,1,Playback(pbx-invalid) ; this is where you want to send a call to trigger connect to agent exten => talk,1,NoOp(PHONENUM = ${PHONENUM}, DSPMODE = ${DSPMODE}, CAMPAIGN = ${CAMPAIGN}, LEADID = ${LEADID}, ISTRANSFER = ${ISTRANSFER}) exten => talk,n,UserEvent(${IF(${ISNULL(${ISTRANSFER})}?Pickup:CallbackPickup)}|CallerIDName: ${CALLERID(name)}) exten => talk,n,GoTo(agt1,1) exten => agt1,1,UserEvent(${IF(${ISNULL(${AGENTNUM})}?Queue:Schedule)}${ISTRANSFER}|CallerIDName: ${CALLERID(name)}) exten => agt1,n,Wait(3) exten => agt1,n,GoTo(agt2,1) exten => agt2,1,UserEvent(${IF(${ISNULL(${AGENTNUM})}?Queue:Schedule)}${ISTRANSFER}|CallerIDName: ${CALLERID(name)}) exten => agt2,n,Wait(3) exten => agt2,n,GoTo(abn,1) exten => abn,1,GoToIf($["${FROM}" = "INBOUND"]?retryagt,1:abn,2) exten => abn,2,UserEvent(${IF(${ISNULL(${ISTRANSFER})}?Abandon:CallbackFailure)}|CallerIDName: ${CALLERID(name)}) exten => abn,3,GotoIf($["${SAFEHARBORFILE}"="none"]?abn,4:playSF,1) ;exten => abn,n,Playback(some safe harbor msg) exten => abn,4,Hangup exten => playSF,1,Playback(${SAFEHARBORFILE}) exten => playSF,2,Hangup() exten => retryagt,1,Verbose(3|x is ${x} !) exten => retryagt,2,GotoIf($[ ${x} < 3 ]?retryagt,3:retryagt,8) exten => retryagt,3,Verbose(3|x is ${x} !) exten => retryagt,4,WaitMusicOnHold(15) exten => retryagt,5,Set(x=$[ ${x} + 1 ]) exten => retryagt,6,NoOp(${x}) exten => retryagt,7,Goto(agt1,1) exten => retryagt,8,Playback(pls-hold-while-try) ; No Agent Logged In prompt ;exten => retryagt,9,Voicemail(u500) ; send to voicemail instead exten => retryagt,9,Wait(5) exten => retryagt,10,Hangup exten => fax,1,UserEvent(Fax|CallerIDName: ${CALLERID(name)}) exten => fax,n,Hangup ; this extension MUST be here for OriginateFailure triggers exten => failed,1,Hangup [gdcustom] exten => s,1,AMD(2500|1500|800|5000|100|50|3|256) exten => s,n,GoToIf($["${AMDSTATUS}" = "HUMAN"]+$["${AMDSTATUS}" = "NOTSURE"]?askthem,1:playmsg,1) ; for testing send to askthem regardless ;exten => s,n,GoTo(askthem,1) exten => askthem,1,Set(TIMEOUT(digit)=10) exten => askthem,2,Set(TIMEOUT(response)=10) ; you must create a 'custom-intro' sound file exten => askthem,3,BackGround(custom-intro) exten => askthem,4,WaitExten exten => playmsg,1,GoToIf($["${AMDSTATUS}" = "MACHINE"]?2:4) exten => playmsg,2,Wait(2) ; change to whatever sound file you want to playback exten => playmsg,3,Playback(im-sorry-unable-to-connect-to-eng) exten => playmsg,4,Hangup() exten => 1,1,GoTo(gdincoming,talk,1) exten => 2,1,AGI(disporec.agi|${EXTEN},"999",${CAMPAIGN},${LEADID},"11") exten => 2,n,Playback(goodbye) exten => 2,n,Hangup() exten => 9,1,AGI(disporec.agi|${EXTEN},"999",${CAMPAIGN},${LEADID},"8") exten => 9,n,Playback(goodbye) exten => 9,n,Hangup() exten => t,1,Playback(goodbye) exten => t,n,Hangup exten => i,1,Playback(invalid&goodbye) exten => i,n,Hangup [gdtransfer] exten => s,1,Set(__FROM=CLOSERCALLBACK) exten => s,2,GoTo(closerloop,s,1) ; ******* NEW AGENT/CLOSER STUFF *********** ; DO NOT CHANGE ANY OF THE USEREVENTS (parsing will fail and SEG will happen) [agent] ; this set of extensions are for single digit agent numbers ; this is only here because *some people* (you know who you are) ; are not creating agents from the dialeradmin interface ; X single digit agent exten => _X,1,NoOp(AGENTTRANSFER - PHONENUM: ${PHONENUM} CAMPAIGN: ${CAMPAIGN} LEADID: ${LEADID}|Channel: ${CHANNEL}) exten => _X,n,Set(ISTRANSFER=TRANSFER) exten => _X,n,Set(TRANSFER_CONTEXT=agentdispo) exten => _X,n,Set(AGENTCALLED=${EXTEN}) exten => _X,n,Set(DYNCONF=(${PHONENUM})) exten => _X,n,Set(UID=[${UNIQUEID}]) exten => _X,n,UserEvent(AgentCalled|Agent/${EXTEN} ${DYNCONF} ${UID} ${CALLERID(name)}) exten => _X,n,Dial(Agent/${EXTEN}||t) exten => _X,n,UserEvent(Unlink|Agent/${EXTEN}) ; this set of extensions are for 2 or more digit agent numbers ; X and wildcard(.) for more than 2+ digit agent exten => _X.,1,NoOp(AGENTTRANSFER - PHONENUM: ${PHONENUM} CAMPAIGN: ${CAMPAIGN} LEADID: ${LEADID}|Channel: ${CHANNEL}) exten => _X.,n,Set(ISTRANSFER=TRANSFER) exten => _X.,n,Set(TRANSFER_CONTEXT=agentdispo) exten => _X.,n,Set(AGENTCALLED=${EXTEN}) exten => _X.,n,Set(DYNCONF=(${PHONENUM})) exten => _X.,n,Set(UID=[${UNIQUEID}]) exten => _X.,n,UserEvent(AgentCalled|Agent/${EXTEN} ${DYNCONF} ${UID} ${CALLERID(name)}) exten => _X.,n,Dial(Agent/${EXTEN}||t) exten => _X.,n,UserEvent(Unlink|Agent/${EXTEN}) exten => t,1,Hangup ;exten => h,1,GotoIf(${ISNULL(${DISPO})}?h,2:h,3) ;exten => h,2,DeadAGI(agiIVR.agi|${CALLERID(num)},${IF(${ISNULL(${CALLERID(dnid)})}?${EXTEN}:${CALLERID(dnid)})}) ;exten => h,3,Hangup() [agentdispo_old] exten => 12,1,UserEvent(Dispo|Body: Agent: ${AGENTCALLED}|Dispo: ${EXTEN}|Transfer: ${ISTRANSFER}|Campaign: ${CAMPAIGN}|Leadid: ${LEADID}|Channel: ${CHANNEL}) exten => 12,2,Wait,120 exten => 3,1,GotoIf($["${VMMACHINEFILE}"="none"]?3,2:playmsg,1) exten => 3,2,UserEvent(Dispo|Body: Agent: ${AGENTCALLED}|Dispo: ${EXTEN}|Transfer: ${ISTRANSFER}|Campaign: ${CAMPAIGN}|Leadid: ${LEADID}|Channel: ${CHANNEL}) exten => 3,3,Hangup exten => _X,1,UserEvent(Dispo|Body: Agent: ${AGENTCALLED}|Dispo: ${EXTEN}|Transfer: ${ISTRANSFER}|Campaign: ${CAMPAIGN}|Leadid: ${LEADID}|Channel: ${CHANNEL}) exten => _X,2,Hangup exten => _1X,1,UserEvent(Dispo|Body: Agent: ${AGENTCALLED}|Dispo: ${EXTEN}|Transfer: ${ISTRANSFER}|Campaign: ${CAMPAIGN}|Leadid: ${LEADID}|Channel: ${CHANNEL}) exten => _1X,2,Hangup exten => playmsg,1,Playback(${VMMACHINEFILE}) exten => playmsg,2,Wait,2 exten => playmsg,3,Hangup() [agentdispo] exten => 12,1,Set(__DISPO=${EXTEN}) exten => 12,n,Verbose(3|AgentDispo - SALE - Send Event Looking for Closer) exten => 12,n,UserEvent(Dispo|Body: Agent: ${AGENTCALLED}|Dispo: ${EXTEN}|Transfer: ${ISTRANSFER}|Campaign: ${CAMPAIGN}|Leadid: ${LEADID}|Channel: ${CHANNEL}) exten => 12,n,Wait,120 exten => 3,1,Set(__DISPO=${EXTEN}) exten => 3,2,GotoIf($["${VMMACHINEFILE}"="none"]?3,3:playVM,1) exten => 3,3,Verbose(3|AgentDispo - ansmach - DELAY - Start - 5 Seconds) exten => 3,n,Wait,5 ;exten => 3,n,UserEvent(Dispo|Body: Agent: ${AGENTCALLED}|Dispo: ${EXTEN}|Transfer: ${ISTRANSFER}|Campaign: ${CAMPAIGN}|Leadid: ${LEADID}|Channel: ${CHANNEL}) exten => 3,n,Verbose(3|AgentDispo - ansmach - DELAY - Stop - Hangup) exten => 3,n,Hangup exten => 6,1,Set(__DISPO=${EXTEN}) exten => 6,2,GotoIf($["${VMMACHINEFILE}"="none"]?6,3:playVM,1) exten => 6,3,Verbose(3|AgentDispo - fax - DELAY - Start - 5 Seconds) exten => 6,n,Wait,5 ;exten => 6,n,UserEvent(Dispo|Body: Agent: ${AGENTCALLED}|Dispo: ${EXTEN}|Transfer: ${ISTRANSFER}|Campaign: ${CAMPAIGN}|Leadid: ${LEADID}|Channel: ${CHANNEL}) exten => 6,n,Verbose(3|AgentDispo - ansmach - DELAY - Stop - Hangup) exten => 6,n,Hangup exten => 10,1,Set(__DISPO=${EXTEN}) exten => 10,2,GotoIf($["${VMMACHINEFILE}"="none"]?10,3:playVM,1) exten => 10,3,Verbose(3|AgentDispo - other - DELAY - Start - 5 Seconds) exten => 10,n,Wait,5 ;exten => 10,n,UserEvent(Dispo|Body: Agent: ${AGENTCALLED}|Dispo: ${EXTEN}|Transfer: ${ISTRANSFER}|Campaign: ${CAMPAIGN}|Leadid: ${LEADID}|Channel: ${CHANNEL}) exten => 10,n,Verbose(3|AgentDispo - other - DELAY - Stop - Hangup) exten => 10,n,Hangup ;exten => _X,1,Set(__DISPO=${EXTEN}) ;exten => _X,n,Verbose(3|AgentDispo - rest - DELAY - Start - 5 Seconds) ;exten => _X,n,Wait,5 ;exten => _X,n,UserEvent(Dispo|Body: Agent: ${AGENTCALLED}|Dispo: ${EXTEN}|Transfer: ${ISTRANSFER}|Campaign: ${CAMPAIGN}|Leadid: ${LEADID}|Channel: ${CHANNEL}) ;exten => _X,n,Verbose(3|AgentDispo - rest - DELAY - Stop - Hangup) ;exten => _X,n,Hangup exten => _X,1,Set(__DISPO=${EXTEN}) exten => _X,n,Verbose(3|AgentDispo - non ansmach/fax - NO DELAY) exten => _X,n,UserEvent(Dispo|Body: Agent: ${AGENTCALLED}|Dispo: ${EXTEN}|Transfer: ${ISTRANSFER}|Campaign: ${CAMPAIGN}|Leadid: ${LEADID}|Channel: ${CHANNEL}) exten => _X,n,Hangup exten => _1X,1,Set(__DISPO=${EXTEN}) exten => _1X,n,Verbose(3|AgentDispo - sale/nosale - NO DELAY) exten => _1X,n,UserEvent(Dispo|Body: Agent: ${AGENTCALLED}|Dispo: ${EXTEN}|Transfer: ${ISTRANSFER}|Campaign: ${CAMPAIGN}|Leadid: ${LEADID}|Channel: ${CHANNEL}) exten => _1X,n,Hangup exten => playmsg,1,Verbose(3|AgentDispo - playmsg - Playing Recorded Message) exten => playmsg,n,Playback(${VMMACHINEFILE}) exten => playmsg,n,UserEvent(Dispo|Body: Agent: ${AGENTCALLED}|Dispo: ${DISPO}|Transfer: ${ISTRANSFER}|Campaign: ${CAMPAIGN}|Leadid: ${LEADID}|Channel: ${CHANNEL}) exten => playmsg,n,Hangup() exten => playVM,1,Verbose(3|AgentDispo - playVM - Playing Recorded Message) exten => playVM,n,Playback(${VMMACHINEFILE}) ;exten => playVM,n,UserEvent(Dispo|Body: Agent: ${AGENTCALLED}|Dispo: ${DISPO}|Transfer: ${ISTRANSFER}|Campaign: ${CAMPAIGN}|Leadid: ${LEADID}|Channel: ${CHANNEL}) exten => playVM,n,Hangup() ;exten => h,1,GotoIf(${ISNULL(${DISPO})}?h,3:h,2) ;exten => h,2,UserEvent(Dispo|Body: Agent: ${AGENTCALLED}|Dispo: ${DISPO}|Transfer: ${ISTRANSFER}|Campaign: ${CAMPAIGN}|Leadid: ${LEADID}|Channel: ${CHANNEL}) ;exten => h,3,Hangup() [closer] ; the 699 part is handled in closerloop in extensions.ael now exten => 699,1,NoOp(CLOSERTRANSFER - None Available - PHONENUM: ${PHONENUM} CAMPAIGN: ${CAMPAIGN} LEADID: ${LEADID}|Channel: ${CHANNEL}) exten => 699,n,Set(ISTRANSFER=) exten => 699,n,Set(TRANSFER_CONTEXT=closerdispo) exten => 699,n,Set(AGENTCALLED=${EXTEN}) exten => 699,n,Set(DYNCONF=(${PHONENUM})) exten => 699,n,Set(UID=[${UNIQUEID}]) exten => 699,n,Playback(allrepsbusy&pls-stay-on-line) exten => 699,n,Wait,20 exten => 699,n,UserEvent(Queue${ISTRANSFER}|CallerIDName: ${CALLERID(name)}) ; this wait must exist for it to NOT autofallthru and hangup exten => 699,n,Wait,120 exten => _X,1,NoOp(CLOSERTRANSFER - PHONENUM: ${PHONENUM} CAMPAIGN: ${CAMPAIGN} LEADID: ${LEADID}|Channel: ${CHANNEL}) exten => _X,n,Set(ISTRANSFER=) exten => _X,n,Set(TRANSFER_CONTEXT=closerdispo) exten => _X,n,Set(AGENTCALLED=${EXTEN}) exten => _X,n,Set(DYNCONF=(${PHONENUM})) exten => _X,n,Set(UID=[${UNIQUEID}]) ; this wait is to give the db time to update with agent entered info exten => _X,n,Wait(2.5) exten => _X,n,UserEvent(ClserCalled|Agent/${EXTEN} ${DYNCONF} ${UID} ${CALLERID(name)}) ;exten => _X,n,EXECIF($["${DOMONITOR}" = "TRUE"]?Monitor(gsm,agent-${CAMPAIGN}-${PHONENUM}-${EXTEN}-${LEADID},m) exten => _X,n,Dial(Agent/${EXTEN}||t) exten => _X,n,UserEvent(Unlink|Agent/${EXTEN}) exten => _X.,1,NoOp(CLOSERTRANSFER - PHONENUM: ${PHONENUM} CAMPAIGN: ${CAMPAIGN} LEADID: ${LEADID}|Channel: ${CHANNEL}) exten => _X.,n,Set(ISTRANSFER=) exten => _X.,n,Set(TRANSFER_CONTEXT=closerdispo) exten => _X.,n,Set(AGENTCALLED=${EXTEN}) exten => _X.,n,Set(DYNCONF=(${PHONENUM})) exten => _X.,n,Set(UID=[${UNIQUEID}]) ; this wait is to give the db time to update with agent entered info exten => _X.,n,Wait(2.5) exten => _X.,n,UserEvent(ClserCalled|Agent/${EXTEN} ${DYNCONF} ${UID} ${CALLERID(name)}) exten => _X.,n,Dial(Agent/${EXTEN}||t) exten => _X.,n,UserEvent(Unlink|Agent/${EXTEN}) exten => t,1,Hangup exten => h,1,Hangup [closerdispo] exten => 12,1,UserEvent(Dispo|Body: Agent: ${AGENTCALLED}|Dispo: ${EXTEN}|Transfer: ${ISTRANSFER}|Campaign: ${CAMPAIGN}|Leadid: ${LEADID}|Channel: ${CHANNEL}) exten => 12,2,Hangup exten => _X,1,UserEvent(Dispo|Body: Agent: ${AGENTCALLED}|Dispo: ${EXTEN}|Transfer: ${ISTRANSFER}|Campaign: ${CAMPAIGN}|Leadid: ${LEADID}|Channel: ${CHANNEL}) exten => _X,2,Hangup exten => _1X,1,UserEvent(Dispo|Body: Agent: ${AGENTCALLED}|Dispo: ${EXTEN}|Transfer: ${ISTRANSFER}|Campaign: ${CAMPAIGN}|Leadid: ${LEADID}|Channel: ${CHANNEL}) exten => _1X,2,Hangup