Saltar al contenido principal

local_pccntr8203403_dashboard

Tipo: local plugin
Ubicación: public/local/pccntr8203403_dashboard/
Versión: 1.2.0 (2026072700)
Requiere: Moodle 5.0+ (2025092600)
Alcance: 2 — Dashboard de aprendizaje (capa de datos reutilizada por el Alcance 3)
Estado: Estable

Propósito

Capa de datos del Dashboard de aprendizaje (Scope 2). Provee estadísticas de progreso, desempeño y alertas académicas del estudiante en un curso, sin acceso directo a mdl_* desde el tema o el bloque.

Clases

data\course_stats

Estadísticas de un estudiante en un curso concreto. Todas las consultas usan las APIs de Moodle (completion_info, grade_get_course_grade, get_logs), no SQL raw.

MétodoDescripción
get_user_progress($course, $userid)Porcentaje de completación (completed / total × 100). Retorna null si el seguimiento de completación no está habilitado.
get_user_module_progress($course, $userid)Progreso desglosado por sección (módulo). Retorna lista [name, pct, complete, activities].
get_user_course_grade($courseid, $userid)Calificación final del estudiante en el curso (escala 0–5).
get_course_average_grade($courseid)Promedio de calificaciones de todos los estudiantes matriculados.
get_pending_activities($courseid, $userid)Cantidad de actividades sin completar con fecha límite.
get_learning_streak($userid)Días consecutivos con actividad registrada en logs.
get_latest_grades($courseid, $userid)Últimas calificaciones recibidas (módulo, nota, fecha).
get_nearest_due_hours($courseid, $userid)Horas hasta la próxima entrega más cercana.
get_days_since_last_access($courseid, $userid)Días desde el último acceso al curso.
get_expected_progress_pct($course)Porcentaje esperado de avance según la duración del curso y la fecha actual.
get_participation_counts($courseid, $userid)Conteo de participaciones en foros y actividades interactivas.
get_pending_evaluations($courseid, $userid)Evaluaciones entregadas pero aún sin calificar.
get_inactive_progress_days($courseid, $userid)Días con acceso registrado pero sin progreso real (completaciones).
get_modules_behind_count($course, $userid)Secciones que deberían estar completas según la fecha esperada pero no lo están.

data\student_stats

Estadísticas globales del estudiante (todos sus cursos). Usada por el Stats Row del Área personal (/my/).

MétodoDescripción
get_active_courses($userid)Cursos matriculados con actividad en los últimos 30 días.
get_pending_activities_global($userid)Total de actividades pendientes en todos los cursos activos.
get_upcoming_events($userid)Próximos eventos del calendario Moodle del usuario.
get_completed_courses($userid)Cursos con criterio de finalización marcado como completado.

data\academic_alerts

Motor de alertas académicas con 12 tipos (ver Alertas académicas). Presentación-agnóstico: retorna códigos + nivel + flag motivacional.

data\attention_courses

Vista transversal del motor de alertas: recorre las matrículas del estudiante y devuelve los cursos con alertas de riesgo. Usada por el bloque "Cursos que necesitan atención" del Área personal.

MétodoDescripción
get_for_user($userid, $limit = 3)Cursos con al menos una alerta no motivacional, ordenados por severidad (critico antes que leve) y luego por cantidad de alertas. Retorna [course, alertcount, topcode, toplevel].

Acota su costo en tres frentes: evalúa como máximo MAX_EVALUATED (10) matrículas por petición en orden de acceso más reciente, memoiza el resultado por curso en la caché useralerts y filtra cursos inaccesibles con can_access_course().

Optimización de rendimiento (caché)

data\course_stats cachea sus resultados en dos niveles para acotar el costo por vista de curso: el banner "Tu desempeño académico" y la modal "Ver mi avance" invocan varios métodos 2-3 veces en la misma petición, y los agregados de curso (promedios y rachas) requieren escanear mdl_logstore_standard_log para todos los matriculados — sin caché esto suma ~25-30 consultas por carga de course/view.php.

Memoización por request

Los métodos por usuario que se invocan varias veces en la misma petición usan un caché estático en memoria (self::$requestcache, helper remember()), válido solo durante el request actual:

  • get_user_progress($course, $userid)
  • get_user_module_progress($course, $userid)
  • get_user_course_grade($courseid, $userid)

Caché MUC de aplicación (db/caches.php)

Los agregados de curso (iguales para todos los estudiantes, o estables durante el día) se guardan en cachés de aplicación de Moodle (MUC):

Definición de cachéTTLUsada por
courseaverages1 horaget_course_average_progress, get_course_average_grade, get_course_average_streak
userstreaks2 días (clave incluye el día)get_user_streak, get_inactive_progress_days
useralerts2 días (clave incluye el día)attention_courses::get_for_user — resumen de alertas de riesgo por curso y usuario

La lógica de cómputo original de cada método se movió a un método privado compute_*(); el método público ahora consulta la caché, y si hay miss, calcula y guarda el resultado.

Tablas de base de datos

El plugin no crea tablas propias. Consulta exclusivamente tablas core de Moodle:

Tabla MoodleUso
mdl_course_modules_completionCompletación de actividades
mdl_grade_grades, mdl_grade_itemsCalificaciones
mdl_logstore_standard_logLogs de actividad para racha y accesos
mdl_assign_submissionFechas límite de entregas
mdl_eventEventos del calendario
mdl_course_sectionsEstructura de secciones del curso

Instalación

El plugin se instala como parte del procedimiento de despliegue estándar (copia de código → propietario → upgrade.php → purga de cachés). No requiere configuración adicional tras la instalación.

Dependencias

  • block_pccntr8203403_atencion declara dependencia formal sobre este plugin (version.php) y consume attention_courses.
  • theme_cdigital consume las clases de datos directamente desde su renderer (course_stats, academic_alerts) y desde el layout mydashboard.php (student_stats).

Capa de Web Services

El plugin tiene una primera función externa, ajax => true, de solo lectura, consumida por theme_cdigital para la card de curso:

FunciónDescripción
local_pccntr8203403_dashboard_get_course_teachersDevuelve [{courseid, teachers}] con los nombres de los docentes ("course contacts") de cada curso, vía core_course_category::preload_course_contacts() + core_course_list_element::get_course_contacts(). Filtra cursos inexistentes o sin acceso del usuario.

Definida en classes/external/get_course_teachers.php, registrada en db/services.php.

Exposicion via API — Scope 3 (pendiente)

Más allá de la función anterior, los datos de alertas, progreso y calificaciones de course_stats, student_stats y academic_alerts aún no son consultables desde fuera de Moodle via REST ni token.

La estructura de retorno de las funciones principales ya es serializable sin cambios:

// academic_alerts::get_active_alerts() → listo para external_multiple_structure
['code' => string, 'level' => 'leve'|'critico', 'motivational' => bool]

La implementacion de la capa externa esta decidida y documentada en el ADR correspondiente.

Ver: ADR-001 — Capa Web Services para datos del dashboard