# Database - GAMILIT

Proyecto de base de datos PostgreSQL para la plataforma GAMILIT

## Estructura

```
apps/database/
├── ddl/                     # Definiciones DDL (schemas, tablas, funciones, etc.)
│   ├── 00-prerequisites.sql # Schemas + ENUMs base (ejecutar primero)
│   └── schemas/             # 14 schemas con todos los objetos
├── scripts/                 # Scripts operacionales
│   ├── init-database.sh     # Inicializar BD completa
│   ├── recreate-database.sh # Recrear BD desde cero
│   ├── reset-database.sh    # Reset BD manteniendo usuario
│   ├── inventory/           # Scripts para generar inventarios
│   └── ...                  # Otros scripts de gestión
├── seeds/                   # Datos iniciales por ambiente
│   ├── dev/                 # Datos de desarrollo
│   ├── staging/             # Datos de staging
│   └── prod/                # Datos de producción
├── _deprecated/             # Archivos obsoletos (histórico)
└── create-database.sh       # Script maestro de creación
```

## Quick Start

### Opción 1: Crear Base de Datos Nueva (Recomendado)

```bash
# Configurar DATABASE_URL
export DATABASE_URL="postgresql://usuario:password@localhost:5432/gamilit"

# Ejecutar script maestro
./create-database.sh
```

### Opción 2: Inicializar con Usuario y Seeds

```bash
# Desarrollo
./scripts/init-database.sh --env dev

# Producción
./scripts/init-database.sh --env prod
```

### Opción 3: Drop y Recrear (Testing de Carga Limpia) ⭐ VALIDADO DB-111

```bash
# ADVERTENCIA: Elimina TODOS los datos
# Para testing de carga limpia desde cero (drop + create automático)
export DATABASE_URL="postgresql://usuario:password@localhost:5432/gamilit_db"

# Ejecuta drop, recreate y create-database en un solo comando
./drop-and-recreate-database.sh
```

**Características (v2.3.7 - DB-111):**
- ✅ Desconecta automáticamente usuarios activos
- ✅ DROP DATABASE completo
- ✅ CREATE DATABASE automático
- ✅ Ejecuta create-database.sh automáticamente
- ✅ Carga 32 seeds PROD (100% de válidos)
- ✅ Reporta éxito/error con códigos de salida

**Validado:** DB-111 (2025-11-11) - Scripts 100% funcionales

### Opción 4: Recrear con Seeds

```bash
# ADVERTENCIA: Elimina TODOS los datos
./scripts/recreate-database.sh --env dev
```

## Orden de Ejecución DDL

El script `create-database.sh` ejecuta los archivos DDL en este orden:

1. **Prerequisites** - Schemas y ENUMs base
2. **Gamilit Schema** - Funciones y vistas compartidas (utilities)
3. **Auth Schema** - Autenticación Supabase
4. **Storage Schema** - Storage Supabase
5. **Auth Management** - Gestión de usuarios
6. **Educational Content** - Contenido educativo
7. **Gamification System** - Sistema de gamificación
8. **Progress Tracking** - Seguimiento de progreso
9. **Social Features** - Características sociales
9.5. **FK Constraints Diferidos** - Resolución de dependencias circulares
9.7. **Notifications** - Sistema de notificaciones multi-canal ⭐ NUEVO
10. **Content Management** - Gestión de contenido
11. **Audit Logging** - Auditoría
12. **System Configuration** - Configuración
13. **Admin Dashboard** - Dashboard administrativo (vistas analíticas)
14. **LTI Integration** - Learning Tools Interoperability 1.3
15. **Public Schema** - Deshabilitado (reservado para PostgreSQL core)
16. **Seed Data** - Carga de datos iniciales de producción (34 archivos PROD) ⭐ ACTUALIZADO 2025-11-18

## Documentación Completa

La documentación detallada del proyecto de base de datos está en:

