Integración de Salesforce con sistemas terceros (SAP)

¿Qué es Salesforce?

 

Salesforce es una plataforma basada en la nube de gestión de relaciones con los clientes (CRM). Al ser un software basado en la nube no es necesario tener un software instalado internamente y, las compañías pueden acceder a sus datos en cualquier momento/lugar a través de la web.

 

El servicio de Salesforce está compuesto por las siguientes categorías:

 

  • Sales Cloud: proporciona a las compañías una interfaz para la gestión de casos y tareas.
  • Service Cloud: es un software de atención al cliente.
  • Marketing Cloud: dispone de herramientas para marketing.
  • Lightning Platform: es una plataforma que permite a los desarrolladores dentro de cada compañía crear aplicaciones complementarias que se integran con Salesforce.
  • Community Cloud: es una plataforma que conecta a empleados, clientes, socios, proveedores y distribuidores. Se puede personalizar la experiencia en base a los intereses de la persona y ayudarles a encontrar la información que necesitan de manera más rápida o permitir que consulten sus dudas con el resto de usuarios de la comunidad.

 

¿Qué es un sistema tercero?

 

Un sistema tercero es un software ajeno a Salesforce con su funcionalidad independiente. En este artículo el sistema tercero con el que se integrará Salesforce será SAP, que es un sistema ERP (Enterprise Resource Planning).

Un ERP es un sistema de planificación de recursos empresariales, los cuales se hacen cargo de distintas operaciones internas en una empresa, desde producción a distribución o incluso recursos humanos. Las principales ventajas de estos sistemas son: automatización de procesos de la empresa y disponibilidad de la información de la empresa en una misma plataforma.

 

¿Por qué la integración entre ambos sistemas?

 

Es posible que la compañía no quiera desprenderse del sistema tercero porque cubre una parte del proceso de la compañía complementario al proceso definido en Salesforce pero sea necesaria, y posible, la integración entre ambos sistemas.

 

La integración entre ambos sistemas proporciona, entre otras, las siguientes ventajas:

 

  • Centralizar la información en una única plataforma, convirtiendo a Salesforce en el núcleo de los sistemas de la compañía.
  • Ahorrar en costes de licencia innecesarios aprovechando el software disponible de la compañía para cubrir ciertas funcionalidades que, sin utilizar el sistema tercero sería necesario implementar desde cero. Maximizando de esta manera las inversiones realizadas en los diferentes softwares.
  • Evitar la captura de datos que son repetitivos.

 

Integración entre los sistemas

 

