# Diagrama de estados para relacionar los escenarios con el código
## Distinciones
- **Acción**: Interacción de un usuario, que dependiendo del estado del objeto puede o no generar un nuevo estado
- **Condiciones de ejecución de la acción**: Son las condiciones que se aplican sobre las cacterísticas relevantes desde los cuales está permitido ejecutar una acción sobre un objeto
- **Cacterísticas relevantes**: Atributos del objeto que generan estados diferentes (son condiciones de ejecución) y qué rangos tiene.
- **Estado**: Conjunto de características relevantes de un objeto luego de aplicarle una acción
-Ej: `Estado1: ['Usuario es invitado', 'el evento no esta confirmado', 'tiene subtarea', 'tiene owner', 'está en hoy']`
- **Estados resultantes de una acción**: Descripción de los estados finales posibles al ejecutar una acción sobre un objeto, dependiendo de las características relevantes
- **Escenario:** Secuencia de interacciones del usuario
## Características relevantes
### Evento
- attendee
- es un attendee? (sí - no)
- en qué estado está? (notConfirmed - confirmed - completed - deleted)
- Está el evento en la agenda? (sí - no)
- completedDate
- lo completó y sigue completado? (sí - no)
- subtasksOrder:
- Tiene subtareas (sí - no)
- owner:
- Tiene owner (sí - no)
- Es el usuario actual (sí - no)
- El owner pertenece a este servicio (sí - no)
- dateLimit
- dateLimit (antes de hoy - hoy - mañana - ?)
- timeType
- timeType (antes de hoy - hoy - mañana - esta semana - este mes - próximamente)
- service
- serviceName (google - outlook)
- guestsCanModify
- Los invitados pueden modificar (si - no)
- RecurringId
- Es evento recurrente?
- ProjectId
- A qué proyecto pertenece?
### Evento externo (no se almacena en el evento interno)
- Status
- El service.attendee es declined?
- Servicio
- serviceName
### Acción
- now
- Fecha actual
## Acciones disponibles
1. Cambiar de día (cron:changeEventData)
2. Confirmar asistencia
1. Condiciones de ejecución de la acción
1. Condición definida y dónde en el código se define la condición y sus consecuencias
3. Condiciones para generar los atributos modificados
1. Condición definida con atributos relevantes + lugar en el código de la condición y lugar en el código donde se implementa el cambio
4. Modificar subtareas
5. Asignar proyecto
12. LLega una actualización del servicio
1. Nuevo
2. Modificado
4. Cancelado
## ¿Cómo relacionamos estadoInicial->acción->estadoFinal con el código?
1. El nacho nos entrega un escenario con errores, ¿Qué código podría estar fallando?
2. ¿Si hago un cambio en el código, que debería revisar para asegurarme de que el sistema sigue funcionando como esperamos?
1. ¿Se modificó el valor de un atributo?
1. Ver todas las acciones que utilizan/modifica los atributos de la característica relevante que modifiqué
2. ¿Se modificó una condición?
1. ¿es una condición de ejecución?
2. ¿Es una condición para generar los atributos modificados?
### Respuesta
1.
## Ejemplo de diagrama de estado
```plantuml
@startuml
[*] --> State1 : El evento es creado en el servicio externo
State1 --> [*]
State2 --> [*]
State1 : El userId sí es invitado
State1 : El estado del userId es notConfirmed
State1 : El evento está en agenda
State1 : El evento no está completado
State1 : No tiene subtareas
State1 : No tiene owner
State1 : dateLimit es mañana
State1 : timeType es mañana
State1 : Es de google
State1 : los invitados no pueden modificarlo
State1 -> State2: El usuario confirma el evento
State2 : El userId sí es invitado
State2 : El estado del userId es notConfirmed
State2 : El evento está en agenda
State2 : El evento no está completado
State2 : No tiene subtareas
State2 : No tiene owner
State2 : dateLimit es mañana
State2 : timeType es mañana
State2 : Es de google
State2 : los invitados no pueden modificarlo
State2 --> State3 : Cambiamos de día
State3 : El userId sí es invitado
State3 : El estado del userId es notConfirmed
State3 : El evento está en agenda
State3 : El evento no está completado
State3 : No tiene subtareas
State3 : No tiene owner
State3 : dateLimit es hoy
State3 : timeType es hoy
State3 : Es de google
State3 : los invitados no pueden modificarlo
@enduml
```