Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Current »


Outbound

Agent with Hardphone


2 Step call, calls the agent and when answered calls the destination.



${OUTGUID}:   Guid of the call
${OUTAGENT}:  Agent Name 
${OUTQUEUE}:  Campaign Name (Queue)
${OUTDID}:    DID to use as callerid 
${OUDIDALED}: Dialed Number


With Webrtc phone

The call do not need two steps, it is directly. The name of the queue, the guid, and the did can be obtained of the SIP Header, the rest of the variables can be obtained directly.

${SIP_HEADER(OUTGUID)}:   Guid of the call
${CDR(accountcode)}:      Agent Name
${SIP_HEADER(OUTQUEUE)}:  Campaign Name (Queue) 
${SIP_HEADER(OUTDID)}:    DID to use as callerid  
${EXTEN}:                 Dialed Number



Full Example of the Standard Workflow


We can see the variables running and are taken into account as they arrive depending on the mode that the agent to run.

Always set __Ani to be able to find calls in logs.

QueueUpdate always for update the values on Outbound campaigns.

 Set(CDR(userfield)=${userfield})  to Tag recording


exten=> _9XXXXXXX.,1,Set(VOLUME(TX)=2)
exten=> _9XXXXXXX.,2,Set(VOLUME(RX)=2)
exten=> _9XXXXXXX.,3,GotoIf($[${EXTEN:0:3}= 900]?62:4)
exten=> _9XXXXXXX.,4,GotoIf($["${OUTQUEUE}"= ""]?47:5)
exten=> _9XXXXXXX.,5,Set(__OUTQUEUE=${OUTQUEUE})
exten=> _9XXXXXXX.,6,Set(__DIALED=${OUTDIALED})
exten=> _9XXXXXXX.,7,Set(__AGENT=${OUTAGENT})
exten=> _9XXXXXXX.,8,Set(CALLERID(num)=${OUTDID})
exten=> _9XXXXXXX.,9,Set(CALLERID(name-pres)=allowed_passed_screen)
exten=> _9XXXXXXX.,10,Set(HASH(Result)=${ODBC_Data(select did\,name\,dialstring from queues where name in (select queue_name from queue_members where membername =  '${CHANNEL(accountcode)}')  and direction = 'Outbound' and name ='${OUTQUEUE}')})
exten=> _9XXXXXXX.,11,Set(CALLERID(name)=${OUTQUEUE})
exten=> _9XXXXXXX.,12,Set(event=${ODBC_Data(select event from queue_log where agent = '${AGENT}' and queuename= '${OUTQUEUE}'  and event in ('PAUSE', 'UNPAUSE') ORDER BY id DESC LIMIT 1)})
exten=> _9XXXXXXX.,13,GotoIf($["${event}" = "PAUSE"]?45:14)
exten=> _9XXXXXXX.,14,GotoIf($["${OUTGUID}" = ""]?40:15)
exten=> _9XXXXXXX.,15,Set(__guid=${OUTGUID})
exten=> _9XXXXXXX.,16,Set(CDR(guid)=${guid})
exten=> _9XXXXXXX.,17,Set(CDR(type)=record)
exten=> _9XXXXXXX.,18,MixMonitor(${guid}.gsm,b,)
exten=> _9XXXXXXX.,19,Set(CDR(campaign)=${OUTQUEUE})
exten=> _9XXXXXXX.,20,Set(CHANNEL(accountcode)=${AGENT})
exten=> _9XXXXXXX.,21,Set(__idLlamada=${guid})
exten=> _9XXXXXXX.,22,Set(__REALDIALED=${EXTEN:1})
exten=> _9XXXXXXX.,23,Set(existeNum=${ODBC_Data(SELECT COUNT(*) FROM black_list WHERE (campaign like '${OUTQUEUE}%' || campaign ='*') AND phone ='${EXTEN}')})
exten=> _9XXXXXXX.,24,GotoIf($["${existeNum}"!= "0"]?37:25)
exten=> _9XXXXXXX.,25,Dial(${HASH(Result,dialstring)}/${EXTEN:1},180,TKkc,)
exten=> _9XXXXXXX.,26,Set(CDR(causecode)=${HANGUPCAUSE})
exten=> _9XXXXXXX.,27,NoOp(${DIALSTATUS} - ${HANGUPCAUSE})
exten=> _9XXXXXXX.,28,GotoIf($["${DIALSTATUS}" = "BUSY"]?35:29)
exten=> _9XXXXXXX.,29,GotoIf($["${DIALSTATUS}" = "CONGESTION"]?35:30)
exten=> _9XXXXXXX.,30,GotoIf($["${DIALSTATUS}" = "CHANUNAVAIL"]?33:31)
exten=> _9XXXXXXX.,31,GotoIf($["${DIALSTATUS}" = "CANCEL"]?33:32)
exten=> _9XXXXXXX.,32,Hangup()
exten=> _9XXXXXXX.,33,Playback(outofservice,)
exten=> _9XXXXXXX.,34,Goto(agentes,${EXTEN},32)
exten=> _9XXXXXXX.,35,Playback(busy,)
exten=> _9XXXXXXX.,36,Goto(agentes,${EXTEN},32)
exten=> _9XXXXXXX.,37,Set(dummy=${ODBC_Repo(INSERT INTO black_list_history(calldate\,src\,dst) VALUES (now()\,'${AGENT}'\,'${EXTEN}'))})
exten=> _9XXXXXXX.,38,Playback(DNCRaudio,)
exten=> _9XXXXXXX.,39,Goto(agentes,${EXTEN},32)
exten=> _9XXXXXXX.,40,GotoIf($["${SIP_HEADER(OUTGUID)}" = ""]?43:41)
exten=> _9XXXXXXX.,41,Set(__guid=${SIP_HEADER(OUTGUID)})
exten=> _9XXXXXXX.,42,Goto(agentes,${EXTEN},16)
exten=> _9XXXXXXX.,43,GUID(__guid)
exten=> _9XXXXXXX.,44,Goto(agentes,${EXTEN},16)
exten=> _9XXXXXXX.,45,Playback(pausaerror,)
exten=> _9XXXXXXX.,46,Hangup()
exten=> _9XXXXXXX.,47,GotoIf($[$["${SIP_HEADER(OUTQUEUE)}"= ""]|$["${SIP_HEADER(OUTQUEUE)}"= "null"]]?53:48)
exten=> _9XXXXXXX.,48,Set(__AGENT=${CHANNEL(accountcode)})
exten=> _9XXXXXXX.,49,Set(__DIALED=${EXTEN})
exten=> _9XXXXXXX.,50,Set(__OUTQUEUE=${SIP_HEADER(OUTQUEUE)})
exten=> _9XXXXXXX.,51,Set(CALLERID(num)=${SIP_HEADER(OUTDID)})
exten=> _9XXXXXXX.,52,Goto(agentes,${EXTEN},9)
exten=> _9XXXXXXX.,53,Set(HASH(Result)=${ODBC_Data(select did\,name\,dialstring from queues where name in (select queue_name from queue_members where membername =  '${CHANNEL(accountcode)}')  and direction = 'Outbound')})
exten=> _9XXXXXXX.,54,GotoIf($["${HASH(Result,name)}"= ""]?60:55)
exten=> _9XXXXXXX.,55,Set(__AGENT=${CHANNEL(accountcode)})
exten=> _9XXXXXXX.,56,Set(__DIALED=${EXTEN})
exten=> _9XXXXXXX.,57,Set(__OUTQUEUE=${HASH(Result,name)})
exten=> _9XXXXXXX.,58,Set(CALLERID(num)=${HASH(Result,did)})
exten=> _9XXXXXXX.,59,Goto(agentes,${EXTEN},9)
exten=> _9XXXXXXX.,60,Background(llamadasincola,,,)
exten=> _9XXXXXXX.,61,Hangup()
exten=> _9XXXXXXX.,62,Set(inter-var=${DB(${CALLERID(num)}/INTER)})
exten=> _9XXXXXXX.,63,GotoIf($["${inter-var}" = "TRUE"]?4:64)
exten=> _9XXXXXXX.,64,Playback(disabled-INTER,)
exten=> _9XXXXXXX.,65,Hangup()
  
 
exten=> h,1,Set(HASH(rates)=${ODBC_Data(select  rates.gateway\, rates.rate\, rates.cost\, rates.note FROM rates LEFT JOIN provider ON provider.name=rates.gateway WHERE provider.status = 'true' AND substring( '${EXTEN}'\, 1\, length( prefix_regexp ) ) REGEXP prefix_regexp ORDER BY length(prefix_regexp) DESC\,rates.rate ASC)})
exten=> h,2,Set(talkedminutes=${MATH(${CDR(billsec)} / 60,f)})
exten=> h,3,Set(talkedminutes=$[CEIL(${talkedminutes})])
exten=> h,4,Set(chargedbalance=${MATH(${talkedminutes} * ${HASH(rates,rate)},f)})
exten=> h,5,Set(realbalance=${MATH(${talkedminutes} * ${HASH(rates,cost)},f)})
exten=> h,6,Set(CDR(charged_balance)=${chargedbalance})
exten=> h,7,Set(CDR(real_balance)=${realbalance})
exten=> h,8,Set(CDR(note)=${HASH(rates,note)})
exten=> h,9,Set(CDR(carrier)=${HASH(rates,gateway)})
exten=> h,10,Set(CDR(userfield)=${userfield})
exten=> h,11,Set(CDR(direction)=outgoing)
exten=> h,12,Set(CDR(causecode)=${HANGUPCAUSE})
exten=> h,13,QueueUpdate(${OUTQUEUE},${UNIQUEID},${AGENT},${DIALSTATUS},${ANSWEREDTIME},${DIALEDTIME}|${DIALED}|${idLlamada})


