Capítulo 07

Vendas, Cotações B2B e Clientes

Venda BRL/USD por grade, grade MIX, cotação pública, precificação e carteira de clientes.

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

  1. 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.
  2. 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.
  3. (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).
  4. 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.
  5. 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).
  6. Imprimir/compartilhar o pedido (/vendas/[id]/imprimir) — romaneio para o cliente levar ou o vendedor mandar por WhatsApp.
  7. (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

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:

  1. 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).
  2. Cliente nasce sem crédito aprovado — só compra à vista até alguém liberar.
  3. 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).
  4. 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).
  5. 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

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:

  1. Cadastrar o preço "padrão" por modelo (ex.: "iPhone 13 128GB grade AB = R$ 1.850").
  2. 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.
  3. 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.
  4. 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.
  5. 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

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:

  1. 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.
  2. 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).
  3. 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).
  4. "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.
  5. 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.
  6. 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

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"):

  1. 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.
  2. 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.
  3. 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).
  4. 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.
  5. 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

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:

  1. Da lista de vendas, clicar "Imprimir" (abre esta tela) ou "Enviar PDF" (gera e compartilha direto, sem trocar de tela).
  2. 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.
  3. 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

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:

  1. Abrir a tela pelo link "LGPD" na lista de Clientes (só visível pro ADMIN).
  2. Clicar "Exportar e anonimizar", confirmar no diálogo (mostra o nome do cliente pra evitar clique errado).
  3. 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.
  4. 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)

Trade-in

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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. 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.
  9. 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.
  10. 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.
  11. 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.
  12. 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.