Plataforma SaaS Full Stack de Gestão Inteligente
O BusinessFlow é uma plataforma Full Stack projetada para facilitar a gestão de micro e pequenas empresas, substituindo planilhas desorganizadas por um painel moderno e unificado.
Ele centraliza:
- Gestão Financeira: Controle de fluxo de caixa com relatórios e validações.
- CRM: Gestão de clientes com histórico e categorização via tags.
- Agenda: Organização visual e inteligente de compromissos.
- Serviços: Catálogo de produtos/serviços com precificação.
Este projeto demonstra domínio na construção de arquiteturas SaaS, integração ponta a ponta, segurança com JWT e validação estrita de dados no backend.
- React.js com Hooks e Context API
- Styled Components (CSS-in-JS)
- Recharts (Gráficos interativos e Dashboards)
- Axios (Interceptors HTTP e tratamento centralizado de erros)
- JSPDF + AutoTable (Geração de relatórios em PDF)
- Node.js + Express
- Prisma ORM (Modelagem de dados e tipagem)
- PostgreSQL (Hospedado na Neon.tech)
- JWT & Bcrypt (Autenticação e segurança de senhas)
- Zod (Validação de schemas e regras de negócio)
- Financeiro: lançamentos, faturas pendentes e atrasadas, e DRE. Uma rotina diária (meia-noite e um) marca como atrasadas as faturas pendentes vencidas.
- Importação de extrato bancário no formato OFX, e relatórios em PDF gerados no navegador.
- CRM: clientes por empresa, com status e documentos (upload de arquivos).
- Agenda e tarefas por cliente e por empresa.
- Helpdesk: chamados com troca de mensagens entre o escritório e o cliente.
- Auditoria: registro de quem fez o quê (criar, alterar, excluir) em cada módulo.
- API pública com chave (
x-api-key), para integrações que precisam listar dados da empresa. - Dois perfis de acesso: o gestor (ADMIN) e o cliente (CLIENT), que só enxerga o que é da sua empresa.
Pré-requisitos: Node.js 18 ou mais novo e um banco PostgreSQL (local ou na nuvem).
cd backend
npm installCrie o arquivo backend/.env:
DATABASE_URL="postgresql://usuario:senha@localhost:5432/businessflow"
JWT_SECRET="troque-por-uma-chave-longa-e-aleatoria"
PORT=3001
# Opcional, só para o envio de e-mails:
EMAIL_USER=""
EMAIL_PASS=""Crie as tabelas, carregue os dados de exemplo e inicie:
npx prisma db push
npx prisma db seed
npm run devA API sobe em http://localhost:3001/api. O seed cria um gestor, uma empresa e clientes de exemplo (veja backend/prisma/seed.js). O seed apaga todos os dados antes de criar os de exemplo, por isso recusa rodar em banco que não seja local. A senha dos usuários de exemplo é gerada a cada carga e mostrada no final (ou use SEED_PASSWORD); ela não fica escrita no código.
O histórico do banco fica em backend/prisma/migrations (a primeira é 0_init, a foto completa do schema). A CI aplica as migrações em um banco vazio e confere que elas batem com o schema.prisma: quem mudar o schema precisa criar a migração junto:
npx prisma migrate dev --name o-que-mudouBanco que já existe (criado antes com db push): rode uma única vez, para dizer ao Prisma que o 0_init já está aplicado, sem mexer nos dados:
npx prisma migrate resolve --applied 0_initDepois disso, o deploy pode usar npx prisma migrate deploy no lugar de db push.
cd frontend
npm install
npm startO painel abre em http://localhost:3000 e fala com a API em http://localhost:3001/api. Para apontar para outra API, defina REACT_APP_API_URL.
| Decisão | Por quê |
|---|---|
Cada dado pertence a uma empresa (companyId em clientes, faturas, documentos, tarefas, chamados e auditoria) |
Um escritório nunca vê os dados de outro. O middleware de empresa restringe o perfil CLIENT ao que é dele. |
| JWT de acesso + refresh token guardado no banco | Dá para encerrar sessões e renovar o acesso sem pedir a senha de novo. |
Camadas de segurança na API: helmet, limite de 300 requisições por 15 minutos, CORS restrito ao front-end e nosniff na pasta de uploads |
Reduz abuso, ataques simples e arquivos disfarçados. |
| Validação das entradas com Zod (autenticação) | Recusa dados malformados antes de chegarem ao banco. |
| Log de auditoria que grava o nome e o perfil de quem agiu (não só o id) | O histórico continua legível mesmo se o usuário for apagado. |
| Prisma + PostgreSQL | Modelo de dados tipado, relações com exclusão em cascata e consultas seguras. |
| API pública separada, protegida por chave | Integrações recebem só o necessário (por exemplo, nome, documento e e-mail de clientes ativos). |
erDiagram
User ||--o{ Company : "possui"
User ||--o{ RefreshToken : "tem"
Company ||--o{ Client : "atende"
Company ||--o{ Transaction : "registra"
Company ||--o{ Document : "guarda"
Company ||--o{ Task : "organiza"
Company ||--o{ Ticket : "recebe"
Company ||--o{ AuditLog : "audita"
Company ||--o{ ApiKey : "emite"
Client ||--o{ Transaction : "gera"
Client ||--o{ Document : "tem"
Client ||--o{ Task : "tem"
Client ||--o{ Ticket : "abre"
Client ||--o{ User : "acessa por"
Ticket ||--o{ TicketMessage : "contém"
O back-end tem testes automatizados que rodam contra um PostgreSQL de verdade (não um banco de mentira), porque o ponto mais importante do sistema é o isolamento entre empresas e isso só se prova com o banco real. O GitHub Actions roda tudo a cada push e pull request (.github/workflows/ci.yml), e também confere que o painel React compila.
O que está coberto
| Área | O que os testes garantem |
|---|---|
| Autenticação | Cadastro e login, senha criptografada e nunca devolvida, mesma resposta para e-mail desconhecido e senha errada, renovação e encerramento de sessão, token ausente, vencido ou com assinatura errada |
| Acesso por perfil | Gestor só entra na empresa dele; perfil CLIENT fica preso à própria empresa e não entra no CRM nem na auditoria |
| Isolamento entre empresas | Uma empresa não lê, altera nem apaga clientes, lançamentos, chaves de API ou empresas de outra |
| API pública | Exige chave, recusa chave inexistente ou revogada, devolve só clientes ativos e só os campos combinados |
| Regras de negócio | Parcelamento, filtro por mês, paginação, resumo do painel, exclusão em cascata e trilha de auditoria |
Como rodar
Use um banco só de testes (o nome precisa ter test; os testes apagam os dados e se recusam a rodar em outro banco):
cd backend
export DATABASE_URL="postgresql://usuario:senha@localhost:5432/businessflow_test"
npx prisma db push
npm testPontos que eu melhoraria, olhando o código hoje:
- Ampliar os testes para tarefas, chamados, documentos e importação OFX, e criar testes do front-end.
- Migrações versionadas do Prisma no lugar do
db push, para controlar as mudanças do banco com histórico. - Origens permitidas do CORS por variável de ambiente, em vez de listadas no código.
- Uma só biblioteca de hash de senha (hoje há duas instaladas) e senhas de exemplo geradas, não fixas, no
seed.

