Skip to content

Display de Cozinha (KDS)

Visão Geral

O KDS (Kitchen Display System) é a tela principal da cozinha. Pedidos entram em tempo real via WebSocket assim que o PDV ou o cliente confirma. A tela é full-screen, sempre dark, sem header de admin — pensada para tablets e monitores de cozinha.

CaracterísticaDetalhe
Rota/t/:slug/kitchen
AuthJWT obrigatório; roles aceitos: staff, branch_manager, admin, superadmin
WebSocket namespace/kitchen
Frontendfrontend-react/src/views/kitchen/KitchenDisplayView.tsx
Backendbackend/src/kitchen/kitchen.gateway.ts

Localização das Camadas

CamadaArquivo
WebSocket Gatewaybackend/src/kitchen/kitchen.gateway.ts
SLA Processorbackend/src/kitchen/kitchen-sla.processor.ts
Order Cardfrontend-react/src/components/kitchen/KitchenOrderCard.tsx
Recall Panelfrontend-react/src/components/kitchen/RecallPanel.tsx
KDS Keyboard Legendfrontend-react/src/components/kitchen/KdsKeyboardLegend.tsx

Layout em Lanes

O display agrupa pedidos em quatro colunas (lanes):

LaneStatusCor padrão
NOVOpendingLaranja
CONFIRMADOconfirmedAmarelo
PREPARANDOpreparingAzul
PRONTOreadyVerde

A cor exata de cada lane vem de frontend-react/src/constants/statusColors.ts (KDS_LANE_COLORS).


Eventos WebSocket

Fluxo de entrada

OrdersService.create()   → emitNewOrder(tenantId, order, zones[])
OrdersService.update()   → emitOrderStatusUpdate(tenantId, order)
StoneService.webhook()   → emitPaymentUpdate(tenantId, { orderId, paymentStatus })
KdsProcessor             → emitOrderSlaAlert(tenantId, { orderId, elapsedMinutes, slaMinutes })

Eventos emitidos pelo gateway

EventoPayload resumidoDestino
newOrderPedido completoSala kitchen-{tenantId}
newOrder (por zona)Pedido filtrado por printZoneSala kitchen-{tenantId}-{zone}
orderStatusUpdateDelta lean { _id, status, priority, updatedAt }Sala kitchen-{tenantId}
orderStatusUpdatePedido completoSala order-{orderNumber} (tracking do cliente)
paymentUpdate{ orderId, paymentStatus, orderNumber }Sala kitchen-{tenantId}
itemStatusUpdate{ orderId, orderNumber, itemIndex, status }Sala kitchen-{tenantId}
orderSlaAlert{ orderId, orderNumber, elapsedMinutes, slaMinutes }Sala kitchen-{tenantId}

Eventos escutados pelo gateway (client → server)

EventoPayloadAção
joinKitchen{ tenantId, zone? }Entra na sala. Superadmin pode entrar em qualquer tenant; auto-leave 30min
trackOrderorderNumberEntra na sala order-{orderNumber} (com rate-limit 20/min)

SLA — Tempo de Preparo Monitorado

A constante SLA_THRESHOLD_MINUTES = 12 (minutos) dispara destaque vermelho no card independente do SLA por pedido.

Cada Order pode ter slaMinutes customizado. O processador BullMQ kitchen-sla.processor.ts enfileira alertas quando o tempo decorrido ultrapassa o limiar:

typescript
emitOrderSlaAlert(tenantId, {
  orderId,
  orderNumber,
  elapsedMinutes,   // calculado em tempo real
  slaMinutes,       // vem de order.slaMinutes ?? branch.kdsSlaMinutes ?? 15
});

O card reage ao evento orderSlaAlert: dispara playSlaBeep() (Web Audio API, sem arquivo externo) e exibe o card com borda vermelha pulsante.


Alertas de Alergia

Itens com restrição alimentar chegam no campo order.items[].notes ou em order.items[].allergens[]. O KitchenOrderCard exibe banner vermelho quando detecta a presença de:

  • allergens[] não vazio no item
  • notes contendo termos como alergia, intolerância, sem glúten, sem lactose

Sinalizador impossível de ignorar — posição sempre acima da lista de itens, com ícone AlertTriangle.


Roteamento por Zona (Print Zone)

O campo MenuItem.printZone determina para qual estação o item deve aparecer. Valores típicos:

ZonaEstação
hotCozinha quente
coldCozinha fria / sobremesas
barBar / bebidas

Quando a cozinha abre com ?zone=bar, o gateway entrega apenas os itens com printZone === 'bar' via emitNewOrder(tenantId, order, zones). Pedidos sem zona vão para o display sem filtro.

Configuração de zona por item: Admin → Cardápio → Item → Zona de Impressão.


Item-Level Status (por ingrediente/prato)

Além do status do pedido inteiro, cada item tem status próprio:

pending → in_preparation → ready → delivered

O atendente pode avançar item a item pelo KDS, permitindo que o garçom sirva itens prontos antes de toda a comanda estar completa. O backend emite itemStatusUpdate via WebSocket.


Bump Bar (Teclado)

O KDS suporta controle sem toque — útil quando o operador usa luvas:

TeclaAção
/ Mover foco entre pedidos
/ Rolar a lista
EnterAvançar status do pedido focado
BAvançar o primeiro item não-entregue (bump)
RRecall (desfaz bump)
FMarcar/desmarcar pedido como flagged

O hook useKdsKeyboard (frontend-react/src/hooks/useKdsKeyboard.ts) gerencia o estado de foco e dispara onBump.


Recall Panel

Pedidos marcados como delivered (bump) aparecem no painel lateral de recall por 15 minutos. Um deslize para a esquerda (swipe ou botão R) restaura o pedido para ready. Útil quando o operador avança por engano.


Permissões

RoleAcesso KDS
customerBloqueado (WebSocket rejeita)
staffLeitura + atualização de status
branch_managerLeitura + atualização de status
adminLeitura + atualização de status
superadminQualquer tenant; auto-leave 30min

Relacionados

Lançado sob a licença MIT.