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

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 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)

# 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:

# 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

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:

// 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:

// 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:

  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? 🚀