Documents Spec vs built platform step-by-step for the Joinville menu pilot. Co-authored-by: Cursor <cursoragent@cursor.com>
8.1 KiB
PRD — Cardápio Joinville (o que a plataforma faz)
| Campo | Valor |
|---|---|
| Produto | Pizza Digital |
| Módulo | Cardápio / Menu (pesquisa regional → operação) |
| Fonte Spec | CARDAPIO-JOINVILLE.md · SPEC-CARDAPIO.md |
| Ambiente auditado | https://pizza.itecnologys.com · VM125 · v0.5.0 |
| Loja piloto | Pizza Digital Joinville (pizza-digital-piloto) |
| Data auditoria | 2026-11-09 |
| Tipo | PRD operacional (Spec × construído × passos de uso) |
1. Entendimento da demanda
Documentar cada Spec não só como intenção, mas como PRD da plataforma real:
- Ler a Spec / pesquisa
- Inspecionar o que está construído (UI + API + banco)
- Descrever passo a passo o que o usuário faz
- Marcar o que já funciona, o que é parcial e o que falta
Este arquivo é o exemplo-piloto usando CARDAPIO-JOINVILLE.md.
2. Problema e objetivo
Problema
Pizzarias de Joinville vendem com nomenclatura inconsistente de tamanhos, sabores regionais e preços locais. Sem um cardápio único, PDV/KDS/canais divergem.
Objetivo do módulo (construído)
Ser a fonte da verdade do que a loja vende no piloto Joinville: categorias, itens, preços base (Grande), tamanhos no pedido, split de sabores e acompanhamentos — alimentando o PDV e, depois, KDS/Central.
Fora deste PRD
Saldo de estoque, NF, inventário → SPEC-ESTOQUE.md / SmartStock.
3. O que a pesquisa Joinville definiu vs o que existe hoje
| Tema (CARDAPIO-JOINVILLE) | Spec / pesquisa | Construído na plataforma (2026-11-09) | Status |
|---|---|---|---|
| 6 tamanhos (Broto→Família) | cm, fatias, sabores máx., fator preço | Tabela PizzaSizeBase com 6 sizeCodes ativos |
✅ |
| Preço base = Grande 40 cm | Sim | MenuItem.priceCents = preço Grande; PDV multiplica por priceFactor |
✅ |
| Split = maior sabor × fator | Sim | Sheet do PDV: escolhe tamanho + N sabores até maxFlavors |
✅ |
| Tradicionais alta rotação | Lista ~20 sabores | Cat. Tradicionais · 20 ativos (Calabresa, Mussarela, Frango Catupiry…) | ✅ |
| Regionais SC | Joinville, Linguiça Blumenau, Aipim, Catarina | Cat. Da casa · 6 ativos (+ Aipim Blumenau, Coração) | ✅ |
| Doces | 6 tipos | Cat. Doces · 6 ativos (Broto legado inativo) | ✅ |
| Bebidas / sucos / energéticos / vitaminas | Tabelas de mercado | 4 categorias · 57 itens ativos | ✅ |
| Bordas | Catupiry/Cheddar ~R$12–20 | Cat. Bordas especiais · 3 itens | ✅ |
| SKU Broto separado | Evitar no piloto | Cat. legado Pizzas Broto · active=false · 5 itens inativos |
✅ (legado) |
Cardápio público PWA /c/:slug |
Track C1 | Ainda não é o foco deste PRD | ⏳ |
| CRUD gestor no Admin | RF-MEN-01 | API CRUD existe; UI Admin menu | ⚠️ parcial |
Inventário real (banco piloto)
| Categoria | Ativos | Inativos |
|---|---|---|
| Tradicionais | 20 | 1 |
| Da casa | 6 | 0 |
| Doces | 6 | 1 |
| Refrigerantes | 23 | 0 |
| Sucos | 14 | 0 |
| Energéticos | 8 | 0 |
| Vitaminas · frutas c/ leite | 12 | 0 |
| Bordas especiais | 3 | 0 |
| Pizzas Broto (legado) | 0 | 5 |
| Total | 92 | 7 |
Tamanhos reais (PizzaSizeBase)
| sizeCode | Nome | cm | Fatias | Sabores máx. | Fator |
|---|---|---|---|---|---|
| broto | Broto | 25 | 4 | 1 | 0,55 |
| pequena | Pequena | 30 | 6 | 1 | 0,70 |
| media | Media | 35 | 8 | 2 | 0,85 |
| grande | Grande | 40 | 12 | 3 | 1,00 |
| gigante | Gigante | 45 | 16 | 4 | 1,20 |
| familia | Familia | 50 | 20 | 4 | 1,35 |
4. Personas e telas
| Persona | Onde usa o cardápio | Rota |
|---|---|---|
| Atendente PDV | Monta pedido a partir do cardápio | /pdv |
| Gestor | CRUD categorias/itens (API/Admin) | /admin · /api/menu/* |
| Cliente (futuro) | Cardápio digital | /c/:slug (Track C) |
| Cozinha | Não edita cardápio; recebe itens mapeados a estações | /kds/* |
5. Fluxo passo a passo — Atendente no PDV (construído)
Caminho feliz: pizza com tamanho + split + bebida → enviar à cozinha.
Passo 1 — Entrar
- Abrir https://pizza.itecnologys.com/login
- Usar demo:
pdv@pizza.local/805353(lojapizza-digital-piloto) - Ir em PDV
Passo 2 — Tipo de fulfillment
- Escolher Entrega, Balcão ou Mesa
- Se Entrega: preencher Cliente, Telefone, Bairro, Endereço
- Opcional: observações e flag Urgente
Passo 3 — Escolher item do cardápio
- Navegar nas categorias (Tradicionais, Da casa, Doces, Refrigerantes…)
- Tocar num item
- Se o item é pizza (
halfHalf=true): abre sheet de montagem - Se é bebida/extra: adiciona linha direta ao pedido
Passo 4 — Montar pizza (regra Joinville)
- Escolher tamanho (Broto…Família) na grade
- Sistema limita sabores pelo
maxFlavorsdo tamanho - Selecionar 1..N sabores (split)
- Preço unitário = maior
priceCentsentre sabores ×priceFactordo tamanho - Opcional: borda especial
- Confirmar → linha no “Pedido atual” com nome tipo:
Pizza Grande 40cm · Calabresa / Mussarela
Passo 5 — Enviar à cozinha
- Revisar linhas e total
- Enviar pra cozinha
- Pedido entra na Central
/pedidose gera tickets KDS conforme estações do item
6. Fluxo passo a passo — Gestor (API / Admin)
Listar cardápio
GET /api/menu (JWT) → { pizzaSizes, categories[] } com itens ativos.
Tamanhos
GET /api/menu/sizes → catálogo PizzaSizeBase.
CRUD (RF-MEN-01 — parcial na UI)
POST/PATCH/DELETE /api/menu/categoriesPOST/PATCH/DELETE /api/menu/items- Campos relevantes:
name,priceCents,halfHalf,active,stockMode, estações, ficha (BOM)
Regra de negócio congelada (piloto)
- Preço catalogado = Grande
- Broto/Pequena = 1 sabor (inteira)
- Média ≤2 · Grande ≤3 · Gigante/Família ≤4
- Split cobra o maior sabor
- Cardápio não guarda saldo — ponte via
stockMode+ ficha
7. Arquitetura funcional (como a plataforma liga as peças)
CARDAPIO-JOINVILLE.md (pesquisa)
│
▼
seed / MenuCategory + MenuItem + PizzaSizeBase
│
├─► PDV sheet (tamanho × sabores × fator)
├─► OrderItem (sizeCode, halfHalf, preço calculado)
├─► KDS (estações do MenuItem)
└─► Estoque (BOM / RecipeLine) — SPEC irmã
8. Critérios de aceite (PRD)
| # | Critério | Evidência | Status |
|---|---|---|---|
| CA-01 | Existem ≥6 tamanhos com fator e max sabores | PizzaSizeBase |
✅ |
| CA-02 | Catálogo Joinville com tradicionais + SC + doces + bebidas | 92 ativos | ✅ |
| CA-03 | PDV calcula preço por tamanho a partir da base Grande | PdvPage priceForSize |
✅ |
| CA-04 | PDV impede ultrapassar max sabores do tamanho | validação sheet | ✅ |
| CA-05 | API menu autenticada por loja | /api/menu |
✅ |
| CA-06 | Categoria Broto legado não aparece como catálogo ativo | active=false |
✅ |
| CA-07 | PDV mostra categorias/itens ao operador logado | UI /pdv |
⚠️ a validar (em 2026-11-09 UI mostrou “Nenhuma categoria…” apesar da API OK — possível bug de fetch/cache) |
| CA-08 | PWA cardápio público | Track C | ⏳ |
9. Gaps e próximos passos
- Investigar PDV sem categorias na UI enquanto API retorna 8 cats / 92 itens
- Completar UI Admin de CRUD alinhada ao RF-MEN-01
- Expor cardápio no canal digital (SPEC-CANAIS)
- Ligar indisponibilidade a Estoque (esgotado / pausado)
- Repetir este formato de PRD para as demais Specs (KDS, Despacho, Matriz, etc.)
10. Referências
- Pesquisa:
CARDAPIO-JOINVILLE.md - Spec:
SPEC-CARDAPIO.md - Estoque:
SPEC-ESTOQUE.md - App: https://pizza.itecnologys.com
- Código:
apps/web/src/PdvPage.tsx·apps/api/src/menu/*·prisma/seed.ts
— PRD gerado a partir de Spec + auditoria da plataforma · iTecnologys