# Schema: education

**Proyecto:** OrbiQuant IA (Trading Platform)
**Módulo:** OQI-002 - Education
**Especificación:** ET-EDU-001-database.md
**PostgreSQL:** 15+

---

## Descripción

Schema completo para el módulo educativo de OrbiQuant IA, implementando:
- Gestión de cursos, módulos y lecciones
- Sistema de enrollments y progreso de estudiantes
- Quizzes y evaluaciones
- Certificados de finalización
- Sistema de gamificación (XP, niveles, streaks, achievements)
- Reviews de cursos
- Activity logging

---

## Estructura de Archivos

```
education/
├── 00-enums.sql                                    # Tipos ENUM
├── tables/
│   ├── 01-categories.sql                           # Categorías de cursos
│   ├── 02-courses.sql                              # Cursos
│   ├── 03-modules.sql                              # Módulos del curso
│   ├── 04-lessons.sql                              # Lecciones
│   ├── 05-enrollments.sql                          # Inscripciones de usuarios
│   ├── 06-progress.sql                             # Progreso en lecciones
│   ├── 07-quizzes.sql                              # Quizzes/evaluaciones
│   ├── 08-quiz_questions.sql                       # Preguntas de quiz
│   ├── 09-quiz_attempts.sql                        # Intentos de quiz
│   ├── 10-certificates.sql                         # Certificados
│   ├── 11-user_achievements.sql                    # Logros/badges
│   ├── 12-user_gamification_profile.sql            # Perfil de gamificación
│   ├── 13-user_activity_log.sql                    # Log de actividades
│   └── 14-course_reviews.sql                       # Reviews de cursos
└── functions/
    ├── 01-update_updated_at.sql                    # Trigger updated_at
    ├── 02-update_enrollment_progress.sql           # Actualizar progreso
    ├── 03-auto_complete_enrollment.sql             # Auto-completar enrollment
    ├── 04-generate_certificate.sql                 # Generar certificados
    ├── 05-update_course_stats.sql                  # Actualizar estadísticas
    ├── 06-update_enrollment_count.sql              # Contador de enrollments
    ├── 07-update_gamification_profile.sql          # Sistema de gamificación
    └── 08-views.sql                                # Vistas útiles
```

---

## Orden de Ejecución

Para crear el schema completo, ejecutar en este orden:

```bash
# 1. ENUMs
psql -f 00-enums.sql

# 2. Tablas (en orden de dependencias)
psql -f tables/01-categories.sql
psql -f tables/02-courses.sql
psql -f tables/03-modules.sql
psql -f tables/04-lessons.sql
psql -f tables/05-enrollments.sql
psql -f tables/06-progress.sql
psql -f tables/07-quizzes.sql
psql -f tables/08-quiz_questions.sql
psql -f tables/09-quiz_attempts.sql
psql -f tables/10-certificates.sql
psql -f tables/11-user_achievements.sql
psql -f tables/12-user_gamification_profile.sql
psql -f tables/13-user_activity_log.sql
psql -f tables/14-course_reviews.sql

# 3. Funciones y Triggers
psql -f functions/01-update_updated_at.sql
psql -f functions/02-update_enrollment_progress.sql
psql -f functions/03-auto_complete_enrollment.sql
psql -f functions/04-generate_certificate.sql
psql -f functions/05-update_course_stats.sql
psql -f functions/06-update_enrollment_count.sql
psql -f functions/07-update_gamification_profile.sql
psql -f functions/08-views.sql
```

---

## Tablas

### Principales

| Tabla | Descripción |
|-------|-------------|
| `categories` | Categorías de cursos con soporte para jerarquía |
| `courses` | Cursos del módulo educativo |
| `modules` | Módulos que agrupan lecciones |
| `lessons` | Lecciones individuales (video, artículo, interactivo) |
| `enrollments` | Inscripciones de usuarios a cursos |
| `progress` | Progreso del usuario en cada lección |

### Evaluación

| Tabla | Descripción |
|-------|-------------|
| `quizzes` | Quizzes/evaluaciones |
| `quiz_questions` | Preguntas de los quizzes |
| `quiz_attempts` | Intentos de usuarios en quizzes |

### Logros

| Tabla | Descripción |
|-------|-------------|
| `certificates` | Certificados de finalización |
| `user_achievements` | Logros/badges obtenidos |

### Gamificación

| Tabla | Descripción |
|-------|-------------|
| `user_gamification_profile` | XP, niveles, streaks, estadísticas |
| `user_activity_log` | Log de todas las actividades |
| `course_reviews` | Reviews y calificaciones de cursos |

---

## ENUMs

- `difficulty_level`: beginner, intermediate, advanced, expert
- `course_status`: draft, published, archived
- `enrollment_status`: active, completed, expired, cancelled
- `lesson_content_type`: video, article, interactive, quiz
- `question_type`: multiple_choice, true_false, multiple_select, fill_blank, code_challenge
- `achievement_type`: course_completion, quiz_perfect_score, streak_milestone, level_up, special_event

---

## Funciones Principales

### Gamificación

```sql
-- Actualizar XP del usuario
SELECT education.update_user_xp(
  'user-uuid',  -- user_id
  100           -- xp_to_add
);

-- Actualizar streak del usuario
SELECT education.update_user_streak('user-uuid');
```

