Salesforce V 3.0.0

Integración SALESFORCE - NEOTEL

El presente documento tiene como finalidad acercar al cliente el diseño, alcance y funcionamiento de la integración desarrollada por Neotel.

Alcance Neotel

Desde el lado de Neotel proporcionamos, proyecto mediante, el conector para la integración con SalesForce, instalando el mismo en el servidor de aplicaciones donde el cliente posee la solución de Neotel, colaboramos con la configuración del puerto 443 (necesario para el cifrado HTTPS) y le brindamos al cliente el detalle de la configuración necesaria tanto en SalesForce como en Neotel para el correcto funcionamiento de la integración.

Las configuraciones necesarias del lado de SalesForce para que la integración sea efectiva quedarán a cargo del cliente sin excepción y Neotel no dará soporte sobre las mismas.

En ningún caso Neotel se responsabiliza por cualquier multa o daño que el cliente pudiera sufrir por la indebida gestión y control de la herramienta.

 

Funcionamiento General

En el siguiente diagrama se pueden observar las relaciones entre todas las partes involucradas en la integración:

 

Consideraciones importantes para tener en cuenta:

 

El usuario debe tener acceso a Internet para conectarse a SalesForce.

Para el uso de telefonía, basta con tener acceso a la red donde están los servidores de Neotel.

El servidor de aplicación de Neotel debe contar con certificado HTTPS y tener acceso a Internet para poder comunicarse con SalesForce.

SalesForce dispone de un listado de IPs que deben estar habilitadas para conexión. Para conocerlas, siga el siguiente enlace: https://help.salesforce.com/articleView?id=000321501&type=1&mode=1 .

 

Funcionamiento Interno del Conector

 

Gestionando con SalesForce

Login

 

Al clickear sobre él, se desplegará mostrando la siguiente pantalla de login:

El usuario deberá loguearse también con un usuario de Neotel a la plataforma de telefonía.

Para loguearse se requieren 3 datos: DISPOSITIVO, USUARIO y PASSWORD. Estos serán los mismos con los que se configurará el softphone para comunicaciones (X-Lite en la imagen de ejemplo).

De esta manera, ya tendremos entrelazado el usuario de telefonía con el de CRM.

Pantalla de SalesForce -GENERAL-


Conector

Look


Funcionalidades

REALIZAR / FINALIZAR UN LLAMADO

 

El CONECTOR integrado en SalesForce da la posibilidad de REALIZAR UN LLAMADO a un número especifico y de FINALIZAR el mismo en caso de ser necesario.

Si el usuario esta en una transferencia atendida podrá cortarla y seguir con el llamado sin esperar el corte desde el otro lado de la línea.


DISCADO MANUAL

También se pueden realizar llamados manuales discando el número al cual se desea llamar directamente desde el CONECTOR.

 

 

Clickeando sobre el icono KEYBOARD, se habilita el input para ingresar el número a llamar.

 

 

Los llamados manuales dejan registro en el campo Description del objeto Task de SalesForce siempre y cuando este se encuentre habilitado para ser utilizado.

Ver apartado CENTRO DE LLAMADAS.


DTMF

Mientras el llamado este en curso, se habilita el envío de DTMF, ingresando los dígitos en el input, 0 a n dígitos y luego clickeando el botón DTMF, los mismos serán enviados uno por uno. La candidad de veces que sea necesario o deseado durante el llamado.


AGENDAMIENTO

Adicionalmente, el CONECTOR permite la posibilidad de AGENDAR un llamado para que sea discado por Neotel más adelante.

Al presionar sobre el botón AGENDAR, se produce el siguiente cambio en la pantalla del conector:

Clickeando sobre el icono CALENDARIO, se despliega el mismo pudiendo seleccionar fecha y hora de la agenda:

 


CONFIGURACIÓN

Clickeando sobre el icono de CONFIGURACIÓN, se abre la ventana de las posibles configuraciones para el usuario:

 

Se puede configurar ANCHO Y ALTO del conector, la opción de MINIMIZARLO AUTOMÁTICAMENTE cuando al caer un llamado/dato desde Neotel no se encuentra ninguna coincidencia y se abre la ventana de nuevo registro, o bien si se encontraron múltiples coincidencias y se abre la ventana de búsqueda.

 


