Versión: v1.0
Fecha: 2026-06-29
Estado: MVP (Minimum Viable Product)
Estudiantes UTP dedican 8+ horas/semana a gestionar tareas en 5+ materias. Resultado: falta de enfoque, inconsistencia, abandono de estudio.
StudyPlanner: un entrenador de consistencia. Pomodoro + racha visible transforma "tengo que estudiar" en "no quiero perder mi racha de 12 días".
- Estudiantes UTP tienen múltiples tareas en diferentes materias
- Dificultad para priorizar y completar a tiempo
- Falta de seguimiento visual del esfuerzo de estudio
- Poco feedback motivacional sobre progreso
App SQLite con:
- CRUD profesores, materias, tareas
- Timer Pomodoro 100% ortodoxo (25/5 min, pausa larga 15 min cada 4 ciclos)
- Vinculado a tarea específica (1 tarea = 1 sesión Pomodoro)
- Validación manual (usuario confirma si realmente trabajó)
- Dashboard con racha, badges, puntos (gamificación confiable)
- Historial sesiones: solo cuenta si validadas
| Problema | Descripción | RF(s) que lo resuelven |
|---|---|---|
| P1 | Múltiples tareas en diferentes materias | RF-005, RF-006, RF-009, RF-010 |
| P2 | Dificultad para priorizar | RF-010 (filtro prioridad, ordenado deadline) |
| P3 | Falta seguimiento de esfuerzo | RF-014 a RF-021 (Pomodoro), RF-016 (Historial) |
| P4 | Visibilidad de progreso | RF-022, RF-023 (Dashboard: tareas pendientes por materia) |
- 3 CRUD completos (Profesores, Materias, Tareas)
- Pomodoro 100% ortodoxo (25/5 min, pausa larga 15 min cada 4 ciclos)
- Vinculado a tarea específica (1 tarea = 1 sesión)
- Validación manual sesiones (sí/no al terminar)
- Historial Pomodoro (solo sesiones validadas)
- Dashboard simple (tareas pendientes por materia)
- Filtrado básico (por materia, deadline, prioridad)
- Gamificación (racha, badges, puntos) — v2.0+
- Pomodoro libre (no ortodoxo)
- Extensión +5 min (no Pomodoro)
- Calendario (visualización removida)
- Notificaciones/recordatorios
- Análisis profundo (gráficos comparativos)
- Sincronización cloud
- Colaboración grupos
| Caso | Comportamiento |
|---|---|
| Reanudar sesión interrumpida | Si usuario abandona/app crash mid-sesión → sesión se descarta (sin guardar progreso) |
| Historial incompleto | Solo sesiones que completan 4 ciclos y llegan a dialog validación se persisten |
| Recuperación graceful | No hay "sesión en espera" → abandonada = perdida (v2.0+) |
Estudiantes UTP (Ingeniería de Software y afines), cualquier carrera técnica
| ID | Funcionalidad | Descripción |
|---|---|---|
| RF-001 | Crear profesor | Nombre, email, departamento |
| RF-002 | Listar profesores | Con cantidad materias asignadas |
| RF-003 | Editar profesor | Modificar datos |
| RF-004 | Eliminar profesor | Con confirmación |
| ID | Funcionalidad | Descripción |
|---|---|---|
| RF-005 | Crear materia | Código (IS101), nombre, profesor, horario, color |
| RF-006 | Listar materias | Con tareas pendientes, código color |
| RF-007 | Editar materia | Modificar datos |
| RF-008 | Eliminar materia | Con confirmación |
| ID | Funcionalidad | Descripción |
|---|---|---|
| RF-009 | Crear tarea | Materia, título, deadline, prioridad, tipo (tarea/examen/proyecto), tiempo estimado |
| RF-010 | Listar tareas | Filtrar por materia/deadline/prioridad/estado |
| RF-011 | Editar tarea | Modificar campos |
| RF-012 | Eliminar tarea | Con confirmación |
| RF-013 | Marcar completado | Cambiar estado, guardar fecha |
| ID | Funcionalidad | Descripción |
|---|---|---|
| RF-014 | Timer Pomodoro | 25min trabajo + 5min pausa (fijo, no customizable) |
| RF-015 | Pausa larga | 15 min automática después 4 ciclos completados |
| RF-016 | Historial sesiones | Guardar ciclos, fecha, validación (solo sesiones completadas) |
| RF-017 | Iniciar focus | Tarea específica solo, jala materia + profesor automático |
| RF-018 | Validación sesión | Al terminar 4 ciclos: "¿Realmente completaste?" sí/no |
| RF-019 | 1 tarea = 1 sesión | 1 Pomodoro (25+5+25+5+25+5+25+15) vinculado a tarea |
| RF-020 | Sesión incompleta: abandono | Si usuario cierra app mid-sesión (ciclo <4): sesión se descarta (no se guarda) |
| RF-021 | Sesión incompleta: validada no | Si usuario llega a dialog pero valida NO: sesión se descarta (no se guarda) |
| ID | Funcionalidad | Descripción |
|---|---|---|
| RF-022 | Tareas pendientes por materia | Muestra contador de tareas no completadas por cada materia |
| RF-023 | Estado general | Display simple: total tareas, total completadas, pendientes |
- Interfaz Material Design 3
- Flujos intuitivos (<3 taps por acción)
- Validación clara formularios
- Loading states visibles
- Colores por materia consistentes
- Persistencia SQLite sin pérdida data
- Recuperación errores graceful
- Transacciones atómicas
- Carga lista tareas: <1s (para 200 tareas)
- Carga dashboard: <500ms
- Timer Pomodoro: 60 FPS sin lageos
- Animaciones UI: Transiciones suaves (<300ms)
- DB: Indexada por
deadline,materia_id,estado - Memoria: <150MB en uso (sin leaks)
- Min SDK: 30
- Target SDK: 36
- Orientación: portrait + landscape
- Cobertura mínima: 80% (UseCase + Repository)
- Tests: JUnit 4 + MockK (domain + data)
- Integración: Espresso para Composables críticas
- Lógica de negocio centralizada (UseCase, no ViewModel)
- Inyección manual de dependencias (testeable sin Hilt)
RF-014: Timer Pomodoro (trabajo 25 min)
Aceptado cuando:
- Timer inicia en 25:00
- Countdown decrementa cada segundo (visible en UI)
- Pausa/reanuda funciona sin perder tiempo
- Al llegar a 00:00, transiciona automáticamente a pausa 5min
- Sonido/vibración al final de ciclo
- Estado persiste en ViewModel (sin perder si app minimiza)
RF-018: Validación de sesión (dialog sí/no)
Aceptado cuando:
- Después de 4 ciclos, aparece dialog modal
- Texto: "¿Completaste los 4 ciclos Pomodoro?"
- botón "sí": guarda sesión en BD (validated=true)
- botón "No": descarta sesión en memoria (sin guardar)
- Ambos botones cierran dialog y limpian estado
- ViewModel
sessionStateretorna a inicial
RF-022: racha focus (días consecutivos)
Aceptado cuando:
- Contador incrementa +1 si sesión validada hoy
- Si no hay sesión validada mañana, racha resetea a 0
- Histórico: almacena último día con sesión validada
- Dashboard muestra "racha: X días" (0 si resetea)
- Testing: simular 7 días consecutivos → racha=7
- Crear profesor (nombre, email, departamento)
- Listar con cantidad materias
- Editar/eliminar
- Búsqueda por nombre
- Crear (código, nombre, profesor, horario, color)
- Listar (con badge tareas pendientes)
- Editar/eliminar
- Filtro por profesor
- Crear (materia, título, deadline, prioridad, tipo, tiempo_estimado)
- Listar (ordenado deadline)
- Editar/eliminar
- Marcar completado/incompleto
- Filtro: materia, deadline, prioridad, estado
- Iniciar sesión: Tarea específica obligatoria (materia, profesor se jalan automático)
- Timer ciclos: 25 min trabajo + 5 min pausa (fijo, no customizable)
- Pausa larga: 15 min automática después 4 ciclos completados
- 1 sesión Pomodoro = 4 ciclos (2h5min): 25+5+25+5+25+5+25+15
- Post-sesión dialog: "¿Realmente completaste?" (sí/no)
- Guardar historial: Solo si validado como sí
- Pantalla focus (minimizada, sin distracciones, tarea + materia + profesor)
Pantalla principal:
- Total tareas: completadas y pendientes (resumen por estado)
- Tareas pendientes por materia (lista agrupada, contador por materia)
- botón acceso directo a TaskListScreen completo
Secciones:
- Estado general: Contador total tareas, completadas, pendientes
- Desglose por materia: Cada materia con su contador de pendientes
- Acción: botón "VER TODAS LAS TAREAS" → abre TaskListScreen
| RF | Nombre UseCase | Responsabilidad | Validación de aceptación |
|---|---|---|---|
| RF-001 | CreateProfessorUseCase | Crear profesor (nombre, email, depto) | Email válido, nombre no vacío |
| RF-002 | GetProfessorsUseCase | Listar profesores con contador materias | Retorna Flow<List> |
| RF-003 | UpdateProfessorUseCase | Editar datos profesor | Sin validación especial |
| RF-004 | DeleteProfessorUseCase | Eliminar profesor (confirmación) | Solo si no tiene materias activas |
| RF-005 | CreateSubjectUseCase | Crear materia (código, nombre, prof, color) | Código único, nombre no vacío |
| RF-006 | GetSubjectsUseCase | Listar materias con badge tareas | Retorna Flow<List> |
| RF-007 | UpdateSubjectUseCase | Editar materia | Validar ref. profesor existe |
| RF-008 | DeleteSubjectUseCase | Eliminar materia (confirmación) | Solo si no tiene tareas |
| RF-009 | CreateTaskUseCase | Crear tarea (materia, deadline, prioridad) | Deadline > hoy, materia existe |
| RF-010 | GetTasksUseCase | Listar + filtrar (materia, deadline, prioridad) | Retorna Flow<List> ordenado |
| RF-011 | UpdateTaskUseCase | Editar tarea | Validar estado transición |
| RF-012 | DeleteTaskUseCase | Eliminar tarea (confirmación) | Solo si no hay sesión activa |
| RF-013 | MarkTaskCompleteUseCase | Cambiar estado tarea + fecha | Transición estado válida |
| RF-014 | StartPomodoroSessionUseCase | Iniciar timer (25/5/25/5/25/5/25/15 min) | Tarea asignada, retorna SessionId |
| RF-015 | CompletePomodoroSessionUseCase | Completar sesión + mostrar dialog | Después 4 ciclos, sí/no |
| RF-016 | GetSessionHistoryUseCase | Historial sesiones (solo validadas) | Retorna Flow<List> |
| RF-017 | LoadTaskForSessionUseCase | Cargar tarea + materia + profesor | Datos completos precargados |
| RF-018 | ValidateSessionUseCase | dialog "¿Realmente completaste?" | Sí → guarda, No → descarta |
| RF-019 | GetActiveSessionUseCase | Obtener sesión en curso | Null si no hay activa |
| RF-020 | AbandonSessionUseCase | Descartar si abandonada mid-sesión | Sin persistencia |
| RF-021 | RejectSessionValidationUseCase | Descartar si validada como no | Limpia sin BD |
| RF-022 | GetPendingTasksBySubjectUseCase | Tareas pendientes agrupadas por materia | Retorna Flow<Map<Subject, List>> |
| RF-023 | GetTaskStatsUseCase | Estadísticas: total, completadas, pendientes | Retorna TaskStats object |
| Capa | Componentes |
|---|---|
| Presentation | Screens, ViewModels, State, Components, Navigation |
| Domain | Models, Repository interfaces, Use Cases |
| Data | Entities, DAOs, Database, RepositoryImpl, Mappers |
| Core | Navigation, Theme, UI Kit |
| DI | AppModule |
| Componente | Tecnología |
|---|---|
| Lenguaje | Kotlin |
| UI | Jetpack Compose + Material Design 3 |
| DB | Room ORM + SQLite |
| Async | Coroutines + Flow/StateFlow |
| Navigation | Compose Navigation |
| ViewModel | androidx.lifecycle |
| DI | Manual AppModule |
| Testing | JUnit 4 + Espresso + MockK |
| Build | Gradle 9.1.1 |