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 Manager — BranchScopeGuard resolve assignedBranchIds → pdvIds via Redis
  2. Cash Session rollup — Shift.branch é denormalizado de pdv.branch no momento da abertura
  3. Daily Report — GET /branches/:id/daily-report agrega Shifts { branch: branchId } por PDV
  4. Cache invalidation — create() 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.