Table of Contents |
---|
...
Podemos ver las variables que se ejecutan y como se toman en cuenta las que llegan, dependiendo del modo en el que se ejecute el agente.
...
El QueueUpdate en el Hangup es fundamenta por temas de estadísticas de campañas salientes.
En Hangup tambien también agregar Set(CDR(userfield)=${userfield}) para marcar la grabación grabación.
Es posible ejecutar en el Dial un Macro para enviar datos al cliente una vez la llamada es atendida.
...
En la creación de campañas se define el Form o la URL que hay que desplegar al hacer clic en el botón de formularios para determinada campañade esta.
Opción 1: uContact Form: Solo nombre del Form form, Nombre del Form form y | true (esto para desplegar la cruz del form y poder cerrarlo).
Ejemplos: Codigos Códigos | true
CodigosCódigos
Opcion 2: uContact URL: URL bien formada y | nombre a mostrar en Tab o URL bien formada | nombre del tab | true (esto para desplegar la cruz del form y poder cerrarlo)
Ejemplos: http://www.observador.com.uy | Observa
http://www.observador.com.uy | Observa | true
...
Entrantes
Podemos ver el workflow de ejecución.
Es importante usar fundamental utilizar __Ani para poder buscar en Logs.
Ya no usamos mas empleamos más MACRO para pasar datos de CTI, sino SIP HEADER, esta . Esta se persiste durante toda la llamada lo cual debería , si es una transferencia tambien también debería pasar los datos, también es posible eliminar el HEADER.
...
Code Block | ||
---|---|---|
| ||
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) |
Info |
---|
Si se quiere autoanswer |
para hardphones, setear el SIP Header: P-Auto-Answer: normal. |
En El el SIPAddHeader setear que Form form o la URL que hay que desplegar al entrar una llamada.
Opción 1: uContact Form: Solo Solo nombre del Form, Nombre del Form y | true (esto para desplegar la cruz del form y poder cerrarlo).
Ejemplos: Codigos Códigos
Codigos Códigos | true
Code Block | ||
---|---|---|
| ||
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)}" , "Callerid" : "${CALLERID(num)}" , "ParAndValues" : "par1=val1-par2=val2-par3=val3" , "Beep" : "TRUE" , "Answer" : "FALSE"}) |
Opcion 2: uContact URL: URL bien formada y | nombre a mostrar en Tab tab o URL bien formada | nombre del tab | true (esto para desplegar la cruz del form y poder cerrarlo).
Ejemplos: http://www.observador.com.uy | Observa
http://www.observador.com.uy | Observa | true
Code Block | ||
---|---|---|
| ||
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"}) |
...
Avanzadas
Ir primero a un agente
Setear en los agentes diferentes números de penalización . (numero número de teléfono del agente).
Setear en la campaña la estrategia wrandom.
En el Workflow workflow setear las variables con el mismo número (el de la penalización del agente por el que se quiere comenzar), y en el workflow en la actividad de Queue campaña setear la regla que se quiera o sea la que esta está entre [] en el archivo queuerules.conf conf.
Code Block language delphi QUEUE_MIN_PENALTY y QUEUE_MAX_PENALTY
En /etc/asterisk/queuerules.conf agregar una regla que después de X tiempo si no lo pudo contactar comience a saltar por los agentes disponibles.
Code Block | ||
---|---|---|
| ||
[regla] penaltychange => 30,+1000,-1000 |
...
Code Block |
---|
Después de 30 segundos, ajustar las variables QUEUE_MAX_PENALTY en +1000 y ajustar QUEUE_MIN_PENALTY en - 1000. |
Code Block |
---|
estoEsto hace que luego de este tiempo ya salte entre otros agentes. |
...