Este é o módulo onde o estoque vira dinheiro. No fluxo macro do iMportex (compra no Paraguai → triagem/laudo → assistência quando precisa → inventário → expedição pra SP → venda), este capítulo cobre a ponta final: cadastrar o lojista que compra, colocar preço no aparelho, opcionalmente mandar uma proposta (cotação) antes de fechar, lançar a venda em si, imprimir o pedido pro cliente e — em raras situações — apagar os dados pessoais de um cliente por exigência da LGPD (Lei Geral de Proteção de Dados).
Duas reformas de agosto/2026 mudam praticamente tudo aqui: (1) a KL passou a vender em duas moedas com uma trava dura no banco de dados — BRL só usa estoque que já chegou em São Paulo (SP); USD só usa estoque que ainda está no Paraguai (PY) — e (2) apareceu a grade MIX, uma linha de venda que deixa o estoquista escolher a composição exata (A, AB ou B) só na hora de separar o pedido, em vez de o vendedor prometer uma grade fixa que pode não ter fisicamente. A Cotação B2B (proposta formal, com link público pro cliente) entrou no ar em 20/08 e zerou o "a KL vende pelo WhatsApp e nada fica registrado". O Trade-in foi desativado em 22/08 por decisão do dono — o sistema não existe pra comprar aparelho usado de cliente, e essa frente saiu do escopo.
Fluxo do módulo em 1 olhada
- Cadastrar o cliente (
/clientes) — nasce sem crédito, só compra à vista. ADMIN ou GERENTE aprovam um limite (em R$ e/ou US$) depois, se o histórico justificar. - Ter preço definido (
/precificacao) — ADMIN/GERENTE mantêm a tabela de preços por modelo+capacidade+grade (e por faixa de bateria, quando o aparelho tem menos de 80% de saúde). Sem preço na tabela nem override no aparelho, ele fica na fila "Estoque sem preço" e não tem como ser vendido direito. - (Opcional) Montar uma proposta (
/cotacoes) — o vendedor monta "10 iPhone 15 128GB grade AB" sem escolher IMEI, manda o link pro cliente e o estoque fica reservado enquanto ele decide (72h padrão). - Fechar a venda (
/vendas) — direto (balcão) ou convertendo uma cotação aceita. Aqui entram as travas de moeda×estoque, o piso de margem, o limite de crédito e a aprovação de desconto. - Entregar — a venda gera um pacote de expedição (se não for retirada no balcão) e a comissão do vendedor (R$3/aparelho, regra configurável).
- Imprimir/compartilhar o pedido (
/vendas/[id]/imprimir) — romaneio para o cliente levar ou o vendedor mandar por WhatsApp. - (Raro) Encerrar a relação com o cliente (
/clientes/[id]/lgpd) — ADMIN exporta os dados e anonimiza o cadastro, mantendo o histórico financeiro.
/trade-in está desativado — documentado mais abaixo nesta página, por
completude.
Clientes

