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ística | Detalhe |
|---|---|
| URL pública | /t/:slug/b/:pdvSlug/menu |
| Auth | Não exige — guest checkout |
| PWA | Funciona offline após primeiro carregamento |
| Frontend | frontend-react/src/views/customer/MenuView.tsx |
Localização
| Camada | Arquivo |
|---|---|
| Menu View (cliente) | frontend-react/src/views/customer/MenuView.tsx |
| Cart View | frontend-react/src/views/customer/CartView.tsx |
| Checkout View | frontend-react/src/views/customer/CheckoutView.tsx |
| Order Tracking | frontend-react/src/views/customer/OrderTrackingView.tsx |
| Menu API | backend/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:
- Admin → Mesas → [Mesa] → QR Code
- Sistema exibe o QR com a URL correta
- 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, BOMEsses 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
| Rota | Auth |
|---|---|
GET /menu/* | Público (sem token) |
POST /orders | Público (guest checkout) |
GET /orders/:number/track | Público (acesso pelo número do pedido) |