Informe Técnico Exhaustivo

Sistema de Gestión de Cursos OTEC/SENCE

Contenido del Informe
1. Visión General y Arquitectura del Sistema
Propósito

El sistema analizado es una aplicación web robusta para la gestión integral de cursos de capacitación, orientada a organismos técnicos (OTEC) que interactúan con SENCE. Permite administrar todo el ciclo de vida de un curso, desde su creación detallada y estructuración de contenidos hasta la gestión de su estado y la visualización de su información.

Arquitectura

Construido sobre una pila tecnológica de PHP y MySQL, el sistema presenta una arquitectura modular con componentes bien definidos:

  • Módulo de Creación (form_crea_curso_o.php): Es el corazón del sistema. Un formulario complejo y dinámico que permite crear un curso con todos sus elementos (temas, subtemas, costos, materiales, etc.) en una sola operación transaccional.
  • Módulo de Listado y Gestión (lista_cursos.php): Funciona como el panel de control principal, mostrando todos los cursos con herramientas de búsqueda, filtro y paginación. Desde aquí se accede a las demás funcionalidades.
  • Módulo de Visualización y Edición (ver_curso_o_ppp.php): Actúa como un "dashboard" para un curso específico. Presenta toda la información de manera consolidada y sirve como punto de partida para la edición granular de cada sección a través de modales y llamadas AJAX.
  • Módulo de Contenido y Programación: Compuesto por varios archivos como ver_temas.php, ver_subtema.php y calendario_subtemas.php, que permiten una gestión detallada de la estructura académica y la programación de clases.
2. Flujos de Proceso Principales
Flujo de Creación de un Curso
  1. El administrador accede a form_crea_curso_o.php.
  2. Completa un extenso formulario que, mediante JavaScript, permite añadir dinámicamente múltiples temas, subtemas, costos, y otros ítems.
  3. Las horas y costos totales se calculan en tiempo real en el navegador.
  4. Al enviar el formulario, el script PHP inicia una transacción de base de datos para garantizar la integridad.
  5. Se inserta el registro principal en la tabla cursos_sence y se obtiene el nuevo curso_id.
  6. Utilizando este curso_id, se insertan en cascada todos los registros relacionados en sus respectivas tablas (temas_curso, subtemas_curso, costos_curso, etc.).
  7. Si se sube una imagen, se crea la estructura de directorios necesaria y se guarda el archivo.
  8. Si todo el proceso es exitoso, la transacción se confirma (commit). Si ocurre cualquier error, se revierte por completo (rollback).
Flujo de Visualización y Edición
  1. El administrador navega a lista_cursos.php para ver todos los cursos.
  2. Hace clic en "Ver Detalle" para ir a ver_curso_o_ppp.php, pasando el ID del curso.
  3. Esta página consulta todas las tablas relacionadas para mostrar una vista completa y consolidada del curso.
  4. El administrador hace clic en los botones "Editar" de cada sección. Esto abre una ventana modal con un formulario específico para esa sección (ej. "Editar Datos SENCE").
  5. El formulario dentro del modal se carga dinámicamente vía AJAX desde un archivo dedicado (ej. form_editar_sence.php).
  6. Al guardar los cambios en el modal, otra petición AJAX envía los datos a un script de actualización (ej. actualizar_sence.php), que modifica la base de datos.
  7. La página principal se actualiza dinámicamente con la nueva información sin necesidad de recargarla por completo.
Flujo de Activación/Desactivación de Curso
  1. Desde lista_cursos.php, el administrador hace clic en el botón de activar/desactivar.
  2. Esta acción redirige a cambiar_estado_curso.php con el ID del curso y la acción a realizar.
  3. Este script ejecuta una serie de sentencias UPDATE en **cascada** para cambiar el campo estado a 'activo' o 'inactivo' en todas las tablas relacionadas con el curso, garantizando la consistencia del sistema.
Lógica de Borrado Lógico y Activación/Desactivación en Cascada

