PLAN: Gamificación — Campus Virtual
Versión: 1.4
Plataforma: Moodle 5.1 (Docker + MariaDB 10.11)
Decisión final: Camino A — Solo Moodle nativo + block_xp Community (sin suscripción, sin código)
Fuente: 01-gamificacion-campus-virtual-v2.xlsx
Documento soporte del requerimiento (guía operativa paso a paso, Alcance 1). El estado configurado del sistema se documenta en Gamificación; la correspondencia con los desarrollos, en Alcances y desarrollos.
Contexto
El campus tiene instalado el stack: block_xp (Level Up XP v19.0 Community), block_stash y el sistema nativo de badges de Moodle. El requerimiento define dos sistemas: 8 niveles Gema (XP acumulado) y 12 insignias (logros certificados). Los objetos stash existentes (Binoculares, Brújula, Lupa, Mapa) son compatibles y se conservan sin modificar.
Esta v1.4 es la guía operativa paso a paso para implementar la propuesta v2 acordada con el cliente, sin código y sin suscripciones.
Arquitectura
| Capa | Plugin | Mecánica |
|---|---|---|
| Gemas | block_xp Community | XP acumulado → nivel con imagen personalizada |
| Insignias | Moodle Badges (mdl_badge_issued) | Criterio cumplido → OpenBadge certificado |
| Objetos | block_stash | Ítem coleccionable por módulo (sin cambios) |
Alcance v2 (10 insignias activas)
| # | Insignia | Estado | Tipo | Mecanismo nativo |
|---|---|---|---|---|
| 1 | Primer Despegue | Activa (criterio ajustado) | Site badge | Activity completion del curso de bienvenida |
| 2 | Racha Conectada | ELIMINADA | — | No implementable sin código |
| 3 | Ruta Activada | ELIMINADA | — | No implementable sin código |
| 4 | Exploración Digital | Activa (criterio ajustado) | Course badge | Activity completion (1 por módulo) |
| 5 | Pionero del Aprendizaje | Activa | Site badge | Completing a set of courses (N=1) |
| 6 | Explorador Inicial | Activa | Course badge | Activity completion (cualquier 1) |
| 7 | Reto Entregado | Activa | Course badge | Activity completion (tareas/quiz) |
| 8 | Avance en Terreno | Activa | Course badge | Activity completion (50% manual) |
| 9 | Zona Superada | Activa | Course badge | Activity completion (todas del módulo) |
| 10 | Impulso Renovado | Activa (criterio ajustado) | Course badge | Activity completion con grade condition |
| 11 | Misión Cumplida | Activa | Course badge | Course completion |
| 12 | Aliado Inteligente | Diferida (inactiva) | Site badge | Pendiente del tutor IA |
Total: 10 activas · 2 eliminadas · 1 diferida
Sistema de Gemas — 8 Niveles XP
Configuración en block_xp con método flat (umbrales fijos cada 500 XP):
| Nivel | Nombre | XP mínimo |
|---|---|---|
| 1 | Gema Alba | 0 |
| 2 | Gema Aqua | 500 |
| 3 | Gema Violeta | 1.000 |
| 4 | Gema Esmeralda | 1.500 |
| 5 | Gema Solar | 2.000 |
| 6 | Gema Coral | 2.500 |
| 7 | Gema Índigo | 3.000 |
| 8 | Gema Prisma | 3.500 |
Entorno de Ejecución (referencia para todos los pasos)
| Recurso | Valor |
|---|---|
| Container DB | colombiaaprende_db (mariadb:10.11) |
| Container web | colombiaaprende_web (PHP 8.3) |
| BD | moodle (user moodle, password en local/.env) |
| Web root | /Users/imac/Desktop/campusvirtual/local/APP158C/public/ |
| Moodledata | /Users/imac/Desktop/campusvirtual/local/moodledata/ |
| Admin URL | http://localhost:8080/admin/ |
| Variables .env | MYSQL_ROOT_PASSWORD, MYSQL_PASSWORD |
Convenciones del documento:
- [UI] = paso manual en el navegador (Admin UI)
- [SQL] = script SQL contra la base de datos
- [Archivos] = manipulación del sistema de archivos
- [Código] = ajuste de código fuente / configuración
- Checkpoint = punto de verificación
Ruta de Implementación Paso a Paso
FASE 0 — Preparación y Backup
0.1 [SQL] Backup completo de la base de datos (obligatorio antes de cualquier cambio)
docker exec colombiaaprende_db sh -c \
'exec mariadb-dump -uroot -p"$MYSQL_ROOT_PASSWORD" --single-transaction moodle' \
> /Users/imac/Desktop/campusvirtual/database_backups/moodle_pre_gamificacion_$(date +%Y%m%d_%H%M%S).sql
0.2 [SQL] Backup focalizado de las tablas que se van a tocar (rollback rápido)
docker exec colombiaaprende_db sh -c \
'exec mariadb-dump -uroot -p"$MYSQL_ROOT_PASSWORD" moodle \
mdl_block_xp_config mdl_badge mdl_badge_criteria mdl_badge_criteria_param' \
> /Users/imac/Desktop/campusvirtual/database_backups/gamificacion_tablas_$(date +%Y%m%d_%H%M%S).sql
0.3 [SQL] Verificar estado actual de block_xp
-- Ejecutar: docker exec -it colombiaaprende_db mariadb -uroot -p moodle
SELECT id, courseid, enabled, levels,
SUBSTRING(levelsdata, 1, 80) AS levelsdata_preview
FROM mdl_block_xp_config;
0.4 [UI] Definir curso piloto
- Ir a
http://localhost:8080/admin/search.php?query=courses→ elegir un curso de prueba - Anotar su
courseid(visible en la URL?id=X) - En este plan se asume
courseid = <PILOTO>como placeholder
Checkpoint 0
Backups en database_backups/ y courseid piloto anotado.
FASE 1 — Configurar las 8 Gemas en block_xp
1.1 [UI] Decidir scope del block_xp
- Por curso (recomendado): cada curso tiene su propia barra de XP
- Global: una sola barra de XP a nivel sitio
URL: http://localhost:8080/admin/settings.php?section=block_xp_default_admin_settings
1.2 [UI] Activar "niveles personalizados con imagen"
Por cada curso piloto:
- Ir al curso → Activar edición
- En el bloque "Level Up XP" → engranaje → "Configuración"
- Pestaña "Niveles" → marcar "Permitir personalizar los niveles"
- Cambiar número de niveles a 8
- Cambiar método a "Flat" (umbrales fijos, sin curva)
1.3 [SQL] Aplicar JSON de las 8 Gemas vía SQL
Archivo /tmp/gemas_levelsdata.sql:
-- Aplicar configuración de 8 Gemas a TODOS los cursos donde block_xp esté habilitado
UPDATE mdl_block_xp_config
SET levels = 8,
levelsdata = '{"v":2,"algo":{"method":"flat","base":500,"coef":1.0,"incr":500},"xp":[0,500,1000,1500,2000,2500,3000,3500],"name":["Gema Alba","Gema Aqua","Gema Violeta","Gema Esmeralda","Gema Solar","Gema Coral","Gema Índigo","Gema Prisma"],"desc":["","","","","","","",""]}'
WHERE enabled = 1;
-- Verificar
SELECT id, courseid, levels, SUBSTRING(levelsdata, 1, 60) AS preview
FROM mdl_block_xp_config WHERE enabled = 1;
Ejecutar:
docker exec -i colombiaaprende_db sh -c \
'exec mariadb -uroot -p"$MYSQL_ROOT_PASSWORD" moodle' < /tmp/gemas_levelsdata.sql
Alternativa solo curso piloto (recomendado primero):
UPDATE mdl_block_xp_config
SET levels = 8, levelsdata = '<JSON ARRIBA>'
WHERE courseid = <PILOTO>;
1.4 [Archivos] Subir las 8 imágenes PNG de las Gemas
Generar las imágenes con los prompts del Excel v2 (sheet GEMAS). Tamaño: 256×256 px, fondo transparente, PNG.
Vía Admin UI:
- Curso piloto → bloque XP → Configuración → Niveles
- Para cada nivel (1 a 8) → "Imagen" → cargar el PNG correspondiente
- Guardar
Identificar contextid del bloque (si se requiere automatización masiva):
SELECT bi.id AS blockinstanceid, ctx.id AS contextid, ctx.path, bi.parentcontextid
FROM mdl_block_instances bi
JOIN mdl_context ctx ON ctx.contextlevel = 80 AND ctx.instanceid = bi.id
WHERE bi.blockname = 'xp';
1.5 [CLI] Purgar cachés
docker exec colombiaaprende_web php /var/www/html/admin/cli/purge_caches.php
Checkpoint 1
- Login como usuario de prueba en el curso piloto
- Bloque XP debe mostrar "Gema Alba" como nivel 1, próximo nivel en 500 XP
- SQL:
SELECT courseid, levels FROM mdl_block_xp_config WHERE enabled=1debe mostrarlevels=8
FASE 2 — Preparar Imágenes de las Insignias
2.1 [Archivos] Generar las 10 imágenes PNG de insignias
Usar los prompts del Excel v2 (sheet INSIGNIAS, columna "Prompt de diseño 3D"). Convención de nombres:
01_primer_despegue.png
04_exploracion_digital.png
05_pionero_aprendizaje.png
06_explorador_inicial.png
07_reto_entregado.png
08_avance_en_terreno.png
09_zona_superada.png
10_impulso_renovado.png
11_mision_cumplida.png
12_aliado_inteligente.png (para badge inactiva)
Tamaño: 256×256 px PNG, fondo transparente.
Guardar en /Users/imac/Desktop/campusvirtual/assets/badges/.
FASE 3 — Crear Insignias GLOBALES (site badges)
3.1 [UI] Insignia #1 "Primer Despegue"
Pre-requisito: curso de bienvenida con 1 actividad de bienvenida marcada con activity completion.
Pasos:
- Ir a
http://localhost:8080/badges/index.php?type=1(Site badges) - "Agregar una nueva insignia"
- Detalles:
- Nombre:
Primer Despegue - Descripción:
Iniciaste tu recorrido en Campus Virtual - Emisor: nombre del campus
- Imagen:
01_primer_despegue.png
- Nombre:
- Guardar → pestaña "Criterios"
- Dropdown "Agregar criterio" → "Insignias otorgadas"
Atención: Las site badges nativas no soportan "Activity completion" directamente. Workaround: crear primero un course badge "Bienvenida" en el curso introductorio con criterio activity completion, y luego site badge "Primer Despegue" con criterio "Awarded badges = Bienvenida".
- Crear primero la badge intermedia "Bienvenida" en el curso de bienvenida (patrón Fase 4), luego volver y seleccionarla como criterio
- Pestaña "Resumen" → "Habilitar acceso"
3.2 [UI] Insignia #5 "Pionero del Aprendizaje"
- Site badges → "Agregar una nueva insignia"
- Detalles:
- Nombre:
Pionero del Aprendizaje - Descripción:
Completaste tu primer curso en Campus Virtual - Imagen:
05_pionero_aprendizaje.png
- Nombre:
- Criterios → "Completing a set of courses"
- Seleccionar lista de cursos → "Cualquiera de los cursos seleccionados" → mínimo 1
- "Habilitar acceso"
3.3 [UI] Insignia #12 "Aliado Inteligente" (DIFERIDA, crear inactiva)
- Site badges → "Agregar una nueva insignia"
- Nombre:
Aliado Inteligente, descripción:Usaste la tutora virtual para resolver una duda, imagen:12_aliado_inteligente.png - NO habilitar acceso — dejar en estado inactiva
Checkpoint 3
-- Verificar las 3 site badges
SELECT id, name, type, status FROM mdl_badge WHERE type = 1;
-- type=1: site badge, status=1 active, status=0 inactive
Esperado: 3 filas — Primer Despegue (status 1), Pionero del Aprendizaje (status 1), Aliado Inteligente (status 0).
FASE 4 — Crear Insignias POR CURSO (course badges)
Patrón a repetir en cada curso. Documentar la primera vuelta en el curso piloto; luego replicar via UI (
Course badges → ⋮ → Duplicate).
URL de course badges: http://localhost:8080/badges/index.php?type=2&id=<PILOTO>
4.1 [UI] Insignia #6 "Explorador Inicial"
- Course badges → "Agregar una nueva insignia"
- Nombre:
Explorador Inicial, descripción:Completaste tu primera actividad del curso, imagen:06_explorador_inicial.png - Criterios → "Activity completion"
- Marcar cualquier 1 actividad → "Cualquiera de los seleccionados"
- "Habilitar acceso"
4.2 [UI] Insignia #7 "Reto Entregado"
- Course badges → "Agregar una nueva insignia"
- Nombre:
Reto Entregado, imagen07_reto_entregado.png - Criterios → "Activity completion"
- Marcar TODAS las tareas (assign) y cuestionarios (quiz) → "Cualquiera de los seleccionados"
- Habilitar acceso
4.3 [UI] Insignia #8 "Avance en Terreno" (50%)
Pre-requisito: el docente lista manualmente el 50% de actividades del curso.
- Course badges → "Agregar una nueva insignia"
- Nombre:
Avance en Terreno, imagen08_avance_en_terreno.png - Criterios → "Activity completion"
- Marcar el 50% → "Todas las seleccionadas" (AND)
- Habilitar acceso
4.4 [UI] Insignia #9 "Zona Superada"
Pre-requisito: identificar las CMs que componen un módulo/sección.
- Course badges → "Agregar una nueva insignia"
- Nombre:
Zona Superada, imagen09_zona_superada.png - Criterios → "Activity completion"
- Marcar TODAS las CMs del módulo → "Todas las seleccionadas"
- Habilitar acceso
Si hay N módulos, crear N copias ("Zona Superada — Módulo 1", "Módulo 2", …) cada una con las CMs de su módulo.
4.5 [UI] Insignia #10 "Impulso Renovado"
Pre-requisito: la actividad evaluable debe tener configurado Activity completion con "Requiere calificación de aprobación" (Settings de la actividad → "Conclusión de la actividad" → "Requiere calificación" + "Requiere calificación de aprobación").
- Course badges → "Agregar una nueva insignia"
- Nombre:
Impulso Renovado, imagen10_impulso_renovado.png - Criterios → "Activity completion"
- Marcar las evaluaciones con requisito de nota → "Cualquiera de los seleccionados"
- Habilitar acceso
4.6 [UI] Insignia #11 "Misión Cumplida"
Pre-requisito: el curso debe tener Course completion habilitado.
- Course badges → "Agregar una nueva insignia"
- Nombre:
Misión Cumplida, imagen11_mision_cumplida.png - Criterios → "Course completion"
- Habilitar acceso
4.7 [UI] Insignia #4 "Exploración Digital" (1 por módulo)
Pre-requisito: identificar 1 actividad representativa por módulo.
- Course badges → "Agregar una nueva insignia"
- Nombre:
Exploración Digital, imagen04_exploracion_digital.png - Criterios → "Activity completion"
- Marcar 1 actividad por módulo → "Todas las seleccionadas" (AND)
- Habilitar acceso
4.8 [SQL] Verificación de course badges del piloto
SELECT b.id, b.name, b.status, COUNT(bc.id) AS num_criteria
FROM mdl_badge b
LEFT JOIN mdl_badge_criteria bc ON bc.badgeid = b.id
WHERE b.type = 2 AND b.courseid = <PILOTO>
GROUP BY b.id;
Esperado: 7 badges, todas con status 1.
4.9 [Código] (Opcional) Replicar al resto de cursos
Moodle permite duplicar via UI (Course badges → ⋮ → Duplicate). Tras duplicar hay que volver a apuntar los course_modules del curso destino. Recomendación: para el primer release, duplicar manualmente y validar curso a curso.
Checkpoint 4
- Login como estudiante en el curso piloto
- Completar 1 actividad → debe otorgarse "Explorador Inicial"
- Ver
http://localhost:8080/badges/mybadges.php→ la badge aparece
FASE 5 — Activity Completion: Habilitación a Nivel Curso
5.1 [UI] Por cada curso del campus
- Settings del curso → "Completion tracking" = Yes
- Por cada actividad relevante: Settings → "Activity completion" → configurar condiciones (view, grade, submit)
5.2 [SQL] Verificar cursos con completion habilitado
SELECT id, fullname, enablecompletion FROM mdl_course WHERE enablecompletion = 0;
Esperado: ningún resultado (o solo cursos descartados explícitamente).
5.3 [SQL] Habilitar Course Completion para badge #11
UPDATE mdl_course SET enablecompletion = 1 WHERE id IN (<lista_de_courseids>);
Tras esto, definir el criterio en Course → More → Course completion → Edit.
FASE 6 — Insignia Diferida #12 "Aliado Inteligente"
Creada inactiva en 3.3. Cuando exista el tutor IA:
- [UI] Site badges → editar "Aliado Inteligente" → Criterios → elegir criterio apropiado (probablemente "Awarded badges" intermedio o "Manual issue by role" como fallback)
- Habilitar acceso
FASE 7 — Stash (Objetos): Sin Cambios
block_stash mantiene sus 4 objetos. No tocar. Solo verificar:
SELECT s.id, s.name, s.courseid
FROM mdl_block_stash s
JOIN mdl_block_stash_items i ON i.stashid = s.id;
Resumen de Cambios por Tipo de Acción
| Tipo | Cantidad | Detalle |
|---|---|---|
| [UI] Manual Admin UI | ~15 pasos | Configurar bloque XP, crear 10 badges, habilitar criterios |
| [SQL] SQL directo | 3 scripts | (1) backup, (2) actualizar levelsdata Gemas, (3) habilitar enablecompletion |
| [Archivos] Sistema de archivos | 8 + 10 PNGs | 8 imágenes Gema + 10 imágenes Insignia |
| [Código] Código fuente | 0 | No se modifica nada de Moodle ni de block_xp |
Verificación End-to-End
| # | Prueba | Cómo ejecutar | Resultado esperado |
|---|---|---|---|
| 1 | Gemas configuradas | SQL: SELECT levels, JSON_EXTRACT(levelsdata,'$.name') FROM mdl_block_xp_config WHERE enabled=1; | levels=8, lista Gema Alba…Gema Prisma |
| 2 | Imagen Gema 1 | Login estudiante → bloque XP en curso piloto | Imagen Gema Alba visible |
| 3 | XP al ver curso | Visitar curso varias veces | Acumulación XP > 0 |
| 4 | Subir nivel | Acumular ≥500 XP | Pop-up "Gema Aqua" |
| 5 | Badge #6 Explorador Inicial | Completar 1 actividad | Badge en /badges/mybadges.php |
| 6 | Badge #7 Reto Entregado | Enviar 1 tarea | Badge otorgada |
| 7 | Badge #8 Avance en Terreno | Completar 50% actividades | Badge otorgada |
| 8 | Badge #9 Zona Superada | Completar todas CMs del módulo | Badge otorgada |
| 9 | Badge #10 Impulso Renovado | Aprobar evaluación | Badge otorgada |
| 10 | Badge #11 Misión Cumplida | Completar el curso | Badge automática |
| 11 | Badge #4 Exploración Digital | Completar 1 actividad por módulo | Badge otorgada |
| 12 | Badge #5 Pionero del Aprendizaje | Completar 1 curso | Site badge otorgada |
| 13 | Badge #1 Primer Despegue | Completar actividad de bienvenida | Site badge otorgada |
| 14 | Badge #12 inactiva | SQL: SELECT status FROM mdl_badge WHERE name='Aliado Inteligente'; | status=0 |
| 15 | Stash intacto | SQL: 4 ítems en mdl_block_stash_items | Sin cambios |
Query maestra de auditoría:
SELECT b.name, b.type, COUNT(bi.id) AS otorgadas
FROM mdl_badge b
LEFT JOIN mdl_badge_issued bi ON bi.badgeid = b.id
GROUP BY b.id ORDER BY b.type, b.name;
Rollback
# Restaurar tablas tocadas:
docker exec -i colombiaaprende_db sh -c \
'exec mariadb -uroot -p"$MYSQL_ROOT_PASSWORD" moodle' \
< /Users/imac/Desktop/campusvirtual/database_backups/gamificacion_tablas_<TIMESTAMP>.sql
# Purgar cachés tras el rollback:
docker exec colombiaaprende_web php /var/www/html/admin/cli/purge_caches.php
Notas
- Implementación no-code, sin suscripción: solo Moodle nativo + block_xp Community.
- 2 insignias del Excel original (#2 Racha Conectada, #3 Ruta Activada) eliminadas: requerían código custom.
- 3 criterios ajustados: #1, #4, #10 (documentado en
Gamificación - Campus virtual_v2propuesta.xlsx). - 1 insignia diferida: #12 Aliado Inteligente, creada inactiva.
- Objetos
block_stashno se modifican. - El primer despliegue se ejecuta sobre un curso piloto antes de replicar al resto.