## 📊 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; updateOrganization: (data: Partial) => Promise; checkQuota: (resource: string) => Promise; } ``` **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 = (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 { // 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?** 🚀