Cycle d’une année, calendrier et jobs
startYear()
utils_by_year.startYear(actData, updateYearFinished) incrémente l'année si nécessaire, passe l'état à ACT_YEAR_STARTED, enregistre startTime, appelle startYearGameSpec(), initialise les stubs de présence puis envoie act_year_started.
stateDiagram-v2
[*] --> NotStarted
NotStarted --> YearStarted: startYear
YearStarted --> Generating: fin de période / commande
Generating --> YearFinished: génération terminée
YearFinished --> YearStarted: année suivante
YearFinished --> [*]: dernière année
nextGenerate
updateNextGenerateDate() calcule quand le prochain traitement automatique doit avoir lieu. En pratique, les années n'ont pas de génération automatique. En mode calendrier, nextGenerate pointe vers la fin de l'année active ou le début de la suivante.
Validation des dates
validateDates() corrige les années mal ordonnées ou placées dans le passé et garantit notamment un intervalle minimal de cinq minutes. Si des dates sont déplacées, le professeur peut recevoir years_date_modified.
Job planifié
gatherActsForJob() récupère les activités dont nextGenerate < now. runActJob() traite une activité active : si l'année est commencée, elle passe à generating et appelle generateResultsJob(); sinon elle peut démarrer l'année suivante.
generateResultsJob()
- envoie
act_generating; - fait jouer les bots si l'activité est async;
- génère les events game-specific;
- appelle
generateResultsByGameUid[gameUid].generateCurrentYearResults(actData); - décide s'il faut démarrer automatiquement l'année suivante;
- met à jour
nextGenerate; - sauvegarde l'activité;
- envoie
act_year_finishedlorsque requis.
Scripts de job
Les wrappers se trouvent sous server_scripts/_job/, notamment generate_results_job.js et le scheduler commun.
Modifier le cycle annuel ou le calendrier sans casser les jobs
Invariants du cycle
startYear()initialise l'année et appellestartYearGameSpec();- la génération passe par
generateResultsJob()ou la commande manuelle équivalente; nextGeneratedétermine le prochain traitement automatique;- les années de pratique ne suivent pas forcément le même calendrier automatique;
- le client est averti via les messages
act_year_started,act_generating,act_year_finished.
Changer la logique de dates
Les fonctions à auditer sont updateNextGenerateDate(), validateDates(), dateToUpper(), dateToLower() et gatherActsForJob().
- Définir le comportement attendu pour sync, async et practice.
- Vérifier que les dates passées sont corrigées de façon déterministe.
- Vérifier l'intervalle minimal attendu par
validateDates(). - Mettre à jour les messages professeur si des dates sont déplacées.
- Tester le job avec une activité dont
nextGenerateest juste avant/après “now”.
Modifier startYear()
Toute nouvelle initialisation annuelle doit être faite soit dans le socle commun si elle concerne tous les jeux, soit dans startYearGameSpec(). Ne pas ajouter des branches GameUid directement dans utils_by_year.startYear().
Tester un changement de cycle
| Cas | À vérifier |
|---|---|
| Année 1 manuelle | start state, presence, year data, RTT. |
| Fin manuelle | generating → results → finished. |
| Calendrier automatique | nextGenerate, scheduler, next year. |
| Async | bots avant génération. |
| Dernière année | pas de démarrage fantôme d'une année suivante. |
| Reopen | état + results + evals + logbook restaurés/cohérents. |
Debug d'un job qui ne part pas
- Lire
activity.nextGenerate. - Vérifier que l'activité est active.
- Vérifier
gatherActsForJob(). - Exécuter
runActJob()avec l'UID. - Inspecter l'état annuel avant/après.
- Vérifier le log de
generateResultsJob().
No comments to display
No comments to display