Pular para o conteúdo principal

Sale (Venda)

A Sale (Venda) e a entidade central do PDV, representando uma transacao comercial entre o petshop e o cliente.

Descricao

Uma venda pode conter produtos, servicos e pacotes. Ela passa por um ciclo de vida bem definido, desde a abertura ate a finalizacao ou cancelamento. Vendas podem ser do tipo "sale" (venda efetiva) ou "budget" (orcamento).

Dados

Identificacao

CampoTipoObrigatorioDescricao
sale_numberNumeroAutoNumero sequencial unico por conta
nameTextoAutoFormato: "No [sale_number]"
full_nameTextoAutoFormato: "No [sale_number] - [cliente]"
typeSelecaoSim"sale" (venda) ou "budget" (orcamento)
statusSelecaoSimEstado atual da venda
date_timeDataHoraAutoData/hora de finalizacao
dateDataAutoData da venda

Valores

CampoTipoObrigatorioDescricao
totalMonetarioCalculadoSoma dos totais dos itens
discountDecimalNaoDesconto aplicado (0-100%)
applied_discountSelecaoNaoModo de desconto aplicado
obsTextoNaoObservacoes da venda

Cancelamento

CampoTipoDescricao
canceled_typeSelecao"total" ou "partial"
last_canceled_atDataHoraUltima data de cancelamento
total_canceled_valueMonetarioValor total cancelado
canceled_quantityNumeroQuantidade de itens cancelados
last_canceled_obsTextoObservacao do cancelamento

Relacionamentos

Pertence a

EntidadeObrigatorioDescricao
AccountSimConta do petshop
StoreSimFilial onde ocorreu
UserSimOperador que criou
CustomerCondicionalCliente (obrigatorio se tiver servicos)
SellerNaoVendedor/Profissional
AddressNaoEndereco de entrega
KnowledgeChannelNaoCanal de conhecimento
BenefitClubNaoClube de beneficios do cliente

Possui

EntidadeDescricao
CartItemsItens do carrinho (produtos, servicos, pacotes)
CheckoutProcesso de pagamento
PaymentsPagamentos realizados
DeliveriesEntregas vinculadas
BeautyServicesServicos de estetica criados
SaleCancellationsRegistros de cancelamento
PetsPets vinculados aos itens

Ciclo de Vida (Status)

Estados

StatusDescricaoAcoes Permitidas
openVenda em construcaoAdicionar itens, definir cliente, aplicar desconto
pendingFinalizada, aguardando pagamentoIr para checkout, voltar para edicao
paidTotalmente pagaCancelar (total ou parcial), imprimir
canceledCompletamente canceladaNenhuma
partially_canceledAlguns itens canceladosCancelar restante

Regras de Transicao

DeParaCondicoes
openpendingMinimo 1 item; Cliente obrigatorio se tiver servicos; Validacao de estoque; Pets atribuidos aos itens que exigem
pendingopenSempre permitido
pendingpaidSoma dos pagamentos maior ou igual ao total
paidcanceledSempre permitido (com registro de motivo)
paidpartially_canceledAo cancelar alguns itens
partially_canceledcanceledAo cancelar todos os itens restantes

Modos de Desconto

ModoDescricao
defaultUsa desconto padrao das configuracoes do PDV
noSem desconto (0%)
minDesconto minimo das configuracoes
maxDesconto maximo das configuracoes (100%)

Regras de Desconto

  1. Desconto so pode ser alterado quando status = "open"
  2. Desconto nao pode exceder pdv_settings.max_discount
  3. Itens com ignore_pdv_discounts = true nao sao afetados
  4. Ao alterar modo, todos os itens sao atualizados

Validacoes

Antes de Finalizar (open para pending)

  1. Itens obrigatorios: Minimo 1 cart_item
  2. Cliente condicional: Obrigatorio se venda contem SaleService ou SalePackage
  3. Estoque: Se pdv_settings.forbid_with_negative_stock = true, valida disponibilidade
  4. Pets: Itens com request_pet = true devem ter pet atribuido
  5. Desconto: Nao pode exceder maximo permitido

Mensagens de Erro

  • "Voce precisa vincular um pet aos itens [X] antes de finalizar a venda"
  • "Estoque insuficiente para os itens: X (disponivel: Y, solicitado: Z)"

