# EPICA: EPIC-MGN-004 - Multi-Tenancy ## Metadata | Campo | Valor | |-------|-------| | **ID** | EPIC-MGN-004 | | **Nombre** | Multi-Tenancy | | **Modulo** | tenants | | **Fase** | Fase 1 - Foundation | | **Prioridad** | P0 (Critico) | | **Estado** | Ready | | **Story Points** | 21 | | **Sprint(s)** | Sprint 4 (multi-tenancy) | | **Plan Detalle** | [SPRINT-PLAN-FASE-1.md](../SPRINT-PLAN-FASE-1.md) | --- ## Descripcion Sistema de multi-tenancy que permite aislar datos entre diferentes organizaciones (tenants) usando Row-Level Security (RLS) en PostgreSQL. Incluye creacion de tenants, configuracion por tenant, feature flags, limites/quotas y aislamiento completo de datos. Es la base arquitectonica para ofrecer el sistema como SaaS multi-cliente. --- ## Objetivo de Negocio Implementar arquitectura multi-tenant que: - Aisle completamente los datos entre clientes - Permita personalizacion por cliente (branding, features) - Soporte diferentes planes de suscripcion - Escale a miles de tenants - Facilite el onboarding de nuevos clientes --- ## Stakeholders | Rol | Nombre/Equipo | Responsabilidad | |-----|---------------|-----------------| | Product Owner | Equipo Producto | Definicion de features por plan | | Tech Lead | Equipo Backend | Implementacion de RLS | | Operaciones | Equipo Infra | Monitoreo y escalabilidad | | Clientes | Tenant admins | Feedback de gestion | --- ## Historias de Usuario | ID | Historia | Prioridad | SP | Estado | |----|----------|-----------|-----|--------| | US-MGN004-001 | Como superadmin, quiero crear tenants para dar de alta nuevos clientes | P0 | 5 | Ready | | US-MGN004-002 | Como tenant admin, quiero configurar mi organizacion (nombre, logo, colores) | P0 | 3 | Ready | | US-MGN004-003 | Como superadmin, quiero habilitar/deshabilitar features por tenant | P0 | 5 | Ready | | US-MGN004-004 | Como sistema, quiero aislar datos automaticamente por tenant usando RLS | P0 | 5 | Ready | | US-MGN004-005 | Como superadmin, quiero definir limites y quotas por tenant | P1 | 3 | Ready | **Total Story Points:** 21 SP --- ## Criterios de Aceptacion de la Epica **Funcionales:** - [ ] CRUD de tenants con datos de organizacion - [ ] Configuracion personalizada por tenant (branding) - [ ] Feature flags activables por tenant - [ ] Aislamiento de datos via RLS - [ ] Limites configurables (usuarios, storage, etc.) - [ ] Dashboard de tenant para admins **No Funcionales:** - [ ] Performance: Overhead de RLS < 5% - [ ] Seguridad: Imposible acceder a datos de otro tenant - [ ] Escalabilidad: Soporte 10,000+ tenants **Tecnicos:** - [ ] RLS policies en todas las tablas - [ ] Contexto de tenant via `app.current_tenant_id` - [ ] Cobertura de tests > 90% - [ ] Tests de seguridad (penetration tests) --- ## Dependencias **Esta epica depende de:** | Epica/Modulo | Estado | Bloqueante | |--------------|--------|------------| | EPIC-MGN-001 Auth | Ready | Si | | PostgreSQL con RLS | Ready | Si | **Esta epica bloquea:** | Epica/Modulo | Razon | |--------------|-------| | EPIC-MGN-005 Catalogs | Requiere tenant para aislar datos | | EPIC-MGN-016 Billing | Facturacion por tenant | | Todos los modulos | Aislamiento de datos | --- ## Desglose Tecnico **Database:** - [ ] Schema: `core_system` - [ ] Tablas: 3 (tenants, tenant_settings, tenant_features) - [ ] Funciones: 3 (set_tenant_context, get_current_tenant, validar_tenant) - [ ] RLS Policies: Todas las tablas del sistema - [ ] Triggers: auto-set tenant_id on insert **Backend:** - [ ] Modulo: `tenants` - [ ] Entities: 3 (Tenant, TenantSetting, TenantFeature) - [ ] Middleware: TenantContextMiddleware - [ ] Interceptor: TenantInjector - [ ] Endpoints: 8 (CRUD + config + features + stats) - [ ] Tests: 25+ **Frontend:** - [ ] Paginas: 3 (TenantsList, TenantConfig, TenantFeatures) - [ ] Componentes: 6 (TenantForm, TenantCard, FeatureToggle, etc.) - [ ] Stores: 1 (tenantStore) - [ ] Context: CurrentTenantProvider --- ## Arquitectura RLS ```sql -- Politica base para todas las tablas CREATE POLICY tenant_isolation ON {tabla} USING (tenant_id = current_setting('app.current_tenant_id')::uuid); -- Funcion para establecer contexto CREATE FUNCTION set_tenant_context(p_tenant_id UUID) RETURNS VOID AS $$ BEGIN PERFORM set_config('app.current_tenant_id', p_tenant_id::text, false); END; $$ LANGUAGE plpgsql; ``` **Feature Flags por Plan:** | Feature | Starter | Growth | Enterprise | |---------|---------|--------|------------| | Usuarios max | 5 | 25 | Ilimitados | | Storage | 1GB | 10GB | 100GB | | Reportes | Basicos | Avanzados | Personalizados | | API Access | No | Si | Si | | WhatsApp | No | No | Si | | AI Agents | No | No | Si | | Soporte | Email | Chat | Dedicado | --- ## Riesgos | Riesgo | Probabilidad | Impacto | Mitigacion | |--------|--------------|---------|------------| | Fuga de datos entre tenants | Baja | Critico | Tests exhaustivos, auditorias | | Performance con RLS | Media | Alto | Indices optimizados, benchmarks | | Complejidad de migraciones | Media | Medio | Migraciones por tenant | --- ## Definition of Ready (DoR) - [x] Historias de usuario definidas - [x] Criterios de aceptacion claros - [x] Dependencias identificadas - [x] Estimacion completada - [x] Arquitectura RLS aprobada - [x] Sin bloqueadores activos ## Definition of Done (DoD) - [ ] Codigo implementado y revisado - [ ] RLS policies en todas las tablas - [ ] Tests de aislamiento pasando - [ ] Tests de penetracion ejecutados - [ ] Documentacion actualizada - [ ] Demo realizada - [ ] Security review aprobado --- ## Documentacion Relacionada - Requerimientos: `docs/03-requerimientos/RF-tenants/` - Especificaciones: `docs/04-modelado/especificaciones-tecnicas/ET-tenants-*.md` - User Stories: `docs/05-user-stories/MGN-004/` - DDL Spec: `docs/04-modelado/database-design/DDL-SPEC-core_tenants.md` - ADR: `docs/97-adr/ADR-003-multi-tenancy.md` --- ## Historial | Fecha | Cambio | Autor | |-------|--------|-------| | 2025-12-05 | Creacion de epica | Requirements-Analyst | --- **Creada por:** Requirements-Analyst **Fecha:** 2025-12-05 **Ultima actualizacion:** 2025-12-05