11 KiB
📊 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
usuarioscom vínculo a organização -
✅ Tabela
organizacao_usuariospara roles e permissões -
✅ Tabela
convitespara 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_idem 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)
# 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
- Acessar SQL Editor no Supabase
- Executar cada migration manualmente
- 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:
# 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 bancosrc/types/domain.types.ts- Adicionar tipos de Organizaçãosrc/lib/supabase.ts- Adicionar helpers multi-tenant
FASE 3: CRIAR CONTEXTO DE ORGANIZAÇÃO
Arquivo: src/contexts/OrganizationContext.tsx
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:orgSlugem todas as rotassrc/App.tsx- Extrair slug da URL- Criar
ProtectedOrgRoutecomponent - Validar acesso do usuário à organização
FASE 5: ATUALIZAR QUERIES DO SUPABASE
Criar helpers para queries multi-tenant:
// 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.tssrc/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)
- Nome do usuário
- Senha
- CNPJ (opcional)
Fluxo:
- Validar slug disponível
- Criar conta no Supabase Auth
- Chamar
criar_organizacao_com_owner() - 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:
// 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
// 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:
-- 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:
- Migrations: Veja
INSTRUCOES_DEPLOY_SUPABASE.md - Erros: Me envie a mensagem de erro completa
- Dúvidas técnicas: Pergunte sobre qualquer parte do código
- 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:
- Aplicar as migrations no Supabase
- Verificar se tudo foi criado corretamente
- 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? 🚀