Desenvolvimento próprio

Middleware de integração entre PHC, ZoneSoft e XD

Middleware da RTC que sincroniza o Cegid PHC com o ZoneSoft e com o XD: num só cliente entram mais de 2 000 documentos por dia no PHC, sem portos abertos nos servidores. Desde 10 € + IVA por mês, com atualizações e suporte.

IntegraçãoPHCZoneSoftXDMiddleware

Há uma cena que se repete em quase todas as empresas que vendem ao balcão e fazem a gestão noutro programa: alguém, ao fim do dia, exporta um ficheiro de um lado e importa do outro. Ou pior, escreve à mão. Funciona até ao dia em que alguém adoece, se engana numa linha, ou se esquece, e a partir daí ninguém confia nos números de nenhum dos dois sistemas.

Foi para acabar com isso que desenvolvemos o nosso middleware. Não é um exportador de ficheiros com outro nome: é uma peça de software feita por nós, que fica a ligar os sistemas e a mantê-los de acordo, sem ninguém ter de se lembrar de nada.

Que volume passa por aqui todos os dias

Num só cliente nosso, mais de 2 000 documentos por dia entram no Cegid PHC através deste middleware. No sentido inverso, e no mesmo cliente, dezenas de artigos e de preços novos ou alterados descem todos os dias do PHC para o XD e para o ZoneSoft.

Estes números são de uma instalação concreta em produção, e não de um ensaio de laboratório nem da soma de todos os clientes. Servem sobretudo para dar a escala. Isto não é uma sincronização noturna de vinte linhas: é o movimento de balcão de empresas com lojas a faturar ao mesmo tempo. Quem hoje faz este trabalho à mão, ou por exportação e importação de ficheiros ao fim do dia, percebe de imediato quantas horas por semana estão aqui em causa, e percebe também o que acontece na semana em que a pessoa que costuma fazer isso está de férias.

O que liga a quê

Sincroniza o Cegid PHC com o ZoneSoft e o Cegid PHC com o XD. Podem estar os dois ligados ao PHC ao mesmo tempo, o que é o caso normal de quem tem lojas ou restaurantes com equipamento diferente e uma só contabilidade.

E liga também o XD ao ZoneSoft, diretamente, sem ter de passar por um terceiro sistema. Serve para grupos que cresceram por aquisição e ficaram com dois programas de ponto de venda diferentes a conviver.

Num sentido, nos dois, ou cada coisa no seu sentido

A direção não é uma decisão única para toda a integração. Define-se por tabela, porque raramente faz sentido tudo andar para os dois lados.

O caso mais comum é este: artigos, preços, famílias e clientes descem da gestão para o ponto de venda, porque é lá que devem ser criados uma vez só; e vendas, movimentos de caixa e consumos sobem do ponto de venda para a gestão, porque é lá que têm de virar contabilidade. Tudo o resto é configuração, e pode mudar depois sem refazer nada.

Sem portos abertos nos servidores

Esta é a parte que costuma surpreender quem já pediu orçamentos para integrações. A maioria das soluções exige abrir a firewall, publicar a base de dados, ou montar uma rede privada entre instalações. Cada uma dessas coisas é uma porta nova para defender.

A nossa não pede nada disso. A ligação parte sempre de dentro para fora: é o componente instalado dentro da rede da empresa que a inicia. A firewall não precisa de aceitar nada vindo do exterior, não há serviço publicado na internet, e a base de dados do ERP nunca fica exposta.

Para quem tem de responder por segurança, isto deixa de ser um pormenor técnico. Nenhuma porta aberta é uma porta a menos para ser encontrada por quem varre a internet à procura de bases de dados mal protegidas, que é como começam muitos dos casos de ransomware a que somos chamados. Ver cibersegurança.

Todas as tabelas, e só os dados que interessam

Chegamos a qualquer tabela dos sistemas envolvidos, e não a um punhado de campos escolhidos por quem fez o programa. Isso importa porque as empresas usam campos próprios, criados para o negócio delas, e são quase sempre esses que uma integração de catálogo deixa de fora.

Tão importante como passar tudo é não passar o que não deve. Filtramos ao nível dos dados: só determinada loja, só certas séries de documentos, só uma família de artigos, só a partir de uma data. Uma empresa com sete lojas raramente quer todas as vendas de todas elas a caírem no mesmo sítio sem distinção, e um grupo com várias sociedades tem de manter as coisas separadas.