Automacoes

Ao Criar

  1. Define user como usuario atual
  2. Define sale_number auto-incrementado
  3. Define date_time e date atuais
  4. Define seller se usuario atual for profissional vendedor

Ao Finalizar (status para pending)

  1. Atualiza date_time e date
  2. Herda knowledge_channel do cliente se nao definido
  3. Herda seller do usuario atual se nao definido
  4. Gera Checkout automaticamente (se type = "sale")
  5. Atualiza status de todos os cart_items

Ao Pagar (status para paid)

  1. Processa nota fiscal (se configurado)
  2. Extrai e armazena impostos nos cart_items (ICMS, PIS, COFINS)
  3. Cria BeautyServices para servicos/pacotes vendidos
  4. Cria Deliveries conforme regras de prepago/pospago
  5. Gera transacoes financeiras
  6. Recalcula valores do cliente (pendente, cashback, credito)
  7. Agenda notificacoes WhatsApp de recompra
  8. Recalcula estrelas do cliente

Ao Cancelar

  1. Registra motivo em SaleCancellation
  2. Recalcula valores do cliente
  3. Recalcula estrelas do cliente

Calculo de Impostos

Quando Calculado

Impostos sao calculados ao mudar status para "paid", apos geracao da nota fiscal.

Impostos Armazenados por Item

ImpostoCampos Armazenados
ICMSBase (vBC), CST, Aliquota (pICMS), Valor (vICMS)
PISBase (vBC), CST, Aliquota (pPIS), Valor (vPIS), Aliquota unitaria
COFINSBase (vBC), CST, Aliquota (pCOFINS), Valor (vCOFINS), Aliquota unitaria

ICMS por Estado

Checkout Automatico

Geracao

  • Criado automaticamente ao mudar status para "pending" e type = "sale"
  • Destruido ao voltar status para "open"

Condicao para Pagamento

valid_to_pay = soma(payments.value) >= total

Integracao com Beauty Center

Quando status muda para "paid":

  1. Para cada SaleService: cria BeautyService com status "available"
  2. Para cada SalePackage: cria um servico para cada item do pacote
  3. Quantidade de servicos = quantidade vendida

Integracao com Delivery

Regras de Criacao

ConfiguracaoQuando Cria Delivery
prepaid_paymentAo mudar para "paid"
postpaid_paymentAo mudar para "pending"

Ao Trocar Cliente

  • Remove todos os itens de delivery
  • Limpa atribuicoes de pet

Notificacoes de Recompra

Ao mudar para "paid", para cada item com repurchase_days > 0:

  • Agenda WhatsApp para X dias no futuro
  • Mensagem: "Ola, [cliente]! Sentimos sua falta aqui na [loja]. Percebemos que o [produto] esta acabando. Estamos te aguardando"

Sale vs Budget

CaracteristicaSale (Venda)Budget (Orcamento)
Gera CheckoutSimNao
Gera Nota FiscalSimNao
Pode virar SaleN/ASim
Fluxo de pagamentoCompletoSimplificado

Escopos de Busca

EscopoDescricao
saleApenas vendas (type = "sale")
budgetApenas orcamentos (type = "budget")
paidStatus = "paid"
pendingStatus = "pending"
canceledStatus = "canceled"
not_paidStatus in ["pending", "open"]
valid_to_calculateStatus in ["paid", "partially_canceled"]
valid_to_deliveryVendas com cliente, prontas para entrega

Filtros Disponiveis

  • search: Por nome ou numero da venda
  • date: Intervalo de datas
  • user: Por operador
  • seller: Por vendedor
  • customer: Por cliente
  • pet_ids: Por pet (dependente do cliente)
  • status: Por status
  • knowledge_channel: Por canal de conhecimento

Permissoes

AcaoCondicao
EditarStatus = "pending" na view show
PagarType = "sale" e status = "pending" e valid_to_pay
CancelarStatus = "paid" ou "partially_canceled"
FinalizarStatus = "open" e tem itens
Converter para VendaType = "budget"
Imprimir ComprovanteStatus = "paid" ou "partially_canceled"
Emitir NFCe/NFSeType = "sale" e status = "paid"