# Arquitectura de Base de Datos Multi-Schema - GAMILIT **Documento:** Analisis de Arquitectura de Base de Datos **Proyecto de Referencia:** GAMILIT **Fecha:** 2025-11-23 **Analista:** Architecture-Analyst Agent --- ## 1. VISION GENERAL GAMILIT implementa una **arquitectura multi-schema en PostgreSQL 16+** que organiza objetos de base de datos por dominios de negocio, proporcionando separacion logica, permisos granulares y escalabilidad arquitectonica. ### 1.1 Principios Arquitectonicos 1. **Domain-Driven Design (DDD):** Cada schema representa un contexto delimitado (bounded context) 2. **Separation of Concerns:** Objetos agrupados por responsabilidad funcional 3. **Principle of Least Privilege:** Permisos granulares por schema 4. **Scalability First:** Facil agregar nuevos dominios sin afectar existentes 5. **Documentation as Code:** Sistema SIMCO de mapas _MAP.md jerarquicos --- ## 2. LOS 9 SCHEMAS DE GAMILIT ### 2.1 Resumen Comparativo | Schema | Tablas | Indices | Funciones | Triggers | RLS Policies | Vistas | MViews | Total Objetos | |--------|--------|---------|-----------|----------|--------------|--------|--------|---------------| | **auth_management** | 15 | 11 | 6 | 6 | 1 archivo | - | - | **39** | | **gamification_system** | 15 | 23 | 25 | 10 | 8 archivos | 4 | 4 | **93** | | **educational_content** | 14 | 16 | 3 | 4 | 2 archivos | - | - | **42** | | **progress_tracking** | ~8 | ~15 | ~5 | ~3 | ~2 archivos | - | - | **~35** | | **social_features** | ~10 | ~12 | ~4 | ~2 | ~2 archivos | - | - | **~32** | | **content_management** | ~6 | ~8 | ~2 | ~2 | ~1 archivo | - | - | **~20** | | **audit_logging** | ~4 | ~6 | ~2 | ~1 | ~1 archivo | - | - | **~15** | | **system_configuration** | ~3 | ~4 | ~2 | ~1 | ~1 archivo | - | - | **~12** | | **public** | ~2 | ~3 | ~10 | - | - | - | - | **~15** | | **TOTAL** | **~77** | **~98** | **~59** | **~29** | **~18** | **4** | **4** | **~303** | **Nota:** Numeros exactos solo para auth_management, gamification_system y educational_content (documentados). Resto estimado. ### 2.2 Detalle por Schema --- #### 2.2.1 auth_management - Autenticacion y Autorizacion **Proposito:** Gestion completa de autenticacion, usuarios, roles, sesiones y seguridad. **Tablas (15):** ```sql 01. tenants -- Multi-tenancy (organizaciones) 02. auth_attempts -- Intentos de autenticacion (tracking) 03. profiles -- Perfiles de usuario 04. roles -- Roles del sistema (RBAC) 05. auth_providers -- Proveedores OAuth (Google, GitHub, etc.) 06. email_verification_tokens -- Tokens de verificacion de email 07. password_reset_tokens -- Tokens de reset de password 08. security_events -- Eventos de seguridad (logs) 09. user_preferences -- Preferencias de usuario (theme, language) 10. memberships -- Membresias de usuarios en tenants 11. user_sessions -- Sesiones activas (JWT tracking) 12. user_suspensions -- Suspensiones de usuarios 14. parent_accounts -- Cuentas de padres (FUTURE - EXT-010) 15. parent_student_links -- Links padres-estudiantes (FUTURE) 16. parent_notifications -- Notificaciones a padres (FUTURE) ``` **Funciones (6):** ```sql 01. assign_role_to_user() -- Asignar rol a usuario 02. get_user_role() -- Obtener rol de usuario 03. verify_user_permission() -- Verificar permiso 04. remove_role_from_user() -- Remover rol 05. hash_token() -- Hash de tokens de seguridad 06. update_user_preferences() -- Actualizar preferencias ``` **Triggers (6):** ```sql 02. trg_memberships_updated_at -- Auto-actualizar updated_at 03. trg_audit_profile_changes -- Auditar cambios en profiles 04. trg_initialize_user_stats -- Inicializar stats de gamificacion 05. trg_profiles_updated_at -- Auto-actualizar updated_at 06. trg_tenants_updated_at -- Auto-actualizar updated_at 07. trg_user_roles_updated_at -- Auto-actualizar updated_at ``` **Indices (11):** - Indices en user_roles (role, tenant_id, user_id) - Indices en user_sessions (active, expires, tokens) - Indices en user_preferences (theme) - Indices GIN en permissions **RLS Policies:** 1 archivo consolidado con politicas de acceso **Patrones observados:** - ✅ Multi-tenancy con tabla `tenants` - ✅ RBAC (Role-Based Access Control) con `roles` y `user_roles` - ✅ OAuth providers multiples - ✅ Tokens con hash de seguridad - ✅ Auditoria de eventos de seguridad - ✅ Sesiones con JWT tracking - ✅ Triggers para updated_at automatico - ✅ RLS policies para multi-tenant isolation **Aplicabilidad a ERP Generico:** ⭐⭐⭐⭐⭐ (MAXIMA) **Decision:** ✅ **ADOPTAR** estructura completa de autenticacion y RBAC --- #### 2.2.2 gamification_system - Sistema de Gamificacion **Proposito:** Sistema completo de gamificacion con logros, rangos mayas, monedas ML, comodines y notificaciones. **Tablas (15):** ```sql 01. user_stats -- Estadisticas de usuario (XP, level, coins, streak) 02. user_ranks -- Historial de rangos mayas 03. achievements -- Logros disponibles 04. user_achievements -- Logros desbloqueados por usuarios 05. ml_coins_transactions -- Transacciones de ML Coins 06. missions -- Misiones disponibles 07. comodines_inventory -- Inventario de comodines (power-ups) 08. notifications -- Notificaciones del sistema 09. leaderboard_metadata -- Metadata de leaderboards 10. achievement_categories -- Categorias de logros 11. active_boosts -- Boosts activos temporales 12. inventory_transactions -- Transacciones de inventario 13. maya_ranks -- Definicion de rangos mayas 14. comodin_usage_log -- Log de uso de comodines 15. comodin_usage_tracking -- Tracking de uso de comodines ``` **ENUMs (4):** ```sql maya_rank -- 5 rangos: Ajaw, Nacom, Ah K'in, Halach Uinic, K'uk'ulkan notification_priority -- 4 niveles: low, medium, high, critical notification_type -- 11 tipos: achievement_unlocked, rank_up, etc. transaction_type -- 14 tipos: earned_exercise, spent_powerup, etc. ``` **Funciones (25):** ```sql apply_xp_boost() -- Aplicar boost de XP award_ml_coins() -- Otorgar ML Coins calculate_level_from_xp() -- Calcular nivel desde XP calculate_user_rank() -- Calcular rango maya check_and_award_achievements() -- Verificar y otorgar logros check_rank_promotion() -- Verificar promocion de rango (NUEVO) claim_achievement_reward() -- Reclamar recompensa de logro consume_comodin() -- Consumir comodin (power-up) get_rank_benefits() -- Obtener beneficios de rango (NUEVO) get_rank_multiplier() -- Obtener multiplicador de rango (NUEVO) get_user_comodines() -- Obtener comodines de usuario get_user_inventory_summary() -- Resumen de inventario get_user_rank_progress() -- Progreso de rango get_user_rank_requirements() -- Requisitos de siguiente rango process_exercise_completion() -- Procesar completacion de ejercicio promote_to_next_rank() -- Promocion a siguiente rango (NUEVO) send_notification() -- Enviar notificacion update_leaderboard_coins() -- Actualizar leaderboard de coins update_leaderboard_global() -- Actualizar leaderboard global update_leaderboard_streaks() -- Actualizar leaderboard de rachas update_user_rank() -- Actualizar rango de usuario (REFACTORIZADO) recalculate_level_on_xp_change() -- Recalcular nivel al cambiar XP update_missions_updated_at() -- Auto-actualizar updated_at update_notifications_updated_at() -- Auto-actualizar updated_at ``` **Triggers (10):** ```sql 01. trg_achievement_unlocked -- Trigger al desbloquear logro 02. trg_check_rank_promotion -- Verificar promocion de rango 15. trg_achievements_updated_at -- Auto-actualizar updated_at 16. trg_comodines_inventory_updated_at -- Auto-actualizar updated_at 17. missions_updated_at -- Auto-actualizar updated_at 18. notifications_updated_at -- Auto-actualizar updated_at 19. trg_user_ranks_updated_at -- Auto-actualizar updated_at 20. trg_user_stats_updated_at -- Auto-actualizar updated_at 21. trg_recalculate_level_on_xp_change -- Recalcular nivel automaticamente trg_check_rank_promotion_on_xp_gain -- Promocion automatica (NUEVO) ``` **Vistas (4):** ```sql 01. leaderboard_coins -- Leaderboard por ML Coins 02. leaderboard_global -- Leaderboard global por XP 03. leaderboard_streaks -- Leaderboard por rachas 04. leaderboard_xp -- Leaderboard por XP puro ``` **Vistas Materializadas (4):** ```sql 01. mv_global_leaderboard -- Leaderboard global materializado 02. mv_classroom_leaderboard -- Leaderboard por aula 03. mv_weekly_leaderboard -- Leaderboard semanal 04. mv_mechanic_leaderboard -- Leaderboard por mecanica educativa ``` **Indices (23):** Indices optimizados en user_stats, achievements, transactions, etc. **RLS Policies:** 8 archivos (ml-coins, achievements, user-stats, inventory, notifications, leaderboard) **Patrones observados:** - ✅ Sistema de XP y niveles con calculo automatico - ✅ Rangos jerarquicos (mayas) con beneficios - ✅ Moneda virtual (ML Coins) con transacciones - ✅ Logros con condiciones y recompensas - ✅ Comodines/Power-ups con inventario - ✅ Notificaciones con prioridades - ✅ Leaderboards con vistas materializadas (performance) - ✅ Triggers automaticos para recalculo - ✅ Funciones PL/pgSQL para logica compleja **Aplicabilidad a ERP Generico:** ⭐⭐ (BAJA) **Decision:** ❌ **NO ADOPTAR** (especifico de gamificacion, no aplicable a ERP) --- #### 2.2.3 educational_content - Contenido Educativo **Proposito:** Modulos educativos, ejercicios, recursos multimedia y assignments. **Tablas (14 activas):** ```sql 01. modules -- Modulos educativos (5 modulos) 02. exercises -- Ejercicios (33 tipos diferentes, 85 total) 03. assessment_rubrics -- Rubricas de evaluacion 04. media_resources -- Recursos multimedia 05. assignments -- Tareas asignadas por profesor 06. assignment_exercises -- Ejercicios en cada assignment 07. assignment_students -- Estudiantes asignados 08. assignment_submissions -- Envios de estudiantes content_approvals -- Aprobaciones de contenido content_metadata -- Metadata de contenido content_tags -- Tags de contenido module_dependencies -- Dependencias entre modulos taxonomies -- Taxonomias educativas 20. difficulty_criteria -- Criterios de dificultad CEFR (NUEVO) -- DEPRECATED (eliminadas): -- exercise_answers.sql -- exercise_options.sql ``` **ENUMs (3):** ```sql bloom_taxonomy -- Taxonomia de Bloom educativa difficulty_level -- 8 niveles CEFR: beginner (A1), elementary (A2), ..., native exercise_mechanic -- 33 mecanicas educativas diferentes ``` **Funciones (3):** ```sql calculate_learning_path() -- Calcular ruta de aprendizaje get_recommended_missions() -- Recomendar misiones validate_exercise_structure() -- Validar estructura de ejercicio ``` **Triggers (4):** ```sql 11. trg_assessment_rubrics_updated_at -- Auto-actualizar updated_at 12. trg_exercises_updated_at -- Auto-actualizar updated_at 13. trg_media_resources_updated_at -- Auto-actualizar updated_at 14. trg_modules_updated_at -- Auto-actualizar updated_at ``` **Indices (16):** Indices en assignments, submissions, exercises **RLS Policies:** 2 archivos (enable-rls, modules-exercises-policies) **Patrones observados:** - ✅ Modulos con dependencias (prerequisitos) - ✅ Ejercicios con config JSONB (modelo dual) - ✅ Niveles de dificultad CEFR internacional - ✅ Assignments con deadlines - ✅ Sistema de submissions y grading - ✅ Recursos multimedia con metadata - ✅ Taxonomias educativas - ❌ Modelo JSONB puro (eliminaron exercise_options y exercise_answers) **Aplicabilidad a ERP Generico:** ⭐ (MUY BAJA) **Decision:** ❌ **NO ADOPTAR** (especifico de educacion, no aplicable a ERP) **Aprendizajes trasladables:** - ✅ Patron de assignments (podria ser ordenes de trabajo) - ✅ Sistema de submissions (podria ser entregas/recepciones) - ✅ Modelo JSONB para datos flexibles --- #### 2.2.4 progress_tracking - Seguimiento de Progreso **Proposito:** Tracking de progreso de estudiantes, sesiones de aprendizaje, attempts de ejercicios. **Tablas (~8):** ```sql module_progress -- Progreso en modulos learning_sessions -- Sesiones de aprendizaje exercise_attempts -- Intentos de ejercicios exercise_submissions -- Envios de ejercicios scheduled_missions -- Misiones programadas teacher_notes -- Notas del profesor engagement_metrics -- Metricas de engagement learning_paths -- Rutas de aprendizaje mastery_tracking -- Tracking de maestria module_completion_tracking -- Tracking de completacion progress_snapshots -- Snapshots de progreso skill_assessments -- Evaluaciones de habilidades user_learning_paths -- Rutas por usuario ``` **ENUMs:** ```sql progress_status -- 6 estados: not_started, in_progress, completed, needs_review, mastered, abandoned attempt_result -- 4 resultados: correct, incorrect, partial, skipped ``` **Patrones observados:** - ✅ Tracking de progreso con porcentajes - ✅ Sesiones de aprendizaje con tiempo - ✅ Multiple attempts por ejercicio - ✅ Snapshots para analytics historicos - ✅ Notas del profesor (feedback) **Aplicabilidad a ERP Generico:** ⭐⭐ (BAJA-MEDIA) **Decision:** 🔧 **ADAPTAR** conceptos de tracking **Aprendizajes trasladables:** - ✅ Patron de "progreso" (aplicable a avance de obra) - ✅ Snapshots para historico (aplicable a presupuestos) - ✅ Notas/comentarios (aplicable a observaciones de obra) --- #### 2.2.5 social_features - Caracteristicas Sociales **Proposito:** Amistades, escuelas, aulas, equipos y desafios. **Tablas (~10):** ```sql friendships -- Amistades entre usuarios schools -- Escuelas classrooms -- Aulas/Salones classroom_members -- Miembros de aulas teams -- Equipos team_members -- Miembros de equipos team_challenges -- Desafios entre equipos assignment_classrooms -- Assignments por aula peer_challenges -- Desafios entre pares challenge_participants -- Participantes en desafios challenge_results -- Resultados de desafios discussion_threads -- Hilos de discusion social_interactions -- Interacciones sociales teacher_classrooms -- Aulas por profesor user_follows -- Seguidores ``` **ENUMs:** ```sql friendship_status -- 4 estados: pending, accepted, rejected, blocked classroom_member_status -- 4 estados: active, inactive, withdrawn, completed enrollment_method -- 4 metodos: teacher_invite, self_enroll, admin_add, bulk_import team_member_role -- 3 roles: owner, admin, member team_challenge_status -- 5 estados: active, in_progress, completed, failed, cancelled social_event_type -- 5 tipos: competition, collaboration, challenge, tournament, workshop ``` **Patrones observados:** - ✅ Jerarquia: Escuelas → Aulas → Equipos - ✅ Amistades con estados - ✅ Enrollment con multiples metodos - ✅ Desafios competitivos - ✅ Roles en equipos **Aplicabilidad a ERP Generico:** ⭐⭐⭐ (MEDIA) **Decision:** 🔧 **ADAPTAR** jerarquias organizacionales **Aprendizajes trasladables:** - ✅ Jerarquia Empresa → Proyecto → Equipo - ✅ Miembros con roles - ✅ Estados de membresia - ✅ Metodos de enrollment (aplicable a asignacion de personal) --- #### 2.2.6 content_management - Gestion de Contenido **Proposito:** Plantillas de contenido, contenido Marie Curie, archivos multimedia. **Tablas (~6):** ```sql content_templates -- Plantillas reutilizables marie_curie_content -- Contenido especifico media_files -- Archivos multimedia content_authors -- Autores de contenido content_categories -- Categorias content_versions -- Versionado de contenido flagged_content -- Contenido reportado media_metadata -- Metadata de archivos ``` **ENUMs:** ```sql content_status -- 4 estados: draft, published, archived, under_review content_type -- 6 tipos: video, text, interactive, quiz, game, simulation media_type -- 6 tipos: image, video, audio, document, interactive, animation processing_status -- 5 estados: uploading, processing, ready, error, optimizing ``` **Patrones observados:** - ✅ Plantillas reutilizables - ✅ Versionado de contenido - ✅ Estados de publicacion - ✅ Processing status para multimedia **Aplicabilidad a ERP Generico:** ⭐⭐⭐ (MEDIA) **Decision:** 🔧 **ADAPTAR** gestion documental **Aprendizajes trasladables:** - ✅ Plantillas (aplicable a formatos de contratos) - ✅ Versionado (aplicable a documentos de obra) - ✅ Estados de publicacion (aplicable a aprobaciones) - ✅ Metadata de archivos (aplicable a planos, documentos) --- #### 2.2.7 audit_logging - Auditoria y Logs **Proposito:** Logs de auditoria, actividad de usuarios, metricas de performance. **Tablas (~4):** ```sql audit_logs -- Logs de auditoria system_logs -- Logs del sistema user_activity_logs -- Actividad de usuarios performance_metrics -- Metricas de performance system_alerts -- Alertas del sistema user_activity -- Actividad agregada ``` **ENUMs:** ```sql aggregation_period -- 5 periodos: daily, weekly, monthly, quarterly, yearly metric_type -- 7 tipos: engagement, performance, completion, time_spent, accuracy, streak, social_interaction ``` **Patrones observados:** - ✅ Auditoria completa de cambios - ✅ Logs de actividad de usuarios - ✅ Metricas de performance - ✅ Agregacion por periodos **Aplicabilidad a ERP Generico:** ⭐⭐⭐⭐⭐ (MAXIMA) **Decision:** ✅ **ADOPTAR COMPLETAMENTE** **Critico para ERP:** - Auditoria de cambios en presupuestos - Logs de compras y gastos - Tracking de modificaciones - Metricas de performance del sistema --- #### 2.2.8 system_configuration - Configuracion del Sistema **Proposito:** Configuracion dinamica del sistema, feature flags. **Tablas (~3):** ```sql system_settings -- Settings del sistema feature_flags -- Feature flags (A/B testing) notification_settings -- Configuracion de notificaciones api_configuration -- Configuracion de APIs environment_config -- Configuracion por ambiente tenant_configurations -- Configuraciones por tenant ``` **Patrones observados:** - ✅ Settings dinamicos sin redeploy - ✅ Feature flags para A/B testing - ✅ Configuracion multi-tenant - ✅ Configuracion por ambiente **Aplicabilidad a ERP Generico:** ⭐⭐⭐⭐⭐ (MAXIMA) **Decision:** ✅ **ADOPTAR COMPLETAMENTE** **Critico para ERP:** - Configuracion dinamica sin redeploy - Feature flags para releases graduales - Configuracion por empresa (multi-tenant) --- #### 2.2.9 public - Schema Publico **Proposito:** Funciones compartidas y utilidades generales. **Objetos (~15):** - Funciones de utilidad compartidas - Extensiones PostgreSQL (uuid-ossp, pgcrypto, etc.) - Tipos compartidos **Patrones observados:** - ✅ Funciones reutilizables - ✅ Extensiones centralizadas - ✅ Tipos compartidos **Aplicabilidad a ERP Generico:** ⭐⭐⭐⭐ (ALTA) **Decision:** ✅ **ADOPTAR** --- ## 3. PATRON DE ORGANIZACION INTERNA DE SCHEMAS Cada schema en GAMILIT sigue una **estructura de carpetas estandarizada**: ``` schema_name/ ├── _MAP.md # Mapa completo del schema (SIMCO) ├── tables/ # Tablas principales │ ├── _MAP.md │ ├── 01-tabla1.sql # Prefijo numerico para orden │ ├── 02-tabla2.sql │ └── ... ├── indexes/ # Indices optimizados │ ├── _MAP.md │ ├── idx_tabla1_campo1.sql │ └── ... ├── functions/ # Funciones PL/pgSQL │ ├── _MAP.md │ ├── 01-funcion1.sql │ └── ... ├── triggers/ # Triggers │ ├── _MAP.md │ ├── 01-trg_tabla1_updated_at.sql │ └── ... ├── views/ # Vistas (opcional) │ ├── _MAP.md │ └── ... ├── materialized-views/ # Vistas materializadas (opcional) │ ├── _MAP.md │ └── ... ├── enums/ # ENUMs PostgreSQL (opcional) │ ├── _MAP.md │ └── ... ├── rls-policies/ # Row Level Security (opcional) │ ├── _MAP.md │ ├── 01-enable-rls.sql │ └── 02-policies.sql └── seeds/ # Datos iniciales (opcional) ├── _MAP.md └── ... ``` ### 3.1 Ventajas de esta Organizacion 1. **Navegacion facil:** Estructura predecible 2. **Documentacion integrada:** Archivos _MAP.md en cada nivel 3. **Orden de ejecucion:** Prefijos numericos (01-, 02-, etc.) 4. **Separacion de responsabilidades:** Un archivo por objeto 5. **Git-friendly:** Merges mas faciles 6. **CI/CD-ready:** Facil automatizar ejecucion --- ## 4. ROW LEVEL SECURITY (RLS) ### 4.1 Implementacion en GAMILIT **Politicas RLS totales:** 159 planeadas, 41 activas **Schemas con RLS:** - `auth_management` - 1 archivo de policies - `gamification_system` - 8 archivos de policies - `educational_content` - 2 archivos de policies - `progress_tracking` - ~2 archivos de policies - `social_features` - ~2 archivos de policies - Otros schemas - ~3 archivos de policies ### 4.2 Patron de Implementacion **Archivo 01-enable-rls.sql:** ```sql -- Habilitar RLS en todas las tablas del schema ALTER TABLE schema_name.tabla1 ENABLE ROW LEVEL SECURITY; ALTER TABLE schema_name.tabla2 ENABLE ROW LEVEL SECURITY; -- ... ``` **Archivo 02-policies.sql (ejemplo):** ```sql -- Policy: Los usuarios solo ven sus propios datos CREATE POLICY user_own_data ON schema_name.tabla1 FOR SELECT USING (user_id = current_user_id()); -- Policy: Multi-tenant isolation CREATE POLICY tenant_isolation ON schema_name.tabla1 FOR ALL USING (tenant_id = current_tenant_id()); ``` ### 4.3 Funciones de Contexto ```sql -- Obtener user_id del contexto actual (JWT) CREATE FUNCTION current_user_id() RETURNS UUID AS $$ SELECT current_setting('app.current_user_id')::UUID; $$ LANGUAGE SQL STABLE; -- Obtener tenant_id del contexto actual CREATE FUNCTION current_tenant_id() RETURNS UUID AS $$ SELECT current_setting('app.current_tenant_id')::UUID; $$ LANGUAGE SQL STABLE; ``` ### 4.4 Aplicabilidad a ERP Generico ⭐⭐⭐⭐⭐ (MAXIMA) **Decision:** ✅ **ADOPTAR COMPLETAMENTE** **Usos en ERP:** - Multi-tenant isolation (empresa por empresa) - Permisos por rol (solo ver presupuestos asignados) - Seguridad a nivel de fila (solo ver propias compras) --- ## 5. SISTEMA DE DOCUMENTACION _MAP.md (SIMCO) ### 5.1 Total de Archivos _MAP.md en GAMILIT **85+ archivos _MAP.md** distribuidos jerarquicamente: ``` gamilit/ ├── _MAP.md # Mapa raiz del proyecto └── database/ └── ddl/ └── schemas/ ├── auth_management/ │ ├── _MAP.md # Mapa del schema │ ├── tables/_MAP.md # Lista de tablas │ ├── indexes/_MAP.md # Lista de indices │ ├── functions/_MAP.md # Lista de funciones │ ├── triggers/_MAP.md # Lista de triggers │ └── rls-policies/_MAP.md # Lista de policies ├── gamification_system/ │ ├── _MAP.md │ ├── tables/_MAP.md │ └── ... (7 _MAP.md por schema) └── ... (9 schemas × ~9 _MAP.md = ~81 archivos) ``` ### 5.2 Estructura de un _MAP.md **Ejemplo:** `database/ddl/schemas/auth_management/_MAP.md` ```markdown # Schema: auth_management Gestion de autenticacion y autorizacion: usuarios, roles, perfiles, sesiones ## Estructura - **tables/**: 15 archivos - **functions/**: 6 archivos - **triggers/**: 6 archivos - **indexes/**: 11 archivos - **rls-policies/**: 1 archivos **Total:** 39 objetos ## Contenido Detallado ### tables/ (15 archivos) ``` 01-tenants.sql 02-auth_attempts.sql 03-profiles.sql ... ``` ### functions/ (6 archivos) ``` 01-assign_role_to_user.sql 02-get_user_role.sql ... ``` --- **Ultima actualizacion:** 2025-11-09 **Reorganizacion:** 2025-11-09 ``` ### 5.3 Beneficios del Sistema SIMCO 1. **Navegacion rapida para AI agents** 2. **Documentacion estructurada y actualizable** 3. **Visibilidad de cambios en Git** 4. **Jerarquia clara de objetos** 5. **Mantenimiento incremental** ### 5.4 Aplicabilidad a ERP Generico ⭐⭐⭐⭐⭐ (MAXIMA) **Decision:** ✅ **ADOPTAR COMPLETAMENTE** (ya en uso) --- ## 6. INDICES Y OPTIMIZACION ### 6.1 Metricas de Indices en GAMILIT **Total de indices:** 279+ **Distribucion:** - `gamification_system`: 23 indices - `educational_content`: 16 indices - `auth_management`: 11 indices - Otros schemas: ~229 indices ### 6.2 Patrones de Indexacion Observados **1. Indices en Foreign Keys:** ```sql CREATE INDEX idx_user_roles_user_id ON auth_management.user_roles(user_id); CREATE INDEX idx_user_roles_tenant_id ON auth_management.user_roles(tenant_id); ``` **2. Indices en Campos de Busqueda Frecuente:** ```sql CREATE INDEX idx_user_sessions_active ON auth_management.user_sessions(is_active); CREATE INDEX idx_user_sessions_expires ON auth_management.user_sessions(expires_at); ``` **3. Indices GIN para JSONB y Arrays:** ```sql CREATE INDEX idx_user_roles_permissions_gin ON auth_management.user_roles USING GIN (permissions); CREATE INDEX idx_achievements_conditions_gin ON gamification_system.achievements USING GIN (unlock_conditions); ``` **4. Indices Compuestos:** ```sql CREATE INDEX idx_user_stats_tenant_level ON gamification_system.user_stats(tenant_id, level); ``` **5. Indices de Ordenamiento (Leaderboards):** ```sql CREATE INDEX idx_user_stats_global_rank ON gamification_system.user_stats(total_xp DESC); ``` ### 6.3 Aplicabilidad a ERP Generico ⭐⭐⭐⭐⭐ (MAXIMA) **Decision:** ✅ **ADOPTAR** patrones de indexacion **Indices criticos para ERP:** - Foreign keys (empresa_id, proyecto_id, etc.) - Campos de busqueda (fechas, estados, montos) - Indices GIN para campos JSONB (metadata, configuraciones) - Indices compuestos para consultas frecuentes --- ## 7. FUNCIONES PL/pgSQL ### 7.1 Metricas de Funciones en GAMILIT **Total de funciones:** 50+ **Distribucion:** - `gamification_system`: 25 funciones - `auth_management`: 6 funciones - `educational_content`: 3 funciones - `public`: ~10 funciones - Otros schemas: ~6 funciones ### 7.2 Categorias de Funciones **1. Funciones de Calculo:** ```sql -- Calcular nivel desde XP CREATE FUNCTION gamification_system.calculate_level_from_xp(xp INTEGER) RETURNS INTEGER AS $$ -- Logica de calculo $$ LANGUAGE plpgsql IMMUTABLE; ``` **2. Funciones de Negocio:** ```sql -- Procesar completacion de ejercicio CREATE FUNCTION gamification_system.process_exercise_completion( p_user_id UUID, p_exercise_id UUID, p_score INTEGER ) RETURNS VOID AS $$ -- Logica compleja: otorgar XP, coins, verificar logros, etc. $$ LANGUAGE plpgsql; ``` **3. Funciones de Utilidad:** ```sql -- Hash de tokens CREATE FUNCTION auth_management.hash_token(token TEXT) RETURNS TEXT AS $$ SELECT encode(digest(token, 'sha256'), 'hex'); $$ LANGUAGE SQL IMMUTABLE; ``` **4. Funciones de Contexto:** ```sql -- Obtener user_id actual CREATE FUNCTION current_user_id() RETURNS UUID AS $$ SELECT current_setting('app.current_user_id')::UUID; $$ LANGUAGE SQL STABLE; ``` ### 7.3 Aplicabilidad a ERP Generico ⭐⭐⭐⭐⭐ (MAXIMA) **Decision:** ✅ **ADOPTAR** uso de funciones PL/pgSQL **Funciones criticas para ERP:** - Calculos de presupuesto (aplicar porcentajes, descuentos) - Validaciones de negocio (verificar disponibilidad de presupuesto) - Agregaciones (totales por proyecto, empresa, periodo) - Automatizaciones (generar asientos contables, actualizar inventario) --- ## 8. TRIGGERS ### 8.1 Metricas de Triggers en GAMILIT **Total de triggers:** 35+ **Distribucion:** - `gamification_system`: 10 triggers - `auth_management`: 6 triggers - `educational_content`: 4 triggers - Otros schemas: ~15 triggers ### 8.2 Patrones de Triggers Observados **1. Auto-actualizar updated_at:** ```sql CREATE TRIGGER trg_users_updated_at BEFORE UPDATE ON auth_management.users FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); ``` **2. Auditoria de Cambios:** ```sql CREATE TRIGGER trg_audit_profile_changes AFTER UPDATE ON auth_management.profiles FOR EACH ROW EXECUTE FUNCTION log_profile_changes(); ``` **3. Inicializacion Automatica:** ```sql CREATE TRIGGER trg_initialize_user_stats AFTER INSERT ON auth_management.profiles FOR EACH ROW EXECUTE FUNCTION gamification_system.initialize_user_stats(); ``` **4. Validaciones de Negocio:** ```sql CREATE TRIGGER trg_check_rank_promotion AFTER UPDATE OF total_xp ON gamification_system.user_stats FOR EACH ROW WHEN (NEW.total_xp > OLD.total_xp) EXECUTE FUNCTION gamification_system.check_rank_promotion(); ``` **5. Recalculos Automaticos:** ```sql CREATE TRIGGER trg_recalculate_level_on_xp_change AFTER UPDATE OF total_xp ON gamification_system.user_stats FOR EACH ROW EXECUTE FUNCTION gamification_system.recalculate_level_on_xp_change(); ``` ### 8.3 Aplicabilidad a ERP Generico ⭐⭐⭐⭐⭐ (MAXIMA) **Decision:** ✅ **ADOPTAR** uso de triggers **Triggers criticos para ERP:** - Auto-actualizar updated_at en todas las tablas - Auditoria de cambios en presupuestos y compras - Validaciones de negocio (no exceder presupuesto) - Recalculos automaticos (totales, saldos, inventario) - Notificaciones automaticas (aprobaciones, vencimientos) --- ## 9. MATRIZ DE DECISION: ADOPTAR / ADAPTAR / EVITAR ### 9.1 ADOPTAR COMPLETAMENTE ✅ | Patron | Schema(s) | Justificacion | Prioridad | |--------|-----------|---------------|-----------| | **Arquitectura Multi-Schema** | Todos | Separacion logica por dominio | P0 | | **Organizacion interna de schemas** | Todos | Estructura estandarizada | P0 | | **Sistema SIMCO (_MAP.md)** | Todos | Documentacion jerarquica | P0 | | **Row Level Security (RLS)** | auth, gamification, etc. | Multi-tenant isolation | P0 | | **Triggers de updated_at** | Todos | Auditoria de cambios | P0 | | **Funciones de contexto** | auth_management | current_user_id(), current_tenant_id() | P0 | | **Indices en Foreign Keys** | Todos | Performance de JOINs | P0 | | **Indices GIN en JSONB** | Varios | Busqueda en campos JSONB | P1 | | **Auditoria completa** | audit_logging | Logs de cambios | P0 | | **Configuracion dinamica** | system_configuration | Settings sin redeploy | P0 | ### 9.2 ADAPTAR A CONTEXTO ERP 🔧 | Patron | Schema Original | Adaptacion para ERP | Justificacion | |--------|----------------|---------------------|---------------| | **Jerarquia organizacional** | social_features | Empresa → Proyecto → Equipo | Estructura similar pero diferente contexto | | **Sistema de assignments** | educational_content | Ordenes de trabajo | Concepto trasladable | | **Sistema de submissions** | educational_content | Entregas/Recepciones | Concepto trasladable | | **Tracking de progreso** | progress_tracking | Avance de obra | Concepto trasladable | | **Snapshots** | progress_tracking | Snapshots de presupuestos | Historial de cambios | | **Notas/Comentarios** | progress_tracking | Observaciones de obra | Feedback y seguimiento | | **Plantillas** | content_management | Plantillas de contratos | Reutilizacion de documentos | | **Versionado** | content_management | Versionado de documentos | Control de cambios | ### 9.3 EVITAR / NO APLICABLE ❌ | Patron | Schema Original | Razon | |--------|----------------|-------| | **Sistema de gamificacion completo** | gamification_system | No aplicable a ERP (XP, logros, rangos mayas) | | **Contenido educativo** | educational_content | Especifico de educacion (modulos, ejercicios) | | **Caracteristicas sociales** | social_features | No aplicable (amistades, equipos gaming) | | **Leaderboards** | gamification_system | No aplicable a ERP | | **Comodines/Power-ups** | gamification_system | Especifico de juegos | --- ## 10. PROPUESTA DE SCHEMAS PARA ERP GENERICO Basado en el analisis de GAMILIT, se propone la siguiente arquitectura multi-schema para el ERP Generico: ```sql -- 9 Schemas propuestos para ERP Generico core_system -- Usuarios, empresas, monedas, configuracion base ├── companies -- Empresas (multi-tenant) ├── users -- Usuarios del sistema ├── roles -- Roles RBAC ├── permissions -- Permisos granulares ├── user_sessions -- Sesiones activas ├── currencies -- Monedas soportadas ├── exchange_rates -- Tasas de cambio └── system_settings -- Configuracion dinamica accounting -- Contabilidad completa ├── chart_of_accounts -- Catalogo de cuentas ├── journal_entries -- Asientos contables ├── account_balances -- Saldos de cuentas ├── fiscal_periods -- Periodos fiscales ├── tax_rates -- Impuestos └── financial_reports -- Reportes financieros budgets -- Presupuestos y control ├── budgets -- Presupuestos maestros ├── budget_items -- Partidas presupuestarias ├── budget_categories -- Categorias ├── budget_tracking -- Seguimiento de ejecucion ├── budget_snapshots -- Snapshots historicos └── budget_approvals -- Flujo de aprobaciones purchasing -- Compras y proveedores ├── suppliers -- Proveedores ├── purchase_orders -- Ordenes de compra ├── purchase_items -- Items de compra ├── receipts -- Recepciones ├── invoices -- Facturas de proveedores └── payments -- Pagos a proveedores inventory -- Inventario y almacenes ├── warehouses -- Almacenes ├── products -- Productos/Materiales ├── product_categories -- Categorias de productos ├── stock_movements -- Movimientos de inventario ├── stock_balances -- Saldos de inventario └── inventory_snapshots -- Snapshots de inventario projects -- Proyectos y obras ├── projects -- Proyectos/Obras ├── project_phases -- Fases de proyecto ├── work_orders -- Ordenes de trabajo ├── project_team -- Equipo del proyecto ├── project_progress -- Avance de obra └── project_documents -- Documentos del proyecto human_resources -- RRHH y nominas ├── employees -- Empleados ├── departments -- Departamentos ├── payrolls -- Nominas ├── payroll_items -- Conceptos de nomina ├── attendance -- Asistencia └── employee_benefits -- Beneficios audit_logging -- Auditoria completa ├── audit_logs -- Logs de auditoria ├── user_activity -- Actividad de usuarios ├── change_history -- Historial de cambios ├── system_logs -- Logs del sistema └── performance_metrics -- Metricas de performance system_notifications -- Notificaciones multi-canal ├── notifications -- Notificaciones ├── notification_preferences -- Preferencias ├── notification_templates -- Plantillas ├── notification_queue -- Cola de envios └── user_devices -- Dispositivos para push ``` **Total schemas:** 9 (igual que GAMILIT) **Beneficios:** - Separacion logica clara por dominio - Multi-tenancy (isolation por empresa) - Permisos granulares por schema - Escalabilidad (facil agregar nuevos schemas) - Mantenibilidad (cambios aislados) --- ## 11. CONCLUSION Y RECOMENDACIONES ### 11.1 Hallazgos Clave 1. **Arquitectura Multi-Schema es excelente:** ⭐⭐⭐⭐⭐ - Separacion logica clara - Escalabilidad comprobada - Permisos granulares - Documentacion estructurada 2. **Row Level Security es critico:** ⭐⭐⭐⭐⭐ - Multi-tenant isolation - Seguridad a nivel de fila - Implementacion con funciones de contexto 3. **Sistema SIMCO (_MAP.md) es invaluable:** ⭐⭐⭐⭐⭐ - 85+ archivos de documentacion jerarquica - Navegacion rapida para AI agents - Mantenimiento incremental 4. **Triggers y Funciones PL/pgSQL son potentes:** ⭐⭐⭐⭐⭐ - Automatizaciones - Validaciones de negocio - Recalculos automaticos ### 11.2 Recomendaciones Finales #### ADOPTAR COMPLETAMENTE ✅ (Prioridad P0) 1. Arquitectura multi-schema (9 schemas para ERP) 2. Organizacion interna estandarizada de schemas 3. Sistema SIMCO de mapas _MAP.md 4. Row Level Security con funciones de contexto 5. Triggers de updated_at en todas las tablas 6. Indices en foreign keys y campos frecuentes 7. Auditoria completa (audit_logging schema) 8. Configuracion dinamica (system_configuration schema) #### ADAPTAR A CONTEXTO ERP 🔧 (Prioridad P1) 1. Jerarquia organizacional (Empresa → Proyecto → Equipo) 2. Sistema de ordenes de trabajo (adaptado de assignments) 3. Tracking de progreso (adaptado a avance de obra) 4. Sistema de plantillas (contratos, documentos) 5. Versionado de documentos #### EVITAR ❌ 1. Sistema de gamificacion (no aplicable a ERP) 2. Contenido educativo (especifico de educacion) 3. Caracteristicas sociales de gaming --- **Documento creado:** 2025-11-23 **Ultima actualizacion:** 2025-11-23 **Version:** 1.0 **Estado:** Completado **Proximo documento:** `backend-patterns.md`