📘 Manual Técnico de la Plataforma
EducaPluss · Sistema de Gestión de Formación Corporativa Multi-cliente
Versión 2.0 · septiembre de 2026
🆕 Novedades — Junio-Agosto 2026
Funcionalidades añadidas desde la versión 1.0
Certificados PDF descargables (CertificateDocument)
/certificadosNuevo componente CertificateDocument con forwardRef para captura DOM. Exporta diplomas a PDF vía jsPDF + html2canvas. Botones de ver/descargar reparados (antes no funcionaban). Generación idempotente: no crea duplicados al repetir tests.
Emails con URLs absolutas y estado APROBADO
Sistema de plantillas (emailTemplates.ts)Todas las plantillas de email ahora usan URLs absolutas (https://plataforma.educapluss.com/...) en los botones CTA — antes usaban rutas relativas que rompían en clientes de correo. El email de curso completado ahora muestra badge "APROBADO · APTO" con el resultado real. 17+ plantillas centralizadas vía resolveTemplate().
Corrección de bugs en emails y certificados
recalcularNotaEnrollment · checkInactivity · sellarCertificadoNotariaCorregido course.nombre → course.titulo en recalcularNotaEnrollment y checkInactivity (el nombre del curso llegaba como ID en emails). sellarCertificadoNotaria: fallback de dominio corregido. Eliminada inscripción huérfana LOPIVI que causaba discrepancia en dashboards (18 vs 2).
Escuela MRCDD — Ecosistema en 3 niveles
/oficina-proyectos · /mi-dossier · /verificarArquitectura pedagógica completa para la acreditación CDD: Nivel 1 (microcursos de herramientas), Nivel 2 (cursos competenciales B1/B2/C1/C2), Nivel 3 (cursos de acreditación con Dossier de Evidencias). El campo usa_oficina_proyectos activa el flujo universitario solo en los cursos de Nivel 3.
Notaría Digital — Verificación oficial de dossiers
/verificar?codigo=XXXX (página pública)Cuando el gestor valida la última evidencia de un alumno, el sistema sella automáticamente el dossier: genera un código único (DOSS-2026-XXXXX), envía email al alumno con el código y activa la página pública /verificar donde cualquier universidad o empleador puede verificar la autenticidad del dossier sin login.
Diagnóstico Inicial MRCDD (6 áreas)
/mi-dossier → acceso condicionalAntes de acceder al Dossier de Evidencias, el alumno completa una autoevaluación diagnóstica sobre los indicadores de logro del MRCDD (entidad AcademicCompetencyCriteria, ~100+ criterios importados para las 6 áreas). El perfil resultante (etapa A/B/C por área) se guarda en SelfAssessment y aparece como banner en el dossier.
Ficha FUNDAE del Tutor en Informes
/reporte-fundae-detalladoCada convocatoria del informe detallado ahora muestra la ficha de acreditación FUNDAE del tutor asignado: titulación, años de experiencia docente, horas de formación metodológica y alertas si no cumple el mínimo de 30h requerido.
Filtro FUNDAE en Informe Detallado
/reporte-fundae-detalladoEl panel lateral de cursos del informe detallado ahora solo muestra cursos que tienen convocatorias registradas. Los cursos privados sin convocatoria quedan excluidos automáticamente, evitando confusión en la supervisión FUNDAE.
Fichas de Puesto (JobProfile)
/admin/puestosCatálogo completo de 25+ puestos. Cada ficha: misión, tareas diarias, incidencias, recursos (equipos, software, EPIs), competencias con nivel (BÁSICO→EXCELENTE) y formación requerida con horas.
Gap Analysis Formativo
/dashboard-rrhh → Gap formativoTabla cruzada empleado × curso obligatorio del puesto. Vista por empleado o por tienda (% de cobertura por tienda). Detecta quién falta por hacer cada formación requerida según su JobProfile.
Alertas de Renovación Formativa
/dashboard-rrhh → Alertas renovaciónDetecta automáticamente empleados con formación obligatoria del puesto NUNCA realizada (rojo) o vencida hace más de 3 años (ámbar). Filtrable por tienda. Sin configuración manual — calcula en tiempo real.
Itinerario formativo en Portal Empleado
/portal-empleadoSección "Mi itinerario formativo": el empleado ve exactamente qué cursos obligatorios tiene su puesto, con ✅/❌ por cada uno según lo que ya ha completado. Totalmente automático desde la ficha de puesto.
Convocatorias por curso
/admin/convocatoriasGestión de ediciones (grupos) de cursos: mismo curso base con fechas, tutor y código FUNDAE Acción/Grupo distintos por edición. Estados: planificada → abierta → en_curso → cerrada → cancelada.
Formación Previa Acreditada
/admin/formacion-externaRegistro de formación realizada antes de la plataforma (presencial, antigua plataforma). Cálculo automático de vencimiento (+3 años). Alertas 90 días antes. Visible en portal empleado con diploma imprimible.
Videoconferencias (Presencial Virtual)
/admin/videoconferenciasMódulo independiente para gestionar sesiones sincrónicas de formación en modalidad "presencial virtual" (videoconferencia). Completamente separado de la teleformación: convocatoria propia, expediente FUNDAE propio, sin vínculo con cursos e-learning. Incluye registro de asistencia con cálculo automático de % conexión, umbral configurable y exportación FUNDAE.
Acceso Supervisor aislado por convocatoria (trío rol+clave+código)
/accesostaffEl supervisor FUNDAE accede introduciendo rol + clave + código de convocatoria. El backend (validarAccesoStaff) verifica el trío: la clave debe existir, estar activa, no caducada, y el código de convocatoria debe coincidir exactamente con la convocatoria asignada a esa clave (id_convocatoria en StaffKey). Una vez dentro, el SupervisorDashboard se inicializa filtrado automáticamente por esa convocatoria — el supervisor no ve ninguna otra. Cada convocatoria es una "isla" de acceso independiente. RRHH y TUTOR solo necesitan rol + clave.
Metadata IA en módulos (metadata_ai)
/admin/cursos → MódulosLa función generateModuleContent ahora genera automáticamente metadatos estructurados junto al contenido de cada módulo: conceptos clave (5–8 términos), resumen en 2–3 frases, normativas aplicables (ej: "PRL Ley 31/1995") y nivel de dificultad (basico/intermedio/avanzado). Estos metadatos se guardan en el campo metadata_ai del módulo y permiten búsquedas rápidas y contexto IA sin leer el contenido completo.
Diplomas enriquecidos con datos FUNDAE
/diplomas-informesLa plantilla del diploma ahora incluye: DNI/NIF del alumno, duración en horas, modalidad (Teleformación/Presencial) y entidad impartidora (EducaPluss). También se muestra el estado de descarga de cada certificado (✓ Descargado con fecha) en el listado de diplomas.
Importación FUNDAE completa de empleados
/admin/empleados → ImportarEl importador ahora reconoce los 16 campos de la plantilla FUNDAE: APELLIDOS, NOMBRE, Telefono, Correo, NIF, FECHA NACIMIENTO, Nº SS, SEXO, COLECTIVO PRIORITARIO, DISCAPACITADO, ÁREA FUNCIONAL, CATEGORIA PROFESIONAL, GRUPO COTIZACIÓN TGSS y NIVEL DE ESTUDIOS. Los valores se normalizan automáticamente a los enums del schema (sexo H/M, grupo de cotización con prefijo numérico, nivel de estudios con variantes de texto). Compatible hacia atrás: si el Excel no trae columnas FUNDAE, funciona como antes. Antes de importar, selecciona la empresa en el desplegable "Filtrar por empresa" para asignar todos los empleados a esa organización.
Dossier de Evidencias + Notaría Digital
/oficina-proyectos · /mi-dossier · /verificarFlujo completo de expedientes universitarios: el alumno completa un diagnóstico inicial MRCDD (6 áreas, ~100+ criterios), recopila evidencias (AcademicProject) por competencia, el gestor las valida desde la Oficina de Proyectos, y al validar la última evidencia el sistema sella el dossier con un código único (DOSS-2026-XXXXX). La página pública /verificar permite a cualquier universidad o empleador verificar la autenticidad del dossier sin login.
🗺️ Roadmap — Funcionalidades pendientes o mejorables
Como plataforma LMS corporativa multi-cliente, estas son las funcionalidades que aún pueden añadirse en próximas fases:
Notificaciones automáticas por email
Automatismo que envía email cuando: se asigna un curso nuevo, un certificado está a punto de vencer, un empleado lleva X días sin actividad. La función sendNotification existe pero se llama manualmente.
Checklist de onboarding por puesto
Al incorporar un nuevo empleado, generar automáticamente un checklist de bienvenida vinculado a su JobProfile: cursos a hacer, documentos a firmar, equipos a recibir. Flujo guiado para el primer día.
Dashboard del supervisor de tienda
Vista específica para el gerente de tienda: % cobertura formativa de su equipo, quiénes tienen formación vencida, alertas de renovación filtradas solo para su tienda. El rol supervisor_tienda existe pero la vista está limitada.
Asignación masiva de itinerario por puesto
Botón en /admin/puestos: "Asignar itinerario a todos los empleados de este puesto" → crea automáticamente los Enrollment de los cursos obligatorios del JobProfile para todos los empleados del puesto que no los tengan.
Límite 80 alumnos tutor: suma transversal
Actualmente valida solo dentro del grupo seleccionado. Pendiente: sumar automáticamente los alumnos ya asignados al tutor en cursos con fechas solapadas para validar el total acumulado.
Encuesta de desempeño por puesto (360°)
Encuesta periódica para que el empleado y su responsable valoren las competencias requeridas por el JobProfile. Permitiría detectar gaps de competencias (no solo formativos) y alimentar el planificador.
App móvil nativa (PWA)
El portal empleado es responsive pero no está instalado como PWA. Añadir manifest.json, service worker y botón "Instalar en pantalla de inicio" mejoraría la experiencia en móvil para empleados de sala.
Integración Microsoft Teams para asistencia automática
El módulo de videoconferencias ya gestiona sesiones y asistencia manualmente. La siguiente fase es conectar la cuenta de Teams de la empresa via OAuth para importar automáticamente los callRecords: quién se conectó, cuándo entró y cuándo salió. Eliminaría el registro manual y garantizaría datos objetivos ante FUNDAE.
Integración con sistema de RRHH externo (Factorial / A3)
Importación automática de altas/bajas/cambios de puesto desde el sistema de nóminas. Actualmente se hace manualmente via Excel. Un webhook o cron job evitaría duplicar el mantenimiento de datos.
La plataforma está construida sobre Base44 (React + Deno backend). Utiliza:
Entidades (BD)
Employee, Course, Module, Enrollment, Progress, Certificate, Activity, ActivityResponse, Message, ForumPost, News, StudyGuide, etc.
Backend Functions (Deno)
Funciones serverless que usan LLMs (OpenAI/Gemini), generan PDFs, procesan archivos y gestionan autenticación de empleados.
Agentes IA
course_architect (crea cursos), lesson_enricher (enriquece lecciones). Conversacionales con herramientas de entidades.
El portal de empleado (/acceso) no usa la autenticación de Base44. Tiene su propio sistema de seguridad con tres capas independientes.
La función employeeLogin registra cada intento fallido en la entidad LoginAttempt (base de datos, no memoria). Tras 5 intentos fallidos desde la misma IP o el mismo DNI, la cuenta queda bloqueada 15 minutos.
✅ ¿Afecta al alumno normal?
No. El bloqueo solo se activa tras 5 fallos consecutivos. Un alumno que entra con su DNI y clave corporativa correctas nunca ve el bloqueo. Además, un login correcto borra automáticamente el contador de fallos de esa IP y ese DNI.
⚠️ ¿Cuándo se bloquea?
Solo si alguien falla 5 veces seguidas desde la misma conexión (IP) o con el mismo DNI. El atacante ve el error "Demasiados intentos desde esta conexión. Inténtalo de nuevo en 15 minutos." durante 15 min.
🧠 Modelo técnico: append-only tolerante a concurrencia
Cada fallo crea un registro nuevo en LoginAttempt con la clave (ip:<ip> o dni:<dni>) y la fecha. checkBlocked cuenta cuántos registros existen en los últimos 15 min. Este modelo es tolerante a carreras: aunque varias peticiones lleguen a la vez, el contador acumula correctamente porque no depende de leer-actualizar-un-registro-único (que causaba duplicados en entornos serverless). Un login correcto ejecuta deleteMany sobre la clave, limpiando el historial.
Al validar el DNI, employeeLogin genera un token de sesión firmado criptográficamente con el secret SESSION_SIGNING_SECRET. El token se guarda en localStorage y no se puede falsificar ni modificar sin el secret.
¿Por qué importa? Antes la sesión se guardaba en texto plano en el navegador: cualquiera con acceso al navegador podía crear una sesión falsa de cualquier empleado. Ahora, la función verifyEmployeeToken valida la firma HMAC y la fecha de expiración en cada petición del portal. Un token manipulado o caducado se rechaza.
La página /acceso incluye un honeypot (campo oculto que solo los bots rellenan) y un reto matemático simple que debe resolverse antes de enviar. No es un CAPTCHA visual, pero filtra bots automáticos básicos que intentarían fuerza bruta.
Resumen: ¿Puedo seguir entrando como alumno sin problemas?
Sí, sin ninguna limitación. Las tres capas de seguridad actúan solo sobre intentos fallidos o automatizados. Un alumno que introduce su DNI y clave corporativa correctos entra directamente, su contador de fallos se reinicia y su sesión se firma de forma transparente. No verá mensajes de bloqueo ni notará las capas de seguridad.
Login correcto
Entra normal · contador borrado · token firmado
1–4 fallos
Mensaje de error normal · puede reintentar
5+ fallos
Bloqueo 15 min (solo esa IP / ese DNI)