Skip to content

Cardápio Digital com QR Code

Visão Geral

O cardápio QR permite que o cliente acesse o menu, faça pedidos e acompanhe o status diretamente pelo celular, sem baixar nenhum aplicativo. O QR code gerado aponta para a rota pública do tenant, pré-filtrado pelo PDV/mesa.

CaracterísticaDetalhe
URL pública/t/:slug/b/:pdvSlug/menu
AuthNão exige — guest checkout
PWAFunciona offline após primeiro carregamento
Frontendfrontend-react/src/views/customer/MenuView.tsx

Localização

CamadaArquivo
Menu View (cliente)frontend-react/src/views/customer/MenuView.tsx
Cart Viewfrontend-react/src/views/customer/CartView.tsx
Checkout Viewfrontend-react/src/views/customer/CheckoutView.tsx
Order Trackingfrontend-react/src/views/customer/OrderTrackingView.tsx
Menu APIbackend/src/menu/menu.controller.ts

Geração do QR Code

O QR code é gerado pelo admin e vincula mesa + PDV:

URL codificada: https://{dominio}/t/{slug}/b/{pdvSlug}/menu?table={numero}

Para gerar:

  1. Admin → Mesas → [Mesa] → QR Code
  2. Sistema exibe o QR com a URL correta
  3. Imprima ou exporte como PNG para colocar na mesa

O parâmetro ?table= define o número da mesa que aparece no pedido — o cliente não precisa informar manualmente.


Fluxo do Cliente

1. Cliente escaneia o QR com a câmera do celular
2. Navegador abre /t/:slug/b/:pdvSlug/menu
3. Cardápio carrega (categorias + itens com fotos)
4. Cliente adiciona itens ao carrinho
5. Checkout: nome, e-mail opcional, observações
6. Pedido confirmado → número do pedido exibido
7. /track → acompanhamento em tempo real (WebSocket)

Cardápio Público (API)

GET /t/:slug/menu/categories     → categorias ativas
GET /t/:slug/menu/items          → itens ativos (filtro por categoria, disponibilidade)
GET /t/:slug/menu/items/:id      → detalhe com allergens, variações, BOM

Esses endpoints são públicos — não exigem JWT. Retornam apenas itens com active: true e available: true.


Pedido Guest (Checkout)

POST /t/:slug/orders
Body: {
  pdv: string,
  table?: string,
  customerName: string,
  customerEmail?: string,
  customerPhone?: string,
  items: [{ menuItemId, quantity, notes?, allergens? }],
  paymentMethod: 'pix' | 'card' | 'cash',
  orderType: 'dine_in' | 'takeout',
}

Não exige autenticação. O número do pedido gerado segue o formato YYYYMMDD-HEX10 para evitar enumeração.


Funcionamento Offline (PWA)

O frontend é um PWA (Progressive Web App) com service worker que cacheia:

  • Assets estáticos (JS, CSS, fontes)
  • Cardápio (categorias + itens — última versão carregada)

Quando o cliente perde sinal após o primeiro carregamento, o cardápio continua disponível. Pedidos feitos offline entram em fila IndexedDB e são enviados automaticamente ao reconectar.


Chamada de Garçom

O QR de mesa também expõe o botão Chamar garçom — veja Chamada de Garçom por QR.


Permissões

RotaAuth
GET /menu/*Público (sem token)
POST /ordersPúblico (guest checkout)
GET /orders/:number/trackPúblico (acesso pelo número do pedido)

Relacionados

Lançado sob a licença MIT.