workspace/projects/gamilit/apps/database/ddl/00-prerequisites.sql
rckrdmrd 608e1e2a2e
Some checks are pending
CI Pipeline / changes (push) Waiting to run
CI Pipeline / core (push) Blocked by required conditions
CI Pipeline / trading-backend (push) Blocked by required conditions
CI Pipeline / trading-data-service (push) Blocked by required conditions
CI Pipeline / trading-frontend (push) Blocked by required conditions
CI Pipeline / erp-core (push) Blocked by required conditions
CI Pipeline / erp-mecanicas (push) Blocked by required conditions
CI Pipeline / gamilit-backend (push) Blocked by required conditions
CI Pipeline / gamilit-frontend (push) Blocked by required conditions
Multi-project update: gamilit, orchestration, trading-platform
Gamilit:
- Backend: Teacher services, assignments, gamification, exercise submissions
- Frontend: Admin/Teacher/Student portals, module 4-5 mechanics, monitoring
- Database: DDL functions, seeds for dev/prod, auth/gamification schemas
- Docs: Architecture, features, guides cleanup and reorganization

Core/Orchestration:
- New workspace directives index
- Documentation directive

Trading-platform:
- Database seeds and inventory updates
- Tech leader validation report

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 07:17:46 -06:00

514 lines
26 KiB
PL/PgSQL