Painel e relatórios

Tem um painel próprio, onde se vê o que está a passar, quando passou e em que volume. Uma integração que trabalha em silêncio é confortável até ao dia em que para, e nesse dia a diferença entre reparar de manhã ou reparar ao fim da semana é toda.

E há uma coisa que se ganha por acréscimo: relatórios cruzados que nenhum dos sistemas dá sozinho, porque cada um só conhece metade da história. Vendas do balcão lado a lado com compras e stocks da gestão, por loja, por família, pelo período que interessar.

Porque é que isto não é uma exportação de ficheiros

Trocar ficheiros entre dois programas é fácil de montar e difícil de manter. O trabalho a sério está no meio: fazer corresponder códigos que são diferentes de um lado e do outro, respeitar as regras de cada sistema em vez de escrever por cima delas, e garantir que nada é lançado duas vezes quando alguma coisa corre mal.

É por o código ser nosso que conseguimos tratar do caso específico de cada empresa em vez de pedir à empresa que se adapte ao que o programa aceita. Ver desenvolvimento de software e o código é seu.

Como está construído por dentro

Esta secção é para quem tem um informático interno, ou um fornecedor de confiança, a avaliar a proposta. Fica escrita sem rodeios, porque quem percebe do assunto merece detalhe e não adjetivos. Há detalhes de implementação que não publicamos, pelas razões óbvias, mas o desenho está todo aqui e explicamo-lo ao pormenor numa chamada.

Três peças, e nenhuma delas obriga a abrir um porto

1. Um agente em cada máquina de ERP. Desenvolvido em .NET 8, em C#, corre como serviço Windows no posto. A arquitetura do agente é comum, e o que muda é o adaptador para a base de dados de cada programa. No lado do Cegid PHC, uma API em .NET 8 com Dapper sobre SQL Server, que serve os dados-mestre e importa os documentos que sobem. No lado do ZoneSoft, um worker que fala com o SQL Server Express instalado na própria máquina do posto. No lado do XD, um worker que fala com MariaDB. Cada um deles lê para extrair os documentos a sincronizar e escreve para aplicar os dados-mestre que descem.

2. Um relay online, que funciona como fila fiável. É a peça do meio, com caixa de saída e caixa de entrada, e é ela que permite que as máquinas de ERP só façam ligações de saída. Está desenvolvida em PHP 8.1 sobre MySQL, sem framework, com um único ponto de entrada e um carregador de classes próprio. A opção por PHP simples aqui não é preguiça: esta peça tem de correr em praticamente qualquer alojamento, sem depender de uma pilha que a empresa depois não consiga manter.

3. Um backoffice para ver o que se passa. Aplicação em React 18 com TypeScript, construída com Vite e TailwindCSS, com TanStack Query para os dados e Recharts para os gráficos. Mostra a profundidade da fila, as mensagens que morreram, que nós estão ativos e o registo dos pedidos. É a diferença entre saber que a integração está a funcionar e acreditar que está.

O relay não sabe o que transporta

Esta é a decisão de que temos mais orgulho e é a que costuma decidir a conversa com um responsável de segurança. O conteúdo de negócio é cifrado no próprio nó, antes de sair, com cifra autenticada moderna do tipo XChaCha20-Poly1305 ou AES-256-GCM. O relay recebe blocos cifrados, move-os e entrega-os. Não tem a chave e nunca lê o conteúdo.

A consequência prática é simples de dizer a um administrador ou a um auditor: mesmo que a peça do meio fosse comprometida por inteiro, o que lá está não se lê. As faturas, os preços e os clientes da empresa não estão em texto legível em lado nenhum do percurso.

Como se prova que um pedido é legítimo

Cada pedido que um nó faz ao relay vai assinado, com HMAC-SHA256 ou com Ed25519 através da libsodium. A assinatura cobre o pedido inteiro, incluindo o conteúdo, e vem acompanhada de marca temporal e de um número usado uma única vez, o que fecha a porta a alguém que capture um pedido válido e o repita mais tarde. A verificação é feita em tempo constante, para não deixar pistas por comparação. TLS é obrigatório e os cabeçalhos de segurança habituais estão todos ativos. Há ainda limitação de ritmo por origem, para que ninguém possa martelar o serviço.

Somando: a validação acontece em três camadas independentes. Na origem, em cada máquina de ERP, com assinatura e cifra antes de sair. No relay, com verificação de assinatura, de marca temporal, de repetição e de ritmo. E no backoffice, com acesso autenticado à parte administrativa.

