Venda de balcão
Como funciona o registro de uma venda de balcão (PDV) com emissão de NFC-e, recibo e cancelamento, com mapa das rotas.
Uma venda de balcão é a venda feita presencialmente, com o cliente na frente do operador. A API registra a venda como um pedido da loja já pago (canal pos), grava o pagamento, e emite a NFC-e (Nota Fiscal de Consumidor Eletrônica, o cupom fiscal eletrônico do varejo) pelo provedor fiscal configurado. Serve para um caixa próprio, um totem ou qualquer sistema que venda no balcão usando o estoque e o catálogo da plataforma.
Estas são as rotas de administração do balcão. O aplicativo de caixa do operador (abertura de caixa, carrinho, sangria) usa outro conjunto de rotas que não é coberto aqui.
Como funciona
Ciclo de uma venda
- Encontre os produtos
GET /pos/products/lookupbusca por nome, SKU ou código de barras e devolve o id e o preço de cada produto. - Registre a venda
POST /pos/salesvalida as linhas, recalcula os preços, cria o pedido pago, grava a venda e tenta emitir a NFC-e na hora. - Confira a emissão
A resposta traz
emission_status. Se vierpending, a nota entrou numa fila e será emitida em segundo plano (contingência). Consulte depois a lista de vendas. - Imprima o recibo
GET /pos/sales/{id}/receiptdevolve os bytes ESC/POS para impressora térmica (ou HTML comformat=html), e/receipt.jsondevolve os mesmos dados estruturados.
Estados
| Campo | Valores | Significado |
|---|---|---|
status da venda | completed | Venda concluída (valor inicial). |
cancelled | Cancelada: pedido cancelado e nota cancelada no provedor. | |
emission_status (resposta da criação) | authorized | NFC-e autorizada na hora. |
pending | Aguardando emissão (provedor lento ou indisponível). A venda existe; a nota sai depois. | |
failed | O provedor recusou os dados da nota. A venda existe e o pedido está pago. |
Conceitos importantes
Estabelecimento fiscal
Toda venda é emitida por um estabelecimento: o CNPJ emissor cadastrado nas configurações fiscais da loja, já provisionado no provedor de notas. O establishment_id da venda é o id desse cadastro. Estabelecimento sem provisionamento devolve 422 establishment not provisioned.
Pagamento único e dividido
Para um pagamento só, envie payment_method e amount_paid_cents. Para dividir (parte em dinheiro, parte no Pix), envie a lista payments. Nesse caso ela é a fonte da verdade: a forma principal é a de maior valor e o total recebido é a soma. O troco é o recebido menos o total da venda (nunca negativo).
Contingência de 15 segundos
A API espera até 15 segundos pela autorização da nota. Passado esse tempo, devolve 201 com emission_status: "pending" e deixa a emissão para o processo de fundo, que emite uma única vez. Não reenvie a venda por causa de um pending: ela já foi gravada.
Endpoints
| Método e caminho | Para que serve | Auth | Página |
|---|---|---|---|
GET /api/v1/admin/pos/products/lookup | Busca de produtos com preço do servidor | admin | Busca de produtos |
POST /api/v1/admin/pos/sales | Registra a venda e emite a NFC-e | admin | Vendas |
GET /api/v1/admin/pos/sales | Lista as vendas (padrão: do dia) | admin | Vendas |
POST /api/v1/admin/pos/sales/{id}/cancel | Cancela a venda e a nota | admin | Vendas |
GET /api/v1/admin/pos/sales/{id}/receipt | Recibo em ESC/POS ou HTML | admin | Recibos |
GET /api/v1/admin/pos/sales/{id}/receipt.json | Recibo estruturado em JSON | admin | Recibos |
Erros comuns
- Mandar o preço e esperar que valha.
unit_price_centsé descartado. Se o preço mudou no catálogo, a venda usa o novo. - Esquecer o CPF acima de R$ 3.000,00. A venda é recusada com
422. - Mandar
payment_methodfora decash,cardoupixno pagamento único. A validação desse campo é fraca: o pedido pode ser criado e a gravação da venda falhar depois. Envie só os três valores. - Repetir a venda após
pending. Duplica o pedido. Espere e consulte a lista. - Listar sem datas e achar que sumiu. Sem
frometo, a lista traz só o dia de hoje. - Achar que cancelar é instantâneo. A venda só passa a
cancelleddepois que o provedor fiscal confirma o cancelamento da nota. Se ele recusar, você recebe422e a venda continuacompleted. - Esperar
404em id inexistente. Recibo e cancelamento devolvem500/422comsql: no rows in result set; valide o id antes.