424 lines
11 KiB
Markdown
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?** 🚀
|