Complemento SENCE · Documentación técnica

block_sence 4.0.5 (version 2026100700) · Moodle 4.5 LTS y 5.0 · PHP 8.1 o superior · GPL v3 · Norteduc Edtech SpA

1. Arquitectura

PiezaArchivo
Bloque en el cursoblock_sence.php → classes/local/attendance.php, plantilla templates/session_form.mustache, AMD locker y timer; bloqueo en el servidor en lib.php (block_sence_after_require_login() → attendance::locked())
Retorno de SENCE (sin sesión)retorno.php + retorno_lib.php (token firmado, coherencia, glosa de errores del Anexo 2)
PanelPáginas index, credentials, courses, blocks, records, connection, errors, students, notices, users, audit, licence, docs, export; presentación en classes/local/ui.php y plantillas panel*.mustache; tablas ordenables y con buscador en amd/src/tables.js
Lógicaotecs, course_config, attendance, inactivity (4.0.2), placement, reports, connection, notices, transport, exporter, audit, panel, panelusers, rut, migration
Código común Norteducnorteduc_license, norteduc_panel_perms, norteduc_updates (copias idénticas, /root/moodle-plugins/shared/sync.py)

No hay servicios externos fuera de SENCE (formulario del navegador), el servidor de licencias (activación una vez y version/sence.json diario) y el SMTP opcional. No hay CDN en la interfaz.

2. Flujo con SENCE

  1. El bloque arma un formulario POST hacia https://sistemas.sence.cl/rce/Registro/IniciarSesion (o /rcetest/ si la OTEC está en pruebas) con RutOtec, Token, LineaCapacitacion, RunAlumno (normalizado), CodSence, CodigoCurso (ID de acción del grupo), UrlRetoma y UrlError (/blocks/sence/retorno.php) e IdSesionAlumno = token firmado userid.courseid.expira.hmac (24 h).
  2. SENCE devuelve al navegador con un POST cross-site a retorno.php, que corre con NO_MOODLE_COOKIES: valida la firma, comprueba que RUN, ID de acción y código SENCE coincidan con lo esperado y que el token no haya iniciado otra sesión, escribe {block_sence} y {block_sence_intento} y redirige con GET al curso (la cookie SameSite=Lax viaja).
  3. El cierre llega sin IdSesionSence; se acepta aunque el token haya vencido si su firma es válida y hay una sesión abierta con él.
  4. Se mantiene el camino previo a 3.5 (POST directo a la página del curso) para sitios con SameSite=None, con las mismas comprobaciones.
SENCE no firma su respuesta: el espejo local se valida por coherencia, pero el registro oficial es el de SENCE (Libro de Clases Electrónico). Los cambios de configuración mantienen sincronizadas las claves 3.x de la instancia del bloque (codigoCurso, lineaCap…) para complementos que las leen, como Registro de avances.

3. Base de datos

TablaContenido
block_senceSesiones aceptadas (sin cambios de 3.x; índices nuevos por curso/usuario e idsesionalumno)
block_sence_intentoCada retorno: ok, error (GlosaError), token_invalido, incoherente; desde 4.0.2 también los cierres por inactividad (tipo=inactivo, resultado=inactividad, con el RUN y el ID de acción)
block_sence_otecNombre, RUT, token, ambiente
block_sence_courseConfiguración por curso (código, línea, vigencia, OTEC, cierre, becarios). Las columnas required, showlogo, renewal y sessionhours se conservan por compatibilidad, pero desde 4.0.1 no se leen: course_config::fixed_rules() fija required=1, showlogo=1, renewal=daily
block_sence_groupGrupo de Moodle → ID de acción y OTEC
block_sence_connSegundos y conexiones por alumno, curso y día
block_sence_mailAvisos enviados o fallidos
block_sence_puserUsuarios del panel y permisos por sección (JSON)
block_sence_auditBitácora de cambios (sin secretos)

Preferencias de usuario (4.0.2, solo estudiantes con franquicia): block_sence_lastactive (última actividad) y block_sence_idlecourse (curso SENCE de esa actividad); se ignoran si son anteriores al inicio de sesión actual ($USER->currentlogin).

Ajustes en config_plugins: codigo_activacion, comprobante_activacion, retornosecret, notices_*, mailtransport, smtp*, update_*. La configuración por curso no viaja en los respaldos de curso.

4. Migración 3.x → 4.0

db/upgrade.php (2026100200) crea las tablas, agrega índices y llama a \block_sence\local\migration::from_3x() (idempotente): OTEC desde el JSON otecs y testenv; por cada instancia del bloque en un curso, su configuración (otec, codigoCurso, lineaCap, grupoBecas, asistenciaObligatoria, senceTiempoCierre, muestraLogo, vnModo); grupos «SENCE-XXXXXXX». asistenciaObligatoria, muestraLogo y la renovación de 3.x se ignoran: se guardan las reglas fijas (required=1, showlogo=1, renewal=daily). db/upgrade.php 2026100401 (4.0.1) alinea las filas ya existentes con un UPDATE sin cambiar el esquema. Se eliminan conectividad_enabled, validanet_url, validanet_apikey, require_activation, otecs, testenv; una OTEC con RUT o token ilegible se respalda en otecs_3x_backup.

4.1 Reglas fijas de SENCE (4.0.1 y 4.0.2)

4.2 Auditoría de ajustes frente a SENCE (4.0.1, actualizada en 4.0.2)

Regla: el complemento viene preconfigurado con lo que SENCE exige y no ofrece opciones que SENCE pueda rechazar.

