Mirror all SPECs and construction docs from pizza-digital, add hub/sidebar links and bidirectional sync scripts.
6.7 KiB
6.7 KiB
Context Prompt — Central de Pedidos (Cursor)
Cole o bloco PROMPT abaixo num chat Cursor (Agent) no repo
pizza-digital.
Spec:SPEC.md§5.5 ·docs/SPEC-CANAIS-DIGITAIS.md· RF-PED / RF-CAN
Código base:apps/web/src/PedidosPage.tsx· rota/pedidos
PROMPT (copiar daqui)
# Missão
Construir / evoluir o módulo **Central de Pedidos** do produto **Pizza Digital**
(rota `/pedidos`) — o quadro operacional único da loja, estilo CityFoods.
PT-BR em toda UI e comentários de produto. Código TS em inglês.
# Contexto do produto
Pizza Digital = SO da cozinha + delivery próprio (não é marketplace).
Referência UX: CityFoods — Cozinha Digital + quadro Pedidos (`@cityfoods_app`).
A Central de Pedidos é o **hub pós-login**:
- Staff entra → `/pedidos` (não /pdv)
- CTA **+ Novo** → PDV (`/pdv`) para digitar pedido
- Pedidos de **qualquer canal** (PDV, cardápio digital, WhatsApp, iFood, telefone)
caem no **mesmo Order** e aparecem neste quadro
- Daqui a loja vai para KDS, etiqueta e despacho
Regra de ouro (SPEC §5.5):
> Nenhum canal tem UI de cozinha própria — tudo passa pelo Order bus e pelo `/pedidos`.
# Dimensões de pedido (alvo — migrar do `channel` legado)
origin: "pdv" | "cardapio" | "ifood" | "whatsapp" | "telefone"
fulfillment: "entrega" | "retirada" | "mesa"
Legado atual (Prisma `OrderChannel`):
delivery → origin=pdv, fulfillment=entrega
balcao → origin=pdv, fulfillment=retirada
pdv → origin=pdv, fulfillment=mesa
UI do card:
- Faixa colorida = fulfillment (ENTREGA / RETIRADA / MESA) + código curto
- Badge secundário = origin (CARDÁPIO / IFOOD / WHATSAPP / PDV / TELEFONE)
# Stack (não trocar)
- Monorepo: apps/api (NestJS + Prisma + Socket.io) · apps/web (React + Vite + TS)
- DB: PostgreSQL · Redis · Docker na VM 125
- Auth: JWT via `useAuth` / `authFetch`
- Realtime: Socket.io eventos `order.created` | `order.updated` | `order.ready` | `ticket.bumped`
- Host: https://pizza.itecnologys.com · path /pedidos
# Arquivos-chave (ler antes de editar)
- SPEC.md (§5.5, §6.1, §7.1 RF-PED, §7.8 RF-CAN, §10)
- docs/SPEC-CANAIS-DIGITAIS.md
- apps/web/src/PedidosPage.tsx ← tela Central
- apps/web/src/PdvPage.tsx ← + Novo
- apps/web/src/App.tsx ← login → /pedidos
- apps/web/src/styles.css ← classes .pedidos-*
- apps/web/src/channelLabel.ts
- apps/api/prisma/schema.prisma ← Order ainda tem `channel`
- apps/api (módulo orders + gateway WS)
# Estado atual (já no ar)
- Skin CityFoods: header Pedidos / + Novo, chips de tags, grid de cards, aside Histórico
- WS refresh no board
- Filtro ACTIVE = confirmado | em_producao | pronto
- channelTag mapeia delivery/balcao/pdv → ENTREGA/RETIRADA/MESA (ainda via `channel`)
- Marcar pronto, link etiqueta, link KDS
- Ainda NÃO há: origin/fulfillment no schema, badge de origem, som de novo pedido digital,
filtros por fulfillment/origin, cancelar/editar no card, som + highlight de pedido novo
# O que construir nesta sessão (Central de Pedidos — pacote board)
## P0 — modelo + API
1. Migrar Order: adicionar `origin` + `fulfillment` (manter `channel` deprecated ou mapear na leitura)
2. Create/list orders aceitam e devolvem origin/fulfillment
3. Compat: PDV continua mandando channel legado → API normaliza para origin+fulfillment
4. WS payload inclui origin + fulfillment
## P1 — UI Central `/pedidos`
1. Card: faixa = fulfillment; badge = origin (CARDÁPIO / IFOOD / …)
2. Som + flash no card quando `order.created` (especialmente origin digital)
3. Filtros: Todos | Entrega | Retirada | Mesa + opcional por origin
4. Ordenação: horário (default) | nº pedido | urgente primeiro
5. Histórico lateral: últimos prontos/em_rota/entregue com origin
6. Ações no card: ✓ pronto (se em_producao) · etiqueta · abrir KDS · (depois) cancelar
7. Empty state: “Nenhum pedido” + CTA + Novo
8. Touch-first, legível a 1 m; pt-BR; R$ via money.ts
## P2 — ponte canais (não implementar cardápio inteiro aqui)
- Garantir que POST /api/orders com origin=cardapio|ifood|whatsapp aparece no board ≤ 500 ms
- Badge correto; fulfillment escolhido pelo cliente
- Stub: endpoint/fixture que simula pedido digital para testar o board sem PWA
# UX CityFoods a preservar
- Faixa ENTREGA/RETIRADA no topo do card
- Tags de sabor/components sob o item
- “Preparo tardio” se em_producao > 20 min
- Histórico com check à direita
- + Novo em destaque no header
- Sem dashboard genérico; um quadro operacional
# Critérios de aceite
1. Login → /pedidos abre o quadro
2. + Novo → /pdv → criar pedido → volta a aparecer no quadro via WS sem F5
3. Pedido simulado origin=cardapio mostra badge CARDÁPIO + faixa ENTREGA/RETIRADA
4. Latência visual ≤ 500 ms após order.created
5. KDS e etiqueta continuam funcionando a partir do mesmo Order
6. Mobile/tablet: cards usáveis com dedo; sem regressão no PDV
# Fora de escopo nesta sessão
- PWA cardápio /c/:slug completo (Track C1.1–C1.3 — sessão separada)
- Webhook iFood real (C2)
- Rotas / ORS / motoboy
- Redesign do KDS
- Multi-tenant SaaS
# Como trabalhar
1. Ler SPEC §5.5 + PedidosPage + schema Order
2. Mudar uma fatia por vez (schema → API → UI → fixture digital)
3. Não inventar libs novas; seguir padrões Nest/React do repo
4. Depois de UI: rebuild web se deploy Docker; validar /pedidos
5. Atualizar docs/SPEC-CANAIS-DIGITAIS.md se fechar um critério C1.x
Comece pelo gap origin/fulfillment (API + badges no PedidosPage). Mostre o plano curto e implemente.
Prompt curto (follow-up / hillclimb)
Continua a Central de Pedidos (/pedidos) no Pizza Digital.
SPEC §5.5 · origin×fulfillment · badge origem · WS ≤500ms · CityFoods skin.
Não faça o cardápio PWA agora — só o board + normalização do Order.
Arquivo principal: apps/web/src/PedidosPage.tsx + orders API + prisma Order.
Mapa mental (1 tela)
┌─────────────────────────────────────────┐
Canais → │ CENTRAL DE PEDIDOS /pedidos │ → KDS
│ + Novo → PDV │ → Etiqueta
│ cards: fulfillment + badge origin │ → Despacho
└─────────────────────────────────────────┘
Checklist de sessão
| # | Item | Done |
|---|---|---|
| 1 | origin + fulfillment no Prisma/API |
☐ |
| 2 | Badges no card PedidosPage | ☐ |
| 3 | Som/flash order.created |
☐ |
| 4 | Filtros fulfillment | ☐ |
| 5 | Fixture pedido digital | ☐ |
| 6 | Aceite WS ≤ 500 ms | ☐ |