Plataforma LMS — Estafeta
Plataforma de aprendizaje (LMS) desarrollada a la medida para Grupo Estafeta. Administra cursos/categorías, recursos SCORM, evaluaciones, encuestas, gamificación (insignias/sellos), constancias y reportes de avance de los colaboradores.
Sitio de producción: https://induccion-estafeta.com.mx/
Tabla de contenido
- Stack utilizado
- Arquitectura y estructura
- Funcionalidades principales
- Modelo de datos
- Requisitos
- Instalación
- Configuración
- Seguridad
- Convenciones
- Roadmap / pendientes
Stack utilizado
Backend
- PHP 7.4 (Apache +
mod_php, ea-php74) - MySQL / MariaDB (extensión
mysqli) - Composer con:
phpoffice/phpspreadsheet— generación/lectura de Excelmpdf/mpdf— generación de PDF (constancias, reportes)swiftmailer/swiftmailer— envío de correo
Frontend
- HTML5, CSS3, JavaScript (jQuery 3.4.1)
- Bootstrap 4 + bootstrap-select
- DataTables (+ checkboxes, searchpanes, select) — tablas de administración
- SweetAlert2 — modales/alertas
- Uppy — carga de archivos (imágenes, paquetes SCORM)
- Trumbowyg — editor WYSIWYG
- Highcharts — gráficas de reportes
- Select2, Daterangepicker, Moment, Lodash, Owl Carousel, signature_pad — apoyo de UI
- Librerías de exportación: excelexportjs, js-xlsx, FileSaver
SCORM
- RTE propio en
runtime/que implementa SCORM 1.2 (APILMSInitialize,LMSGetValue,LMSSetValue,LMSCommit,LMSFinish) y lanza los paquetes en un<iframe>.
Arquitectura y estructura
Aplicación PHP monolítica de múltiples páginas (sin framework), con endpoints AJAX que devuelven JSON y vistas HTML que se cargan dinámicamente en el panel de administración.
Estafeta/
├── index.php # Login (solo número de empleado)
├── dashboard.php # Panel del alumno (categorías asignadas)
├── recursos.php # Recursos de una categoría (?idcat=)
├── pasaporte.php # Pasaporte de sellos del alumno
├── evaluaciones.php # Evaluaciones
├── encuestas.php # Encuestas
├── certificate.php # Constancias
├── config.php # Configuración + conexión a BD + helpers
├── sessionManager.php # Bootstrap de sesión (redirige a logout si no hay sesión)
├── header.php / footer.php # Layout común
├── runtime/ # RTE SCORM (api, sco, commit, finish, gotorte, newlogin...)
├── controller/ # Endpoints JSON del front del alumno
├── admin/ # Panel de administración (endpoints + vistas .html)
│ ├── index.php # Layout admin (carga secciones en .mainseccion)
│ ├── auth_guard.php # Guard de autenticación + CSRF
│ ├── audit.php # Registro de auditoría (logs/admin.log)
│ └── *.php / *.html # Módulos (usuarios, categorías, recursos, etc.)
├── cron_report/ # Tareas programadas (avance/sellos)
├── evaluaciones/ # Lógica de evaluaciones
├── data/ # Datos subidos: scormpkg/, recursos/, imgcat/, ...
│ └── .htaccess # Bloquea ejecución de scripts en data/
├── logs/ # Bitácora de auditoría (.htaccess de protección)
├── vendor/ # Dependencias Composer
└── js/ css/ img/ webfonts/ # Recursos frontend
Funcionalidades principales
Alumno / Colaborador
- Ingreso con número de empleado.
- Dashboard con las categorías/cursos asignados, agrupados por categoría padre e hijos.
- Cursos SCORM: apertura de paquetes SCORM 1.2 en un contenedor con barra superior, botón "Regresar al menú anterior" (con scroll y resaltado de la categoría al volver) y registro de avance.
- Progreso y sellos: marca de
completed/passedpor recurso; pasaporte de sellos por categoría. - Evaluaciones y encuestas.
- Constancias en PDF al completar objetivos.
Administración
Panel en admin/ (carga secciones vía AJAX en un layout):
- Usuarios: alta/edición/baja, carga masiva, roles, centros/distritos/posiciones/sociedades/divisiones.
- Categorías: jerarquía (padre/hijo), clave, imagen, orden, habilitado.
- Recursos (SCORM): alta/edición, URL del paquete, imagen; carga de
.zipSCORM que se descomprime endata/scormpkg/<categoría>/y genera la URL automáticamente (soporta Storyline, Rise y HTML). - Asignaciones: asignación de categorías a usuarios (individual y masiva).
- Evaluaciones / Encuestas: preguntas, opciones, respuestas y estado.
- Gamificación: insignias por objetivo (categoría o recurso).
- Constancias: plantillas (logo/fondo) por categoría.
- Permisos / Licencia.
- Auditoría: registro de acciones de escritura en
logs/admin.log.
SCORM / RTE
- Punto de entrada:
runtime/gotorte.php?recursoid=<id>→ carga centralruntime/sco.php. runtime/sco.phpsirve un contenedor con el API SCORM en la página padre y el paquete en un<iframe>(así los SCO localizan el API subiendo por los frames).- Persistencia de progreso en la tabla
scormvarsvíaruntime/commit.phpyruntime/finish.php(tiempo total, estado, calificación). - Detección robusta del archivo de inicio (por
imsmanifest.xmlo nombres comunes:index.html,index_lms.html,story.html, etc.).
Reportes
Módulos en admin/reporte_* con filtros por categoría, distrito, fechas y estado:
- Avance general, por categoría, completados y visitados.
- Exportación a Excel y vistas con Highcharts.
- Vistas SQL (
viewReporte*) para consultas agregadas. - Tareas programadas (
cron_report/) para consolidar avance/sellos.
Modelo de datos
Principales tablas y vistas (MySQL):
| Tabla / Vista | Descripción |
|---|---|
user |
Colaboradores (numempl, nombre, área, rol, habilitado, etc.) |
categoria |
Categorías jerárquicas (padre, clave, nombre, imagen, orden) |
scormpkg |
Recursos/cursos (url, idcategoria, imagen, clave, habilitado) |
scormvars |
Datos de avance SCORM por usuario y recurso (estado, score, tiempo) |
asignacion |
Categorías asignadas a usuarios |
insignias |
Gamificación (insignia por objetivo) |
evaluaciones, evaluaciones_preguntas, evaluaciones_opciones, evaluaciones_respuestas, evaluaciones_estado |
Evaluaciones |
encuestas, encuestas_preguntas, encuestas_respuestas, encuesta_estado |
Encuestas |
constancias |
Plantillas de constancias por categoría |
licencia, config |
Configuración/permisos |
viewReporte* |
Vistas para reportes agregados |
El estado de un recurso se considera completado cuando existe una fila en
scormvarsconVarName = 'cmi.core.lesson_status'yVarValuecompletedopassedpara el usuario y elSCOInstanceID(id descormpkg).
Requisitos
- PHP 7.4 con extensiones:
mysqli,zip,openssl,gd/mbstring(según uso),dom/libxml. - MySQL 5.7+ / MariaDB.
- Apache con
mod_rewrite. - Composer.
Instalación
- Clonar/copiar el proyecto en el webroot (
htdocs/git/Estafeta-plataformo similar). - Instalar dependencias:
composer install - Crear la base de datos e importar el respaldo:
Luego importar el dump
CREATE DATABASE estafeta_lms2 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;.sqlcorrespondiente. - Ajustar credenciales en
config.php(host, usuario, contraseña, nombre de BD). - Dar permisos de escritura a:
data/,data/scormpkg/,data/recursos/,data/imgcat/,logs/. - Verificar límites de PHP para SCORM (
upload_max_filesize,post_max_size) enphp.ini/.htaccess.
Configuración
En config.php:
$CFG->wwwroot = 'https://tu-dominio/'; // debe terminar en "/"
$CFG->sessionname = 'estafetalms360';
$dbhost = 'localhost';
$dbuser = '...';
$dbpass = '...';
$dbname = 'estafeta_lms2';
Seguridad
Medidas ya implementadas:
admin/auth_guard.php: valida sesión + rol admin en los endpoints deadmin/y token CSRF en métodos de escritura.- Sesión endurecida (
use_strict_mode,use_only_cookies,HttpOnly,SameSite=Lax,Secureen HTTPS). - Login con consultas preparadas,
session_regenerate_id(true)y límite de intentos por IP. - Consultas preparadas en los CRUD principales (usuarios, categorías, recursos, insignias).
data/.htaccessylogs/.htaccess:Options -Indexesy bloqueo de ejecución de scripts en carpetas de datos.- Auditoría de acciones de administración (
logs/admin.log).
Recomendaciones pendientes:
- Mover credenciales de
config.phpa variables de entorno y rotar claves. - Extender sentencias preparadas al resto de endpoints (encuestas, evaluaciones, constancias, licencia).
- Revisar
session.save_pathen.htaccess.
Convenciones
- Vistas de administración:
admin/<modulo>.html(front) +admin/<modulo>.php(endpoint JSON) +admin/<modulo>_add.php/_upadate.php/_delete.php. - Los endpoints validan sesión/rol y responden JSON.
- Nombres de tablas/columnas en
snake_case; jerarquía de categorías conpadre(0 = raíz). $CFG->wwwrootsiempre con/final.
Roadmap / pendientes
- Migrar todo el SQL restante a sentencias preparadas.
- Hashear contraseñas (si en el futuro se habilita login con contraseña).
- Test automatizados de flujos críticos (login, SCORM, alta de recursos).
- Optimización: cache de assets, minificación, revisión de consultas.
- Accesibilidad e internacionalización.