Pra que serve: cadastro de quem compra da KL (lojistas atacado, ponta de linha) e gestão do crédito que cada um tem pra comprar a prazo. Também é daqui que se revela o telefone/WhatsApp cifrado (guardado de forma criptografada, ilegível até alguém pedir pra ver) de um cliente.
Quem usa: qualquer perfil autenticado pode cadastrar/editar um cliente — mas a lista que ele enxerga depende de uma trava de visibilidade que roda direto no banco de dados: VENDEDOR só vê a própria carteira (os clientes que ele mesmo cadastrou); ADMIN e GERENTE veem todos. Só ADMIN ou GERENTE têm o botão "Aprovar crédito". O link "LGPD" só aparece pra ADMIN.
Ações principais: Novo cliente · Editar cliente · Aprovar crédito (define limite em R$, limite em US$ opcional, e motivo obrigatório — fica logado) · Ver contato (revela telefone/WhatsApp) · abrir a sub-tela LGPD.
Fluxo correto:
- Clicar em "Novo cliente", preencher nome/razão social (único campo obrigatório), tipo (Ponta-Pinga / Atacado / Mix), origem (Indicação / Evento / Rede social / Outro), e-mail, endereço padrão, telefone/WhatsApp e, opcionalmente, CPF/CNPJ — desde 06/09 esse campo tem caminho de escrita de verdade (antes disso existia na tela, mas nenhum documento era efetivamente gravado).
- Cliente nasce sem crédito aprovado — só compra à vista até alguém liberar.
- Quando o histórico justificar, ADMIN/GERENTE clicam "Aprovar crédito", digitam o limite em reais (obrigatório) e, se o cliente também compra no Paraguai, o limite em dólar (opcional) — e um motivo (texto livre, obrigatório, vira registro de auditoria).
- Pra ligar de novo pro cliente ou confirmar o WhatsApp antes de mandar uma cotação, clicar "Ver contato" — a tela busca o dado cifrado e registra esse acesso na auditoria de LGPD (toda leitura de dado pessoal em claro passa por um único ponto do sistema, que sempre registra o acesso antes de devolver o dado).
- Erro de digitação no cadastro se corrige em "Editar" — mas telefone/ WhatsApp e crédito têm fluxos próprios (edição de cadastro nunca mexe em nenhum dos dois sem o campo ser explicitamente tocado).
Se pular ou errar:
- Tentar vender a prazo pra cliente sem crédito aprovado → bloqueado com "Cliente sem crédito aprovado não pode comprar a prazo (apenas à vista)." Ninguém libera isso, é preciso aprovar crédito primeiro.
- Vender a prazo além do limite aprovado → a venda bloqueia e avisa o dono; só ADMIN libera a venda especificamente (não é uma ação nesta tela — acontece no checkout de Vendas).
- Editar um cliente sem que o formulário tenha carregado o contato (edição rápida, dado pessoal ainda não revelado) não apaga o telefone/WhatsApp por engano — o campo só é tocado se o formulário efetivamente carregou o valor.
- Cadastrar (ou editar pra incluir) um CPF/CNPJ que já pertence a outro cliente desta empresa → recusado antes de gravar, com aviso pra procurar o cadastro existente em vez de criar um segundo. A checagem reconhece o mesmo documento mesmo digitado com máscara diferente ("111.444.777-35" e "11144477735" contam como o mesmo CPF) — não adianta tentar cadastrar de novo mudando só a formatação.
Detalhes e estados:
- Saldo devedor, saldo de crédito de troca e limite de crédito em BRL e USD são contas totalmente separadas — nunca somadas, nunca convertidas por câmbio. Um cliente pode dever R$ 5.000 e ter US$ 0 de saldo devedor ao mesmo tempo, ou vice-versa.
- "Crédito de troca" (saldo de crédito por devolução/troca) não expira e é uma conta separada do limite de crédito a prazo.
- O histórico de compras (última compra, total comprado) mostrado na lista soma BRL e USD separadamente — nunca junta os dois num único total.
- CPF/CNPJ fica cifrado no banco, como telefone/WhatsApp — mas a checagem de duplicata não depende de descriptografar cada cliente pra comparar: usa um "índice cego" (um código derivado do documento já normalizado, sem pontuação) que permite achar colisão sem expor o documento em claro.
Precificação

Pra que serve: manter a tabela de preços de venda por modelo+capacidade+grade (e por faixa de bateria, quando abaixo de 80%), e mostrar quais combinações de aparelho em estoque ainda não têm preço resolvido — a fila de trabalho pra não deixar nada "sem preço" na hora de vender.
Quem usa: aparece no menu só pra ADMIN e GERENTE (VENDEDOR e FINANCEIRO não têm este item no menu). Editar (criar/atualizar/remover entrada, importar planilha, definir preço individual de 1 aparelho) exige ADMIN ou GERENTE — validado de novo no servidor, então mesmo quem acessa a URL direto não consegue gravar sem o perfil certo.
Ações principais: Adicionar/editar entrada da tabela (modelo, capacidade, grade, preço R$, preço US$ opcional, variante de bateria <80%) · Remover entrada · Importar preços em lote via planilha CSV · Exportar CSV · "Definir preço" direto a partir de uma linha da fila "Estoque sem preço" (pré-preenche o formulário).
Fluxo correto:
- Cadastrar o preço "padrão" por modelo (ex.: "iPhone 13 128GB grade AB = R$ 1.850").
- Preço específico (capacidade+grade batendo exato) sempre vence um preço "genérico" (só modelo, capacidade/grade em branco) — o genérico serve só pra sugerir, nunca pra confirmar que a combinação existe de verdade numa venda por grade.
- Se um aparelho tem bateria abaixo de 80%, cadastrar uma linha própria marcada "bateria <80%" — ela não herda nem empresta preço da linha normal; são dimensões completamente separadas.
- Pra corrigir o preço de um único aparelho específico (não a combinação inteira), isso se faz na tela de Inventário e Estoque → detalhe do IMEI (o número de série único do aparelho), não aqui — esse preço individual (chamado de "override") sempre vence a tabela.
- Pra importar muitos preços de uma vez, usar "Exportar CSV" primeiro como molde, editar na planilha e importar de volta — o importador decide sozinho se cada linha é criação ou atualização, comparando pela mesma combinação de modelo+capacidade+grade.
Se pular ou errar:
- Aparelho sem preço resolvido (nem override, nem tabela) aparece na fila "Estoque sem preço" — venda dele exige digitar o preço manualmente na hora de vender.
- Numa cotação ou venda por grade, uma combinação que não existe nem na tabela nem no estoque físico é recusada com "Combinação inexistente".
- Cotação recusa cotar qualquer combinação com algum aparelho sem custo de compra lançado — mesmo que tenha preço de venda. Sem custo conhecido, margem é inventada, e por isso a proposta nem chega a ser montada (ver seção Cotações abaixo).
Detalhes e estados:
- Hierarquia de resolução do preço sugerido: preço individual do aparelho > entrada específica da tabela (capacidade+grade exatas) > entrada genérica (só modelo). Faixa de bateria (<80% ou não) é dimensão exata, sem meio-termo — um aparelho com bateria saudável nunca casa numa linha marcada "<80%" e vice-versa.
- A grade MIX (usada em Vendas e Cotações) não tem entrada própria aqui — ela é sempre um alias do preço da grade AB ("AB é o mix", decisão do dono). Não cadastrar "MIX" na tabela de preços; não existe.
- Preço US$ (Paraguai) é opcional por linha — uma combinação pode ter só preço R$, só preço US$, ou os dois.
- A remoção de entrada não some do banco na hora — é um "soft delete" (marca como removida em vez de apagar de fato, revalidando de novo o perfil e a empresa de quem pediu), só some da tela.
Cotações