When you create a campaign you define the Form or URL you want to display when you click in the Forms button in the agent for that campaigns.

Option 1:  uContact Form:  Name of the Form or  Name of the Form and | true (this to be able to close the Form Tab)

Example:  Codigos | true

                Codigos

Option 2: uContact URL:   URL and | name to show on the Tab or URL | name to show on the Tab  | true (this to be able to close the Form Tab)

Examples:   http://www.observador.com.uy | Observa

                 http://www.observador.com.uy | Observa | true

Inbound


Always set __Ani to be able to find calls in logs.

In SIP HEADER we set the CTI values this is persistent to all the call even when transfered if desired you can Remove the Header CTI.

Example


exten=> _XXXXXXXX,1,Set(HASH(queue)=${ODBC_Data(SELECT welcome\, schedule \, name \, form \, interactions FROM queues WHERE did= '${EXTEN}' AND direction = 'inbound')})
exten=> _XXXXXXXX,2,Set(CHANNEL(Language)=es)
exten=> _XXXXXXXX,3,Set(__Ani=${CALLERID(num)})
exten=> _XXXXXXXX,4,Set(CDR(campaign)=${HASH(queue,name)})
exten=> _XXXXXXXX,5,Answer(0)
exten=> _XXXXXXXX,6,Set(sound=${ODBC_Data(select sound from holidays WHERE day = '${STRFTIME(${EPOCH},,%d)}' AND month = '${STRFTIME(${EPOCH},,%m)}' AND (year = '${STRFTIME(${EPOCH},,%Y)}' OR year = '*') AND substring(timerange,1,5) <= '${STRFTIME(${EPOCH},,%R)}' AND substring(timerange,7) >= '${STRFTIME(${EPOCH},,%R)}' AND (campaign ='*' OR campaign ='${CDR(campaign)}'))})
exten=> _XXXXXXXX,7,GotoIf($["${sound}"=""]?11:8)
exten=> _XXXXXXXX,8,Playback(${sound},)
exten=> _XXXXXXXX,9,VoiceMail(1000@voicemail,)
exten=> _XXXXXXXX,10,Hangup()
exten=> _XXXXXXXX,11,Set(__DID=${EXTEN})
exten=> _XXXXXXXX,12,Set(__VirtualHold=${HASH(queue,interactions)})
exten=> _XXXXXXXX,13,Set(welcome=${HASH(queue,welcome)})
exten=> _XXXXXXXX,14,Set(Bienvenida=${CUT(welcome,\;,1)})
exten=> _XXXXXXXX,15,Set(FueraDeHora=${CUT(welcome,\;,2)})
exten=> _XXXXXXXX,16,Set(schedule=${HASH(queue,schedule)})
exten=> _XXXXXXXX,17,Set(cantidad=${FIELDQTY(schedule,&)})
exten=> _XXXXXXXX,18,Set(dentroDeHora=0)
exten=> _XXXXXXXX,19,While($[${cantidad} >0 && ${dentroDeHora} = 0])
exten=> _XXXXXXXX,20,Set(date=${CUT(schedule,\&,${cantidad})})
exten=> _XXXXXXXX,21,Set(hourrange=${CUT(date,\;,2)})
exten=> _XXXXXXXX,22,Set(dayrange=${CUT(date,\;,1)})
exten=> _XXXXXXXX,23,Set(cantidad=${MATH(${cantidad} - 1,i)})
exten=> _XXXXXXXX,24,GotoIfTime(${hourrange},${dayrange},,?,${EXTEN},42)
exten=> _XXXXXXXX,25,EndWhile()
exten=> _XXXXXXXX,26,GotoIf($[${dentroDeHora}=1]?29:27)
exten=> _XXXXXXXX,27,Playback(${FueraDeHora},)
exten=> _XXXXXXXX,28,Goto(entrantes,${EXTEN},9)
exten=> _XXXXXXXX,29,Playback(${Bienvenida},)
exten=> _XXXXXXXX,30,GUID(__guid)
exten=> _XXXXXXXX,31,Set(CDR(guid)=${guid})
exten=> _XXXXXXXX,32,Set(CDR(type)=record)
exten=> _XXXXXXXX,33,Set(MONITOR_FILENAME=${guid})
exten=> _XXXXXXXX,34,Set(CALLERID(name)=${HASH(queue,name)})
exten=> _XXXXXXXX,35,SipAddHeader(CTI: {"Guid": "${guid}" , "Screen": "FALSE" , "Form": "${HASH(queue,form)}" , "Campaign" : "${CDR(campaign)}" , "Callerid" : "${CALLERID(num)}" , "ParAndValues" : "par1=val1:par2=val2:par3=val3" , "Beep" : "FALSE" , "Answer" : "FALSE"})
exten=> _XXXXXXXX,36,SipAddHeader(VIDEO : ${SIP_HEADER(VIDEO)})
exten=> _XXXXXXXX,37,Queue(${CDR(campaign)},tTkKc,,,600,,,,,)
exten=> _XXXXXXXX,38,Read(__customerfeedback,feedback,2,,2,10)
exten=> _XXXXXXXX,39,GotoIf($["${customerfeedback}"=""]?41:40)
exten=> _XXXXXXXX,40,Set(customerfeedback=${ODBC_Repo(INSERT INTO customer_feedback(`datetime`\,agent\,campaign\,guid\,interaction\,qualification\,comment\,`from`) VALUES (NOW()\,'${CDR(accountcode)}'\,'${CDR(campaign)}'\,'${guid}'\,'call'\,'${customerfeedback}'\,''\,'${CALLERID(num)}'))})
exten=> _XXXXXXXX,41,Hangup()
exten=> _XXXXXXXX,42,Set(dentroDeHora=1)
exten=> _XXXXXXXX,43,Goto(entrantes,${EXTEN},25)
 
