Catálogo de Funcionalidades
Tudo que tem no Quotery, organizado por etapa. Do PDF do cliente ao pedido entregue.
Capturar — Transforme pedidos de clientes em cotações estruturadas
A IA lê documentos de clientes e cruza cada linha com seu catálogo de produtos. O que levava 20 minutos agora leva menos de 60 segundos.
Importação de Cotação por IA
Pipeline de IA em 3 chamadas
VendasExtração de estrutura, cruzamento de produtos e resumo — três chamadas sequenciais de IA em uma única transação atômica.
- Chamada A: Extrai grupos, seções e itens de texto não estruturado usando saídas estruturadas de IA
- Chamada B: Decisão paralela em lote de IA — até 6 workers concorrentes selecionando entre 15 candidatos
- Chamada C: Banner de resumo com reconhecimento de idioma renderizado localmente por padrão, IA apenas quando ativada
Cruzamento determinístico por 4 códigos
VendasCombina códigos de fornecedor com SKU, import_code, internal_code e export_code antes de qualquer chamada de IA. Você só paga pelo que a IA realmente processa.
- Correspondência exata sensível a maiúsculas nas quatro colunas de código de produto
- Matches exatos pulam a decisão da IA totalmente — determinísticos e gratuitos
- Classificação: exact_match (verde), ai_decision (azul), not_found (rosa)
- Proteção contra alucinação: rejeita seleções do modelo fora da lista apresentada
Importação em múltiplos formatos
VendasAceita PDF, XLSX, XLS, CSV ou texto colado — qualquer formato que seu cliente mandar.
- Upload de arquivos até 20 MB
- Texto colado de 10 a 100.000 caracteres
- Sempre gera uma cotação em rascunho para revisão humana — nunca envia sozinho
Catálogo de Produtos
Quatro códigos de produto paralelos
AdminSKU + import_code + internal_code + export_code — o motor de importação por IA cruza com todos os quatro.
- SKU único dentro do tenant, validado na criação
- Todas as quatro colunas de código indexadas para busca trigrama
- Códigos alimentam o estágio de correspondência determinística da importação por IA
Fluxo de produto temporário
AdminVendedores criam produtos na hora. Cotações com produtos não aprovados são bloqueadas de envio até aprovação por admin.
- Produtos temporários forçados para is_approved=false no backend
- Cotações com produtos não aprovados bloqueadas para envio, fechamento e exportação PDF
- Alternância de aprovação inline para admins e gerentes
Importação determinística de produtos
AdminImporte catálogos de produtos do Excel com classificação e resolução linha por linha.
- Classificação de linhas: novo, duplicado, SKU duplicado, unidade inválida, preço inválido, duplicado parcial
- Controles de resolução em lote com filtragem por abas
- Pré-visualizações persistem no servidor por 24 horas
Cotar — Ajuste, precifique e envie
Um editor completo com seções de arrastar e soltar, precificação reversa e rascunhos de follow-up por IA.
Editor e Ciclo de Vida da Cotação
Máquina de estados completa
VendasRascunho → Enviada → Fechada → Parcialmente Entregue → Entregue, mais ramificações de cancelar e reabrir.
- Rascunho e enviada são os estados editáveis — edições rejeitadas após fechamento com HTTP 409
- Cancelar a partir de fechada libera todas as reservas de estoque
- Reabrir de cancelada para rascunho ou enviada; reabrir de fechada libera reservas
- Parcialmente entregue e entregue são terminais — deve usar notas de devolução
Numeração contínua Q-AAAA-NNNN
VendasNumeração sequencial por tenant e por ano alocada sob bloqueio pessimista.
- SELECT ... FOR UPDATE na tabela QuoteNumberSequence
- Garante ausência de lacunas e duplicatas dentro do tenant/ano
- Alocada dentro da transação de criação
Editor completo com precificação reversa
VendasSeções de arrastar e soltar, atalhos de teclado e cálculo de desconto por valor total.
- Reordenação por arrastar e soltar de linhas e cabeçalhos de seção
- Digite um subtotal ou total alvo — desconto calculado reversamente com 6 casas decimais
- Notas por linha, substituições de descrição e agrupamento por seção
- Limites de desconto aplicados por tenant — admins e gerentes isentos
PDFs de cotação com marca do tenant
VendasPDF Carta com logo, cor de destaque, itens agrupados e rótulos localizados em 3 idiomas.
- Logo do tenant + cor de destaque aplicados à faixa principal e cartão de totais
- Linhas agrupadas por seção; linhas de importação não correspondidas excluídas
- Rótulos, datas e formatação monetária localizados por idioma
- Bloqueado enquanto qualquer linha referencia um produto temporário não aprovado
Rascunho de E-mail de Follow-up por IA
IA redige follow-ups — você envia
VendasE-mails de follow-up redigidos por LLM para cotações enviadas paradas há 3+ dias. Você revisa, edita e envia. A IA nunca envia sem você.
- Disponível apenas em cotações no status enviada paradas há 3+ dias
- PII minimizado: prompt contém apenas nome do cliente, 3 principais itens, total, data de validade
- Pontuação de confiança: baixa para clientes novos, alta caso contrário
- Detecção de alertas: rastreia promessas de desconto não autorizadas, menções de entrega gratuita
- Controlado pela flag ai_followup_enabled do tenant
Fechar — Cliente aceita, estoque reserva
Portal do cliente tokenizado com assinatura eletrônica, mais porta de aprovação financeira opcional.
Portal do Cliente
Acesso anônimo por token
Cliente revisa, aceita ou solicita alterações — sem conta, sem senha, sem atrito.
- Tokens Django assinados com expiração configurável (padrão 30 dias)
- Revogação de token via soft-delete ou expiração
- Consultas entre tenants retornam 404, não 403
Aceite eletrônico com SHA-256
Assinatura eletrônica por nome digitado com hash do nome, email, ID da cotação e timestamp.
- Hash SHA-256 vincula os quatro campos canônicos juntos
- Idempotente: aceite duplicado retorna linha existente com already_accepted=true
- Aceite transiciona cotação para fechada, aciona reserva de estoque
- Evento de auditoria registrado com metadados completos
Solicitações de alteração e thread de conversa
Cliente pode solicitar alterações inline. Conversa inteira — mensagens de vendas + solicitações do cliente — exibida em ordem.
- Solicitação de alteração em texto livre cria uma linha QuoteChangeRequest
- Vendedor notificado via in-app + e-mail
- Painel de conversa renderizado estilo WhatsApp acima dos botões de ação
Download de PDF protegido por token
Mesmo PDF com marca que a exportação autenticada, autorizado exclusivamente pelo token do portal.
- Registra evento de auditoria com actor=None, token_id, recipient_email, locale
- Linhas de importação não correspondidas excluídas; produtos não aprovados bloqueiam exportação
- Locale resolvido de cookie → Accept-Language → en-US
Aprovação Financeira
Porta de aprovação opcional por tenant
FinanceiroPausa cotações aceitas em ready_for_billing até finanças confirmar pagamento. Estoque não reserva até pagar.
- Controlado pela flag Tenant.requires_finance_approval (desligada por padrão)
- Máquina de estados de pagamento: pending → paid / failed / cancelled
- Transição paid executa a maquinaria padrão de fechamento (reservar estoque + rascunho de NF)
- Reverter de paid permitido apenas quando nenhuma NF foi enviada
Notificações ao cliente e distribuição interna
FinanceiroFinanças notifica explicitamente o cliente; equipe interna notificada em cada transição.
- Notificações ao cliente inserem linha append-only QuotePaymentNotification
- Distribuição interna para proprietário de vendas, gerentes e admins em cada transição
- Banner do portal do cliente orientado por notificações, não pelo status bruto de pagamento
Reserva de Estoque
Reserva automática no fechamento
Fechar uma cotação reserva estoque atomicamente. Sobre-reserva é permitida — faltas voltam como lista, não como erro.
- Linhas RESERVATION StockMovement escritas por linha rastreável
- Linhas StockItem bloqueadas com select_for_update em ordem determinística de produto
- Sobre-reserva: fechamento nunca retorna 409 por estoque insuficiente
- Array de faltas identifica produto, localização e quantidade disponível resultante
Entregar — Separar, embalar, enviar e devolver
Notas de entrega, app mobile para motorista, devoluções, recebimentos e um livro-razão completo de estoque.
Notas de Entrega
Ciclo de vida Rascunho → Enviada → Entregue
ArmazémGerada automaticamente no fechamento da cotação. Criação manual a partir de cotações fechadas. Continuação para entregas parciais.
- NF em rascunho gerada automaticamente cobre todas as linhas rastreáveis no fechamento
- Local de armazém por linha — divida uma entrega entre vários armazéns
- Lançamento escreve entradas Delivery no livro-razão e decrementa em estoque
- NF de continuação criada automaticamente para quantidades não entregues após lançamento parcial
PDFs de entrega com código QR
ArmazémPDFs com marca incluindo localizações de corredor, subtotais por seção e códigos QR escaneáveis.
- Código QR codifica o número da nota de entrega para escaneamento móvel
- Corredor resolvido pela tripla (produto, localização, fornecedor consignante)
- Blocos de assinatura para motorista e recebedor
App Mobile do Motorista
Superfície móvel dedicada em /delivery
MotoristaMotoristas veem apenas notas enviadas e entregues — nunca rascunhos. Escaneamento QR, captura de foto, confirmação em um toque.
- Acesso restrito apenas a usuários do grupo Driver
- Endpoint reforçado filtra todas as notas de entrega não enviadas
- Até 3 fotos por entrega, 10 MB cada, armazenadas no banco de dados da aplicação
- Confirmação final transiciona NF para Entregue, recalcula status da cotação pai
- Notificações pós-entrega excluem o próprio motorista
Devoluções e Recebimentos
Notas de devolução vinculadas a entregas
ArmazémRastreie o que volta com motivo e condição. Lançamento incrementa estoque sem afetar reservado.
- Dois modos de criação: vinculado à entrega (linhas pré-preenchidas) ou geral (digitação)
- Motivos de devolução: Danificado, Excesso, Recusado pelo cliente, Item errado, Outro
- Condições: Revendável, Danificado, Inspecionar
- Lançamento escreve entradas Return no livro-razão — status da cotação pai não afetado
Recebimentos de estoque com flag consignado
ArmazémReceba inventário de fornecedores. Flag consignado rastreia estoque de propriedade do fornecedor separadamente.
- Alternância de estoque consignado cria itens de estoque vinculados ao fornecedor consignante
- Lançamento escreve entradas Receipt; cancelamento escreve entradas Receipt reversal
- Custo unitário capturado no recebimento — reservado para funcionalidades futuras de custeio
- Criação rápida inline de fornecedor a partir do formulário de recebimento
Livro-Razão de Movimentos de Estoque
Livro-razão apenas para acréscimo
Armazém7 tipos de movimento. Cada alteração no estoque disponível ou reservado registrada. Sem modificação, sem exclusão — mesmo para admins.
- Tipos de movimento: Receipt, Receipt reversal, Reservation, Release, Delivery, Return, Adjustment
- Cada linha referencia seu documento de origem (cotação, NF, ND, RE)
- Filtrável por produto, localização, tipo de movimento e intervalo de datas
- Exportável como PDF com marca
Central do Armazém
Painel operacional agregado em /warehouse
ArmazémVisão em tela única de todo o trabalho de fulfillment em andamento — entregas, devoluções, recebimentos — com contadores KPI e feed de atividades mesclado.
- 3 cartões de contador KPI: contagens de rascunhos e lançados para entregas, devoluções, recebimentos
- Feed de atividades mesclado intercalando os três tipos de documento por updated_at
- Links laterais para visão geral de estoque, estoque consignado e livro-razão de movimentos
- Apenas no cliente — não introduz novos endpoints ou mutações
Saber — Faça perguntas, obtenha insights
Perguntas e respostas com IA, resumos diários, dashboards, relatórios e notificações.
Pergunte à IA
Perguntas em linguagem natural em 3 idiomas
VendasPergunte sobre cotações, clientes, estoque e operações em português, inglês ou espanhol. Receba respostas estruturadas com gráficos e tabelas.
- Métricas: count_quotes, sum_revenue, count_clients, avg_cycle_time_days
- Agrupamentos: client, user (vendedor), month, status
- Ramificação determinística de estoque trata prompts de inventário sem chamada LLM
- Escotilha de recusa: modelo recusa perguntas fora de escopo em vez de adivinhar
- Escopo por usuário: usuários comerciais veem apenas seus próprios dados com um banner
Resumo Diário por IA
Cartões de ação personalizados todas as manhãs
VendasResumo gerado por IA uma vez ao dia do que precisa da sua atenção. Consciente do cargo — cartões diferentes para vendas, gerentes e admins.
- Gerado uma vez por usuário por dia — constraint única em (tenant, user, date)
- Prompt consciente do cargo: comercial recebe CTAs pessoais, gerentes recebem CTAs da equipe
- Tipos de cartão: follow_up, stale_draft, reorder_opportunity, recent_win, quote_risk e mais
- Cartões estruturados com níveis de prioridade, tipo de ícone, texto de insight e botões CTA
- Limitado a 8 cartões no máximo com validação e sanitização
Relatórios e Dashboards
5 painéis de dashboard
GerentePipeline por status, distribuição de aging, principais clientes, principais vendedores e taxa de conversão — tudo em uma chamada de API.
- Único GET /api/reports/dashboard/ retorna todos os 5 painéis
- Parâmetro de janela: 30d, 90d ou ytd (padrão 90d)
- Cache Redis por tenant por janela, rotacionado automaticamente na virada do dia UTC
- Widget de cotações no mapa com busca de centroide de CEP no lado do cliente
7 modos de relatório de cotação
GerenteRegistro, aging, expirando, follow-up, ganhos-perdas, descontos e importações-IA — cada um com filtros estruturados e exportação PDF.
- Filtros estruturados: tokens de status, UUIDs de proprietário, seletores de data, formatação monetária, percentuais de desconto
- Busca em texto livre com debounce a partir de 3 caracteres
- PDF exporta o conjunto de dados filtrado completo, não apenas a página atual
6 modos de relatório de estoque
ArmazémAtual, exceções, consignado, movimentos, velocidade de consumo e demanda prevista — com seções de metodologia analítica.
- Velocidade de consumo: destaque de risco quando restam ≤30 dias de suprimento
- Demanda prevista: destaque de déficit positivo, envelope de dados insuficientes abaixo de 30 cotações/ano
- Filtros de entidade validados como UUIDs antes da avaliação do queryset
Exportações CSV em streaming
GerenteCotação única, dashboard e CSVs de uso de produtos — transmitidos linha por linha, nunca mantidos em memória.
- Usa Django StreamingHttpResponse com gerador produzindo uma linha por vez
- Memória constante independentemente do tamanho do conjunto de dados — seguro para exportações de 50.000+ linhas
Notificações
In-app + e-mail, com consciência de audiência
Cotação aceita, alteração solicitada, entrega concluída, estoque consignado movimentado, estoque disponível novamente — cada um com a audiência correta e opções por tenant.
- Feed in-app com badge de não lidos, marcar como lido individualmente ou em lote
- E-mail transacional com HTML + parte texto plano autoprojetada
- Distribuição com consciência de audiência: supervisores, armazém, vendedor recebem CTAs diferentes
- Detector de estoque disponível: reverifica todas as cotações abertas após qualquer aumento de estoque
- Chave de deduplicação previne notificações repetidas para o mesmo evento
Fundação — Multi-tenancy, segurança e infraestrutura da plataforma
A base arquitetural que torna tudo acima possível.
Multi-Tenancy
Isolamento estrito de tenants
Cada consulta ao banco de dados carrega um filtro de tenant obrigatório. Consultas entre tenants retornam 404, não 403.
- ID do tenant injetado da sessão autenticada — nunca do payload da requisição
- Consultas entre tenants indistinguíveis de não encontrado para prevenir inferência
- Configuração por tenant: marca, assentos, imposto, limites de desconto, opções de notificação, texto de documentos
Autenticação
OAuth Google Workspace + Microsoft 365
Login com verificação de domínio e provisionamento automático de usuário. Domínios de consumidor rejeitados explicitamente.
- Apenas e-mails verificados de domínios de tenant autorizados são permitidos
- Primeiro login: provisiona automaticamente usuário com foto de perfil do provedor
- Logins subsequentes: reutiliza registro existente, atualiza apenas foto de perfil
E-mail/senha com ingresso por mesmo domínio
Autenticação por senha para tenants sem SSO. Cadastros no mesmo domínio ingressam no tenant existente automaticamente.
- Cadastro com domínio não reivindicado cria novo tenant + primeiro admin
- Cadastro com domínio reivindicado não-SSO ingressa como vendedor (capacidade de assentos aplicada)
- Tenants com SSO obrigatório rejeitam login por senha com erro claro
Convites de equipe com controle de assentos
Admins e gerentes convidam por e-mail. Tokens expiram em 7 dias. Capacidade de assentos verificada no convite, aceite e reativação.
- Convidado recebe link único, define senha, atribuído ao cargo escolhido pelo convidador
- Convites pendentes exibidos junto a usuários ativos com controles de reenviar/revogar
- Limite de sessões concorrentes: 2 sessões ativas por usuário (configurável por assinante)
Equipe e Cargos
48 códigos de permissão, 5 grupos padrão
Admin, Gerente, Vendedor, Operador de Armazém e Motorista — cada um pré-configurado com as permissões certas para seu trabalho.
- Grupos padrão são somente leitura e aplicados no backend
- Grupos personalizados compostos livremente do catálogo de 48 códigos via grade de checkboxes
- Permissões organizadas por área: usuários, clientes, cotações, inventário, produtos, relatórios, fulfillment, motorista, fornecedores, auditoria, importações IA
Trilha de Auditoria
Auditoria apenas para acréscimo de cada ação material
Linhas de auditoria escritas na mesma transação que a ação. Exclusão de entidades auditadas anula FKs mas preserva o payload do evento.
- Busca em texto livre nos metadados com debounce de 300ms
- Filtragem multi-seleção por ação, tipo de alvo e ator
- Metadados expansíveis por linha com controle de Cópia
- Sem interface de admin para modificação ou exclusão de linhas de auditoria
Internacionalização
3 idiomas, cobertura completa
en-US, pt-BR e es-US em toda a UI, e-mails transacionais e documentos PDF. Terminologia consistente em todas as superfícies.
- Cada string visível, toast, erro e rótulo traduzido
- E-mails transacionais com botões CTA localizados
- Documentos PDF: rótulos, datas e formatação monetária localizados
- Cascata de idioma: cookie → navegador Accept-Language → fallback en-US
- Usuários autenticados: preferência salva sobrepõe cookie e navegador
Cobrança
Gestão de assinaturas Stripe
Planos, assentos e intervalos de cobrança gerenciados via Stripe. BD é fonte da verdade — Stripe reconciliado para corresponder.
- Um Stripe Product por Plano, um ou dois Stripe Prices por PlanPrice
- Stripe Prices imutáveis: alterar valor cria novo Price, arquiva o antigo
- Livro-razão append-only PlanPriceHistory de IDs de Stripe Price arquivados
- Aplicação de alterações no fim do ciclo: downgrades, reduções de assentos, trocas de intervalo aplicadas no fim do período
Segurança e Performance
Controles de defesa em profundidade
Disciplina de cache, throttling, indexação de banco de dados, disciplina de concorrência e aplicação de orçamento de consultas.
- Cache: cada chave com namespace de tenant, invalidação na mesma transação atômica, falha do Redis não é fatal
- Throttling: endpoints públicos com limite de taxa por IP, endpoint Ask 20 req/min por usuário
- Índices GIN trigrama em todos os campos de texto pesquisáveis; índices compostos em combinações comuns de filtros
- Bloqueios pessimistas adquiridos em ordem determinística para concorrência sem deadlocks
- Suite de testes de regressão aplica orçamento de consultas por rota para prevenir regressões N+1