tc-410 Terminus: définir la machine à état d'un événement
Actuellement l'état d'un événement est distribué sur trois valeurs booléennes is_enabled, archived et manual_override. La complexité du code nécessaire afin de déterminer l'état "métier" d'un événement augmente régulièrement.
Pour une évolution à venir demandant une validation depuis un état "brouillon" (à la création) vers l'état "inactif", je souhaite éviter l'ajout d'un booléen supplémentaire qui donnerait alors 16 combinaisons dont uniquement 6 sont pertinentes en terme métier.
Je propose donc le remplacement de ces booléens par une énumération (stockage par nombre entier) avec les valeurs suivantes: draft, enabled, disabled, manual_enabled, manual_disabled, archived
Et la rédaction d'un diagramme d'état avec la documentation des actions utilisateurs dans Terminus qui provoque chaque transition entre deux états.
Une question à répondre est de savoir si on peut sortir du cycle manual_enabled<->manual_disabled. Car actuellement aucune action ne permet de remettre le flag manual_override à false. Il est uniquement mis à true quand on fait un démarrage/pause manuel sur un message en section automatique.
Reste à définir enfin la procédure de migration entre la modélisation DB existante (3 booléens) et l'état énuméré (entier)
Conclusion de l'analyse: L'état d'un scénario/événement dépendant uniquement de l''état de ses calendriers.
Un calendrier peut être actif ou au contraire désactivé. (nouvel attribut enabled, par défaut à 1)
La logique d''évaluation de l'état se fait dans cet ordre.
-
Si un scénario dispose d'au moins un calendrier actif sans phase de publication, alors il est "En Cours". Les messages relatifs aux calendriers sans phase de publication sont diffusés.
-
Si un scénario dispose d'au moins un calendrier actif avec phase de publication qui correspond à "maintenant", il est "En Cours". Les messages relatifs aux calendriers actifs sont diffusés. On pourra dire par raccourci que le calendrier est diffusé.
-
Si un scénario dispose d'au moins un calendrier actif avec phase de publication qui correspond à "plus tard" (au moins un intervalle dans le futur), il est "Programmé". Aucun calendrier du scénario n'est pas diffusé (et donc aucun de leurs messages).
-
Si un scénario ne dispose d'aucun calendrier actif, il est "Archivé", rien n'est diffusé.
L' action "Archiver" désactive tous les calendriers d'un scénario, en fixant leur attribut enabled à 0.