### 1. Descripción del Problema

La gestión del tiempo y la carga académica representa un desafío constante para los estudiantes universitarios. La dispersión de información sobre asignaturas, fechas de entrega y evaluaciones dificulta una planificación efectiva, generando estrés y afectando el rendimiento académico. Este proyecto desarrolla un planner universitario para centralizar y organizar eficientemente todas las actividades académicas.

### 2. Análisis del Problema

El problema se contextualiza en el ambiente universitario, donde los estudiantes manejan múltiples asignaturas, cada una con diversas actividades (laboratorios, tareas, proyectos, certámenes) y cargas horarias definidas por el Sistema de Créditos Transferibles (SCT-Chile). La falta de una visión consolidada de estas dedicaciones horarias y la necesidad de una planificación proactiva son evidentes.

El sistema a desarrollar es una aplicación de escritorio diseñada para interactuar directamente con el estudiante. Los principales entes que participan son:

- Estudiante: Usuario principal que ingresa sus datos académicos (semestres, ramos, actividades evaluativas, tareas, proyectos) y consume la información organizada por el sistema.
- Sistema (Planner Universitario): Procesa la información ingresada, la organiza temporal y temáticamente, calcula indicadores (notas, avances, horas de dedicación) y genera sugerencias de planificación.
- Medio Externo: Los programas de asignaturas (que proveen la carga SCT y la estructura de evaluaciones) y las fechas del calendario académico.

El sistema interactúa con el medio externo recibiendo datos de configuración inicial (ej. fechas de inicio y fin de semestres) y proporciona al estudiante una interfaz para interactuar y visualizar su planificación.

### 3. Definición de Requerimientos

Se plantean tres casos de uso fundamentales para el sistema, que también servirán como base para las pruebas:

#### Caso de Uso 1: Registrar y Configurar un Ramo

- Nombre: Registrar y Configurar un Ramo.
- Propósito: Permitir al estudiante ingresar una nueva asignatura con sus datos generales, horas de dedicación SCT y las actividades evaluativas principales del ramo.
- Actores: Estudiante.
- Pre-condiciones:
  - La aplicación está iniciada.
  - Existe al menos un semestre registrado en el sistema al cual asociar el ramo.
- Flujo Normal de Eventos:

  Actor (Estudiante) | Sistema
  --- | ---
  1. Navega a la pestaña "Ramos". |
  2. Presiona en el botón "Agregar Nuevo Ramo". | 3. Se abre el diálogo "Agregar Nuevo Ramo".
  4. Ingresa la información general (Nombre, Código, Créditos, Semestre Asociado, Profesor, Color). |
  5. En la sección "Actividades Evaluativas", añade filas para las evaluaciones clave (ej., "Certamen 1", "Tarea Promedio", "Proyecto Final"), especificando para cada una: Nombre, Fecha de Realización/Entrega, Ponderación (en porcentaje o fracción, ej., "55/2"), y Estimación de Horas de trabajo. |
  6. Presiona en "Aceptar". | 7. Valida los datos ingresados (ej., ponderaciones no exceden 100%, nombres no vacíos).
  | 8. Crea el objeto Ramo y las ActividadAcademicas evaluativas correspondientes, las asocia al ramo y las añade a la lista global de eventos.
  | 9. La interfaz se actualiza mostrando el nuevo ramo en la lista y las actividades evaluativas en la pestaña "Eventos".

- Cursos Alternativos:
  - Si los datos son incompletos o inválidos (ej., suma de ponderaciones > 100%), el sistema muestra un mensaje de advertencia y no cierra el diálogo.
  - Si el Estudiante presiona en "Cancelar", el diálogo se cierra sin guardar cambios.
- Requerimientos No Funcionales: El proceso de registro debe ser intuitivo (usabilidad). El guardado de datos debe ser persistente y local.

#### Caso de Uso 2: Registrar Nota y Ver Avance