### Triggers Automáticos

- `updated_at`: Se actualiza automáticamente en todas las tablas
- `update_enrollment_progress()`: Calcula progreso al completar lecciones
- `auto_complete_enrollment()`: Completa enrollment al alcanzar 100%
- `generate_certificate_number()`: Genera número único de certificado
- `update_course_rating_stats()`: Actualiza rating promedio del curso
- `update_enrollment_count()`: Actualiza contador de enrollments
- `update_streak_on_activity()`: Actualiza streak en cada actividad

---

## Vistas

| Vista | Descripción |
|-------|-------------|
| `v_courses_with_stats` | Cursos con estadísticas agregadas |
| `v_user_course_progress` | Progreso del usuario por curso |
| `v_leaderboard_weekly` | Top 100 usuarios por XP semanal |
| `v_leaderboard_monthly` | Top 100 usuarios por XP mensual |
| `v_leaderboard_alltime` | Top 100 usuarios por XP total |
| `v_user_statistics` | Estadísticas completas del usuario |
| `v_popular_courses` | Top 50 cursos más populares |

---

## Dependencias

### Schemas externos
- `auth.users` - Tabla de usuarios (requerida)

### Extensions
- `gen_random_uuid()` - Built-in en PostgreSQL 13+

---

## Políticas de Seguridad (RLS)

Para habilitar Row Level Security (implementar según necesidad):

```sql
-- Habilitar RLS
ALTER TABLE education.enrollments ENABLE ROW LEVEL SECURITY;
ALTER TABLE education.progress ENABLE ROW LEVEL SECURITY;
ALTER TABLE education.quiz_attempts ENABLE ROW LEVEL SECURITY;
ALTER TABLE education.certificates ENABLE ROW LEVEL SECURITY;

-- Política: usuarios solo ven sus propios datos
CREATE POLICY user_own_data ON education.enrollments
  FOR ALL
  USING (user_id = current_setting('app.user_id')::UUID);
```

---

## Ejemplos de Uso

### Enrollar usuario a un curso

```sql
INSERT INTO education.enrollments (user_id, course_id)
VALUES ('user-uuid', 'course-uuid')
RETURNING *;
```

### Registrar progreso en lección

```sql
INSERT INTO education.progress (
  user_id,
  lesson_id,
  enrollment_id,
  is_completed,
  watch_percentage
) VALUES (
  'user-uuid',
  'lesson-uuid',
  'enrollment-uuid',
  true,
  100.00
);
-- Esto automáticamente actualizará el enrollment progress
```

### Completar quiz

```sql
INSERT INTO education.quiz_attempts (
  user_id,
  quiz_id,
  enrollment_id,
  is_completed,
  is_passed,
  user_answers,
  score_percentage,
  xp_earned
) VALUES (
  'user-uuid',
  'quiz-uuid',
  'enrollment-uuid',
  true,
  true,
  '[{"questionId": "q1", "answer": "A", "isCorrect": true}]'::jsonb,
  85.00,
  50
);
```

### Emitir certificado

```sql
INSERT INTO education.certificates (
  user_id,
  course_id,
  enrollment_id,
  user_name,
  course_title,
  completion_date,
  final_score
) VALUES (
  'user-uuid',
  'course-uuid',
  'enrollment-uuid',
  'John Doe',
  'Introducción al Trading',
  CURRENT_DATE,
  92.50
);
-- El número de certificado y código de verificación se generan automáticamente
```

### Agregar review a curso

```sql
INSERT INTO education.course_reviews (
  user_id,
  course_id,
  enrollment_id,
  rating,
  title,
  content
) VALUES (
  'user-uuid',
  'course-uuid',
  'enrollment-uuid',
  5,
  'Excelente curso',
  'Muy bien explicado y con ejemplos prácticos'
);
```

---

## Notas Importantes

1. **Referencias**: Todas las FKs a usuarios usan `auth.users(id)`
2. **Cascadas**: Las eliminaciones en CASCADE están definidas donde corresponde
3. **Índices**: Creados para optimizar queries frecuentes
4. **Constraints**: Validaciones de lógica de negocio implementadas
5. **JSONB**: Usado para metadata flexible (attachments, user_answers, etc.)
6. **Denormalización**: Algunas estadísticas están denormalizadas para performance

---

## Mantenimiento

### Resetear XP semanal/mensual

```sql
-- Resetear XP semanal (ejecutar cada lunes)
UPDATE education.user_gamification_profile SET weekly_xp = 0;

-- Resetear XP mensual (ejecutar el 1ro de cada mes)
UPDATE education.user_gamification_profile SET monthly_xp = 0;
```

### Recalcular estadísticas de curso

```sql
-- Recalcular total de módulos y lecciones
UPDATE education.courses c
SET
  total_modules = (SELECT COUNT(*) FROM education.modules WHERE course_id = c.id),
  total_lessons = (
    SELECT COUNT(*)
    FROM education.lessons l
    JOIN education.modules m ON l.module_id = m.id
    WHERE m.course_id = c.id
  );
```

---

## Versión

**Versión:** 1.0.0
**Última actualización:** 2025-12-06