Los sistemas pueden integrarse en una dirección o en ambas. A continuación se explicarán ambas formas.

  • De SAP a Salesforce

     

    • A través del API REST de Salesforce

      Salesforce ofrece algunos servicios a través de la API REST de manera standard, sin necesidad de desarrollar código. Estos servicios pueden utilizarse para funcionalidades sencillas, como:

      • Realizar una consulta o una búsqueda.
      • Crear, actualizar o eliminar registros.

       

      Una solicitud de este tipo está compuesta por cuatro componentes: una URL, un método HTTP, cabeceras y cuerpo de la solicitud.

       

      La URL está formada de la siguiente manera: /services/data/vXX.0/sobjects/objectName/action, donde:

      • /services/data: especifica que se está realizando una solicitud API REST.
      • /vXX.0: hace referencia al número de versión de la API.
      • /sobjects: especifica que se va a acceder a un recurso de la agrupación de sObjects.
      • /objectName: hace referencia al sObject sobre el cual se va a realizar la acción.
      • /action: especifica la operación que se va a realizar sobre el sObject.

       

      Los métodos HTTP más utilizados en los API REST son los siguientes:

      • GET: utilizado para realizar una consulta y recuperar datos.
      • POST: utilizado para crear registros.
      • DELETE: utilizado para eliminar registros identificados en la dirección URL.
      • PUT: utilizado para crear o actualizar el registro enviado en el cuerpo de la solicitud.
    • A través de un servicio web

      Si se necesita una funcionalidad más compleja que los servicios API REST no pueden ofrecer, se necesita realizar el desarrollo de la funcionalidad exponiendo servicios. Estos servicios expuestos por Salesforce pueden ser de tipo REST o SOAP. Ambos servicios son muy parecidos, pero en este artículo se explicará la creación de servicios SOAP.

      Para que una clase de Apex esté disponible como servicio SOAP es necesario definir la clase como global. Además, será necesario añadir a cada método que se quiera exponer la palabra webservice (proporciona acceso global al método) y static

      global with sharing class CreateCaseAndWorkOrder {
      
       
      
                  global with sharing class caseData {
      
                              webservice String accountNumber;
      
                              webservice String subject;
      
                              webservice String description;
      
                              webservice String country;
      
                              webservice String state;
      
                  }
      
                 
      
                  webservice static String createCaseWO(caseData dataInfo){
      
                              Case newCase = new Case();
      
                              newCase.AccountId = [SELECT Id FROM Account WHERE SAP_AccountId__c =: dataInfo.accountNumber LIMIT 1].Id;
      
                              newCase.Subject = dataInfo.subject;
      
                              newCase.Description = dataInfo.description;
      
                              newCase.Country__c = dataInfo.country;
      
                              newCase.State__c = dataInfo.state;
      
                              insert newCase;
      
                             
      
                              WorkOrder newWO = new WorkOrder();
      
                              newWO.Subject = dataInfo.subject;
      
                              newWO.Description = dataInfo.description;
      
                              newWO.CaseId = newCase.Id;
      
                              insert newWO;
      
                             
      
                              return 'Case and WorkOrder created.';
      
                  }
      
       
      
      }

      Figura 1. Código para la creación de un Case y una WorkOrder asociada

       

      SAP llamará a los métodos de Apex haciendo uso del archivo WSDL, generado en Salesforce, de la clase. Pero, dado que la seguridad de la plataforma es una prioridad para Salesforce, el servicio web requiere de autentificación. Por eso antes de utilizar el WSDL del servicio, deben usar el WSDL para la funcionalidad del inicio de sesión. Tanto para el servicio web como para el servicio de inicio de sesión se utilizará un usuario existente en Salesforce.

      A continuación se mostrará un ejemplo del proceso que debe seguir SAP para integrarse con Salesforce de manera satisfactoria, realizando la integración con el servicio web de la figura 1. Servicio que, como se puede ver en el código, realizará la creación de un caso y de una orden de trabajo en Salesforce.

      Tal y como se ha comentado, lo primero que tiene que hacer el sistema tercero es llamar a Salesforce a través del WSDL para el inicio de sesión. De esta manera, se conseguirá el identificador de sesión (sessionId) necesario para poder realizar la llamada al WSDL de la funcionalidad que se requiere.

      <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:enterprise.soap.sforce.com">
      
         <soapenv:Header>
      
            <urn:LoginScopeHeader>
      
               <urn:organizationId></urn:organizationId>
      
               <urn:portalId></urn:portalId>
      
            </urn:LoginScopeHeader>
      
         </soapenv:Header>
      
         <soapenv:Body>
      
            <urn:login>
      
               <urn:username>usuariointegraciones@salesforce.com</urn:username>
      
               <urn:password>usuariointegracionesdtOAFyMplQqDvWJyKbeo4tiuf</urn:password>
      
            </urn:login>
      
         </soapenv:Body>
      
      </soapenv:Envelope>

      Figura 2. Petición para el servicio API de inicio de sesión

       

      <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:enterprise.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      
         <soapenv:Body>
      
            <loginResponse>
      
               <result>
      
                  <metadataServerUrl>https://devEveris.my.salesforce.com/services/Soap/m/48.0/00D0E000000DwCm</metadataServerUrl>
      
                  <passwordExpired>false</passwordExpired>
      
                  <sandbox>true</sandbox>
      
                  <serverUrl>https://devEveris.my.salesforce.com/services/Soap/c/48.0/00D0E000000DwCm/0DF0E0000000Jpd</serverUrl>
      
                  <sessionId>00D0E000000DwCm!AQQAQPUN.SjEOjhMNUje00ggupvJAN22mzYiVpkxPPKU4pIdvBrT807mt34tj7JhEegJyIAcUMbYTa_g5rU7ugPRD_HWV9lh</sessionId>
      
                  <userId>0050E000006KbmvQAC</userId>
      
                  <userInfo>
      
                     <accessibilityMode>false</accessibilityMode>
      
                     <chatterExternal>false</chatterExternal>
      
                     <currencySymbol xsi:nil="true"/>
      
                     <orgAttachmentFileSizeLimit>5242880</orgAttachmentFileSizeLimit>
      
                     <orgDefaultCurrencyIsoCode xsi:nil="true"/>
      
                     <orgDefaultCurrencyLocale xsi:nil="true"/>
      
                     <orgDisallowHtmlAttachments>false</orgDisallowHtmlAttachments>
      
                     <orgHasPersonAccounts>false</orgHasPersonAccounts>
      
                     <organizationId>00D0E000000DwCmUAK</organizationId>
      
                     <organizationMultiCurrency>true</organizationMultiCurrency>
      
                     <organizationName>Nombre compañia</organizationName>
      
                     <profileId>00e0N00000163laQAA</profileId>
      
                     <roleId>00E0N000000fnR6UAI</roleId>
      
                     <sessionSecondsValid>7200</sessionSecondsValid>
      
                     <userDefaultCurrencyIsoCode>EUR</userDefaultCurrencyIsoCode>
      
                     <userEmail> usuariointegraciones@salesforce.com </userEmail>
      
                     <userFullName>Usuario Integraciones</userFullName>
      
                     <userId>0050E000006KbmvQAC</userId>
      
                     <userLanguage>en_US</userLanguage>
      
                     <userLocale>es_ES</userLocale>
      
                     <userName> usuariointegraciones@salesforce.com.deveveris</userName>
      
                     <userTimeZone>Europe/Paris</userTimeZone>
      
                     <userType>Standard</userType>
      
                     <userUiSkin>Theme3</userUiSkin>
      
                  </userInfo>
      
               </result>
      
            </loginResponse>
      
         </soapenv:Body>
      
      </soapenv:Envelope>

      Figura 3. Respuesta del servicio de inicio de sesión​

       

      Una vez que se tiene el identificador de sesión, se tiene que realizar la llamada al servicio web de la Figura 1. Para ello, se tiene que importar el WSDL que se ha generado desde Salesforce.

      Una vez importado se completaran los datos de la llamada, incluyendo el identificador de sesión. Cuando todos los datos estén completos, en la herramienta de SOAP UI se pulsará sobre el icono . Este botón simulará la llamada a Salesforce, proporcionando en la parte derecha la respuesta de Salesforce ante esa petición.

      <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sf="http://soap.sforce.com/schemas/class/CreateCaseAndWorkOrder">
      
         <soapenv:Header>
      
            <cre:SessionHeader>
      
               <cre:sessionId>00D0E000000DwCm!AQQAQPUN.SjEOjhMNUje00ggupvJAN22mzYiVpkxPPKU4pIdvBrT807mt34tj7JhEegJyIAcUMbYTa_g5rU7ugPRD_HWV9lh</cre:sessionId>
      
            </cre:SessionHeader>
      
         </soapenv:Header>
      
         <soapenv:Body>
      
            <cre:createCaseWO>
      
               <cre:dataInfo>
      
                                         <cre:accountNumber></cre:accountNumber>
      
                                         <cre:country>Spain</cre:country>
      
                                         <cre:description>Creación de un Case + WorkOrder asociada</cre:description>
      
                                         <cre:state>Cantabria</cre:state>
      
                                         <cre:subject>Case 2208</cre:subject>
      
                              </cre:dataInfo>
      
            </cre:createCaseWO>
      
         </soapenv:Body>
      
      </soapenv:Envelope>
      <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sf="http://soap.sforce.com/schemas/class/CreateCaseAndWorkOrder">
      
         <soapenv:Body>
      
            <createCaseWOResponse>
      
               <result>Case and WorkOrder created.</result>
      
            </createCaseWOResponse>
      
         </soapenv:Body>
      
      </soapenv:Envelope>
      
       

      Figura 4. Petición y respuesta del servicio web de la Figura 1

 

  • Salesforce a SAP

     

    Para realizar una llamada desde Salesforce a SAP es necesario hacer una llamada basada en un método HTTP. Este método indica el tipo de acción que se quiere realizar.

    Además del método HTTP, cada solicitud establece una URL, que es la dirección donde se ubica el servicio. Una vez que el servidor ha procesado la solicitud, envía un código de estado en la respuesta, donde se indica si la solicitud ha sido procesada correctamente (se envía el código 200) o, si se han generado errores (se envía el código 404 o 500, entre otros).

    La estructura de estos servicios es la siguiente:

    Http http = new Http();
    
    HttpRequest request = new HttpRequest();
    
    request.setEndpoint('https://XXXXXXXXXXXXXXXXXXXXX.XX');
    
    request.setMethod('POST');
    
    request.setHeader('Content-Type', 'application/json;charset=UTF-8');
    
     
    
    // Set the body as a JSON object
    
    request.setBody('{"name":"mighty moose"}');
    
    HttpResponse response = http.send(request);

     

    • setEndpoint: se establece la URL del servicio web de SAP.
    • setMethod: se indica el método HTTP que se va a realizar en la llamada.
    • setHeader: el encabezado Content-Type se establece para permitir que el servicio sepa que los datos que se envían serán en formato JSON, y de esta manera SAP pueda procesarlos de manera correcta.
    • setBody: se indica los datos de la petición en formato JSON. Estos datos están definidos en el WSDL proporcionado por SAP.

     

    La respuesta al servicio puede llegar a Salesforce en formato JSON o en formato XML, y para utilizar esta respuesta en Salesforce es necesario realizar un parseo.

    En caso de que la respuesta venga en formato JSON, se realizará el tratamiento de la respuesta con la clase integrada de Salesforce JSON. Y si viene en formato XML, será necesario tratarla con la clase integrada de Salesforce XmlNode.

    Una vez que la respuesta ha sido tratada en Salesforce con la clase integrada correspondiente, se pueden realizar, entre otras, las siguientes acciones: mostrar los datos en pantalla o creación/actualización de objetos de Salesforce.