Files
RDO/documentation/PLANO_SAAS_MULTI_TENANT.md
2026-02-20 07:25:32 -03:00

424 lines
11 KiB
Markdown

## 📊 ANÁLISE COMPLETA E PLANO DE AÇÃO - TRANSFORMAÇÃO PARA SAAS MULTI-TENANT
### 🎯 OBJETIVO
Transformar o sistema RDO (Relatório Diário de Obra) de single-tenant para um modelo SaaS multi-tenant completo, permitindo que múltiplas empresas de construção usem o mesmo sistema de forma isolada e segura.
---
## ✅ O QUE JÁ FOI FEITO
### 1. **Análise Completa do Projeto Atual**
- ✅ Estrutura de código React + TypeScript + Vite analisada
- ✅ Integração com Supabase identificada
- ✅ Migrations existentes revisadas
- ✅ Tipos TypeScript mapeados
- ✅ Fluxo de autenticação compreendido
### 2. **Criação do Schema Multi-Tenant**
Criei 4 migrations SQL completas:
#### **Migration 1: Schema Principal** (`20241202000001_create_multi_tenant_schema.sql`)
- ✅ Tabela `organizacoes` (tenants) com:
- Slug único para URLs amigáveis
- Planos (trial, basic, professional, enterprise)
- Limites por plano (usuários, obras, RDOs, storage)
- Personalização (logo, cores, configurações)
- Status e controle de trial/cobrança
- ✅ Tabela `usuarios` com vínculo a organização
- ✅ Tabela `organizacao_usuarios` para roles e permissões
- ✅ Tabela `convites` para onboarding de novos usuários
- ✅ Todas as tabelas existentes adaptadas com `organizacao_id`
- ✅ Índices compostos para performance multi-tenant
#### **Migration 2: Functions e Triggers** (`20241202000002_create_functions_and_triggers.sql`)
- ✅ Auto-atualização de `updated_at`
- ✅ Criação automática de perfil de usuário
- ✅ Auto-incremento de número de RDO por obra
- ✅ Propagação automática de `organizacao_id` em cascata
- ✅ Atualização automática de métricas de uso
- ✅ Validação de limites do plano (quotas)
- ✅ Funções auxiliares para verificar permissões
#### **Migration 3: Row Level Security** (`20241202000003_create_rls_policies.sql`)
- ✅ RLS habilitado em TODAS as tabelas
- ✅ Isolamento total entre organizações
- ✅ Políticas baseadas em roles (owner, admin, engenheiro, mestre_obra, usuario)
- ✅ Permissões granulares por tipo de operação (SELECT, INSERT, UPDATE, DELETE)
- ✅ Segurança em múltiplas camadas
#### **Migration 4: Dados Iniciais** (`20241202000004_seed_initial_data.sql`)
- ✅ Organização demo para testes
- ✅ Configurações padrão para novas organizações
- ✅ Função `criar_organizacao_com_owner()` para signup
- ✅ Função `aceitar_convite()` para onboarding
- ✅ Função `criar_convite()` para convidar usuários
- ✅ View de estatísticas consolidadas
### 3. **Scripts e Documentação**
-`check-supabase-status.js` - Verificar estado do banco
-`apply-migrations.js` - Aplicar migrations automaticamente
-`INSTRUCOES_DEPLOY_SUPABASE.md` - Guia passo a passo
-`PLANO_SAAS_MULTI_TENANT.md` - Este documento
---
## 🚀 PRÓXIMOS PASSOS - IMPLEMENTAÇÃO
### **FASE 1: APLICAR MIGRATIONS NO SUPABASE** ⏳ PRÓXIMO PASSO
#### Opção A: Via Supabase CLI (Recomendado)
```bash
# 1. Linkar projeto
supabase link --project-ref bbyzrywmgjiufqtnkslu
# 2. Aplicar migrations
supabase db push
# 3. Verificar
node check-supabase-status.js
```
#### Opção B: Via Dashboard
1. Acessar SQL Editor no Supabase
2. Executar cada migration manualmente
3. Verificar erros
**📋 Checklist:**
- [ ] Migrations aplicadas sem erros
- [ ] Todas as tabelas criadas
- [ ] RLS habilitado em todas as tabelas
- [ ] Organização demo criada
- [ ] Funções e triggers funcionando
---
### **FASE 2: ATUALIZAR TIPOS TYPESCRIPT**
Após aplicar as migrations, atualizar os tipos:
```bash
# Gerar tipos atualizados do Supabase
supabase gen types typescript --local > src/types/database.types.ts
```
**Arquivos a atualizar:**
- [ ] `src/types/database.types.ts` - Tipos do banco
- [ ] `src/types/domain.types.ts` - Adicionar tipos de Organização
- [ ] `src/lib/supabase.ts` - Adicionar helpers multi-tenant
---
### **FASE 3: CRIAR CONTEXTO DE ORGANIZAÇÃO**
**Arquivo:** `src/contexts/OrganizationContext.tsx`
```typescript
interface OrganizationContextType {
organization: Organization | null;
loading: boolean;
isOwner: boolean;
isAdmin: boolean;
userRole: string | null;
switchOrganization: (slug: string) => Promise<void>;
updateOrganization: (data: Partial<Organization>) => Promise<void>;
checkQuota: (resource: string) => Promise<boolean>;
}
```
**Checklist:**
- [ ] Criar OrganizationContext
- [ ] Criar hook `useOrganization()`
- [ ] Integrar com AuthContext
- [ ] Carregar organização do usuário no login
- [ ] Persistir organização atual no localStorage
---
### **FASE 4: IMPLEMENTAR ROTEAMENTO COM SLUG**
**Estrutura de URLs:**
```
Antes: /obras
Depois: /:orgSlug/obras
Exemplos:
- /acme-construcoes/dashboard
- /construtora-silva/obras
- /metalurgica-xyz/rdos/novo
```
**Arquivos a modificar:**
- [ ] `src/config/routes.tsx` - Adicionar `:orgSlug` em todas as rotas
- [ ] `src/App.tsx` - Extrair slug da URL
- [ ] Criar `ProtectedOrgRoute` component
- [ ] Validar acesso do usuário à organização
---
### **FASE 5: ATUALIZAR QUERIES DO SUPABASE**
**Criar helpers para queries multi-tenant:**
```typescript
// src/lib/supabase-tenant.ts
export const getTenantQuery = <T>(table: string) => {
const { organization } = useOrganization();
return supabase
.from(table)
.select('*')
.eq('organizacao_id', organization?.id);
};
```
**Atualizar TODAS as queries existentes:**
- [ ] `src/hooks/useSupabaseData.ts`
- [ ] `src/hooks/queries/*`
- [ ] `src/stores/*`
- [ ] Adicionar `.eq('organizacao_id', orgId)` em todas as queries
---
### **FASE 6: CRIAR FLUXO DE ONBOARDING**
#### 6.1 Tela de Signup de Nova Organização
**Arquivo:** `src/pages/SignupOrganization.tsx`
**Campos:**
- Nome da organização
- Slug (validar unicidade)
- Email
- Nome do usuário
- Senha
- CNPJ (opcional)
**Fluxo:**
1. Validar slug disponível
2. Criar conta no Supabase Auth
3. Chamar `criar_organizacao_com_owner()`
4. Redirecionar para `/:slug/dashboard`
#### 6.2 Sistema de Convites
**Arquivo:** `src/pages/TeamManagement.tsx`
**Funcionalidades:**
- [ ] Listar membros da equipe
- [ ] Convidar novo membro (email + role)
- [ ] Gerar link de convite
- [ ] Enviar email de convite
- [ ] Página de aceitar convite
- [ ] Gerenciar roles dos membros
---
### **FASE 7: DASHBOARD DE ADMINISTRAÇÃO**
**Arquivo:** `src/pages/OrganizationSettings.tsx`
**Seções:**
- [ ] **Informações Gerais** - Nome, logo, cores
- [ ] **Equipe** - Membros, convites, roles
- [ ] **Plano e Uso** - Plano atual, limites, uso
- [ ] **Personalização** - Tipos de atividade, funções, etc.
- [ ] **Integrações** - APIs, webhooks
- [ ] **Billing** - Assinatura, pagamentos (futuro)
---
### **FASE 8: VALIDAÇÃO DE QUOTAS**
**Criar middleware para verificar limites:**
```typescript
// src/lib/quota-checker.ts
export async function checkQuota(
orgId: string,
resource: 'usuarios' | 'obras' | 'rdos'
): Promise<boolean> {
// Buscar métricas
// Comparar com limites
// Retornar true/false
}
```
**Integrar em:**
- [ ] Criação de obras
- [ ] Criação de RDOs
- [ ] Convite de usuários
- [ ] Upload de arquivos
**Mostrar avisos:**
- [ ] Modal quando atingir 80% do limite
- [ ] Bloquear quando atingir 100%
- [ ] Sugerir upgrade de plano
---
### **FASE 9: PERSONALIZAÇÃO POR ORGANIZAÇÃO**
#### 9.1 Tema Customizável
```typescript
// Aplicar cores da organização
const theme = {
primary: organization.cor_primaria,
secondary: organization.cor_secundaria,
logo: organization.logo_url
};
```
#### 9.2 Configurações Dinâmicas
- [ ] Carregar tipos de atividade da organização
- [ ] Carregar funções de mão de obra
- [ ] Carregar tipos de equipamento
- [ ] Aplicar regras de aprovação
- [ ] Configurar notificações
---
### **FASE 10: MIGRAÇÃO DE DADOS EXISTENTES** (Se houver)
Se já existem dados no banco:
```sql
-- 1. Criar organização padrão
INSERT INTO organizacoes (slug, nome, plano)
VALUES ('organizacao-padrao', 'Organização Padrão', 'enterprise');
-- 2. Associar todos os dados existentes
UPDATE usuarios SET organizacao_id = (SELECT id FROM organizacoes WHERE slug = 'organizacao-padrao');
UPDATE obras SET organizacao_id = (SELECT id FROM organizacoes WHERE slug = 'organizacao-padrao');
-- ... para todas as tabelas
```
---
## 📋 CHECKLIST GERAL DE IMPLEMENTAÇÃO
### Backend (Supabase)
- [ ] Migrations aplicadas
- [ ] RLS testado e funcionando
- [ ] Funções auxiliares testadas
- [ ] Triggers funcionando
- [ ] Quotas sendo validadas
### Frontend (React)
- [ ] Tipos TypeScript atualizados
- [ ] OrganizationContext criado
- [ ] Roteamento com slug implementado
- [ ] Queries atualizadas para multi-tenant
- [ ] Signup de organização funcionando
- [ ] Sistema de convites funcionando
- [ ] Dashboard de admin criado
- [ ] Validação de quotas implementada
- [ ] Personalização aplicada
### Testes
- [ ] Criar organização
- [ ] Convidar usuário
- [ ] Aceitar convite
- [ ] Isolamento entre organizações
- [ ] Validação de limites
- [ ] Troca de organização (se usuário pertence a múltiplas)
### Segurança
- [ ] RLS testado em todas as tabelas
- [ ] Não é possível acessar dados de outra organização
- [ ] Roles e permissões funcionando
- [ ] Tokens de convite seguros
- [ ] Service role key não exposta no frontend
---
## 🎨 MELHORIAS FUTURAS
### Curto Prazo
- [ ] Página de pricing com planos
- [ ] Integração com gateway de pagamento (Stripe/Mercado Pago)
- [ ] Sistema de notificações por email
- [ ] Logs de auditoria
- [ ] Exportação de dados
### Médio Prazo
- [ ] Analytics e métricas avançadas
- [ ] Relatórios customizáveis
- [ ] API pública para integrações
- [ ] Webhooks
- [ ] Mobile app nativo (Capacitor já configurado)
### Longo Prazo
- [ ] IA para análise de produtividade
- [ ] Integração com ERPs
- [ ] Marketplace de integrações
- [ ] White-label para revendedores
---
## 💰 MODELO DE NEGÓCIO SUGERIDO
### Planos
#### **Trial** (14 dias grátis)
- 5 usuários
- 3 obras
- 100 RDOs/mês
- 500 MB storage
#### **Basic** (R$ 99/mês)
- 10 usuários
- 5 obras
- 300 RDOs/mês
- 2 GB storage
#### **Professional** (R$ 299/mês)
- 30 usuários
- 15 obras
- 1000 RDOs/mês
- 10 GB storage
- Personalização de marca
- Suporte prioritário
#### **Enterprise** (Customizado)
- Usuários ilimitados
- Obras ilimitadas
- RDOs ilimitados
- Storage ilimitado
- API dedicada
- Suporte 24/7
- Treinamento incluso
---
## 📞 SUPORTE E DÚVIDAS
Se tiver qualquer dúvida durante a implementação:
1. **Migrations**: Veja `INSTRUCOES_DEPLOY_SUPABASE.md`
2. **Erros**: Me envie a mensagem de erro completa
3. **Dúvidas técnicas**: Pergunte sobre qualquer parte do código
4. **Próximos passos**: Posso detalhar qualquer fase
---
## 🎯 RESUMO EXECUTIVO
**O que foi feito:**
- ✅ Análise completa do projeto
- ✅ Schema multi-tenant completo criado
- ✅ 4 migrations SQL prontas para deploy
- ✅ Documentação detalhada
- ✅ Scripts de verificação e deploy
**Próximo passo imediato:**
1. Aplicar as migrations no Supabase
2. Verificar se tudo foi criado corretamente
3. Começar a atualizar o código frontend
**Tempo estimado de implementação completa:**
- Fase 1 (Migrations): 30 minutos
- Fases 2-5 (Core multi-tenant): 2-3 dias
- Fases 6-7 (Onboarding e Admin): 2-3 dias
- Fases 8-9 (Quotas e Personalização): 1-2 dias
- **Total**: 5-8 dias de desenvolvimento
**Pronto para começar?** 🚀