Pra que serve: montar uma proposta B2B (venda entre empresas) formal por grade (sem escolher IMEI — "10 iPhone 15 128GB grade AB"), mandar um link público pro cliente ver preço e itens, e reservar o estoque prometido enquanto ele decide. Nasceu porque, medido em produção em 20/08, a KL tinha 0 vendas registradas no sistema — vendia inteiramente por WhatsApp sem deixar rastro. É o primeiro objeto formal desse processo.
Quem usa: montar/enviar/cancelar cotação exige a mesma capacidade de lançar venda (ADMIN, GERENTE, VENDEDOR — FINANCEIRO só acompanha, não monta). Ver o custo de referência e a margem de cada item é exclusivo de quem "vê dinheiro" (ADMIN, GERENTE, FINANCEIRO) — o vendedor nunca vê o custo, só o preço que ele mesmo digitou. Fechar uma cotação em venda quando algum item está abaixo do piso de margem exige a interseção das duas coisas — só ADMIN ou GERENTE.
Ações principais: escolher moeda da cotação (R$ ou US$, trocar limpa o rascunho) · adicionar linha (modelo+capacidade+grade+quantidade+preço) · remover linha · "Salvar rascunho" (não reserva nada) · "Salvar e enviar" (reserva o estoque e gera o link público) · "Fechar venda" (converte a cotação enviada/aceita em venda de verdade) · "Cancelar" (solta a reserva).
Fluxo correto:
- Escolher o cliente e a moeda (BRL ou USD) — trocar a moeda no meio do rascunho limpa os itens já adicionados, porque o cardápio de combinações disponíveis é diferente em cada uma.
- Adicionar linhas escolhendo entre as combinações já filtradas como "cotáveis" — o seletor só mostra o que tem estoque livre no local certo e custo conhecido de todos os aparelhos daquela combinação. Combinação com custo incompleto simplesmente não aparece pra escolher (é proposital: aparecer e travar só na hora de adicionar seria pior, porque o vendedor já teria falado o preço pro cliente).
- Digitar o preço de cada linha. Se ficar abaixo do preço de tabela e abaixo do piso de margem da empresa (padrão 15%, configurável), a tela avisa — mas não bloqueia: cotação é proposta, não venda, e travar aqui pararia tudo numa única pessoa (a KL tem 1 ADMIN e 0 GERENTE hoje).
- "Salvar e enviar": gera o link público
/c/<token>(token = um código único e imprevisível que dá acesso ao link, sem precisar de login) e reserva o estoque até o vencimento (72h padrão, configurável até 30 dias). O link aparece uma única vez, no aviso de sucesso da tela — copiar dali e mandar manualmente pro cliente (WhatsApp, etc.). Não existe reenvio nem um botão fixo pra recuperar o link depois. - O cliente abre o link (sem login) e vê a proposta com preços, itens, validade e um selo "reservado para você" — sem ver custo nem margem em nenhuma hipótese.
- Quando o cliente topar, clicar "Fechar venda" na lista de cotações. Isso cria a venda de verdade pelo mesmo fluxo de Vendas (mesma trava de moeda×estoque, mesmo cálculo de custo/comissão) — o botão da lista sempre fecha à vista; venda a prazo (com checagem de limite de crédito) exige ir pela tela de Vendas normal.
Se pular ou errar:
- Item com algum aparelho sem custo lançado → recusado na hora de adicionar, com a mensagem indicando quantos faltam e pedindo pro ADMIN/GERENTE lançar o custo em Inventário e Estoque → IMEI → "Corrigir custo de compra".
- Enviar uma cotação cujo prazo de validade já passou → recusado (não reserva estoque pra uma proposta que já nasceu vencida).
- Cotação vencida não vira venda em silêncio — "Fechar venda" recusa com aviso pra refazer a proposta com preço/estoque atuais.
- Item abaixo do piso de margem numa cotação → qualquer perfil pode enviar a proposta assim mesmo, mas só ADMIN/GERENTE conseguem fechar a venda; um VENDEDOR tentando fechar recebe erro explícito listando quais itens estão furando o piso.
- Cancelar uma cotação que, no mesmo instante, está sendo convertida em venda por outra pessoa → o sistema detecta a corrida e recusa o cancelamento com "a cotação mudou de status durante o cancelamento", evitando reserva perdida ou venda órfã.
Detalhes e estados:
- Ciclo de status: RASCUNHO (nada reservado) → ENVIADA (link gerado, estoque reservado) → ACEITA / RECUSADA / EXPIRADA (automático) → CONVERTIDA (virou venda) ou CANCELADA (a qualquer momento antes de converter).
- Um processo automático roda a cada 15 minutos e expira tudo que passou da validade — inclusive cotações já ACEITAS. Antes, uma verificação mais antiga (que expira reservas de 48h por IMEI) não cobria essa reserva por grade — isso foi corrigido em 22/08.
- Moeda decide o estoque prometido: cotação em R$ reserva/promete estoque de SP; cotação em US$ reserva/promete estoque do Paraguai — a mesma trava dura que existe na venda direta.
- O custo de referência mostrado (só pra quem vê dinheiro) é o maior custo conhecido da combinação, não a média — decisão deliberada (proposta é promessa; errar pra cima protege a margem real).
- Ao converter uma cotação em venda, o sistema primeiro solta a reserva da cotação, depois cria a venda e, se algo falhar no meio do caminho, restaura a reserva — essa ordem evita contar o mesmo estoque duas vezes entre a reserva da cotação e a reserva que a venda por grade cria sozinha.
Vendas

