Visão Geral
Quotery é um SaaS B2B multi-tenant que transforma pedidos de compra recebidos — PDFs, planilhas Excel, listas CSV de itens — em cotações precificadas, correspondidas e auditáveis em minutos. Construído para distribuidores, empreiteiros e prestadores de serviço ágeis, combina uma orquestração OpenAI de três chamadas com um matcher determinístico baseado em códigos, para que correspondências exatas nunca consumam tokens de LLM. Do rascunho da cotação à nota de entrega emitida, todo o caminho quote-to-cash vive em uma só plataforma.
O Desafio
Equipes de vendas B2B passam horas redigitando pedidos de compra de clientes em softwares de cotação, cruzando descrições de produto em texto livre contra catálogos que usam múltiplas convenções de código (fornecedor, interno, importação, exportação) e redigitando os mesmos dados em ferramentas de fulfillment e estoque. ERPs de prateleira são pesados e lentos de configurar; planilhas improvisadas perdem rastreabilidade no momento em que um ajuste de estoque acontece.
A Solução
Construímos o Quotery como um backend Django 5 + DRF escopado por tenant, com uma SPA React 19 e um site institucional implantado na Render. Todo modelo de negócio herda uma classe base com chave UUID e soft-delete, toda consulta é filtrada automaticamente por tenant e toda mutação da camada de serviço invalida um conjunto preciso de grupos de cache no Redis (dashboard, product-usage, quotes-map) usando um padrão de chave qf:v1:<grupo>:<escopo>:<hash> que falha silenciosamente em caso de queda do Redis. A importação de cotação por IA executa três chamadas OpenAI sequenciais dentro de uma transação atômica: extração de estrutura a partir de PDF (pypdf), XLSX (openpyxl), CSV ou texto puro; correspondência determinística contra quatro campos de código de produto, seguida por uma decisão pick-or-reject da LLM em lote sobre linhas não correspondidas, com proteção anti-alucinação; e um resumo de 1 a 3 frases sensível ao idioma. Cotações percorrem uma máquina de estados formal (draft -> sent -> closed -> partially_delivered -> delivered) que alimenta um livro-razão de estoque append-only em múltiplos locais, permitindo super-reserva para que vendas possam se comprometer antes da entrada de um recebimento. Notas de entrega, notas de devolução e recibos de estoque compartilham um mesmo fluxo rascunho-para-emitido. PDFs são renderizados via WeasyPrint, a autenticação é Google OAuth via django-allauth com JWT baseado em sessão em cookies HttpOnly, o RBAC usa um catálogo de permissões personalizado e toda mutação é registrada em um log de auditoria imutável. Um assistente embarcado responde perguntas sobre cotações, clientes e estoque exatamente onde o usuário perguntou.