Skip to content

PDV — Terminais de Venda

Visão Geral

Um PDV (Ponto de Venda) é o terminal onde as transações ocorrem. Cada PDV pertence a uma Filial (Branch) — a relação é N:1. Uma filial pode operar 10+ terminais simultâneos.

Branch (1) ──── PDV (N) ──── Shift (N) ──── Order (N)

Localização

frontend-react/src/views/admin/PdvManagementView.tsxbackend/src/pdvs/schemas/pdv.schema.ts

Rota

/t/:slug/admin/pdv


Schema

CampoTipoDescrição
tenantObjectIdTenant
branchObjectId?Filial pai — FK para Branch (adicionado na feature enterprise)
namestringNome do terminal (ex: "Caixa 1")
slugstring?Identificador para URLs do cliente (ex: balcao-principal)
descriptionstring?Descrição
serviceModestringModo de operação (ver abaixo)
activebooleanSe o terminal está ativo
isDefaultbooleanTerminal padrão do tenant
pinstring?PIN de 4–6 dígitos (armazenado com hash bcrypt)
assignedUsersObjectId[]Usuários autorizados a operar este terminal
stoneTerminalSerialstring?Serial da maquininha Stone
redeTerminalSerialstring?Serial do terminal Rede
addressstring?Endereço (para PDVs sem branch associada)
cnpjstring?CNPJ (para PDVs autônomos ou com CNPJ próprio)
focusNfeTokenstring?Token Focus NFe específico deste terminal

Índices:

  • { name, tenant } — unique
  • { slug, tenant } — unique sparse
  • { branch, tenant } — listagem por filial

Modos de Serviço

ModoDescrição
mesaAtendimento por garçom em mesas numeradas — abre comanda por mesa
balcaoAtendente opera o PDV para o cliente presencialmente
auto_atendimentoQuiosque self-service — dados obrigatórios, pagamento no terminal
balcao_clienteCliente faz o próprio pedido e paga no terminal (alto giro)

Relação Branch → PDV

O campo branch associa o terminal à sua filial física. Esta associação é usada para:

  1. RBAC Branch ManagerBranchScopeGuard resolve assignedBranchIds → pdvIds via Redis
  2. Cash Session rollupShift.branch é denormalizado de pdv.branch no momento da abertura
  3. Daily ReportGET /branches/:id/daily-report agrega Shifts { branch: branchId } por PDV
  4. Cache invalidationcreate() e update() do PDV invalidam branch:pdvs:{branchId} no Redis

Invalidação de cache

backend/src/pdvs/pdvs.service.ts:

typescript
const BRANCH_PDVS_PREFIX = 'branch:pdvs';

// Invalida ao criar ou alterar branch/active de um PDV
await this.redis.del(`${BRANCH_PDVS_PREFIX}:${branchId}`);

Pagamento com Cartão via Gateway

CampoGatewayComportamento no PaymentModal
stoneTerminalSerial preenchidoStoneCria Payment Intent → envia cobrança para a maquininha física → aguarda webhook → WebSocket paymentUpdate (até 60s)
redeTerminalSerial preenchidoRedeFluxo equivalente via API Rede
Ambos vaziosManualAtendente confirma manualmente no sistema

Pré-requisito: STONE_CLIENT_ID + STONE_CLIENT_SECRET (ou equivalentes Rede) no backend. Veja Gateways de Pagamento.


API

Listar PDVs

GET /t/:slug/pdvs
GET /t/:slug/admin/pdvs?branchId=&active=

PDVs de uma Filial

GET /t/:slug/admin/branches/:branchId/pdvs

CRUD

POST   /t/:slug/admin/pdvs         { name, slug?, serviceMode, branch?, ... }
PUT    /t/:slug/admin/pdvs/:id     { qualquer campo }
DELETE /t/:slug/admin/pdvs/:id
GET    /t/:slug/admin/pdvs/:id

Relacionados

Lançado sob a licença MIT.