- Nombre: Registrar Nota y Ver Avance.
- Propósito: Permitir al estudiante ingresar la nota de una actividad evaluativa y observar cómo esta afecta la nota final estimada del ramo.
- Actores: Estudiante.
- Pre-condiciones:
  - La aplicación está iniciada.
  - Existe al menos un ramo con actividades evaluativas definidas.
- Flujo Normal de Eventos:

  Actor (Estudiante) | Sistema
  --- | ---
  1. Navega a la pestaña "Evaluaciones Ramos". |
  2. Selecciona un semestre en el ComboBox de semestres. |
  3. Selecciona un ramo de la lista de ramos. | 4. La tabla muestra las actividades evaluativas de ese ramo.
  5. Ubica la actividad evaluativa deseada (ej., "Certamen 1"). |
  6. Modifica la nota en la columna "Nota" de la tabla (ej., de "N/R" a "65"). |
  7. Presiona en el botón "Guardar Cambios". | 8. Actualiza la nota de la ActividadAcademica correspondiente y marca la actividad como completada.
  | 9. Recalcula la nota final estimada y el avance del ramo.
  | 10. La interfaz se actualiza para reflejar la nueva nota y los cambios en la nota final del ramo.
  | 11. Se muestra un mensaje de "Cambios guardados correctamente" de forma temporal.

- Cursos Alternativos:
  - Si el Estudiante no ha seleccionado un ramo, se muestra una advertencia.
  - Si la nota ingresada no es válida (ej., fuera de rango), el sistema muestra un mensaje de error (gestión por QDoubleSpinBox).
- Requerimientos No Funcionales: La actualización de la nota debe ser instantánea en la interfaz. El guardado debe ser persistente.

#### Caso de Uso 3: Generar Lista de Tareas Semanal

- Nombre: Generar Lista de Tareas Semanal (To-Do List).
- Propósito: Proporcionar al estudiante una planificación semanal dinámica de actividades de estudio y avance de tareas/proyectos, basada en las horas de dedicación y las fechas de entrega próximas.
- Actores: Estudiante.
- Pre-condiciones:
  - La aplicación está iniciada.
  - Existen ramos con horas de dedicación y actividades evaluativas (tareas, proyectos) con estimación de horas y fechas de entrega.
- Flujo Normal de Eventos:

  Actor (Estudiante) | Sistema
  --- | ---
  1. Navega a la pestaña "To-Do Semanal". |
  2. Selecciona una fecha de referencia para la semana deseada. |
  3. Presiona en el botón "Generar To-Do Semanal". | 4. Identifica las tareas y proyectos pendientes cuya fecha de entrega está próxima (ej., las 2 más próximas).
  | 5. Retro-planifica y sugiere bloques de avance distribuidos en los días hábiles previos a la entrega, respetando la carga máxima semanal del ramo (según créditos SCT) y la estimación de horas de las actividades.
  | 6. Distribuye bloques de estudio personal y trabajo en proyectos generales del ramo.
  | 7. Incorpora recordatorios de entregas y certámenes programados para esa semana.
  | 8. Muestra la lista de actividades diarias generadas en la interfaz, organizada por día.
  9. Puede marcar actividades como completadas directamente en la lista. |

- Cursos Alternativos:
  - Si no hay ramos o actividades pendientes, se muestra un mensaje informativo.
  - Si el estudiante marca una actividad como completada, el sistema actualiza el estado del evento original y lo guarda.
- Requerimientos No Funcionales: La generación de la lista debe ser rápida. La visualización debe ser clara y permitir el seguimiento del estado de completado.

### 4. Diseño

#### Arquitectura de Solución (Alto Nivel)

El sistema sigue una arquitectura de capas simple:

- Capa de Presentación (UI): Implementada con Qt Widgets en C++. Incluye MainWindow con su QTabWidget para organizar las diferentes vistas (Semestres, Ramos, Eventos, To-Do Semanal, Datos, Evaluaciones Ramos). Los diálogos (AddSemestreDialog, AddRamoDialog, AddTareaDialog, AddNotaDialog) manejan la entrada de datos. El EvaluacionesRamosWidget es un widget reutilizable para la gestión de evaluaciones de ramos.
- Capa de Lógica de Negocio: La clase Calendario actúa como el centro de la lógica del negocio. Es responsable de gestionar todas las colecciones de objetos (semestres, ramos, actividades académicas, actividades diarias, bloques horarios) y de implementar las reglas del negocio (ej., cálculo de notas, distribución de horas, detección de conflictos).
- Capa de Persistencia: La clase GestorDatos se encarga exclusivamente de la lectura y escritura de los objetos del dominio hacia y desde un archivo JSON local, asegurando la persistencia del estado de la aplicación.

