b. Acciones API
Para poder brindar la funcionalidad de proxy y permitir la comunicación entre ventanas de diferentes dominios usamos Porthole.js https://github.com/ternarylabs/porthole
Los ejemplos que se muestran usan la librería alojada en un CDN. También es posible descargar esta dependencia y usarla localmente
Realizar Llamada
Call
URL Relativa: Integra/resources/Agents/AgentCall
Método: POST content-type:application/x-www-form-urlencoded; charset=UTF-8
Parámetros: callerid (Número con que va a salir la llamada)
agent (Nombre del agente que genera la llamda)
phone (Número de teléfono del agente)
tech (Usualmente SIP)
context (Contexto del agente configurado en uContact)
outqueue (Nombre de la campaña que se computara la llamada)
destination (Número destino)
Resultado: TEXTO (Guid de la llamda generado)
0 Error
Es una llamada en 2 pasos se llama al agente y cuando Atiende o Auto-atiende se genera la llamada final.
via Proxy
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/porthole/1.0.0/porthole.js"></script> <script type="text/javascript"> function Call () { var windowProxy; windowProxy.addEventListener(onResponse); windowProxy = new Porthole.WindowProxy(window.location.protocol + window.location.hostname); windowProxy.post({'action': 'call', 'campaign' : '<CAMPAIGN>', 'callerid' : '<CALLERID>', 'destination' : '<NUMBER>'}); } function onResponse(messageEvent) { response = messageEvent.data.guid; //retorna id único de llamada } </script>
Realizar Llamada pasando Datos al Workflow
Call
URL Relativa: Integra/resources/Agents/AgentCallwithData
Método: POST content-type:application/x-www-form-urlencoded; charset=UTF-8
Parámetros: callerid (Número con que va a salir la llamada)
agent (Nombre del agente que genera la llamda)
phone (Número de teléfono del agente)
tech (Usualmente SIP)
context (Contexto del agente configurado en uContact)
outqueue (Nombre de la campaña que se computara la llamada)
destination (Número destino)
data (datos para enviar al workflow, habitualmente un JSON que se puede pasar a variables con la actividad JSON dentro del flujo)
form (Nombre de Form o URL para Popup)
Resultado: TEXTO (Guid de la llamda generado)
0 Error
Es una llamada en 2 pasos se llama al agente y cuando Atiende o Auto-atiende se genera la llamada final.
Realizar llamada directamente desde el teléfono
Esta función permite realizar llamadas pero se diferencia de la anterior porque utiliza el telefono ya inicializado del portal. La única manera de realizarlo es via proxy dado que la comunicación es directamente con el portal de uContact
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/porthole/1.0.0/porthole.js"></script> <script> function call(){ var windowProxy; windowProxy = new Porthole.WindowProxy(window.location.protocol + '//' + window.location.hostname); windowProxy.addEventListener(onResponse); windowProxy.post({ action: 'callWithPhone', destination: '091000000', campaign: 'Sale->' }); } function onResponse(messageEvent) { var response = messageEvent.data.guid; alert(response); } </script>
Cortar Llamada
Call
URL Relativa: Integra/resources/Agents/HangupPhone
Método: POST content-type:application/x-www-form-urlencoded; charset=UTF-8
Parámetros: phone (Número de teléfono del agente)
Resultado: 1 Llamada cortada correctamente
0 Error
via Proxy
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/porthole/1.0.0/porthole.js"></script> <script type="text/javascript"> //Ejemplo en click de cerrar el Tab function Hangup () { var windowProxy; windowProxy = new Porthole.WindowProxy(window.location.protocol + window.location.hostname); windowProxy.post({'action': 'hangup'}); } </script>
Notificar Agente o Agentes
Call
Relative URL: Integra/resources/api/Notificate
Method: POST content-type:application/x-www-form-urlencoded; charset=UTF-8
Params: agent (nombre agente)
queue (nombre campaña)
message (mensaje a mostrar al agente)
icon (nombre de ícono de fontaswome ejemplo: fa fa-exclamation-triangle)
when (always-> siempre notificar aunque no este conectado, le mostrara las notificaciones al conectarse o online solo notificar si conectado)
Result: OK -> if pudo notificar
ERROR -> if no fue notificado
Enviar SMS
SMS
URL Relativa: Integra/resources/SMS/SendSMS
Método: POST content-type:application/x-www-form-urlencoded; charset=UTF-8
Parámetros: destination (Número destino para sms)
message (Mensaje de texto)
campaign (Campaña)
agent (Agente que lo enviía)
source (Callerid o Puerto)
Result: TEXTO OK
ERROR
via Proxy
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/porthole/1.0.0/porthole.js"></script> <script type="text/javascript"> function SMS () { var windowProxy; windowProxy = new Porthole.WindowProxy(window.location.protocol + window.location.hostname); windowProxy.post({'action': 'sms', 'campaign' : '<CAMPAIGN>', 'message' : '<MESSAGE>', 'destination' : '<NUMBER>'}); } </script>
Recibir SMS
SMS
URL Relativa: Integra/resources/InboundSMS/ReceiveURLSMS
Método: GET content-type:application/x-www-form-urlencoded; charset=UTF-8
Parámetros: phone (Número origen del sms)
message (Mensaje de texto)
Result: TEXTO OK
ERROR
Marcar Grabación (Tag)
Tag
URL Relativa: Integra/resources/Agents/TagRecord
Método: POST content-type:application/x-www-form-urlencoded; charset=UTF-8
Parámetros: phone (Número destino)
guid (Identificador único)
data (Texto de marcado )
Result: Vacío, es asincrónico
via Proxy
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/porthole/1.0.0/porthole.js"></script> <script type="text/javascript"> //Ejemplo en click de cerrar el Tab function Hangup () { var windowProxy; windowProxy = new Porthole.WindowProxy(window.location.protocol + window.location.hostname); windowProxy.post({'action': 'tag', 'guid' : '<GUID>', 'message' : '<MESSAGE>'}); } </script>
Generar Reporte
Report
URL Relativa: Integra/resources/BI/generatereport
Método: POST content-type:application/x-www-form-urlencoded; charset=UTF-8
Parámetros: report (Objecto JSON)
html (0 o 1)
excel (0 o 1 o 2 para csv)
pdf (0 o 1)
doc (0 o 1 o 2 para txt)
Resultado: GUID del reporte generado
Vacío en Error, es asincrónico
{"name":"Breaks Totales", //Nombre del reporte "file":"TiemposPausaBreakePorAgente.jrxml", // Archivo jrxml "description":"Breaks Totales", //Descripción "dsn":"Repo", // Origen de datos "parameters":"INITIAL_DATE=Timestamp=2015-11-03 00:00:00;FINAL_DATE=Timestamp=2015-11-03 3:59:59;REPORT_LOCALE=Locale=es;AGENT=Agent='Admin',,'Agente1','Agente10','Agente11',", //Parametros tipos y valores para generarlo. "grouped":"Agentes", //Grupo "language":"es", //Lenguaje "license":"CCS"}
http://Server/tmp/69d1f895-7f5f-42d6-9d84-dd7dad559304.pdf O la extensión generada xlsx, docx, txt, csv, html
Cerrar Form
Desde un Form de uContact
parent.closeActiveTab();
Desde un iFrame Cross Origin
Para utilizar esta funcionalidad desde un IFrame en un origen diferente a uContact es necesario establecer un proxy de comunicación entre ambos. Para eso utilizamos Porthole. Definimos un proxy en cada iFrame que se abre con un procesador de mensajes, luego desde el iframe se puede enviar la action close para que cierre el Tab Actual.
En el iframe Agregar
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/porthole/1.0.0/porthole.js"></script> <script type="text/javascript"> //Ejemplo en click de cerrar el Tab function CloseTab () { var windowProxy; windowProxy = new Porthole.WindowProxy(window.location.protocol + window.location.hostname); windowProxy.post({'action': 'close'}); } </script>
Marcadores
CTI
Este JSON es encontrado en el LocalStorage y encriptado, tiene la información de la llamada que fue atendida y la información del registro del marcador si corresponde para Respool.
Dialer: Campaña, Num principal, status(siempre 1), data (parametros y valores que pasan al workflow), alternatives (separados por :), retries (reintentos que va haciendo ese numero), contact (id contacto), dialebase, prioridad, agentphone
Estos datos hay que convertirlos al objetoRespool que se muestra mas abajo.
Que podemos realizar con Objeto Respool:
- Cambiar telefono principal por alternativos y reordenar a gusto
- Cambiar cantidad de reintentos para ese numero (ejemplo si pongo un alternativo como principal poner el 0)
- Cambiar prioridades
- Agregar datos para el workflow o cambiarlos
- agentphone, si es Progressive asignar a otro agente
- NO CAMBIAR: campaña, status, contact, dialerbase: Puede ocacionar errores en el marcador.
via Proxy
Definir en su pagina
windowProxy = new Porthole.WindowProxy('<URL PADRE>'); windowProxy.addEventListener(onMessage); windowProxy.post({'action': 'CTI'}); function onMessage(messageEvent) { CTI = messageEvent.data.CTI; }
RESPOOL LLAMADA
Respool
URL Relativa: Integra/resources/Dialers/Respool
Método: POST content-type:application/x-www-form-urlencoded; charset=UTF-8
Parámetros: callspool (Objeto JSON)
Resultado: 1
{ "campaign": "Ventas->", //Nombre campaña "destination": "098344484", //Número destino "dialerbase": "basetest", //Nombre lista del discador "status": 1, // 1 registro habilitado a ser marcado "data": "Par1=Val1:Par2=Val2", // Parametros para flujos y formularios "alternatives": "098124484", // Números alternativos separados con : "contact": 222, // Id contacto "retries": 0, // 0 ya que comenzamos a marcar un nuevo número "priority": 9999, // Prioridad del registro no usar 1 ya que es para agendados, usar > 1 "agentphone": "1001" // Para marcadores Progresivos }
via Proxy
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/porthole/1.0.0/porthole.js"></script> <script type="text/javascript"> function Respool () { var windowProxy; windowProxy = new Porthole.WindowProxy(window.location.protocol + window.location.hostname); windowProxy.post({'action': 'respool', 'objetoRespool' : <Objeto Respool>}); } </script>
AGENDAR LLAMADA
Schedule Call
URL Relativa: Integra/resources/Dialers/ScheduleDialerCall
Método: POST content-type:application/x-www-form-urlencoded; charset=UTF-8
Parámetros: callschedule (Objeto JSON)
Resultado: 1 OK
0 ERROR
{ "calldate" : "2015-10-11 15:00:00", //Fecha a ser ejecutada "campaign" : "Ventas->", //Campaña de marcador "destination" : "098344484", //Destino de la llamada "alternatives" : "099124484:099121212", //Números alternativos "agentphone" : "1001", //Número de agente si Progresivo "data" : "Par1=Val1:Par2=Val2" //Valores para Flujos y Formularios }
El marcador debe estar en fecha y habilitado para poder procesar llamadas, de lo contrario una vez vuelva a estar activo son las primeras en salir.
via Proxy
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/porthole/1.0.0/porthole.js"></script> <script type="text/javascript"> function Schedule () { var windowProxy; windowProxy = new Porthole.WindowProxy(window.location.protocol + window.location.hostname); windowProxy.post({'action': 'schedule', 'callDate' : '<2016-10-10 15:00:00>', 'objectDialer' : <Objecto Respool> }); } </script>
SUBIR BASE DE LLAMADAS
Upload Dialer Calls
URL Relativa: Integra/resources/Dialers/uploadbase
Método: POST content-type:application/x-www-form-urlencoded; charset=UTF-8
Parámetros: filename (Nombre archivo)
fileb64 (Contenido del archivo en base64)
campaign (Nombre campaña)
cant (Cantidad de registros)
username (Usuario que sube la base)
Resultado: 1 (Async Method)
prueba1;098344484;var1=val1:var2=val2;099124484:099111111;9999;1001 campaña;númeroprincipal;parametros para formularios y flujo;alternativos separados por :; prioridad (optional);teléfono agente (optional)
Tareas Marcadores
Si se especifica fecha, la tarea se ejecutara mismo en esa fecha agendada, en caso de que la fecha se especifique como nula, la tarea se ejecutara cuando no haya tareas agendadas y se encuentre libre. La prioridad de la tarea con fecha especifica sera mayor a la prioridad de la tarea agendada con fecha nula.
Dialer Task
URL Relativa: Integra/resources/Dialers/DialerTask
Método: POST content-type: application/x-www-form-urlencoded
Parámetros: call (Objeto JSON)
Resultado: 1 OK
0 ERROR
Ejemplos para cada modo:
Agregar marcador con prioridad X (Lista creada una por una. Teléfonos alternativos por separado)
Dialer, Priority X
{"calldate" : null,
"campaign" : "nombreCampaña<-",
"destination": "12-345-678",
"alternatives": "",
"agent" : "",
"data": "idcustomer=7",
"source": "source",
"bulk": true,
"automatic": false }Agregar marcador con prioridad alta (Fecha de llamada es AHORA)
Dialer, Priority High
{"calldate" : null,
"campaign" : "nombreCampaña<-",
"destination": "12-345-678",
"alternatives": "",
"agent" : "",
"data": "idcustomer=7",
"source": "source",
"bulk" : false,
"automatic" : true }Agregar llamada agendada para cualquier momento (Fecha de llamada sera una fecha especifica en el futuro)
Dialer, Any Time
{"calldate" : "2018-01-01 00:00:00",
"campaign" : "nombreCampaña<-",
"destination": "12-345-678",
"alternatives": "",
"agent" : "",
"data": "idcustomer=7",
"source": "source",
"bulk" : false,
"automatic" : false }Agregar llamada para un agente en especifico
Dialer, Specific Agent
//Uso el nombre de usuario para ese Agente:
{"calldate" : null,
"campaign" : "nombreCampaña->",
"destination": "12-345-678",
"alternatives": "",
"agent" : "Agente1",
"data": "idcustomer=7",
"source": "source",
"bulk" : false,
"automatic" : false }
//Uso el numero asignado para ese Agente:
{"calldate" : null,
"campaign" : "nombreCampaña->",
"destination": "12-345-678",
"alternatives": "",
"agent" : "1001",
"data": "idcustomer=7",
"source": "source",
"bulk" : false,
"automatic" : false }
AGENDAR SMS
Schedule SMS
URL Relativa: Integra/resources/SMS/ScheduleDialerSMS
Método: POST content-type:application/x-www-form-urlencoded; charset=UTF-8
Parámetros: sms (JSON Object)
Resultado: 1
{ "calldate" : "2015-10-11 15:00:00", // Fecha del sms a enviar "campaign" : "Ventas->", // Campaña marcador "destination" : "098344484", // Destino sms "data" : "Mensaje" // Texto sms }
El marcador debe estar en fecha y habilitado para poder procesar llamadas, de lo contrario una vez vuelva a estar activo son los primeros en salir.
Subir base SMS
Upload Dialer Calls
URL Relativa: Integra/resources/SMS/uploadbase
Método: POST content-type:application/x-www-form-urlencoded; charset=UTF-8
Parámetros: filename (Nombre archivo)
fileb64 (Contenido del archivo en base64)
campaign (Nombre de la campaña)
Resultado: 1 (Asincrónico)
prueba1;098344484;Hola Mundo!;9999 campaña;número;texto;prioridad
Subir base Emails
Upload
URL Relativa: IntegraChannels/resources/DialersResources/uploadMultiChannelBlacklist
Método: POST content-type:application/x-www-form-urlencoded; charset=UTF-8
Parámetros: filename (Nombre archivo)
fileb64 (Contenido del archivo csv en base64)
channel 'email' (el valor de este parametro siempre será el mismo)
user nombre de usuario
Resultado: 1 (Asincrónico)
NombreCampana;ejemplo@gmail.com;Este es un mensaje de ejemplo;;"Var1":"value","Var2":"value";9999
WEBCALLBACK
Para que el WebCallBack sea posible de integrar con cualquier web de cualquier cliente, fue diseñado con un GET sobre HTTP, de esta forma cualquiera puede invocarlo.
Upload Dialer Calls
URL: http://IP:PUERTO/Integra/resources/Utils/CallBack/phone={phone}&tecnology={tecnology}&context={context}&destination={destination}&priority={priority}
Método: GET content-type:application/x-www-form-urlencoded; charset=UTF-8
Parametros:
Cambiar los valores entre {} por el valor que corresponda.
- phone: Teléfono del cliente
- tecnology: tecnología por donde se marca (ejemplo: DAHDI/G1/ o SIP/CARRIER/)
- context: contexto en donde entra la llamada una vez la atiende el cliente (de ahí selecciona la exten "destination")
- destination: exten destino en el dialplan (habitualmente un DNIS de una campaña que va a una Cola)
- prioridad: prioridad de entrada en el contexto en esa extension (siempre entrar luego de CDR(type)=record para que no pise el type webcallback)
Resultado: 1 (Asincrónico)
BORRAR CONTACTO DE DIALER
Relative URL: Integra/resources/Dialers/RemoveContact
Method: POST
content-type:application/x-www-form-urlencoded; charset=UTF-8
Params: campaign (Nombre de la campaña)
number (Número a borrar)
Result: 1
BORRAR SCHEDULE DEL MARCADOR
Borra llamada agenda del dialer, parametros campaña, el número, y fecha desde y fecha hasta formato (YYYY-MM-DD HH:mm:ss) para poder borrar por fecha
Relative URL: Integra/resources/Dialers/RemoveScheduleDialerCall
Method: POST
content-type:application/x-www-form-urlencoded; charset=UTF-8
Params: campaign (Nombre de la campaña)
destination (número a borrar)
from (Fecha desde a borrar)
to (Fecha hasta a borrar)
Result: 1
Agregar a BlackList
Agrega un numero a la black list, puede ser por campaña o usar * en campaign para todas
Relative URL: Integra/resources/admin/addblack
Method: POST
content-type:application/x-www-form-urlencoded; charset=UTF-8
Params: black (JSON Object)
{ "phone": "número de telefono", "campaign":"Campaña", "username": "usuario que ingreso el dato", "company": "Dato Cliente", "job_title": "Dato Cliente","name": "Nombre"}
Ejecución externa Workflow
Permite ejecutar un web service que hace un llamada a un workflow de la telefonía permitiendo ejecutar acciones dentro del flujo
Relative URL: Integra/resources/admin/CallWorkflow
Method: POST
content-type:application/x-www-form-urlencoded; charset=UTF-8
Params: context (contexto de entrada de flujo)
extension (extension de entrada al flujo)
jsonparams (JSON Object)
"{"Dato1":"xxxxx","Dato2":"yyyyy"}"
TIPIFICAR LLAMADA
Tipifica la llamada ejecutando la acción correspondiente al Marcador (RESPOOL, RESPOOLALTERNATIVE, BLACKLIST, SCHEDULE), debe estar configuradas las tipifiaciones en el sistema para que puedan funcionar.
Relative URL: Integra/resources/api/DispositionCall
Method: POST
content-type:application/x-www-form-urlencoded; charset=UTF-8
Params: campaign (Nombre de la campaña obligatorio)
agent (nombre agente obligatorio)
callerid (número telefono cliente)
guid (id de la llamada)
l1 (nivel 1 tipificación)
l2 (nivel 2 tipificación)
l3 (nivel 3 tipificación)
d1 (dato extra a guardar)
d
2 (dato extra a guardar
)
comment (comentario)
schedule (si hay una fecha (formato ejemplo 2019-02-26 13:45:00) y la accion del marcador es RESCHEDULE agenda una llamada a ese número )
Result: 1
RESPONSES:
200 OK:
Retorna json que contiene:
Result: ok, txtcode: txtcode
400 ERROR:
Campos obligatorios:
Campana:
- Wrong parameters: Empty campaign.
Callerid:
- Wrong parameters: Empty callerid
Guid:
- Wrong parameters: Empty guid
Agente:
- Wrong parameters: Empty agent
Nivel 1 de tipificación:
- Wrong parameters: Empty value1
La combinación de campana, nivel1, nivel2, nivel3 no corresponde con una tipificación creada.
Disposition not found for level1: " + l1 + ", level2: " + l2 + " level3: " + l3
En caso de acción de reagenda:
- The schedule date format is not well formed: El formato de la fecha tiene que ser yyyy-MM-dd HH:mm:ss
- Wrong parameters: Empty schedule date.