Pedido faturado duas vezes: ninguém digitou, a integração respondeu duas vezes

O pedido 88214 foi faturado duas vezes. Mesma quantidade, mesmo cliente, mesma data — dois documentos. Ninguém digitou duas vezes, ninguém errou de tela. A integração com a transportadora respondeu duas vezes, e o sistema acreditou nas duas.

Esse é o defeito mais chato da operação de distribuição, porque ele não quebra nada. O processo segue, o caminhão sai, a nota é emitida. O erro aparece depois — na conciliação, no estoque negativo, ou no telefonema do cliente perguntando por que recebeu cobrança dobrada.

Em uma frase — integração que não sabe reconhecer a mesma mensagem chegando duas vezes não é integração, é sorte — e sorte acaba no dia de maior volume.

Por que a mensagem chega duas vezes

Não é defeito exótico. É o comportamento normal de qualquer transporte que não pode garantir entrega exatamente uma vez.

O tempo limite que não é fim. A transportadora manda a confirmação, sua API demora a responder, o tempo limite estoura do lado dela. Ela reenvia. Mas a primeira chegou e foi processada — só a resposta se perdeu no caminho.

A repetição automática. Toda fila séria repete em caso de falha. Se a falha é na resposta e não no processamento, a repetição vira duplicata.

O reprocessamento manual. Alguém vê a mensagem em erro, corrige e manda de novo — sem saber que a original tinha passado.

Os dois canais. A mesma informação chegando por arquivo e por API, cada uma com seu horário, porque a migração de um para o outro nunca foi concluída.

por que a mesma mensagem chega duas vezes: tempo limite do lado do parceiro, repetição automática da fila, reprocessamento manual e dois canais ativos ao mesmo tempo — quatro origens, um mesmo resultado duplicado
Quatro origens diferentes, o mesmo resultado. Nenhuma delas é evitável — todas são tratáveis.

A solução tem nome e é mais simples do que parece

Chama-se chave de idempotência: um identificador que a origem gera e repete em toda reenvio da mesma operação. Quem recebe guarda a chave, e quando ela volta, responde “já processei” em vez de processar de novo.

A parte difícil não é o conceito. É acordar com o parceiro qual campo é a chave — e essa conversa quase nunca acontece.

Uma verificação que costuma render no dia seguinte, direto na base:

-- mesma remessa, mesmo parceiro, mensagens diferentes
SELECT a.docnum, b.docnum, a.mestyp, a.rcvprn,
       a.credat, a.cretim, b.credat, b.cretim
  FROM edidc AS a
  JOIN edidc AS b ON  b.mestyp = a.mestyp
                  AND b.rcvprn = a.rcvprn
                  AND b.docnum > a.docnum
 WHERE a.status = '53'
   AND b.status = '53'
   AND a.credat >= '20260801'
 ORDER BY a.credat, a.cretim;

O resultado quase nunca é vazio, e boa parte é legítima — o mesmo tipo de mensagem para o mesmo parceiro acontece o tempo todo. O que interessa são os pares com poucos segundos ou minutos de diferença, porque duplicata de repetição tem assinatura temporal: ela chega colada.

O que dá errado, com nome

Deduplicar pelo campo errado. Usar número do pedido como chave falha quando o mesmo pedido tem, legitimamente, duas remessas parciais. A chave precisa identificar a operação, não o documento de negócio.

Deduplicar só na janela curta. Guardar as chaves das últimas duas horas resolve a repetição imediata e não resolve o reprocessamento manual, que acontece no dia seguinte. A janela precisa cobrir o comportamento humano, não só o da fila.

Tratar como erro em vez de estado. Mensagem repetida não é falha — é o esperado. Se ela cai na fila de erro, alguém vai reprocessá-la e criar a terceira cópia.

Descobrir pela reclamação do cliente. É o custo mais alto e o mais comum. A duplicata existe há semanas, encostada, e a primeira pessoa a notar está do lado de fora.

Antes de programar qualquer coisa — três acordos com o parceiro, por escrito: qual campo é a chave de idempotência e se ele muda em reenvio; por quanto tempo cada lado guarda a chave; e o que a sua resposta significa — “recebi” não é “processei”, e confundir os dois é a origem de metade das repetições. Esses três acordos custam uma reunião e evitam meses de conciliação.

Onde a IA ajuda de verdade aqui

A deduplicação em si é regra determinística e deve continuar sendo — ninguém quer um modelo decidindo se dois pedidos são o mesmo. Mas três partes caras do trabalho são leitura e comparação.

Achar os pares suspeitos no histórico. Varrer meses de mensagens e propor quais pares têm assinatura de duplicata é comparação em volume, com critério observável.

Ler o layout do parceiro e apontar o candidato a chave. Documentação de integração é longa e a parte que interessa são dois campos. É o mesmo raciocínio que aplicamos em observar o ciclo bancário antes de automatizar.

Explicar por que aquela mensagem específica falhou. Cruzar o erro com o histórico do parceiro encurta a investigação.

Onde ela não entra: cancelar documento, estornar faturamento e decidir o que fazer com a carga que já saiu. Essas três continuam com gente.

O limite honesto

Idempotência bem feita elimina a duplicata técnica. Ela não elimina a duplicata de negócio — o cliente que realmente pediu duas vezes, o vendedor que lançou o mesmo pedido em dois canais. Esses casos são idênticos aos olhos do sistema e diferentes aos olhos da operação, e nenhuma regra automática resolve sozinha.

E há um limite de fronteira: se o parceiro não gera chave estável, você não tem o que guardar. Dá para contornar com impressão digital do conteúdo, mas é aproximação — duas remessas legitimamente idênticas existem, e a aproximação vai bloquear uma delas em algum momento.

O que muda é onde o problema é encontrado. Com o ciclo observado, a duplicata aparece em minutos, no painel, antes de virar nota fiscal. Sem isso, aparece na conciliação do mês — ou no telefone.

Se o ponto de partida é entender o que existe hoje antes de mexer, comece pelo diagnóstico de TI. Para o panorama do setor, veja TI para serviços e distribuição. E se o volume de documentos chegando é a dor imediata, o caminho é ler o XML e classificar dentro do SAP.

Perguntas frequentes

O que é uma chave de idempotência numa integração?

É um identificador que a origem gera e repete em todo reenvio da mesma operação. Quem recebe guarda a chave e, quando ela volta, responde “já processei” em vez de processar de novo. É o que separa mensagem repetida de pedido novo.

Por que a mesma mensagem chega duas vezes se ninguém mandou duas vezes?

Porque nenhum transporte garante entrega exatamente uma vez. As quatro origens comuns são o tempo limite do lado do parceiro — a mensagem chegou e só a resposta se perdeu —, o reenvio automático da fila, o reprocessamento manual de uma mensagem que já tinha passado, e dois canais ativos ao mesmo tempo.

Dá para deduplicar pelo número do pedido?

Não com segurança. O mesmo pedido pode ter, legitimamente, duas remessas parciais. A chave precisa identificar a operação, não o documento de negócio — caso contrário a segunda remessa válida é bloqueada como se fosse duplicata.

Por quanto tempo guardar a chave?

Tempo suficiente para cobrir comportamento humano, não só o da fila. Guardar as últimas duas horas resolve o reenvio automático e não resolve o reprocessamento manual, que costuma acontecer no dia seguinte.