Documentação de Apoio às 7 Fases
Este documento consolida o guia arquitetural, os modelos de dados e os critérios de entrega para cada uma das 7 fases de desenvolvimento do sistema SaaS Tec FinControl Volut.
Isolamento Multi-tenant
Toda consulta ao banco filtra obrigatoriamente por family_id, garantindo privacidade estrita entre famílias e empresas.
Schema Relacional Robusto
Prisma ORM sobre PostgreSQL com relacionamentos estritos entre Famílias, Entidades PF/PJ, Contas, Transações e Anexos.
Volume Persistente
Armazenamento de notas e recibos em disco local mapeado via Docker em /app/storage com estrutura de pastas segura.
Detalhamento Sequencial das Fases
Fases 1 a 6 ConcluídasSetup Inicial, Infraestrutura e Base do Projeto
- Repositório Git com remote origin tecvolut/TecFinControlVolut
- Setup Next.js 15 (App Router, TypeScript) e Tailwind CSS
- Design System com tokens da marca (#FF6A00, #FFC107, #131313, #BFBFBF)
- Schema do Prisma ORM completo para PostgreSQL
- Docker Compose com serviços PostgreSQL e volumes persistentes
Autenticação, Multi-Tenancy (Famílias) e Contas
- Sistema de autenticação com cookies seguros e isolamento por family_id
- CRUD de Entidades Financeiras (PF com CPF e PJ com CNPJ/Razão Social)
- CRUD de Contas Bancárias vinculadas a cada entidade
- Dashboard de controle com saldos consolidados
Mecanismo de Parsing e Ingestão de Extratos
- Adapter OFX para leitura padrão de extratos bancários
- Adapter CSV com mapeador dinâmico de colunas
- Adapter PDF para os principais bancos brasileiros com fallback regex
- Anti-duplicação inteligente com hash criptográfico SHA-256
Gestão de Transações, Categorias e Comprovantes
- Tabela interativa de conciliação diária com filtros avançados
- Categorização flexível por entidade (PF, PJ ou Ambos)
- Armazenamento de notas fiscais e recibos em disco local persistido (/app/storage)
- Visualizador modal integrado de comprovantes
- Regra de Ouro implementada: Alerta obrigatório para receitas PJ sem NF-e vinculada
Classificação de Transferências PF/PJ e Regras
- Módulo de transferências internas bilateral sincronizado (PF <-> PJ, PJ <-> PJ)
- Classificação contábil: Distribuição de Lucros, Pró-labore e Reembolsos
- Assistente inteligente de pareamento de lançamentos avulsos de extratos
- Neutralização de duplicidade no fluxo de caixa consolidado da família
Módulo de Fechamento Contábil Mensal
- Painel de fechamento filtrável por Mês/Ano e Entidade com apuração em tempo real
- Gerador de Relatório PDF consolidado formal para a contabilidade (pdfmake)
- Planilha Excel (XLSX) multi-abas com formatação monetária e fórmulas dinâmicas (exceljs)
- Compilador do Pacote ZIP estruturado por pastas (receitas, despesas, transferências) (archiver)
- API streaming multi-tenant de download e suporte a reabertura segura de períodos
Docker Multi-stage, Deploy VPS no Easypanel e Testes E2E
- Dockerfile multi-stage de alto rendimento com Node.js 22 Alpine e execução não-root
- Automação de migrations no boot do container via docker-entrypoint.sh (zero intervenção manual)
- Guia oficial de implantação no Easypanel com volumes persistentes e SSL automático
- Bateria de testes automatizados E2E (npm run test:e2e) com 14/14 testes aprovados (100%)
Melhorias de Segurança (Security Hardening Roadmap)
Plano de ação derivado da auditoria estática de código com 7 melhorias mapeadas, cadastradas como issues oficiais no GitHub e acompanhadas de prompts executáveis para implementação imediata.
Remoção de Chave JWT Hardcoded e Validação Fail-Fast no Startup
Eliminação do segredo estático DEFAULT_SECRET no middleware e na lib auth, com trava de inicialização que rejeita chaves vazias ou com menos de 32 caracteres.
- Remover constante DEFAULT_SECRET de src/middleware.ts e src/lib/auth.ts
- Lançar exceção fatal no startup caso AUTH_SECRET esteja vazia ou com menos de 32 chars
- Eliminar senhas estáticas de fallback no docker-compose.yml
- Validar que tokens com a chave legada retornam HTTP 401 Unauthorized
Ver Prompt de Execução Autocontido para IA / Desenvolvedor
Você é um especialista sênior em segurança de aplicações Next.js e TypeScript.
Execute a correção da vulnerabilidade SEC-01 no repositório TecFinControlVolut.
OBJETIVO:
Remover a chave secreta JWT hardcoded padrão e implementar validação fail-fast de inicialização (startup check).
PASSOS ESPECÍFICOS:
1. Em src/lib/auth.ts:
- Remova a constante DEFAULT_SECRET.
- Na função getSecretKey(), exija process.env.AUTH_SECRET || process.env.JWT_SECRET.
- Se ausente ou com menos de 32 caracteres, lance: throw new Error("[SEGURANÇA] A variável de ambiente AUTH_SECRET é obrigatória e deve ter pelo menos 32 caracteres.");
2. Em src/middleware.ts:
- Remova a constante DEFAULT_SECRET e aplique validação idêntica.
3. Em docker-compose.yml:
- Altere ${AUTH_SECRET:-...} para ${AUTH_SECRET:?Variável AUTH_SECRET obrigatória}.
4. Em .env.example:
- Substitua por instrução para gerar chave forte via openssl rand -base64 32.
5. Crie teste em scripts/test-sec01.ts comprovando que chaves curtas abortam e que tokens legados são rejeitados.Blindagem do Isolamento de Tenant no Despareamento de Transferências
Inclusão de filtro relacional estrito bankAccount: { entity: { familyId: session.familyId } } na query da transação recíproca na conta de destino para impedir mutações cruzadas entre inquilinos.
- Adicionar verificação de familyId na busca da transação recíproca
- Envolver atualizações bilaterais em transação atômica db.$transaction
- Validar que tentativas com IDs externos não alteram dados de outros clientes
Ver Prompt de Execução Autocontido para IA / Desenvolvedor
Você é um especialista sênior em segurança de bancos de dados relacionais e Prisma ORM.
Execute a correção da vulnerabilidade SEC-02 no repositório TecFinControlVolut.
OBJETIVO:
Blindar o isolamento multi-tenant na Server Action unpairTransferAction em src/actions/transfer-actions.ts.
PASSOS ESPECÍFICOS:
1. Abra src/actions/transfer-actions.ts.
2. Na função unpairTransferAction, modifique o bloco where da busca reciprocal:
bankAccount: { entity: { familyId: session.familyId } }
3. Envolva as atualizações das duas transações dentro de um db.$transaction atômico.
4. Crie script de teste em scripts/test-sec02.ts comprovando que contas de outros tenants jamais são afetadas.Implementação de RBAC no Backend para Ações Administrativas (Proteção do Papel MEMBER)
Criação da função requireAdmin() exigindo session.role === 'ADMIN' e aplicação em todas as ações destrutivas (exclusão de contas, entidades e reabertura de fechamento contábil mensal).
- Exportar requireAdmin() em src/lib/auth.ts validando role === 'ADMIN'
- Aplicar em deleteAccountAction, deleteEntityAction, reopenClosingAction e deleteCategoryAction
- Retornar mensagens claras de autorização na interface em vez de falhas internas
Ver Prompt de Execução Autocontido para IA / Desenvolvedor
Você é um arquiteto sênior de software e segurança em Next.js e TypeScript. Execute a correção da vulnerabilidade SEC-03 no repositório TecFinControlVolut. OBJETIVO: Implementar Role-Based Access Control (RBAC) no backend protegendo operações administrativas contra usuários MEMBER. PASSOS ESPECÍFICOS: 1. Em src/lib/auth.ts: exporte requireAdmin(): Promise<SessionPayload> que valida session.role === "ADMIN". 2. Em src/actions/account-actions.ts: exija requireAdmin() em deleteAccountAction. 3. Em src/actions/entity-actions.ts: exija requireAdmin() em deleteEntityAction. 4. Em src/actions/closing-actions.ts: exija requireAdmin() em reopenClosingAction e generateClosingAction. 5. Em src/actions/category-actions.ts e transfer-actions.ts: exija requireAdmin() nas ações de exclusão. 6. Crie teste em scripts/test-sec03.ts comprovando que usuários MEMBER recebem erro de permissão.
Mitigação de IDOR na Associação de Categorias e Tipos de Transferência
Validação prévia de que categoryId e transferTypeId pertencem à organização da sessão antes de persistir vínculos ou refletir nomes confidenciais em transações.
- Validar categoryId contra session.familyId em createTransactionAction e updateTransactionAction
- Validar transferTypeId contra session.familyId ou isSystemDefault em createTransferAction
- Rejeitar IDs de outras famílias com erro amigável de autorização
Ver Prompt de Execução Autocontido para IA / Desenvolvedor
Você é um especialista sênior em segurança de software e controle de acesso em bancos relacionais.
Execute a correção da vulnerabilidade SEC-04 no repositório TecFinControlVolut.
OBJETIVO:
Mitigar vulnerabilidades de IDOR na vinculação de categorias e tipos de transferência contábil.
PASSOS ESPECÍFICOS:
1. Em src/actions/transaction-actions.ts:
- Em createTransactionAction e updateTransactionAction: busque db.category.findFirst({ where: { id: categoryId, familyId: session.familyId } }). Se nulo, retorne erro.
2. Em src/actions/transfer-actions.ts:
- Em createTransferAction e pairTransactionsAction: valide que transferTypeId pertence à família ou tem isSystemDefault: true.
3. Crie teste em scripts/test-sec04.ts comprovando que o Tenant A não consegue utilizar IDs do Tenant B.Prevenção contra Formula Injection (CSV/Excel CWE-1236) no Fechamento Contábil
Sanitização de descrições e notas em planilhas Excel geradas pelo ExcelJS, prefixando apóstrofo (') para strings que iniciem com =, +, -, @, \t ou \r.
- Criar função utilitária sanitizeSpreadsheetText no módulo excel-generator.ts
- Aplicar em todas as descrições de receitas, despesas, transferências e entidades
- Preservar fórmulas legítimas do sistema (totalizadores SUM)
Ver Prompt de Execução Autocontido para IA / Desenvolvedor
Você é um engenheiro de software sênior com especialização em segurança e mitigação de CWE-1236.
Execute a correção da vulnerabilidade SEC-05 no repositório TecFinControlVolut.
OBJETIVO:
Sanitizar inputs de texto inseridos em planilhas Excel geradas pelo ExcelJS em src/lib/closings/excel-generator.ts.
PASSOS ESPECÍFICOS:
1. Abra src/lib/closings/excel-generator.ts.
2. Adicione sanitizeSpreadsheetText(value: string | null | undefined): string que adiciona apóstrofo (') no início caso comece com =, +, -, @, \t ou \r.
3. Aplique nas colunas de descrição e notas em todas as abas.
4. Mantenha intactas as fórmulas legítimas do sistema como { formula: "SUM(...)" }.
5. Crie teste em scripts/test-sec05.ts validando que payloads de fórmula são escapados.Saneamento de Credenciais Default em Docker Compose, .env e Seed
Eliminação de senhas pré-definidas no Docker Compose e trava de segurança no script de seed para impedir inicialização com credenciais conhecidas em produção.
- Tornar POSTGRES_PASSWORD obrigatória sem fallback no docker-compose.yml
- Bloquear execução do seed em NODE_ENV === 'production' sem flag explícita
- Atualizar .env.example com placeholders instrutivos
Ver Prompt de Execução Autocontido para IA / Desenvolvedor
Você é um especialista sênior em infraestrutura Docker e segurança de banco de dados.
Execute a correção da vulnerabilidade SEC-06 no repositório TecFinControlVolut.
OBJETIVO:
Saneamento de credenciais padrão e senhas fixas em docker-compose.yml, .env.example e prisma/seed.ts.
PASSOS ESPECÍFICOS:
1. Em docker-compose.yml: exija POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Defina no .env}.
2. Em prisma/seed.ts: adicione trava bloqueando execução se NODE_ENV === "production" e torne a senha parametrizável via SEED_ADMIN_PASSWORD.
3. Em .env.example: substitua senhas estáticas por instruções de senhas seguras.Validação Estrita de Magic Bytes para WebP e Entrega Segura de Anexos
Detecção da assinatura binária RIFF....WEBP para arquivos .webp, eliminação do fallback permissivo por extensão e inclusão de headers defensivos (nosniff, CSP sandbox).
- Adicionar detecção de magic bytes para WebP (RIFF/WEBP) em detectMimeType
- Remover fallback permissivo ALLOWED_MIME_TYPES[extension]
- Adicionar headers X-Content-Type-Options: nosniff e CSP sandbox na rota de anexos
Ver Prompt de Execução Autocontido para IA / Desenvolvedor
Você é um especialista sênior em segurança web e manipulação de arquivos binários no Node.js. Execute a correção da vulnerabilidade SEC-07 no repositório TecFinControlVolut. OBJETIVO: Implementar validação estrita de magic bytes para WebP e adicionar cabeçalhos defensivos na rota de entrega de anexos. PASSOS ESPECÍFICOS: 1. Em src/lib/storage.ts: valide bytes RIFF (0-3) e WEBP (8-11) em detectMimeType e remova o fallback cego por extensão. 2. Em src/app/api/attachments/[id]/route.ts: adicione X-Content-Type-Options: nosniff e Content-Security-Policy: default-src 'none'; sandbox. 3. Crie teste em scripts/test-sec07.ts comprovando rejeição de arquivos falsos com extensão .webp.