Files
SeConectai_Vendas/Etapas/seconectai-vendas-arquitetura.md
2026-08-14 17:35:24 -03:00

119 lines
6.0 KiB
Markdown

# SeConectai Vendas — Arquitetura
CRM/controle de vendas multi-tenant, com um painel **master** (você, dono da
plataforma) e painéis de **tenant** (seus clientes, que por sua vez cadastram
os próprios clientes/vendas).
## 1. Modelo de dados (resumo)
```
master_admins → você e sua equipe (login do painel master)
evolution_api_config → conexão(ões) com a Evolution API 2.3
master_email_config → SMTP padrão da plataforma
planos → planos de assinatura que você vende
tenants → seus clientes (quem compra a plataforma)
tenant_faturas → mensalidades que o tenant te deve
tenant_users → usuários/login de cada tenant
tenant_whatsapp_instances → instância Evolution API de cada tenant
tenant_email_config → SMTP próprio do tenant (opcional)
alert_templates → mensagens (WhatsApp/e-mail) customizáveis
alert_logs → auditoria de todo alerta enviado
customers → clientes (empresas) de cada tenant
customer_contacts → contatos dentro dessas empresas
products_services → catálogo de produto/serviço por tenant
sales / sale_items / sale_payments → vendas, itens e parcelas a receber
audit_logs → trilha de auditoria geral
```
Arquivo completo: `seconectai-vendas-schema.sql`.
## 2. Estratégia de multi-tenancy
Banco único, todas as tabelas de dado operacional carregam `tenant_id`, com
**Row Level Security (RLS)** do Postgres isolando cada tenant. A aplicação
define `SET app.current_tenant_id = '<uuid>'` na conexão/transação do
usuário logado; o Postgres bloqueia qualquer leitura/escrita fora do tenant
automaticamente — mesmo que haja um bug na query da aplicação.
Por que essa abordagem em vez de "um schema por tenant" ou "um banco por
tenant": com um único Postgres em Docker, migrations, backup e escala
operacional ficam muito mais simples, e RLS já dá o isolamento de segurança
que schema-per-tenant tentaria resolver com mais complexidade operacional.
O usuário master (você) usa uma role de banco separada com `BYPASS ROW LEVEL
SECURITY`, para poder ver/gerenciar todos os tenants.
## 3. Stack sugerida
- **Backend:** Node.js + TypeScript, com NestJS (organização em módulos por
domínio: auth, tenants, customers, products, sales, alerts) ou Fastify se
quiser algo mais enxuto. Node se encaixa bem no seu workflow atual
(n8n, Evolution API, JS/TS já no dia a dia).
- **ORM:** Prisma — migrations versionadas, tipagem forte, e dá pra injetar
o `SET app.current_tenant_id` por transação com `$transaction`.
- **Banco:** PostgreSQL 16.
- **Fila/agendamento:** Redis + BullMQ, para dois tipos de job recorrente:
- varredura diária de vencimentos (`tenant_faturas` e `sale_payments`)
disparando alertas antes/no dia do vencimento;
- envio assíncrono de mensagens (não travar a request do usuário
esperando resposta da Evolution API/SMTP).
- **Autenticação:** JWT de curta duração (access token) + refresh token com
rotação, guardado com hash (nunca em texto puro) na tabela
`auth_refresh_tokens`. Senha com `argon2id` (preferível a bcrypt hoje).
- **Deploy:** Docker Compose com serviços `app`, `postgres`, `redis` — a
Evolution API pode rodar no mesmo compose ou em servidor separado (você
já mantém instância própria, então só precisa cadastrar a `base_url` +
`api_key` em `evolution_api_config`).
## 4. Segurança — pontos que valem atenção na implementação
- Hash de senha: `argon2id`, nunca MD5/SHA puro.
- Segredos (API key da Evolution, senha SMTP) criptografados em repouso
(AES-256-GCM) com chave fora do banco (variável de ambiente/secret
manager), não só "hash" — porque esses precisam ser recuperados em texto
puro para uso.
- Rate limiting no login (a tabela `login_attempts` já dá suporte a isso) e
bloqueio temporário após N tentativas falhas.
- 2FA (TOTP) pelo menos para `master_admins`, opcional para `tenant_admin`.
- RLS como camada de defesa adicional — mesmo com bug de aplicação, tenant A
não acessa dado de tenant B.
- HTTPS obrigatório, cookies de refresh token com `httpOnly` + `Secure` +
`SameSite=Strict`.
- Logs de auditoria (`audit_logs`, `alert_logs`) para rastrear quem fez o
quê — importante já que múltiplos tenants e usuários mexem no sistema.
## 5. Fluxo de alertas (o motor comercial do sistema)
Dois níveis, mesma mecânica:
1. **Master → Tenant:** job diário verifica `tenant_faturas` com vencimento
próximo/vencido → gera mensagem a partir de `alert_templates`
(`tipo='mensalidade_tenant'`) → envia via WhatsApp (Evolution API,
instância própria do master) e/ou e-mail (`master_email_config`) →
grava em `alert_logs`.
2. **Tenant → Customer:** mesmo job (ou outro, escopado por tenant) verifica
`sale_payments` pendentes/atrasados de cada tenant → usa a instância
Evolution do próprio tenant (`tenant_whatsapp_instances`) e o SMTP dele
(ou o padrão da plataforma, se `usar_config_padrao=true`) → envia e
registra em `alert_logs`.
Isso te dá, de graça, o mecanismo pra cobrar a própria mensalidade da
plataforma (item que você pediu explicitamente) usando a mesma
infraestrutura que o tenant usa pra cobrar os clientes dele.
## 6. Próximos passos sugeridos
Seguindo seu formato usual de build faseado (prompts sequenciais com
critério de aceite por etapa), a ordem natural seria:
1. Setup do projeto (Docker Compose, Postgres, Prisma, estrutura NestJS)
2. Auth (master + tenant_user, JWT/refresh, RLS aplicado)
3. CRUD de tenants + planos + faturas (painel master)
4. Cadastro Evolution API + instâncias WhatsApp por tenant
5. CRUD de customers, products_services (painel tenant)
6. Vendas (sales/sale_items/sale_payments) + dashboards (views já prontas)
7. Motor de alertas (BullMQ + templates + logs)
8. Personalização visual (logo/cor por tenant)
Posso detalhar qualquer uma dessas fases em um prompt de vibe coding
próprio, se quiser seguir esse fluxo.