workspace/projects/gamilit/docs/90-transversal/features/SOCIAL-FEATURES-COMPLETO.md
rckrdmrd ea1879f4ad feat: Initial workspace structure with multi-level Git configuration
- Configure workspace Git repository with comprehensive .gitignore
- Add Odoo as submodule for ERP reference code
- Include documentation: SETUP.md, GIT-STRUCTURE.md
- Add gitignore templates for projects (backend, frontend, database)
- Structure supports independent repos per project/subproject level

Workspace includes:
- core/ - Reusable patterns, modules, orchestration system
- projects/ - Active projects (erp-suite, gamilit, trading-platform, etc.)
- knowledge-base/ - Reference code and patterns (includes Odoo submodule)
- devtools/ - Development tools and templates
- customers/ - Client implementations template

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-08 10:44:23 -06:00

670 lines
19 KiB
Markdown

# Características Sociales - Schema: social_features
**Schema:** `social_features`
**Propósito:** Funcionalidades sociales y colaborativas de GAMILIT
**Total de tablas:** 7
**Estado:** ✅ Implementado
**Última actualización:** 2025-11-08
---
## 📋 Descripción
El schema `social_features` implementa todas las funcionalidades sociales y colaborativas de la plataforma GAMILIT, incluyendo:
- 🏫 Escuelas e instituciones educativas
- 👥 Aulas virtuales (classrooms)
- 🤝 Sistema de amistades
- 🎯 Equipos colaborativos
- 🏆 Desafíos entre equipos
---
## 📊 TABLAS DEL SCHEMA (7)
| Tabla | Propósito | Registros estimados | Estado Docs |
|-------|-----------|---------------------|-------------|
| **schools** | Escuelas/instituciones | ~100-1000 | ⚠️ Parcial |
| **classrooms** | Aulas virtuales | ~1000-10000 | ✅ EXT-001 |
| **classroom_members** | Estudiantes en aulas | ~10000-100000 | ✅ EXT-001 |
| **friendships** | Amistades entre usuarios | ~50000+ | ⚠️ Parcial |
| **teams** | Equipos de estudiantes | ~5000-20000 | ⚠️ Parcial |
| **team_members** | Miembros de equipos | ~20000-80000 | ⚠️ Parcial |
| **team_challenges** | Desafíos entre equipos | ~1000-5000 | ⚠️ Parcial |
---
## 🏫 TABLA: schools
**Archivo:** `apps/database/ddl/schemas/social_features/tables/02-schools.sql`
### Propósito
Gestión de escuelas e instituciones educativas en el sistema multi-tenant.
### Columnas Principales
```sql
CREATE TABLE social_features.schools (
id UUID PRIMARY KEY,
tenant_id UUID NOT NULL, -- Tenant propietario
name TEXT NOT NULL, -- Nombre de la escuela
code TEXT, -- Código único de escuela
short_name TEXT, -- Nombre corto/acrónimo
description TEXT,
-- Información de contacto
address TEXT,
city TEXT,
region TEXT,
country TEXT DEFAULT 'México',
postal_code TEXT,
phone TEXT,
email TEXT,
website TEXT,
-- Personal administrativo
principal_id UUID, -- Director
administrative_contact_id UUID, -- Contacto administrativo
-- Configuración académica
academic_year TEXT, -- Año académico actual
semester_system BOOLEAN DEFAULT true, -- Sistema semestral o anual
grade_levels TEXT[] DEFAULT ARRAY['6','7','8'], -- Grados que imparte
settings JSONB DEFAULT '{}',
-- Capacidades
max_students INTEGER DEFAULT 1000,
max_teachers INTEGER DEFAULT 100,
current_students_count INTEGER DEFAULT 0,
current_teachers_count INTEGER DEFAULT 0,
-- Estado
is_active BOOLEAN DEFAULT true,
is_verified BOOLEAN DEFAULT false, -- Escuela verificada
metadata JSONB DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT gamilit.now_mexico(),
updated_at TIMESTAMPTZ DEFAULT gamilit.now_mexico()
);
```
### Características
- ✅ Multi-tenancy (una escuela por tenant)
- ✅ Verificación de instituciones
- ✅ Contadores automáticos de estudiantes y maestros
- ✅ Configuración flexible por escuela
- ✅ Soporta diferentes sistemas académicos
### Casos de Uso
1. **Registro de Escuela:** Director registra su institución
2. **Gestión Administrativa:** Asignación de personal
3. **Configuración Académica:** Definir grados, semestres
4. **Estadísticas:** Tracking de población estudiantil
### Relaciones
- `tenant_id``auth_management.tenants`
- `principal_id``auth.users` (rol: admin_teacher)
- `classrooms.school_id``schools.id`
### RLS Policies
- Directores pueden ver/editar su escuela
- Maestros pueden ver escuelas donde trabajan
- Super admins pueden ver todas
---
## 👥 TABLA: classrooms
**Archivo:** `apps/database/ddl/schemas/social_features/tables/03-classrooms.sql`
### Propósito
Aulas virtuales donde maestros organizan estudiantes y asignan tareas.
### Columnas Principales
```sql
CREATE TABLE social_features.classrooms (
id UUID PRIMARY KEY,
school_id UUID, -- Escuela (opcional)
tenant_id UUID NOT NULL,
teacher_id UUID NOT NULL, -- Maestro responsable
name TEXT NOT NULL, -- "6to A - Matemáticas"
code TEXT UNIQUE, -- Código de invitación
description TEXT,
subject TEXT, -- Materia
grade_level TEXT, -- Grado escolar
academic_year TEXT,
semester TEXT,
-- Capacidad
max_students INTEGER DEFAULT 40,
current_members_count INTEGER DEFAULT 0,
-- Configuración
allow_self_enrollment BOOLEAN DEFAULT false,
require_approval BOOLEAN DEFAULT true,
is_public BOOLEAN DEFAULT false,
-- Estado
is_active BOOLEAN DEFAULT true,
is_archived BOOLEAN DEFAULT false,
-- Gamificación
total_xp INTEGER DEFAULT 0,
total_ml_coins INTEGER DEFAULT 0,
settings JSONB DEFAULT '{}',
metadata JSONB DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT gamilit.now_mexico(),
updated_at TIMESTAMPTZ DEFAULT gamilit.now_mexico()
);
```
### Características
- ✅ Códigos de invitación únicos
- ✅ Auto-inscripción opcional
- ✅ Gamificación grupal
- ✅ Archivado de clases pasadas
- ✅ Multi-materia y multi-grado
### Casos de Uso
1. **Crear Aula:** Maestro crea aula para su curso
2. **Invitar Estudiantes:** Compartir código de aula
3. **Organización:** Agrupar por materia/grado
4. **Seguimiento:** Métricas de progreso grupal
### Relaciones
- `school_id``schools.id`
- `teacher_id``auth.users` (rol: admin_teacher)
- `tenant_id``auth_management.tenants`
### Documentación Relacionada
-**EXT-001:** Portal de Maestros (US-PM-001a, US-PM-001b)
- ✅ Funciones: `assign_to_classroom()`, `calculate_classroom_progress()`
---
## 📚 TABLA: classroom_members
**Archivo:** `apps/database/ddl/schemas/social_features/tables/04-classroom_members.sql`
### Propósito
Relación estudiante-aula con información de inscripción.
### Columnas Principales
```sql
CREATE TABLE social_features.classroom_members (
id UUID PRIMARY KEY,
classroom_id UUID NOT NULL,
user_id UUID NOT NULL, -- Estudiante
-- Inscripción
enrollment_method TEXT, -- 'invite','code','bulk','manual'
enrolled_by UUID, -- Maestro que inscribió
enrolled_at TIMESTAMPTZ DEFAULT gamilit.now_mexico(),
-- Estado
status TEXT DEFAULT 'active', -- 'active','dropped','completed'
is_active BOOLEAN DEFAULT true,
-- Seguimiento
attendance_rate NUMERIC(5,2), -- % asistencia
participation_score INTEGER,
last_activity_at TIMESTAMPTZ,
metadata JSONB DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT gamilit.now_mexico(),
updated_at TIMESTAMPTZ DEFAULT gamilit.now_mexico(),
UNIQUE(classroom_id, user_id)
);
```
### Características
- ✅ Constraint de unicidad (un estudiante una vez por aula)
- ✅ Tracking de método de inscripción
- ✅ Métricas de participación
- ✅ Estado de inscripción (activo/abandonado/completado)
### Casos de Uso
1. **Inscripción:** Estudiante se une a aula
2. **Gestión:** Maestro ve lista de estudiantes
3. **Analytics:** Asistencia y participación
4. **Graduación:** Marcar como completado al fin de curso
### Triggers
- `update_classroom_member_count()` - Actualiza contador en classroom
### Documentación Relacionada
-**EXT-001:** Portal de Maestros (US-PM-001b)
---
## 🤝 TABLA: friendships
**Archivo:** `apps/database/ddl/schemas/social_features/tables/01-friendships.sql`
### Propósito
Sistema de amistades entre estudiantes para interacción social.
### Columnas Principales
```sql
CREATE TABLE social_features.friendships (
id UUID PRIMARY KEY,
user_id UUID NOT NULL, -- Usuario que envía solicitud
friend_id UUID NOT NULL, -- Usuario receptor
status VARCHAR(20) DEFAULT 'pending', -- 'pending','accepted','rejected','blocked'
created_at TIMESTAMPTZ DEFAULT gamilit.now_mexico(),
updated_at TIMESTAMPTZ DEFAULT gamilit.now_mexico(),
CONSTRAINT friendships_check CHECK (user_id <> friend_id),
CONSTRAINT friendships_status_check CHECK (
status IN ('pending', 'accepted', 'rejected', 'blocked')
),
UNIQUE(user_id, friend_id)
);
```
### Estados de Amistad
| Estado | Descripción |
|--------|-------------|
| `pending` | Solicitud enviada, esperando respuesta |
| `accepted` | Amigos confirmados |
| `rejected` | Solicitud rechazada |
| `blocked` | Usuario bloqueado |
### Características
- ✅ Constraint para evitar auto-amistad
- ✅ Unicidad bidireccional
- ✅ Estados bien definidos
- ✅ Sistema de bloqueo
### Casos de Uso
1. **Enviar Solicitud:** Estudiante envía solicitud de amistad
2. **Aceptar/Rechazar:** Receptor responde a solicitud
3. **Ver Amigos:** Lista de amigos aceptados
4. **Bloquear:** Prevenir interacción con usuario específico
### Funcionalidad Social
- Ver progreso de amigos
- Comparar logros
- Desafíos entre amigos
- Chat/mensajería (futuro)
### RLS Policies
- Solo usuarios involucrados pueden ver la relación
- Solo receptor puede cambiar estado de pending
- Solo user_id puede bloquear
---
## 🎯 TABLA: teams
**Archivo:** `apps/database/ddl/schemas/social_features/tables/05-teams.sql`
### Propósito
Equipos colaborativos de estudiantes para gamificación y aprendizaje grupal.
### Columnas Principales
```sql
CREATE TABLE social_features.teams (
id UUID PRIMARY KEY,
classroom_id UUID, -- Aula (opcional)
tenant_id UUID NOT NULL,
-- Identidad del equipo
name TEXT NOT NULL,
description TEXT,
motto TEXT, -- Lema del equipo
color_primary TEXT DEFAULT '#3B82F6',
color_secondary TEXT DEFAULT '#10B981',
avatar_url TEXT,
banner_url TEXT,
badges JSONB DEFAULT '[]', -- Insignias del equipo
-- Liderazgo
creator_id UUID NOT NULL, -- Fundador
leader_id UUID, -- Líder actual
-- Membresía
team_code TEXT UNIQUE, -- Código de invitación
max_members INTEGER DEFAULT 5,
current_members_count INTEGER DEFAULT 0,
-- Configuración
is_public BOOLEAN DEFAULT false,
allow_join_requests BOOLEAN DEFAULT true,
require_approval BOOLEAN DEFAULT true,
-- Estadísticas de gamificación
total_xp INTEGER DEFAULT 0,
total_ml_coins INTEGER DEFAULT 0,
modules_completed INTEGER DEFAULT 0,
achievements_earned INTEGER DEFAULT 0,
-- Estado
is_active BOOLEAN DEFAULT true,
is_verified BOOLEAN DEFAULT false,
founded_at TIMESTAMPTZ DEFAULT gamilit.now_mexico(),
last_activity_at TIMESTAMPTZ,
metadata JSONB DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT gamilit.now_mexico(),
updated_at TIMESTAMPTZ DEFAULT gamilit.now_mexico()
);
```
### Características
- ✅ Personalización visual (colores, avatar, banner)
- ✅ Sistema de liderazgo
- ✅ Gamificación colaborativa (XP y coins compartidos)
- ✅ Control de privacidad y membresía
- ✅ Tracking de logros grupales
### Casos de Uso
1. **Formar Equipo:** Estudiantes crean equipo de estudio
2. **Unirse a Equipo:** Mediante código o solicitud
3. **Competir:** Desafíos contra otros equipos
4. **Colaborar:** Completar módulos juntos
5. **Ranking:** Leaderboard de equipos
### Gamificación de Equipos
```
XP del Equipo = Suma de XP individual de miembros
ML Coins del Equipo = Suma de coins de miembros
Módulos Completados = Módulos que TODOS completaron
Achievements = Logros grupales especiales
```
### Relaciones
- `classroom_id``classrooms.id` (opcional - equipos pueden ser inter-aulas)
- `creator_id``auth.users`
- `leader_id``auth.users`
---
## 👤 TABLA: team_members
**Archivo:** `apps/database/ddl/schemas/social_features/tables/06-team_members.sql`
### Propósito
Relación estudiante-equipo con roles y contribuciones.
### Columnas Estimadas
```sql
CREATE TABLE social_features.team_members (
id UUID PRIMARY KEY,
team_id UUID NOT NULL,
user_id UUID NOT NULL,
-- Rol en el equipo
role TEXT DEFAULT 'member', -- 'member','leader','co-leader'
-- Ingreso
join_method TEXT, -- 'invite','code','request','founding'
joined_at TIMESTAMPTZ DEFAULT gamilit.now_mexico(),
invited_by UUID,
-- Contribución
xp_contributed INTEGER DEFAULT 0,
ml_coins_contributed INTEGER DEFAULT 0,
modules_completed_count INTEGER DEFAULT 0,
-- Estado
status TEXT DEFAULT 'active', -- 'active','inactive','kicked','left'
is_active BOOLEAN DEFAULT true,
last_active_at TIMESTAMPTZ,
metadata JSONB DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT gamilit.now_mexico(),
updated_at TIMESTAMPTZ DEFAULT gamilit.now_mexico(),
UNIQUE(team_id, user_id)
);
```
### Roles en Equipos
| Rol | Permisos |
|-----|----------|
| `founding` | Fundador original (inmutable) |
| `leader` | Líder actual, puede invitar/expulsar |
| `co-leader` | Asistente del líder |
| `member` | Miembro regular |
### Contribuciones
- Se trackean contribuciones individuales al equipo
- Métricas de participación
- Identificar miembros más activos
---
## 🏆 TABLA: team_challenges
**Archivo:** `apps/database/ddl/schemas/social_features/tables/07-team_challenges.sql`
### Propósito
Desafíos y competencias entre equipos.
### Columnas Estimadas
```sql
CREATE TABLE social_features.team_challenges (
id UUID PRIMARY KEY,
-- Equipos participantes
challenger_team_id UUID NOT NULL, -- Equipo retador
challenged_team_id UUID NOT NULL, -- Equipo retado
-- Desafío
challenge_type TEXT, -- 'module_race','xp_battle','quiz_duel'
challenge_name TEXT,
description TEXT,
rules JSONB DEFAULT '{}',
-- Condiciones
module_id UUID, -- Si es desafío de módulo específico
target_score INTEGER, -- Puntaje objetivo
duration_minutes INTEGER, -- Duración del desafío
-- Estado
status TEXT DEFAULT 'pending', -- 'pending','accepted','in_progress','completed','cancelled'
-- Resultado
winner_team_id UUID,
challenger_score INTEGER,
challenged_score INTEGER,
-- Premio
reward_xp INTEGER,
reward_ml_coins INTEGER,
reward_badges JSONB DEFAULT '[]',
-- Fechas
challenged_at TIMESTAMPTZ DEFAULT gamilit.now_mexico(),
accepted_at TIMESTAMPTZ,
started_at TIMESTAMPTZ,
completed_at TIMESTAMPTZ,
metadata JSONB DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT gamilit.now_mexico(),
updated_at TIMESTAMPTZ DEFAULT gamilit.now_mexico()
);
```
### Tipos de Desafíos
| Tipo | Descripción |
|------|-------------|
| `module_race` | Carrera para completar módulo |
| `xp_battle` | Competencia de XP en tiempo límite |
| `quiz_duel` | Duelo de preguntas |
| `achievement_hunt` | Caza de logros específicos |
### Flujo de Desafío
1. Equipo A reta a Equipo B
2. Equipo B acepta o rechaza
3. Desafío inicia (in_progress)
4. Al terminar, se determina ganador
5. Se otorgan recompensas
---
## 🔧 FUNCIONES DEL SCHEMA
### 1. `cleanup_old_notifications()`
**Archivo:** `apps/database/ddl/schemas/social_features/functions/cleanup_old_notifications.sql`
**Propósito:** Limpia notificaciones antiguas (más de X días)
**Firma:**
```sql
CREATE OR REPLACE FUNCTION social_features.cleanup_old_notifications(days INTEGER DEFAULT 90)
RETURNS INTEGER
```
**Uso:**
```sql
-- Limpiar notificaciones de más de 90 días
SELECT social_features.cleanup_old_notifications(90);
-- Retorna: número de notificaciones eliminadas
```
---
## 📊 VISTAS Y MATERIALIZED VIEWS
### Vistas Sugeridas (no implementadas aún)
1. **team_leaderboard** - Ranking de equipos por XP
2. **classroom_social_graph** - Grafo de relaciones en aula
3. **friendship_stats** - Estadísticas de amistades por usuario
4. **active_challenges** - Desafíos activos del momento
---
## 🔐 SEGURIDAD (RLS)
**Archivo:** `apps/database/ddl/schemas/social_features/rls-policies/*.sql`
### Políticas Implementadas
1. **schools:** Solo directores y admins
2. **classrooms:** Maestros ven sus aulas, estudiantes ven aulas donde están
3. **classroom_members:** Ver solo miembros de aulas propias
4. **friendships:** Solo usuarios involucrados
5. **teams:** Miembros ven detalles completos, otros ven resumen público
6. **team_members:** Miembros del equipo
7. **team_challenges:** Equipos participantes y espectadores (si público)
---
## 📈 INTERDEPENDENCIAS
### Schema Dependencies
```
social_features depende de:
├── auth_management (users, profiles, tenants)
├── gamification_system (achievements, user_stats)
└── educational_content (modules para team challenges)
social_features es usado por:
├── progress_tracking (analytics por classroom)
├── gamification_system (logros sociales)
└── admin_dashboard (vistas de escuelas/aulas)
```
---
## 🎯 CASOS DE USO COMPLETOS
### Caso 1: Escuela se Registra
1. Super admin crea tenant
2. Director crea school
3. Director crea classrooms
4. Director invita maestros
5. Maestros invitan estudiantes a classrooms
### Caso 2: Estudiantes Forman Equipo
1. Estudiante A crea team
2. Envía invitaciones a compañeros
3. Compañeros aceptan
4. Equipo participa en challenges
5. Ganan rewards grupales
### Caso 3: Competencia entre Equipos
1. Team A reta a Team B
2. Team B acepta desafío
3. Ambos completan módulos
4. Sistema determina ganador
5. Rewards distribuidos
---
## 📝 DOCUMENTACIÓN RELACIONADA
### Épicas que Usan social_features
| Épica | Tablas Usadas | Funcionalidad |
|-------|---------------|---------------|
| **EAI-001** | schools (indirecto) | Multi-tenancy |
| **EXT-001** | classrooms, classroom_members | Portal de Maestros |
| **EXT-004** | friendships, teams | Perfiles Sociales |
| *(Pendiente)* | teams, team_challenges | Gamificación Social |
### Referencias Cruzadas
-**TRACEABILITY:** `docs/03-fase-extensiones/EXT-001-portal-maestros/implementacion/TRACEABILITY.yml`
- ⚠️ **PENDIENTE:** RF para friendships, teams, team_challenges
---
## 🚀 PRÓXIMOS PASOS
### Documentación Faltante
1. **Crear RFs:**
- RF-SOC-001: Sistema de Amistades
- RF-SOC-002: Equipos Colaborativos
- RF-SOC-003: Desafíos entre Equipos
- RF-SOC-004: Gestión de Escuelas
2. **Crear TRACEABILITY:**
- Épica EXT-002 o EXT-003 para funcionalidades sociales
- Mapear tablas faltantes
3. **Backend:**
- Documentar servicios sociales
- APIs de teams, friendships, challenges
4. **Frontend:**
- Componentes de perfil social
- UI de equipos
- Pantalla de desafíos
---
## 🔍 ANÁLISIS DE COBERTURA
| Componente | Implementado | Documentado | Gap |
|------------|--------------|-------------|-----|
| **schools** | ✅ | ⚠️ Parcial | Falta RF |
| **classrooms** | ✅ | ✅ EXT-001 | Completo |
| **classroom_members** | ✅ | ✅ EXT-001 | Completo |
| **friendships** | ✅ | ⚠️ Parcial | Falta RF/ET |
| **teams** | ✅ | ⚠️ Parcial | Falta RF/ET |
| **team_members** | ✅ | ⚠️ Parcial | Falta RF/ET |
| **team_challenges** | ✅ | ⚠️ Parcial | Falta RF/ET |
**Cobertura actual:** ~30% completo, ~70% parcial
---
**Creado:** 2025-11-08
**Tipo:** Documentación consolidada
**Total de tablas:** 7
**Estado:** ✅ Documentación básica completa, ⚠️ Falta TRACEABILITY formal