Frontend completo (Etapas 11-18) e extensões de backend (Etapas 13 e 18)

Adiciona o frontend Next.js em frontend/ (setup, design system,
autenticação/tema, layout/navegação, área master, área tenant completa:
clientes, produtos, vendas, recebimentos, whatsapp, e-mail, alertas,
equipe e perfil). Estende o backend de forma aditiva e autorizada:
cookie httpOnly para refresh token (Etapa 13) e CRUD de equipe +
edição de perfil do tenant (Etapa 18, módulo src/modules/equipe/ novo
e PUT /tenant/perfil). Detalhes completos em Etapas/V2/*.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-16 09:41:13 -03:00
co-authored by Claude Sonnet 5
parent f9738e54da
commit 323912748f
179 changed files with 29312 additions and 22 deletions
@@ -0,0 +1,97 @@
# Etapa 17 — Área Tenant: Vendas e Financeiro
## Contexto do projeto
Continuação do frontend do **SeConectai Vendas**. Já existem: setup,
design system, autenticação/tema, layout/navegação, área master
completa, e clientes/produtos no painel do tenant. Esta é a etapa mais
crítica do painel do tenant — o fluxo de vendas e o controle financeiro
— consumindo os endpoints da Etapa 6 do backend.
## Objetivo desta etapa
Registro completo de vendas (com itens e parcelas), listagem e ação
sobre recebimentos, e os dashboards financeiros/semana-mês.
## Tarefas
1. **`/app/vendas`**
- Listagem (`Table`) com filtro por status (`orcamento`,
`confirmada`, `concluida`, `cancelada`), por cliente, por período
de `data_venda`, paginação.
- Colunas/cards: número da venda, cliente, valor total, status
(`StatusPill`), data.
- Botão "Nova venda" → `/app/vendas/nova`.
2. **`/app/vendas/nova`** — a tela mais complexa do projeto
- Seleção de cliente (`Select` com busca, puxando de `/app/clientes`)
— se o cliente não existir ainda, oferecer atalho para cadastrar
rápido sem sair do fluxo (modal com o formulário mínimo de
cliente).
- Lista de itens da venda: adicionar produto/serviço (busca por
nome/SKU), quantidade, valor unitário (pré-preenchido do catálogo,
editável para casos de desconto pontual — deixar claro visualmente
quando o valor foi alterado do catálogo). Cálculo automático do
subtotal por item e do total geral, considerando o campo de
desconto geral da venda.
- Definição das parcelas: opção "gerar parcelas automaticamente"
(informar número de parcelas e primeira data de vencimento, o
sistema calcula o resto) ou "definir manualmente" (lista editável
de valor+vencimento por parcela). Validação em tempo real: soma das
parcelas precisa bater com o valor total da venda antes de permitir
salvar (mostrar a diferença, se houver, de forma clara).
- Layout responsivo: no desktop, itens da venda e resumo/parcelas
podem ficar lado a lado (2 colunas); no mobile, tudo empilhado com
o resumo total sempre visível (ex: barra fixa no rodapé mostrando o
total atualizado enquanto o usuário edita os itens).
- Salvar como `orcamento` ou já como `confirmada` (duas ações
distintas, não um único botão "Salvar").
3. **`/app/vendas/:id`**
- Detalhe com `Tabs`: Itens (somente leitura se a venda estiver
`confirmada`/`concluida`, editável se `orcamento`), Parcelas (lista
com status e ação de marcar como paga por parcela), Histórico
(mudanças de status, se o backend expuser isso via `audit_logs`).
- Ações de topo: mudar status (confirmar orçamento, cancelar venda —
com confirmação explícita explicando que isso cancela as parcelas
pendentes associadas).
4. **`/app/recebimentos`**
- Listagem de parcelas (`sale_payments`) via a view/endpoint do
backend, com filtro por status, por cliente, por período de
vencimento. Parcelas atrasadas destacadas visualmente (cor de
alerta) e, se possível, ordenadas por padrão com as mais urgentes
no topo.
- Ação "Marcar como pago" por linha, com seleção de forma de
pagamento — se o backend suportar ação em lote, oferecer seleção
múltipla de linhas com ação "Marcar selecionadas como pagas".
5. **Dashboards financeiros (complementando `/app/dashboard` da Etapa
16, se ainda não coberto)**
- Gráfico de resumo semanal e mensal lado a lado ou alternável (toggle
de período), usando as views `vw_resumo_vendas_semanal` /
`vw_resumo_vendas_mensal` do backend.
- Bloco "Financeiro": total recebido, total a receber, total
atrasado, com cores semânticas consistentes com o `StatusPill`.
## Critérios de aceite
- [ ] Criar venda completa (cliente + itens + parcelas) funciona ponta a
ponta e reflete corretamente no backend
- [ ] Validação de soma das parcelas vs. valor total impede salvar
quando não bate, com mensagem clara da diferença
- [ ] Cadastro rápido de cliente dentro do fluxo de nova venda funciona
sem perder o que já foi preenchido na venda
- [ ] Venda confirmada não permite editar itens/valores na tela de
detalhe (reflete a regra do backend)
- [ ] Cancelar venda pede confirmação e reflete o cancelamento das
parcelas pendentes na tela de recebimentos
- [ ] Marcar parcela como paga atualiza corretamente o dashboard
financeiro sem precisar recarregar a página manualmente
(invalidação de cache do React Query)
- [ ] Parcelas atrasadas visualmente destacadas na listagem de
recebimentos
- [ ] Barra de total fixa no mobile durante a montagem de uma venda
funciona corretamente e não sobrepõe conteúdo importante
- [ ] Todas as telas testadas em 375px, 768px e 1280px, com atenção
especial à tela de nova venda (a mais densa de informação)