obsidian-vault/Pizza-Digital/docs/SPEC-KDS-PIZZAIOLO-MODELO-B.md
Roger 62a20a2573 Add Pizza-Digital docs to Obsidian vault and sync with VM125.
Mirror all SPECs and construction docs from pizza-digital, add hub/sidebar links and bidirectional sync scripts.
2026-11-09 19:45:11 +00:00

221 lines
8.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SPEC — KDS Operacional do Pizzaiolo (Modelo B)
**Status:** aprovado para implementação
**Produto:** Pizzaza / Pizza Digital
**Data:** 2026-10-25
**Referência visual:** mock operacional (cards por pizza, áreas coloridas, botões grandes)
**Arquitetura de fluxo:** Modelo B — montagem e forno com responsáveis independentes
---
## 1. Objetivo
Separar completamente:
| Camada | Público | Natureza |
|--------|---------|----------|
| **KDS operacional (pizzaiolo)** | Role `kds` (e futuros papéis montagem/forno) | Estação de produção touch, unidade = **pizza** |
| **KDS / Ops administrativo** | `gestor` / admin | Kanban de pedidos, Pooling, faturamento, metas |
O pizzaiolo **não** vê Pedidos, PDV, Pooling financeiro, relatórios nem configurações.
Esconder menu não basta: rotas e APIs administrativas devem rejeitar role `kds`.
---
## 2. Unidade de trabalho
- **Unidade:** `PrepTask` (uma pizza / unidade de preparo).
- Um pedido com N pizzas pode ter pizzas em estágios e com pizzaiolos diferentes.
- Marcar pizza pronta **não** marca o pedido pronto.
- Pedido só segue para liberação quando **todas** as pizzas e itens obrigatórios (bebidas, sobremesas, adicionais) forem conferidos na expedição.
Identificação no card: `#PEDIDO · Pizza seq/total` (ex.: `#N16 · Pizza 1/2`).
---
## 3. Estados da pizza (máquina oficial)
```
disponivel
│ PEGAR
▼
em_montagem (responsável montagem)
│ FINALIZAR MONTAGEM
▼
aguardando_forno (sem forneiro ainda)
│ ASSUMIR FORNO (+ INICIAR FORNO)
▼
no_forno (responsável forno)
│ MARCAR PRONTA
▼
pronta → fila de expedição (automático)
```
### Transições e botões
| Botão | De → Para | Efeito |
|-------|-----------|--------|
| **PEGAR** | disponivel → em_montagem | Atribui montagem ao usuário; inicia cronômetro da etapa; atômico no servidor |
| **DEVOLVER À FILA** | em_montagem → disponivel | Remove responsável; preserva tempo já consumido; motivo opcional/obrigatório conforme config |
| **FINALIZAR MONTAGEM** / **ENVIAR AO FORNO** | em_montagem → aguardando_forno | Encerra tempo de montagem; **não** atribui forneiro |
| **ASSUMIR FORNO** | aguardando_forno → no_forno (aguardando início) | Identifica forneiro |
| **INICIAR FORNO** | (opcional explícito) marca `fornoStartedAt` | Se omitido na v1, ASSUMIR FORNO também inicia cocção |
| **MARCAR PRONTA** | no_forno → pronta | Encerra cocção; envia à expedição automaticamente |
| **TRANSFERIR** | qualquer etapa atribuída | Troca responsável com motivo; histórico preservado |
| **REPORTAR PROBLEMA** | qualquer | Registra ocorrência sem apagar histórico |
### Dupla atribuição
Claim/assume é **atômico** (`UPDATE … WHERE status = X AND claimedById IS NULL`).
Se dois usuários competirem, só um vence; o outro recebe conflito 409.
---
## 4. Layout do KDS pizzaiolo (Kanban operacional)
Quatro colunas Kanban (cards grandes, touch), unidade = pizza:
1. **Disponíveis** — sem responsável → **PEGAR**
2. **Montagem** — em preparo → **ENVIAR AO FORNO** (+ Devolver)
3. **Forno** — fila (`aguardando_forno`) + cocção (`no_forno`) → **PRONTA → CHECAGEM**
Qualquer pizzaiolo/forneiro autorizado pode marcar pronta (não só quem assumiu).
4. **Checagem** — pizzas já prontas na 1ª checagem; daí seguem para **expedição** (etiqueta/embalagem/liberação)
### Fluxo Forno → Checagem → Expedição
`PRONTA` na coluna Forno encerra a cocção e coloca a pizza na **primeira checagem**.
Quando todas as pizzas do pedido estiverem prontas, o pedido fica `pronto` (pronto cozinha) para a expedição conferir, etiquetar e liberar.
### O que NÃO aparece para o pizzaiolo
- Pooling / faturamento / ticket médio
- Coluna Expedição administrativa
- Links Pedidos, PDV, Setup, Demo, Relatórios
- Indicadores financeiros
### Header operacional
`Pizzaza` · badge `KDS` · `Cozinha` · AO VIVO · hora · nome do usuário
Sem menu administrativo completo.
### Rodapé
“Pizzas concluídas recentemente” — thumbs + código + horário + nome (não pedidos financeiros).
---
## 5. Conteúdo do card (pizza)
- Código do pedido + fração `seq/total`
- Badge do estágio + tempo total (vermelho se atraso)
- Tempo da etapa atual (quando atribuída)
- Foto realista do produto
- Nome / tamanho / componentes (metades, bordas)
- Canal / cliente / bairro (compacto)
- Responsável montagem e/ou forno (iniciais + nome), sem sobrescrever o outro
- Botão primário full-width da etapa + secundário (Devolver / Transferir / Ver pedido)
- Trilho lateral grosso na cor da **etapa** (não do canal financeiro): azul disponível, laranja montagem, âmbar fila forno, vermelho forno, verde pronta
Ordenação: prioridade operacional (atraso, tempo de espera, horário prometido) — não só `createdAt`.
---
## 6. Cronômetros
- **Tempo total:** `now - order.arrivedAt|queuedAt` (servidor)
- **Tempo da etapa:** `now - stageStartedAt` da etapa atual
- Cálculo sempre a partir de timestamps do servidor (sobrevive a refresh/offline)
Metas por etapa (config gestor, defaults):
| Etapa | Meta sugerida |
|-------|----------------|
| Montagem | 6–8 min |
| Espera forno | 3 min |
| Forno | 8–12 min |
| Total produção | 15–20 min |
Atraso: destaque visual automático ao ultrapassar meta.
---
## 7. Perfis e permissões
| Ação | Pizzaiolo montagem | Forneiro | Expedição | Gestor |
|------|--------------------|----------|-----------|--------|
| Ver disponíveis / pegar | Sim | Não* | Não | Sim |
| Finalizar montagem | Sim (suas) | Não | Não | Sim |
| Assumir / marcar forno | Não* | Sim | Não | Sim |
| Ver responsável | Sim | Sim | Sim | Sim |
| Transferir | Restrito | Restrito | — | Sim |
| Pooling / Pedidos / PDV | Não | Não | Não | Sim |
| Conferir / etiqueta / liberar | Não | Não | Sim | Sim |
\* Mesmo usuário pode ter as duas caps; registros de montagem e forno permanecem separados.
### Backend
- `GET/POST` administrativos (`/api/orders/stats/today`, etc.) → 403 para `kds`
- `GET /pedidos` (web) → redirect `/kds/producao` para role `kds`
- Nav: pizzaiolo só vê KDS (+ logout)
---
## 8. Expedição (fora da tela do pizzaiolo)
Ao **MARCAR PRONTA**, a pizza entra na fila de expedição automaticamente.
Expedição: conferência, etiqueta, embalagem, liberação do **pedido completo** (todas as pizzas + itens).
O pizzaiolo não usa botão “Enviada p/ Expedição” manual.
---
## 9. API proposta (v1)
Prefixo: `/api/kds/pizzas`
| Método | Rota | Descrição |
|--------|------|-----------|
| GET | `/board` | Board pizzaiolo: disponíveis, montagem, aguardando_forno, no_forno, recentes |
| POST | `/:taskId/pegar` | disponivel → em_montagem |
| POST | `/:taskId/devolver` | em_montagem → disponivel (+ motivo) |
| POST | `/:taskId/enviar-forno` | em_montagem → aguardando_forno |
| POST | `/:taskId/assumir-forno` | aguardando_forno → no_forno |
| POST | `/:taskId/marcar-pronta` | no_forno → pronta (+ evento expedição) |
| POST | `/:taskId/transferir` | troca responsável (+ motivo) |
Eventos socket: `pizza.updated`, `pizza.claimed`, `pizza.ready` (payload por PrepTask).
### Modelo de dados (evolução)
`PrepTaskStatus`: adicionar `aguardando_forno`, `no_forno` (manter `em_preparo` = em_montagem).
Campos: `montagemById`, `montagemStartedAt`, `montagemDoneAt`, `fornoById`, `fornoStartedAt`, `fornoDoneAt`.
Histórico: tabela `PrepTaskEvent` (opcional v1.1) ou log append-only.
---
## 10. Critérios de aceitação
1. Role `kds` não vê menus/admin/Pooling/Pedidos; URL `/pedidos` redireciona; API stats 403.
2. Tela abre direto na produção autorizada.
3. Cards são **pizzas**, com foto, 2 cronômetros e responsável(is).
4. PEGAR / ENVIAR AO FORNO / ASSUMIR FORNO / MARCAR PRONTA seguem a máquina de estados.
5. Fila aguardando forno ≠ cocção iniciada.
6. Dupla atribuição impossível (409).
7. MARCAR PRONTA encaminha à expedição sem liberar pedido incompleto.
8. Touch: botões grandes, contraste alto, atualização realtime.
9. Modelo B: montagem e forno com responsáveis e tempos independentes.
---
## 11. Fora de escopo desta etapa
- QR/etiqueta individual por pizza (recomendado v2)
- Relatórios de produtividade detalhados (gestor)
- App nativo; esta SPEC é web touch KDS
---
## 12. Relação com o KDS gestor
O Kanban de pedidos (Novo / Montagem / Forno / Prontas / Expedição) permanece disponível **apenas** para gestor/admin como visão de supervisão.
Não é a home do pizzaiolo.