Pra que serve: é onde o aparelho sai do estoque e vira dinheiro de verdade — lançamento multi-item (aparelho por IMEI, grade sem IMEI, grade MIX), cálculo de margem em tempo real, aprovação de desconto, checagem de crédito, geração automática de comissão e de pacote de entrega.
Quem usa: lançar venda nova exige o perfil ADMIN, GERENTE ou VENDEDOR. FINANCEIRO só acompanha: o botão "Nova venda" aparece na tela pra ele igual pra todo mundo (não some do menu nem do layout), mas o sistema recusa a submissão com "Seu perfil não pode lançar vendas — só acompanhar." Custo do aparelho e margem da venda só aparecem pra ADMIN/GERENTE — o vendedor vê o preço que ele mesmo digitou, nunca o quanto a loja pagou nem o lucro. Cancelar venda e ver o botão "Cancelar venda"/"Aprovar"/"Rejeitar" na lista é ADMIN/GERENTE apenas. Liberar uma venda que estourou o limite de crédito do cliente é ADMIN apenas (dono).
Ações principais: "Nova venda" (assistente de 3 passos) · filtro de período sobre a lista (Hoje/7 dias/30 dias/Todas) · "Gerar pacote de entrega" retroativo (venda que ficou sem pacote) · "Cancelar venda" (com destino do valor já pago) · Imprimir/Compartilhar PDF direto da lista.
Fluxo correto (assistente "Nova venda"):
- Passo 1 — Cliente: buscar por nome ou cadastrar um novo cliente sem sair do fluxo. Escolher a moeda da venda aqui (R$ ou US$) — troca de moeda limpa a seleção de itens do passo 2, porque o cardápio de estoque disponível é diferente em cada uma.
- Passo 2 — Produtos: três formas de adicionar item, todas na mesma tela — por IMEI (o número de série único do aparelho — opção avançada/opcional), por grade (modelo+capacidade+grade+quantidade, sem escolher qual aparelho exato — o estoquista bipa depois), e MIX (mesma ideia, mas sem travar a grade: o estoquista compõe livremente com A/AB/B na hora de separar). Venda em R$ só oferece estoque disponível em SP; venda em US$ só oferece estoque disponível no Paraguai — o filtro já nasce restrito à moeda escolhida no passo 1. Desde 06/09, a busca por IMEI também não oferece um aparelho que já está reservado para um pedido de frete (Logística) de outro cliente — se você digitar um IMEI nessa situação, a tela recusa dizendo qual pedido está segurando aquele aparelho, em vez de simplesmente não achar nada.
- Passo 3 — Pagamento/Revisão: condição (à vista/prazo — a prazo exige crédito aprovado e dentro do limite), forma de pagamento, desconto, crédito de troca a aplicar (só em vendas R$), entrega (retirada balcão ou modal com endereço/telefone/custo de frete).
- Confirmar. Se o desconto (declarado ou "real", calculado comparando o
preço digitado com o preço de tabela) passar do limite configurado
(padrão 5%), a venda nasce AGUARDANDO_APROVACAO e não mexe em
estoque nem gera comissão até alguém aprovar — a aprovação acontece na
tela
/aprovações(fora deste capítulo), não aqui. - Depois de efetivada, a venda gera o pacote de entrega (se não for retirada no balcão, ou se tiver item de grade a bipar) e a comissão do vendedor automaticamente.
Se pular ou errar:
⚠️ Atenção: tentar vender em reais um aparelho que ainda está no Paraguai (ou vender em dólar um aparelho que já chegou em São Paulo) é sempre recusado com a mensagem "BRL = SP, USD = PY — ninguém cruza". É a trava mais importante do módulo, e existe em duas camadas — no sistema, na hora de montar a venda, e também dentro do banco de dados — então nem um erro futuro no aplicativo conseguiria burlar.
- Vender a prazo além do limite de crédito → bloqueia e avisa o dono; só
ADMIN libera explicitamente (botão que roda de novo o mesmo checkout
pulando esse bloqueio específico, com o evento logado). Desde 06/09 esse
limite é reconferido de novo na efetivação — não só na criação: se a
venda ficou parada em
AGUARDANDO_APROVACAO(desconto acima do limite) e, enquanto isso, outra venda a prazo do mesmo cliente consumiu o limite, a aprovação é recusada avisando que o limite não comporta mais aquela venda — mesmo que ela coubesse no momento em que foi criada. Só o ADMIN aprovando pula essa revalidação (o GERENTE não); sem essa saída, uma venda cujo limite sumiu no meio do caminho ficaria presa sem ninguém poder destravar. - Aplicar crédito de troca maior que o saldo do cliente → mesmo bloqueio, mesma liberação exclusiva do ADMIN. Desde 06/09 há também um teto independente: o crédito aplicado não pode passar do valor da própria venda — igualar é permitido (crédito quita a compra inteira), mas aplicar mais do que o total da venda é recusado (a mensagem mostra quanto seria perdido) mesmo que o cliente tenha saldo de sobra e mesmo com o ADMIN tendo liberado o excesso de limite — são duas autorizações diferentes: uma libera gastar além do saldo, a outra nunca deixa jogar crédito fora.
- Vender item de grade/MIX numa combinação sem nenhum aparelho com custo lançado → recusado ("impossível calcular margem"). Se só parte dos aparelhos da combinação não tem custo, a venda segue, mas avisa quantas unidades entraram sem custo na média.
- Desconto que empurra o preço abaixo do piso de margem numa venda de grade/MIX também dispara aprovação — mesmo sem o vendedor mexer no campo "% desconto" (o sistema recalcula o desconto "real" comparando preço digitado × preço de tabela, exatamente pra fechar essa brecha).
⚠️ Atenção: cancelar uma venda em dólar que já teve valor pago não é automático — o sistema recusa e pede pra tratar manualmente com o financeiro. Reembolso ou crédito automático em dólar ainda não existe.
Detalhes e estados:
- Status possíveis: ABERTA (efetivada) · AGUARDANDO_APROVACAO
(desconto acima do limite, nada consumido ainda) · CANCELADA.
Aprovação/rejeição de venda pendente acontece na tela
/aprovações, não aqui — este capítulo documenta só a origem do estado. - Comissão é R$ 3 por aparelho vendido (regra padrão, configurável por vendedor/período) — conta cada aparelho serializado e cada unidade de grade/MIX, mas não conta acessório. É gerada só na efetivação da venda (nunca numa proposta/rascunho), fica PENDENTE até o fechamento financeiro, e é sempre calculada em reais, mesmo numa venda em dólar. O valor gravado é reconferido automaticamente pelo banco de dados — se o valor não bater com a fórmula, a gravação é recusada.
- Venda por acessório avulso está desativada desde 22/08 (decisão "trade- in e venda de acessório saem do sistema — não é o intuito do sistema"). Venda antiga com item de acessório continua legível/imprimível/cancelável normalmente — só criação nova é bloqueada.
- Grade MIX nunca vira uma linha própria na tabela de preços nem uma opção própria na lista de grades do sistema — é sempre tratada como alias da grade AB pra fins de preço e de existência da combinação; a composição real (quais IMEIs A/AB/B) só nasce na separação/bipagem.
- "Cor" e "faixa de bateria abaixo de 80%" são filtros/seleções opcionais na venda por grade — pedir uma cor específica ativa uma checagem de saldo físico daquela cor que o resto do sistema (reserva por grade) não rastreia normalmente; é um controle "opcional" pensado pra não travar quem não usa.
- Toda a criação de venda é protegida em várias etapas: se qualquer passo no meio falhar (ex.: o 2º de 3 aparelhos dá erro), o sistema desfaz tudo que já tinha feito antes de devolver o erro — nunca deixa um aparelho marcado como VENDIDO com uma venda incompleta.
- Cancelamento de venda escolhe o destino do valor já pago: vira crédito do cliente (padrão), fica registrado como "reembolso manual pendente", ou é retido (multa/sinal, com motivo obrigatório).
- Desde 06/09, cancelar uma venda cuja comissão já foi paga (fechada e marcada como paga em Comissões) não apaga essa comissão — ela fica preservada no relatório do vendedor, porque o dinheiro já saiu do caixa, e a tela mostra um aviso de quanto ficou pendente de acerto manual com o vendedor. Comissão ainda Pendente ou Fechada (não paga) continua sendo apagada normalmente no cancelamento.
Imprimir e Compartilhar Pedido

