# Tâches planifiées (cron) ## Page : `/cron` (admin uniquement) Permet de créer des tâches automatiques de synchronisation et/ou de push. ## Architecture ``` OS cron (toutes les minutes) ↓ docker exec eptm-dashboard-app-1 python scripts/cron_tick.py ↓ Lit la table CronJob → identifie les tâches à exécuter maintenant ↓ Pour chaque tâche due : - Lance push_to_escada.py et/ou sync_esacada.py + run_imports.py - Met à jour last_run_at, last_status, last_message - Envoie une notification Telegram (selon notify_on) ``` Le tick s'exécute toutes les minutes via la crontab du host. Le timezone du conteneur est aligné sur `Europe/Zurich` pour correspondre aux horaires saisis dans l'UI. ## Types de tâches | Type | Action | |------------------|----------------------------------------------------------------------| | `push` | Pousse les pendings vers Escada uniquement | | `sync` | Récupère depuis Escada uniquement (selon options abs/BN/notes/fiches)| | `push_then_sync` | Pousse les pendings, puis récupère | ## Schedules Trois types de planning sont disponibles : - **Quotidien (daily)** : à une heure fixe chaque jour. Ex : `03:00`. - **Hebdo (weekly)** : à une heure fixe certains jours. Ex : `MON,WED,FRI:08:30`. - **Intervalle (interval)** : toutes les N minutes. Ex : `30` = toutes les 30 minutes. ## Options de sync (pour task_kind=sync ou push_then_sync) - `sync_abs` : récupère les absences - `sync_bn` : récupère les BN - `sync_notes` : récupère les notes - `sync_fiches` : récupère les données apprentis - `force_abs` : forçage (cf. doc Sync Escada) - `classes_json` : `"ALL"` ou liste de classes spécifiques ## Notifications Telegram Pour chaque tâche, on configure : - `notify_on ∈ {"never", "always", "success", "failure"}` - `notify_level ∈ {"normal", "detailed"}` - `notify_chat_id` : pour cibler un chat différent du chat global (vide = utiliser le défaut) Voir la section [Notifications Telegram](#) pour les détails. ## Activation / désactivation Le toggle dans la liste des tâches active ou désactive sans supprimer. Quand on **réactive** une tâche, son `last_run_at` est remis à `None` pour qu'elle se déclenche au prochain tick (sinon elle attendrait la fin de l'intervalle complet). ## Logs persistants Chaque exécution écrit son log détaillé dans `/logs/cron/cron-{job_id}-{timestamp}.log`. Ce dossier est en bind mount Docker → les logs survivent à la recréation du conteneur. ## Audit Toute modification (création/édition/activation/suppression) est tracée : ``` [09:14:22] [cron] prof.demo : création tâche 'Sync nocturne' (id=4) — push_then_sync / 03:00 / activée [09:30:05] [cron] prof.demo : désactivation tâche 'Push 30min' (id=2) ``` ## Bouton "Tester Telegram" Bas de page : envoie un message de test au `chat_id` global pour vérifier la config bot.