exten=> h,1,Set(CHANNEL(accountcode)=${MEMBERNAME})
exten=> h,2,Set(CDR(userfield)=${userfield})
exten=> h,3,Set(CDR(direction)=incoming)
exten=> h,4,Set(CDR(causecode)=${HANGUPCAUSE})
exten=> h,5,NoOp()
exten=> h,6,GotoIf($["${customerfeedback}"=""]?8:7)
exten=> h,7,Set(dummy=${ODBC_Repo(UPDATE customer_feedback set agent = '${CDR(accountcode)}' WHERE guid = '${guid}')})
exten=> h,8,GotoIf($["${ABANDONED}" == "TRUE" & "${VirtualHold}" == "VirtualHold" ]?10:9)
exten=> h,9,Hangup()
exten=> h,10,VirtualHold(Local/${CDR(campaign)}@virtualhold/n,${UNIQUEID},virtualhold,${Ani},1,${CDR(campaign)},)
exten=> h,11,Goto(entrantes,${EXTEN},9)

For hardphones auto answer set SIP Header: P-Auto-Answer: normal

SIPAddHeader set the Form or URL to PopUp in an incoming call .

Option 1:  uContact Form:   Name of the Form or   Name of the Form | true (this to be able to close the Tab)

Example:  Codigos

                Codigos | true