Pra que serve: gerar um romaneio (documento formal do pedido, pra conferência e como recibo) de uma venda já lançada — pra imprimir, salvar como PDF pelo navegador, ou mandar direto pelo WhatsApp do celular.
Quem usa: quem consegue ver a venda consegue imprimi-la — vendedor vê as próprias vendas, ADMIN/GERENTE veem todas. A seção de parcelas (financeiro) só aparece pra quem tem acesso a esse dado (ADMIN/GERENTE/ FINANCEIRO) — pro vendedor, a seção some inteira da impressão, sem erro nem espaço em branco.
Ações principais: Ctrl+P → "Salvar como PDF" (desktop) · botão "Compartilhar PDF" (mobile — abre o menu nativo de compartilhamento do celular, ex. WhatsApp; no desktop sem suporte, baixa o arquivo) · o mesmo botão compacto ("Enviar PDF") também existe direto na lista de vendas, sem precisar abrir esta tela.
Fluxo correto:
- Da lista de vendas, clicar "Imprimir" (abre esta tela) ou "Enviar PDF" (gera e compartilha direto, sem trocar de tela).
- O documento mostra: número do pedido (formato
N0042, padronizado em todo o sistema — antes cada tela usava um prefixo diferente e confundia), cliente, condição, status, itens com preço, subtotal/crédito aplicado/total, e — se a venda tiver item de grade/MIX já separado — uma seção "Composição separada (bipagem)" com os IMEIs reais escolhidos na expedição. - No celular, tocar "Compartilhar PDF" abre o menu de compartilhamento nativo; no computador, o mesmo botão baixa o arquivo.
Se pular ou errar: nada é alterado nesta tela — é 100% leitura. O único jeito de "errar" é imprimir antes da separação de um pedido por grade/MIX: nesse caso a seção "Composição separada" simplesmente não aparece ainda (a lista de IMEIs reais só existe depois da bipagem).
Detalhes e estados:
- Venda em US$ usa os campos de dólar em tudo (preço, subtotal, total) — nunca mistura com os campos de real da mesma venda.
- O nome do arquivo do PDF (ex.
N0042.pdf) vem pronto do servidor, então a lista de vendas nem precisa carregar o número do pedido só pra nomear o download. - Cancelar o menu de compartilhamento do celular (usuário desiste) não gera mensagem de erro — é tratado como ação normal, não falha.
LGPD do Cliente

