Pré-pedidos Agendados
Visão Geral
O cliente faz o pedido agora mas indica um horário de retirada/entrega futuro. O sistema armazena o pedido e o envia automaticamente para a cozinha no horário calculado para que esteja pronto no momento combinado.
| Característica | Detalhe |
|---|---|
| Campo no pedido | Order.scheduledFor (Date ISO 8601) |
| Disparo | BullMQ job com delay = scheduledFor − avgPrepTime |
| Visibilidade no KDS | Pedido não aparece no KDS até o horário de disparo |
| Frontend cliente | frontend-react/src/views/customer/CheckoutView.tsx |
Localização
| Camada | Arquivo |
|---|---|
| Schema | backend/src/orders/schemas/order.schema.ts — scheduledFor |
| Service | backend/src/orders/orders.service.ts — scheduleOrderRelease() |
| Frontend | frontend-react/src/views/customer/CheckoutView.tsx |
| PDV | frontend-react/src/views/pdv/PdvTerminalView.tsx |
Fluxo
Cliente: escolhe hora de retirada no checkout (ex: 14:30)
│
▼
POST /t/:slug/orders { ..., scheduledFor: "2026-05-28T14:30:00Z" }
│
▼
OrdersService.create()
→ Pedido criado com status: 'scheduled' (não vai para KDS)
→ Calcula releaseAt = scheduledFor − branch.avgPrepMinutes
→ Enfileira BullMQ job com delay = releaseAt − now
│
▼
Job executa no releaseAt:
→ Status muda para 'pending'
→ KitchenGateway.emitNewOrder() → aparece no KDS
→ WhatsApp: "Seu pedido entrou em preparo"Schema
typescript
// backend/src/orders/schemas/order.schema.ts
@Prop()
scheduledFor?: Date; // Data/hora de retirada desejada pelo cliente
@Prop()
releaseAt?: Date; // Calculado: scheduledFor − avgPrepMinutesStatus de pedido agendado:
| Status | Descrição |
|---|---|
scheduled | Aguardando horário de disparo — não visível no KDS |
pending | Disparado, visível no KDS, em fila de preparo |
Configuração
Admin → Configurações → Pedidos Agendados:
| Campo | Descrição |
|---|---|
| Habilitar pré-pedidos | Liga/desliga o seletor de horário no checkout |
| Janela de agendamento | Quantas horas à frente o cliente pode agendar (default: 24h) |
| Tempo médio de preparo | Usado para calcular releaseAt (default: branch.kdsSlaMinutes) |
| Intervalo de horário | Granularidade do seletor (default: 15min) |
Visibilidade para o Admin
Em Admin → Pedidos, pedidos agendados aparecem com badge "Agendado para HH:MM". O admin pode:
- Antecipar — move
releaseAtpara agora (botão "Preparar agora") - Cancelar — estorna se cliente cancelar antes do disparo
API
POST /t/:slug/orders
Body: { ..., scheduledFor: "2026-05-28T14:30:00.000Z" }
GET /t/:slug/admin/orders?status=scheduled
→ Lista pedidos agendados pendentes de disparo
PATCH /t/:slug/admin/orders/:id/release-now
→ Dispara imediatamente (antecipação manual)