Academia Deltamontero · Documentación
Desarrollolocal_deltamodules

Certificados

Certificado de cada módulo con mod_customcert - plantilla del sitio, bloqueo por completado, candado real, revocación y verificación por código.

Los módulos entregan su certificado con mod_customcert. (mod_coursecertificate y tool_certificate están instalados, pero sus plantillas quedan solo para el super administrador; los módulos usan customcert.) En el código intervienen varias piezas:

PiezaPapel
create-certificate-template.phpCrea la plantilla del sitio "Certificado Deltamontero".
builder::add_certificate(), builder::load_cert_template()Agregan el certificado a un módulo y copian el diseño de una plantilla.
academy::gate_certificate()Restricción de acceso: el certificado se desbloquea al completar lo exigido.
local_deltacertsAplica el bloqueo a cualquier certificado nuevo de cualquier curso (página).
gate-certificates.phpRecalcula el bloqueo en cada despliegue y revoca certificados emitidos a quien ya no cumple.
patch-cert-completion-gate.phpCandado real en customcert/view.php, también para gestores.
Reglas cert_enabled, cert_template, cert_requiresVer Reglas.
verifycert.phpVerificación por código.

Plantilla del sitio

create-certificate-template.php (paso cosmético de moodle-config.sh) crea en contexto de sistema la plantilla "Certificado Deltamontero": página A4 horizontal (297 × 210 mm) con imagen de fondo (/opt/delta-logos/cert-background.png), título, "Otorgado a", nombre del estudiante, "Por haber…", nombre del curso, fecha y código. Se crea una vez por versión del diseño (TEMPLATE_VERSION = 1, configuración certtemplate_version): los cambios hechos desde la plataforma se respetan; para volver a generarla hay que subir TEMPLATE_VERSION. rename-brand.php corre antes para renombrar plantillas con el nombre antiguo de la marca.

rules::cert_templates() lista las plantillas del sitio con "Certificado Deltamontero" primero. Al cambiar la regla "Diseño del certificado", standard::apply_certificate() vuelve a copiar el diseño en los certificados de los módulos afectados; los ya emitidos conservan su código y se descargan con el diseño nuevo.

Agregar el certificado a un módulo

builder::add_certificate($courseid, $templateid) crea una sección "Certificado" al final con la actividad "Certificado del curso" (entrega I, en línea; verifyany = 1; sin correos). Si el curso ya tiene un certificado devuelve su cmid; si no existe la plantilla, devuelve null. Con la regla cert_enabled = 0, apply_certificate() oculta el certificado (y su sección si solo lo contiene); con 1 y sin certificado, lo crea.

moodle-config.sh repara en cada arranque los certificados con deliveryoption inválido (inline → I, download → D), que rompían TCPDF.

Bloqueo por completado

academy::gate_certificate($courseid) escribe la misma restricción en todos los certificados del curso:

  1. Exige el completado de todas las actividades visibles con seguimiento, menos los certificados. Con la regla cert_requires = quizzes (y si hay repasos), solo los repasos.
  2. Contenido parcial por cargo: si el tema de una actividad tiene la restricción "no pertenecer al grupo G" (apply-partial-content-by-cargo.php), la condición pasa a "completarla o ser del grupo G"; si el tema es solo para el grupo G (guías del manual), pasa a "completarla o no ser del grupo G".
  3. Un módulo sin actividades que completar recibe academy::CERT_LOCKED: una condición de fecha imposible (año 2100) y oculta, de modo que el certificado queda bloqueado e invisible hasta que el módulo tenga contenido.

Se llama al crear o editar actividades (standard::module_changed), al aplicar reglas, al cargar preguntas y desde local_deltacerts. El criterio de completado del curso (apply_course_completion) sigue la misma lógica.

gate-certificates.php (dos pasos críticos de moodle-config.sh; también acepta un nombre corto como argumento) aplica la misma restricción a todos los cursos con certificado y además borra de customcert_issues los certificados emitidos a personas que ya no cumplen el completado (respetando las excepciones por grupo). El curso induccion_ia queda fuera de la revocación.

La revocación borra registros de emisión. Si se agrega una actividad con seguimiento a un módulo ya terminado por muchas personas, en el siguiente despliegue sus certificados se revocan hasta que completen la actividad nueva.

Candado real

Los perfiles de gestión tienen capacidades que se saltan las restricciones de disponibilidad (viewhiddenactivities, ignoreavailabilityrestrictions). El parche patch-cert-completion-gate.php agrega a mod/customcert/view.php la variable $deltacomplete, calculada con core_availability\info_module::is_available(…, false, …) (sin el atajo de gestor): el botón de descarga solo se muestra y la descarga propia (downloadown) solo funciona si se cumplen los requisitos. El super administrador queda exceptuado para poder verificar. El reporte de destinatarios y la descarga de certificados de otros no cambian. verify-patches.php exige el marcador $deltacomplete.

En la lista "No disponible hasta que…" del certificado, el JavaScript global oculta lo que la persona ya completó usando el servicio local_deltamodules_get_completed_cmids.

Verificación por código

verifycert.php?code=… busca el código impreso en customcert_issues (exacto y, si no, sin distinguir mayúsculas) y muestra a quién se emitió, de qué módulo y cuándo, con acceso al historial de la persona. Capacidad: mod/customcert:verifycertificate o moodle/user:viewalldetails. Aparece en Usuarios → Cuentas → Verificar un certificado y en General → Certificados (local_deltamodules_verifycert y local_deltamodules_certverify en settings.php), junto con el acceso a las plantillas de customcert (local_deltamodules_certtemplates, capacidad mod/customcert:manage).

Al completar un módulo, el correo completed incluye el enlace al certificado visible (ver Correo).

En esta página