INFORMACIÓN

Clickeando sobre el icono de INFORMACIÓN, se abre la ventana con información relacionada a la llamada y al contacto:

 

Dato

Descripción

Dato

Descripción

Indentificador de última llamada

Este dato solo estará presente mientras este el llamado en curso. Un vez finalizado el mismo, pasará a valor 0 (cero), por mas que el contacto siga en pantalla. Esto es así porque el mismo contacto podría tener mas de 1 llamado por gestión.

Indentificador de contacto

Id del contacto en la base de datos del CRM de Neotel

Identificador de base de datos

Id de la base de datos del CRM de Neotel a la cual pertenece el contacto.

Identificador de CRM

Id del CRM de Neotel al que pertenece el contacto.

Clave de búsqueda

Clave por la cual se ha realizado la búsqueda dentro de Salesfroce.


TRANSFERENCIAS

A teléfonos externos:

Por cada llamado que caiga al conector, se listaran los teléfonos de TRANSFERENCIA configurados en la campaña de telefonía ( Callcenter → Campañas → Telefonía) además de dar la opción de realizar un input manual.

Al seleccionar un numero de transferencia:

o ingresar un numero:

A un usuario:

Al seleccionar un usuario:

A una cola:

Al seleccionar una cola:

A otra campaña:

Al seleccionar una campaña:

Opciones de transferencias:

Transferencia directa:

El operador transfiere el llamado directamente al otro extremo y termina la comunicación.

 

Transferencia atendida:

El operador transfiere el llamado, pero la comunicación no se corta, sino que debe ser atendida por el otro extremo.

Fin de transferencia:

En una transferencia atendida, el operador tiene la opcion de cortar la comunicación y volver al llamado original.

 


Funciones de telefonía

Monitoreo de usuarios

Lista los usuarios disponibles en la plataforma para realizar un monitoreo (escucha) o asistencia de usuarios.

Seleccionar el usuarios y luego el tipo de monitoreo

Escuchar: Se podrá escuchar las conversaciones del usuario en cuestión, sin interferir en la conversación.

Asistir: Se podrá escuchar y asistir al operador durante la conversación, sin que el cliente escuche.

Fin: Sale del monitoreo.

 

Conferencia telefónica

El sistema permite realizar conferencias telefónicas con numero externos y usuarios internos de la plataforma.

 

Iniciar: Una vez iniciada la conferencia se podrá invitar a los participantes.

 

Finalizar: Se podrá finalizar la conferencia en cualquier momento deseado.

 

Invitar participantes:

Teléfono externo:

Ingresar número de teléfono con quien desea comenzar una conferencia, se podrán sumar cuantos telefonos se desee, de uno por vez.

Usuarios de la plataforma:

Seleccionar el usuario y luego invitarlo a la conferencia, mediante el boton de la esquina inferior derecha (Invitar).


Estados de descanso

Esta pantalla lista todos los estado disponibles en el sistema para habilitarse o inhabilitarse a recibir llamados, incluidos los custom, y al clickear sobre uno de ellos, el usuario automáticamente pasará a ese estado.

 

EJ: Seleccionando el estado de sistema 1 - Descanso.

 

Ingreso/Egreso Campaña Saliente

Mediante el CONECTOR el operador tendrá la posibilidad de LOGUEARSE A UNA CAMPAÑA específica para realizar llamados.

 

EJ: Seleccionando la campaña 97 - SALESFORCE

 


Funcionamiento de la Integración

 

Generar un CRM que permita API y que tenga, además de al menos un teléfono, un dato clave. El dato clave del CRM de Neotel debe ser el identificador del contacto en SalesForce.

 

Generar una campaña que utilice el CRM previamente creado.

 

Realizar la carga de bases de datos con teléfonos a llamar y el identificador único de cada contacto.

 

El usuario se loguea en SalesForce, luego en el conector y a la campaña (dentro del conector). De esta manera queda habilitado para realizar y recibir llamados.

 