#### Diagrama de Clases (UML)

El diagrama de clases resume la estructura principal del sistema, mostrando las clases clave y sus relaciones (agregación, herencia, composición y asociación) entre Calendario, Ramo, ActividadAcademica (y sus derivados), ActividadDiaria, GestorDatos y demás. La clase MainWindow representa la interfaz de usuario principal y contiene las interfaces gráficas (vistas y diálogos) que permiten la interacción del usuario con el sistema.

Figura 1: Diagrama de Clases Principal del Planner Universitario

#### Diagrama de Secuencia (UML): "Registrar y Configurar un Ramo"

El diagrama de secuencia para el Caso de Uso "Registrar y Configurar un Ramo" ilustra la interacción temporal entre los actores y los objetos del sistema:

Figura 2: Diagrama de Secuencia para "Añadir y Configurar un Ramo"

### 5. Implementación

El proyecto fue implementado utilizando el lenguaje de programación C++ en conjunto con el framework Qt (específicamente Qt Widgets) para la construcción de la interfaz gráfica de usuario. El entorno de desarrollo integrado (IDE) utilizado fue Qt Creator, que facilitó la gestión del proyecto, la codificación y la depuración. La persistencia de los datos del planner se logra mediante la serialización y deserialización de objetos en formato JSON a un archivo local.

La documentación de la implementación se encuentra directamente en el código fuente mediante comentarios extensivos. Estos comentarios detallan el propósito de las clases, la funcionalidad de los métodos, la explicación de atributos importantes y cualquier lógica compleja. El código está diseñado para ser claro, legible y seguir buenas prácticas de codificación para facilitar su comprensión y futuro mantenimiento.

### 6. Pruebas

Las pruebas del sistema se realizaron de forma manual, enfocándose en la verificación de los casos de uso definidos y la correcta interacción de la interfaz con la lógica de negocio y la persistencia de datos.

#### Prueba 1: Creación y Visualización de un Ramo con sus Evaluaciones

Figura 3: Diálogo para añadir un nuevo Ramo con datos y evaluaciones.

Esta captura muestra el diálogo 'Agregar Nuevo Ramo' con todos los campos relevantes rellenados. Se ingresa la información general del ramo y se definen varias actividades evaluativas (ej., 'Certamen 1', 'Tarea 1', 'Proyecto Final') con sus respectivas fechas, ponderaciones (incluyendo expresiones como '55/2') y estimaciones de horas de trabajo.

Figura 4: Ramo recién creado y su tabla de evaluaciones en la pestaña "Evaluaciones Ramos".

Tras aceptar el diálogo de creación, esta imagen muestra el ramo recién añadido en la pestaña 'Ramos'. Se verifica que toda la información ingresada, incluyendo la tabla de actividades evaluativas con sus datos (nombre, fecha, ponderación y estimación de horas), se muestra correctamente, confirmando la persistencia y correcta visualización de los datos del ramo y sus evaluaciones asociadas.

#### Prueba 2: Registro de Nota y Recálculo del Avance del Ramo

Figura 5: Registro de la nota de una actividad evaluativa.

En esta captura, se ha seleccionado un ramo y se ha modificado la nota de tres actividades evaluativas específicas. El estudiante ingresa las notas en la celda correspondiente y presiona en 'Guardar Cambios'. Una notificación flotante confirmará el guardado, y las vistas de la aplicación se actualizarán.

Figura 6: El resumen del Ramo refleja la nota final estimada actualizada.