exten=> _XXXXXXXX,34,SipAddHeader(CTI: {"Guid": "${guid}" , "Screen": "FALSE" , "Form": "Codigos" , "Campaign" : "${CDR(campaign)}" , "Callerid" : "${CALLERID(num)}" , "ParAndValues" : "par1=val1-par2=val2-par3=val3" , "Beep" : "TRUE" , "Answer" : "FALSE"})
  
exten=> _XXXXXXXX,34,SipAddHeader(CTI: {"Guid": "${guid}" , "Screen": "FALSE" , "Form": "Codigos | true" , "Campaign" : "${CDR(campaign)}""Entrada" , "Callerid" : "${CALLERID(num)}" , "ParAndValues" : "par1=val1-par2=val2-par3=val3" , "Beep" : "TRUE" , "Answer" : "FALSE"})


Option 2: uContact URL:   URL and | name to show on the Tab or URL | name to show on the Tab  | true (this to be able to close the Form Tab) (you can also concat variables on the URL example ${CALLERID(num)})

Examples:   http://www.observador.com.uy | Observa

                 http://www.observador.com.uy | Observa | true

          http://www.observador.com.uy/phone=${CALLERID(num)} | Observa | true


exten=> _XXXXXXXX,34,SipAddHeader(CTI: {"Guid": "${guid}" , "Screen": "FALSE" , "Form": " http://www.observador.com.uy | Observa" , "Campaign" : "${CDR(campaign)}" , "Callerid" : "${CALLERID(num)}" , "ParAndValues" : "par1=val1-par2=val2-par3=val3" , "Beep" : "TRUE" , "Answer" : "FALSE"})
  