Idempotência e mensagens que falham

Idempotência. Cada nó guarda o seu próprio registo local, em SQLite, do que já aplicou. A mesma mensagem entregue duas vezes não duplica nada. Parece um pormenor de engenharia e é, na prática, o que separa uma integração que se retoma sozinha depois de uma quebra de linha de outra que obriga alguém a comparar tabelas à mão para perceber o que passou e o que ficou a meio. Em documentos fiscais, é o que impede um duplicado.

Fila de mensagens mortas. O que falhar de forma persistente não desaparece nem fica preso num ciclo infinito de tentativas: sai para uma fila à parte, com o erro e o conteúdo original guardados, fica visível no backoffice, e é reprocessado quando a causa estiver resolvida. Uma integração que perde registos em silêncio é pior do que não ter integração nenhuma, porque ninguém fica a desconfiar dos números.

Tudo fica registado. Cada pedido, o ciclo de vida de cada mensagem e todas as falhas ficam num registo central. Quando alguém pergunta, meses depois, se determinada fatura passou e quando, a resposta é uma consulta e não uma suposição.

Que dados sobem e que dados descem

Os documentos fiscais sobem, do ERP do posto para o Cegid PHC. Vão certificados na origem, e o PHC importa-os sem renumerar nem voltar a certificar. É esta a parte que um contabilista atento pergunta primeiro, e é por isso que está desenhada assim.

Os dados-mestre descem, do PHC para os postos: clientes, artigos, preços e existências. Cada worker trata dos dois sentidos para o seu programa, e o sentido define-se tabela a tabela. Se mais tarde fizer sentido inverter alguma coisa, inverte-se por configuração e não por desenvolvimento novo.

E nada disto obriga a abrir um único porto na firewall, pela razão explicada acima: a ligação parte sempre de dentro para fora.

Já está a correr

Está em produção, a trabalhar todos os dias em empresas reais. Nomes e volumes só saem com autorização de quem nos contratou, e é regra que aplicamos a todos os clientes. Numa conversa mostramos o painel a funcionar, que é bastante mais convincente do que qualquer descrição.

O que perguntamos antes de dizer que sim

Que versões de cada programa estão instaladas, que tabelas e campos próprios foram criados ao longo dos anos, quantos documentos passam por dia, e o que tem de acontecer quando os dois lados discordarem. Esta última é a pergunta que separa uma integração que dura de uma que dá problemas ao segundo mês.

Também confirmamos o acesso: mexer nos dados de uma empresa faz-se com autorização escrita de quem manda nela, e não de outra maneira.

Quanto custa

Desde 10 € + IVA por mês. Esse é o valor de entrada, com a integração já a funcionar e com as atualizações e o suporte incluídos.

O valor é mensal e inclui todas as atualizações e o suporte à solução. Isto pesa mais do que parece à primeira vista. Os programas de gestão e os de balcão são atualizados várias vezes por ano, e é quase sempre aí que as integrações partem. Quando isso acontecer, não há orçamento novo nem discussão sobre quem paga o conserto: está incluído.

Uma tabela de preços seria fingir que isto é um produto de prateleira, e não é. Somos uma empresa de consultoria e cada projeto é único: muda com os sistemas que se ligam, com as tabelas e os sentidos que entram, e com o volume que passa todos os dias.

Por isso o primeiro passo é uma avaliação gratuita, feita para perceber qual é a solução mais ajustada às necessidades reais da empresa e não a que dá mais trabalho a faturar. Dela sai um levantamento escrito, com as tabelas e os sentidos identificados um a um, e o valor mensal para aquele caso.

Perguntas frequentes

Respostas diretas