El sistema implementa una estrategia de borrado lógico para la gestión de cursos y sus componentes. En lugar de eliminar permanentemente los registros de la base de datos (con una sentencia DELETE), el sistema los marca como 'inactivo' a través de un campo de estado. Esta práctica es fundamental para preservar la integridad de los datos, mantener el historial y permitir la reactivación de cursos en el futuro. Por defecto, las listas principales del sistema solo muestran los registros cuyo estado es 'activo'.

La funcionalidad más destacada es el proceso de activación y desactivación en cascada, gestionado por el script cambiar_estado_curso.php. Cuando un administrador cambia el estado de un curso, este script ejecuta una serie de actualizaciones que se propagan a todas las tablas relacionadas, asegurando que el curso y todos sus elementos (temas, subtemas, costos, etc.) queden consistentes y se activen o desactiven en conjunto.

Tablas Involucradas en el Proceso en Cascada

A continuación se detallan todas las tablas que son afectadas durante este proceso de cambio de estado:

Tabla Involucrada Significado en el Proceso
cursos_sence Tabla principal que contiene los datos generales del curso. Es el registro que inicia la cascada.
temas_curso Almacena los módulos o unidades principales que componen el curso.
subtemas_curso Contiene las clases, lecciones o actividades específicas de cada tema.
objetivos_contenidos Guarda los objetivos y contenidos detallados asociados a los temas del curso.
inscripciones_curso Registra las matrículas de los alumnos en el curso. Su estado cambia para reflejar la inactividad del curso.
pizarra_curso Almacena los anuncios y mensajes publicados en la pizarra del curso.
cursos_profesores Tabla que asocia a los profesores con el curso que imparten.
costos_curso Contiene el resumen de los costos consolidados del curso.
documentos_tema / documentos_subtema Almacenan los archivos adjuntos a nivel de tema y subtema, respectivamente.
asistencias_alumno, notas_alumno, pagos_alumno Registros dependientes de la inscripción de un alumno, que también se marcan como inactivos.
medios_didacticos, material_participantes, material_consumo, infraestructura_curso, equipamiento_curso Tablas que detallan los recursos físicos y materiales necesarios para la ejecución del curso.
3. Estructura de Directorios y Manejo de Archivos

La organización de archivos es modular y sigue una estructura lógica. Las rutas de carga de archivos son dinámicas y se basan en el ID del curso.

(raíz del proyecto otec/)/ ├── admin/ │ ├── ver_temas.php │ └── ver_subtema.php ├── archivos/ │ └── cursos/ │ └── {ID_del_curso}/ │ ├── imagen_curso/ │ │ └── curso_{ID}_{timestamp}.jpg │ └── pizarra/ │ └── {ID_curso}_{nombre_archivo}.pdf ├── calendario/ │ ├── calendario_subtemas.php │ └── horario_subtemas.php ├── include/ │ └── conecta_mysql_otec.php ├── aula/ │ └── ingresa_mensaje.php ├── form_crea_curso_o.php ├── lista_cursos.php ├── ver_curso_o_ppp.php └── cambiar_estado_curso.php
Rutas de Carga
  • Imágenes de Curso: Se guardan en archivos/cursos/{ID_del_curso}/imagen_curso/.
  • Adjuntos de Pizarra: Se guardan en archivos/cursos/{ID_del_curso}/pizarra/.
4. Análisis Detallado de la Base de Datos

El sistema se apoya en un conjunto de tablas altamente relacionadas que modelan la estructura de un curso de capacitación. A continuación, el detalle de las tablas principales:

Tabla: cursos_sence

Es la tabla maestra. Almacena la información general y los metadatos de cada curso.

CampoDescripción y Objetivo
idIdentificador único del curso.
nombre_actividadEl nombre principal y título del curso. Es un campo obligatorio y único.
modalidad_instruccion, tipo_instruccion, tipo_elearning_detalleDefinen la naturaleza del curso (Grupal, Presencial, Sincrónico, etc.).
fundamentacion_tecnica, objetivos_generales, etc.Campos de texto extensos para la descripción pedagógica del curso.
total_horas_teoricas, total_horas_practicas, total_horas_elearningContadores totales de horas, calculados a partir de la suma de las horas de los temas/subtemas.
valor_total, valor_participante, valor_franquiciaCampos para la información financiera del curso.
codigo_oferta_sence, token_sence, etc.Campos específicos para la integración con la plataforma SENCE.
imagen_cursoAlmacena la ruta relativa a la imagen principal o de portada del curso.
estadoControla si el curso está 'activo' o 'inactivo' en todo el sistema.

