feat: estoque negativo, UTC-3, dd/mm/yyyy, estorno de pagamento

This commit is contained in:
2026-07-27 14:13:56 -03:00
parent 14e92c91fd
commit b567a45803
14 changed files with 239 additions and 75 deletions

View File

@@ -34,7 +34,8 @@ app_ces/
├── src/ # Backend API
│ ├── server.ts # Entrypoint Fastify, porta 3333
│ ├── lib/
│ │ ── prisma.ts # Instância PrismaClient
│ │ ── prisma.ts # Instância PrismaClient
│ │ └── timezone.ts # Helpers UTC-3 (dateStart, dateEnd, dateTime, nowUTC3)
│ ├── middlewares/
│ │ └── auth.middleware.ts # authenticate + requireRoles
│ ├── controllers/
@@ -70,7 +71,7 @@ app_ces/
└── src/
├── main.ts # Router SPA + navegação
├── api.ts # Cliente HTTP centralizado
├── utils.ts # renderNavbar, toast, helpers
├── utils.ts # renderNavbar, toast, helpers, toDisplayDate, parseDisplayDate
├── style.css # Dark theme + glassmorphism
└── views/
├── login.ts
@@ -107,7 +108,7 @@ app_ces/
- Relations: `produto` (N:1 Produto), `comanda` (N:1 Comanda), `usuario` (N:1 Usuario)
**Pagamento**
- `id` (UUID), `comandaId` (FK), `valor`, `formaPagamento` (DINHEIRO|CARTAO_CREDITO|CARTAO_DEBITO|PIX), `observacao?`, `criadoEm`
- `id` (UUID), `comandaId` (FK), `valor`, `formaPagamento` (DINHEIRO|CARTAO_CREDITO|CARTAO_DEBITO|PIX), `observacao?`, `estornado` (boolean, default false), `criadoEm`
## Rotas da API
@@ -148,6 +149,7 @@ app_ces/
| PATCH | `/comandas/:id` | GARCOM/CAIXA/ADMIN |
| POST | `/comandas/:id/pagar` | CAIXA/ADMIN |
| POST | `/comandas/:id/pagamentos` | CAIXA/ADMIN |
| PATCH | `/pagamentos/:id/estornar` | CAIXA/ADMIN |
| PATCH | `/comandas/itens/:id/observacao` | GARCOM/CAIXA/ADMIN |
| DELETE | `/comandas/itens/:id` | CAIXA/ADMIN |
@@ -187,7 +189,7 @@ app_ces/
### Fluxo de Comanda
1. Criar comanda (identificador = mesa/código) - **registra usuário logado**
2. Adicionar itens (baixa estoque automaticamente, atualiza total) - **registra usuário logado**
3. Itens aparecem no painel de cozinha/bar com status `PENDENTE`
3. Itens aparecem no painel de cozinha/bar com status `PENDENTE` (apenas últimos 12h)
4. Cozinha/bar avança: `PENDENTE → PREPARANDO → PRONTO → ENTREGUE`
5. Caixa fecha com pagamento (integral ou parcial)
6. Status da comanda: `ABERTA → PAGA`
@@ -197,17 +199,19 @@ app_ces/
- **Parcial**: `POST /comandas/:id/pagamentos` - registra pagamento parcial, pode selecionar itens específicos
- **Cálculo do total final**: `total - desconto + acrescimo + (taxaServico ? 10% : 0)`
- Formas: `DINHEIRO`, `CARTAO_CREDITO`, `CARTAO_DEBITO`, `PIX`
- **Estorno**: `PATCH /pagamentos/:id/estornar` - marca pagamento como estornado, subtrai valor de `comanda.valorPago`, se comanda era `PAGA` volta para `FECHADA`. Pagamento continua visível com indicador visual (opacity + line-through + badge "ESTORNADO")
### Estoque
- Decrementa ao adicionar item na comanda
- Incrementa ao remover item da comanda
- Validação de estoque insuficiente no backend
- **Permite estoque negativo** (sem validação de insuficiência)
### Frontend
- Rotas SPA manuais via `window.history.pushState`
- Auto-refresh no painel de cozinha a cada 10 segundos
- Notificações sonoras via Web Audio API para novos pedidos
- Navbar dinâmica baseada no role do usuário logado
- Filtros de data em formato `dd/mm/yyyy` (inputs `type="text"`, conversão via `parseDisplayDate`)
## Comandos Úteis
@@ -232,6 +236,7 @@ cd web && npm run build # Build de produção
- CORS habilitado para qualquer origem (`origin: '*'`)
- JWT secret definido em `.env` (fallback: `fallback_secret_change_me`)
- Error handler global trata `ZodError` (400) e erros HTTP
- **Fuso horário UTC-3** configurado em `src/lib/timezone.ts` - todas as datas no backend e frontend usam offset UTC-3
- Frontend não usa framework UI - renderiza HTML via template literals
- Utiliza `event delegation` para botões dinâmicos no painel
- Cleanup de listeners ao navegar entre views