Introdução
De modo a aumentar a produtividade das equipas de vendas, serviço e marketing , a disponibilização de informação atualizada nos sistemas de CRM, proveniente de sistemas externos é extremamente comum. Sendo os sistemas externos muito variados, as metodologias de integração são igualmente distintas e com múltiplos desafios. Durante um projeto de implementação de CRM Salesforce, a equipa da worldIT enfrentou o desafio de manter sincronizados diversos objetos com um sistema externo essencial para as operações da empresa, mas com significativas limitações técnicas do ponto de vista de integração. Este sistema externo gere informações críticas, como clientes, contatos, endereços, encomendas, produtos e faturas. Com a implementação do Salesforce, esses dados passaram a existir em ambos os sistemas, tornando crucial a necessidade de manter a consistência e a atualidade das informações.
A principal prioridade era garantir que os utilizadores do Salesforce tivessem sempre acesso aos dados mais atualizados, evitando decisões baseadas em informações desatualizadas ou incorretas. Para atingir esse objetivo, foi necessário desenvolver uma solução que permitisse a sincronização eficiente e em tempo real dos dados entre os dois sistemas, mesmo diante das limitações técnicas do sistema externo.
O projeto exigiu uma abordagem estratégica para superar os desafios de integração e sincronização de dados. A equipa da worldIT dedicou-se a criar um mecanismo robusto que assegurasse a integridade dos dados, proporcionando uma experiência de utilizador fluida e confiável no Salesforce. Esta iniciativa não melhorou apenas a eficiência operacional, mas também reforçou a confiança dos utilizadores na precisão das informações disponíveis.
Problema
Durante o projeto, uma das principais dificuldades encontradas foi a limitação do sistema externo em enviar atualizações em tempo real para o Salesforce. Fomos informados de que não era viável que o sistema externo invocasse uma API de atualização sempre que um registo fosse alterado. Isso significava que, se um cliente, contato, endereço, encomenda, produto ou fatura fosse modificado no sistema externo, essa alteração não seria automaticamente refletida no Salesforce.
Solução
Foi então idealizada uma solução em que o Salesforce, através de API REST de consulta, iria recolher os dados existentes no ERP e sincronizar com os seus dados.
A opção de utilizar processos recorrentes de consulta para ir mantendo os objetos sincronizados em Salesforce foi excluída (com exceção das Encomendas, que estão sempre à procura de novas atualizações), já que não garantia que num determinado momento tivéssemos a imagem mais atual sincronizada.
Optámos então por invocar uma API de consulta quando o utilizador entra na página de determinados objetos. Alguns standards (Clientes, Contactos, Encomendas), outros customizados.
A forma de implementação deste requisito passou por utilizar Visualforce Pages em cada uma das páginas onde queríamos que fosse feita a sincronização.
Estratégia
A funcionalidade de sincronização segue os seguintes passos:
- O utilizador entra na página de detalhe de um objeto Salesforce (exemplo Cliente).
- A visualforce page adicionada à página invoca uma classe apex partilhada por todas as páginas que usam esta funcionalidade (SyncEntityFromPage)
- Nesta classe apex é identificado o objeto que queremos sincronizar (neste exemplo a Account) e são preenchidos vários parâmetros usados no processo de sincronização. Por exemplo, o objeto a sincronizar, o id do registo, path a acrescentar ao url, uma substring uma lista de campos de Salesforce que queremos sincronizar e o seu nome na API que será invocada, …
- É invocada uma classe apex centralizada de invocação de API e tratamento de resultados. Esta classe a que chamamos framework permite fazer as invocações usadas nesta funcionalidade, assim como nos processos recorrentes de sincronização, processos de reprocessamento de invocações em erro, invocação de API de criação de registos no sistema externo, ...
- Esta framework centraliza todas as invocações das API e funciona de forma totalmente agnóstica ao processo que a invocou. Ou seja, a API a invocar, os campos a comparar, … são sempre passados pela classe que a invocou. Não tendo então exceções especificas para o processo A ou B.
- De uma forma resumida, a framework segue os seguintes passos
- Recolhe todos os parâmetros necessários ao processo que a está a invocar.
- Consulta uma custom setting onde estão guardadas as credenciais e o token usado no processo de autenticação, assim como o url a invocar.
- Faz o pedido HTTP para o endpoint correto (url recolhido na custom setting conectado com um path específico consoante o objeto. Ex [url]/cliente/[id]”)
- Nesta funcionalidade de sincronização é enviado o método GET apenas com header (onde está o id do objeto que queremos consultar, assim como o token de autenticação), noutros processos são enviados POST com body JSON (a framework é partilhada por todos os tipos de integração)
- Caso seja recebido um erro 401 a indicar que o token é inválido, é necessário enviar um novo pedido, desta vez um POST onde no body é enviado o cliente id e secret do sistema que queremos consultar. Fazendo a autenticação, recebemos um novo token que será atualizado na custom setting e o processo continua. Isto significa que o utilizador não tem a perceção que houve um erro de autenticação durante a consulta.
- Caso seja recebido um erro diferente do 401, uma mensagem com a descrição do erro é devolvida à classe Apex que invocou a Framework.
- Caso a API devolva sucesso, os dados devolvidos são recolhidos e adicionados a uma lista.
- Tendo a lista de campos e os seus valores no sistema externo, passamos à recolha dos valores que estão em Salesforce para os mesmos campos.
- No final das consultas ao sistema externo e Salesforce, temos listas com os campos que queremos comparar, o seu valor no sistema externo, o seu valor em Salesforce, o seu tipo e a sua label.
- Podemos finalmente passar para a fase do processo em que são comparados os valores em ambos os sistemas, tendo sempre em atenção o tipo de campo que estamos a analisar e fazendo pequenos ajustes para não termos falsos positivos (diferente formatação nas datas, casa decimais em numbers, Y=true/N=false em booleanos, …)
- Caso não tenha sido encontrada nenhuma diferença, devolvemos essa indicação à classe Apex que invocou a Framework.
- Caso tenham sido encontradas diferenças, o processo desenha uma tabela em HTML com uma linha para cada diferença encontrada. Cada linha tem a label do campo, o valor em Salesforce e o valor no sistema externo. O html é desenhado com as classes CSS utilizadas pelas tabelas de Salesforce, de forma a aparecer no ecrã uma tabela com o look and feel que o utilizador conhece.
- A classe Apex que invocou a Framework, tem agora o resultado da invocação da API. Seja um erro, uma indicação que não foram encontradas diferenças, ou o html com uma tabela de diferenças. Esse resultado é passado para a visualforce page (showmsg, outputHTML).
- O resultado é mostrado na página utilizando mensagens da classe ApexPages e o html desenhado na framework.
- Exemplo onde não foram encontras diferenças entre os dados de Salesforce e o sistema externo:
- Exemplo onde foram encontradas diferenças:
- Quando são encontradas diferenças é dada a possibilidade ao utilizador de sincronizar os dados. Isto significa atualizar o registo em Salesforce com os dados recolhidos no sistema externo.
- A passagem de dados de Salesforce para o sistema externo é feita num processo assíncrono, por isso as diferenças encontradas podem existir por o sistema externo ainda não estar atualizado, daí darmos a hipótese ao utilizador de não carregar no botão e ignorar o aviso. Noutros objetos onde não existe este tema (Produtos), o botão Sincronizar não é mostrado. Neste caso a tabela com as diferenças é mostrada durante 5 segundos e a sincronização é feita automaticamente, sem intervenção do utilizador.
- A visualforce page tem ainda algumas funções javascript para controlo de elementos html.
Resultado
A implementação desta funcionalidade trouxe inúmeros benefícios, garantindo que os utilizadores do Salesforce tenham acesso imediato às informações mais atualizadas assim que entram na página de detalhes dos objetos. Isso proporciona uma visão clara e precisa das diferenças entre os dados no Salesforce e no sistema externo, prevenindo o risco de substituir dados com valores obsoletos.
Em resumo, a funcionalidade implementada não só previne a utilização de dados desatualizados como também melhora significativamente a eficiência, a confiança e a precisão dos processos internos, proporcionando uma vantagem competitiva à empresa.
Conclusão
Nem sempre é fácil fazer a integração de dados entre dois sistemas. As tecnologias não são iguais e nem sempre os sistemas têm as mesmas necessidades e prioridades. O que parece muito simples para um sistema, pode ser bastante complexo para outro. Muitas vezes temos de abandonar a solução ideal e sair fora da caixa para encontrar novas formas de resolver os problemas.
Esta foi a forma que a equipa worldIT encontrou de satisfazer as necessidades do cliente e ultrapassar os constrangimentos na integração com o sistema externo. Graças a esta solução, os utilizadores do Salesforce do nosso cliente podem confiar que estão sempre a trabalhar com dados atualizados, garantindo precisão e eficiência nas suas operações. Este projeto exemplifica a nossa capacidade de enfrentar desafios técnicos e entregar soluções robustas e eficazes.
#Salesforce #IntegraçãoDeDados #worldIT