AjusteEstadoFuente
Asistencia obligatoria para estudiantes con franquicia (curso tapado y actividades bloqueadas en el servidor)FijoGuía participante e-learning v2.0 (2026): el registro de conexión acredita la participación y se necesita al menos una sesión para la Declaración Jurada
Nuevo inicio de sesión: una vez al día (día calendario, hora de Chile)FijoGuía participante e-learning v2.0 (2026): la sumatoria de las sesiones debe ser coherente con las horas acreditadas
Logo de SENCE bajo el botón de asistenciaFijoRegla de Norteduc (identifica el registro oficial)
Direcciones de inicio y cierre (rce en producción, rcetest en pruebas)Fijo según el ambiente de la OTECManual de integración v1.1.6, §3.2, §3.3, §4, §5 y Anexo 1
UrlRetoma y UrlError = /blocks/sence/retorno.php (máx. 100 caracteres; el panel avisa si se supera)FijoManual de integración v1.1.6, §3.2 (largo 100; errores 201, 202 y 203)
Inicio por redirección del navegador (POST) con ClaveÚnica y enlace a claveunica.gob.cl junto al botónFijoManual de integración v1.1.6, §2 y §3.2; Res. Ex. 2436 (2019) y 2584 (2021) citadas en la Guía participante e-learning v2.0 (2026)
Formato de parámetros: RutOtec y RunAlumno sin puntos con guion, token en mayúsculas, IdSesionAlumno firmado (menos de 149 caracteres)Fijo (normalización automática)Manual de integración v1.1.6, §3.2 (errores 207 y 209)
CodSence vacío en la línea 1; CodigoCurso = ID de acción del grupoFijoManual de integración v1.1.6, §3.2 y anexo de programas sociales
Mensajes de error de SENCE explicados en españolFijoManual de integración v1.1.6, §3.2 y Anexo 2
Zona horaria del día SENCE: America/SantiagoFijoManual de integración v1.1.6, parámetro ZonaHoraria; regla «una vez al día»
Cronómetro de la sesión en pantalla y alerta 10 minutos antes de que termineFijo (nuevo en 4.0.1)Manual de integración v1.1.6, §2 Paso 3, recomendaciones a y b
Tiempo de conexión: solo tiempo activo (deja de contar tras 5 minutos sin actividad; nueva conexión tras 30 minutos)FijoRes. Ex. 4027 (ventana de 45 minutos entre clics; cierre por inactividad a los 60 minutos): el criterio del complemento es más estricto
Cierre de la sesión de Moodle por inactividad a los 60 minutos (aviso a los 55 con «Seguir conectado»), solo estudiantes con franquicia; no cierra la sesión SENCE del díaFijo (nuevo en 4.0.2; ya no depende del «Tiempo de espera» de Moodle, que queda como información en el Resumen)Res. Ex. 4027 (2022), Instructivo de diseño e-learning: cierre por inactividad obligatorio a los 60 minutos
RUT de la OTECDato obligatorio, validado (dígito verificador)Manual de integración v1.1.6, §3.2 (error 209)
Token de la OTECDato obligatorio, validado (formato de 36 caracteres)Manual de integración v1.1.6, §3.1 (errores 211, 212 y 303)
Ambiente de pruebas o de producciónDato obligatorioManual de integración v1.1.6, §4 y §5
Línea de capacitación (1, 3 o 6)Dato obligatorio, solo valores del manualManual de integración v1.1.6, §3.2 (error 206)
Código SENCE (10 dígitos; vacío en la línea 1; -1 solo con OTEC en pruebas)Dato obligatorio, validadoManual de integración v1.1.6, §3.2 y §4 (error 204)
ID de acción de cada grupo (7 a 50 caracteres, menos en FPT, guiones en programas sociales; -1 solo en pruebas)Dato obligatorio, validadoManual de integración v1.1.6, §3.2 y §4 (error 205)
Vigencia del curso (fuera de fechas el bloque no se muestra)Dato de la OTEC (opcional)Manual de integración v1.1.6, Anexo 2 (error 309); Guía participante e-learning v2.0 (2026)
Estudiantes sin grupo SENCE: no franquiciados (sin asistencia, bloqueo, avisos ni cierre por inactividad)Fijo (nuevo en 4.0.2)Decisión de Norteduc (04-10-2026): solo quien va por franquicia tiene un ID de acción; no hay que inscribir a los demás en un grupo (cursos abiertos)
Grupo de becariosDato de la OTEC (opcional desde 4.0.2, por compatibilidad)Regla de Norteduc: quienes no tienen franquicia no registran asistencia
OTEC por curso o por grupoDato de la OTECManual de integración v1.1.6, §3.2 (RutOtec y Token en cada POST)
Pedir la sesión SENCE (desmarcado: solo tiempo de conexión)Opcional; el panel avisa si el curso tiene grupos SENCEPara cursos sin franquicia; no genera rechazos de SENCE
Pedir cierre de sesiónOpcionalGuía participante e-learning v2.0 (2026): el cierre se registra «en caso de existir»; no causa rechazos
Región y posición del bloqueOpcionalPresentación; no afecta a SENCE
Avisos por correo, informes por correo y envío de correos (SMTP)Opcional (licencia)Comunicación interna; no afecta a SENCE
Usuarios del panel y bitácoraOpcional (licencia)Administración interna; no afecta a SENCE

4.3 Filtro por OTEC (4.0.4)

5. Acceso, permisos y licencia

6. Tareas, ganchos y eventos

7. Privacidad

classes/privacy/provider.php declara y exporta/borra sesiones, intentos, tiempo de conexión y avisos (contexto de curso) y usuarios del panel, bitácora y avisos recibidos (contexto de sistema). Declara también la transferencia a SENCE y al SMTP y, desde 4.0.2, las preferencias de usuario del cierre por inactividad (user_preference_provider).

8. Pruebas y simulador