Saltar al contenido principal

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

CapaPluginMecánica
Gemasblock_xp CommunityXP acumulado → nivel con imagen personalizada
InsigniasMoodle Badges (mdl_badge_issued)Criterio cumplido → OpenBadge certificado
Objetosblock_stashÍtem coleccionable por módulo (sin cambios)

Alcance v2 (10 insignias activas)

#InsigniaEstadoTipoMecanismo nativo
1Primer DespegueActiva (criterio ajustado)Site badgeActivity completion del curso de bienvenida
2Racha ConectadaELIMINADANo implementable sin código
3Ruta ActivadaELIMINADANo implementable sin código
4Exploración DigitalActiva (criterio ajustado)Course badgeActivity completion (1 por módulo)
5Pionero del AprendizajeActivaSite badgeCompleting a set of courses (N=1)
6Explorador InicialActivaCourse badgeActivity completion (cualquier 1)
7Reto EntregadoActivaCourse badgeActivity completion (tareas/quiz)
8Avance en TerrenoActivaCourse badgeActivity completion (50% manual)
9Zona SuperadaActivaCourse badgeActivity completion (todas del módulo)
10Impulso RenovadoActiva (criterio ajustado)Course badgeActivity completion con grade condition
11Misión CumplidaActivaCourse badgeCourse completion
12Aliado InteligenteDiferida (inactiva)Site badgePendiente 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):

NivelNombreXP mínimo
1Gema Alba0
2Gema Aqua500
3Gema Violeta1.000
4Gema Esmeralda1.500
5Gema Solar2.000
6Gema Coral2.500
7Gema Índigo3.000
8Gema Prisma3.500

Entorno de Ejecución (referencia para todos los pasos)

RecursoValor
Container DBcolombiaaprende_db (mariadb:10.11)
Container webcolombiaaprende_web (PHP 8.3)
BDmoodle (user moodle, password en local/.env)
Web root/Users/imac/Desktop/campusvirtual/local/APP158C/public/
Moodledata/Users/imac/Desktop/campusvirtual/local/moodledata/
Admin URLhttp://localhost:8080/admin/
Variables .envMYSQL_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:

  1. Ir al curso → Activar edición
  2. En el bloque "Level Up XP" → engranaje → "Configuración"
  3. Pestaña "Niveles" → marcar "Permitir personalizar los niveles"
  4. Cambiar número de niveles a 8
  5. 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:

  1. Curso piloto → bloque XP → Configuración → Niveles
  2. Para cada nivel (1 a 8) → "Imagen" → cargar el PNG correspondiente
  3. 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

  1. Login como usuario de prueba en el curso piloto
  2. Bloque XP debe mostrar "Gema Alba" como nivel 1, próximo nivel en 500 XP
  3. SQL: SELECT courseid, levels FROM mdl_block_xp_config WHERE enabled=1 debe mostrar levels=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:

  1. Ir a http://localhost:8080/badges/index.php?type=1 (Site badges)
  2. "Agregar una nueva insignia"
  3. Detalles:
    • Nombre: Primer Despegue
    • Descripción: Iniciaste tu recorrido en Campus Virtual
    • Emisor: nombre del campus
    • Imagen: 01_primer_despegue.png
  4. Guardar → pestaña "Criterios"
  5. 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".

  1. Crear primero la badge intermedia "Bienvenida" en el curso de bienvenida (patrón Fase 4), luego volver y seleccionarla como criterio
  2. Pestaña "Resumen""Habilitar acceso"

3.2 [UI] Insignia #5 "Pionero del Aprendizaje"

  1. Site badges → "Agregar una nueva insignia"
  2. Detalles:
    • Nombre: Pionero del Aprendizaje
    • Descripción: Completaste tu primer curso en Campus Virtual
    • Imagen: 05_pionero_aprendizaje.png
  3. Criterios → "Completing a set of courses"
  4. Seleccionar lista de cursos → "Cualquiera de los cursos seleccionados" → mínimo 1
  5. "Habilitar acceso"

3.3 [UI] Insignia #12 "Aliado Inteligente" (DIFERIDA, crear inactiva)

  1. Site badges → "Agregar una nueva insignia"
  2. Nombre: Aliado Inteligente, descripción: Usaste la tutora virtual para resolver una duda, imagen: 12_aliado_inteligente.png
  3. 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"

  1. Course badges → "Agregar una nueva insignia"
  2. Nombre: Explorador Inicial, descripción: Completaste tu primera actividad del curso, imagen: 06_explorador_inicial.png
  3. Criterios → "Activity completion"
  4. Marcar cualquier 1 actividad → "Cualquiera de los seleccionados"
  5. "Habilitar acceso"

