/
b. Acciones API

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

JSON Object
{"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"}
Report URL
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

JSON Object
{
  "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

 

JSON Object
 {
  "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)

File Format
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:

  1. 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 }
  2. 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 }
  3. 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 }
  4. 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

JSON Object
{
  "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)

File Format
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)

File Format
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)
Result:  1
black 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)
Result:  OK
jsonparams 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)
            d2            (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.