Files
gerador-proposta/docs/gerador-propostas/SOURCE_OF_TRUTH.md
T
2026-10-03 00:00:45 -03:00

126 lines
9.6 KiB
Markdown
Raw 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.
# Source of Truth — Gerador de Propostas EloPro — MVP
## 1. Decisões consolidadas
- Produto standalone dentro do ecossistema EloPro.
- Integração com CRO é opcional e serve para pré-preenchimento quando houver contexto explícito de cliente.
- Tenant técnico = `workspace_id`; isolamento por RLS. CNPJ é dado comercial, não chave de tenant.
- Papéis funcionais: Superadmin, Administrador, Gestor e Usuário. Mapeamento atual EloPro: `profiles.is_superadmin`, `owner/admin`, `gestor`, `agent`.
- Modelos são importados por Admin/Gestor a partir de PDF, PPTX ou DOCX.
- Marcadores variáveis: `[campo]`. O sistema não infere trechos variáveis.
- Limite: 10 modelos por workspace; Rascunho, Ativo e Arquivado contam. Versões internas não ocupam nova vaga.
- Status de proposta: apenas `Rascunho` e `Gerada`.
- Estados de UI da criação: `Preencher → Validar → Gerar`; são estados da mesma experiência, não status persistidos independentes.
- Primeira geração bem-sucedida cria `PROP-######` e `V1`.
- Versões formais são imutáveis. Edição posterior cria/retoma o rascunho da próxima versão.
- Download e envio por e-mail usam exatamente o PDF da versão exibida.
- Lock: um editor por recurso, TTL funcional de 10 minutos, sem force takeover no MVP.
- Autosave obrigatório.
- Contrato fica visível/desabilitado nesta fase. Apresentação permanece pendente.
## 2. Regras de negócio
- RN-001 Standalone — fluxo principal funciona sem Calculadora, Contratos, Planilhas ou outros produtos.
- RN-002 Brasil/BRL — pt-BR, BRL; sem seletor obrigatório de moeda.
- RN-003 Segurança server-side — permissão, entitlement, limite e estado também no backend/RLS.
- RN-004 Autosave — autosave não substitui Salvar/Salvar e sair.
- RN-005 Limite de modelos — máximo 10 por workspace; draft/active/archived contam.
- RN-006 Modelo ativo — somente modelo Ativo inicia proposta.
- RN-007 Marcadores — somente `[campo]` explícito origina campo.
- RN-008 Tipos de campo — Texto e Número/moeda; default Texto, obrigatório=Não.
- RN-009 Estrutura do modelo — marcador não é criado/excluído/renomeado na tela de validação; correção estrutural exige reenvio.
- RN-010 Versão de modelo — primeira ativação V1; alterações V2+ preservam histórico.
- RN-011 Criação de rascunho — abrir 4.2 não cria rascunho; nasce no primeiro persist válido.
- RN-012 Status — apenas Rascunho/Gerada; edição em andamento é indicador.
- RN-013 Fluxo 4.2 — Preencher/Validar/Gerar são estados da mesma página.
- RN-014 Salvar — com pendências salva e fica em Preencher; sem pendências cria checkpoint e vai para Validar.
- RN-015 Salvar e sair — persiste/checkpoint; libera lock somente após sucesso.
- RN-016 Lock — um editor; 10 min; sem tomada forçada; observador vê último persistido.
- RN-017 Geração formal — só existe sucesso se PDF formal existir; falha não cria número/versão formal.
- RN-018 Numeração — primeira geração cria PROP-###### e V1; escopo da sequência ainda precisa de decisão técnica formal.
- RN-019 Imutabilidade — versão formal gerada é imutável.
- RN-020 Nova versão — somente com alteração de conteúdo + nova geração bem-sucedida.
- RN-021 Histórico — versões antigas podem ser vistas/baixadas/enviadas, nunca editadas/excluídas/usadas como base.
- RN-022 E-mail — usa exatamente PDF exibido; não muda status Gerada.
- RN-023 Auditoria — autoria e eventos críticos rastreáveis.
- RN-024 Logo — logo da empresa obrigatório para identidade da proposta; cores opcionais.
- RN-025 Erros — erros são estados das telas existentes, sem criar novas páginas numeradas.
## 3. Requisitos funcionais
RF-001 autenticar/resolver workspace; RF-002 listar propostas por escopo; RF-003 listar modelos ativos; RF-004 confirmar seleção sem criar draft; RF-005 abrir 4.2 sem draft vazio; RF-006 prefill CRO quando aplicável; RF-007 campos dinâmicos; RF-008 validação durante edição; RF-009 autosave; RF-010 draft no primeiro persist; RF-011 Salvar; RF-012 Salvar e sair; RF-013 trocar modelo; RF-014 lock; RF-015 validar antes de gerar; RF-016 gerar PDF; RF-017 reconciliar geração assíncrona; RF-018 número comercial; RF-019 versionar; RF-020 detectar ausência de alteração; RF-021 visualizar vigente/histórica; RF-022 baixar PDF; RF-023 enviar e-mail; RF-024 registrar envio; RF-025 excluir draft elegível; RF-026 listar modelos; RF-027 limite 10/10; RF-028 upload PDF/PPTX/DOCX; RF-029 analisar marcadores; RF-030 draft de modelo após upload+análise técnica; RF-031 reprocessar correção no mesmo draft; RF-032 configurar campos; RF-033 autosave/lock de modelo; RF-034 ativar V1; RF-035 versionar modelo V2+; RF-036 arquivar; RF-037 excluir modelo nunca usado (Admin); RF-038 auditoria; RF-039 RLS; RF-040 Sentry.
## 4. Requisitos não funcionais
- Segurança: RLS + autorização server-side; fail-closed.
- Privacidade: nenhum documento/template cross-tenant; Sentry/logs sem documento integral/PII desnecessária.
- Confiabilidade: geração/ativação idempotentes; sem efeitos parciais.
- Concorrência: lock TTL 10 min + renovação por atividade; sem force takeover.
- Recuperação: autosave e retomada respeitando lock.
- Performance: carregamento progressivo; paginação/virtualização quando necessário; metas numéricas ainda abertas.
- Acessibilidade: alvo WCAG 2.1 AA, teclado, foco, labels, contraste, status não apenas por cor.
- Responsividade: web adaptada; mobile não é mera redução proporcional.
- Observabilidade: Sentry client/server/edge + correlação request/job.
- Auditabilidade: eventos mínimos imutáveis; retenção ainda aberta.
- Manutenibilidade: TS strict recomendado, lint, testes, separação por domínio.
- Integridade documental: versão formal referencia versão exata do modelo e artefato.
- Segurança de arquivos: MIME/extensão/conteúdo; tamanho/antivírus/sandbox ainda abertos.
## 5. Modelo de dados proposto
- `proposal_models`: id, workspace_id, name, status, current_version, created_by, archived_at.
- `proposal_model_versions`: id, model_id, version_no, source_file_ref, normalized_template, analysis_json, activated_at, activated_by.
- `proposal_model_fields`: id, model_version_id, field_key, display_name, type, required, order.
- `proposals`: id, workspace_id, created_by, owner_user_id, status, commercial_number, current_version_no, model_id, client_ref?, created_at.
- `proposal_drafts`: id, proposal_id, based_on_version_no?, model_version_id, data_json, content_hash, lock_owner?, updated_at.
- `proposal_versions`: id, proposal_id, version_no, model_version_id, content_snapshot, content_hash, pdf_ref, generated_by, generated_at.
- `proposal_email_events`: id, proposal_version_id, actor_id, to_email, subject, result, provider_message_id?, created_at.
- `proposal_audit_events`: id, workspace_id, proposal_id?, model_id?, actor_id, event_type, metadata, created_at.
- locks preferencialmente no Redis.
- `workspace_branding`: workspace_id, logo_ref, brand colors opcionais, contact email.
## 6. Design System EloPro V2.1
- Base predominante: Cloud White `#FBFBFE`, 65–75% superfícies claras.
- Texto/âncora: Midnight Ink `#071B45`.
- Primary Blue `#1F6FFF`; botão primário deve usar token de contraste do DS, Blue 600 `#225EDB` quando aplicável.
- Bright Blue `#2F8FFF`; Aqua Signal `#00C2A8`; Soft Blue `#DCEBFF`; Warning `#F39A2D`; Error `#E63946`.
- Manrope para UI. Source Serif 4 apenas institucional/editorial.
- Spacing 4px base; radius input 10, button 18, card 14, panel 18, modal 24.
- Motion 120/200/320ms, easing `cubic-bezier(.2,.8,.2,1)`.
- Proibido: neon, cyberpunk, holograma, glassmorphism, dark page dominante, grid decorativo, robôs/cérebros futuristas.
- Estados sempre por cor + texto + ícone/semântica; nunca cor isolada.
- Componentes globais: Button, IconButton, Badge, Tag, Card, Input, Select, Checkbox, Radio, Switch, DateField/DateRangeField, Tabs, CapsuleTabs, ContextGroup, SectionPill, Toast, Tooltip, Dialog.
- Preservar quando fizer sentido: ContextLayers, JourneyTrail, OpenFramePanel, SemanticMarker.
- `JourneyTrail` não é Stepper genérico.
- Lacunas de DS: Search, Table, Stepper, Empty State, Pagination, Skeleton, File Upload, Avatar. Compor localmente usando tokens/primitivos e não promover como componente global sem decisão.
- Iconografia EloPro é prioridade; Lucide apenas fallback técnico.
## 7. Pendências que NÃO podem ser inventadas
- P-001 fallback de Reply-To sem e-mail comercial.
- P-002 fonte definitiva de Cliente no uso independente.
- P-003 Tipo no MVP e opções definitivas.
- P-004 Apresentação.
- P-005 Gerador de Contratos.
- P-006 tamanho máximo/antivírus/sandbox/extração parcial de arquivo.
- P-007 retenção da auditoria.
- P-008 fonte/lifecycle de entitlements.
- P-009 escopo definitivo da sequência PROP (recomendação técnica atual: workspace, mas não assumir sem ADR/aprovação).
- P-010 motor de ingestão/conversão PDF/PPTX/DOCX.
- P-011 provider de e-mail (EloPro documenta Resend, mas formalizar uso no módulo).
- P-012 metas quantitativas de performance/SLO/document size/generation time.
## 8. Critérios críticos de aceite
- Nenhum P0/P1 bloqueador aberto.
- Workspace A nunca acessa B por UI, URL manipulada, API/Action direta ou storage.
- Falha de geração não consome PROP nem versão.
- Duplo clique/retry não cria duas versões.
- Versão formal é imutável.
- Lock funcional expira em 10 min e impede edição concorrente.
- Usuário Final não acessa Modelos nem por rota direta.
- 10/10 bloqueia upload antes do processamento.
- PDF baixado/enviado é o mesmo da versão exibida.
- UI segue EloPro V2.1 sem inventar regra funcional.