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étodo | Descripció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étodo | Descripció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étodo | Descripció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é | TTL | Usada por |
|---|---|---|
courseaverages | 1 hora | get_course_average_progress, get_course_average_grade, get_course_average_streak |
userstreaks | 2 días (clave incluye el día) | get_user_streak, get_inactive_progress_days |
useralerts | 2 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 Moodle | Uso |
|---|---|
mdl_course_modules_completion | Completación de actividades |
mdl_grade_grades, mdl_grade_items | Calificaciones |
mdl_logstore_standard_log | Logs de actividad para racha y accesos |
mdl_assign_submission | Fechas límite de entregas |
mdl_event | Eventos del calendario |
mdl_course_sections | Estructura 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_atenciondeclara dependencia formal sobre este plugin (version.php) y consumeattention_courses.theme_cdigitalconsume las clases de datos directamente desde su renderer (course_stats,academic_alerts) y desde el layoutmydashboard.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ón | Descripción |
|---|---|
local_pccntr8203403_dashboard_get_course_teachers | Devuelve [{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.