En el caso de discador predictivo este realiza el llamado, conecta con el destino y lo pasa al usuario. Cuando el usuario atiende mediante el softphone, el conector realiza la búsqueda dentro de Salesforce y muestra el contacto en pantalla. Para el resto de los discadores, realiza el llamado lo pasa al usuario antes de conectar con destino, y realiza la búsqueda en Salesforce para que el usuario tenga el dato en pantalla al momento de conectar.

 

Luego de terminar el llamado y la gestión necesaria en el gestor de SalesForce, el usuario debe indicar, mediante el botón  (Play) en el conector, que está nuevamente disponible para realizar un llamado. Este paso no es necesario cuando la gestión fue categorizada como agenda.


Configuración para llamadas entrantes

Al ingresar el llamado, debe ejecutarse en base de datos el SP CONTACTO_INSERT_SALESFORCE. Este, busca el dato en el CRM, y si no lo encuentra, inserta uno nuevo, luego pasa el llamado a la cola.

Para el ejemplo, un llamado entrante sin toma de datos, se debe crear la variable IDDATABASE que será la base de datos donde se insertará el contacto, en caso de no ser encontrando:

Luego, setear el valor correspondiente:

Y, posteriormente, ejecutar la transacción en base de datos:

PARÁMETROS:

@DATA: Valor de búsqueda. La búsqueda se realiza por el campo clave de tipo Clave_1.

@ANI: Número de teléfono del contacto, si el campo clave de búsqueda es el teléfono (Campo clave tipo TELEFONO), de igual manera se debe crear el campo CLAVE_1 para realizar la integración.

@IDDATABASE: Base donde se insertará el contacto si no existe.

VARIABLE RETORNO:

CLAVESF es un string compuesto por idContacto y Data en formato idContacto-Data.

Se utiliza para poder contar con el idContacto de Neotel en Salesforce.

 

CASO DE PRUEBA:

Teniendo un árbol configurado con Clave_1 siendo el ANI (como en el ejemplo), puede darse que el cliente llame desde un número privado. De ser así, no tendríamos información que identifique al mismo en SalesForce, entonces no podríamos generar una agenda en Neotel y tampoco categorizar el contacto.

Con este campo CLAVESF, nos aseguramos de al menos tener el idContacto de Neotel para completar las tareas mencionadas.

Si al campo DATA le enviamos “” (vacío), este es completado con el idContacto generado al insertar este nuevo dato. En este caso la devolución sería: “idContacto-”, lo que ocasiona que el conector, no realice una búsqueda, sino que respete la configuración del centro de llamados en SalesForce (Nuevo registro / Búsqueda / Nada).

No genera inconvenientes si cada vez que llama se crea un dato nuevo, ya que la idea de la integración es que desde Neotel no se gestione nada del CRM, pero es imperativo contar con un registro para poder categorizar y agendar por sobre todo, aunque esa información solo quede disponible de manera fehaciente en Salesforce.

 

Lo siguiente es configurar la cola de llamadas:

Los valores de CRM y BASE deben ser los mismos configurados en los pasos anteriores.

CAMPO DE BÚSQUEDA: Seleccionar el campo configurado como campo Clave_1

CLAVE: Valor por el cual se hará la búsqueda del dato en SalesForce. Para poder contar en SalesForce con el idContacto generado en Neotel, ingresar la variable de retorno de la ejecución en DB (CLAVESF).


Configuración dentro de SalesForce

En este apartado encontrará cómo configurar el Callcenter (Centro de llamadas) en SalesForce para la lograr la integración con Neotel y qué parámetros elegir para la configuración del softphone.

Centro de Llamadas

 

Una vez en la pantalla de configuración de SalesForce ingresar en el campo de búsqueda CENTRO DE LLAMADAS (o CALLCENTER según la configuración de idioma) y en el menú CONFIGURACIÓN DE FUNCIONES > SERVICIO > CENTRO DE LLAMADAS, seleccionar la opción CENTROS DE LLAMADAS tal como se puede apreciar en la imagen

 

 

 

 

 

 

Se mostrará la siguiente pantalla de bienvenida:

El XML arriba mencionado, tiene la siguiente estructura:

