Initial SeConectai briefing system
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
# 00 — Arquitetura: Sistema de Briefing de Site
|
||||
|
||||
## Objetivo
|
||||
Cliente se cadastra (pessoa física ou empresa) → faz login → preenche o briefing de 19 seções (149 perguntas) com rascunho automático e botão Ajuda por pergunta → envia → Tiago visualiza, exporta e muda o status no painel admin.
|
||||
|
||||
## Fluxos
|
||||
1. **Cadastro:** Nome completo, CPF, WhatsApp, E-mail, senha. Se "É para empresa?": Razão Social, CNPJ, Endereço (CEP, logradouro, número, complemento, bairro, cidade, UF). Aceite de LGPD obrigatório.
|
||||
2. **Login / recuperação de senha** por e-mail.
|
||||
3. **Meus briefings:** o cliente cria um briefing (um cliente pode ter mais de um, ex.: um site por empresa) e continua de onde parou.
|
||||
4. **Preenchimento:** tela por seção, barra de progresso, botão Ajuda por pergunta (popup), autosave, anexos na seção 19.
|
||||
5. **Envio:** confirmação do cliente (texto da seção "Confirmação do cliente") → status ENVIADO, bloqueia edição (admin pode reabrir).
|
||||
6. **Admin:** lista de clientes e briefings, detalhe com todas as respostas e anexos, mudança de status, exportação PDF, edição das perguntas/ajudas.
|
||||
|
||||
## Decisão central: formulário dirigido por dados
|
||||
Seções, perguntas e textos de ajuda ficam no banco e vêm do arquivo `briefing-seed.json` (gerado dos .docx originais: 19 seções, 149 perguntas, todas com ajuda). O frontend renderiza o formulário a partir desses dados; nada de 149 campos escritos à mão.
|
||||
|
||||
Tipos de pergunta (`TipoPergunta`): `TEXTAREA` (117), `RADIO` (11), `CHECKBOX` (6), `ANEXO` (15, seção 19). Toda pergunta tem também um campo opcional de **complemento** em texto (o documento original permite escrever junto das caixas marcadas, ex.: "Outro: qual?").
|
||||
|
||||
## Modelo de dados (Prisma, resumo)
|
||||
- `User` (id, email único, senhaHash, papel: CLIENTE | ADMIN, criadoEm)
|
||||
- `Cliente` (userId único, nomeCompleto, cpfCifrado, cpfHash único, whatsapp, tipo: PF | PJ, razaoSocial?, cnpj?, cep?, logradouro?, numero?, complemento?, bairro?, cidade?, uf?, lgpdAceiteEm)
|
||||
- `Secao` (id, ordem, titulo, descricao, ativo)
|
||||
- `Pergunta` (id, secaoId, ordem, rotulo, dica, tipo, opcoes Json, obrigatoria default false, permiteComplemento, ativo)
|
||||
- `Ajuda` (perguntaId único, oQueResponder, porQuePerguntamos, miniExemplo)
|
||||
- `Briefing` (id, clienteId, titulo, status: RASCUNHO | ENVIADO | EM_ANALISE | CONCLUIDO, confirmadoEm?, enviadoEm?, criadoEm, atualizadoEm)
|
||||
- `Resposta` (briefingId, perguntaId, texto?, selecionadas Json?, único por briefing+pergunta)
|
||||
- `Anexo` (briefingId, perguntaId, nomeOriginal, caminho, mime, tamanho, criadoEm)
|
||||
- `PasswordResetToken` (userId, tokenHash, expiraEm, usadoEm?)
|
||||
|
||||
## Princípios (do padrão SeConectai)
|
||||
- **Nunca apagar dados históricos:** briefing enviado não é deletado; reabrir muda o status, não perde respostas.
|
||||
- **Dados sensíveis por desenho:** CPF cifrado (AES-256-GCM, chave em variável de ambiente) + `cpfHash` (HMAC-SHA256) para unicidade/busca. CPF nunca vai para log nem para o JSON de listagens.
|
||||
- **Validação dupla:** Zod no cliente e no servidor (server actions / route handlers).
|
||||
- **Permissões:** cliente só enxerga os próprios briefings; admin enxerga todos. Toda leitura/escrita checa o dono no servidor.
|
||||
- **Incremental:** mudanças futuras via migrations Prisma numeradas, sem reescrever o schema base.
|
||||
|
||||
## Estrutura de pastas alvo
|
||||
```
|
||||
/app
|
||||
/(publico)/cadastro, /login, /recuperar-senha, /redefinir-senha
|
||||
/(cliente)/briefings, /briefings/[id], /briefings/[id]/[secao], /briefings/[id]/revisao
|
||||
/(admin)/admin, /admin/clientes, /admin/briefings/[id], /admin/perguntas
|
||||
/api/anexos/[id] (download autenticado)
|
||||
/components (ui shadcn, form/, ajuda/)
|
||||
/lib (auth, db, crypto, validators, storage, pdf, mail)
|
||||
/prisma (schema.prisma, seed.ts, briefing-seed.json)
|
||||
/storage/uploads (volume Docker, fora de /public)
|
||||
```
|
||||
|
||||
## Ordem de execução
|
||||
01 setup → 02 schema → 03 seed → 04 auth/cadastro → 05 motor do formulário → 06 popup de ajuda → 07 rascunho e envio → 08 anexos → 09 painel admin → 10 PDF e notificações → 11 LGPD/segurança → 12 deploy. Acompanhar em `99-progresso.md`.
|
||||
Reference in New Issue
Block a user