Pular para o conteúdo

Todos os trabalhosExtrator de notas

Total errado na nota fiscal.

Nota fiscal e pedido de compra em PDF ou foto viram dados conferidos. A IA lê o documento; o código refaz quantidade vezes preço, soma dos itens e total, valida CNPJ, inclusive o novo alfanumérico, e confere o dígito da chave de acesso. É uma demonstração com documentos e empresas fictícios.

Estado
demonstração
Período
09/2026
Stack
Python 3.12, FastAPI, API de IA com saída estruturada, Pydantic, openpyxl, reportlab, pytest

Feito por mim

Servidor, validação e exportações em Python, e a tela de conferência.

Contexto

Documentos e empresas fictícios, sem cliente real.

Por dentro

Transcrever, nunca corrigir

O modelo é instruído a copiar o que está impresso, mesmo errado. Se corrigisse, a validação nunca veria o erro do documento. A amostra tem um erro de propósito: 25 x 18,90 impresso como 427,50, e o sistema acusa na linha e no subtotal.

Dois esquemas

Mandar o modelo com 28 campos opcionais deu "400 Schema is too complex". A saída foi ter um esquema de transporte com todos os campos obrigatórios e um esquema de domínio, com teste de ida e volta sem perda.

CNPJ de 2026

O CNPJ alfanumérico vale desde julho de 2026: cada caractere conta como o código dele menos 48, e os dois dígitos finais continuam numéricos. O mesmo cuidado vale para a chave de acesso. Nas contas, dinheiro vira Decimal, nunca float, com tolerância pela menor unidade da moeda.

Python
def is_valid_cnpj(raw: str) -> bool:
    s = re.sub(r"[.\-/\s]", "", raw or "").upper()
    if not re.fullmatch(r"[0-9A-Z]{12}[0-9]{2}", s) or len(set(s)) == 1:
        return False
    vals = [ord(c) - 48 for c in s[:12]]
    w1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
    d1 = _cnpj_digit(vals, w1)
    d2 = _cnpj_digit(vals + [d1], [6] + w1)
    return s[12:] == f"{d1}{d2}"

Como sei que funciona

Numa execução real de 25/09/2026, com 3 documentos fictícios: 53 de 53, 47 de 47 e 53 de 53 campos corretos, entre 9,9 e 11,4 segundos cada. Três documentos e uma rodada: não é benchmark.

O que isso não faz

  • É uma demonstração. Não está em uso por cliente nem mede precisão em documentos reais.
  • Se a API falhar, há uma nova tentativa; não é uma fila de reprocessamento.

Telas

Tela de conferência dos dados extraídos de uma nota fiscal fictícia
Conferência dos dados, com documento fictício.

O que quebrou

  1. Na primeira rodada, a chave da nota veio com 42 e 43 dígitos.

    A validação da chave pegou. O relatório daquela rodada fica guardado com o código.

Créditos: Demonstração com documentos fictícios, sem cliente real.

Me conta o problema.

Uma mensagem basta para começar. Eu mesmo respondo e, se fizer sentido, mando uma proposta por escrito: o que entra, o que fica de fora, prazo e preço.

WhatsApp (11) 99227-9903