- **Inventarios de objetos DB**: `docs/90-transversal/inventarios-database/`
- **Guía de creación**: `docs/95-guias-desarrollo/GUIA-CREAR-BASE-DATOS.md`
- **Guía de referencias**: `docs/95-guias-desarrollo/GUIA-REFERENCIAS-SIMCO.md`
- **Guía de carga de usuarios**: `docs/GUIA-CARGA-USUARIOS-Y-PERFILES.md` ⭐ NUEVO
- **CHANGELOG de Database**: `docs/database/CHANGELOG.md` ⭐ NUEVO (2025-11-24)
- **Funciones Gamilit**: `ddl/schemas/gamilit/functions/README.md` ⭐ NUEVO (2025-11-24)

## Flujo de Registro de Usuario ⭐ NUEVO

### Inicialización Automática de Gamificación

Al crear un nuevo usuario, el sistema inicializa automáticamente las estadísticas de gamificación mediante el trigger `initialize_user_stats()`.

**Trigger:** `auth_management.profiles.trg_initialize_user_stats`
**Función:** `gamilit.initialize_user_stats()`
**Evento:** AFTER INSERT en `auth_management.profiles`

**Tablas Inicializadas (4):**

| Tabla | Propósito | Valores Iniciales |
|-------|-----------|-------------------|
| `gamification_system.user_stats` | Estadísticas XP/ML Coins | 100 ML Coins (bono bienvenida) |
| `gamification_system.comodines_inventory` | Inventario de comodines | Vacío (0 de cada tipo) |
| `gamification_system.user_ranks` | Rango Maya | Ajaw (nivel inicial) |
| `progress_tracking.module_progress` | Progreso de módulos | not_started, 0% para todos los módulos publicados |

**Flujo Completo:**

```
1. Backend: INSERT auth.users (email, password_hash)
2. Backend: INSERT auth_management.profiles (user_id, role, tenant_id)
3. Trigger: trg_initialize_user_stats se dispara automáticamente
4. Función: initialize_user_stats() ejecuta 4 INSERT en paralelo
5. Usuario listo con gamificación completa
```

**Roles con Gamificación:**
- `student` - Estudiantes (gamificación completa)
- `admin_teacher` - Maestros (gamificación completa)
- `super_admin` - Administradores (gamificación completa)

**Documentación Detallada:**
- Ver: `ddl/schemas/gamilit/functions/README.md` - Sección "initialize_user_stats()"
- Ver: `docs/database/CHANGELOG.md` - [2.5.2] 2025-11-24 (5 bug fixes)

---

## Usuarios de Prueba

Para cargar usuarios de prueba en ambientes de desarrollo/staging:

```bash
# Opción 1: Cargar usuarios automáticamente (recomendado)
./scripts/load-users-and-profiles.sh

# Opción 2: Verificar usuarios existentes
./scripts/verify-users.sh

```

**Credenciales disponibles después de la carga:**

| Tipo | Email | Password | Cantidad |
|------|-------|----------|----------|
| Super Admin | admin@gamilit.com | Test1234 | 2 |
| Teacher | teacher@gamilit.com | Test1234 | 2 |
| Student | student@gamilit.com | Test1234 | 4 |

**Total:** 8 usuarios de prueba

📖 **Documentación completa:** Ver `docs/GUIA-CARGA-USUARIOS-Y-PERFILES.md` para detalles sobre problemas conocidos y soluciones.

## Scripts Disponibles

### Gestión de Base de Datos

| Script | Descripción |
|--------|-------------|
| `create-database.sh` | Crea BD nueva ejecutando todos los DDL |
| `init-database.sh` | Inicializa BD con usuario y seeds |
| `recreate-database.sh` | Elimina y recrea BD completamente |
| `reset-database.sh` | Reset BD manteniendo usuario |
| `manage-secrets.sh` | Gestión de credenciales |
| `update-env-files.sh` | Actualiza archivos .env |

### Usuarios y Perfiles ⭐ NUEVO

| Script | Descripción |
|--------|-------------|
| `load-users-and-profiles.sh` | Carga usuarios y perfiles de prueba (8 usuarios) |
| `verify-users.sh` | Verifica usuarios y perfiles cargados |

### Inventarios y Utilidades

| Script | Descripción |
|--------|-------------|
| `inventory/list-tables.sh` | Lista todas las tablas |
| `inventory/list-enums.sh` | Lista todos los ENUMs |
| `inventory/list-functions.sh` | Lista todas las funciones |
| `inventory/generate-all-inventories.sh` | Genera todos los inventarios |