Isto obriga a abrir portos na firewall?
Não obriga, e é uma das razões pelas quais fizemos isto à nossa maneira. A ligação parte sempre de dentro para fora: é o componente instalado dentro da rede da empresa que a inicia. A firewall não precisa de aceitar nada vindo do exterior, não há serviço publicado na internet, e a base de dados do ERP nunca fica exposta. Para quem tem de responder por segurança, uma porta que não existe é uma porta que ninguém pode arrombar.
Dá para integrar só num sentido?
Dá, e o sentido define-se por tabela e não para a integração toda. O caso mais comum é artigos, preços e clientes descerem da gestão para o ponto de venda, e vendas e movimentos de caixa subirem do ponto de venda para a gestão. Se mais tarde fizer sentido mudar alguma coisa de sentido, muda-se por configuração.
Tenho ZoneSoft numas lojas e XD noutras. Serve?
Serve, e é precisamente um dos casos para que foi feito. Os dois podem estar ligados ao Cegid PHC ao mesmo tempo, e também conseguimos ligar o XD diretamente ao ZoneSoft, sem passar por um terceiro sistema. Acontece muito em grupos que cresceram por aquisição e ficaram com programas de balcão diferentes a conviver.
Passam todas as tabelas ou só algumas?
Chegamos a qualquer tabela dos sistemas envolvidos, incluindo campos próprios que a empresa tenha criado ao longo dos anos, que é onde as integrações de catálogo costumam falhar. E filtramos ao nível dos dados: só uma loja, só certas séries de documentos, só uma família de artigos, só a partir de uma data. Passar tudo às cegas raramente é o que a empresa quer.
Como é que sei que está a funcionar?
Pelo painel. Vê o que passou, quando passou e em que volume, e dá para perceber que alguma coisa parou no próprio dia em vez de ao fim da semana. Como acréscimo, dá para tirar relatórios cruzados que nenhum dos sistemas dá sozinho, porque cada um só conhece metade da história: vendas do balcão ao lado de compras e stocks da gestão.
Já está a correr em empresas?
Está em produção, a trabalhar todos os dias. Nomes e volumes só saem com autorização de quem nos contratou, e é regra que aplicamos a todos os clientes. Numa conversa mostramos o painel a funcionar, que convence mais do que qualquer descrição.
Aguenta o volume da minha operação?
Num só cliente nosso passam mais de 2 000 documentos por dia para o Cegid PHC, e no sentido inverso descem todos os dias dezenas de artigos e de preços novos ou alterados para o XD e para o ZoneSoft. É o volume de uma instalação concreta, e não a soma de todos os clientes. A arquitetura é orientada a filas, ou seja, cada documento é uma mensagem independente e não existe uma janela noturna onde tudo tenha de caber: quando o volume cresce, acrescenta-se capacidade de processamento em vez de se reescrever a solução. Se a sua operação for maior do que aquilo que faz sentido, dizemos isso na avaliação gratuita em vez de o descobrirmos os dois ao segundo mês.
Em que tecnologia está feito?
São três peças. Nas máquinas de cada ERP corre um agente em .NET 8 com C#, como serviço Windows: no Cegid PHC uma API em .NET 8 com Dapper sobre SQL Server, no ZoneSoft um worker sobre SQL Server Express, e no XD um worker sobre MariaDB. No meio está um relay que funciona como fila fiável, em PHP 8.1 sobre MySQL, e é ele que permite que as máquinas de ERP só façam ligações de saída. Por cima está um backoffice em React 18 com TypeScript, onde se vê a profundidade da fila, as mensagens que falharam e os nós ativos. Cada nó guarda em SQLite o registo do que já aplicou, e é isso que garante que a mesma mensagem entregue duas vezes não duplica um documento.
Os meus dados ficam legíveis nesse servidor do meio?
Não ficam. O conteúdo de negócio é cifrado dentro da sua rede, no próprio nó, antes de sair, com cifra autenticada moderna do tipo XChaCha20-Poly1305 ou AES-256-GCM. O relay recebe blocos cifrados, move-os e entrega-os: não tem a chave e nunca lê o que transporta. Mesmo que essa peça fosse comprometida por inteiro, as suas faturas, os seus preços e os seus clientes não se leem. Há uma segunda camada por cima desta: cada pedido vai assinado com HMAC-SHA256 ou Ed25519, com marca temporal e número usado uma única vez, o que impede que alguém capture um pedido válido e o repita mais tarde.
Quanto custa?
Começa em 10 € + IVA por mês. O valor é mensal e inclui todas as atualizações e o suporte à solução, o que quer dizer que, quando um dos programas for atualizado e alguma coisa tiver de ser afinada, não há orçamento novo nem discussão sobre quem paga. Acima do valor de entrada não há tabela, porque cada projeto é único: depende dos sistemas que se ligam, das tabelas e sentidos que entram, e do volume diário. Somos uma empresa de consultoria, por isso começamos por uma avaliação gratuita, da qual sai um levantamento escrito e o valor mensal para aquele caso.

Quer um projeto assim na sua empresa?

Conte-nos o desafio: respondemos com uma solução.

Fale connosco