---
# System prepended metadata

title: Sistema de gestión de tareas

---

#trabajo-practico

# Sistema de gestión de tareas

Este cuatrimestre desarrollaremos un sistema de gestión de tareas (SGT desde ahora). 
Una tarea tendrá:
- Nombre
- Duración (en horas decimales, redondeadas a 15 minutos). Ejemplo: `1.25` es `1h 15m`
- Prioridad (inician sin prioridad, puede asignarse alta prioridad, o baja prioridad)
- Subtareas que la componen.
- Estado (completa, pendiente, en progreso, interrumpida). Solamente se manejarán esos estados.
- Etiquetas (hogar, trabajo, universidad, etc.). Son texto libre a gusto del usuario.

El SGT contará con las siguientes funcionalidades:

## ABMCL de tareas
Ver sección con ejemplo del menú. En resumen:

1. Alta. Una tarea nueva se agrega al sistema.
2. Baja. Se elimina una tarea del sistema.
3. Modificación. Se puede cambiar la prioridad o estado de una tarea.
4. Consulta. Buscar tareas por diferentes criterios.
5. Listado de tareas

## Sobre la creación de tareas
Ver sección con ejemplo del menú. En resumen:

1. Se debe poder agregar subtareas a una tarea. Una subtarea es, en sí misma, una tarea. ==Estructura recursiva==
2. La duración estimada de una tarea con subtareas vendrá dado por la duración de sus subtareas, más la duración de la propia tarea. ==Algoritmo recursivo==

## Gestión de las tareas

1. Cambiar el estado de una tarea
2. Las subtareas se pueden marcar como completadas, pero la tarea original debe marcarse por separado.
3. Sin embargo, si una tarea se marca como completada, se deben marcar todas las subtareas en ese mismo acto.
4. Subir y bajar la prioridad de tareas

```mermaid
stateDiagram-v2
    state "En progreso" as EnProgreso

    [*] --> Pendiente
    Pendiente --> EnProgreso: Comenzar
    EnProgreso --> Pendiente: Abandonar
    EnProgreso --> Interrumpida: Se inicia otra tarea
    Interrumpida --> Interrumpida: Se completa la tarea\nque interrumpió a esta
    EnProgreso --> Completado: Completar
    Completado --> [*]
```

## Estructuras y funcionamiento
1. Todas las tareas estarán guardadas principalmente en una lista. ==Lista==
2. Deben poder gestionarse interrupciones de la tarea en progreso, por una nueva tarea. Sin embargo, al terminar la interrupción, debe ofrecerse continuar con la última tarea interrumpida. ==Pila==

## Consultas al sistema
1. El sistema deberá poder **sugerir** una cola de tareas a realizar, para maximizar la productividad. Le pediremos que nos organice una selección de tareas que cumplan con un criterio de tiempo total. ==Programación Dinámica / parecido al problema de la mochila pero más fácil==
2. El sistema puede proporcionar un listado de tareas con cierta etiqueta, para así localizar mis tareas más eficientemente. ==Diccionario==
3. El sistema debe poder reordenar las tareas de primer nivel según alguno de estos criterios ==MergeSort/D&C==:
	1. Prioridad
	2. Duración
	3. Cantidad de subtareas
4. El sistema debe poder ayudarme a buscar una tarea por una palabra determinada. ==Backtracking, porque debe entrar en cada subtarea y volver a salir si no la encontró==


```go
func searchTask(task Task, name string) *Task {
    if task.Name == name {
        return &task
    }

	// backtracking
    for _, subtask := range task.Subtasks {
        foundTask := searchTask(subtask, name)
        if foundTask != nil {
            return foundTask
        }
    }

    return nil
}
```

---

## Menú

1. Listado de Tareas (cada una con su duracion, prioridad y estado)
	1. (elige una tarea)
		1. Editar nombre
			1. Nuevo nombre
		2. Editar duracion
			1. Nueva duración
		3. Subir prioridad
		4. Bajar prioridad
		5. Editar etiquetas
			1. Nuevas etiquetas (separadas por comas)
		6. Comenzar tarea
		8. Nueva subtarea
		    1. Menu similar a #2
		7. Borrar tarea
2. Nueva Tarea
	1. Nombre
	2. Duración
	3. Etiquetas (separadas por comas)
3. Tarea actual
	1. Marcar como completada
	2. Abandonar (vuelve a pendiente)
4. Preparar cola de tareas
	1. Tiempo disponible
		1. (sistema ofrece tareas)
5. Buscar tarea
	1. Palabra clave
		1. (sistema muestra lista de tareas)
			1. (elige una tarea)
				1. Vuelve al menu 1.1
	2. Por tag
		1. (elige tag)
			1. (sistema muestra lista de tareas)
				1. (elige una tarea)
					1. Vuelve al menu 1.1

Ejemplo de como luce una lista de tareas
```
Listado de tareas
1. [X] !! Sacar a pasear al perro (30 min) #hogar
2. [ ] Comprar leche (15 min + 20 min) #hogar
    2.1. [X] Ir al super (15 min)
    2.2. [ ] Pagar (15 min)
3. [ ] Preparar trabajo práctico de AyP2 (2h) #universidad
4. [ ] Merendar (1h) #hogar

Tarea actual
> Merendar (1h) #hogar

Tareas interrumpidas (2)
1. Preparar trabajo práctico de AyP2 (2h) #universidad
... y otras

Tags
#hogar (3)
#universidad (1)

Opciones
a. Nueva tarea
b. Tarea actual
c. Preparar cola de tareas
d. Buscar tarea
```
