First commit - backup RDOC
This commit is contained in:
423
documentation/PLANO_SAAS_MULTI_TENANT.md
Normal file
423
documentation/PLANO_SAAS_MULTI_TENANT.md
Normal file
@@ -0,0 +1,423 @@
|
||||
## 📊 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?** 🚀
|
||||
Reference in New Issue
Block a user