Implantação MVP
This commit is contained in:
commit
aa1d925642
20 files changed
+1162
No files matched your search
@@ -0,0 +1,32 @@
|
|||||||
|
---
|
||||||
|
description: Regras obrigatórias do módulo EloPro Gerador de Contratos
|
||||||
|
globs:
|
||||||
|
- "app/**/contracts/**"
|
||||||
|
- "components/**/contracts/**"
|
||||||
|
- "lib/**/contracts/**"
|
||||||
|
- "utils/**/contracts/**"
|
||||||
|
- "**/*contract*"
|
||||||
|
alwaysApply: false
|
||||||
|
---
|
||||||
|
|
||||||
|
# EloPro Gerador de Contratos
|
||||||
|
|
||||||
|
- Reuse arquitetura e helpers existentes do EloPro; não crie auth, RBAC, feature flag ou design system paralelos.
|
||||||
|
- Tenant técnico = `workspace_id`; nunca confie em workspace_id arbitrário do client.
|
||||||
|
- Feature flag = `contracts`, fail-closed.
|
||||||
|
- Auth = Supabase Auth/SSR.
|
||||||
|
- Gestão de templates = owner/admin somente.
|
||||||
|
- Gestor/agent = fluxo operacional.
|
||||||
|
- Use RLS + autorização server-side.
|
||||||
|
- Templates: .docx/.txt, até 5 MB, até 50 chaves únicas {{chave}}.
|
||||||
|
- data_* => date; valor_*/preco_* => number; demais => text.
|
||||||
|
- Todos os campos obrigatórios no MVP.
|
||||||
|
- Autosave ~15 s; draft TTL 24 h.
|
||||||
|
- 10 modelos-base ativos/workspace; versões não contam como novos modelos.
|
||||||
|
- Mesmo nome nunca sobrescreve; cria nova versão.
|
||||||
|
- Draft ativo bloqueia exclusão da versão.
|
||||||
|
- Preview e PDF devem usar o mesmo Contract Document Model.
|
||||||
|
- PDF via @react-pdf/renderer e não é repositório permanente no MVP.
|
||||||
|
- Design System EloPro V2.1 obrigatório; não usar os tokens antigos do protocolo.
|
||||||
|
- Sentry deve scrubbar conteúdo do contrato, formulário, tokens e cookies.
|
||||||
|
- Não adicionar dependências para parser/sanitização/storage sem resolver DT-CTR-001…004.
|
||||||
@@ -0,0 +1,185 @@
|
|||||||
|
# P00 — Discovery técnico e auditoria do módulo existente
|
||||||
|
|
||||||
|
Data: 2026-10-02
|
||||||
|
Escopo auditado: `c:\Users\Usuário\Documents\crm` (package `crm-2.0`, Next.js 16.0.10).
|
||||||
|
Workspace desta sessão: `gerador-contratos` (repositório Gitea vazio, sem código de produto).
|
||||||
|
Cópia irmã `Documents\CRM-2.0` existe e contém o mesmo módulo antigo de contratos, sem as migrations mais novas da calculadora. A fonte usada aqui é `crm`.
|
||||||
|
|
||||||
|
Nenhum código de produto, banco ou UI foi alterado.
|
||||||
|
|
||||||
|
## Achado de localização
|
||||||
|
|
||||||
|
O Gerador de Contratos não pode nascer neste repositório. `gerador-contratos` só tem git e remote `https://gitea.fatorxtech.com/cferraz/gerador-contratos.git`. Auth, RLS, feature flag, AppShell, Sentry, Redis e Design System estão em `crm`.
|
||||||
|
|
||||||
|
A spec e a regra do módulo proíbem arquitetura paralela. **DT-CTR-007 foi aprovado:** implementar dentro de `crm`, preservando `/dashboard/contracts`.
|
||||||
|
|
||||||
|
## Arquitetura atual
|
||||||
|
|
||||||
|
```
|
||||||
|
Sidebar (lib/nav.ts, flag contracts)
|
||||||
|
|
|
||||||
|
v
|
||||||
|
app/dashboard/contracts/layout.tsx
|
||||||
|
requireFeature('contracts') --> fail-closed, redirect /dashboard
|
||||||
|
|
|
||||||
|
+-- page.tsx lista
|
||||||
|
+-- new/page.tsx ContractWizard (passos fixos)
|
||||||
|
+-- [id]/page.tsx ContractEditor
|
||||||
|
+-- actions.ts Server Actions (CRUD, PDF, deal)
|
||||||
|
|
|
||||||
|
v
|
||||||
|
Supabase Auth/SSR + getCurrentWorkspaceId()
|
||||||
|
cookie active_workspace_id validado por membership
|
||||||
|
|
|
||||||
|
v
|
||||||
|
Postgres
|
||||||
|
contracts + contract_commercial + contract_sla_items
|
||||||
|
+ contract_modules + contract_clauses
|
||||||
|
+ contract_sla_defaults + contract_clause_defaults
|
||||||
|
RLS: is_workspace_member (qualquer papel)
|
||||||
|
|
|
||||||
|
v
|
||||||
|
PDF @react-pdf/renderer (utils/contractPdf.tsx)
|
||||||
|
persistido no bucket privado Storage `contracts`
|
||||||
|
caminho {workspace_id}/{contract_id}.pdf
|
||||||
|
pdf_url gravado na linha
|
||||||
|
|
||||||
|
API externa paralela (Bearer API key, service role):
|
||||||
|
POST/GET /api/v1/contracts
|
||||||
|
/api/v1/contracts/defaults
|
||||||
|
/api/v1/contracts/:id
|
||||||
|
POST /api/v1/contracts/:id/generate-pdf
|
||||||
|
```
|
||||||
|
|
||||||
|
Fora deste fluxo, e **não é o gerador**:
|
||||||
|
|
||||||
|
- `calculator_contracts` (migration 156) confirma uma versão imutável de proposta da calculadora. Dono, time e hash. Não usar essas tabelas para templates.
|
||||||
|
|
||||||
|
## Inventário
|
||||||
|
|
||||||
|
| Caminho | Papel | Classe |
|
||||||
|
|---|---|---|
|
||||||
|
| `lib/nav.ts` | Item Contratos, flag `contracts` | REUTILIZAR |
|
||||||
|
| `utils/featureFlags.ts` | `isFeatureEnabled` / `requireFeature`, sem linha = desligado | REUTILIZAR |
|
||||||
|
| `app/dashboard/contracts/layout.tsx` | Guard da flag | REUTILIZAR |
|
||||||
|
| `utils/supabase/server.ts`, `utils/supabase/user.ts` | Auth SSR | REUTILIZAR |
|
||||||
|
| `utils/workspace.ts` | `getCurrentWorkspaceId`, `isWorkspaceAdmin`, `isWorkspaceManager`, `getManagedTeamIds` | REUTILIZAR |
|
||||||
|
| `utils/workspaceAdmin.ts` | Decisões puras de papel | REUTILIZAR |
|
||||||
|
| `migrations/038_contracts.sql` | Schema do contrato comercial Fly Apex | MANTER como legado; não é o gerador |
|
||||||
|
| `app/dashboard/contracts/actions.ts` | CRUD do contrato fixo | ADAPTAR só depois do DT-CTR-007; hoje qualquer membro edita |
|
||||||
|
| `components/Contracts/ContractWizard.tsx` | Wizard de campos fixos + hex antigo | ADAPTAR ou conviver; não é wizard de template |
|
||||||
|
| `components/Contracts/ContractEditor.tsx` | Editor de cláusulas/SLA/módulos | idem |
|
||||||
|
| `components/Contracts/DealContractsTab.tsx` | Contratos no card do deal | REUTILIZAR o gancho de deal; domínio novo é outro |
|
||||||
|
| `components/Contracts/ContractStatusBadge.tsx` | Badge de status comercial | REUTILIZAR se o status legado permanecer |
|
||||||
|
| `utils/contractPdf.tsx` | PDF do schema fixo + persistência | ADAPTAR o renderer; o modelo de documento é CRIAR |
|
||||||
|
| `app/api/v1/contracts/**` | API externa do schema antigo | MANTER para o legado; API nova só se DT-CTR-006 exigir |
|
||||||
|
| `utils/sanitize.ts` | `stripHtml` / `sanitizeText` (remove tags) | ADAPTAR; não é sanitizador HTML com allowlist |
|
||||||
|
| `utils/auditLog.ts` | Auditoria de plataforma (workspace/user/org) | ADAPTAR o padrão; eventos de contrato são CRIAR |
|
||||||
|
| `utils/rateLimit.ts`, `utils/cache.ts` | Redis/ioredis, rate limit fail-open | REUTILIZAR |
|
||||||
|
| `sentry.*.config.ts`, `instrumentation-client.ts` | Sentry, `sendDefaultPii: false`, replay em erro | ADAPTAR (falta scrub de conteúdo contratual) |
|
||||||
|
| `app/globals.css` tokens `--bc-*` | Traxion DS implementado no app | REUTILIZAR; ver conflito visual abaixo |
|
||||||
|
| `scripts/db/migrate.ts` + `migrations/*.sql` | Migrations numeradas, `npm run migrate` | REUTILIZAR |
|
||||||
|
| `.github/workflows/ci.yml` | npm ci, Node 20, tsc, build | REUTILIZAR |
|
||||||
|
| Famílias/versões de template, placeholders, drafts 24 h, Contract Document Model | inexistentes | CRIAR |
|
||||||
|
|
||||||
|
Não há parser DOCX, upload de `.docx`/`.txt` de modelo, autosave de rascunho de formulário, nem cota de 10 modelos.
|
||||||
|
|
||||||
|
## Schema encontrado
|
||||||
|
|
||||||
|
Migration `038_contracts.sql`:
|
||||||
|
|
||||||
|
- `contracts`: workspace, deal opcional, título, cliente, status `rascunho|enviado|assinado|ativo|expirado|cancelado`, `pdf_url`.
|
||||||
|
- `contract_commercial`: limites, setup, mensalidade, vencimento, pagamento.
|
||||||
|
- `contract_sla_items`, `contract_modules`, `contract_clauses`.
|
||||||
|
- `contract_sla_defaults` e `contract_clause_defaults`: seed global (`workspace_id` nulo) ou por workspace. Escrita de global exige `is_superadmin()`.
|
||||||
|
- Flag `contracts` inserida com `enabled_globally = false`.
|
||||||
|
- RLS de membro em todas as tabelas de contrato. Sem divisão owner/admin vs gestor/agent.
|
||||||
|
- Nenhuma migration posterior altera `public.contracts`.
|
||||||
|
|
||||||
|
`calculator_contracts` é outro bounded context (proposta da calculadora).
|
||||||
|
|
||||||
|
## Feature flag e guards
|
||||||
|
|
||||||
|
- Flag `contracts`, default global desligado. Override por workspace vence o global (`utils/featureFlags.ts`).
|
||||||
|
- Ausência da linha retorna `false` (fail-closed).
|
||||||
|
- Layout chama `requireFeature('contracts')` e redireciona para `/dashboard`.
|
||||||
|
- Server Actions repetem `guardFeature()`.
|
||||||
|
- API v1 repete a checagem e devolve 403.
|
||||||
|
- Sidebar só mostra o item com a flag ligada.
|
||||||
|
- **Não há guard de papel** nas actions de contrato. `isWorkspaceAdmin()` não é usado em `app/dashboard/contracts`.
|
||||||
|
|
||||||
|
Tenant: `getCurrentWorkspaceId()` lê o cookie `active_workspace_id` e confirma membership. As queries filtram `workspace_id` no servidor. A API v1 usa o workspace da API key, não um id solto do body.
|
||||||
|
|
||||||
|
## Gaps contra o Gerador de Contratos
|
||||||
|
|
||||||
|
| Requisito | Estado |
|
||||||
|
|---|---|
|
||||||
|
| Famílias e versões; mesmo nome cria versão; sem overwrite | Inexistente. Defaults globais são seed fixo. |
|
||||||
|
| Upload `.docx`/`.txt`, 5 MB, 50 `{{chave}}` | Inexistente. |
|
||||||
|
| Tipos `data_*` date, `valor_*`/`preco_*` number, resto text | Inexistente. Campos comerciais são colunas fixas. |
|
||||||
|
| Todos os campos obrigatórios | Wizard só exige título. |
|
||||||
|
| Máx. 10 modelos-base ativos; versões não contam | Inexistente. |
|
||||||
|
| Draft autosave ~15 s, TTL 24 h | Inexistente. Status `rascunho` é o contrato persistido. |
|
||||||
|
| Draft ativo bloqueia exclusão da versão | Delete bloqueia só status `assinado` e `ativo`. |
|
||||||
|
| Preview e PDF no mesmo Contract Document Model | PDF lê o schema relacional direto. Não há preview compartilhado. |
|
||||||
|
| PDF não é repositório permanente no MVP | O fluxo atual grava o PDF no Storage e `pdf_url`. |
|
||||||
|
| owner/admin gerenciam templates; gestor/agent operam | Qualquer membro do workspace faz CRUD. |
|
||||||
|
| Superadmin não edita documento privado no fluxo comum | Superadmin entra em `isWorkspaceAdmin` (plataforma). Defaults globais usam `is_superadmin()`. Não misturar com o fluxo operacional novo. |
|
||||||
|
| Sentry sem conteúdo contratual | `sendDefaultPii: false`. Sem `beforeSend` que raspe corpo de contrato, formulário, token ou cookie. Replay de erro está ligado no client (`replaysOnErrorSampleRate: 1`). |
|
||||||
|
| UI no Design System, sem tokens do protocolo antigo | Wizard/editor usam hex `#001A3B`, `#00478F`, `#00AEEF`. O app vivo usa `--bc-*` (Traxion). |
|
||||||
|
|
||||||
|
Conflitos que não devem ser resolvidos em silêncio:
|
||||||
|
|
||||||
|
1. O módulo em produção é um contrato comercial de plataforma (SLA, módulos, cláusulas markdown), ligado a deal e funil (`proposal_created` / `proposal_sent`). O gerador novo é template com placeholders. Substituir o schema atual quebra deal, API v1 e PDF armazenado.
|
||||||
|
2. A spec chama o visual de EloPro Design System V2.1. No `crm` o handoff implementado é Traxion DS, tokens `--bc-*` em `app/globals.css` e `docs/design/redesign-traxion-ds1.md`. Não há artefato nomeado V2.1 neste repo. Os hex do wizard são o visual antigo e não devem ser copiados.
|
||||||
|
3. `audit_log` da plataforma não tem ações de contrato e o `target_type` não inclui contrato. A calculadora tem `calculator_audit_log` próprio. O gerador precisa de trilha nova, no mesmo estilo, sem enfiar conteúdo do documento no `meta`.
|
||||||
|
|
||||||
|
## Estratégia recomendada
|
||||||
|
|
||||||
|
Não apagar o módulo atual nesta fase.
|
||||||
|
|
||||||
|
1. Implementar o gerador **dentro de `crm`**, na flag `contracts` já existente.
|
||||||
|
2. Conviver com o contrato comercial legado até uma decisão de produto (aba, rota irmã ou substituição). Não reutilizar `contracts` / `contract_clauses` como tabela de template.
|
||||||
|
3. Criar tabelas novas de família, versão, campo, draft e auditoria do gerador, com RLS por `workspace_id` e checagem de papel no servidor (`isWorkspaceAdmin` para gestão).
|
||||||
|
4. Reusar Auth SSR, `getCurrentWorkspaceId`, feature flag, nav, Redis, `@react-pdf/renderer`, runner de migration e CI.
|
||||||
|
5. PDF novo: gerar sob demanda com o Contract Document Model e não gravar como acervo. O bucket `contracts` continua válido para o PDF legado.
|
||||||
|
6. UI nova com tokens `--bc-*` já presentes, até alguém apontar o arquivo V2.1 se ele for diferente do Traxion.
|
||||||
|
|
||||||
|
## Decisões aprovadas em 2026-10-02 (encerram o P00)
|
||||||
|
|
||||||
|
1. Implementar dentro de `Documents\crm`, ao lado do módulo antigo. Não substituir, migrar nem alterar o contrato comercial ligado ao deal.
|
||||||
|
2. Parser DOCX: Mammoth. Sanitização HTML: `sanitize-html` no servidor, obrigatória antes de persistir ou renderizar, preservando `{{chave}}`. Sem troca de biblioteca; Mammoth fica no Node (não no client e não no Edge). Cabeçalho, rodapé e caixa de texto seguem fora até a matriz DT-CTR-003.
|
||||||
|
3. Sem endpoint público `/api/v1` para o gerador. A API antiga permanece só no domínio legado.
|
||||||
|
|
||||||
|
Os dez achados deste relatório continuam vinculantes. `workspace_id` não vem do browser. Tabela do módulo antigo não é reaproveitada por semelhança de nome.
|
||||||
|
|
||||||
|
## Decision gates
|
||||||
|
|
||||||
|
| Gate | Status | Evidência |
|
||||||
|
|---|---|---|
|
||||||
|
| DT-CTR-001 parser DOCX | RESOLVIDO | Mammoth 1.13 no `crm`. Conversão do upload fica no P03. Roda só no Node. |
|
||||||
|
| DT-CTR-002 sanitização HTML | RESOLVIDO | `sanitize-html` no servidor (`lib/gerador-contratos/sanitize.ts`), antes de persistir ou renderizar. `{{chave}}` é preservado fora de tag removida. |
|
||||||
|
| DT-CTR-003 matriz DOCX | PENDENTE | Cabeçalho, rodapé, caixa de texto e estilo não estão prometidos. |
|
||||||
|
| DT-CTR-004 Storage | RESOLVIDO POR EVIDÊNCIA | Supabase Storage. Bucket privado `contracts`, service role, URL assinada. Templates devem usar esse mecanismo; o path/bucket exato do arquivo-fonte fica para a implementação, sem trocar de produto. |
|
||||||
|
| DT-CTR-005 deploy/CI/package | RESOLVIDO POR EVIDÊNCIA | npm (`package-lock.json`), Node 20, `npm run migrate` via `postgres`+`tsx`, CI em `.github/workflows/ci.yml` (tsc + build; lint não bloqueia). |
|
||||||
|
| DT-CTR-006 API `/api/v1` | RESOLVIDO | Sem API pública nova no gerador. `/api/v1/contracts` permanece só no legado. |
|
||||||
|
| DT-CTR-007 migração de `/dashboard/contracts` | RESOLVIDO | Convive. Gerador em `/dashboard/gerador-contratos`. Contrato comercial do deal intocado. |
|
||||||
|
|
||||||
|
## Plano P01–P12 (só depois do DT-CTR-007)
|
||||||
|
|
||||||
|
Trabalho no repo `crm`, branch dedicada. Este repo `gerador-contratos` não recebe o app.
|
||||||
|
|
||||||
|
1. **P01** Fundação: tipos de domínio, guards de flag e de admin, esqueleto de telas (lista, novo, modelos admin, histórico) sem parser nem PDF novo.
|
||||||
|
2. **P02** Migrations novas (próximo número após a última em `crm/migrations`), RLS por workspace e papel, índices. Não alterar o significado das tabelas da 038.
|
||||||
|
3. **P03** Upload e parser com Mammoth e `sanitizeContractHtml`. Validação 5 MB, 50 chaves, tipos por prefixo, cota de 10 bases, versão por nome. A matriz DT-CTR-003 continua em aberto.
|
||||||
|
4. **P04** Wizard operacional: escolha, revisão, formulário dinâmico, tudo obrigatório.
|
||||||
|
5. **P05** Draft autosave ~15 s, TTL 24 h. Redis só como apoio; Postgres é a fonte se o draft precisar sobreviver. Bloqueio de exclusão com draft ativo.
|
||||||
|
6. **P06** Contract Document Model único para preview e PDF. `@react-pdf/renderer`. Sem persistir o PDF novo.
|
||||||
|
7. **P07** Admin de templates, versões, exclusão protegida, auditoria sem conteúdo sensível no log.
|
||||||
|
8. **P08** Trocar hex do fluxo novo pelos tokens `--bc-*`. Não criar design system.
|
||||||
|
9. **P09** Hardening: papel no servidor, scrub Sentry (corpo, formulário, token, cookie, replay), upload, XSS, rate limit reusando `utils/rateLimit.ts`.
|
||||||
|
10. **P10** Vitest + critérios de aceite. E2E no Playwright já existente se o fluxo estiver estável.
|
||||||
|
11. **P11** Performance, WCAG AA, responsivo.
|
||||||
|
12. **P12** Rollout pela flag `contracts` (continua fail-closed, default desligada).
|
||||||
|
|
||||||
|
P13 e P14 ficam para revisão e correção, fora deste plano de construção.
|
||||||
+53
@@ -0,0 +1,53 @@
|
|||||||
|
# Contexto mestre para Cursor — EloPro Gerador de Contratos
|
||||||
|
|
||||||
|
Use este texto no início de uma sessão longa do Cursor Agent, ou converta-o em regra local do projeto se a equipe desejar.
|
||||||
|
|
||||||
|
Você está implementando o **Gerador de Contratos** dentro do EloPro/CRO. Não é um produto isolado.
|
||||||
|
|
||||||
|
## Prioridade das fontes
|
||||||
|
|
||||||
|
1. Stack e decisões explícitas do projeto.
|
||||||
|
2. Documentação oficial EloPro/CRO do repositório.
|
||||||
|
3. EloPro Design System V2.1/handoff.
|
||||||
|
4. Especificação final `EloPro_Gerador_de_Contratos_Escopo_e_Especificacao_v1.0`.
|
||||||
|
5. Protocolo V3 como origem das regras de negócio já consolidadas.
|
||||||
|
6. Gerador de Propostas como referência de composição, nunca como fonte para copiar regra de negócio.
|
||||||
|
|
||||||
|
Em conflito de arquitetura, prevalece EloPro. Em conflito visual, Design System. Em regra de negócio, prevalece a especificação final consolidada.
|
||||||
|
|
||||||
|
## Não negociáveis
|
||||||
|
|
||||||
|
- `workspace_id` é o tenant técnico.
|
||||||
|
- Supabase Auth/SSR; sem login próprio.
|
||||||
|
- feature flag `contracts`, fail-closed.
|
||||||
|
- RLS em Postgres + autorização server-side.
|
||||||
|
- owner/admin gerenciam templates; gestor/agent não.
|
||||||
|
- superadmin não é atalho para editar documento privado do cliente em fluxo operacional comum.
|
||||||
|
- Next.js 16 App Router, React 19, TS5, Tailwind v4.
|
||||||
|
- DS EloPro e Lucide; não inventar tokens/components globais.
|
||||||
|
- TanStack Query somente quando necessário.
|
||||||
|
- Redis é efêmero/cache/locks/rate limit, não banco primário.
|
||||||
|
- PDF via `@react-pdf/renderer`.
|
||||||
|
- preview e PDF do mesmo Contract Document Model.
|
||||||
|
- `.docx` e `.txt`, 5 MB, 50 campos únicos.
|
||||||
|
- placeholders `{{chave}}`.
|
||||||
|
- todos os campos obrigatórios no MVP.
|
||||||
|
- autosave ~15 s; draft 24 h.
|
||||||
|
- no máximo 10 modelos-base ativos por workspace.
|
||||||
|
- mesmo nome => nova versão; sem overwrite.
|
||||||
|
- template com draft ativo => delete bloqueado.
|
||||||
|
- PDF não persistido como repositório no MVP.
|
||||||
|
- Sentry sem conteúdo contratual sensível.
|
||||||
|
- IA/Claude não é requisito do MVP.
|
||||||
|
|
||||||
|
## Modo de trabalho
|
||||||
|
|
||||||
|
Antes de editar:
|
||||||
|
1. Leia arquivos reais relacionados.
|
||||||
|
2. Reuse padrões existentes.
|
||||||
|
3. Mostre plano curto.
|
||||||
|
4. Faça mudanças pequenas e coesas.
|
||||||
|
5. Rode testes/lint/typecheck relevantes.
|
||||||
|
6. Reporte o que mudou e o que ficou pendente.
|
||||||
|
|
||||||
|
Nunca resolva silenciosamente um decision gate sem evidência no repo ou aprovação explícita.
|
||||||
+32
@@ -0,0 +1,32 @@
|
|||||||
|
---
|
||||||
|
description: Regras obrigatórias do módulo EloPro Gerador de Contratos
|
||||||
|
globs:
|
||||||
|
- "app/**/contracts/**"
|
||||||
|
- "components/**/contracts/**"
|
||||||
|
- "lib/**/contracts/**"
|
||||||
|
- "utils/**/contracts/**"
|
||||||
|
- "**/*contract*"
|
||||||
|
alwaysApply: false
|
||||||
|
---
|
||||||
|
|
||||||
|
# EloPro Gerador de Contratos
|
||||||
|
|
||||||
|
- Reuse arquitetura e helpers existentes do EloPro; não crie auth, RBAC, feature flag ou design system paralelos.
|
||||||
|
- Tenant técnico = `workspace_id`; nunca confie em workspace_id arbitrário do client.
|
||||||
|
- Feature flag = `contracts`, fail-closed.
|
||||||
|
- Auth = Supabase Auth/SSR.
|
||||||
|
- Gestão de templates = owner/admin somente.
|
||||||
|
- Gestor/agent = fluxo operacional.
|
||||||
|
- Use RLS + autorização server-side.
|
||||||
|
- Templates: .docx/.txt, até 5 MB, até 50 chaves únicas {{chave}}.
|
||||||
|
- data_* => date; valor_*/preco_* => number; demais => text.
|
||||||
|
- Todos os campos obrigatórios no MVP.
|
||||||
|
- Autosave ~15 s; draft TTL 24 h.
|
||||||
|
- 10 modelos-base ativos/workspace; versões não contam como novos modelos.
|
||||||
|
- Mesmo nome nunca sobrescreve; cria nova versão.
|
||||||
|
- Draft ativo bloqueia exclusão da versão.
|
||||||
|
- Preview e PDF devem usar o mesmo Contract Document Model.
|
||||||
|
- PDF via @react-pdf/renderer e não é repositório permanente no MVP.
|
||||||
|
- Design System EloPro V2.1 obrigatório; não usar os tokens antigos do protocolo.
|
||||||
|
- Sentry deve scrubbar conteúdo do contrato, formulário, tokens e cookies.
|
||||||
|
- Não adicionar dependências para parser/sanitização/storage sem resolver DT-CTR-001…004.
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
# P00 — Discovery técnico e auditoria do módulo existente
|
||||||
|
|
||||||
|
Você está trabalhando no repositório do **EloPro/CRO**. Antes de escrever qualquer código do Gerador de Contratos, faça uma auditoria completa do que já existe.
|
||||||
|
|
||||||
|
## Contexto obrigatório
|
||||||
|
|
||||||
|
A documentação oficial registra:
|
||||||
|
- rota existente `/dashboard/contracts`;
|
||||||
|
- feature flag `contracts`;
|
||||||
|
- arquitetura Next.js App Router + Supabase/Postgres;
|
||||||
|
- tenant por `workspace_id`;
|
||||||
|
- papéis reais em `workspace_members.role` (`owner`, `admin`, `gestor`, `agent`) e `profiles.is_superadmin`;
|
||||||
|
- helpers de permissão já existentes, como `isWorkspaceAdmin()`, `isWorkspaceManager()`, `getManagedTeamIds()` e equivalentes;
|
||||||
|
- superadmin usa arquitetura própria e não deve ser confundido com operações normais do workspace.
|
||||||
|
|
||||||
|
## Objetivo
|
||||||
|
|
||||||
|
Descobrir o estado real do módulo de contratos, impedir duplicação de arquitetura e produzir um plano de migração/reuso antes da implementação.
|
||||||
|
|
||||||
|
## Tarefas
|
||||||
|
|
||||||
|
1. Localize todas as ocorrências de:
|
||||||
|
- `contracts`
|
||||||
|
- `/dashboard/contracts`
|
||||||
|
- feature flag `contracts`
|
||||||
|
- tabelas/migrations relacionadas a contratos/templates/drafts
|
||||||
|
- APIs, Server Actions, componentes e hooks relacionados.
|
||||||
|
2. Mapeie:
|
||||||
|
- rotas e layouts;
|
||||||
|
- componentes server/client;
|
||||||
|
- schema atual;
|
||||||
|
- RLS/policies;
|
||||||
|
- helpers de autorização;
|
||||||
|
- feature flags e AppShell/sidebar;
|
||||||
|
- padrões de auditoria;
|
||||||
|
- padrões de Sentry;
|
||||||
|
- padrões de upload/Storage existentes;
|
||||||
|
- padrões de Server Actions vs Route Handlers;
|
||||||
|
- package manager, scripts, CI e convenções de migrations.
|
||||||
|
3. Compare o estado atual com estes requisitos do novo módulo:
|
||||||
|
- famílias e versões de templates;
|
||||||
|
- placeholders dinâmicos;
|
||||||
|
- drafts temporários;
|
||||||
|
- preview + PDF;
|
||||||
|
- auditoria;
|
||||||
|
- RBAC;
|
||||||
|
- isolamento por `workspace_id`.
|
||||||
|
4. NÃO implemente nada nesta fase.
|
||||||
|
5. Classifique cada parte encontrada como:
|
||||||
|
- REUTILIZAR
|
||||||
|
- ADAPTAR
|
||||||
|
- MIGRAR
|
||||||
|
- REMOVER/DEPRECAR
|
||||||
|
- CRIAR
|
||||||
|
6. Identifique conflitos com a especificação. Não escolha arbitrariamente. Registre-os como decisões necessárias.
|
||||||
|
|
||||||
|
## Saída esperada
|
||||||
|
|
||||||
|
Crie `docs/contracts/P00-discovery-audit.md` contendo:
|
||||||
|
- inventário de arquivos;
|
||||||
|
- diagrama textual da arquitetura atual;
|
||||||
|
- schema/migrations encontradas;
|
||||||
|
- feature flag e guards;
|
||||||
|
- gaps contra RF/RN/CA do Gerador de Contratos;
|
||||||
|
- estratégia recomendada de migração/reuso;
|
||||||
|
- lista dos decision gates DT-CTR-001…007 com status `RESOLVIDO POR EVIDÊNCIA`, `PENDENTE` ou `NÃO APLICÁVEL`;
|
||||||
|
- plano de execução para P01–P12.
|
||||||
|
|
||||||
|
## Critério de conclusão
|
||||||
|
|
||||||
|
Pare ao final da auditoria. Não altere produto, banco ou UI. Mostre um resumo com os 10 achados mais importantes e os bloqueios que precisam de decisão humana.
|
||||||
+57
@@ -0,0 +1,57 @@
|
|||||||
|
# P01 — Fundação e arquitetura do módulo
|
||||||
|
|
||||||
|
Implemente somente a fundação do Gerador de Contratos com base no resultado aprovado do P00.
|
||||||
|
|
||||||
|
## Regras
|
||||||
|
|
||||||
|
- Next.js 16 App Router + React 19 + TypeScript 5.
|
||||||
|
- Não criar app separado; integrar ao AppShell EloPro.
|
||||||
|
- Rota principal deve seguir o padrão real do repo e preservar `/dashboard/contracts` quando aplicável.
|
||||||
|
- Feature flag `contracts` é obrigatória e fail-closed.
|
||||||
|
- Sessão vem de Supabase Auth/SSR; sem login próprio.
|
||||||
|
- Tenant vem do contexto autenticado/membership. Nunca confie em `workspace_id` arbitrário vindo do browser.
|
||||||
|
- Papéis: Superadmin / owner/admin / gestor / agent, reutilizando helpers existentes.
|
||||||
|
- Somente owner/admin gerenciam templates.
|
||||||
|
- Gestor e agent executam o fluxo operacional.
|
||||||
|
- Não criar novas libs ou abstrações globais sem necessidade comprovada.
|
||||||
|
|
||||||
|
## Implementar
|
||||||
|
|
||||||
|
1. Estrutura de pastas do módulo, separando apresentação, domínio e acesso a dados conforme padrões do repo.
|
||||||
|
2. Guard de feature flag e membership.
|
||||||
|
3. Guard server-side para gestão administrativa.
|
||||||
|
4. Navegação/entrada do módulo no AppShell conforme padrão existente.
|
||||||
|
5. Esqueleto das telas:
|
||||||
|
- Contratos
|
||||||
|
- Novo contrato
|
||||||
|
- Modelos de contrato (admin)
|
||||||
|
- Histórico (admin)
|
||||||
|
6. Tipos de domínio centrais:
|
||||||
|
- TemplateFamily
|
||||||
|
- ContractTemplate
|
||||||
|
- TemplateField
|
||||||
|
- ContractDraft
|
||||||
|
- ContractAuditEvent
|
||||||
|
- ContractDocumentModel
|
||||||
|
7. Catálogo de erros do módulo com códigos estáveis:
|
||||||
|
`TEMPLATE_INVALID_FORMAT`, `TEMPLATE_TOO_LARGE`, `TEMPLATE_NO_PLACEHOLDERS`, `TEMPLATE_TOO_MANY_FIELDS`, `TEMPLATE_LIMIT_REACHED`, `TEMPLATE_IN_USE`, `DRAFT_EXPIRED`, `DRAFT_SAVE_FAILED`, `PDF_GENERATION_FAILED`, `FEATURE_DISABLED`, `FORBIDDEN`, `RESOURCE_NOT_FOUND`.
|
||||||
|
|
||||||
|
## Não fazer ainda
|
||||||
|
|
||||||
|
- migrations definitivas;
|
||||||
|
- parser DOCX;
|
||||||
|
- PDF;
|
||||||
|
- autosave;
|
||||||
|
- telas finais;
|
||||||
|
- API pública v1.
|
||||||
|
|
||||||
|
## Qualidade
|
||||||
|
|
||||||
|
- TypeScript strict conforme repo.
|
||||||
|
- Reusar helpers do EloPro.
|
||||||
|
- Sem duplicação de auth/permissions/feature flags.
|
||||||
|
- Rodar lint/typecheck/testes mínimos disponíveis.
|
||||||
|
|
||||||
|
## Entrega
|
||||||
|
|
||||||
|
Ao final, relate arquivos criados/alterados, decisões herdadas do P00, riscos e o que ficou preparado para P02.
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
# P02 — Banco, migrations, índices e RLS
|
||||||
|
|
||||||
|
Implemente a persistência do Gerador de Contratos usando os padrões reais de migration do EloPro.
|
||||||
|
|
||||||
|
## Modelo alvo
|
||||||
|
|
||||||
|
Crie/adapte estas entidades sem duplicar estruturas equivalentes já existentes:
|
||||||
|
|
||||||
|
1. `contract_template_families`
|
||||||
|
- `id`
|
||||||
|
- `workspace_id`
|
||||||
|
- `name`
|
||||||
|
- `slug`
|
||||||
|
- `is_active`
|
||||||
|
- `created_by`
|
||||||
|
- `created_at`
|
||||||
|
|
||||||
|
2. `contract_templates`
|
||||||
|
- `id`
|
||||||
|
- `workspace_id`
|
||||||
|
- `family_id`
|
||||||
|
- `version`
|
||||||
|
- `original_filename`
|
||||||
|
- `storage_path` ou referência equivalente aprovada no P00
|
||||||
|
- `mime_type`
|
||||||
|
- `size_bytes`
|
||||||
|
- `checksum`
|
||||||
|
- `is_active`
|
||||||
|
- `created_by`
|
||||||
|
- `created_at`
|
||||||
|
|
||||||
|
3. `contract_template_fields`
|
||||||
|
- `id`, `workspace_id`, `template_id`, `key`, `label`, `field_type`, `position`, `required`, `metadata`
|
||||||
|
|
||||||
|
4. `contract_drafts`
|
||||||
|
- `id`, `workspace_id`, `user_id`, `template_id`, `values_json`, `status`, `last_saved_at`, `expires_at`, `created_at`
|
||||||
|
|
||||||
|
5. `contract_audit_events`
|
||||||
|
- `id`, `workspace_id`, `actor_id`, `action`, `entity_type`, `entity_id`, `metadata`, `created_at`
|
||||||
|
|
||||||
|
6. `app_connections`
|
||||||
|
- só criar se não existir estrutura equivalente no repo; caso exista, adaptar/reusar.
|
||||||
|
|
||||||
|
## Regras obrigatórias
|
||||||
|
|
||||||
|
- `workspace_id` em todas as entidades tenant-scoped.
|
||||||
|
- Máximo de 10 modelos-base ativos por workspace; versões da mesma família não contam como novos modelos-base.
|
||||||
|
- Versão de template é imutável após ativação, exceto estado permitido explicitamente.
|
||||||
|
- Unicidade coerente para `family_id + version`.
|
||||||
|
- Índices para listagem por workspace, família/versão, drafts por usuário/template e expiração.
|
||||||
|
- Draft expira 24 h após último save elegível.
|
||||||
|
- RLS deve ser a barreira principal, não apenas filtros da aplicação.
|
||||||
|
|
||||||
|
## RLS mínima
|
||||||
|
|
||||||
|
- SELECT templates: membro do workspace; fluxo operacional vê somente versões permitidas/ativas.
|
||||||
|
- INSERT/gestão templates: owner/admin.
|
||||||
|
- SELECT/UPSERT draft: próprio usuário no mesmo workspace.
|
||||||
|
- SELECT audit: owner/admin no próprio workspace; superadmin apenas via mecanismos globais já existentes.
|
||||||
|
- INSERT audit: somente caminho server/controlado; cliente não pode forjar actor/workspace.
|
||||||
|
- Nunca usar service role no fluxo normal do módulo.
|
||||||
|
|
||||||
|
## Testes adversariais obrigatórios
|
||||||
|
|
||||||
|
Inclua testes/SQL checks cobrindo:
|
||||||
|
- Tenant A não lê/escreve Tenant B.
|
||||||
|
- agent/gestor não cria ou exclui template.
|
||||||
|
- usuário não altera draft de outro usuário.
|
||||||
|
- actor/workspace do audit não pode ser falsificado pelo browser.
|
||||||
|
|
||||||
|
## Entrega
|
||||||
|
|
||||||
|
- migrations idempotentes no padrão do repo;
|
||||||
|
- documentação curta em `docs/contracts/P02-database-rls.md`;
|
||||||
|
- output dos testes de RLS;
|
||||||
|
- nenhuma API/UI além do mínimo necessário para compilar.
|
||||||
+58
@@ -0,0 +1,58 @@
|
|||||||
|
# P03 — Upload, validação, parsing e versionamento técnico de templates
|
||||||
|
|
||||||
|
Implemente o pipeline de templates do MVP.
|
||||||
|
|
||||||
|
## Regras de produto
|
||||||
|
|
||||||
|
- Formatos MVP: `.docx` e `.txt`.
|
||||||
|
- Tamanho máximo: 5 MB.
|
||||||
|
- Placeholder: `{{chave}}`.
|
||||||
|
- Máximo: 50 chaves únicas.
|
||||||
|
- Tipos:
|
||||||
|
- prefixo `data_` => `date`
|
||||||
|
- prefixo `valor_` ou `preco_` => `number`
|
||||||
|
- demais => `text`
|
||||||
|
- Label: transformar underscore em espaço e humanizar.
|
||||||
|
- Mesma chave repetida no documento representa um único campo lógico e deve receber o mesmo valor em todas as ocorrências.
|
||||||
|
- Template sem placeholder válido deve ser rejeitado.
|
||||||
|
- Mesmo nome base não sobrescreve: deve entrar no fluxo de nova versão.
|
||||||
|
- Não editar in-place versão histórica.
|
||||||
|
|
||||||
|
## Decision gates
|
||||||
|
|
||||||
|
Antes de adicionar dependência:
|
||||||
|
1. Verifique P00 para DT-CTR-001 (parser DOCX) e DT-CTR-002 (sanitização).
|
||||||
|
2. Se o repo já tiver solução aprovada, reutilize.
|
||||||
|
3. Se continuarem pendentes, NÃO invente silenciosamente. Implemente a interface/adapter e registre o bloqueio exato para aprovação humana.
|
||||||
|
4. Respeite DT-CTR-003: não prometa fidelidade a recursos DOCX que a matriz aprovada não suporte.
|
||||||
|
5. Respeite DT-CTR-004 para Storage.
|
||||||
|
|
||||||
|
## Pipeline
|
||||||
|
|
||||||
|
Upload → validar extensão/MIME/tamanho → armazenar/ler de forma segura → extrair conteúdo → sanitizar → detectar placeholders → deduplicar chaves → preservar ordem da primeira ocorrência → inferir tipos/labels → validar limites → calcular checksum → resolver família/nova versão → persistir template + fields → auditar.
|
||||||
|
|
||||||
|
## Segurança
|
||||||
|
|
||||||
|
- Não confiar só na extensão.
|
||||||
|
- Não executar macros/scripts.
|
||||||
|
- Sanitizar HTML/markup antes de qualquer preview.
|
||||||
|
- Storage privado/URLs temporárias se esse for o padrão aprovado.
|
||||||
|
- Nomes de arquivo normalizados.
|
||||||
|
- Erros claros sem revelar stack trace.
|
||||||
|
|
||||||
|
## Testes Vitest
|
||||||
|
|
||||||
|
Cubra:
|
||||||
|
- regex/placeholders;
|
||||||
|
- chaves repetidas;
|
||||||
|
- tipos inferidos;
|
||||||
|
- label humanizado;
|
||||||
|
- 0, 1, 50 e 51 campos;
|
||||||
|
- 5 MB e acima;
|
||||||
|
- MIME/extensão inconsistente;
|
||||||
|
- mesmo nome => versão seguinte;
|
||||||
|
- checksum e não sobrescrita.
|
||||||
|
|
||||||
|
## Entrega
|
||||||
|
|
||||||
|
Implemente serviços puros de parsing/normalização com boa testabilidade. Não construa ainda o wizard operacional completo.
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
# P04 — Fluxo operacional: seleção, review e formulário dinâmico
|
||||||
|
|
||||||
|
Construa o fluxo principal do usuário usando o EloPro Design System e padrões reais do Gerador de Propostas.
|
||||||
|
|
||||||
|
## Telas
|
||||||
|
|
||||||
|
- CTR-UI-01 Contratos
|
||||||
|
- CTR-UI-02 Novo contrato — Selecionar modelo
|
||||||
|
- CTR-UI-03 Novo contrato — Revisar modelo
|
||||||
|
- CTR-UI-04 Novo contrato — Preencher informações
|
||||||
|
|
||||||
|
## Fluxo
|
||||||
|
|
||||||
|
Contratos → Novo contrato → listar templates ativos do workspace → selecionar um → carregar conteúdo e metadados → review read-only + campos detectados → “Preencher informações” → formulário dinâmico.
|
||||||
|
|
||||||
|
## Regras
|
||||||
|
|
||||||
|
- Um template por draft.
|
||||||
|
- Ordenação por nome/versão conforme especificação.
|
||||||
|
- Empty state: “Nenhum modelo disponível. Solicite ao administrador.” ou microcopy equivalente no padrão EloPro.
|
||||||
|
- Formulário respeita ordem da primeira ocorrência.
|
||||||
|
- Todos os campos obrigatórios.
|
||||||
|
- number: positivo, até 2 decimais, contexto BRL quando aplicável.
|
||||||
|
- date: controle de data acessível.
|
||||||
|
- voltar para seleção com dados preenchidos exige Dialog de confirmação quando houver risco real de perda.
|
||||||
|
- gestor/usuário não veem controles administrativos.
|
||||||
|
- feature flag e auth sempre revalidados no servidor para mutações.
|
||||||
|
|
||||||
|
## Arquitetura frontend
|
||||||
|
|
||||||
|
- Server Components por padrão para carga inicial quando apropriado.
|
||||||
|
- Client Components apenas para interação necessária.
|
||||||
|
- TanStack Query v5 somente onde cache/fetch client-side trouxer benefício real; não duplicar Server Components sem motivo.
|
||||||
|
- Evitar estado global novo sem necessidade.
|
||||||
|
- Lucide React para ícones.
|
||||||
|
- `@dnd-kit` NÃO é necessário neste fluxo; não use sem necessidade funcional.
|
||||||
|
|
||||||
|
## UX
|
||||||
|
|
||||||
|
Use componentes existentes do EloPro: Button, Card/OpenFramePanel, Input, Select, DateField, Badge/SemanticMarker, Dialog, Toast/Tooltip quando apropriado.
|
||||||
|
|
||||||
|
Implemente estados loading, empty, error, disabled e blocked. Mensagens devem explicar o que ocorreu e qual o próximo passo.
|
||||||
|
|
||||||
|
## Testes
|
||||||
|
|
||||||
|
- somente templates do workspace;
|
||||||
|
- seleção única;
|
||||||
|
- review read-only;
|
||||||
|
- campos obrigatórios;
|
||||||
|
- tipos corretos;
|
||||||
|
- voltar com/sem dados;
|
||||||
|
- papéis sem acesso admin.
|
||||||
|
|
||||||
|
Pare antes de implementar preview/PDF; isso vem em P06.
|
||||||
+48
@@ -0,0 +1,48 @@
|
|||||||
|
# P05 — Drafts, autosave e restauração
|
||||||
|
|
||||||
|
Implemente a preservação de progresso do formulário.
|
||||||
|
|
||||||
|
## Regras
|
||||||
|
|
||||||
|
- Autosave aproximadamente a cada 15 segundos após alterações, com debounce adequado para evitar request por tecla.
|
||||||
|
- Draft identificado por `workspace_id + user_id + template_id` ou pela estratégia aprovada no P02.
|
||||||
|
- Cada draft fixa uma versão exata de template.
|
||||||
|
- TTL: 24 h desde o último save elegível.
|
||||||
|
- Ao retornar dentro do TTL: oferecer “Encontramos um progresso não salvo. Deseja restaurar?” com data/hora quando disponível.
|
||||||
|
- SIM: restaurar valores.
|
||||||
|
- NÃO: abandonar/excluir draft e iniciar limpo.
|
||||||
|
- Voltar do preview nunca apaga os valores.
|
||||||
|
- Logout/limpeza deve impedir exposição de dados via cache/histórico do app.
|
||||||
|
|
||||||
|
## Redis
|
||||||
|
|
||||||
|
Use Redis/ioredis apenas conforme arquitetura aprovada no P00:
|
||||||
|
- cache/coordenação/locks/TTL efêmero se necessário;
|
||||||
|
- não transforme Redis em banco primário do domínio;
|
||||||
|
- persistência mínima confiável continua em Postgres quando necessária para restauração do produto.
|
||||||
|
|
||||||
|
## Concorrência
|
||||||
|
|
||||||
|
- Não há edição colaborativa.
|
||||||
|
- Drafts são isolados por usuário.
|
||||||
|
- Se houver múltiplas abas, evite sobrescrita silenciosa quando possível; use `updated_at`/versionamento otimista se o padrão do repo permitir.
|
||||||
|
- Draft ativo deve bloquear exclusão da versão de template correspondente.
|
||||||
|
|
||||||
|
## UI
|
||||||
|
|
||||||
|
Exibir status discreto e acessível:
|
||||||
|
- Salvando…
|
||||||
|
- Salvo
|
||||||
|
- Não foi possível salvar. Seus dados continuam nesta tela. Tentar novamente / nova tentativa automática conforme padrão do repo.
|
||||||
|
|
||||||
|
Não bloquear digitação por falha temporária de autosave.
|
||||||
|
|
||||||
|
## Testes
|
||||||
|
|
||||||
|
- autosave não dispara por tecla;
|
||||||
|
- salva após janela esperada;
|
||||||
|
- restaura dentro de 24 h;
|
||||||
|
- expira após TTL;
|
||||||
|
- recusa restauração remove/abandona;
|
||||||
|
- draft de outro usuário/workspace não é acessível;
|
||||||
|
- template com draft ativo fica protegido.
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
# P06 — Contract Document Model, preview, PDF e download
|
||||||
|
|
||||||
|
Implemente o núcleo de renderização garantindo consistência entre tela e PDF.
|
||||||
|
|
||||||
|
## Princípio obrigatório
|
||||||
|
|
||||||
|
Não mantenha duas fontes de verdade. Crie/use um `ContractDocumentModel` intermediário derivado de:
|
||||||
|
|
||||||
|
Template + campos detectados + valores normalizados → ContractDocumentModel → Web Preview Renderer + @react-pdf/renderer.
|
||||||
|
|
||||||
|
## Regras
|
||||||
|
|
||||||
|
- Nenhum `{{placeholder}}` pode permanecer no preview aprovado ou no PDF.
|
||||||
|
- Mesma chave repetida usa o mesmo valor em todas as ocorrências.
|
||||||
|
- Cláusulas fixas devem permanecer semanticamente inalteradas.
|
||||||
|
- Voltar do preview mantém 100% dos valores.
|
||||||
|
- Durante geração: botão desabilitado e feedback “Gerando seu contrato…” no tom EloPro.
|
||||||
|
- Sucesso: habilitar download.
|
||||||
|
- Meta de performance: PDF em até 5 s no cenário de referência.
|
||||||
|
- MVP não cria repositório permanente de PDFs.
|
||||||
|
|
||||||
|
## Nome do arquivo
|
||||||
|
|
||||||
|
`[NomeDoTemplate]_[NomeDoCliente].pdf`
|
||||||
|
|
||||||
|
- Preferir valor de `razao_social` ou equivalente mapeado.
|
||||||
|
- Fallback: `[NomeDoTemplate]_contrato.pdf`.
|
||||||
|
- Normalizar caracteres inseguros e evitar path traversal.
|
||||||
|
|
||||||
|
## Fidelidade
|
||||||
|
|
||||||
|
A especificação exige equivalência de conteúdo/estrutura, não pixel-perfect entre DOM e React PDF. Documente diferenças inevitáveis de paginação/fontes dentro da matriz DOCX aprovada.
|
||||||
|
|
||||||
|
## Segurança/privacidade
|
||||||
|
|
||||||
|
- PDF deve ser gerado server-side ou no local apropriado do padrão do repo sem expor segredos.
|
||||||
|
- Não enviar conteúdo contratual integral ao Sentry.
|
||||||
|
- Não persistir o PDF após o ciclo necessário para download, salvo mecanismo temporário já aprovado.
|
||||||
|
|
||||||
|
## Testes
|
||||||
|
|
||||||
|
- placeholder residual = falha;
|
||||||
|
- cláusula fixa alterada = falha;
|
||||||
|
- valores repetidos consistentes;
|
||||||
|
- nome do arquivo normalizado;
|
||||||
|
- geração duplicada por double click impedida;
|
||||||
|
- falha de PDF retorna erro acionável e preserva dados;
|
||||||
|
- benchmark do cenário de referência.
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
# P07 — Administração de modelos, versões, exclusão protegida e histórico
|
||||||
|
|
||||||
|
Implemente o fluxo administrativo, somente para owner/admin do workspace.
|
||||||
|
|
||||||
|
## Telas
|
||||||
|
|
||||||
|
- CTR-UI-07 Modelos de contrato
|
||||||
|
- CTR-UI-08 Subir modelo
|
||||||
|
- CTR-UI-09 Revisar campos identificados
|
||||||
|
- CTR-UI-10 Revisar e ativar modelo
|
||||||
|
- CTR-UI-11 Nova versão
|
||||||
|
- CTR-UI-12 Histórico
|
||||||
|
|
||||||
|
## Regras
|
||||||
|
|
||||||
|
- Máximo de 10 modelos-base ativos por workspace.
|
||||||
|
- Versões da mesma família não consomem nova cota.
|
||||||
|
- Mesmo nome base => modal confirmando nova versão; nunca sobrescrever.
|
||||||
|
- Versão nova recebe vN+1.
|
||||||
|
- Versão histórica permanece imutável.
|
||||||
|
- Versão com draft ativo não pode ser excluída.
|
||||||
|
- Exclusão é destrutiva: Dialog obrigatório com confirmação clara.
|
||||||
|
- Gestor/Usuário não podem acessar nem chamar mutações administrativas, mesmo por URL direta.
|
||||||
|
- Superadmin não deve modificar templates privados como rotina operacional; seguir mecanismos de plataforma para suporte.
|
||||||
|
|
||||||
|
## Auditoria
|
||||||
|
|
||||||
|
Registrar no mínimo:
|
||||||
|
- `contract.template_uploaded`
|
||||||
|
- `contract.template_version_created`
|
||||||
|
- `contract.template_delete_blocked`
|
||||||
|
- `contract.template_deleted`
|
||||||
|
- `contract.template_selected`
|
||||||
|
- `contract.draft_restored`
|
||||||
|
- `contract.previewed`
|
||||||
|
- `contract.pdf_generated`
|
||||||
|
- `contract.pdf_downloaded`
|
||||||
|
- `contract.integration_toggled`
|
||||||
|
|
||||||
|
Cada evento deve incluir actor, workspace, timestamp, entidade e metadados mínimos. Não guardar conteúdo contratual completo no audit log.
|
||||||
|
|
||||||
|
## Histórico
|
||||||
|
|
||||||
|
Admin vê somente seu workspace. Use paginação/filtros conforme padrão existente. Se filtros avançados estiverem fora do MVP, implemente somente o necessário para leitura útil sem expandir escopo.
|
||||||
|
|
||||||
|
## Testes
|
||||||
|
|
||||||
|
- quota de 10 famílias;
|
||||||
|
- versão não aumenta quota;
|
||||||
|
- nova versão preserva anterior;
|
||||||
|
- draft ativo bloqueia delete;
|
||||||
|
- admin only;
|
||||||
|
- audit actor/workspace não falsificável;
|
||||||
|
- eventos mínimos emitidos.
|
||||||
+57
@@ -0,0 +1,57 @@
|
|||||||
|
# P08 — Conformidade UX/UI com EloPro Design System
|
||||||
|
|
||||||
|
Faça uma revisão e implementação visual do módulo inteiro sem inventar um design system paralelo.
|
||||||
|
|
||||||
|
## Fonte de verdade
|
||||||
|
|
||||||
|
Use os componentes/tokens existentes do EloPro e a composição do Gerador de Propostas como referência de aplicação prática. Não copie telas cegamente; preserve a semântica específica de contratos.
|
||||||
|
|
||||||
|
## Tokens essenciais
|
||||||
|
|
||||||
|
- Midnight Ink `#071B45`
|
||||||
|
- Cloud White `#FBFBFE`
|
||||||
|
- Primary Blue `#1F6FFF`
|
||||||
|
- Blue 600 `#225EDB`
|
||||||
|
- Bright Blue `#2F8FFF`
|
||||||
|
- Soft Blue `#DCEBFF`
|
||||||
|
- Aqua Signal `#00C2A8`
|
||||||
|
- Warning `#F39A2D`
|
||||||
|
- Insight `#7C8CFF`
|
||||||
|
- Error `#E63946`
|
||||||
|
- Text Secondary `#69758A`
|
||||||
|
- Border `#D1D8E3`
|
||||||
|
- Fonte principal: Manrope
|
||||||
|
|
||||||
|
Não recrie tokens antigos do protocolo (Montserrat/dark #323232/verde #004E32/lime #CCFF00).
|
||||||
|
|
||||||
|
## Componentes preferenciais
|
||||||
|
|
||||||
|
Button, IconButton, Card, OpenFramePanel, Input, Select, Checkbox, Radio, Switch, DateField, DateRangeField, Badge, SemanticMarker, Tag, Tabs, CapsuleTabs, ContextGroup, SectionPill, Toast, Tooltip, Dialog, JourneyTrail/ContextLayers somente quando a semântica justificar.
|
||||||
|
|
||||||
|
## Revisar todas as telas CTR-UI-01…12
|
||||||
|
|
||||||
|
Para cada tela, validar:
|
||||||
|
- hierarquia visual;
|
||||||
|
- estados loading/empty/error/success/disabled/autosave/blocked;
|
||||||
|
- microcopy clara;
|
||||||
|
- foco visível;
|
||||||
|
- teclado;
|
||||||
|
- labels;
|
||||||
|
- contraste;
|
||||||
|
- responsividade;
|
||||||
|
- ações destrutivas com confirmação;
|
||||||
|
- consistência com AppShell.
|
||||||
|
|
||||||
|
## Regras de UX
|
||||||
|
|
||||||
|
- self-service;
|
||||||
|
- progressive disclosure;
|
||||||
|
- defaults seguros;
|
||||||
|
- feedback claro;
|
||||||
|
- preservação de progresso;
|
||||||
|
- baixo esforço cognitivo;
|
||||||
|
- nenhuma interação dependente só de cor.
|
||||||
|
|
||||||
|
## Entrega
|
||||||
|
|
||||||
|
Corrija divergências encontradas, sem alterar regras de negócio. Gere `docs/contracts/P08-ui-conformance.md` com checklist por tela e componentes reutilizados.
|
||||||
+55
@@ -0,0 +1,55 @@
|
|||||||
|
# P09 — Segurança, privacidade, observabilidade e hardening
|
||||||
|
|
||||||
|
Faça hardening do módulo sem expandir escopo funcional.
|
||||||
|
|
||||||
|
## Segurança obrigatória
|
||||||
|
|
||||||
|
- RLS por `workspace_id`.
|
||||||
|
- Autorização server-side em toda mutação.
|
||||||
|
- Feature flag fail-closed.
|
||||||
|
- Proteção contra IDOR.
|
||||||
|
- Upload: tamanho/MIME/extensão, sanitização, nomes seguros.
|
||||||
|
- Preview sem XSS.
|
||||||
|
- Storage privado/URL temporária se aplicável.
|
||||||
|
- Sem service role no fluxo normal.
|
||||||
|
- Rate limit para upload/geração PDF se padrão/necessidade justificar; Redis é permitido.
|
||||||
|
- Após logout, voltar no browser não deve revelar dados anteriores.
|
||||||
|
- Sem secrets/tokens/cookies em logs.
|
||||||
|
|
||||||
|
## Sentry
|
||||||
|
|
||||||
|
Configurar/validar client/server/edge conforme padrão EloPro.
|
||||||
|
|
||||||
|
Eventos técnicos relevantes:
|
||||||
|
- `template.upload.failed`
|
||||||
|
- `template.parse.failed`
|
||||||
|
- `pdf.generation.failed`
|
||||||
|
- `pdf.generation.timeout`
|
||||||
|
- `draft.save.failed`
|
||||||
|
- `tenant.access.denied`
|
||||||
|
|
||||||
|
Aplicar scrubbing para remover:
|
||||||
|
- valores de formulário;
|
||||||
|
- conteúdo do template/contrato;
|
||||||
|
- PDF;
|
||||||
|
- tokens/cookies;
|
||||||
|
- credenciais;
|
||||||
|
- URLs assinadas sensíveis.
|
||||||
|
|
||||||
|
Adicionar correlation/request id se o repo tiver padrão.
|
||||||
|
|
||||||
|
## Testes adversariais
|
||||||
|
|
||||||
|
- workspace A tenta IDs do B;
|
||||||
|
- agent chama mutação admin;
|
||||||
|
- MIME forjado;
|
||||||
|
- HTML/script malicioso;
|
||||||
|
- nome de arquivo com traversal;
|
||||||
|
- payload excessivo;
|
||||||
|
- Sentry não recebe PII/conteúdo contratual;
|
||||||
|
- feature flag desligada;
|
||||||
|
- logout + browser back.
|
||||||
|
|
||||||
|
## Entrega
|
||||||
|
|
||||||
|
Gere relatório `docs/contracts/P09-security-review.md` com achados, correções e riscos residuais.
|
||||||
+56
@@ -0,0 +1,56 @@
|
|||||||
|
# P10 — Testes e critérios de aceite
|
||||||
|
|
||||||
|
Construa a suíte de testes do módulo alinhada à especificação.
|
||||||
|
|
||||||
|
## Unitários — Vitest
|
||||||
|
|
||||||
|
Cobrir regras puras:
|
||||||
|
- placeholders;
|
||||||
|
- deduplicação;
|
||||||
|
- labels;
|
||||||
|
- inferência de tipos;
|
||||||
|
- validação de campos;
|
||||||
|
- quota de famílias;
|
||||||
|
- versionamento;
|
||||||
|
- nome de PDF;
|
||||||
|
- expiração de draft;
|
||||||
|
- Contract Document Model;
|
||||||
|
- normalização/sanitização onde testável.
|
||||||
|
|
||||||
|
## Integração
|
||||||
|
|
||||||
|
Cobrir:
|
||||||
|
- upload → parse → persistência;
|
||||||
|
- template → fields;
|
||||||
|
- draft → save/restore;
|
||||||
|
- preview → PDF;
|
||||||
|
- RBAC;
|
||||||
|
- RLS;
|
||||||
|
- audit events;
|
||||||
|
- feature flag.
|
||||||
|
|
||||||
|
## Critérios CA-CTR obrigatórios
|
||||||
|
|
||||||
|
- CA-CTR-001: Tenant A não acessa template/draft/audit do Tenant B.
|
||||||
|
- CA-CTR-002: PDF ≤ 5 s no cenário de referência.
|
||||||
|
- CA-CTR-003: interrupção + retorno dentro de 24 h oferece restauração.
|
||||||
|
- CA-CTR-004: upload sem tags é bloqueado.
|
||||||
|
- CA-CTR-005: logout + voltar não revela contrato anterior.
|
||||||
|
- CA-CTR-006: mesma chave repetida usa valor consistente.
|
||||||
|
- CA-CTR-007: nome existente oferece v2 e mantém v1.
|
||||||
|
- CA-CTR-008: template com draft ativo não exclui.
|
||||||
|
- CA-CTR-009: voltar do preview mantém 100% dos valores.
|
||||||
|
- CA-CTR-010: PDF sem placeholder residual e cláusulas fixas preservadas.
|
||||||
|
- CA-CTR-011: Gestor/Usuário não acessam gestão de templates.
|
||||||
|
- CA-CTR-012: feature `contracts` desligada impede acesso.
|
||||||
|
|
||||||
|
## E2E
|
||||||
|
|
||||||
|
Use o framework E2E já existente no repo. Se não houver, não adicione uma nova stack silenciosamente: registre a lacuna e implemente o máximo possível com o padrão aprovado.
|
||||||
|
|
||||||
|
Fluxo mínimo E2E:
|
||||||
|
login → contracts → novo → selecionar template → review → preencher → autosave → preview → editar → gerar → baixar.
|
||||||
|
|
||||||
|
## Saída
|
||||||
|
|
||||||
|
Crie uma matriz `docs/contracts/P10-test-matrix.md` ligando teste → RF/RN/CA. Nenhum critério crítico pode ficar sem cobertura ou justificativa explícita.
|
||||||
+41
@@ -0,0 +1,41 @@
|
|||||||
|
# P11 — Performance, acessibilidade e responsividade
|
||||||
|
|
||||||
|
Otimize e valide o módulo sem alterar regras de negócio.
|
||||||
|
|
||||||
|
## Metas
|
||||||
|
|
||||||
|
- acesso ao módulo ≤ 3 s em condições de referência;
|
||||||
|
- PDF ≤ 5 s;
|
||||||
|
- autosave sem degradação de digitação;
|
||||||
|
- loading sem layout shift desnecessário.
|
||||||
|
|
||||||
|
## Performance
|
||||||
|
|
||||||
|
- revisar boundaries Server/Client Components;
|
||||||
|
- eliminar fetch duplicado;
|
||||||
|
- usar TanStack Query somente onde necessário;
|
||||||
|
- revisar payloads de template/preview;
|
||||||
|
- lazy load quando apropriado;
|
||||||
|
- evitar re-render excessivo do formulário dinâmico;
|
||||||
|
- medir geração de PDF;
|
||||||
|
- checar índices das queries críticas.
|
||||||
|
|
||||||
|
## Acessibilidade — referência WCAG AA
|
||||||
|
|
||||||
|
- foco visível;
|
||||||
|
- navegação por teclado;
|
||||||
|
- labels e descrições;
|
||||||
|
- erro associado ao campo;
|
||||||
|
- Dialog com focus trap/retorno de foco conforme componente DS;
|
||||||
|
- status de autosave com `aria-live` quando apropriado;
|
||||||
|
- loading acessível;
|
||||||
|
- nenhuma informação depende apenas de cor;
|
||||||
|
- contraste conforme DS.
|
||||||
|
|
||||||
|
## Responsividade
|
||||||
|
|
||||||
|
Desktop é principal, mas a UI web deve responder a larguras menores sem quebrar tarefas essenciais. Não criar app mobile nativo.
|
||||||
|
|
||||||
|
## Entrega
|
||||||
|
|
||||||
|
Crie `docs/contracts/P11-performance-a11y.md` com medições, gargalos, correções e pendências.
|
||||||
+45
@@ -0,0 +1,45 @@
|
|||||||
|
# P12 — Homologação, rollout e release por feature flag
|
||||||
|
|
||||||
|
Prepare o Gerador de Contratos para release controlado.
|
||||||
|
|
||||||
|
## Antes do rollout
|
||||||
|
|
||||||
|
1. Rodar lint, typecheck, unitários, integração e E2E existentes.
|
||||||
|
2. Validar migrations em ambiente seguro.
|
||||||
|
3. Validar RLS com usuários/tenants distintos.
|
||||||
|
4. Testar templates reais representativos da matriz DOCX aprovada.
|
||||||
|
5. Confirmar Sentry sem vazamento de conteúdo.
|
||||||
|
6. Confirmar feature flag `contracts` fail-closed.
|
||||||
|
7. Confirmar papéis:
|
||||||
|
- owner/admin: gestão + operação;
|
||||||
|
- gestor/agent: operação, sem gestão;
|
||||||
|
- superadmin: mecanismos de plataforma, sem edição operacional rotineira de documentos privados.
|
||||||
|
8. Confirmar que PDFs não estão sendo armazenados permanentemente no MVP.
|
||||||
|
9. Confirmar backup/restauração 24 h.
|
||||||
|
10. Medir metas de 3 s / 5 s no cenário acordado.
|
||||||
|
|
||||||
|
## Rollout
|
||||||
|
|
||||||
|
Use o mecanismo real de feature flags do EloPro. Não crie flag paralela.
|
||||||
|
|
||||||
|
Sugestão de ordem, se compatível com a plataforma:
|
||||||
|
- workspace interno/teste;
|
||||||
|
- workspace piloto;
|
||||||
|
- pequena coorte;
|
||||||
|
- expansão gradual.
|
||||||
|
|
||||||
|
Não habilite globalmente se CA críticos falharem.
|
||||||
|
|
||||||
|
## Definition of Done
|
||||||
|
|
||||||
|
Marcar cada item da seção 24 da especificação como `PASS`, `FAIL` ou `WAIVED COM JUSTIFICATIVA`.
|
||||||
|
|
||||||
|
## Entrega
|
||||||
|
|
||||||
|
Crie:
|
||||||
|
- `docs/contracts/P12-release-checklist.md`
|
||||||
|
- notas de rollback;
|
||||||
|
- lista de migrations;
|
||||||
|
- lista de variáveis/configurações necessárias;
|
||||||
|
- riscos residuais;
|
||||||
|
- recomendação objetiva de `READY` ou `NOT READY` baseada somente nos critérios técnicos, sem mascarar falhas.
|
||||||
+44
@@ -0,0 +1,44 @@
|
|||||||
|
# P13 — Auditoria final de código independente
|
||||||
|
|
||||||
|
Faça uma revisão crítica do Gerador de Contratos como se você NÃO tivesse escrito a implementação.
|
||||||
|
|
||||||
|
## Não altere código no primeiro passe
|
||||||
|
|
||||||
|
Primeiro produza achados classificados por severidade:
|
||||||
|
- P0 crítico
|
||||||
|
- P1 alto
|
||||||
|
- P2 médio
|
||||||
|
- P3 baixo
|
||||||
|
|
||||||
|
## Revisar
|
||||||
|
|
||||||
|
1. Tenant/RLS/IDOR.
|
||||||
|
2. RBAC real vs UI.
|
||||||
|
3. Feature flag fail-closed.
|
||||||
|
4. Imutabilidade/versionamento de templates.
|
||||||
|
5. Quota de 10 famílias.
|
||||||
|
6. Draft TTL 24 h e proteção de exclusão.
|
||||||
|
7. Consistência Contract Document Model → preview/PDF.
|
||||||
|
8. Conteúdo fixo e placeholders residuais.
|
||||||
|
9. Upload e XSS.
|
||||||
|
10. Sentry/privacidade.
|
||||||
|
11. App Router/Server Components/Actions conforme padrões do repo.
|
||||||
|
12. Uso indevido de client components/TanStack Query.
|
||||||
|
13. Design System EloPro; componentes ou tokens paralelos.
|
||||||
|
14. Acessibilidade.
|
||||||
|
15. Performance.
|
||||||
|
16. Cobertura de CA-CTR-001…012.
|
||||||
|
17. Débitos/pendências DT-CTR-001…007.
|
||||||
|
18. Duplicação com módulo `/dashboard/contracts` legado.
|
||||||
|
|
||||||
|
## Depois da auditoria
|
||||||
|
|
||||||
|
Apresente:
|
||||||
|
- tabela de achados com arquivo/linha quando possível;
|
||||||
|
- impacto;
|
||||||
|
- evidência;
|
||||||
|
- correção recomendada;
|
||||||
|
- risco de regressão;
|
||||||
|
- itens sem evidência suficiente.
|
||||||
|
|
||||||
|
Somente após aprovação do relatório, aplique correções P0/P1 em uma segunda etapa.
|
||||||
+29
@@ -0,0 +1,29 @@
|
|||||||
|
# P14 — Prompt reutilizável para bugfix sem regressão
|
||||||
|
|
||||||
|
Corrija o bug descrito abaixo no módulo Gerador de Contratos sem alterar comportamentos não relacionados.
|
||||||
|
|
||||||
|
## Bug
|
||||||
|
|
||||||
|
[COLE AQUI O BUG, PASSOS PARA REPRODUZIR, RESULTADO ATUAL E RESULTADO ESPERADO]
|
||||||
|
|
||||||
|
## Processo obrigatório
|
||||||
|
|
||||||
|
1. Reproduza/identifique a causa raiz antes de alterar código.
|
||||||
|
2. Localize RF/RN/CA afetados.
|
||||||
|
3. Verifique se o problema envolve tenant, RLS, RBAC, feature flag, versionamento, draft, preview/PDF ou Design System.
|
||||||
|
4. Escreva teste de regressão que falha antes da correção, quando tecnicamente viável.
|
||||||
|
5. Faça a menor correção segura.
|
||||||
|
6. Execute testes relacionados + lint/typecheck.
|
||||||
|
7. Não adicione dependências sem necessidade e aprovação.
|
||||||
|
8. Não relaxe segurança/RLS para “fazer funcionar”.
|
||||||
|
9. Não use service role para contornar policy no fluxo normal.
|
||||||
|
10. Não envie conteúdo contratual ao Sentry.
|
||||||
|
|
||||||
|
## Saída
|
||||||
|
|
||||||
|
Informe:
|
||||||
|
- causa raiz;
|
||||||
|
- arquivos alterados;
|
||||||
|
- teste de regressão;
|
||||||
|
- comportamento após correção;
|
||||||
|
- riscos/efeitos colaterais verificados.
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
# Cursor Prompt Pack — EloPro Gerador de Contratos
|
||||||
|
|
||||||
|
Versão: 1.0
|
||||||
|
Base: `EloPro_Gerador_de_Contratos_Escopo_e_Especificacao_v1.0`
|
||||||
|
Objetivo: construir o módulo **Gerador de Contratos** dentro do ecossistema EloPro/CRO sem criar arquitetura, padrões visuais ou mecanismos paralelos aos já existentes.
|
||||||
|
|
||||||
|
## Como usar
|
||||||
|
|
||||||
|
1. Execute os prompts **na ordem** abaixo em uma branch dedicada.
|
||||||
|
2. Cole cada prompt no Cursor Agent/Composer com acesso ao repositório completo.
|
||||||
|
3. Não pule o **P00 — Discovery/Auditoria**. A documentação oficial já registra um módulo `/dashboard/contracts` protegido por feature flag `contracts`; o primeiro trabalho é descobrir o que existe e reaproveitar/migrar corretamente.
|
||||||
|
4. Em cada fase, exija que o Cursor:
|
||||||
|
- leia os arquivos reais antes de alterar código;
|
||||||
|
- apresente um plano curto;
|
||||||
|
- implemente apenas o escopo da fase;
|
||||||
|
- execute lint/testes aplicáveis;
|
||||||
|
- entregue um relatório final com arquivos alterados, decisões, pendências e riscos.
|
||||||
|
5. Não aprove automaticamente novas dependências não previstas. Para parser DOCX, sanitização, Storage, deploy/API externa e migração do módulo existente, siga os **decision gates** da especificação.
|
||||||
|
|
||||||
|
## Ordem de execução
|
||||||
|
|
||||||
|
- `P00_DISCOVERY_AUDIT.md` — auditoria obrigatória do módulo existente
|
||||||
|
- `P01_FOUNDATION_ARCHITECTURE.md` — fundação, feature flag, guards, estrutura de domínio
|
||||||
|
- `P02_DATABASE_RLS.md` — schema, migrations, índices e RLS
|
||||||
|
- `P03_TEMPLATES_UPLOAD_PARSER.md` — upload, validação, parsing, placeholders, famílias/versões
|
||||||
|
- `P04_USER_FLOW_WIZARD.md` — seleção, review, formulário dinâmico, validação
|
||||||
|
- `P05_DRAFTS_AUTOSAVE_RESTORE.md` — autosave 15 s, TTL 24 h, Redis/Postgres
|
||||||
|
- `P06_PREVIEW_AND_PDF.md` — Contract Document Model, preview, React PDF e download
|
||||||
|
- `P07_ADMIN_TEMPLATES_AUDIT.md` — gestão admin, versionamento, exclusão protegida, auditoria
|
||||||
|
- `P08_UX_DESIGN_SYSTEM.md` — conformidade com EloPro Design System e Gerador de Propostas
|
||||||
|
- `P09_SECURITY_OBSERVABILITY.md` — hardening, Sentry, upload seguro, XSS, rate limit
|
||||||
|
- `P10_TESTS_ACCEPTANCE.md` — Vitest + integração/E2E + critérios CA-CTR
|
||||||
|
- `P11_PERFORMANCE_ACCESSIBILITY.md` — performance, WCAG AA e responsividade
|
||||||
|
- `P12_RELEASE_FEATURE_FLAG.md` — homologação, rollout e Definition of Done
|
||||||
|
- `P13_CODE_REVIEW_AUDIT.md` — revisão final independente
|
||||||
|
- `P14_BUGFIX_REGRESSION.md` — prompt reutilizável para correções sem regressão
|
||||||
|
|
||||||
|
## Regras imutáveis do produto
|
||||||
|
|
||||||
|
- Tenant técnico: `workspace_id`.
|
||||||
|
- Auth: Supabase Auth/SSR; sem login próprio do módulo.
|
||||||
|
- Feature flag: `contracts`, comportamento fail-closed.
|
||||||
|
- Papéis EloPro: Superadmin, Administrador (`owner/admin`), Gestor (`gestor`), Usuário (`agent`).
|
||||||
|
- Apenas Administrador gerencia templates.
|
||||||
|
- UI deve reutilizar o **EloPro Design System V2.1**; não criar um design system paralelo.
|
||||||
|
- Stack oficial: Next.js 16 App Router, React 19, Tailwind CSS v4, Lucide React, TanStack Query v5, @react-pdf/renderer, Supabase, Redis/ioredis, Sentry, TypeScript 5, Vitest, ESLint 9, postgres+tsx. `@dnd-kit` está disponível, mas só deve ser usado quando houver necessidade funcional real.
|
||||||
|
- IA via Anthropic/Claude não é dependência do MVP.
|
||||||
|
- Templates MVP: `.docx` e `.txt`, até 5 MB, até 50 chaves únicas `{{chave}}`.
|
||||||
|
- Tipos: `data_` => date; `valor_`/`preco_` => number; demais => text.
|
||||||
|
- Todos os campos são obrigatórios no MVP.
|
||||||
|
- Draft: autosave aproximadamente a cada 15 s; TTL de 24 h após o último save elegível.
|
||||||
|
- Preview e PDF devem derivar do mesmo Contract Document Model.
|
||||||
|
- PDF final não deve persistir como repositório permanente no MVP.
|
||||||
|
- Mesmo nome de template nunca sobrescreve: cria fluxo de nova versão.
|
||||||
|
- Versão com draft ativo não pode ser excluída.
|
||||||
|
- Máximo de 10 **modelos-base ativos** por workspace; versões não consomem cota extra.
|
||||||
|
- Conteúdo contratual não deve vazar para Sentry/telemetria.
|
||||||
|
|
||||||
|
## Decision gates que não podem ser inventados silenciosamente
|
||||||
|
|
||||||
|
- DT-CTR-001 — parser DOCX (Mammoth.js ou equivalente JS): verificar dependências/padrão real do repo; se inexistente, registrar necessidade antes de adicionar.
|
||||||
|
- DT-CTR-002 — sanitização HTML: verificar solução existente; se inexistente, registrar decisão.
|
||||||
|
- DT-CTR-003 — matriz de recursos DOCX suportados: tabelas, imagens, headers/footers, listas, estilos etc.
|
||||||
|
- DT-CTR-004 — Storage de templates: confirmar Supabase Storage ou mecanismo existente.
|
||||||
|
- DT-CTR-005 — deploy/CI/package manager: seguir o repositório.
|
||||||
|
- DT-CTR-006 — API externa `/api/v1`: só expor se o padrão real do EloPro exigir.
|
||||||
|
- DT-CTR-007 — migração do módulo `/dashboard/contracts` existente: resolver após P00.
|
||||||
Reference in new issue
Block a user