Teste agora
Montei um embarque fictício com os cinco documentos que chegam do fornecedor. Tem alguns erros escondidos neles. Clique em conferir e veja o que o validador encontra.
- XLSInvoice6 itens, preços e totaisBaixar
- XLSPacking listPeças, caixas e pesos por famíliaBaixar
- XLSShipping listCaixa a caixa: lotes, séries e validadesBaixar
- PDFCertificado de análiseLiberação de qualidade lote a loteVerBaixar
- PDFInvoice e packing list assinadosOs documentos finais, com assinatura e carimboVerBaixar
Regras desta demo: validade mínima de 18 meses na chegada (ETA da invoice), fabricação até 6 meses antes da invoice e uma anuência fictícia para o SKU-2214, válida desde 01/06/2025.
Por que isso importa
Comércio exterior é uma cadeia de prazos. Uma quantidade que não bate, um lote repetido ou uma validade curta descoberta tarde vira carga parada no terminal, custo de armazenagem e risco de faltar produto na ponta.
A conferência manual cruza quatro ou cinco documentos linha a linha. É lenta, cansativa e depende de quem está conferindo naquele dia.
Como funciona
A versão desta página faz o mesmo caminho em JavaScript. O SheetJS lê o Excel, o pdf.js lê o texto dos PDFs e as 12 checagens rodam no seu navegador. Só o OCR de PDF escaneado ficou de fora, porque pesaria demais para uma página.
Três níveis de resultado
- FALHA divergência que precisa voltar para o fornecedor antes de aprovar.
- ATENÇÃO ponto para conferir no olho, por exemplo uma leitura duvidosa do OCR.
- OK a checagem passou.
As 12 checagens
| Código | O que confere |
|---|---|
| A | Cabeçalho coerente entre os documentos: exportador, número da invoice e do pedido, faturado para, entregar para, contato. |
| A2 | CNPJ do importador presente, com dígito verificador válido e igual em todos os documentos. |
| B | Quantidade por SKU: invoice x shipping list. |
| C | Quantidade por família: shipping list x packing list, e total geral da invoice x packing list. |
| D | Valores da invoice: quantidade x preço unitário = valor da linha. |
| E | Pesos do packing list: soma das linhas x totais declarados. |
| F | Caixas: shipping list x packing list, inclusive por tamanho de caixa. |
| G | Lotes: quantidade igual ao número de séries, sem série duplicada, sem o mesmo lote em dois códigos. |
| H | Validade mínima na chegada (padrão de 18 meses) e fabricação recente. |
| I | Certificado de análise lote a lote: lote presente, código, séries e validade iguais ao shipping list. |
| J | Documentos finais assinados (PDF) x planilhas: número da invoice, quantidades, caixas e pesos. |
| K | Anuência regulatória: lote fabricado antes da data da anuência do produto é bloqueado. |
Trechos da lógica
Versões simplificadas, escritas para esta página, de duas partes do script.
Ler a página: texto direto ou OCR
def texto_da_pagina(pagina): texto = pagina.get_text() if len(texto.strip()) > 50: # PDF digital: o texto já está lá return texto pix = pagina.get_pixmap(dpi=300) # PDF escaneado: vira imagem img = np.frombuffer(pix.samples, np.uint8).reshape(pix.h, pix.w, pix.n) cinza = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) _, pb = cv2.threshold(cinza, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) return pytesseract.image_to_string(pb)
Validade mínima e fabricação recente
def checar_validade(lote, data_chegada, meses_min=18, meses_fab_max=6): restantes = meses_entre(data_chegada, lote.validade) if restantes < meses_min: return "FALHA", f"Lote {lote.numero} chega com {restantes} meses (mínimo {meses_min})" if meses_entre(lote.fabricacao, data_chegada) > meses_fab_max: return "ATENCAO", f"Lote {lote.numero} fabricado há mais de {meses_fab_max} meses" return "OK", f"Lote {lote.numero} dentro do prazo"
O que aprendi
- OCR erra de formas previsíveis. Letra O vira zero, I vira 1, carimbo colorido vira ruído. Por isso a leitura duvidosa vira ATENÇÃO, não FALHA.
- Cache por página faz diferença. Rodar de novo depois de corrigir um documento leva segundos, porque só as páginas novas passam pelo OCR.
- A data da invoice nem sempre é a data do embarque. A data real de saída fica no conhecimento de transporte, e isso muda a conta da validade.
Sobre o código: o script original trabalha com documentos reais de fornecedores e não é público. A versão desta página foi reescrita em JavaScript e o kit de exemplo foi montado do zero: empresas, produtos, lotes e números são inventados.