-- ============================================================================
-- GLIT Platform - Prerequisites (ENUMs y Funciones Base)
-- Descripción: Todos los tipos y funciones que deben existir ANTES de crear tablas
-- Creado: 2025-11-02
-- Actualizado: 2025-11-11 (DB-111 - Agregados roles estándar RLS)
-- ============================================================================
-- ============================================================================
-- ROLES ESTÁNDAR PARA RLS (Row Level Security)
-- ============================================================================
-- Nota: Estos roles son patrón estándar de la industria para RLS en PostgreSQL.
-- Se crean condicionalmente para que RLS policies funcionen correctamente.
DO $$ BEGIN
IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'authenticated') THEN
CREATE ROLE authenticated;
COMMENT ON ROLE authenticated IS 'Rol RLS: usuarios autenticados (cualquier rol GAMILIT)';
END IF;
END $$;
DO $$ BEGIN
IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'anon') THEN
CREATE ROLE anon;
COMMENT ON ROLE anon IS 'Rol RLS: usuarios anónimos (sin autenticar)';
END IF;
END $$;
DO $$ BEGIN
IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'service_role') THEN
CREATE ROLE service_role;
COMMENT ON ROLE service_role IS 'Rol RLS: servicio backend con privilegios elevados';
END IF;
END $$;
-- ============================================================================
-- EXTENSIONES REQUERIDAS
-- ============================================================================
-- pg_trgm: Similarity matching para fuzzy validation
-- Usado en validate_fill_in_blank y otros validadores con fuzzy_matching_threshold
-- Funciones: similarity(), word_similarity(), strict_word_similarity()
-- Documentación: https://www.postgresql.org/docs/current/pgtrgm.html
CREATE EXTENSION IF NOT EXISTS pg_trgm;
COMMENT ON EXTENSION pg_trgm IS 'Fuzzy string matching para validadores de ejercicios (similarity function)';
-- ============================================================================
-- SCHEMAS
-- ============================================================================
CREATE SCHEMA IF NOT EXISTS gamilit;
CREATE SCHEMA IF NOT EXISTS gamification_system;
CREATE SCHEMA IF NOT EXISTS auth;
CREATE SCHEMA IF NOT EXISTS auth_management;
CREATE SCHEMA IF NOT EXISTS system_configuration;
CREATE SCHEMA IF NOT EXISTS educational_content;
CREATE SCHEMA IF NOT EXISTS content_management;
CREATE SCHEMA IF NOT EXISTS social_features;
CREATE SCHEMA IF NOT EXISTS progress_tracking;
CREATE SCHEMA IF NOT EXISTS audit_logging;
CREATE SCHEMA IF NOT EXISTS admin_dashboard;
CREATE SCHEMA IF NOT EXISTS lti_integration;
CREATE SCHEMA IF NOT EXISTS notifications;
CREATE SCHEMA IF NOT EXISTS storage;
-- ============================================================================
-- PARTE 1: TODOS LOS ENUMs
-- ============================================================================
-- 1. ENUMs de Autenticación
-- 📚 Documentación: auth_management.gamilit_role
-- Requerimiento: docs/01-requerimientos/01-autenticacion-autorizacion/RF-AUTH-001-roles.md
-- Especificación: docs/02-especificaciones-tecnicas/01-autenticacion-autorizacion/ET-AUTH-001-rbac.md
DO $$ BEGIN
CREATE TYPE auth_management.gamilit_role AS ENUM ('student', 'admin_teacher', 'super_admin');
EXCEPTION WHEN duplicate_object THEN null; END $$;
-- 📚 Documentación: auth_management.user_status
-- Requerimiento: docs/01-requerimientos/01-autenticacion-autorizacion/RF-AUTH-002-estados-cuenta.md
-- Especificación: docs/02-especificaciones-tecnicas/01-autenticacion-autorizacion/ET-AUTH-002-estados-cuenta.md
-- VERSIÓN: 1.1 (2025-11-08) - Agregado 'banned'
DO $$ BEGIN
CREATE TYPE auth_management.user_status AS ENUM ('active', 'inactive', 'suspended', 'banned', 'pending');
EXCEPTION WHEN duplicate_object THEN null; END $$;
-- 📚 Documentación: auth_management.auth_provider
-- Requerimiento: docs/01-requerimientos/01-autenticacion-autorizacion/RF-AUTH-003-oauth.md
-- Especificación: docs/02-especificaciones-tecnicas/01-autenticacion-autorizacion/ET-AUTH-003-oauth.md
-- VERSIÓN: 1.1 (2025-11-08) - Migrado de public a auth_management
DO $$ BEGIN
CREATE TYPE auth_management.auth_provider AS ENUM ('local', 'google', 'facebook', 'apple', 'microsoft', 'github');
EXCEPTION WHEN duplicate_object THEN null; END $$;
-- 2. ENUMs de Gamificación
-- 📚 Documentación: gamification_system.maya_rank
-- Requerimiento: docs/01-requerimientos/02-gamificacion/RF-GAM-003-rangos-maya.md
-- Especificación: docs/02-especificaciones-tecnicas/02-gamificacion/ET-GAM-003-rangos-maya.md
-- NOTA: Debe estar en prerequisites porque educational_content.modules lo requiere
DO $$ BEGIN
CREATE TYPE gamification_system.maya_rank AS ENUM (
'Ajaw', -- Nivel 1: Señor o gobernante, líder supremo (0-999 XP)
'Nacom', -- Nivel 2: Capitán de guerra, comandante militar (1,000-2,999 XP)
'Ah K''in', -- Nivel 3: Sacerdote del sol, guía espiritual (3,000-5,999 XP)
'Halach Uinic', -- Nivel 4: Hombre verdadero, líder político (6,000-9,999 XP)
'K''uk''ulkan' -- Nivel 5: Serpiente emplumada, nivel legendario (10,000+ XP)
);
EXCEPTION WHEN duplicate_object THEN null; END $$;
-- 📚 Documentación: gamification_system.achievement_category
-- Requerimiento: docs/01-requerimientos/02-gamificacion/RF-GAM-001-achievements.md
-- Especificación: docs/02-especificaciones-tecnicas/02-gamificacion/ET-GAM-001-achievements.md
-- VERSIÓN: 1.1 (2025-12-15) - Agregados 'collection' y 'hidden' para alineación con Frontend
DO $$ BEGIN
CREATE TYPE gamification_system.achievement_category AS ENUM (
'progress', -- Logros de progreso general
'streak', -- Logros de rachas consecutivas
'completion', -- Logros de completar contenido
'social', -- Logros sociales (amigos, grupos)
'special', -- Logros especiales/eventos
'mastery', -- Logros de maestría/dominio
'exploration', -- Logros de exploración
'collection', -- Logros de colección (V1.1)
'hidden' -- Logros ocultos/secretos (V1.1)
);
EXCEPTION WHEN duplicate_object THEN null; END $$;
-- 📚 Documentación: gamification_system.achievement_type
-- Requerimiento: docs/01-requerimientos/02-gamificacion/RF-GAM-001-achievements.md
-- Especificación: docs/02-especificaciones-tecnicas/02-gamificacion/ET-GAM-001-achievements.md
DO $$ BEGIN
CREATE TYPE gamification_system.achievement_type AS ENUM ('badge', 'milestone', 'special', 'rank_promotion');
EXCEPTION WHEN duplicate_object THEN null; END $$;
-- 📚 Documentación: gamification_system.comodin_type
-- Requerimiento: docs/01-requerimientos/02-gamificacion/RF-GAM-002-comodines.md
-- Especificación: docs/02-especificaciones-tecnicas/02-gamificacion/ET-GAM-002-comodines.md
DO $$ BEGIN
CREATE TYPE gamification_system.comodin_type AS ENUM ('pistas', 'vision_lectora', 'segunda_oportunidad');
EXCEPTION WHEN duplicate_object THEN null; END $$;
-- 📚 Documentación: gamification_system.notification_type
-- REMOVIDO (2025-11-11): Migrado a ddl/schemas/gamification_system/enums/notification_type.sql
-- Razón: Evitar duplicación (Política de Carga Limpia)
-- El ENUM se define en el schema específico con documentación completa
-- 📚 Documentación: gamification_system.notification_priority
-- REMOVIDO (2025-11-11): Migrado a ddl/schemas/gamification_system/enums/notification_priority.sql
-- Razón: Evitar duplicación (Política de Carga Limpia)
-- El ENUM se define en el schema específico con documentación completa
-- 📚 Documentación: gamification_system.shop_item_category
-- Requerimiento: Sistema de tienda virtual con múltiples categorías de items
-- Especificación: Categorías: cosmetics, profile, guild, social, consumable
-- VERSIÓN: 1.0 (2025-11-29)
DO $$ BEGIN
CREATE TYPE gamification_system.shop_item_category AS ENUM (
'cosmetics', -- Cosméticos visuales (avatares, marcos, fondos)
'profile', -- Items de perfil (títulos, badges visuales)
'guild', -- Items de gremio (banderas, emblemas)
'social', -- Items sociales (emojis, stickers)
'consumable' -- Consumibles (boosts temporales, etc.)
);
EXCEPTION WHEN duplicate_object THEN null; END $$;
-- 3. ENUMs de Contenido Educativo
-- 📚 Documentación: educational_content.exercise_type (23 mecánicas principales)
-- Requerimiento: docs/01-requerimientos/03-contenido-educativo/RF-EDU-001-mecanicas-ejercicios.md
-- Especificación: docs/02-especificaciones-tecnicas/03-contenido-educativo/ET-EDU-001-mecanicas-ejercicios.md
-- UPDATED 2025-11-17: Sincronizado con seeds reales - Removidas mecánicas no implementadas
DO $$ BEGIN
CREATE TYPE educational_content.exercise_type AS ENUM (
-- ====================================================================
-- MÓDULOS IMPLEMENTADOS (17 mecánicas) - AUTO-EVALUABLES
-- ====================================================================
-- Module 1: Comprensión Literal (7 mecánicas) ✅ IMPLEMENTADO
'completar_espacios', 'crucigrama', 'emparejamiento', 'linea_tiempo', 'mapa_conceptual', 'sopa_letras', 'verdadero_falso',
-- Module 2: Comprensión Inferencial (5 mecánicas) ✅ IMPLEMENTADO
'construccion_hipotesis', 'detective_textual', 'prediccion_narrativa', 'puzzle_contexto', 'rueda_inferencias',
-- Module 3: Comprensión Crítica (5 mecánicas) ✅ IMPLEMENTADO
'analisis_fuentes', 'debate_digital', 'matriz_perspectivas', 'podcast_argumentativo', 'tribunal_opiniones',
-- ====================================================================
-- ⚠️ BACKLOG: FASE 4 (8 mecánicas) - EVALUACIÓN MANUAL/IA REQUERIDA
-- ====================================================================
-- Razón: Requieren validación con IA o evaluación manual
-- Estado: Tipos definidos (compatibilidad futura), seeds en _backlog/
-- Roadmap: docs/04-fase-backlog/
-- Fecha: Movido a backlog 2025-11-19 (DB-126)
-- Module 4: Lectura Digital (9 mecánicas) ⚠️ BACKLOG
-- Requieren: Validación de fuentes, análisis de imágenes, IA multimodal
'analisis_memes', 'infografia_interactiva', 'navegacion_hipertextual', 'quiz_tiktok', 'verificador_fake_news',
-- Module 4: Producción Textual Digital (4 mecánicas adicionales) - AGREGADO 2025-12-18
'chat_literario', 'email_formal', 'ensayo_argumentativo', 'resena_critica',
-- Module 5: Producción Lectora (3 mecánicas) ⚠️ BACKLOG
-- Requieren: Rúbricas de evaluación creativa, revisión humana/IA
'comic_digital', 'diario_multimedia', 'video_carta'
-- ====================================================================
-- ACTUALIZADO 2025-12-18: Agregados 4 tipos M4 previamente comentados
-- ====================================================================
-- Auxiliares potenciales: 'comprension_auditiva', 'collage_prensa', 'texto_movimiento', 'call_to_action'
);
EXCEPTION WHEN duplicate_object THEN null; END $$;
-- 📚 Documentación: educational_content.difficulty_level
-- REMOVIDO (2025-11-11): Migrado a ddl/schemas/educational_content/enums/difficulty_level.sql
-- Razón: Evitar duplicación (Política de Carga Limpia)
-- El ENUM se define en el schema específico con documentación completa (8 niveles CEFR)
-- 📚 Documentación: educational_content.module_status
-- VERSIÓN: 1.2 (2025-11-23) - Agregado 'backlog' para módulos fuera de alcance de entrega
-- VERSIÓN: 1.1 (2025-11-08) - Renombrado 'reviewing' a 'under_review'
-- Estados:
-- - draft: Módulo en borrador, no publicado
-- - published: Módulo publicado y disponible para estudiantes
-- - archived: Módulo archivado, no visible
-- - under_review: Módulo en revisión pedagógica
-- - backlog: Módulo diseñado pero fuera de alcance de entrega actual (visible con mensaje "En Construcción")
DO $$ BEGIN
CREATE TYPE educational_content.module_status AS ENUM ('draft', 'published', 'archived', 'under_review', 'backlog');
EXCEPTION WHEN duplicate_object THEN null; END $$;
-- 📚 Documentación: content_management.content_status
-- REMOVIDO (2025-11-11): Migrado a ddl/schemas/content_management/enums/content_status.sql
-- Razón: Evitar duplicación (Política de Carga Limpia)
-- El ENUM se define en el schema específico con documentación completa
DO $$ BEGIN
CREATE TYPE educational_content.cognitive_level AS ENUM ('recordar', 'comprender', 'aplicar', 'analizar', 'evaluar', 'crear');
EXCEPTION WHEN duplicate_object THEN null; END $$;
-- 📚 Documentación: content_management.media_type
-- Requerimiento: docs/01-requerimientos/07-contenido-media/RF-CNT-001-gestion-media.md
-- Especificación: docs/02-especificaciones-tecnicas/07-contenido-media/ET-CNT-001-gestion-media.md
-- VERSIÓN: 1.1 (2025-11-08) - Migrado de public a content_management
DO $$ BEGIN
CREATE TYPE content_management.media_type AS ENUM ('image', 'video', 'audio', 'document', 'interactive');
EXCEPTION WHEN duplicate_object THEN null; END $$;
-- 📚 Documentación: content_management.processing_status
-- Requerimiento: docs/01-requerimientos/07-contenido-media/RF-CNT-001-gestion-media.md
-- Especificación: docs/02-especificaciones-tecnicas/07-contenido-media/ET-CNT-001-gestion-media.md
-- VERSIÓN: 1.2 (2025-11-11) - Sincronizado con Backend/Frontend (DB-093 aplicado)
-- Valores actualizados para procesamiento de media: uploading, processing, ready, error, optimizing
DO $$ BEGIN
CREATE TYPE content_management.processing_status AS ENUM ('uploading', 'processing', 'ready', 'error', 'optimizing');
EXCEPTION WHEN duplicate_object THEN null; END $$;
-- 4. ENUMs de Progreso
-- 📚 Documentación: progress_tracking.progress_status
-- REMOVIDO (2025-11-11): Migrado a ddl/schemas/progress_tracking/enums/progress_status.sql
-- Razón: Evitar duplicación (Política de Carga Limpia)
-- El ENUM se define en el schema específico con documentación exhaustiva (112 líneas)
-- 📚 Documentación: progress_tracking.attempt_status
-- Requerimiento: docs/01-requerimientos/04-progreso-seguimiento/RF-PRG-001-estados-progreso.md
-- Especificación: docs/02-especificaciones-tecnicas/04-progreso-seguimiento/ET-PRG-001-estados-progreso.md
DO $$ BEGIN
CREATE TYPE progress_tracking.attempt_status AS ENUM ('in_progress', 'submitted', 'graded', 'reviewed');
EXCEPTION WHEN duplicate_object THEN null; END $$;
-- 5. ENUMs de Social
-- 📚 Documentación: social_features.classroom_role
-- Requerimiento: docs/01-requerimientos/05-caracteristicas-sociales/RF-SOC-001-aulas-virtuales.md
-- Especificación: docs/02-especificaciones-tecnicas/05-caracteristicas-sociales/ET-SOC-001-aulas-virtuales.md
DO $$ BEGIN
CREATE TYPE social_features.classroom_role AS ENUM ('teacher', 'student', 'assistant');
EXCEPTION WHEN duplicate_object THEN null; END $$;
DO $$ BEGIN
CREATE TYPE social_features.team_role AS ENUM ('leader', 'member', 'coordinator');
EXCEPTION WHEN duplicate_object THEN null; END $$;
DO $$ BEGIN
CREATE TYPE social_features.friendship_status AS ENUM ('pending', 'accepted', 'blocked');
EXCEPTION WHEN duplicate_object THEN null; END $$;
-- 6. ENUMs de Configuración
-- 📚 Documentación: system_configuration.setting_type
-- VERSIÓN: 1.1 (2025-11-08) - Migrado de public a system_configuration
DO $$ BEGIN
CREATE TYPE system_configuration.setting_type AS ENUM ('string', 'number', 'boolean', 'json', 'array');
EXCEPTION WHEN duplicate_object THEN null; END $$;
-- 📚 Documentación: audit_logging.log_level
-- Requerimiento: docs/01-requerimientos/08-auditoria-configuracion/RF-AUD-001-sistema-auditoria.md
-- Especificación: docs/02-especificaciones-tecnicas/08-auditoria-configuracion/ET-AUD-001-sistema-auditoria.md
DO $$ BEGIN
CREATE TYPE audit_logging.log_level AS ENUM ('debug', 'info', 'warning', 'error', 'critical');
EXCEPTION WHEN duplicate_object THEN null; END $$;
-- 7. ENUMs de Auditoría
-- 📚 Documentación: audit_logging.audit_action
-- Requerimiento: docs/01-requerimientos/08-auditoria-configuracion/RF-AUD-001-sistema-auditoria.md
-- Especificación: docs/02-especificaciones-tecnicas/08-auditoria-configuracion/ET-AUD-001-sistema-auditoria.md
DO $$ BEGIN
CREATE TYPE audit_logging.audit_action AS ENUM ('create', 'update', 'delete', 'login', 'logout', 'access', 'export', 'import');
EXCEPTION WHEN duplicate_object THEN null; END $$;
DO $$ BEGIN
CREATE TYPE audit_logging.alert_severity AS ENUM ('info', 'warning', 'error', 'critical');
EXCEPTION WHEN duplicate_object THEN null; END $$;
DO $$ BEGIN
CREATE TYPE audit_logging.alert_status AS ENUM ('active', 'acknowledged', 'resolved', 'ignored');
EXCEPTION WHEN duplicate_object THEN null; END $$;
-- ============================================================================
-- PARTE 2: FUNCIONES UTILITARIAS DEL SCHEMA gamilit
-- ============================================================================
-- Función: now_mexico
CREATE OR REPLACE FUNCTION gamilit.now_mexico()
RETURNS timestamp with time zone
LANGUAGE sql STABLE
AS $$
SELECT CURRENT_TIMESTAMP AT TIME ZONE 'America/Mexico_City';
$$;
COMMENT ON FUNCTION gamilit.now_mexico() IS 'Retorna timestamp actual en zona horaria de México';
-- Función: update_updated_at_column (trigger genérico)
CREATE OR REPLACE FUNCTION gamilit.update_updated_at_column()
RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
NEW.updated_at = gamilit.now_mexico();
RETURN NEW;
END;
$$;
COMMENT ON FUNCTION gamilit.update_updated_at_column() IS 'Trigger function para actualizar updated_at';
-- Función: get_current_user_role (placeholder)
CREATE OR REPLACE FUNCTION gamilit.get_current_user_role()
RETURNS auth_management.gamilit_role
LANGUAGE sql STABLE
AS $$
SELECT 'student'::auth_management.gamilit_role;
$$;
COMMENT ON FUNCTION gamilit.get_current_user_role() IS 'Retorna el rol del usuario actual (placeholder)';
-- Función: get_current_user_id (placeholder)
CREATE OR REPLACE FUNCTION gamilit.get_current_user_id()
RETURNS uuid
LANGUAGE sql STABLE
AS $$
SELECT NULL::uuid;
$$;
COMMENT ON FUNCTION gamilit.get_current_user_id() IS 'Retorna el ID del usuario actual (placeholder)';
-- Función: get_current_tenant_id (placeholder)
CREATE OR REPLACE FUNCTION gamilit.get_current_tenant_id()
RETURNS uuid
LANGUAGE sql STABLE
AS $$
SELECT NULL::uuid;
$$;
COMMENT ON FUNCTION gamilit.get_current_tenant_id() IS 'Retorna el ID del tenant actual (placeholder)';
-- Función: is_admin
CREATE OR REPLACE FUNCTION gamilit.is_admin()
RETURNS boolean
LANGUAGE sql STABLE
AS $$
SELECT gamilit.get_current_user_role() IN ('admin_teacher', 'super_admin');
$$;
COMMENT ON FUNCTION gamilit.is_admin() IS 'Verifica si el usuario actual es administrador';
-- Función: audit_profile_changes (trigger)
CREATE OR REPLACE FUNCTION gamilit.audit_profile_changes()
RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
-- Placeholder para auditoría de cambios en perfiles
-- Se implementará con lógica real de auditoría
RETURN NEW;
END;
$$;
COMMENT ON FUNCTION gamilit.audit_profile_changes() IS 'Trigger para auditar cambios en perfiles (placeholder)';
-- Función: initialize_user_stats (trigger)
CREATE OR REPLACE FUNCTION gamilit.initialize_user_stats()
RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
-- Placeholder para inicializar stats de gamificación
-- Inserta registros en gamification_system.user_stats
-- Se implementará con lógica real
RETURN NEW;
END;
$$;
COMMENT ON FUNCTION gamilit.initialize_user_stats() IS 'Trigger para inicializar stats de usuario (placeholder)';
-- Función: update_user_stats_on_exercise_complete (trigger)
CREATE OR REPLACE FUNCTION gamilit.update_user_stats_on_exercise_complete()
RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
-- Placeholder para actualizar stats al completar ejercicio
-- Actualiza puntos, XP, streak, etc. en gamification_system.user_stats
-- Se implementará con lógica real
RETURN NEW;
END;
$$;
COMMENT ON FUNCTION gamilit.update_user_stats_on_exercise_complete() IS 'Trigger para actualizar stats al completar ejercicio (placeholder)';
-- Función: update_classroom_member_count (trigger)
CREATE OR REPLACE FUNCTION gamilit.update_classroom_member_count()
RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
-- Placeholder para actualizar contador de miembros en classroom
-- Actualiza member_count en social_features.classrooms
-- Se implementará con lógica real
RETURN NEW;
END;
$$;
COMMENT ON FUNCTION gamilit.update_classroom_member_count() IS 'Trigger para actualizar contador de miembros en classroom (placeholder)';
-- ============================================================================
-- PARTE 3: FUNCIONES DEL SCHEMA gamification_system
-- ============================================================================
-- Función: update_missions_updated_at (trigger)
CREATE OR REPLACE FUNCTION gamification_system.update_missions_updated_at()
RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
NEW.updated_at = gamilit.now_mexico();
RETURN NEW;
END;
$$;
COMMENT ON FUNCTION gamification_system.update_missions_updated_at() IS 'Trigger para actualizar updated_at en missions';
-- Función: update_notifications_updated_at (trigger)
CREATE OR REPLACE FUNCTION gamification_system.update_notifications_updated_at()
RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
NEW.updated_at = gamilit.now_mexico();
RETURN NEW;
END;
$$;
COMMENT ON FUNCTION gamification_system.update_notifications_updated_at() IS 'Trigger para actualizar updated_at en notifications';
-- ============================================================================
-- COMENTARIOS EN TIPOS
-- ============================================================================
-- 1. Autenticación
COMMENT ON TYPE auth_management.gamilit_role IS 'Roles de usuario en la plataforma (v1.0)';
COMMENT ON TYPE auth_management.user_status IS 'Estados de cuenta de usuario (v1.1 - 2025-11-08 - agregado banned)';
COMMENT ON TYPE auth_management.auth_provider IS 'Proveedores de autenticación OAuth2/OIDC (v1.1 - 2025-11-08 - migrado de public)';
-- 2. Gamificación
-- COMMENT for maya_rank is in gamification_system/enums/maya_rank.sql
COMMENT ON TYPE gamification_system.achievement_category IS 'Categorías de logros para gamificación (v1.0)';
COMMENT ON TYPE gamification_system.achievement_type IS 'Tipos de logros disponibles (badge, milestone, special, rank_promotion) (v1.0)';
COMMENT ON TYPE gamification_system.comodin_type IS 'Tipos de comodines/power-ups (pistas, vision_lectora, segunda_oportunidad) (v1.0)';
COMMENT ON TYPE gamification_system.shop_item_category IS 'Categorías de items de la tienda: cosmetics, profile, guild, social, consumable (v1.0 - 2025-11-29)';
-- NOTA (2025-11-11): Los siguientes comentarios están en los archivos de ENUM correspondientes
-- notification_type se crea en FASE 7: gamification_system/enums/notification_type.sql
-- notification_priority se crea en FASE 7: gamification_system/enums/notification_priority.sql
-- COMMENT ON TYPE gamification_system.notification_type IS 'Tipos de notificaciones del sistema (v2.0 - 2025-11-08 - migrado de public)';
-- COMMENT ON TYPE gamification_system.notification_priority IS 'Niveles de prioridad de notificaciones (v1.1 - 2025-11-08 - migrado de public)';
-- 3. Contenido Educativo
COMMENT ON TYPE educational_content.exercise_type IS '25 mecánicas de ejercicios interactivos Gamilit (17 implementadas + 8 backlog) (v2.1 - 2025-11-28 - agregados mapa_conceptual y emparejamiento)';
-- NOTA (2025-11-11): El siguiente comentario está en el archivo de ENUM correspondiente
-- difficulty_level se crea en FASE 6: educational_content/enums/difficulty_level.sql
-- COMMENT ON TYPE educational_content.difficulty_level IS 'Niveles de dificultad CEFR - 8 niveles A1→C2+ (v2.0 - 2025-11-11 - migrado a estándar CEFR)';
COMMENT ON TYPE educational_content.module_status IS 'Estados del ciclo de vida de módulos educativos (v1.1 - 2025-11-08)';
COMMENT ON TYPE educational_content.cognitive_level IS 'Niveles cognitivos de Bloom para objetivos de aprendizaje (v1.0)';
-- 4. Gestión de Contenido
COMMENT ON TYPE content_management.content_status IS 'Estados del ciclo de vida del contenido (v1.1 - 2025-11-08 - migrado de public)';
COMMENT ON TYPE content_management.media_type IS 'Tipos de archivos multimedia soportados (v1.1 - 2025-11-08 - migrado de public)';
COMMENT ON TYPE content_management.processing_status IS 'Estados de procesamiento de archivos multimedia (v1.1 - 2025-11-08 - migrado de public)';
-- 5. Progreso y Tracking
COMMENT ON TYPE progress_tracking.progress_status IS 'Estados de progreso del estudiante: not_started, in_progress, completed, needs_review, mastered, abandoned (v1.1 - 2025-11-08 - agregados mastered y abandoned)';
COMMENT ON TYPE progress_tracking.attempt_status IS 'Estados de intentos de ejercicios (v1.0)';
-- 6. Características Sociales
COMMENT ON TYPE social_features.classroom_role IS 'Roles dentro de un aula virtual (teacher, student, assistant) (v1.0)';
COMMENT ON TYPE social_features.team_role IS 'Roles dentro de un equipo/guild (leader, member, coordinator) (v1.0)';
COMMENT ON TYPE social_features.friendship_status IS 'Estados de solicitudes de amistad (pending, accepted, blocked) (v1.0)';
-- 7. Configuración del Sistema
COMMENT ON TYPE system_configuration.setting_type IS 'Tipos de datos para configuraciones del sistema (v1.1 - 2025-11-08 - migrado de public)';
-- 8. Auditoría
COMMENT ON TYPE audit_logging.log_level IS 'Niveles de severidad de logs del sistema (v1.0)';
COMMENT ON TYPE audit_logging.audit_action IS 'Tipos de acciones auditables en el sistema (v1.0)';
COMMENT ON TYPE audit_logging.alert_severity IS 'Niveles de severidad de alertas (v1.0)';
COMMENT ON TYPE audit_logging.alert_status IS 'Estados de alertas del sistema (v1.0)';