4.2 [UI] Insignia #7 "Reto Entregado"

  1. Course badges → "Agregar una nueva insignia"
  2. Nombre: Reto Entregado, imagen 07_reto_entregado.png
  3. Criterios → "Activity completion"
  4. Marcar TODAS las tareas (assign) y cuestionarios (quiz) → "Cualquiera de los seleccionados"
  5. Habilitar acceso

4.3 [UI] Insignia #8 "Avance en Terreno" (50%)

Pre-requisito: el docente lista manualmente el 50% de actividades del curso.

  1. Course badges → "Agregar una nueva insignia"
  2. Nombre: Avance en Terreno, imagen 08_avance_en_terreno.png
  3. Criterios → "Activity completion"
  4. Marcar el 50% → "Todas las seleccionadas" (AND)
  5. Habilitar acceso

4.4 [UI] Insignia #9 "Zona Superada"

Pre-requisito: identificar las CMs que componen un módulo/sección.

  1. Course badges → "Agregar una nueva insignia"
  2. Nombre: Zona Superada, imagen 09_zona_superada.png
  3. Criterios → "Activity completion"
  4. Marcar TODAS las CMs del módulo → "Todas las seleccionadas"
  5. 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").

  1. Course badges → "Agregar una nueva insignia"
  2. Nombre: Impulso Renovado, imagen 10_impulso_renovado.png
  3. Criterios → "Activity completion"
  4. Marcar las evaluaciones con requisito de nota → "Cualquiera de los seleccionados"
  5. Habilitar acceso

4.6 [UI] Insignia #11 "Misión Cumplida"

Pre-requisito: el curso debe tener Course completion habilitado.

  1. Course badges → "Agregar una nueva insignia"
  2. Nombre: Misión Cumplida, imagen 11_mision_cumplida.png
  3. Criterios → "Course completion"
  4. Habilitar acceso

4.7 [UI] Insignia #4 "Exploración Digital" (1 por módulo)

Pre-requisito: identificar 1 actividad representativa por módulo.

  1. Course badges → "Agregar una nueva insignia"
  2. Nombre: Exploración Digital, imagen 04_exploracion_digital.png
  3. Criterios → "Activity completion"
  4. Marcar 1 actividad por módulo → "Todas las seleccionadas" (AND)
  5. 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

  1. Settings del curso → "Completion tracking" = Yes
  2. 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:

  1. [UI] Site badges → editar "Aliado Inteligente" → Criterios → elegir criterio apropiado (probablemente "Awarded badges" intermedio o "Manual issue by role" como fallback)
  2. 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

TipoCantidadDetalle
[UI] Manual Admin UI~15 pasosConfigurar bloque XP, crear 10 badges, habilitar criterios
[SQL] SQL directo3 scripts(1) backup, (2) actualizar levelsdata Gemas, (3) habilitar enablecompletion
[Archivos] Sistema de archivos8 + 10 PNGs8 imágenes Gema + 10 imágenes Insignia
[Código] Código fuente0No se modifica nada de Moodle ni de block_xp

Verificación End-to-End

#PruebaCómo ejecutarResultado esperado
1Gemas configuradasSQL: SELECT levels, JSON_EXTRACT(levelsdata,'$.name') FROM mdl_block_xp_config WHERE enabled=1;levels=8, lista Gema Alba…Gema Prisma
2Imagen Gema 1Login estudiante → bloque XP en curso pilotoImagen Gema Alba visible
3XP al ver cursoVisitar curso varias vecesAcumulación XP > 0
4Subir nivelAcumular ≥500 XPPop-up "Gema Aqua"
5Badge #6 Explorador InicialCompletar 1 actividadBadge en /badges/mybadges.php
6Badge #7 Reto EntregadoEnviar 1 tareaBadge otorgada
7Badge #8 Avance en TerrenoCompletar 50% actividadesBadge otorgada
8Badge #9 Zona SuperadaCompletar todas CMs del móduloBadge otorgada
9Badge #10 Impulso RenovadoAprobar evaluaciónBadge otorgada
10Badge #11 Misión CumplidaCompletar el cursoBadge automática
11Badge #4 Exploración DigitalCompletar 1 actividad por móduloBadge otorgada
12Badge #5 Pionero del AprendizajeCompletar 1 cursoSite badge otorgada
13Badge #1 Primer DespegueCompletar actividad de bienvenidaSite badge otorgada
14Badge #12 inactivaSQL: SELECT status FROM mdl_badge WHERE name='Aliado Inteligente';status=0
15Stash intactoSQL: 4 ítems en mdl_block_stash_itemsSin 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_stash no se modifican.
  • El primer despliegue se ejecuta sobre un curso piloto antes de replicar al resto.