exten=> _XXXXXXXX,34,SipAddHeader(CTI: {"Guid": "${guid}" , "Screen": "FALSE" , "Form": " http://www.observador.com.uy | Observa | true" , "Campaign" : "${CDR(campaign)}" , "Callerid" : "${CALLERID(num)}" , "ParAndValues" : "par1=val1-par2=val2-par3=val3" , "Beep" : "TRUE" , "Answer" : "FALSE"})
  
exten=> _XXXXXXXX,34,SipAddHeader(CTI: {"Guid": "${guid}" , "Screen": "FALSE" , "Form": " http://www.observador.com.uy/phone=${CALLERID(num)} | Observa | true" , "Campaign" : "${CDR(campaign)}"" , "Callerid" : "${CALLERID(num)}" , "ParAndValues" : "par1=val1-par2=val2-par3=val3" , "Beep" : "TRUE" , "Answer" : "FALSE"})


Advanced


Go first to an agent

  • Set penalization same as the phone number for each agent on that campaign.

  • Set strategy wrandom.

  • On the workflow set the following variables with the same number of the phone for the agent you want to go first. Set a Queue Rule on the Queue Activity name that is between  [] in  queuerules.conf.


QUEUE_MIN_PENALTY y QUEUE_MAX_PENALTY 


  •  /etc/asterisk/queuerules.conf  add rule so the call is not always waiting for that agent and can move on the queue.
[rule]
penaltychange => 30,+1000,-1000


Means: 

After 30 seconds,adjust QUEUE_MAX_PENALTY with +1000 and QUEUE_MIN_PENALTY with - 1000, so the call can jump with other penalization.
 

Example


exten=> _XXXXXX,1,Set(VOLUME(TX)=2)
exten=> _XXXXXX,2,Set(VOLUME(RX)=2)
exten=> _XXXXXX,3,Set(CHANNEL(Language)=es)
exten=> _XXXXXX,4,Set(__Ani=${CALLERID(num)})
exten=> _XXXXXX,5,Set(CDR(campaign)=CobrosG10->)
exten=> _XXXXXX,6,Answer(0)
exten=> _XXXXXX,7,Read(extension,MenuOpciones,4,,2,5)
exten=> _XXXXXX,8,Set(QUEUE_MAX_PENALTY=${extension:0:4})
exten=> _XXXXXX,9,Set(QUEUE_MIN_PENALTY=${extension:0:4})
exten=> _XXXXXX,10,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes)
exten=> _XXXXXX,11,GotoIfTime(08:00-23:00,mon-fri,,?,${EXTEN},19)
exten=> _XXXXXX,12,GotoIfTime(08:00-12:00,sat-sat,,?,${EXTEN},16)
exten=> _XXXXXX,13,Playback(exceltecFuerahorario,)
exten=> _XXXXXX,14,VoiceMail(1000@voicemail,)
exten=> _XXXXXX,15,Hangup()
exten=> _XXXXXX,16,Set(CALLERID(num)=40322386)
exten=> _XXXXXX,17,Dial(SIP/tigo/25872587,60,tT,)
exten=> _XXXXXX,18,Hangup()
exten=> _XXXXXX,19,GUID(__guid)
exten=> _XXXXXX,20,Set(__idLlamada=${guid})
exten=> _XXXXXX,21,Set(CDR(guid)=${guid})
exten=> _XXXXXX,22,Set(CDR(type)=record)
exten=> _XXXXXX,23,Set(MONITOR_FILENAME=${guid})
exten=> _XXXXXX,24,Set(CALLERID(name)=Ventas_Inbbd_2)
exten=> _XXXXXX,25,Queue(Ventas_Inbbd_2<-,tTkK,,,400,,CTI,,regla,)
exten=> _XXXXXX,26,Hangup()



  • No labels