Pra que serve: atender o direito de portabilidade (exportar todos os
dados do cliente) e o direito de eliminação (apagar dados pessoais) da LGPD
— numa única ação irreversível: gera o pacote de dados (JSON + planilhas de
vendas, parcelas, garantias, movimentos de crédito) e, na sequência,
anonimiza o cadastro (sobrescreve nome, CPF/CNPJ, telefone, WhatsApp,
e-mail) marcando-o como excluído. Desde 06/09, a anonimização também alcança
as cópias do dado pessoal que vivem fora do cadastro do cliente — nome,
telefone e endereço gravados no pacote de entrega
(cliente_nome_snapshot, telefone_snapshot, endereco_snapshot) e o
telefone salvo nas conversas de WhatsApp. Antes disso, essas cópias
sobreviviam à anonimização: o titular pedia exclusão, o sistema respondia
"pronto", e o telefone dele continuava legível ali.
Quem usa: exclusivo de ADMIN. A tela mostra o botão só pra ele; para qualquer outro perfil aparece um aviso "Apenas o perfil ADMIN pode exportar e anonimizar dados de cliente (LGPD)" — e a checagem é revalidada de novo no servidor dentro da própria ação (não confia no que a tela escondeu).
Ações principais: "Exportar e anonimizar" (com diálogo de confirmação explicando que é irreversível) — não existe exportação "só de leitura" sem anonimizar junto; é uma ação única.
Fluxo correto:
- Abrir a tela pelo link "LGPD" na lista de Clientes (só visível pro ADMIN).
- Clicar "Exportar e anonimizar", confirmar no diálogo (mostra o nome do cliente pra evitar clique errado).
- O navegador baixa automaticamente um arquivo
.json(pacote completo) e uma ou mais planilhas.csv(vendas, parcelas, garantias, movimentos) — download local, sem passar por servidor externo. - O cadastro do cliente fica marcado como anonimizado — a tela, se reaberta, mostra "Cliente já anonimizado — não há ação adicional disponível" e não deixa repetir.
Se pular ou errar:
⚠️ Atenção: desde 06/09, cliente com parcela em aberto (Pendente ou Atrasada) não pode ser anonimizado — a tela recusa mostrando quantas parcelas e a soma em R$, e pede pra quitar, cancelar ou renegociar antes de refazer o pedido de exclusão. Anonimizar mesmo assim tornaria a dívida incobrável: o nome vira "[anonimizado]", o contato some, e sobra uma parcela devida por ninguém — o dinheiro não desaparece do balanço, some é a pessoa que deve. Isso não fere a LGPD: reter dado necessário ao cumprimento de obrigação contratual é exceção prevista em lei (art. 16) — o que a lei não permite é dizer "excluído" e continuar com o dado, que é exatamente o que aconteceria sem essa trava.
- Rodar duas vezes no mesmo cliente é bloqueado com "Cliente já foi anonimizado/excluído" — não é possível anonimizar duas vezes nem desfazer pela tela.
- Se o registro de auditoria (log de acesso a dado pessoal) falhar antes de ler o dado, a exportação inteira é recusada (prioridade pra segurança: sem conseguir provar quem acessou o quê, o sistema prefere não entregar o dado a entregar sem rastro).
- Se a anonimização em si falhar depois do pacote montado, a operação é marcada como não concluída (retorna erro) — nunca fica um estado "exportado mas não anonimizado" silencioso. Se o cadastro principal for anonimizado mas a limpeza de alguma cópia (pacote/WhatsApp) falhar, a tela avisa nomeando exatamente qual tabela ficou pra trás e pede pra contatar o suporte — a exclusão fica marcada como incompleta pra LGPD, não como sucesso.
Detalhes e estados:
- Histórico financeiro nunca é apagado — vendas, parcelas, comissões e garantias permanecem intactos por integridade contábil; só os campos pessoais do cadastro do cliente (e suas cópias) são sobrescritos.
- Cada acesso a dado pessoal (inclusive o de exportação) grava um evento próprio de auditoria — não é um registro genérico, é o mesmo mecanismo de "único caminho gravável" usado em toda leitura de dado pessoal decifrado do sistema.
- O endereço gravado no pacote de um pedido já entregue também é apagado na anonimização, junto com nome e telefone — é uma decisão que pode mudar no futuro (comprovante de entrega tem valor probatório), mas hoje some igual ao resto.
Trade-in (Desativado)