<callCenter>   <section sortOrder="0" name="reqGeneralInfo" label="General Information">     <item sortOrder="0" name="reqInternalName" label="InternalName">NeotelCTI</item>     <item sortOrder="1" name="reqDisplayName" label="Display Name">Neotel CTI</item>     <item sortOrder="2" name="reqAdapterUrl" label="CTI Adapter URL">https://demo.neotel.us/Callcenter/OpenCTI/SFOpenCTI.html</item>     <item sortOrder="3" name="reqUseApi" label="Use CTI API">true</item>     <item sortOrder="4" name="reqSoftphoneHeight" label="Softphone Height">420</item>     <item sortOrder="5" name="reqSoftphoneWidth" label="Softphone Width">620</item>     <item sortOrder="6" name="reqSalesforceCompatibilityMode" label="Salesforce Compatibility Mode">Lightning</item>   </section>   <section sortOrder="1" name="neotelConfigOptions" label="Opciones">     <item sortOrder="0" name="searchTypePriority" label="Prioridad de búsqueda"></item>     <item sortOrder="1" name="externalData" label="Datos de neotel importables a Sf">neoContactId__c-contactId|neoBaseId__c-contactBaseId|neoCrmId__c-crmId</item>     <item sortOrder="2" name="defaultNewRowData" label="Datos default para nuevos Registros">neoContactId__c-contactId|neoBaseId__c-contactBaseId|neoCrmId__c-crmId|Phone-phoneNumber|</item>     <item sortOrder="3" name="allowCategorization" label="Permite categorización de contactos. (true/false)">true</item>     <item sortOrder="4" name="allowClickToDialSearch" label="Permite seleccionar un dato de SF, tomarlo en pantalla y gestionarlo. (ClickToDial)">true</item>     <item sortOrder="5" name="useTaskDescriptionField" label="Utiliza el campo descripción para guardar la información de la gestion.">true</item>     <item sortOrder="6" name="allowContactRelease" label="Permite liberar un contacto sin ser categorizado.">true</item>     <item sortOrder="7" name="automaticContactRelease" label="Liberar contacto automaticamente al terminar llamado. (Segundos)">-1</item>     <item sortOrder="8" name="saveActivityLog" label="Guardar automáticamente registro de llamada (Task).">true</item>     <item sortOrder="9" name="allowTextMessage" label="Permite enviar un mensaje al cliente por medio de SMS o Whatsapp.">false</item>     <item sortOrder="10" name="campaignEntityName" label="Permite asociar un id de campaña a un objeto de Salesforce.">false</item>   </section> </callCenter>

 

<item sortOrder="0" name="searchTypePriority" label="Prioridad de búsqueda"></item>

Puede contener los valores Contact|Account|Lead|Opportunity|Company con los cuales se va a definir el orden de prioridad de búsqueda en caso de que se encuentre más de un resultado en la base de SalesForce.

Por ejemplo: si busco por Teléfono y hay un Contact y un Account con ese número asociado, mostrara la pantalla de contacto y no la de account.

Adicionalmente, si no se setea ninguna opción, es decir, se deja el valor “vacío”, si matchea mas de un registro (independientemente del tipo), mostrará la pantalla de búsqueda, o no hará nada, segúun este definido en el formato de soft phone.

<item sortOrder="1" name="externalData" label="Datos de neotel importables a Sf">neoContactId__c-contactId|neoBaseId__c-contactBaseId|neoCrmId__c-crmId</item>

Aquí se definen qué datos provenientes de Neotel serán actualizados en el registro de SalesForce. Ese dato se actualiza cada vez que cae la ficha para ese Contact|Account|Lead|Opportunity|Company.

Por ejemplo: Si buscamos que quede informado en la entidad de Salesforce (Contact/Lead/Opportunity/etc.) el dato Id Campaña Neotel para saber de qué campaña se lo contacto por última vez, se debe crear previamente el dato en el gestor de objetos de SalesForce y en el XML informar en externalData con qué dato de Neotel será reemplazado.

DATOS DE NEOTEL DISPONIBLES:

Nombre

Descripción

Nombre

Descripción

callCampaing