Tablas de Contenido: temas_curso y subtemas_curso

Estas tablas definen la estructura jerárquica del contenido académico.

Tabla / CampoDescripción y Objetivo
temas_cursoRepresenta un módulo o unidad principal del curso. Se vincula a cursos_sence mediante curso_id.
temas_curso.ordenCampo numérico que permite al administrador reordenar los temas.
subtemas_cursoRepresenta una clase, lección o actividad específica dentro de un tema. Se vincula a temas_curso mediante tema_id.
subtemas_curso.fecha_programadaAlmacena la fecha y hora de una clase. Usado por los módulos de calendario y horario.
subtemas_curso.profesor_idVincula un subtema específico con un profesor de la tabla profesores.

Tablas de Recursos y Costos

Un conjunto de tablas simples que detallan los recursos y costos asociados a un curso, todas vinculadas por curso_id.

  • objetivos_contenidos: Desglosa los objetivos específicos y contenidos por cada tema.
  • medios_didacticos, material_participantes, material_consumo: Listan los recursos necesarios.
  • infraestructura_curso, equipamiento_curso: Detallan la infraestructura y equipamiento requeridos.
  • costos_curso: Almacena un resumen de los costos totales por categoría.
  • items_costo_curso: Permite un desglose detallado de cada ítem de costo individual.
5. Lógicas Clave y Consideraciones
Cálculos Dinámicos en Frontend

El formulario form_crea_curso_o.php hace un uso intensivo de JavaScript (con jQuery) para ofrecer una experiencia de usuario fluida. Calcula automáticamente los subtotales y totales de horas y costos a medida que el usuario añade o modifica ítems, evitando errores manuales y proporcionando feedback instantáneo.

Arquitectura de Edición Modular

El sistema utiliza un patrón de diseño inteligente para la edición de cursos. En lugar de un gran formulario de edición, la página ver_curso_o_ppp.php funciona como un panel central desde donde se editan pequeñas porciones de información a través de ventanas modales y llamadas AJAX. Esto hace que la interfaz sea más rápida y fácil de mantener.

Integridad de Datos

El uso de transacciones de base de datos en el script de creación es una práctica excelente. Garantiza que un curso solo se cree si todos sus componentes (temas, costos, etc.) se guardan correctamente, evitando datos "huérfanos" o inconsistentes.

Consideraciones y Puntos de Mejora
  • Validación en Servidor: Aunque el frontend realiza cálculos complejos, sería una buena práctica añadir una segunda capa de validación en el backend (PHP) para los totales de horas y costos antes de guardarlos en la base de datos. Esto previene la inserción de datos incorrectos si el JavaScript fallara o fuera manipulado.
  • Exclusión de Archivos: El informe se ha generado sin el archivo include/funciones_nuevas.php, según lo solicitado. Si este archivo contiene funciones críticas para la lógica de negocio, este informe podría estar incompleto en esos aspectos.
6. Guía para Replicar el Sistema
  1. Base de Datos: Asegurarse de que todas las tablas mencionadas en este informe existan en la base de datos MySQL. El script form_crea_curso_o.php contiene sentencias `CREATE TABLE IF NOT EXISTS` que pueden servir como base, aunque se recomienda un script de migración único.
  2. Estructura de Archivos: Replicar la estructura de directorios descrita en la sección 3. Es crucial que la carpeta archivos/ exista y que el servidor web (Apache/Nginx) tenga permisos de escritura sobre ella y sus subdirectorios.
  3. Configuración: El archivo include/conecta_mysql_otec.php es el punto central de configuración. Debe contener las credenciales correctas para la conexión a la base de datos.
  4. Dependencias: El sistema depende de librerías externas (Bootstrap, Font Awesome) cargadas desde un CDN, por lo que requiere acceso a internet en el cliente para una correcta visualización.