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:
@@ -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)
|
||||
Reference in New Issue
Block a user