Voltar ao Dashboard
Issues no GitHubTec FinControl Volut • Documentação
Especificação Técnica & Arquitetura

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ídas
Fase 1

Setup Inicial, Infraestrutura e Base do Projeto

Concluída
  • 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
Fase 2

Autenticação, Multi-Tenancy (Famílias) e Contas

Concluída
  • 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
Fase 3

Mecanismo de Parsing e Ingestão de Extratos

Concluída
  • 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
Fase 4

Gestão de Transações, Categorias e Comprovantes

Concluída
  • 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
Fase 5

Classificação de Transferências PF/PJ e Regras

Concluída
  • 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
Fase 6

Módulo de Fechamento Contábil Mensal

Concluída
  • 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
Fase 7

Docker Multi-stage, Deploy VPS no Easypanel e Testes E2E

Concluída
  • 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%)
Auditoria & Segurança de Código

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.

Crítica (P1)1Chaves Hardcoded
Alta (P1 / P2)3Tenant, RBAC & IDOR
Média (P2 / P3)2Injeção & Defaults
Baixa (P3)1Upload Magic Bytes
SEC-01CríticaP1 - Hotfix Imediato

Remoção de Chave JWT Hardcoded e Validação Fail-Fast no Startup

Issue #1 no GitHub

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.

Arquivos:src/middleware.tssrc/lib/auth.tsdocker-compose.yml.env.example
Critérios de Aceite:
  • 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
docs/security-audit/issues/SEC-01-...mdPronto para Copiar & Executar
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.
SEC-02AltaP1 - Hotfix Imediato

Blindagem do Isolamento de Tenant no Despareamento de Transferências

Issue #2 no GitHub

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.

Arquivos:src/actions/transfer-actions.ts:514-533
Critérios de Aceite:
  • 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
docs/security-audit/issues/SEC-02-...mdPronto para Copiar & Executar
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.
SEC-03AltaP2 - Sprint Atual

Implementação de RBAC no Backend para Ações Administrativas (Proteção do Papel MEMBER)

Issue #3 no GitHub

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).

Arquivos:src/lib/auth.tssrc/actions/account-actions.tssrc/actions/entity-actions.tssrc/actions/closing-actions.tssrc/actions/category-actions.ts
Critérios de Aceite:
  • 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
docs/security-audit/issues/SEC-03-...mdPronto para Copiar & Executar
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.
SEC-04AltaP2 - Sprint Atual

Mitigação de IDOR na Associação de Categorias e Tipos de Transferência

Issue #4 no GitHub

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.

Arquivos:src/actions/transaction-actions.tssrc/actions/transfer-actions.ts
Critérios de Aceite:
  • 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
docs/security-audit/issues/SEC-04-...mdPronto para Copiar & Executar
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.
SEC-05MédiaP3 - Médio Prazo

Prevenção contra Formula Injection (CSV/Excel CWE-1236) no Fechamento Contábil

Issue #5 no GitHub

Sanitização de descrições e notas em planilhas Excel geradas pelo ExcelJS, prefixando apóstrofo (') para strings que iniciem com =, +, -, @, \t ou \r.

Arquivos:src/lib/closings/excel-generator.ts
Critérios de Aceite:
  • 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
docs/security-audit/issues/SEC-05-...mdPronto para Copiar & Executar
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.
SEC-06MédiaP2 - Sprint Atual

Saneamento de Credenciais Default em Docker Compose, .env e Seed

Issue #6 no GitHub

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.

Arquivos:docker-compose.ymlprisma/seed.ts.env.example
Critérios de Aceite:
  • 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
docs/security-audit/issues/SEC-06-...mdPronto para Copiar & Executar
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.
SEC-07BaixaP3 - Médio Prazo

Validação Estrita de Magic Bytes para WebP e Entrega Segura de Anexos

Issue #7 no GitHub

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).

Arquivos:src/lib/storage.tssrc/app/api/attachments/[id]/route.ts
Critérios de Aceite:
  • 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
docs/security-audit/issues/SEC-07-...mdPronto para Copiar & Executar
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.