# Tâches planifiées (cron) ## Page : `/cron` (admin uniquement) Permet de créer des tâches automatiques de synchronisation et/ou de push, avec notifications Telegram. ## 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, push_notices.py, 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 d'absences et/ou notices vers Escada | | `sync` | Récupère depuis Escada (selon options abs/BN/notes/fiches/notices) | | `push_then_sync` | Pousse puis récupère | ## Planifications Deux types de planning seulement (les anciens `interval` et `daily` ont été remplacés par `daily_multi` qui couvre les deux cas) : - **Hebdo (`weekly`)** : à une heure fixe certains jours. - `schedule_value` = `"MON,WED,FRI:08:30"` - Sélection des jours en UI : pastilles rouges Lun..Dim. - **Plusieurs heures par jour (`daily_multi`)** : à un ensemble d'heures pleines, tous les jours. - `schedule_value` = `"00:00,06:00,12:00,18:00"` - Sélection en UI : grille 24 cases (00h–23h) cliquables. - Remplace l'ancien mode `interval` : pour reproduire « toutes les 6 h » on coche 4 cases (00, 06, 12, 18). > Les anciens jobs en format `daily` (`HH:MM`) sont automatiquement convertis en `daily_multi` au boot via la migration de `src/db.py`. > Les anciens jobs en format `interval` (`N minutes`) sont également migrés en déroulant l'intervalle sur 24 h depuis minuit. ## 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 + Matu - `sync_notes` : récupère les notes d'examen - `sync_fiches` : récupère les données apprentis (avec représentant légal + compensation) - `sync_notices` : récupère les notices Escada - `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 créneau. **Ouverture rapide** : cliquer n'importe où sur la ligne d'une tâche ouvre directement le panneau d'édition. ## 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 / 00:00,06:00,12:00,18:00 / activée [09:30:05] [cron] prof.demo : désactivation tâche 'Push horaire' (id=2) ``` ## Bouton « Tester Telegram » Bas de page : envoie un message de test au `chat_id` global pour vérifier la config bot.