Pra que serve (histórico): registrava a entrada de um aparelho usado que o cliente entregava numa troca — o aparelho entrava por triagem e, opcionalmente, gerava crédito de troca pro cliente vinculado.
Por que está desativado: decisão do dono em 22/08 — trade-in e venda de acessório avulso saem do sistema, porque "não é o intuito do sistema" (a KL não opera como recompra de usado dentro do fluxo do iMportex). É uma desativação em duas etapas: a etapa 1 (atual) esconde do menu e recusa criação nova; a etapa 2 (apagar código e dados) está adiada de propósito, e só aconteceria com backup, relatório de contagem e um período de quarentena de pelo menos 7 dias — ainda não ocorreu.
Quem usa: ninguém consegue registrar um trade-in novo, nenhum perfil. A rota fica no ar (em vez de dar uma tela de erro) só pra quem tinha o link salvo receber uma explicação em vez de uma tela quebrada.
Ações principais: nenhuma — a página mostra só um aviso.
Fluxo correto: abrir /trade-in mostra: "Trade-in — Módulo
desativado." + a mensagem "Trade-in desativado (decisão 22/08). Histórico e
créditos já concedidos permanecem válidos."
Se pular ou errar: não aplicável — não há formulário pra preencher. Qualquer tentativa de registrar um trade-in por fora da tela também é recusada antes de qualquer leitura ou escrita no banco, com a mesma mensagem.
Detalhes e estados:
- Trade-ins já registrados no passado continuam válidos — o crédito de troca que um cliente já recebeu não é revertido, e o histórico permanece consultável.
- O formulário antigo ainda existe no código-fonte, mas não está mais ligado a nenhuma tela — é código sem uso, mantido só como referência caso a decisão seja revertida.
- A rota não aparece em nenhuma seção do menu de navegação (nem pra ADMIN) — só é alcançável digitando o endereço direto.
- A permissão que controlava quem podia registrar trade-in (reservada a ADMIN/GERENTE) continua existindo no sistema como uma segunda trava de segurança — mas na prática nunca chega a ser usada, porque o bloqueio do módulo desativado responde primeiro.
Erros comuns e como evitar
- Tentar vender em reais um aparelho que ainda está no Paraguai (ou em dólar um que já chegou em SP). É a trava mais rígida do módulo — BRL usa só o que já está fisicamente em SP, USD usa só o que está no PY. Confira a localização do aparelho antes de montar a venda; o sistema recusa, mas economiza tempo saber disso de antemão.
- Mandar uma cotação e não guardar o link. O link público (
/c/<token>) aparece uma vez só, no aviso de sucesso depois de enviar. Copiar na hora — não existe um botão pra recuperar esse link depois na lista. - Vender por grade uma combinação sem custo lançado em nenhum aparelho. A venda é recusada de propósito ("impossível calcular margem") — o caminho certo é pedir ao ADMIN/GERENTE pra lançar o custo de compra do(s) aparelho(s) da combinação em Inventário e Estoque antes.
- Achar que "Nova venda" aparece pra quem pode vender. O botão aparece pra todo mundo, inclusive FINANCEIRO — só o clique de confirmar é que recusa no servidor. Não confiar no botão visível como sinal de permissão.
- Deixar uma cotação vencer com o cliente "quase fechando". Passado o prazo (72h padrão), a reserva de estoque cai automaticamente a cada 15 minutos — inclusive cotação já ACEITA. Se o cliente demorar, reenviar (uma nova cotação) antes de vencer.
- Cancelar venda em dólar com valor já pago. O sistema recusa e pede pra tratar manualmente com o financeiro — reembolso/crédito automático em US$ ainda não existe.
- Achar que editar o cadastro do cliente mexe no crédito ou apaga o telefone. São três fluxos separados por desenho — editar cadastro nunca toca crédito (isso é "Aprovar crédito") nem dado pessoal a menos que o campo tenha sido explicitamente preenchido de novo.
- Confundir "cotação" com "venda MIX/grade". Cotação é proposta — reserva estoque, mas nenhum dinheiro mudou de mão e o piso de margem só avisa. Venda é definitiva — o piso de margem em item de grade/MIX dispara aprovação de verdade, mesmo sem o vendedor mexer no campo de desconto.
- Aplicar mais crédito de troca do que o valor da venda. Desde 06/09 o sistema recusa mesmo que o cliente tenha saldo de sobra — a diferença seria perdida sem ninguém perceber. Aplique no máximo o valor da venda; o resto continua guardado no saldo do cliente.
- Achar que uma venda com desconto aprovada na criação está garantida. O limite de crédito é reconferido de novo quando a aprovação efetiva a venda — se outra venda a prazo do mesmo cliente consumiu o limite nesse meio-tempo, a aprovação é recusada e só o ADMIN destrava.
- Cadastrar o mesmo cliente duas vezes só porque o CPF/CNPJ foi digitado com pontuação diferente da primeira vez. A checagem de duplicata normaliza o documento antes de comparar — máscara diferente não engana.
- Tentar anonimizar (LGPD) um cliente que ainda deve parcela. Desde 06/09 é bloqueado — quite, cancele ou renegocie a dívida antes de refazer o pedido de exclusão. Anonimizar antes disso apagaria quem deve, não a dívida.