ID Campaña Neotel

callDialer

tipo de discador utilizado

callId

IdLlamada en Neotel

callQueue

IdCola Neotel

callReason

Motivo Traída (Agenda/No Procesado/etc.)

phoneNumber

Número telefónico de la llamada.

contactBaseId

Id DataBase del contacto en Neotel

campaignCrmId

ID CRM de la campaña saliente

campaignBaseId

ID DataBase de la campaña saliente

userOutCampaign

ID Campaña saliente a la que está logueado el usuario

crmId

ID CRM del contacto de la llamada en curso

contactId

ID Contacto Neotel

crmKey

Valor del campo clave de búsqueda del contacto

SearchBy

Nombre del campo por el cual se realizó la búsqueda en Salesforce

SearchData

Valor de SearchBy

Por ejemplo: en caso de llamados entrantes, se puede configurar que el cliente ingrese su DNI. Este dato viajará desde Neotel hacia el NeoOpenCTI como crmKey = 31987456 y con ese valor se buscará en SalesForce un registro coincidente.

En SearchBy y searchData informa si el registro coincidente se encontró por esa clave DNI o por otra, como ser TELEFONO.

<item sortOrder="2" name="defaultNewRowData" label="Datos default para nuevos Registros">neoContactId__c-contactId|neoBaseId__c-contactBaseId|neoCrmId__c-crmId|Phone-phoneNumber|</item>

Si al momento de caer un llamado/contacto desde Neotel, no se encuentra ninguna coincidencia en Salesforce y está configurado para que se cree un nuevo registro al darse esta condición, se asignan aquí los valores default que se llenarán automáticamente en la ficha.

Se utiliza la misma combinación de parámetros que en externalData.

Todas las entidades utilizadas con la integración (Account/Lead/Contact/Opportunity/etc.) deben tener creado el campo neoSyncId (neoSyncId c) que referencia a un id único, este debe ser Número (18, 0) (IdExterno) (Exclusivo).

El motivo es que al no encontrar coincidencia y abrir la pantalla de creación de un registro, se debe luego sincronizar el dato en el softphone con el nuevo registro creado en SalesForce, y se hace mediante un Id único (neoSyncId), para evitar errores.

<item sortOrder="3" name="allowCategorization" label="Permite categorización de contactos. (true/false)">true</item>

Permite categorizar los contactos desde el softphone, en base a las categorías y subcategorías creadas en el CRM.

Si su valor es FALSE, no modifica el funcionamiento.

Si su valor es TRUE, al clickear sobre el botón LIBERAR, se mostrará una nueva pantalla (que se muestra a continuación) donde seleccionar Categoría y Subcategoría, o simplemente liberar para soltar el contacto y pasar a la próxima gestión.

El resultado de la gestión se verá reflejado en la Actividad registrada en SalesForce (Llamada) en el campo RESULTADO DE LA LLAMADA1, al caer el contacto.

 

Debe habilitarse el campo CallDisposition en el layout de la entidad tareas (Task).

<item sortOrder="4" name="allowClickToDialSearch" label="Permite seleccionar un dato de SF, tomarlo en pantalla y gestionarlo. (ClickToDial)">true</item>

El clickToDial, en caso de que no tenga un dato tomado en el Conector, es básicamente una búsqueda de contacto, por lo tanto para hacerlo funcionar, en SalesForce el registro debe contar con los datos IdCrm y crmData (campo tipo Clave_1) de manera obligatoria, ya que con estos datos, buscara en Neotel para agendar y/o categorizar.

En el XLM allowClickToDialSearch es el campo que habilita o deshabilita la función "Búsqueda".

 

Al importar el archivo, aparecerá la siguiente pantalla donde presionaremos el botón GESTIONAR USUARIOS DE CENTRO DE LLAMADA para proceder a asignar los permisos necesarios a aquellos usuarios que vayan a usar el softphone:

Entrar a la gestión de usuarios y luego a “agregar usuario”.

Filtrar y seleccionar los usuarios que se desea agregar al centro de llamadas. Con esto los usuarios seleccionados verán la barra inferior y el soft phone en la sección ventas.

Formato de Softphone