Esta imagen muestra el impacto del registro de la nota en la nota final estimada del ramo y su porcentaje de avance. Se verifica que el método calcularNotaFinal() del ramo opera correctamente, integrando la nueva nota y recalculando el promedio ponderado, validando así la lógica de cálculo y la actualización de la interfaz.

#### Prueba 3: Generación Inteligente de la To-Do List Semanal

Figura 7: To-Do List semanal con tareas, avances de estudio/proyecto y recordatorios.

Esta captura demuestra la funcionalidad de la "To-Do List Semanal". Al seleccionar una fecha y presionar en "Generar To-Do Semanal", la aplicación genera una lista de actividades planificadas. Se observan recordatorios de entrega de tareas y evaluaciones próximas, así como bloques de tiempo sugeridos para avanzar en los dos proyectos/tareas más urgentes. La distribución de estas horas de avance respeta la carga máxima semanal del ramo y la retro-planificación desde las fechas de entrega, mostrando la utilidad de las horas SCT en la planificación activa.

Dificultades Encontradas en el Desarrollo y Superación:

- Gestión de Memoria y Propiedad de Objetos: Al inicio, hubo desafíos en cómo las diferentes clases (especialmente Calendario, Ramo y GestorDatos) compartían la propiedad de los objetos creados (ActividadAcademica, Semestre, etc.). Esto llevó a fugas de memoria o accesos inválidos. La solución implicó centralizar la propiedad de la memoria en la clase Calendario (el dueño de todas las listas principales) y asegurar que las demás clases (como Ramo) solo mantuvieran punteros a estos objetos, sin intentar liberarlos. Esto se gestionó cuidadosamente con los constructores y destructores de cada clase y las funciones de carga/limpieza.
- Deserialización Polimórfica y Jerarquía de Clases: La unificación de EventoAcademico y ActividadEvaluativa en ActividadAcademica (y hacerla concreta) simplificó el diseño, pero la deserialización polimórfica en GestorDatos::jsonToActividadAcademica() requirió identificar el tipo concreto de actividad (Tarea, Proyecto, Certamen, Actividad Genérica) desde el JSON para recrear el objeto correcto con new.
- Sincronización de Datos en la UI: Mantener múltiples vistas (QTextEdits, QTableWidgets) sincronizadas con los cambios en el modelo de datos subyacente. Esto se logró implementando un sistema de señales y slots en MainWindow y EvaluacionesRamosWidget, donde las acciones de modificación (ej., agregar ramo, guardar nota) emiten señales que disparan las funciones de refresco en todas las vistas relevantes.
- Lógica de Planificación Dinámica (To-Do): La implementación de la retro-planificación de horas de avance para tareas/proyectos, respetando la carga SCT semanal del ramo, fue la parte más desafiante. Requirió algoritmos para iterar sobre semanas, calcular horas disponibles, fragmentar el trabajo y priorizar lo más urgente. Se utilizó un enfoque heurístico con mapas auxiliares para llevar el control de horas asignadas por ramo y semana.

Listado de Bugs Presentes:

A la fecha de entrega de este informe, el sistema presenta los siguientes bugs conocidos:

- [Bug 1]: [En la pestaña EvaluacionesRamos se genera un cierre inesperado de la aplicación al marcar más de dos evaluaciones como completadas de forma consecutiva. Este comportamiento no ocurre siempre, no se ha identificado un patrón claro que permita reproducir el error de forma consistente.]

### 7. Enlace al Código Fuente

El código fuente completo del proyecto está disponible para su descarga en el siguiente enlace. Se recomienda descargarlo y revisar el archivo README.md para obtener instrucciones detalladas sobre la compilación y ejecución del proyecto.

Descargar Código Fuente del Proyecto (versión 1.0)

El archivo comprimido incluye todos los archivos .h y .cpp necesarios, así como el archivo de proyecto de Qt (.pro) y el Makefile generado. Se excluyen deliberadamente los archivos compilados (.o, ejecutables), los archivos HTML de documentación generados por herramientas, y cualquier código fuente externo que no haya sido directamente desarrollado por el grupo (las dependencias externas se especifican en el README.md).