Ver más detalles en [scripts/README.md](scripts/README.md)

## Política de Carga Limpia

Este proyecto utiliza **Política de Carga Limpia** (Clean Load Policy):

- ✅ **DDL es la fuente de verdad** - Todos los cambios se realizan en archivos DDL
- ✅ **Sin migrations** - No se utilizan scripts de migración incremental
- ✅ **Recreación completa** - La BD se puede recrear desde cero en cualquier momento

Para más detalles, consultar: `orchestration/directivas/DIRECTIVA-POLITICA-CARGA-LIMPIA.md`

**Referencia:** [ADR-018 - Eliminación de Carpetas Migrations](docs/97-adr/ADR-018-removal-migrations-folders.md)

## Seeds ⭐ VALIDADO Y COMPLETADO DB-111

Los seeds están organizados por ambiente:

- **dev/**: Datos completos de desarrollo (usuarios demo, ejercicios, etc.)
- **staging/**: Datos de staging
- **prod/**: **32 archivos validados** (100% de seeds válidos) - 27 ejercicios educativos

### Seeds de Producción Detallados (v2.3.7 - DB-111)

**Estado:** ✅ 100% de cobertura - Todos los schemas tienen seeds necesarios

**Estructura por schema:**

| Schema | Archivos | Contenido | Estado |
|--------|----------|-----------|--------|
| `audit_logging/` | 1 archivo | Configuración por defecto | ✅ Agregado DB-111 |
| `auth/` | 1 archivo | Usuarios testing y demo | ✅ Validado |
| `auth_management/` | 3 archivos | Tenants, providers, 26 perfiles | ✅ Validado |
| `content_management/` | 1 archivo | Templates de contenido | ✅ Agregado DB-111 |
| `educational_content/` | 8 archivos | 5 módulos + 27 ejercicios + rubrics | ✅ Validado |
| `gamification_system/` | 9 archivos | Categorías, leaderboards, rangos Maya, achievements | ✅ Validado |
| `lti_integration/` | 1 archivo | Consumidores LTI | ✅ Agregado DB-111 |
| `progress_tracking/` | 1 archivo | Progreso inicial de módulos | ✅ Agregado DB-111 |
| `social_features/` | 3 archivos | Escuelas, aulas, miembros demo | ✅ Agregado DB-111 |
| `system_configuration/` | 4 archivos | Settings, flags, notificaciones, rate limits | ✅ Completado DB-111 |

**Total:** 32 seeds PROD ejecutándose (100% de válidos)

**Seeds Legacy (deprecated):**
- `auth_management/03-profiles.sql` → Reemplazado por `04-profiles-complete.sql` (v2.0)

**Ejercicios por módulo:**
- **Module 1** (Historiador Detective): 5 mecánicas con JSONB completo ✅ IMPLEMENTADO
- **Module 2** (Detective Textual): 5 mecánicas con análisis de textos ✅ IMPLEMENTADO
- **Module 3** (Científico Pensamiento Crítico): 5 mecánicas con evaluación ✅ IMPLEMENTADO
- **Module 4** (Creador Digital): 5 mecánicas con producción multimedia ⚠️ BACKLOG
- **Module 5** (Video Carta): 3 mecánicas con producción creativa ⚠️ BACKLOG

**Nota:** Módulos 4 y 5 están en backlog (ver sección "Módulos en Backlog" más abajo)

## Correcciones Aplicadas

### v2.3.7 - Validación y Seeds Completos (2025-11-11) 🆕 DB-111

**Estado:** ✅ Validación exhaustiva + 100% seeds PROD

#### Validación y Corrección de Documentación (FASE 1.7)

**Problema:** Discrepancias entre documentación y DDL físico

**Correcciones aplicadas:**

1. **DATABASE_INVENTORY.yml** - 7 propiedades corregidas
   - ✅ content_management: `tables: 6 → 8`
   - ✅ content_management: `functions: 3 → 0` (no existe directorio)
   - ✅ content_management: `triggers: 2 → 3`
   - ✅ content_management: `indexes: 4 → 2`
   - ✅ content_management: `rls_policies: 2 → 1`
   - ✅ Agregada lista explícita de 8 tablas

2. **CONTENT_MANAGEMENT_TRACEABILITY.yml** - Trazabilidad completa
   - ✅ Eliminadas 3 "tablas fantasma" (no existían físicamente)
   - ✅ Agregadas 3 tablas no documentadas:
     - `content_authors.sql` (12 columnas, 5 índices)
     - `content_categories.sql` (jerárquica, self-referential)
     - `media_metadata.sql`
   - ✅ 8 tablas completas documentadas con todos sus atributos

**Resultado:** ✅ 100% sincronización DDL ↔ Documentación

#### Seeds PROD Completos (FASE 1.8)

**Problema:** 9 seeds PROD (27%) no ejecutándose en create-database.sh

**Correcciones aplicadas:**

3. **Seed Legacy Identificado:**
   - ✅ `03-profiles.sql` (v1.0) movido a `_deprecated/`
   - ✅ Reemplazado por `04-profiles-complete.sql` (v2.0, 26 perfiles)

4. **8 Seeds Agregados a create-database.sh:**
   - ✅ `audit_logging/01-default-config.sql`
   - ✅ `system_configuration/04-rate_limits.sql`
   - ✅ `content_management/01-default-templates.sql`
   - ✅ `social_features/01-schools.sql`
   - ✅ `social_features/02-classrooms.sql`
   - ✅ `social_features/03-classroom-members.sql`
   - ✅ `progress_tracking/01-module_progress.sql`
   - ✅ `lti_integration/01-lti_consumers.sql`

**Resultado:**
- ✅ Seeds ejecutados: 24 → 32 (100% de válidos)
- ✅ 10 schemas con 100% cobertura
- ✅ Orden de dependencias validado

**Documentación:** Ver `orchestration/database/DB-111/` para reportes completos

---

### v2.3.5 - Seeds Gamification UTF-8 + UUIDs Fixed (2025-11-11) 🆕

**Estado:** ✅ DB-100 completado

#### Problemas Corregidos:

**1. Encoding UTF-8 (P0):**
- ✅ `seeds/prod/gamification_system/07-ml_coins_transactions.sql` - Convertido a UTF-8
- ✅ `seeds/prod/gamification_system/08-user_achievements.sql` - Convertido a UTF-8
- ✅ `seeds/prod/gamification_system/09-comodines_inventory.sql` - Convertido a UTF-8
- **Problema resuelto:** Caracteres especiales (ó, ñ, á, é, í) corruptos → UTF-8 válido
- **Resultado:** 0 errores de encoding en ejecución

**2. UUIDs Inválidos (P0):**
- ✅ 5 UUIDs inválidos reemplazados con válidos
- **UUIDs corregidos:** Caracteres no-hexadecimales (g, h, i) reemplazados
- **Archivos:** 08-user_achievements.sql (5 UUIDs), 09-comodines_inventory.sql (5 UUIDs)
- **Resultado:** 0 errores de UUID en ejecución

**3. Validación Completa:**
- ✅ create-database.sh ejecuta 100% sin errores de encoding/UUIDs
- ✅ 16/16 fases completadas
- ✅ Seeds gamification técnicamente correctos (sin errores de sintaxis)

**Documentación:**
- 📄 Ver `orchestration/database/DB-100/` para detalles completos
- 📄 Ver `orchestration/TRAZA-TAREAS-DATABASE.md` (DB-098, DB-099, DB-100)

---

### v2.3.2 - Seeds Production-Ready + Modelo JSONB Puro (2025-11-11)

**Estado:** ✅ Fase 1-2 completadas (DB-095, DB-096)

#### Fase 1: Correcciones P0 - Seeds Production-Ready

**1. Expansión Module 5 (CORR-001):**
- ✅ `seeds/prod/educational_content/06-exercises-module5.sql`
- **Cambio:** 97 líneas → 835 líneas (+861%)
- **Contenido agregado:**
  - 3 templates completos (Diario, Científico, Carta)
  - 5 prompts detallados por ejercicio
  - 4 rúbricas de evaluación con criterios y pesos
  - JSONB estructura completa para producción creativa

**2. Migración Seeds DEV → PROD (CORR-002):**
- ✅ Creados 5 archivos nuevos de exercises:
  - `02-exercises-module1.sql` (6 mecánicas)
  - `03-exercises-module2.sql` (5 mecánicas)
  - `04-exercises-module3.sql` (6 mecánicas)
  - `05-exercises-module4.sql` (5 mecánicas)
  - `06-exercises-module5.sql` (5 mecánicas)
- **Total:** 27 ejercicios listos para producción
- **Incremento:** 10 ejercicios → 27 ejercicios (+170%)
- **Completitud:** 36% → 100% (+64 puntos)

**3. Eliminación Modelo Dual (CORR-003):**
- ✅ Removidas tablas legacy `assignment_answers` y `assignment_resources`
- ✅ Consolidado en modelo JSONB puro
- **Decisión arquitectónica:** Mantener flexibilidad JSONB sin normalización
- **Resultado:** Reducción de 16 → 14 tablas en educational_content

#### Fase 2: Actualización de Inventarios

**4. DATABASE_INVENTORY.yml actualizado (CORR-004):**
- ✅ seeds_produccion: 31 → 33 archivos
- ✅ educational_content.tables: 16 → 14 (eliminadas 2 legacy)
- ✅ Métricas actualizadas al 2025-11-11

**5. SEEDS_INVENTORY.yml creado (CORR-005):**
- ✅ Archivo NUEVO: 650+ líneas
- ✅ 67 seeds documentados (DEV + PROD)
- ✅ Metadata completa: líneas, registros, dependencias
- ✅ Grupos lógicos por schema y propósito

**Documentación:**
- 📄 Ver `orchestration/TRAZA-CORRECCIONES.md` para detalles completos
- 📄 Ver `orchestration/TRAZA-TAREAS-DATABASE.md` (DB-095, DB-096)
- 📄 Ver `orchestration/04-inventarios/database/SEEDS_INVENTORY.yml`

---

## 📦 Módulos en Backlog (Fase 4)

**Fecha:** 2025-11-19 (DB-126)
**Estado:** BACKLOG - Evaluación manual/IA requerida

Los siguientes módulos están definidos en la estructura de datos pero marcados como **BACKLOG** (Fase 4) por requerir evaluación manual o con IA:

### Módulo 4: Lectura Digital (5 ejercicios) ⚠️ BACKLOG

- `verificador_fake_news` - Verificador de noticias falsas
- `infografia_interactiva` - Creación de infografía interactiva
- `quiz_tiktok` - Quiz estilo TikTok
- `navegacion_hipertextual` - Navegación hipertextual
- `analisis_memes` - Análisis de memes educativos

**Razón:** Requieren validación con IA (análisis de imágenes, verificación de fuentes, análisis multimodal)

### Módulo 5: Producción Lectora (3 ejercicios) ⚠️ BACKLOG

- `diario_multimedia` - Diario interactivo multimedia
- `comic_digital` - Resumen visual progresivo
- `video_carta` - Cápsula del tiempo digital

**Razón:** Requieren rúbricas de evaluación creativa y revisión humana/IA

### Estado de Implementación

- ✅ **Tipos definidos** en ENUM `exercise_type` (compatibilidad futura)
- ✅ **Seeds disponibles** en `_backlog/` (no se cargan por defecto)
- ❌ **Validadores SQL:** NO implementados (intencionado)
- ❌ **No auto-evaluables:** `auto_gradable = false`

**Roadmap:** Ver `docs/04-fase-backlog/` para plan de implementación (P1: Validadores parciales, P2: Revisión manual, P3: IA multimodal)

---

### v2.3.1 - Carga Limpia Exitosa (2025-11-11)

### Dependencia Circular Resuelta (DEP-001)

**Problema:** profiles.school_id FK creaba dependencia circular con schools tabla.

**Solución aplicada:**
- ✅ Comentada constraint en `ddl/schemas/auth_management/tables/03-profiles.sql`
- ✅ Creado FK diferido en `ddl/schemas/auth_management/fk-constraints/01-profiles-school-fk.sql`
- ✅ Agregada Fase 9.5 en `create-database.sh` para ejecutar FK constraints diferidos

**Resultado:** Script ahora ejecuta limpiamente en BD nueva sin errores.

### Seeds de Producción Corregidos (v2.0)

**Problemas identificados:**
- ❌ Uso de STRING en lugar de UUID (3 archivos)
- ❌ Columnas faltantes o con nombres incorrectos (5 archivos)
- ❌ Uso de NOW() en lugar de gamilit.now_mexico() (todos)

**Archivos reescritos (100% alineados con DDL):**
1. ✅ `seeds/prod/auth_management/01-tenants.sql` - v2.0
   - Convertido STRING → UUID
   - Agregada columna `slug` (NOT NULL requerida)
   - Agregadas 7 columnas faltantes

2. ✅ `seeds/prod/auth_management/02-auth_providers.sql` - v2.0
   - Convertido STRING → ENUM auth_provider
   - Estructura alineada con DDL completo

3. ✅ `seeds/prod/educational_content/01-modules.sql` - v2.0
   - Convertido STRING → UUID (5 módulos)
   - Agregadas columnas del schema completo

4. ✅ `seeds/prod/system_configuration/01-system_settings.sql` - v2.0
   - Corregidos nombres: `key` → `setting_key`, etc.
   - 7 configuraciones esenciales

5. ✅ `seeds/prod/system_configuration/02-feature_flags.sql` - v2.0
   - Corregidos nombres: `key` → `feature_key`, etc.
   - 6 feature flags básicos

**Ver detalles:** `REPORTE-CORRECCIONES-CARGA-LIMPIA-2025-11-11.md`

---

## Guía de Uso de Scripts (DB-111) ⭐ NUEVO

### Variables de Ambiente Requeridas

```bash
# Variable principal (REQUERIDA)
export DATABASE_URL="postgresql://user:password@host:5432/dbname"

# Ejemplo desarrollo local
export DATABASE_URL="postgresql://gamilit_user:gamilit_password@localhost:5432/gamilit_db"

# Ejemplo producción
export DATABASE_URL="postgresql://prod_user:secure_pass@prod-host:5432/gamilit_prod"
```

### Workflow Recomendado

#### 1. Primera Instalación (Base de Datos Nueva)

```bash
# 1. Configurar variable de ambiente
export DATABASE_URL="postgresql://user:pass@localhost:5432/gamilit_db"

# 2. Crear base de datos (si no existe)
createdb gamilit_db

# 3. Ejecutar script de creación
cd apps/database
./create-database.sh
```

**Resultado esperado:**
- 16 fases DDL ejecutadas
- 32 seeds PROD cargados
- 0 errores
- Tiempo: ~30-60 segundos

#### 2. Desarrollo/Testing (Recreación Frecuente)

```bash
# Un solo comando que hace todo
export DATABASE_URL="postgresql://user:pass@localhost:5432/gamilit_db"
cd apps/database
./drop-and-recreate-database.sh
```

**Resultado esperado:**
- Base de datos eliminada y recreada
- DDL completo ejecutado
- Seeds cargados
- Tiempo: ~30-60 segundos

#### 3. Validación Post-Carga

```bash
# Verificar conteos de objetos
psql "$DATABASE_URL" -c "SELECT COUNT(*) FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema');"

# Verificar seeds cargados
psql "$DATABASE_URL" -c "SELECT COUNT(*) FROM auth_management.profiles;"
psql "$DATABASE_URL" -c "SELECT COUNT(*) FROM educational_content.modules;"
```

**Resultado esperado:**
- ~99 tablas
- 26 perfiles
- 5 módulos

### Orden de Ejecución de Seeds (Importante)

Los seeds se ejecutan en orden de dependencias:

```
1. audit_logging (sin dependencias)
2. system_configuration (sin dependencias)
3. auth_management/tenants
4. auth_management/auth_providers
5. auth/users
6. auth_management/profiles (depende de users)
7. content_management (depende de users, tenants)
8. social_features (depende de users, profiles)
9. educational_content (depende de tenants)
10. progress_tracking (depende de educational_content, users)
11. lti_integration (depende de system_configuration)
12. gamification_system (depende de users)
```

**⚠️ No ejecutar seeds individualmente fuera de orden**

### Verificación de Integridad

```bash
# Verificar que todos los schemas existen
psql "$DATABASE_URL" << EOF
SELECT nspname FROM pg_namespace
WHERE nspname IN (
  'auth', 'auth_management', 'content_management',
  'educational_content', 'gamification_system', 'progress_tracking',
  'social_features', 'audit_logging', 'system_configuration',
  'lti_integration', 'admin_dashboard', 'storage', 'gamilit'
) ORDER BY nspname;
EOF
```

**Resultado esperado:** 13 schemas listados

### Script de Validación Exhaustiva

Para validar la integridad completa de la base de datos (útil después de migraciones o cambios):

```bash
# Ejecutar validación exhaustiva
cd apps/database
python3 scripts/validate_integrity.py
```

**Características del script:**
- ✅ Valida que todas las Foreign Keys apunten a tablas existentes
- ✅ Verifica que todos los ENUMs usados en tablas estén definidos
- ✅ Detecta funciones con referencias a tablas inexistentes
- ✅ Valida que triggers llamen a funciones válidas
- ✅ Identifica ENUMs duplicados en diferentes schemas
- ✅ Reporta problemas por severidad (CRÍTICO, ALTO, MEDIO, BAJO)

**Uso recomendado:**
- Después de aplicar migraciones
- Antes de despliegues a producción
- Para diagnóstico de problemas de integridad referencial

**Ubicación:** `apps/database/scripts/validate_integrity.py`

## Troubleshooting

### Error: "password authentication failed"

```bash
# Verificar que DATABASE_URL es correcta
echo $DATABASE_URL

# Verificar que PostgreSQL acepta la autenticación
psql -h localhost -U gamilit_user -d postgres -c "SELECT 1;"

# Si falla, revisar pg_hba.conf
# Debe tener: host all all 127.0.0.1/32 md5
```

### Error: "database already exists"

```bash
# Opción 1: Usar drop-and-recreate-database.sh
./drop-and-recreate-database.sh

# Opción 2: Drop manual + create
psql -h localhost -U postgres -c "DROP DATABASE IF EXISTS gamilit_db;"
./create-database.sh
```

### Error: "psql: command not found"

```bash
# Ubuntu/Debian
sudo apt-get install postgresql-client

# macOS
brew install postgresql
```

### Error: "connection refused"

```bash
# Verificar PostgreSQL está corriendo
sudo systemctl status postgresql  # Linux
brew services list                # macOS

# Verificar DATABASE_URL
echo $DATABASE_URL
```

### Ver logs de creación

Cada ejecución de `create-database.sh` genera un log:

```bash
cat apps/database/create-database-YYYYMMDD_HHMMSS.log
```

## Mantenimiento

- **Backups**: Los scripts de backup están en `orchestration/06-respaldos/`
- **Validaciones**: Scripts de validación en `scripts/inventory/`
- **Correcciones**: Scripts de corrección en `orchestration/scripts-correccion/database/`

## Soporte

Para problemas o preguntas:

1. Revisar este README y los logs
2. Consultar documentación en `docs/90-transversal/inventarios-database/`
3. Revisar scripts específicos en `scripts/README.md`

---

## Historial de Cambios Recientes

### 2025-11-24 - Correcciones Críticas + Documentación

**Funciones Corregidas:**
- ✅ `initialize_user_stats()` - 5 bug fixes críticos (ver CHANGELOG.md)
  - BUG FIX #1: Agregada inicialización de module_progress (CRÍTICO)
  - BUG FIX #2: Corrección de errores de clave duplicada en user_ranks
  - BUG FIX #3: Comentada función no implementada
  - Documentación de FKs clarificada

**Documentación Creada:**
- ✅ `docs/database/CHANGELOG.md` - Historial de cambios de BD
- ✅ `ddl/schemas/gamilit/functions/README.md` - Documentación de 16 funciones
- ✅ README.md actualizado - Flujo de registro de usuario documentado

**Validación:**
- ✅ Carga limpia exitosa (34 segundos)
- ✅ Tests de integración: 100% pasados
- ✅ Documentación 100% sincronizada con código

### 2025-11-11 - Validación Completa + Seeds 100% v2.3.7 - DB-111

Ver secciones anteriores para detalles de DB-111, DB-100, DB-099, etc.

---

**Última actualización:** 2025-11-24 (Correcciones Críticas + Documentación Completa)
**Versión del proyecto:** 2.5.2