¿Qué acción tomar al momento que cae un llamado?

Si no hay registros coincidentes, las opciones que SalesForce ofrece son las que se visualizan en la imagen:

 

 

Sin embargo, desde Neotel se recomienda escoger entre:

  • No abrir ninguna pantalla → no realiza acción alguna

  • Abrir en nueva “OPCION”    → abre la pantalla de creación de registro del tipo seleccionado.

  • Los valores default se configuran en el XML en el ítem defaultNewRowData

 

En la imagen se ve que en caso de que no haya registros coincidentes, se abrirá la pantalla de creación de contacto.

Al abrirse la pantalla de creación de registro (Account/Lead/etc.), se llenarán por default los datos configurados, y se cerrará el softphone para poner foco en el alta del registro

 

 

 

 

Una vez que el registro haya sido guardado y el usuario abra la pantalla del softphone, el mismo tendrá una advertencia que indica lo siguiente:

Al cerrar la ventana, se sincronizará, de haberlo, el nuevo registro en el softphone, caso contrario deberá liberarlo para continuar trabajando

 

Si el usuario por error cerrara la ventana antes de crear el nuevo registro, podrá sincronizarlo desde el softphone haciendo click sobre el icono de sincronizar que se encuentra al lado del Nombre:

 

 

 

En caso de que se encuentre un único registro coincidente, las opciones ofrecidas son:

 

De las cuales, para cumplir con la integración, solo se debe elegir entre:

  • No abrir ninguna pantalla → no realiza acción alguna

  • Página de detalle de apertura → abre la pantalla de detalle del tipo seleccionado

En la imagen se ve que en caso de que haya un registro coincidente, se abrirá la pantalla de detalle de apertura.

 

 

En cambio, si encuentra registros múltiples del mismo tipo, la integración, da la posibilidad de abrir pantalla de búsqueda o hacer nada, según lo definido en SalesForce:

 


ANEXO

CLASES DE APEX

 

 

global class NeotelDataRetrieval{ webService static String getLeadById(String Id) { List<String> fields = new List<String>(Lead.SObjectType.getDescribe().fields.getMap().keySet()); List<Lead> leads= new List<Lead>(); for (Lead lead: Database.query('Select ' + String.join(fields, ',') + ' from Lead where Id= :Id' )){ leads.add(lead); } String JSONString = JSON.serialize(leads); return JSONString; } webService static String getContactById(String Id) { List<String> fields = new List<String>(Contact.SObjectType.getDescribe().fields.getMap().keySet()); List<Contact> contacts= new List<Contact>(); for (Contact contact: Database.query('Select ' + String.join(fields, ',') + ' from Contact where Id= :Id' )){ contacts.add(contact); } String JSONString = JSON.serialize(contacts); return JSONString; } webService static String getAccountById(String Id) { List<String> fields = new List<String>(Account.SObjectType.getDescribe().fields.getMap().keySet()); List<Account> accounts = new List<Account>(); for (Account account: Database.query('Select ' + String.join(fields, ',') + ' from Account where Id= :Id' )){ accounts .add(account); } String JSONString = JSON.serialize(accounts); return JSONString; } webService static String getOpportunityById(String Id) { List<String> fields = new List<String>(Opportunity.SObjectType.getDescribe().fields.getMap().keySet()); List<Opportunity> opportunities = new List<Opportunity>(); for (Opportunity opportunity: Database.query('Select ' + String.join(fields, ',') + ' from Opportunity where Id= :Id' )){ opportunities .add(opportunity); } String JSONString = JSON.serialize(opportunities ); return JSONString; } }

Métodos de NeoApi

Listado de todos los métodos del Webservice Neotel que se utilizan desde el CTI:

  • Login

  • Logout

  • Login_Campaign

  • Logout_Campaign

  • Pause

  • Unpause

  • Dial

  • Hangup

  • Position

  • UpdateContact

  • CRM_Unavailable

  • CRM_Available

  • CRM_ShowingContact

  • JoinConference

  • InviteParticipant

  • KickAll

  • ExecuteTask01

  • ExecuteTask02

  • ExecuteTask03

  • ExecuteTask05